[
  {
    "path": ".coveralls.yml",
    "content": "service_name: travis-ci"
  },
  {
    "path": ".gitignore",
    "content": "*.gem\n*.rbc\n.bundle\n.config\n.yardoc\nGemfile.lock\nInstalledFiles\n_yardoc\ncoverage\ndoc/\nlib/bundler/man\npkg\nrdoc\nspec/reports\ntest/tmp\ntest/version_tmp\ntmp\n*.bundle\n*.so\n*.o\n*.a\nmkmf.log\n.vendor\n.ruby-version\ncobertura.xml\n.gutter.json\nhtml\n*.gcda\n*.gcno\n\n# Xcode\n#\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\n*.DS_Store\n\n# VSCode IDE\n.vscode/\n.rdbgrc*\n\n# python\n.venv/\n\n# JetBrains IDE\n.idea/\n\n# Test output\nreport.llcov\nreport.json\n\n# VSCode\n.vscode\n.rdbgrc*"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nscript: bundle exec rake\nosx_image: xcode12.2\n\ncache: bundler\n\nbefore_install:\n  - curl http://curl.haxx.se/ca/cacert.pem -o /usr/local/share/cacert.pem\n  - gem install bundler -v \"~> 2.0\" --no-document\n\ninstall:\n  - bundle install --without=documentation\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG\n\n## v2.8.5\n\n* Update xcodeproj to 1.27.1 to support Xcode 16 folder references\n  [authiatr](https://github.com/authiatr)\n  [#574](https://github.com/SlatherOrg/slather/pull/574)\n\n## v2.8.4\n\n* Don't crash when 0% coverage is causing empty JSON\n  [jarrodlombardo-EventBase](https://github.com/jarrodlombardo-EventBase)\n  [#570](https://github.com/SlatherOrg/slather/pull/570)\n\n* Xcode 16 compatibility (as of beta 5)\n  [ksuther](https://github.com/ksuther)\n  [#568](https://github.com/SlatherOrg/slather/pull/568)\n\n## v2.8.3\n\n* Fix coverage_file.source_file_pathname\n  [alfredofernandes](https://github.com/alfredofernandes)\n  [#565](https://github.com/SlatherOrg/slather/pull/565)\n\n* update cobertura DTD to a working URL.\n  [jarrodlombardo-EventBase](https://github.com/jarrodlombardo-EventBase)\n  [#564](https://github.com/SlatherOrg/slather/pull/564)\n\n## v2.8.2\n\n* coverage_info.include_files? needs a default true return value for when source_files is empty.\n  [jarrodlombardo-EventBase](https://github.com/jarrodlombardo-EventBase)\n  [#563](https://github.com/SlatherOrg/slather/pull/563)\n\n## v2.8.1\n\n* cobertura.sourceforge.net should use https instead of http\n  [jarrodlombardo-EventBase](https://github.com/jarrodlombardo-EventBase)\n  [#559](https://github.com/SlatherOrg/slather/pull/559)\n\n* Handle include globs\n  [dnedrow](https://github.com/dnedrow)\n  [#553](https://github.com/SlatherOrg/slather/pull/553)\n\n## v2.8.0\n\n* Add `--ymlfile` option to override `.slather.yml`\n  [jarrodlombardo-EventBase](https://github.com/jarrodlombardo-EventBase)\n  [#550](https://github.com/SlatherOrg/slather/pull/550)\n\n* Update list.js\n  [AndriiZakhliupanyi](https://github.com/AndriiZakhliupanyi)\n  [#546](https://github.com/SlatherOrg/slather/pull/546)\n\n## v2.7.5\n\n* Add `--cdn-assets` flag\n  [sushant-here](https://github.com/sushant-here)\n  [#537](https://github.com/SlatherOrg/slather/pull/537)\n\n* Update nokogiri version\n\n## v2.7.4\n\n* Support Ruby 3.2.0\n  [crazymanish](https://github.com/crazymanish)\n  [#532](https://github.com/SlatherOrg/slather/pull/532)\n\n## v2.7.3\n\n* Support Coveralls parallel runs\n  [paulz](https://github.com/paulz)\n  [#523](https://github.com/SlatherOrg/slather/pull/523)\n\n* Update nokogiri version\n  [anil291987](https://github.com/anil291987)\n  [#518](https://github.com/SlatherOrg/slather/pull/518)\n  [#524](https://github.com/SlatherOrg/slather/pull/524)\n\n## v2.7.2\n\n* Update xcodeproj version\n  [adamyanalunas](https://github.com/adamyanalunas)\n  [#502](https://github.com/SlatherOrg/slather/pull/502)\n\n* Update nokogiri version\n  [jwelton](https://github.com/jwelton)\n  [#503](https://github.com/SlatherOrg/slather/pull/503)\n\n* Support alternate CI systems in coveralls output\n  [fermoyadrop](https://github.com/fermoyadrop)\n  [#504](https://github.com/SlatherOrg/slather/pull/504)\n\n* Add Bitrise support to coveralls output\n  [fermoyadrop](https://github.com/fermoyadrop)\n  [#504](https://github.com/SlatherOrg/slather/pull/505)\n\n## v2.7.1\n\n* Support generating coverage for framework targets\n  [onato](https://github.com/onato)\n  [#482](https://github.com/SlatherOrg/slather/pull/482)\n\n* Show number of lines in HTML report\n  [SiemianHS](https://github.com/SiemianHS)\n  [#494](https://github.com/SlatherOrg/slather/pull/494)\n\n* Fixed issues with HTML report generation\n  [fchiba](https://github.com/fchiba)\n  [#483](https://github.com/SlatherOrg/slather/pull/483)\n  [#484](https://github.com/SlatherOrg/slather/pull/484)\n\n* Don't fail if a source file doesn't exist\n  [chillpop](https://github.com/chillpop)\n  [#492](https://github.com/SlatherOrg/slather/pull/492)\n\n## v2.7.0\n\n* Add Branch Coverage data for ProfData coverage files\n  [hborawski](https://github.com/hborawski)\n  [#477](https://github.com/SlatherOrg/slather/pull/477)\n\n* Fixed 'Argument list too long' when running 'xcrun llvm-cov'\n  [samuelsainz](https://github.com/samuelsainz)\n  [#476](https://github.com/SlatherOrg/slather/pull/476)\n\n## v2.6.1\n\n* Update nokogiri to 1.11\n  [ashin-omg](https://github.com/ashin-omg)\n  [#473](https://github.com/SlatherOrg/slather/pull/473)\n\n## v2.6.0\n\n* Added GitHub actions support\n  [martin-key](https://github.com/martin-key), [troyfontaine](https://github.com/troyfontaine)\n  [#468](https://github.com/SlatherOrg/slather/pull/468)\n\n## v2.5.0\n\n* Fixed activesupport and cocoapods dependencies\n  [daneov](https://github.com/daneov)\n  [#456](https://github.com/SlatherOrg/slather/pull/467)\n\n* Fixed typo in documentation\n  [descorp](https://github.com/descorp)\n  [#456](https://github.com/SlatherOrg/slather/pull/463)\n\n## v2.4.9\n\n* Added support for Sonarqube output\n  [adellibovi](https://github.com/adellibovi)\n  [#456](https://github.com/SlatherOrg/slather/pull/456)\n\n## v2.4.8\n\n* Optimize performance for many binaries\n  [cltnschlosser](https://github.com/cltnschlosser)\n  [#455](https://github.com/SlatherOrg/slather/pull/455)\n\n* Don't generate line 0 in profdata_coverage_file.rb from line with error\n  [tthbalazs](https://github.com/tthbalazs)\n  [#449](https://github.com/SlatherOrg/slather/pull/449)\n\n* coveralls dependency update\n  [GRiMe2D](https://github.com/GRiMe2D)\n  [#448](https://github.com/SlatherOrg/slather/pull/448)\n\n## v2.4.7\n\n* Update dependencies\n  [dnedrow](https://github.com/dnedrow)\n\n* Fixed errors when llvm-cov argument length exceeds ARG_MAX\n  [weibel](https://github.com/weibel)\n  [#414](https://github.com/SlatherOrg/slather/pull/414)\n\n* Show \"No coverage directory found.\" instead of \"implicit conversion nil into String\"\n  [phimage](https://github.com/phimage)\n  [#381](https://github.com/SlatherOrg/slather/pull/381) [#341](https://github.com/SlatherOrg/slather/issues/341)\n\n## v2.4.6\n\n* Fix .dSYM and .swiftmodule files filtering in find_binary_files()\n  [krin-san](https://github.com/krin-san)\n  [#368](https://github.com/SlatherOrg/slather/pull/368)\n\n* Fixed loading coverage for a single source file\n  [blackm00n](https://github.com/blackm00n)\n  [#377](https://github.com/SlatherOrg/slather/pull/377) [#398](https://github.com/SlatherOrg/slather/pull/398)\n\n* Fixed truncated file list in HTML export\n  [miroslavkovac](https://github.com/miroslavkovac)\n  [#402](https://github.com/SlatherOrg/slather/pull/402) [#261](https://github.com/SlatherOrg/slather/issues/261)\n\n## v2.4.5\n\n* Support for specifying a specific binary architecture\n  [ksuther](https://github.com/ksuther), [nickolas-pohilets](https://github.com/nickolas-pohilets)\n  [#367](https://github.com/SlatherOrg/slather/pull/367)\n\n* Added absolute statement count to simple output (instead of showing just a percentage)\n  [barrault01](https://github.com/barrault01), [ivanbrunel](https://github.com/ivanbruel)\n  [#365](https://github.com/SlatherOrg/slather/pull/365)\n\n* Updated nokogiri dependency version\n  [#363](https://github.com/SlatherOrg/slather/issues/363), [#366](https://github.com/SlatherOrg/slather/pull/366)\n\n* slather now requires ruby 2.1 or later (10.13 ships with 2.3.3)\n\n## v2.4.4\n\n* Added llvm-cov output format\n  [sgtsquiggs](https://github.com/sgtsquiggs) [#354](https://github.com/SlatherOrg/slather/pull/354)\n\n* Exclude swiftmodule from product search\n  [lampietti](https://github.com/lampietti) [#352](https://github.com/SlatherOrg/slather/pull/352)\n\n## v2.4.3\n\n* Initial Xcode 9 support\n  [ksuther](https://github.com/ksuther) [#339](https://github.com/SlatherOrg/slather/pull/339), [ivanbrunel](https://github.com/ivanbruel) [#321](https://github.com/SlatherOrg/slather/pull/321), [FDREAL](https://github.com/FDREAL) [#338](https://github.com/SlatherOrg/slather/pull/338)\n\n* Add `--json` output option for basic JSON format not specific to any particular service.\n  [ileitch](https://github.com/ileitch)\n  [#318](https://github.com/SlatherOrg/slather/pull/318)\n\n## v2.4.2\n\n* Restored support for Xcode 7  \n  [ButkiewiczP](https://github.com/ButkiewiczP)\n  [#304](https://github.com/slatherOrg/slather/pull/308)\n\n* Added Jenkins Pipeline support for Coveralls  \n  [daneov](https://github.com/daneov)\n  [#304](https://github.com/slatherOrg/slather/pull/304)\n\n## v2.4.1\n\n* Add `--configuration` option  \n  [thasegaw](https://github.com/thasegaw)\n  [#294](https://github.com/slatherOrg/slather/pull/294)\n\n* Fix misdetection of Xcode version if Spotlight hasn't indexed Xcode yet  \n  [ksuther](https://github.com/ksuther)\n  [#298](https://github.com/slatherOrg/slather/pull/298)\n\n* Better verbose message when no binaries are found  \n  [ksuther](https://github.com/ksuther)\n  [#300](https://github.com/slatherOrg/slather/pull/300)\n\n## v2.4.0\n\n* Xcode 8.3 support.\n  [ksuther](https://github.com/ksuther)\n  [#291](https://github.com/SlatherOrg/slather/pull/291)\n\n* Automatically ignore headers in Xcode platform SDKs.  \n  [ksuther](https://github.com/ksuther)\n  [#286](https://github.com/SlatherOrg/slather/pull/286)\n\n* Automatically handle schemes with multiple build or test targets  \n  [serges147](https://github.com/serges147)\n  [#275](https://github.com/SlatherOrg/slather/pull/275)\n\n* Added TeamCity as a CI service option  \n  [joshrlesch](https://github.com/joshrlesch)\n  [#279](https://github.com/SlatherOrg/slather/pull/279)\n\n* Handle UTF-8 characters correctly in HTML reports  \n  [0xced](https://github.com/0xced)\n  [#259](https://github.com/SlatherOrg/slather/pull/259)\n\n* Fix hanging `xcodebuild` invocation when getting derived data path.  \n  [arthurtoper](https://github.com/arthurtoper)\n  [#238](https://github.com/SlatherOrg/slather/pull/238), [#197](https://github.com/SlatherOrg/slather/issues/197), [#212](https://github.com/SlatherOrg/slather/issues/212), [#234](https://github.com/SlatherOrg/slather/issues/234)\n\n## v2.3.0\n\n* Fixes broken fallback value of `input_format` inside `configure_input_format`  \n  [sbhklr](https://github.com/sbhklr)\n  [#233](https://github.com/SlatherOrg/slather/pull/233), [#232](https://github.com/SlatherOrg/slather/issues/232)\n\n* Add `--travispro` flag  \n  [sbhklr](https://github.com/sbhklr)\n  [#223](https://github.com/SlatherOrg/slather/pull/223), [#219](https://github.com/SlatherOrg/slather/issues/219)\n\n* Fixes silent failure in case of unsuccessful upload to Coveralls  \n  [sbhklr](https://github.com/sbhklr)\n  [#222](https://github.com/SlatherOrg/slather/pull/222), [#217](https://github.com/SlatherOrg/slather/issues/217)\n\n## v2.2.1\n\n* Make `project.coverage_files` public  \n* Add docs attribute reader to `project.rb`  \n  [bootstraponline](https://github.com/bootstraponline)\n  [#209](https://github.com/SlatherOrg/slather/pull/209)\n\n* Add `--decimals` flag  \n  [bootstraponline](https://github.com/bootstraponline)\n  [#207](https://github.com/SlatherOrg/slather/pull/207)\n\n* Add `slather version` command  \n  [bootstraponline](https://github.com/bootstraponline)\n  [#208](https://github.com/SlatherOrg/slather/pull/208)\n\n## v2.2.0\n\n* Fix nil crash in `project.rb` derived_data_path  \n  [bootstraponline](https://github.com/bootstraponline)\n  [#203](https://github.com/SlatherOrg/slather/pull/203)\n\n* Fix for correct line number for lines that are hit thousands or millions of time in llvm-cov.  \n  [Mihai Parv](https://github.com/mihaiparv)\n  [#202](https://github.com/SlatherOrg/slather/pull/202), [#196](https://github.com/SlatherOrg/slather/issues/196)\n\n* Generate coverate for multiple binaries by passing multiple `--binary-basename` or `--binary-file` arguments, or by using an array in `.slather.yml`  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#188](https://github.com/SlatherOrg/slather/pull/188)\n\n* Support for specifying source file patterns using the `--source-files` option or the source_files key in `.slather.yml`  \n  [Matej Bukovinski](https://github.com/matej)\n  [#201](https://github.com/SlatherOrg/slather/pull/201)\n\n* Improve getting schemes. Looks for user scheme in case no shared scheme is found.  \n  [Matyas Hlavacek](https://github.com/matyashlavacek)\n  [#182](https://github.com/SlatherOrg/slather/issues/182)\n\n* Search Xcode workspaces for schemes. Workspaces are checked if no matching scheme is found in the project.  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#193](https://github.com/SlatherOrg/slather/pull/193), [#191](https://github.com/SlatherOrg/slather/issues/191)\n\n* Fix for hit counts in thousands or millions being output as floats intead of integers  \n  [Carl Hill-Popper](https://github.com/chillpop)\n  [#190](https://github.com/SlatherOrg/slather/pull/190)\n\n## v2.1.0\n\n* Support for Xcode workspaces. Define `workspace` configuration in `.slather.yml` or use the `--workspace` argument if you build in a workspace.\n* Improved slather error messages  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#178](https://github.com/SlatherOrg/slather/issues/178)\n\n* Re-add Teamcity support  \n  [Boris Bügling](https://github.com/neonichu)\n  [#180](https://github.com/SlatherOrg/slather/pull/180)\n\n* Show lines that are hit thousands or millions of time in llvm-cov  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#179](https://github.com/SlatherOrg/slather/pull/179)\n\n* Fix for setting scheme/workspace from configuration file.  \n  [Boris Bügling](https://github.com/neonichu)\n  [#183](https://github.com/SlatherOrg/slather/pull/183)\n\n## v2.0.2\n\n* Escape the link to file names properly  \n  [Thomas Mellenthin](https://github.com/melle)\n  [#158](https://github.com/SlatherOrg/slather/pull/158)\n\n* Product info is now read from schemes. Specify a scheme in `.slather.yml` or with the `--scheme` argument to ensure consistent results. Automatically detect the derived data directory from `xcodebuild`  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#174](https://github.com/SlatherOrg/slather/pull/174)\n\n* Xcode 7.3 compatibility (updated path returned by `profdata_coverage_dir`)  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#125](https://github.com/SlatherOrg/slather/issues/125), [#169](https://github.com/SlatherOrg/slather/pull/169)\n\n* Improve matching of xctest bundles when using `--binary-basename`  \n  [Kent Sutherland](https://github.com/ksuther)\n  [#167](https://github.com/SlatherOrg/slather/pull/167)\n\n* Build Statistic Reporting for TeamCity  \n  [Michael Myers](https://github.com/michaelmyers)\n  [#150](https://github.com/SlatherOrg/slather/pull/150)\n\n* Use named classes for subcommands in bin/slather  \n  [bootstraponline](https://github.com/bootstraponline)\n  [#170](https://github.com/SlatherOrg/slather/pull/170)\n\n## v2.0.1\n\n* Fixes how `profdata_coverage_dir` is created.  \n  [guidomb](https://github.com/guidomb)\n  [#145](https://github.com/SlatherOrg/slather/pull/145)\n\n## v2.0.0\n* Correct html rendering when using profdata format   \n  [cutz](https://github.com/cutz)\n  [#124](https://github.com/SlatherOrg/slather/pull/124)\n\n* Making HTML directory self contained   \n  [Colin Cornaby](https://github.com/colincornaby)\n  [#137](https://github.com/SlatherOrg/slather/pull/137)\n\n* Add `binary_basename` configuration option   \n  [Boris Bügling](https://github.com/neonichu)\n  [#128](https://github.com/SlatherOrg/slather/pull/128)\n\n* Add support to profdata file format   \n  [Simone Civetta](https://github.com/viteinfinite)\n  [Olivier Halligon](https://github.com/AliSoftware)\n  [Matt Delves](https://github.com/mattdelves)\n  [Pierre-Marc Airoldi](https://github.com/petester42)\n  [#92](https://github.com/venmo/slather/pull/92)\n\n## v1.8.3\n* Add buildkite support to coveralls   \n  [David Hardiman](https://github.com/dhardiman)\n  [#98](https://github.com/venmo/slather/pull/98)\n* Update to xcodeproj 0.28.0 to avoid collisions with Cocoapods 0.39.0   \n  [Julian Krumow](https://github.com/tarbrain)   \n  [#106](https://github.com/venmo/slather/pull/106)/[#109](https://github.com/venmo/slather/pull/109)\n\n## v1.8.1\n* Fixed dependency conflict with CocoaPods v0.38\n* Updated usage of cocoapods plugin API since it has changed in v0.38   \n  [Julian Krumow](https://github.com/tarbrain)\n  [#95](https://github.com/venmo/slather/pull/95)\n\n## v1.7.0\n* Objective-C++ support  \n  [ben-ng](https://github.com/ben-ng)\n  [#63](https://github.com/venmo/slather/pull/63)\n\n## v1.6.0\n* Add CircleCI support  \n  [Jonathan Hersh](https://github.com/jhersh)\n  [#55](https://github.com/venmo/slather/pull/55)\n\n## v1.5.4\n\n* Fix calculation of branch coverage when a class has no branches  \n  [Julian Krumow](https://github.com/tarbrain)\n  [#40](https://github.com/venmo/slather/pull/40)\n\n* Always consider empty files as 100% tested  \n  [Boris Bügling](https://github.com/neonichu)\n  [#45](https://github.com/venmo/slather/pull/45)\n\n## v1.5.2\n\n* Add an option to define the output directory for cobertura xml reports  \n  [Julian Krumow](https://github.com/tarbrain)\n  [#37](https://github.com/venmo/slather/pull/37)\n\n## v1.5.1\n\n* Avoid crashes when coverage data is empty\n* Fix bug which prevented source files without coverage data to be included in Cobertura xml report  \n  [Julian Krumow](https://github.com/tarbrain)\n  [#34](https://github.com/venmo/slather/pull/34)\n\n## v1.5.0\n\n* Add support for Cobertura  \n  [Julian Krumow](https://github.com/tarbrain)\n  [#30](https://github.com/venmo/slather/pull/30)\n\n## v1.4.0\n\n* Implement a CocoaPods plugin  \n  [Kyle Fuller](https://github.com/kylef)\n  [#25](https://github.com/venmo/slather/pull/25)\n\n* Avoid getting 'Infinity' or 'NaN' when dividing by 0.0  \n  [Mark Larsen](https://github.com/marklarr)\n\n* Ignore exceptions about files not existing by using 'force'  \n  [Mark Larsen](https://github.com/marklarr)\n\n## v1.3.0\n\n* Add Gutter JSON output  \n  [Boris Bügling](https://github.com/neonichu)\n  [#24](https://github.com/venmo/slather/pull/24)\n\n## v1.2.1\n\n* Fix typo --simple-output description  \n  [Ayaka Nonaka](https://github.com/ayanonagon)\n  [#19](https://github.com/venmo/slather/pull/19)\n\n* Remove broken travis pro support  \n  [Mark Larsen](https://github.com/marklarr)\n  [#22](https://github.com/venmo/slather/pull/22)\n\n* Fix exception for files without `@interface` or `@implementation`  \n  [Piet Brauer](https://github.com/pietbrauer)\n  [#23](https://github.com/venmo/slather/pull/23)\n\n## v1.2.0\n\n* Remove duplicate coverage files, favoring the file with higher coverage.  \n  [Ayaka Nonaka](https://github.com/ayanonagon)\n  [#16](https://github.com/venmo/slather/pull/16)\n\n* Add support for access token and Travis Pro  \n  [Chris Maddern](https://github.com/chrismaddern)\n  [#17](https://github.com/venmo/slather/pull/17)\n\n## v1.1.0\n\n* Support for code coverage of pods  \n  [Mark Larsen](https://github.com/marklarr)\n\n## v1.0.1\n\n* Fix coverage search for files that contain spaces  \n  [Mark Larsen](https://github.com/marklarr)\n\n## v1.0.0\n\n* beautified README  \n  [Ayaka Nonaka](https://github.com/ayanonagon)\n  [#4](https://github.com/venmo/slather/pull/4)  \n  [Kyle Fuller](https://github.com/kylef)\n  [#5](https://github.com/venmo/slather/pull/5)\n\n* Add Travis automated builds  \n  [Mark Larsen](https://github.com/marklarr)\n  [#6](https://github.com/venmo/slather/pull/6)\n\n* Use `||=` instead of `unless`  \n  [Ayaka Nonaka](https://github.com/ayanonagon)\n  [#7](https://github.com/venmo/slather/pull/7)\n\n## v0.0.31\n\n* find source files via pbx proj rather than file system  \n  [Mark Larsen](https://github.com/marklarr)\n\n## v0.0.3\n\n* Initial Release  \n  [Mark Larsen](https://github.com/marklarr)\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\n\n# Specify your gem's dependencies in slather.gemspec\ngemspec\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2014 Mark Larsen\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n\n![Slather Logo](https://raw.githubusercontent.com/SlatherOrg/slather/master/docs/logo.jpg)\n\n[![Gem Version](https://badge.fury.io/rb/slather.svg)](http://badge.fury.io/rb/slather)\n[![Build Status](https://travis-ci.org/SlatherOrg/slather.svg?branch=master)](https://travis-ci.org/SlatherOrg/slather)\n[![Coverage Status](https://coveralls.io/repos/SlatherOrg/slather/badge.svg?branch=master)](https://coveralls.io/r/SlatherOrg/slather?branch=master)\n\nGenerate test coverage reports for Xcode projects & hook it into CI.\n\n### Projects that use Slather\n\n| Project | Coverage |\n| ------- |:--------:|\n| [Parsimmon](https://github.com/ayanonagon/Parsimmon) | [![Parsimmon Coverage](https://coveralls.io/repos/ayanonagon/Parsimmon/badge.svg?branch=master)](https://coveralls.io/r/ayanonagon/Parsimmon?branch=master) |\n| [VENCore](https://github.com/venmo/VENCore) | [![VENCore Coverage](https://coveralls.io/repos/venmo/VENCore/badge.svg?branch=master)](https://coveralls.io/r/venmo/VENCore?branch=master) |\n| [DAZABTest](https://github.com/dasmer/DAZABTest) | [![DAZABTest Coverage](https://coveralls.io/repos/dasmer/DAZABTest/badge.svg?branch=master)](https://coveralls.io/r/dasmer/DAZABTest?branch=master) |\n| [TBStateMachine](https://github.com/tarbrain/TBStateMachine) | [![TBStateMachine Coverage](https://coveralls.io/repos/tarbrain/TBStateMachine/badge.svg?branch=master)](https://coveralls.io/r/tarbrain/TBStateMachine?branch=master) |\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'slather'\n```\n\nAnd then execute:\n\n```sh\n$ bundle\n```\n\nOr install the gem:\n\n```sh\ngem install slather\n```\n\n## Usage\n\nEnable test coverage by ticking the *\"Gather coverage data\"* checkbox when editing a scheme:\n\n![](README_Images/test_scheme.png)\n\nTo verify you're ready to generate test coverage, run your test suite on your project, and then run:\n\n```sh\n$ slather coverage -s --scheme YourXcodeSchemeName path/to/project.xcodeproj\n```\n\nIf you use a workspace in Xcode you need to specify it: \n\n```sh\n$ slather coverage -s --scheme YourXcodeSchemeName --workspace path/to/workspace.xcworkspace path/to/project.xcodeproj\n```\n\nIf you use a different configuration for your tests: \n\n```sh\n$ slather coverage -s --scheme YourXcodeSchemeName --configuration YourBuildConfigurationName path/to/project.xcodeproj\n```\n\nIf your configuration produces a universal binary you need to specify a specific architecture to use: \n\n```sh\n$ slather coverage -s --arch x86_64 --scheme YourXcodeSchemeName --configuration YourBuildConfigurationName path/to/project.xcodeproj\n```\n\n### For multiple modules\n\nIf you want to run some modules, but not all (like modules created by CocoaPods) you can do it like this:\n\n```sh\n$ slather coverage --binary-basename module1 --binary-basename module2 path/to/project.xcodeproj\n```\nYou can also add it to the `.slather.yml` file as an array:\n```yml\nbinary_basename:\n  - module1\n  - module2\n```\n\n### Setup for Xcode 5 and 6\n\nRun this command to enable the `Generate Test Coverage` and `Instrument Program Flow` flags for your project:\n\n```sh\n$ slather setup path/to/project.xcodeproj\n```\n## General Usage Notes\n### Commandline Arguments Win\nWhen using both a config file (`.slather.yml`) and providing arguments via the commandline,\nthe arguments will take precedence over the matching setting in the config file.\n\n### `ignore` always wins over `source-files`\nWhen defining both files that should be ignored (`--ignore`, ignore) and source files to include (`--source-files`, source_files),\nthe ignore list is checked first. If the file being scanned matches a glob in the ignore list, it will not be included. In this case, the\nsource_file list is not checked.\n\nIf the file being scanned is not in the ignore list, and source_file has been defined, the source_file list is\nchecked. If the source file matches a glob, it will be included.\n\n## CI Integration\n### Usage with Codecov\n\nLogin to [Codecov](https://codecov.io/) (no need to activate a repository, this happens automatically). Right now, `slather` supports Codecov via **all** supported CI providers [listed here](https://github.com/codecov/codecov-bash#ci-providers).\n\nMake a `.slather.yml` file:\n\n```yml\n# .slather.yml\n\ncoverage_service: cobertura_xml\nxcodeproj: path/to/project.xcodeproj\nscheme: YourXcodeSchemeName\nconfiguration: TestedConfiguration\nsource_directory: path/to/sources/to/include\noutput_directory: path/to/xml_report\nignore:\n  - ExamplePodCode/*\n  - ProjectTestsGroup/*\n```\n\nAnd then in your `.travis.yml`, `circle.yml` (or after test commands in other CI providers), call `slather` after a successful build:\n\n```yml\n# .travis.yml\n\nbefore_install: rvm use $RVM_RUBY_VERSION\ninstall: bundle install --without=documentation --path ../travis_bundle_dir\nafter_success: \n  - slather\n  - bash <(curl -s https://codecov.io/bash) -f path/to/xml_report/cobertura.xml -X coveragepy -X gcov -X xcode\n```\n\n```yml\n# circle.yml\n\ntest:\n  post:\n    - bundle exec slather\n    - bash <(curl -s https://codecov.io/bash) -f path/to/xml_report/cobertura.xml -X coveragepy -X gcov -X xcode\n```\n\n> Private repo? Add `-t :uuid-repo-token` to the codecov uploader. Read more about uploading report to Codecov [here](https://github.com/codecov/codecov-bash)\n\n### Usage with Coveralls\n\nLogin to [Coveralls](https://coveralls.io/) and enable your repository. Right now, `slather` supports Coveralls via [Travis CI](https://travis-ci.org), [CircleCI](https://circleci.com), [Jenkins](https://www.jenkins.io/), [Teamcity](https://www.jetbrains.com/teamcity/), [Buildkite](https://buildkite.com/), and [Bitrise](https://bitrise.io/).\n\nMake a `.slather.yml` file and specify the CI Service you're using:\n\n```yml\n# .slather.yml\n\nci_service: circleci | travis_ci | travis_pro | jenkins | buildkite | teamcity\ncoverage_service: coveralls\nxcodeproj: path/to/project.xcodeproj\nscheme: YourXcodeSchemeName\nignore:\n  - ExamplePodCode/*\n  - ProjectTestsGroup/*\n```\n\nAnd then in your `.travis.yml` or `circle.yml` or `github-action.yml`, call `slather` after a successful build:\n\n```yml\n# .travis.yml\n\nbefore_install: rvm use $RVM_RUBY_VERSION\ninstall: bundle install --without=documentation --path ../travis_bundle_dir\nafter_success: slather\n```\n\n```yml\n# circle.yml\n\ntest:\n  post:\n    - bundle exec slather\n\n```\n\n```yml\n# github-action.yml\n  myjob:\n    steps:\n      - run: |\n          bundle config path vendor/bundle\n          bundle install --without=documentation --jobs 4 --retry 3\n      - name: Extract branch name\n        shell: bash\n        run: echo \"##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})\"\n        id: get_branch\n      - run: bundle exec slather\n        env:\n          GIT_BRANCH: ${{ steps.get_branch.outputs.branch }}\n          CI_PULL_REQUEST: ${{ github.event.number }}\n          COVERAGE_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n```\n\n#### Usage with Travis CI Pro\n\nTo use Coveralls with Travis CI Pro (for private repos), add following lines along with other settings to `.slather.yml`:\n\n```yml\n# .slather.yml\n\nci_service: travis_pro\ncoverage_access_token: <YOUR ACCESS TOKEN>\n```\n\nThe coverage token can be found at [Coveralls](https://coveralls.io/) repo page. Or it can be passed in via the `COVERAGE_ACCESS_TOKEN` environment var.\n\n### Cobertura\n\nTo create a Cobertura XML report set `cobertura_xml` as coverage service inside your `.slather.yml`. Optionally you can define an output directory for the XML report:\n\n```yml\n# .slather.yml\n\ncoverage_service: cobertura_xml\nxcodeproj: path/to/project.xcodeproj\nscheme: YourXcodeSchemeName\nsource_directory: path/to/sources/to/include\noutput_directory: path/to/xml_report\nignore:\n  - ExamplePodCode/*\n  - ProjectTestsGroup/*\n```\n\nOr use the command line options `--cobertura-xml` or `-x` and `--output-directory`:\n\n```sh\n$ slather coverage -x --output-directory path/to/xml_report\n```\n\n### Static HTML\n\nTo create a report as static html pages, use the command line options `--html`:\n\n```sh\n$ slather coverage --html --scheme YourXcodeSchemeName path/to/project.xcodeproj\n```\n\nThis will make a directory named `html` in your root directory (unless `--output-directory` is specified) and will generate all the reports as static html pages inside the directory. It will print out the report's path by default, but you can also specify `--show` flag to open it in your browser automatically.\n\nBy default, the generated HTML will reference locally hosted assets (js, css). You can specify the `--cdn-assets` to specify that you prefer for the generated HTML to use externally hosted assets. This can be useful if publishing the HTML file as a build artifact. \n\n### TeamCity Reporting\n\nTo report the coverage statistics to TeamCity:\n\n```sh\n$ slather coverage --teamcity -s --scheme YourXcodeSchemeName\n```\n\n### Coverage for code included via CocoaPods\n\nIf you're trying to compute the coverage of code that has been included via\nCocoaPods, you will need to tell CocoaPods to use the Slather plugin by\nadding the following to your `Podfile`.\n\n```ruby\nplugin 'slather'\n```\n\nYou will also need to tell Slather where to find the source files for your Pod.\n\n```yml\n# .slather.yml\n\nsource_directory: Pods/AFNetworking\n```\n\n### Custom Build Directory\n\nSlather will look for the test coverage files in `DerivedData` by default. If you send build output to a custom location, like [this](https://github.com/erikdoe/ocmock/blob/7f4d22b38eedf1bb9a12ab1591ac0a5d436db61a/Tools/travis.sh#L12), then you should also set the `build_directory` property in `.slather.yml`\n\n### Building in a workspace\n\nInclude the `--workspace` argument or add `workspace` to `.slather.yml` if you build your project in a workspace. For example:\n\n```sh\n$ slather coverage --html --scheme YourXcodeSchemeName --workspace path/to/workspace.xcworkspace path/to/project.xcodeproj\n```\n\n## Contributing\n\nWe’d love to see your ideas for improving this library! The best way to contribute is by submitting a pull request. We’ll do our best to respond to your patch as soon as possible. You can also submit a [new GitHub issue](https://github.com/SlatherOrg/slather/issues/new) if you find bugs or have questions. :octocat:\n\nPlease make sure to follow our general coding style and add test coverage for new features!\n\n## Contributors\n\n* [@tpoulos](https://github.com/tpoulos), the perfect logo.\n* [@ayanonagon](https://github.com/ayanonagon) and [@kylef](https://github.com/kylef), feedback and testing.\n* [@jhersh](https://github.com/jhersh), CircleCI support.\n* [@tarbrain](https://github.com/tarbrain), Cobertura support and bugfixing.\n* [@ikhsan](https://github.com/ikhsan), html support.\n* [@martin-key](https://github.com/martin-key) and [@troyfontaine](https://github.com/troyfontaine), Github Actions support.\n"
  },
  {
    "path": "Rakefile",
    "content": "require \"bundler/gem_tasks\"\nrequire \"rspec/core/rake_task\"\n\nRSpec::Core::RakeTask.new(:spec)\n\ntask default: :spec\n"
  },
  {
    "path": "assets/highlight.pack.js",
    "content": "!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define(\"hljs\",[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/no-?highlight|plain|text/.test(e)}function i(e){var n,t,r,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=/\\blang(?:uage)?-([\\w-]+)\\b/.exec(i))return E(t[1])?t[1]:\"no-highlight\";for(i=i.split(/\\s+/),n=0,r=i.length;r>n;n++)if(E(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}f+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){f+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,f=\"\",l=[];e.length||r.length;){var g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else\"start\"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),i&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&i.tE&&(a.tE+=(a.e?\"|\":\"\")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var f=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?\"\":w.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function p(){if(!L.k)return n(B);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(B);r;){e+=n(B.substr(t,r.index-t));var a=g(L,r);a?(y+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(B)}return e+n(B.substr(t))}function d(){if(L.sL&&!x[L.sL])return n(B);var e=L.sL?f(L.sL,B,!0,M[L.sL]):l(B);return L.r>0&&(y+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),h(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?d():p()}function v(e,t){var r=e.cN?h(e.cN,\"\",!0):\"\";e.rB?(k+=r,B=\"\"):e.eB?(k+=n(t)+r,B=\"\"):(k+=r,B=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(B+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(B+=t),k+=b();do L.cN&&(k+=\"</span>\"),y+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),B=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return B+=t,t.length||1}var N=E(e);if(!N)throw new Error('Unknown language: \"'+e+'\"');s(N);var R,L=i||N,M={},k=\"\";for(R=L;R!=N;R=R.parent)R.cN&&(k=h(R.cN,\"\",!0)+k);var B=\"\",y=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:y,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw O}}function l(e,t){t=t||w.languages||Object.keys(x);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(E(n)){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function g(e){return w.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,w.tabReplace)})),w.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function h(e,n,t){var r=n?R[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=i(e);if(!a(n)){var t;w.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){w=o(w,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function v(){addEventListener(\"DOMContentLoaded\",b,!1),addEventListener(\"load\",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){R[e]=n})}function N(){return Object.keys(x)}function E(e){return x[e]||x[R[e]]}var w={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},x={},R={};return e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=E,e.inherit=o,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:\"doctag\",bK:\"TODO FIXME NOTE BUG XXX\",r:0}),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});hljs.registerLanguage(\"objectivec\",function(e){var t={cN:\"built_in\",b:\"(AV|CA|CF|CG|CI|MK|MP|NS|UI)\\\\w+\"},i={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},o=/[a-zA-Z@][a-zA-Z0-9_]*/,n=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:i,l:o,i:\"</\",c:[t,e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{cN:\"title\",v:[{b:'\"',e:'\"'},{b:\"<\",e:\">\"}]}]},{cN:\"class\",b:\"(\"+n.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:n,l:o,c:[e.UTM]},{cN:\"variable\",b:\"\\\\.\"+e.UIR,r:0}]}});hljs.registerLanguage(\"cpp\",function(t){var e={cN:\"keyword\",b:\"[a-z\\\\d_]*_t\"},r={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\"],k:r,i:\"</\",c:[e,t.CLCM,t.CBCM,{cN:\"string\",v:[t.inherit(t.QSM,{b:'((u8?|U)|L)?\"'}),{b:'(u8?|U)?R\"',e:'\"',c:[t.BE]},{b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"}]},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},t.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line pragma\",c:[{b:/\\\\\\n/,r:0},{b:'include\\\\s*[<\"]',e:'[>\"]',k:\"include\",i:\"\\\\n\"},t.CLCM]},{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:r,c:[\"self\",e]},{b:t.IR+\"::\",k:r},{bK:\"new throw return else\",r:0},{cN:\"function\",b:\"(\"+t.IR+\"\\\\s+)+\"+t.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:t.IR+\"\\\\s*\\\\(\",rB:!0,c:[t.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:r,r:0,c:[t.CBCM]},t.CLCM,t.CBCM]}]}});"
  },
  {
    "path": "assets/slather.css",
    "content": "/* --------------------------------------------------------\nSlather stylesheet\n\nversion: 0.1\nauthor: Ikhsan Assaat (@ixnixnixn)\n----------------------------------------------------------*/\n\n/* General */\nhtml {\n  position: relative;\n  min-height: 100%;\n}\nbody {\n  font: 16px \"Helvetica\", sans-serif;\n  margin: 0 0 120px;\n  color: #333;\n}\n.row { margin: 0 2em; }\n\n/* Header */\nheader { margin-top: 1em; }\nheader img { width: auto; height: 120px; }\n\n/* Coverage */\n#reports > h2 { margin-bottom: 0; }\n#reports > h4 { margin-top: 5px; }\n.percentage {\n  padding: 4px ;\n  font-weight: bold;\n}\n.cov_high { color: #67CF7C; }\n.cov_medium { color: #F89404; }\n.cov_low { color: #F86769; }\n.cov_title { margin-bottom: 0; }\n.cov_subtitle { margin-top: 0.2em; }\n.cov_filepath { font-style: italic; }\n\n/* Index Table */\ntable.coverage_list {\n  width: 90%;\n  min-width: 400px;\n}\ntable.coverage_list th,\ntable.coverage_list td {\n  padding: .6em .5em;\n  text-align: left;\n}\ntable.coverage_list th.col_num { width: 70px; }\ntable.coverage_list th.col_percent { width: 75px; }\ntable.coverage_list thead, tfoot { background: #FDCD9B; }\ntable.coverage_list tbody tr:hover { background: #FCF2E6; }\ntable.coverage_list tbody td { border-bottom: 1px solid #CCC; }\ntable.coverage_list td a {\n  color: #333;\n  text-decoration: none;\n  border-bottom: 1px dotted;\n}\ntable.coverage_list td a:hover {\n  border-bottom: none;\n}\n\n/* Source Code */\ntable.source_code {\n  width: 100%;\n  max-width: 1200px;\n  min-width: 400px;\n  font-size: 13px;\n  border-spacing: 0;\n  background: #FCF2E6;\n  padding: 1.2em 1em;\n  margin-bottom: 2em;\n}\n\ntable.source_code td {\n  padding-bottom: 0.3em;\n}\ncode.missed { background-color: rgba(255, 73, 76, 0.3); }\ntable.source_code tr.missed td { background-color: rgba(248, 103, 105, 0.2); }\ntable.source_code tr.covered td { background-color: rgba(103, 207, 124, 0.2); }\ntable.source_code td.num {\n  border-right: 1px rgba(0,0,0,0.1) solid;\n  text-align: right;\n  padding-right: 1em;\n  width: 30px;\n}\ntable.source_code td.src {\n  border-left: 1px rgba(255,255,255,0.7) solid;\n  padding-left: 1em;\n}\ntable.source_code td.src pre {\n  white-space: pre-wrap;\n  white-space: -moz-pre-wrap;\n  white-space: -pre-wrap;\n  white-space: -o-pre-wrap;\n  word-wrap: break-word;\n  margin: 0;\n}\ntable.source_code td.src pre code { font: 13px \"Menlo\", \"Courier New\"; }\n\ntable.source_code td.coverage {\n  text-align: right;\n  padding-right: 0.5em;\n}\n\n/* Footer */\nfooter {\n  background-color: #67CDCF;\n  height: 80px;\n\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 100%;\n  overflow:hidden;\n}\n\nfooter p, footer a {\n  color: #ffffff;\n  font-weight: bold;\n  text-align: center;\n}\n\n\n/* ----------------------------------------------------------\nSyntax Highlighting using highlight.js (https://highlightjs.org)\n------------------------------------------------------------- */\n.hljs {\n  display: inline-block;\n  overflow-x: auto;\n  -webkit-text-size-adjust: none;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.nginx .hljs-title {\n  color: #333;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rule .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-name,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.pf .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute,\n.tp .hljs-variable {\n  color: #D14F4F;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #05A5A8;\n}\n\n.hljs-label,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #087599;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-doctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.pf .hljs-variable,\n.apache .hljs-tag,\n.hljs-type,\n.hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status,\n.tp .hljs-data,\n.tp .hljs-io {\n  font-weight: bold;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis,\n.tp .hljs-units {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n/* -------------------------------------------------------\nSorting & Filtering with List.js (http://www.listjs.com/)\n------------------------------------------------------- */\n\ninput.search {\n  border:solid 1px #ccc;\n  border-radius: 4px;\n  padding:7px;\n  margin-bottom:10px;\n  font-size: 12px;\n}\ninput.search:focus {\n  outline:none;\n  border-color:#aaa;\n}\n\nth.sort::-moz-selection { background:transparent; }\nth.sort::selection      { background:transparent; }\nth.sort { cursor:pointer; }\nth.sort:after {\n  content:'';\n  display:inline-block;\n  width: 0;\n  height: 0;\n  position: relative;\n  top: -3px;\n  right: -6px;\n  border-width:0 4px 4px;\n  border-style:solid;\n  border-color:#404040 transparent;\n  visibility:hidden;\n}\n th.sort:hover:after { visibility:visible; }\n th.sort.desc:after,\n th.sort.asc:after,\n th.sort.asc:hover:after {\n  visibility:visible;\n  opacity:0.6;\n}\n th.sort.desc:after {\n  border-bottom:none;\n  border-width:4px 4px 0;\n}\n"
  },
  {
    "path": "bin/slather",
    "content": "#!/usr/bin/env ruby\nrequire 'clamp'\nrequire 'yaml'\nrequire_relative '../lib/slather'\nrequire_relative '../lib/slather/command/coverage_command'\nrequire_relative '../lib/slather/command/setup_command'\nrequire_relative '../lib/slather/command/version_command'\n\nclass MainCommand < Clamp::Command\n  self.default_subcommand = \"coverage\"\n\n  subcommand 'setup', 'Configures a .xcodeproj for test coverage generation', SetupCommand\n  subcommand 'coverage', 'Computes coverage for the supplied project', CoverageCommand\n  subcommand 'version', 'Prints slather version', VersionCommand\nend\n\nMainCommand.run\n"
  },
  {
    "path": "lib/cocoapods_plugin.rb",
    "content": "require_relative 'slather'\n\nPod::HooksManager.register('slather', :post_install) do |installer_context|\n  sandbox_root = installer_context.sandbox_root\n  sandbox = Pod::Sandbox.new(sandbox_root)\n  project = Xcodeproj::Project.open(sandbox.project_path)\n  project.slather_setup_for_coverage()\n  project.save()\nend\n\n"
  },
  {
    "path": "lib/slather/command/coverage_command.rb",
    "content": "class CoverageCommand < Clamp::Command\n\n  parameter \"[PROJECT]\", \"Path to the xcodeproj\", :attribute_name => :xcodeproj_path\n\n  option [\"--travis\", \"-t\"], :flag, \"Indicate that the builds are running on Travis CI\"\n  option [\"--travispro\"], :flag, \"Indicate that the builds are running on Travis Pro CI\"\n  option [\"--circleci\"], :flag, \"Indicate that the builds are running on CircleCI\"\n  option [\"--jenkins\"], :flag, \"Indicate that the builds are running on Jenkins\"\n  option [\"--buildkite\"], :flag, \"Indicate that the builds are running on Buildkite\"\n  option [\"--teamcity\"], :flag, \"Indicate that the builds are running on TeamCity\"\n  option [\"--github\"], :flag, \"Indicate that the builds are running on Github Actions\"\n\n  option [\"--coveralls\", \"-c\"], :flag, \"Post coverage results to coveralls\"\n  option [\"--simple-output\", \"-s\"], :flag, \"Output coverage results to the terminal\"\n  option [\"--gutter-json\", \"-g\"], :flag, \"Output coverage results as Gutter JSON format\"\n  option [\"--cobertura-xml\", \"-x\"], :flag, \"Output coverage results as Cobertura XML format\"\n  option [\"--sonarqube-xml\", \"-sq\"], :flag, \"Output coverage results as SonarQube XML format\"\n  option [\"--llvm-cov\", \"-r\"], :flag, \"Output coverage as llvm-cov format\"\n  option [\"--json\"], :flag, \"Output coverage results as simple JSON\"\n  option [\"--html\"], :flag, \"Output coverage results as static html pages\"\n  option [\"--show\"], :flag, \"Indicate that the static html pages will open automatically\"\n  option [\"--cdn-assets\"], :flag, \"Indicate that the static html pages will load assets from a CDN\"\n\n  option [\"--build-directory\", \"-b\"], \"BUILD_DIRECTORY\", \"The directory where gcno files will be written to. Defaults to derived data.\"\n  option [\"--source-directory\"], \"SOURCE_DIRECTORY\", \"The directory where your source files are located.\"\n  option [\"--output-directory\"], \"OUTPUT_DIRECTORY\", \"The directory where your Cobertura XML report will be written to.\"\n  option [\"--ignore\", \"-i\"], \"IGNORE\", \"ignore files conforming to a path\", :multivalued => true\n  option [\"--verbose\", \"-v\"], :flag, \"Enable verbose mode\"\n\n  option [\"--input-format\"], \"INPUT_FORMAT\", \"Input format (gcov, profdata)\"\n  option [\"--scheme\"], \"SCHEME\", \"The scheme for which the coverage was generated\"\n  option [\"--configuration\"], \"CONFIGURATION\", \"The configuration for test that the project was set\"\n  option [\"--workspace\"], \"WORKSPACE\", \"The workspace that the project was built in\"\n  option [\"--binary-file\"], \"BINARY_FILE\", \"The binary file against which the coverage will be run\", :multivalued => true\n  option [\"--binary-basename\"], \"BINARY_BASENAME\", \"Basename of the file against which the coverage will be run\", :multivalued => true\n  option [\"--arch\"], \"ARCH\", \"Architecture to use from universal binaries\"\n  option [\"--source-files\"], \"SOURCE_FILES\", \"A Dir.glob compatible pattern used to limit the lookup to specific source files. Ignored in gcov mode.\", :multivalued => true\n  option [\"--decimals\"], \"DECIMALS\", \"The amount of decimals to use for % coverage reporting\"\n  option [\"--ymlfile\"], \"YMLFILE\", \"Relative path to a file used in place of '.slather.yml'\"\n\n  def execute\n    puts \"Slathering...\"\n\n    setup_ymlfile # MUST be the first setup\n    setup_service_name\n    setup_ignore_list\n    setup_build_directory\n    setup_source_directory\n    setup_output_directory\n    setup_coverage_service\n    setup_verbose_mode\n    setup_input_format\n    setup_scheme\n    setup_configuration\n    setup_workspace\n    setup_binary_file\n    setup_binary_basename\n    setup_arch\n    setup_source_files\n    setup_decimals\n\n    project.configure\n\n    post\n\n    puts \"Slathered\"\n  end\n\n  def setup_ymlfile\n    Slather::Project.yml_filename = ymlfile if ymlfile\n  end\n\n  def setup_build_directory\n    project.build_directory = build_directory if build_directory\n  end\n\n  def setup_source_directory\n    project.source_directory = source_directory if source_directory\n  end\n\n  def setup_output_directory\n    project.output_directory = output_directory if output_directory\n  end\n\n  def setup_ignore_list\n    project.ignore_list = ignore_list if !ignore_list.empty?\n  end\n\n  def setup_service_name\n    if travis?\n      project.ci_service = :travis_ci\n    elsif travispro?\n      project.ci_service = :travis_pro\n    elsif circleci?\n      project.ci_service = :circleci\n    elsif jenkins?\n      project.ci_service = :jenkins\n    elsif buildkite?\n      project.ci_service = :buildkite\n    elsif teamcity?\n      project.ci_service = :teamcity\n    elsif github?\n      project.ci_service = :github\n    end\n  end\n\n  def post\n    project.post\n  end\n\n  def project\n    @project ||= begin\n      xcodeproj_path_to_open = xcodeproj_path || Slather::Project.yml[\"xcodeproj\"]\n      if xcodeproj_path_to_open\n        project = Slather::Project.open(xcodeproj_path_to_open)\n      else\n        raise StandardError, \"Must provide an xcodeproj either via the 'slather [SUBCOMMAND] [PROJECT].xcodeproj' command or through .slather.yml\"\n      end\n    end\n  end\n\n  def setup_coverage_service\n    if coveralls?\n      project.coverage_service = :coveralls\n    elsif simple_output?\n      project.coverage_service = :terminal\n    elsif gutter_json?\n      project.coverage_service = :gutter_json\n    elsif cobertura_xml?\n      project.coverage_service = :cobertura_xml\n    elsif llvm_cov?\n      project.coverage_service = :llvm_cov\n    elsif html?\n      project.coverage_service = :html\n      project.show_html = show?\n      project.cdn_assets = cdn_assets?\n    elsif json?\n      project.coverage_service = :json\n    elsif sonarqube_xml?\n      project.coverage_service = :sonarqube_xml\n    end\n  end\n\n  def setup_verbose_mode\n    project.verbose_mode = verbose?\n  end\n\n  def setup_input_format\n    project.input_format = input_format\n  end\n\n  def setup_scheme\n    project.scheme = scheme\n  end\n\n  def setup_configuration\n    project.configuration = configuration\n  end\n\n  def setup_workspace\n    project.workspace = workspace\n  end\n\n  def setup_binary_file\n    project.binary_file = binary_file_list if !binary_file_list.empty?\n  end\n\n  def setup_binary_basename\n    project.binary_basename = binary_basename_list if !binary_basename_list.empty?\n  end\n\n  def setup_arch\n    project.arch = arch\n  end\n\n  def setup_source_files\n    project.source_files = source_files_list if !source_files_list.empty?\n  end\n\n  def setup_decimals\n    project.decimals = decimals if decimals\n  end\nend\n"
  },
  {
    "path": "lib/slather/command/setup_command.rb",
    "content": "class SetupCommand < Clamp::Command\n  parameter \"[PROJECT]\", \"Path to the .xcodeproj\", :attribute_name => :xcodeproj_path\n\n  option [\"--format\"], \"FORMAT\", \"Type of coverage to use (gcov, clang, auto)\"\n  option [\"--ymlfile\"], \"YMLFILE\", \"Relative path to a file used in place of '.slather.yml'\"\n\n  def execute\n    setup_ymlfile\n    xcodeproj_path_to_open = xcodeproj_path || Slather::Project.yml[\"xcodeproj\"]\n    unless xcodeproj_path_to_open\n      raise StandardError, \"Must provide a .xcodeproj either via the 'slather [SUBCOMMAND] [PROJECT].xcodeproj' command or through .slather.yml\"\n    end\n    project = Slather::Project.open(xcodeproj_path_to_open)\n    project.setup_for_coverage(format ? format.to_sym : :auto)\n    project.save\n  end\n\n  def setup_ymlfile\n    Slather::Project.yml_filename = ymlfile if ymlfile\n  end\nend\n"
  },
  {
    "path": "lib/slather/command/version_command.rb",
    "content": "class VersionCommand < Clamp::Command\n\n  def execute\n    puts \"slather #{Slather::VERSION}\"\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_file.rb",
    "content": "require_relative 'coverage_info'\nrequire_relative 'coveralls_coverage'\n\nmodule Slather\n  class CoverageFile\n\n    include CoverageInfo\n    include CoverallsCoverage\n\n    attr_accessor :project, :gcno_file_pathname\n\n    def initialize(project, gcno_file_pathname)\n      self.project = project\n      self.gcno_file_pathname = Pathname(gcno_file_pathname)\n    end\n\n    def source_file_pathname\n      @source_file_pathname ||= begin\n        base_filename = gcno_file_pathname.basename.sub_ext(\"\")\n        path = nil\n        if project.source_directory\n          path = Dir[\"#{project.source_directory}/**/#{base_filename}.{#{supported_file_extensions.join(\",\")}}\"].first\n          path &&= Pathname(path)\n        else\n          pbx_file = project.files.detect { |pbx_file|\n            current_base_filename = pbx_file.real_path.basename\n            ext_name = File.extname(current_base_filename.to_s)[1..-1]\n            current_base_filename.sub_ext(\"\") == base_filename && supported_file_extensions.include?(ext_name)\n          }\n          path = pbx_file && pbx_file.real_path\n        end\n        path\n      end\n    end\n\n    def source_file\n      File.new(source_file_pathname)\n    end\n\n    def source_data\n      source_file.read\n    end\n\n    def gcov_data\n      @gcov_data ||= begin\n        gcov_data = \"\"\n\n        Dir.chdir(project.project_dir) do\n          gcov_output = `gcov \"#{source_file_pathname}\" --object-directory \"#{gcno_file_pathname.parent}\" --branch-probabilities --branch-counts`\n          # Sometimes gcov makes gcov files for Cocoa Touch classes, like NSRange. Ignore and delete later.\n          gcov_files_created = gcov_output.scan(/creating '(.+\\..+\\.gcov)'/)\n\n          gcov_file_name = \"./#{source_file_pathname.basename}.gcov\"\n          if File.exist?(gcov_file_name)\n            gcov_data = File.new(gcov_file_name).read\n          else\n            gcov_data = \"\"\n          end\n\n          gcov_files_created.each { |file| FileUtils.rm_f(file) }\n        end\n\n        gcov_data\n      end\n    end\n\n    def all_lines\n      unless cleaned_gcov_data.empty?\n        first_line_start = cleaned_gcov_data =~ /^\\s+(-|#+|[0-9+]):\\s+1:/\n        cleaned_gcov_data[first_line_start..-1].split(\"\\n\").map\n      else\n        []\n      end\n    end\n\n    def cleaned_gcov_data\n      data = gcov_data.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').gsub(/^function(.*) called [0-9]+ returned [0-9]+% blocks executed(.*)$\\r?\\n/, '')\n      data.gsub(/^branch(.*)$\\r?\\n/, '')\n    end\n\n    def raw_data\n      self.gcov_data\n    end\n\n    def line_coverage_data\n      unless cleaned_gcov_data.empty?\n        first_line_start = cleaned_gcov_data =~ /^\\s+(-|#+|[0-9+]):\\s+1:/\n\n        cleaned_gcov_data[first_line_start..-1].split(\"\\n\").map do |line|\n          coverage_for_line(line)\n        end\n      else\n        []\n      end\n    end\n\n    def line_number_in_line(line)\n      line.split(':')[1].strip.to_i\n    end\n\n    def coverage_for_line(line)\n      line =~ /^(.+?):/\n\n      match = $1.strip\n      case match\n      when /[0-9]+/\n        match.to_i\n      when /#+/\n        0\n      when \"-\"\n        nil\n      end\n    end\n\n    def branch_coverage_data\n      @branch_coverage_data ||= begin\n        branch_coverage_data = Hash.new\n\n        gcov_data.scan(/(^(\\s+(-|#+|[0-9]+):\\s+[1-9]+:(.*)$\\r?\\n)(^branch\\s+[0-9]+\\s+[a-zA-Z0-9]+\\s+[a-zA-Z0-9]+$\\r?\\n)+)+/) do |data|\n          lines = data[0].split(\"\\n\")\n          line_number = lines[0].split(':')[1].strip.to_i\n          branch_coverage_data[line_number] = lines[1..-1].map do |line|\n            if line.split(' ')[2].strip == \"never\"\n              0\n            else\n              line.split(' ')[3].strip.to_i\n            end\n          end\n        end\n        branch_coverage_data\n      end\n    end\n\n    def source_file_basename\n      File.basename(source_file_pathname, '.m')\n    end\n\n    def line_number_separator\n      \":\"\n    end\n\n    def supported_file_extensions\n      [\"cpp\", \"mm\", \"m\"]\n    end\n    private :supported_file_extensions\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_info.rb",
    "content": "module Slather\n  module CoverageInfo\n\n    def num_lines_tested\n      line_coverage_data.compact.select { |cd| cd > 0 }.count\n    end\n\n    def num_lines_testable\n      line_coverage_data.compact.count\n    end\n\n    def rate_lines_tested\n      if num_lines_testable > 0\n        (num_lines_tested / num_lines_testable.to_f)\n      else\n        0\n      end\n    end\n\n    def percentage_lines_tested\n      if num_lines_testable == 0\n        100\n      else\n        rate_lines_tested * 100\n      end\n    end\n\n    def branch_coverage_data_for_statement_on_line(line_number)\n      branch_coverage_data[line_number] || []\n    end\n\n    def num_branches_for_statement_on_line(line_number)\n      branch_coverage_data_for_statement_on_line(line_number).length\n    end\n\n    def num_branch_hits_for_statement_on_line(line_number)\n      branch_coverage_data_for_statement_on_line(line_number).count { |hit_count| hit_count > 0 }\n    end\n\n    def rate_branch_coverage_for_statement_on_line(line_number)\n      branch_data = branch_coverage_data_for_statement_on_line(line_number)\n      if branch_data.empty?\n        0.0\n      else\n        (num_branch_hits_for_statement_on_line(line_number) / branch_data.length.to_f)\n      end\n    end\n\n    def percentage_branch_coverage_for_statement_on_line(line_number)\n      rate_branch_coverage_for_statement_on_line(line_number) * 100\n    end\n\n    def num_branches_testable\n      branch_coverage_data.keys.reduce(0) do |sum, line_number|\n        sum += num_branches_for_statement_on_line(line_number)\n      end\n    end\n\n    def num_branches_tested\n      branch_coverage_data.keys.reduce(0) do |sum, line_number|\n        sum += num_branch_hits_for_statement_on_line(line_number)\n      end\n    end\n\n    def rate_branches_tested\n      if (num_branches_testable > 0)\n        (num_branches_tested / num_branches_testable.to_f)\n      else\n        0.0\n      end\n    end\n\n    def source_file_pathname_relative_to_repo_root\n      source_file_pathname.realpath.relative_path_from(Pathname(\"./\").realpath)\n    end\n\n    def ignored?\n      project.ignore_list.any? do |ignore|\n        File.fnmatch(ignore, source_file_pathname_relative_to_repo_root)\n      end\n    end\n\n    def include_file?\n      rv = true # default true return value to fix https://github.com/SlatherOrg/slather/issues/561\n      project.source_files.any? do |include|\n        rv = File.fnmatch(include, source_file_pathname_relative_to_repo_root)\n      end\n\n      rv\n    end\n\n  end\nend"
  },
  {
    "path": "lib/slather/coverage_service/cobertura_xml_output.rb",
    "content": "require 'nokogiri'\nrequire 'date'\n\nmodule Slather\n  module CoverageService\n    module CoberturaXmlOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        cobertura_xml_report = create_xml_report(coverage_files)\n        store_report(cobertura_xml_report)\n      end\n\n      def store_report(report)\n        output_file = 'cobertura.xml'\n        if output_directory\n          FileUtils.mkdir_p(output_directory)\n          output_file = File.join(output_directory, output_file)\n        end\n        File.write(output_file, report.to_s)\n      end\n\n      def grouped_coverage_files(coverage_files)\n        groups = Hash.new\n        coverage_files.each do |coverage_file|\n          next if coverage_file == nil\n          path = File.dirname(coverage_file.source_file_pathname_relative_to_repo_root)\n          if groups[path] == nil\n            groups[path] = Array.new\n          end\n          groups[path].push(coverage_file)\n        end\n        groups\n      end\n\n      def create_xml_report(coverage_files)\n        total_project_lines = 0\n        total_project_lines_tested = 0\n        total_project_line_rate = '%.16f' % 1.0\n        total_project_branches = 0\n        total_project_branches_tested = 0\n        total_project_branch_rate = '%.16f' % 1.0\n\n        create_empty_xml_report\n        coverage_node = @doc.root\n        source_node = @doc.at_css \"source\" \n        source_node.content = Pathname.pwd.to_s\n        packages_node = @doc.at_css \"packages\"\n\n        # group files by path\n          grouped_coverage_files(coverage_files).each do |path , package_coverage_files|\n          package_node = Nokogiri::XML::Node.new \"package\", @doc\n          package_node.parent = packages_node\n          classes_node = Nokogiri::XML::Node.new \"classes\", @doc\n          classes_node.parent = package_node\n          package_node['name'] = path.gsub(/\\//, '.')\n\n          total_package_lines = 0\n          total_package_lines_tested = 0\n          total_package_lines_rate = '%.16f' % 1.0\n          total_package_branches = 0\n          total_package_branches_tested = 0\n          total_package_branch_rate = '%.16f' % 1.0\n\n          package_coverage_files.each do |package_coverage_file|\n            class_node = create_class_node(package_coverage_file)\n            class_node.parent = classes_node\n            total_package_lines += package_coverage_file.num_lines_testable\n            total_package_lines_tested += package_coverage_file.num_lines_tested\n            total_package_branches += package_coverage_file.num_branches_testable\n            total_package_branches_tested += package_coverage_file.num_branches_tested\n          end\n\n          if (total_package_lines > 0)\n            total_package_line_rate = '%.16f' % (total_package_lines_tested / total_package_lines.to_f)\n          end\n\n          if (total_package_branches > 0)\n            total_package_branch_rate = '%.16f' % (total_package_branches_tested / total_package_branches.to_f)\n          end\n\n          package_node['line-rate'] = total_package_line_rate\n          package_node['branch-rate'] = total_package_branch_rate\n          package_node['complexity'] = '0.0'\n\n          total_project_lines += total_package_lines\n          total_project_lines_tested += total_package_lines_tested\n          total_project_branches += total_package_branches\n          total_project_branches_tested += total_package_branches_tested\n        end\n\n        if (total_project_lines > 0)\n          total_project_line_rate = '%.16f' % (total_project_lines_tested / total_project_lines.to_f)\n        end\n\n        if (total_project_branches > 0)\n          total_project_branch_rate = '%.16f' % (total_project_branches_tested / total_project_branches.to_f)\n        end\n\n        coverage_node['line-rate'] = total_project_line_rate\n        coverage_node['branch-rate'] = total_project_branch_rate\n        coverage_node['lines-covered'] = total_project_lines_tested\n        coverage_node['lines-valid'] = total_project_lines\n        coverage_node['branches-covered'] = total_project_branches_tested\n        coverage_node['branches-valid'] = total_project_branches\n        coverage_node['complexity'] = \"0.0\"\n        coverage_node['timestamp'] = DateTime.now.strftime('%s')\n        coverage_node['version'] = \"Slather #{Slather::VERSION}\"\n        @doc.to_xml\n      end\n\n      def create_class_node(coverage_file)\n        filename = coverage_file.source_file_basename\n        filepath = coverage_file.source_file_pathname_relative_to_repo_root.to_s\n\n        class_node = Nokogiri::XML::Node.new \"class\", @doc\n        class_node['name'] = filename\n        class_node['filename'] = filepath\n        class_node['line-rate'] = '%.16f' %  [(coverage_file.num_lines_testable > 0) ? coverage_file.rate_lines_tested : 1.0]\n        class_node['branch-rate'] = '%.16f' % [(coverage_file.num_branches_testable > 0) ? coverage_file.rate_branches_tested : 1.0]\n        class_node['complexity'] = '0.0'\n\n        methods_node = Nokogiri::XML::Node.new \"methods\", @doc\n        methods_node.parent = class_node\n        lines_node = Nokogiri::XML::Node.new \"lines\", @doc\n        lines_node.parent = class_node\n        \n        coverage_file.all_lines.each do |line|\n          if coverage_file.coverage_for_line(line)\n            line_node = create_line_node(line, coverage_file)\n            line_node.parent = lines_node\n          end\n        end\n        class_node\n      end\n\n      def create_line_node(line, coverage_file)\n        line_number = coverage_file.line_number_in_line(line)\n        line_node = Nokogiri::XML::Node.new \"line\", @doc\n        line_node['number'] = line_number\n        line_node['branch'] = \"false\"\n        line_node['hits'] = coverage_file.coverage_for_line(line)\n      \n        unless coverage_file.branch_coverage_data_for_statement_on_line(line_number).empty?\n          line_node['branch'] = \"true\"  \n          conditions_node = Nokogiri::XML::Node.new \"conditions\", @doc\n          conditions_node.parent = line_node\n          condition_node = Nokogiri::XML::Node.new \"condition\", @doc\n          condition_node.parent = conditions_node\n          condition_node['number'] = \"0\"\n          condition_node['type'] = \"jump\"\n          branches_testable = coverage_file.num_branches_for_statement_on_line(line_number)\n          branch_hits = coverage_file.num_branch_hits_for_statement_on_line(line_number)\n          condition_coverage = coverage_file.percentage_branch_coverage_for_statement_on_line(line_number)\n          condition_node['coverage'] = \"#{condition_coverage.to_i}%\"\n          line_node['condition-coverage'] = \"#{condition_coverage.to_i}% (#{branch_hits}/#{branches_testable})\"\n        end\n        line_node\n      end\n\n      def create_empty_xml_report\n        builder = Nokogiri::XML::Builder.new do |xml|\n          xml.doc.create_internal_subset(\n            'coverage',\n            nil,\n            \"https://raw.githubusercontent.com/cobertura/cobertura/master/cobertura/src/site/htdocs/xml/coverage-04.dtd\"\n          )\n          xml.coverage do\n            xml.sources do\n              xml.source\n            end\n            xml.packages\n          end\n        end\n        @doc = builder.doc\n      end\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/coveralls.rb",
    "content": "module Slather\n  module CoverageService\n    module Coveralls\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def travis_job_id\n        ENV['TRAVIS_JOB_ID']\n      end\n      private :travis_job_id\n\n      def circleci_job_id\n        ENV['CIRCLE_BUILD_NUM']\n      end\n      private :circleci_job_id\n\n      def circleci_pull_request\n        ENV['CIRCLE_PR_NUMBER'] || ENV['CI_PULL_REQUEST'] || \"\"\n      end\n      private :circleci_pull_request\n\n      def teamcity_job_id\n        ENV['TC_BUILD_NUMBER']\n      end\n      private :teamcity_job_id\n\n      def jenkins_job_id\n        ENV['BUILD_ID']\n      end\n      private :jenkins_job_id\n\n      def github_job_id\n        ENV['GITHUB_RUN_ID']\n      end\n      private :github_job_id\n\n      def bitrise_job_id\n        ENV['BITRISE_BUILD_NUMBER']\n      end\n      private :bitrise_job_id\n\n      def bitrise_pull_request\n        ENV['BITRISE_PULL_REQUEST']\n      end\n      private :bitrise_pull_request\n\n      def github_pull_request\n        ENV['CI_PULL_REQUEST'] || \"\"\n      end\n      private :github_pull_request\n\n      def github_repo_name\n        ENV['GITHUB_REPOSITORY'] || \"\"\n      end\n      private :github_repo_name\n\n      def jenkins_branch_name\n        branch_name = ENV['GIT_BRANCH'] || ENV['BRANCH_NAME']\n        if branch_name.include? 'origin/'\n          branch_name[7...branch_name.length]\n        else\n          branch_name\n        end\n      end\n      private :jenkins_branch_name\n\n      def teamcity_branch_name\n        ENV['GIT_BRANCH'] || `git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3-`.chomp\n      end\n      private :teamcity_branch_name\n\n      def github_branch_name\n        ENV['GIT_BRANCH'] || `git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3-`.chomp\n      end\n      private :github_branch_name\n\n      def bitrise_branch_name\n        ENV['BITRISE_GIT_BRANCH'] || `git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3-`.chomp\n      end\n      private :bitrise_branch_name\n\n      def buildkite_job_id\n        ENV['BUILDKITE_BUILD_NUMBER']\n      end\n      private :buildkite_job_id\n\n      def buildkite_pull_request\n        ENV['BUILDKITE_PULL_REQUEST']\n      end\n      private :buildkite_pull_request\n\n      def jenkins_git_info\n        {\n          head: {\n            id: ENV['sha1'],\n            author_name: ENV['ghprbActualCommitAuthor'],\n            message: ENV['ghprbPullTitle']\n          },\n          branch: jenkins_branch_name\n        }\n      end\n      private :jenkins_git_info\n\n      def teamcity_git_info\n        {\n          head: {\n            :id => (`git log --format=%H -n 1 HEAD`.chomp || \"\"),\n            :author_name => (`git log --format=%an -n 1 HEAD`.chomp || \"\"),\n            :author_email => (`git log --format=%ae -n 1 HEAD`.chomp || \"\"),\n            :message => (`git log --format=%s -n 1 HEAD`.chomp || \"\")\n          },\n          :branch => teamcity_branch_name\n        }\n      end\n      private :teamcity_git_info\n\n      def circleci_build_url\n        \"https://circleci.com/gh/\" + ENV['CIRCLE_PROJECT_USERNAME'] || \"\" + \"/\" + ENV['CIRCLE_PROJECT_REPONAME'] || \"\" + \"/\" + ENV['CIRCLE_BUILD_NUM'] || \"\"\n      end\n      private :circleci_build_url\n\n      def circleci_git_info\n        {\n          :head => {\n            :id => (ENV['CIRCLE_SHA1'] || \"\"),\n            :author_name => (ENV['CIRCLE_PR_USERNAME'] || ENV['CIRCLE_USERNAME'] || \"\"),\n            :message => (`git log --format=%s -n 1 HEAD`.chomp || \"\")\n          },\n          :branch => (ENV['CIRCLE_BRANCH'] || \"\")\n        }\n      end\n      private :circleci_git_info\n\n      def buildkite_git_info\n        {\n          :head => {\n            :id => ENV['BUILDKITE_COMMIT'],\n            :author_name => (`git log --format=%an -n 1 HEAD`.chomp || \"\"),\n            :author_email => (`git log --format=%ae -n 1 HEAD`.chomp || \"\"),\n            :message => (`git log --format=%s -n 1 HEAD`.chomp || \"\")\n          },\n          :branch => ENV['BUILDKITE_BRANCH']\n        }\n      end\n\n      def buildkite_build_url\n        \"https://buildkite.com/\" + ENV['BUILDKITE_PROJECT_SLUG'] + \"/builds/\" + ENV['BUILDKITE_BUILD_NUMBER'] + \"#\"\n      end\n\n      def github_git_info\n        {\n          :head => {\n            :id => ENV['GITHUB_SHA'],\n            :author_name => ENV['GITHUB_ACTOR'],\n            :message => (`git log --format=%s -n 1 HEAD`.chomp || \"\")\n          },\n          :branch => github_branch_name\n        }\n      end\n      private :github_git_info\n\n      def bitrise_git_info\n        {\n          :head => {\n            :id => ENV['BITRISE_GIT_COMMIT'],\n            :committer_name => (ENV['GIT_CLONE_COMMIT_AUTHOR_NAME'] || `git log --format=%an -n 1 HEAD`.chomp || \"\"),\n            :committer_email => (ENV['GIT_CLONE_COMMIT_AUTHOR_EMAIL'] || `git log --format=%ae -n 1 HEAD`.chomp || \"\"),\n            :message => (ENV['BITRISE_GIT_MESSAGE'] || `git log --format=%s -n 1 HEAD`.chomp || \"\")\n          },\n          :branch => bitrise_branch_name\n        }\n      end\n      private :bitrise_git_info\n\n      def github_build_url\n        \"https://github.com/\" + ENV['GITHUB_REPOSITORY'] + \"/actions/runs/\" + ENV['GITHUB_RUN_ID']\n      end\n      private :github_build_url\n\n      def is_parallel\n        ENV['IS_PARALLEL'] != nil\n      end\n      private :is_parallel\n\n      def github_job_name\n        ENV['GITHUB_JOB']\n      end\n      private :github_job_name\n\n      def coveralls_coverage_data\n        if ci_service == :travis_ci || ci_service == :travis_pro\n          if travis_job_id\n            if ci_service == :travis_ci\n\n              if coverage_access_token.to_s.strip.length > 0\n                raise StandardError, \"Access token is set. Uploading coverage data for public repositories doesn't require an access token.\"\n              end\n\n              {\n                :service_job_id => travis_job_id,\n                :service_name => \"travis-ci\",\n                :source_files => coverage_files.map(&:as_json)\n              }.to_json\n            elsif ci_service == :travis_pro\n\n              if coverage_access_token.to_s.strip.length == 0\n                raise StandardError, \"Access token is not set. Uploading coverage data for private repositories requires an access token.\"\n              end\n\n              {\n                :service_job_id => travis_job_id,\n                :service_name => \"travis-pro\",\n                :repo_token => coverage_access_token,\n                :source_files => coverage_files.map(&:as_json)\n              }.to_json\n            end\n          else\n            raise StandardError, \"Environment variable `TRAVIS_JOB_ID` not set. Is this running on a travis build?\"\n          end\n        elsif ci_service == :circleci\n          if circleci_job_id\n            coveralls_hash = {\n              :service_job_id => circleci_job_id,\n              :service_name => \"circleci\",\n              :repo_token => coverage_access_token,\n              :source_files => coverage_files.map(&:as_json),\n              :git => circleci_git_info,\n              :service_build_url => circleci_build_url\n            }\n\n            if circleci_pull_request != nil && circleci_pull_request.length > 0\n              coveralls_hash[:service_pull_request] = circleci_pull_request.split(\"/\").last\n            end\n\n            coveralls_hash.to_json\n          else\n            raise StandardError, \"Environment variable `CIRCLE_BUILD_NUM` not set. Is this running on a circleci build?\"\n          end\n        elsif ci_service == :jenkins\n          if jenkins_job_id\n            {\n              service_job_id: jenkins_job_id,\n              service_name: \"jenkins\",\n              repo_token: coverage_access_token,\n              source_files: coverage_files.map(&:as_json),\n              git: jenkins_git_info\n            }.to_json\n          else\n            raise StandardError, \"Environment variable `BUILD_ID` not set. Is this running on a jenkins build?\"\n          end\n        elsif ci_service == :buildkite\n          if buildkite_job_id\n            {\n              :service_job_id => buildkite_job_id,\n              :service_name => \"buildkite\",\n              :repo_token => coverage_access_token,\n              :source_files => coverage_files.map(&:as_json),\n              :git => buildkite_git_info,\n              :service_build_url => buildkite_build_url,\n              :service_pull_request => buildkite_pull_request\n            }.to_json\n          else\n            raise StandardError, \"Environment variable `BUILDKITE_BUILD_NUMBER` not set. Is this running on a buildkite build?\"\n          end\n        elsif ci_service == :teamcity\n          if teamcity_job_id\n            {\n              :service_job_id => teamcity_job_id,\n              :service_name => \"teamcity\",\n              :repo_token => coverage_access_token,\n              :source_files => coverage_files.map(&:as_json),\n              :git => teamcity_git_info\n            }.to_json\n          else\n            raise StandardError, \"Environment variable `TC_BUILD_NUMBER` not set. Is this running on a teamcity build?\"\n          end\n        elsif ci_service == :github\n\n          if coverage_access_token.to_s.strip.length == 0\n            raise StandardError, \"Access token is not set. Uploading coverage data for private repositories requires an access token.\"\n          end\n\n          if github_job_id\n            {\n              :service_job_id => github_job_id,\n              :service_name => \"github\",\n              :repo_token => coverage_access_token,\n              :repo_name => github_repo_name,\n              :source_files => coverage_files.map(&:as_json),\n              :service_build_url => github_build_url,\n              :service_pull_request => github_pull_request,\n              :git => github_git_info,\n              :parallel => is_parallel,\n              :flag_name => github_job_name\n            }.to_json\n          else\n            raise StandardError, \"Environment variable `GITHUB_RUN_ID` not set.  Is this running on github build?\"\n          end\n        elsif ci_service == :bitrise\n          {\n            :service_job_id => bitrise_job_id,\n            :service_name => 'bitrise',\n            :repo_token => coverage_access_token,\n            :source_files => coverage_files.map(&:as_json),\n            :service_pull_request => bitrise_pull_request,\n            :service_branch => bitrise_branch_name,\n            :git => bitrise_git_info\n          }.to_json\n        else\n          {\n            :service_job_id => ENV['CI_BUILD_NUMBER'],\n            :service_name => ENV['CI_NAME'] || ci_service,\n            :repo_token => coverage_access_token,\n            :source_files => coverage_files.map(&:as_json),\n            :service_build_url => ENV['CI_BUILD_URL'],\n            :service_pull_request => ENV['CI_PULL_REQUEST'],\n            :service_branch => ENV['CI_BRANCH'],\n            :git => {\n              :head => {\n                :id => ENV['CI_COMMIT'],\n                :committer_name => (`git log --format=%an -n 1 HEAD`.chomp || \"\"),\n                :committer_email => (`git log --format=%ae -n 1 HEAD`.chomp || \"\"),\n                :message => (`git log --format=%s -n 1 HEAD`.chomp || \"\")\n              },\n              :branch => ENV['CI_BRANCH']\n            }\n          }.to_json\n        end\n      end\n      private :coveralls_coverage_data\n\n      def post\n        f = File.open('coveralls_json_file', 'w+')\n        begin\n          f.write(coveralls_coverage_data)\n          f.close\n\n          curl_result = `curl -s --form json_file=@#{f.path} #{coveralls_api_jobs_path}`\n\n          if curl_result.is_a? String\n            curl_result_json = JSON.parse(curl_result)\n\n            if curl_result_json[\"error\"]\n              error_message = curl_result_json[\"message\"]\n              raise StandardError, \"Error while uploading coverage data to Coveralls. CI Service: #{ci_service} Message: #{error_message}\"\n            end\n          end\n\n        rescue StandardError => e\n          FileUtils.rm(f)\n          raise e\n        end\n        FileUtils.rm(f)\n      end\n\n      def coveralls_api_jobs_path\n        \"https://coveralls.io/api/v1/jobs\"\n      end\n      private :coveralls_api_jobs_path\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/gutter_json_output.rb",
    "content": "module Slather\n  module CoverageService\n    module GutterJsonOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        output = { 'meta' => { 'timestamp' => DateTime.now.strftime('%Y-%m-%d %H:%M:%S.%6N') } }\n        symbols = {}\n\n        coverage_files.each do |coverage_file|\n          next unless coverage_file.raw_data\n\n          filename = coverage_file.source_file_pathname.to_s\n          filename = filename.sub(Pathname.pwd.to_s, '').reverse.chomp(\"/\").reverse\n\n          coverage_file.all_lines.each do |line|\n\n            line_number = coverage_file.line_number_in_line(line)\n            next unless line_number > 0\n\n            coverage = coverage_file.coverage_for_line(line)\n            short_text = coverage != nil ? coverage.to_s : \"-\"\n\n            symbol = {  'line' => line_number,\n                        'long_text' => '',\n                        'short_text' => short_text }\n\n            if coverage != nil\n              symbol['background_color'] = coverage.to_i > 0 ? '0x35CC4B' : '0xFC635E'\n            end\n\n            if symbols.has_key?(filename)\n              symbols[filename] << symbol\n            else\n              symbols[filename] = [ symbol ]\n            end\n          end\n        end\n\n        output['symbols_by_file'] = symbols\n        File.open('.gutter.json', 'w') { |file| file.write(output.to_json) }\n      end\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/hardcover.rb",
    "content": "module Slather\n  module CoverageService\n    module Hardcover\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def jenkins_job_id\n        \"#{ENV['JOB_NAME']}/#{ENV['BUILD_NUMBER']}\"\n      end\n      private :jenkins_job_id\n\n      def hardcover_coverage_data\n        if ci_service == :jenkins_ci\n          if jenkins_job_id\n            {\n              :service_job_id => jenkins_job_id,\n              :service_name => \"jenkins-ci\",\n              :repo_token => Project.yml[\"hardcover_repo_token\"],\n              :source_files => coverage_files.map(&:as_json)\n            }.to_json\n          else\n            raise StandardError, \"Environment variables `BUILD_NUMBER` and `JOB_NAME` are not set. Is this running on a Jenkins build?\"\n          end\n        else\n          raise StandardError, \"No support for ci named #{ci_service}\"\n        end\n      end\n      private :hardcover_coverage_data\n\n      def post\n        f = File.open('hardcover_json_file', 'w+')\n        begin\n          f.write(hardcover_coverage_data)\n          f.close\n          `curl --form json_file=@#{f.path} #{hardcover_api_jobs_path}`\n        rescue StandardError => e\n          FileUtils.rm(f)\n          raise e\n        end\n        FileUtils.rm(f)\n      end\n\n      def hardcover_api_jobs_path\n        \"#{hardcover_base_url}/v1/jobs\"\n      end\n      private :hardcover_api_jobs_path\n\n      def hardcover_base_url\n        url = Project.yml[\"hardcover_base_url\"]\n        unless url\n          raise \"No `hardcover_base_url` configured. Please add it to your `.slather.yml`\"\n        end\n        url\n      end\n      private :hardcover_base_url\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/html_output.rb",
    "content": "require 'nokogiri'\nrequire \"cgi\"\n\nmodule Slather\n  module CoverageService\n    module HtmlOutput\n\n      attr_reader :docs\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def directory_path\n        is_path_valid = !output_directory.nil? && !output_directory.strip.eql?(\"\")\n        is_path_valid ? File.expand_path(output_directory) : \"html\"\n      end\n      private :directory_path\n\n      def post\n        create_html_reports(coverage_files)\n        generate_reports(@docs)\n\n        index_html_path = File.join(directory_path, \"index.html\")\n        if show_html\n          open_coverage index_html_path\n        else\n          print_path_coverage index_html_path\n        end\n      end\n\n      def print_path_coverage(index_html)\n        path = File.expand_path index_html\n        puts \"\\nTo open the html reports, use \\n\\nopen '#{path}'\\n\\nor use '--show' flag to open it automatically.\\n\\n\"\n      end\n\n      def open_coverage(index_html)\n        path = File.expand_path index_html\n        `open '#{path}'` if File.exist?(path)\n      end\n\n      def create_html_reports(coverage_files)\n        create_index_html(coverage_files)\n        create_htmls_from_files(coverage_files)\n      end\n\n      def generate_reports(reports)\n        FileUtils.rm_rf(directory_path) if Dir.exist?(directory_path)\n        FileUtils.mkdir_p(directory_path)\n\n        FileUtils.cp(File.join(gem_root_path, \"docs/logo.jpg\"), directory_path)\n        FileUtils.cp(File.join(gem_root_path, \"assets/slather.css\"), directory_path)\n        FileUtils.cp(File.join(gem_root_path, \"assets/highlight.pack.js\"), directory_path)\n        FileUtils.cp(File.join(gem_root_path, \"assets/list.min.js\"), directory_path)\n\n        reports.each do |name, doc|\n          html_file = File.join(directory_path, \"#{name}.html\")\n          File.write(html_file, doc.to_html)\n        end\n      end\n\n      def create_index_html(coverage_files)\n        project_name = File.basename(self.xcodeproj)\n        template = generate_html_template(project_name, true, false)\n\n        total_relevant_lines = 0\n        total_tested_lines = 0\n        total_relevant_branches = 0\n        total_branches_tested = 0\n        coverage_files.each { |coverage_file|\n          total_tested_lines += coverage_file.num_lines_tested\n          total_relevant_lines += coverage_file.num_lines_testable\n\n          total_relevant_branches += coverage_file.num_branches_testable\n          total_branches_tested += coverage_file.num_branches_tested\n        }\n\n        builder = Nokogiri::HTML::Builder.with(template.at('#reports')) { |cov|\n          cov.h2 \"Files for \\\"#{project_name}\\\"\"\n\n          cov.h4 {\n            percentage = (total_tested_lines / total_relevant_lines.to_f) * 100.0\n            cov.span \"Total Coverage : \"\n            cov.span decimal_f(percentage) + '%', :class => class_for_coverage_percentage(percentage), :id => \"total_coverage\"\n            cov.span \" (\"\n            cov.span total_tested_lines, :id => \"total_tested_lines\"\n            cov.span \" of \"\n            cov.span total_relevant_lines, :id => \"total_relevant_lines\"\n            cov.span \" lines)\"\n          }\n\n          cov.h4 {\n            percentage = (total_branches_tested / total_relevant_branches.to_f) * 100.0\n            cov.span \"Total Branch Coverage : \"\n            cov.span decimal_f(percentage) + '%', :class => class_for_coverage_percentage(percentage), :id => \"total_coverage\"\n            cov.span \" (\"\n            cov.span total_branches_tested, :id => \"total_branches_tested\"\n            cov.span \" of \"\n            cov.span total_relevant_branches, :id => \"total_relevant_branches\"\n            cov.span \" lines)\"\n          }\n\n          cov.input(:class => \"search\", :placeholder => \"Search\")\n\n          cov.table(:class => \"coverage_list\", :cellspacing => 0,  :cellpadding => 0) {\n\n            cov.thead {\n              cov.tr {\n                cov.th \"%\", :class => \"col_num sort\", \"data-sort\" => \"data_percentage\"\n                cov.th \"File\", :class => \"sort\", \"data-sort\" => \"data_filename\"\n                cov.th \"Lines\", :class => \"col_percent sort\", \"data-sort\" => \"data_lines\"\n                cov.th \"Relevant\", :class => \"col_percent sort\", \"data-sort\" => \"data_relevant\"\n                cov.th \"Covered\", :class => \"col_percent sort\", \"data-sort\" => \"data_covered\"\n                cov.th \"Missed\", :class => \"col_percent sort\", \"data-sort\" => \"data_missed\"\n              }\n            }\n\n            cov.tbody(:class => \"list\") {\n              coverage_files.each { |coverage_file|\n                filename = File.basename(coverage_file.source_file_pathname_relative_to_repo_root)\n                filename_link = CGI.escape(filename) + \".html\"\n\n                cov.tr {\n                  percentage = coverage_file.percentage_lines_tested\n\n                  cov.td { cov.span decimal_f(percentage), :class => \"percentage #{class_for_coverage_percentage(percentage)} data_percentage\" }\n                  cov.td(:class => \"data_filename\") {\n                    cov.a filename, :href => filename_link\n                  }\n                  cov.td \"#{coverage_file.line_coverage_data.count}\", :class => \"data_lines\"\n                  cov.td \"#{coverage_file.num_lines_testable}\", :class => \"data_relevant\"\n                  cov.td \"#{coverage_file.num_lines_tested}\", :class => \"data_covered\"\n                  cov.td \"#{(coverage_file.num_lines_testable - coverage_file.num_lines_tested)}\", :class => \"data_missed\"\n                }\n              }\n            }\n          }\n        }\n\n        @docs = Hash.new\n        @docs[:index] = builder.doc\n      end\n\n      def create_htmls_from_files(coverage_files)\n        coverage_files.map { |file| create_html_from_file file }\n      end\n\n      def create_html_from_file(coverage_file)\n        filepath = coverage_file.source_file_pathname_relative_to_repo_root\n        filename = File.basename(filepath)\n        percentage = coverage_file.percentage_lines_tested\n        branch_percentage = coverage_file.rate_branches_tested * 100\n\n        cleaned_gcov_lines = coverage_file.cleaned_gcov_data.split(\"\\n\")\n        is_file_empty = (cleaned_gcov_lines.count <= 0)\n\n        template = generate_html_template(filename, false, is_file_empty)\n\n        builder = Nokogiri::HTML::Builder.with(template.at('#reports')) { |cov|\n          cov.h2(:class => \"cov_title\") {\n            cov.span(\"Coverage for \\\"#{filename}\\\"\" + (!is_file_empty ? \" : \" : \"\"))\n            cov.span(\"Lines: \") unless is_file_empty\n            cov.span(\"#{decimal_f(percentage)}%\", :class => class_for_coverage_percentage(percentage)) unless is_file_empty\n            cov.span(\" Branches: \") unless is_file_empty\n            cov.span(\"#{decimal_f(branch_percentage)}%\", :class => class_for_coverage_percentage(branch_percentage)) unless is_file_empty\n          }\n\n          cov.h4(\"(#{coverage_file.num_lines_tested} of #{coverage_file.num_lines_testable} relevant lines covered)\", :class => \"cov_subtitle\")\n          cov.h4(filepath, :class => \"cov_filepath\")\n\n          if is_file_empty\n            cov.p \"¯\\\\_(ツ)_/¯\"\n            next\n          end\n\n          line_number_separator = coverage_file.line_number_separator\n\n          cov.table(:class => \"source_code\") {\n            cleaned_gcov_lines.each do |line|\n              line_number = coverage_file.line_number_in_line(line)\n              missed_regions = coverage_file.branch_region_data[line_number]\n              hits = coverage_file.coverage_for_line(line)\n              next unless line_number > 0\n\n              line_source = line.split(line_number_separator, 3)[2]\n              line_data = [line_number, line_source, hits_for_coverage_line(coverage_file, line)]\n              classes = [\"num\", \"src\", \"coverage\"]\n\n              cov.tr(:class => class_for_coverage_line(coverage_file,line)) {\n                line_data.each_with_index { |line, idx|\n                  if idx != 1\n                    cov.td(line, :class => classes[idx])\n                  else\n                    cov.td(:class => classes[idx]) {\n                      cov.pre {\n                        # If the line has coverage and missed regions, split up\n                        # the line to show regions that weren't covered\n                        if missed_regions != nil && hits != nil && hits > 0\n                          regions = missed_regions.map do |region|\n                            region_start, region_length = region\n                            if region_length != nil\n                              line[region_start, region_length]\n                            else\n                              line[region_start, line.length - region_start]\n                            end\n                          end\n                          current_line = line\n                          regions.each do |region|\n                            covered, remainder = current_line.split(region, 2)\n                            cov.code(covered, :class => \"objc\")\n                            cov.code(region, :class => \"objc missed\")\n                            current_line = remainder\n                          end\n                          cov.code(current_line, :class => \"objc\")\n                        else\n                          cov.code(line, :class => \"objc\")\n                        end\n                      }\n                    }\n                  end\n                }\n              }\n            end\n          }\n        }\n\n        @docs[filename] = builder.doc\n      end\n\n      def generate_html_template(title, is_index, is_file_empty)\n        if cdn_assets\n          logo_path = \"https://cdn.jsdelivr.net/gh/SlatherOrg/slather/docs/logo.jpg\"\n          css_path = \"https://cdn.jsdelivr.net/gh/SlatherOrg/slather/assets/slather.css\"\n          highlight_js_path = \"https://cdn.jsdelivr.net/gh/SlatherOrg/slather/assets/highlight.pack.js\"\n          list_js_path = \"https://cdn.jsdelivr.net/gh/SlatherOrg/slather/assets/list.min.js\"\n        else\n          logo_path = \"logo.jpg\"\n          css_path = \"slather.css\"\n          highlight_js_path = \"highlight.pack.js\"\n          list_js_path = \"list.min.js\"\n        end\n\n        builder = Nokogiri::HTML::Builder.new do |doc|\n          doc.html {\n            doc.head {\n              doc.title \"#{title} - Slather\"\n              doc.link :href => css_path, :media => \"all\", :rel => \"stylesheet\"\n            }\n            doc.body {\n              doc.header {\n                doc.div(:class => \"row\") {\n                  doc.a(:href => \"index.html\") { doc.img(:src => logo_path, :alt => \"Slather logo\") }\n                }\n              }\n              doc.div(:class => \"row\") { doc.div(:id => \"reports\") }\n              doc.footer {\n                doc.div(:class => \"row\") {\n                  doc.p { doc.a(\"Fork me on Github\", :href => \"https://github.com/SlatherOrg/slather\") }\n                  doc.p(\"© #{Date.today.year} Slather\")\n                }\n              }\n\n              if is_index\n                doc.script :src => list_js_path\n                doc.script \"var reports = new List('reports', { valueNames: [ 'data_percentage', 'data_filename', 'data_lines', 'data_relevant', 'data_covered', 'data_missed' ]});\"\n              else\n                unless is_file_empty\n                  doc.script :src => highlight_js_path\n                  doc.script \"hljs.initHighlightingOnLoad();\"\n                end\n              end\n            }\n          }\n        end\n        builder.doc\n      end\n\n      def gem_root_path\n        File.expand_path File.join(File.dirname(__dir__), \"../..\")\n      end\n\n      def class_for_coverage_line(coverage_file, coverage_line)\n        hits = coverage_file.coverage_for_line(coverage_line)\n        case\n        when hits == nil then \"never\"\n        when hits > 0 then \"covered\"\n        else \"missed\"\n        end\n      end\n\n      def hits_for_coverage_line(coverage_file, coverage_line)\n        hits = coverage_file.coverage_for_line(coverage_line)\n        case\n        when hits == nil then \"\"\n        when hits > 0 then \"#{hits}x\"\n        else \"!\"\n        end\n      end\n\n      def class_for_coverage_percentage(percentage)\n        case\n        when percentage > 85 then \"cov_high\"\n        when percentage > 70 then \"cov_medium\"\n        else \"cov_low\"\n        end\n      end\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/json_output.rb",
    "content": "require 'nokogiri'\nrequire 'date'\n\nmodule Slather\n  module CoverageService\n    module JsonOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        report = coverage_files.map do |file|\n          {\n            file: file.source_file_pathname_relative_to_repo_root,\n            coverage: file.line_coverage_data\n          }\n        end.to_json\n\n        store_report(report)\n      end\n\n      def store_report(report)\n        output_file = 'report.json'\n        if output_directory\n          FileUtils.mkdir_p(output_directory)\n          output_file = File.join(output_directory, output_file)\n        end\n        File.write(output_file, report.to_s)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/llvm_cov_output.rb",
    "content": "require 'nokogiri'\nrequire 'date'\n\nmodule Slather\n  module CoverageService\n    module LlvmCovOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          raise StandardError, \"Only profdata input format supported by llvm-cov show.\"\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        report = coverage_files.map do |file|\n          [\"#{file.source_file_pathname.realpath}:\", file.source_data, \"\"]\n        end.flatten.join(\"\\n\")\n\n        store_report(report)\n      end\n\n      def store_report(report)\n        output_file = 'report.llcov'\n        if output_directory\n          FileUtils.mkdir_p(output_directory)\n          output_file = File.join(output_directory, output_file)\n        end\n        File.write(output_file, report.to_s)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/simple_output.rb",
    "content": "module Slather\n  module CoverageService\n    module SimpleOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        total_project_lines = 0\n        total_project_lines_tested = 0\n        coverage_files.each do |coverage_file|\n          # ignore lines that don't count towards coverage (comments, whitespace, etc). These are nil in the array.\n\n          lines_tested = coverage_file.num_lines_tested\n          total_lines = coverage_file.num_lines_testable\n          percentage = decimal_f([coverage_file.percentage_lines_tested])\n\n          total_project_lines_tested += lines_tested\n          total_project_lines += total_lines\n\n          puts \"#{coverage_file.source_file_pathname_relative_to_repo_root}: #{lines_tested} of #{total_lines} lines (#{percentage}%)\"\n        end\n\n        # check if there needs to be custom reporting based on the ci service\n        if ci_service == :teamcity\n          # TeamCity Build Statistic Reporting\n          #\n          # Reporting format ##teamcity[buildStatisticValue key='<valueTypeKey>' value='<value>']\n          # key='CodeCoverageAbsLCovered' is total number of lines covered\n          # key='CodeCoverageAbsLTotal' is total number of lines\n          #\n          # Sources:\n          # - https://confluence.jetbrains.com/display/TCDL/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ReportingBuildStatistics\n          # - https://confluence.jetbrains.com/display/TCDL/Custom+Chart#CustomChart-listOfDefaultStatisticValues\n          puts \"##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='%i']\" % total_project_lines_tested\n          puts \"##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='%i']\" % total_project_lines\n        end\n\n        total_percentage = decimal_f([(total_project_lines_tested / total_project_lines.to_f) * 100.0])\n        puts \"Tested #{total_project_lines_tested}/#{total_project_lines} statements\"\n        puts \"Test Coverage: #{total_percentage}%\"\n      end\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coverage_service/sonarqube_xml_output.rb",
    "content": "require 'nokogiri'\nrequire 'date'\n\nmodule Slather\n  module CoverageService\n    module SonarqubeXmlOutput\n\n      def coverage_file_class\n        if input_format == \"profdata\"\n          Slather::ProfdataCoverageFile\n        else\n          Slather::CoverageFile\n        end\n      end\n      private :coverage_file_class\n\n      def post\n        cobertura_xml_report = create_xml_report(coverage_files)\n        store_report(cobertura_xml_report)\n      end\n\n      def store_report(report)\n        output_file = 'sonarqube-generic-coverage.xml'\n        if output_directory\n          FileUtils.mkdir_p(output_directory)\n          output_file = File.join(output_directory, output_file)\n        end\n        File.write(output_file, report.to_s)\n      end\n\n      def create_xml_report(coverage_files)\n        create_empty_xml_report\n        coverage_node = @doc.root\n        coverage_node['version'] = \"1\"\n\n        coverage_files.each do |coverage_file|\n          file_node = Nokogiri::XML::Node.new \"file\", @doc\n          file_node.parent = coverage_node\n          file_node['path'] = coverage_file.source_file_pathname_relative_to_repo_root.to_s\n          coverage_file.all_lines.each do |line|\n            if coverage_file.coverage_for_line(line)\n              line_node = Nokogiri::XML::Node.new \"lineToCover\", @doc\n              line_node['lineNumber'] = coverage_file.line_number_in_line(line)\n              line_node['covered'] = coverage_file.coverage_for_line(line) == 0 ? \"false\" : \"true\"\n              line_node.parent = file_node\n            end\n          end\n        end\n        @doc.to_xml\n      end\n\n      def create_empty_xml_report\n        builder = Nokogiri::XML::Builder.new do |xml|\n          xml.coverage\n        end\n        @doc = builder.doc\n      end\n\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/coveralls_coverage.rb",
    "content": "module Slather\n  module CoverallsCoverage\n\n    def as_json\n      {\n        :name => source_file_pathname_relative_to_repo_root.to_s,\n        :source => source_data,\n        :coverage => line_coverage_data\n      }\n    end\n\n  end\nend\n"
  },
  {
    "path": "lib/slather/profdata_coverage_file.rb",
    "content": "require_relative 'coverage_info'\nrequire_relative 'coveralls_coverage'\nrequire 'digest/md5'\n\nmodule Slather\n  class ProfdataCoverageFile\n\n    include CoverageInfo\n    include CoverallsCoverage\n\n    attr_accessor :project, :source, :segments, :line_numbers_first, :line_data\n\n    def initialize(project, source, line_numbers_first)\n      self.project = project\n      self.source = source\n      self.line_numbers_first = line_numbers_first\n      create_line_data\n    end\n\n    def create_line_data\n      line_data = Hash.new\n      all_lines.each { |line| line_data[line_number_in_line(line, self.line_numbers_first)] = line }\n      self.line_data = line_data\n    end\n    private :create_line_data\n\n    def path_on_first_line?\n      !source.lstrip.start_with?(\"1|\")\n    end\n\n    def source_file_pathname\n      @source_file_pathname ||= begin\n        if path_on_first_line?\n          end_index = self.source.index(/:?\\n/)\n          if end_index != nil\n            end_index -= 1\n            path = self.source[0..end_index]\n          else\n            # Empty file, output just contains path\n            path = self.source.sub \":\", \"\"\n          end\n          path &&= Pathname(path)\n        else\n          # llvm-cov was run with just one matching source file\n          # It doesn't print the source path in this case, so we have to find it ourselves\n          # This is slow because we read every source file and compare it, but this should only happen if there aren't many source files\n          digest = Digest::MD5.digest(self.raw_source)\n          path = nil\n\n          project.find_source_files.each do |file|\n            file_digest = Digest::MD5.digest(File.read(file).strip)\n\n            if digest == file_digest\n              path = file\n            end\n          end\n\n          path\n        end\n      end\n    end\n\n    def source_file_pathname= (source_file_pathname)\n        @source_file_pathname = source_file_pathname\n    end\n\n    def source_file\n      File.new(source_file_pathname)\n    end\n\n    def source_code_lines\n      lines = self.source.split(\"\\n\")[(path_on_first_line? ? 1 : 0)..-1]\n      ignore_error_lines(lines)\n    end\n\n    def ignore_error_lines(lines, line_numbers_first = self.line_numbers_first)\n      if line_numbers_first\n        lines.reject { |line| line.lstrip.start_with?('|', '--') }\n      else\n        lines\n      end\n    end\n\n    def source_data\n      all_lines.join(\"\\n\")\n    end\n\n    def all_lines\n      @all_lines ||= source_code_lines\n    end\n\n    def raw_source\n      self.source.lines.map do |line|\n        line.split('|').last\n      end.join\n    end\n\n    def cleaned_gcov_data\n      source_data\n    end\n\n    def raw_data\n      self.source\n    end\n\n    def line_number_in_line(line, line_numbers_first = self.line_numbers_first)\n      if line_numbers_first\n        # Skip regex if the number is the first thing in the line\n        fastpath_number = line.to_i\n        return fastpath_number if fastpath_number != 0\n        line =~ /^(\\s*)(\\d*)/\n        group = $2\n      else\n        line =~ /^(\\s*)(\\d*)\\|(\\s*)(\\d+)\\|/\n        group = $4\n      end\n\n      if group != nil\n        match = group.strip\n        case match\n          when /[0-9]+/\n            return match.to_i\n        end\n      else\n        # llvm-cov outputs hit counts as 25.3k or 3.8M, so check this pattern as well\n        did_match = line =~ /^(\\s*)(\\d+\\.\\d+)(k|M)\\|(\\s*)(\\d+)\\|/\n\n        if did_match\n          match = $5.strip\n          case match\n            when /[0-9]+/\n              return match.to_i\n          end\n        end\n      end\n      0\n    end\n\n    def line_coverage_data\n      all_lines.map do |line|\n        coverage_for_line(line, self.line_numbers_first)\n      end\n    end\n\n    def coverage_for_line(line, line_numbers_first = self.line_numbers_first)\n      line = line.gsub(\":\", \"|\")\n\n      if line_numbers_first\n        line =~ /^(\\s*)(\\d*)\\|(\\s*)(\\d+)\\|/\n        group = $4\n      else\n        line =~ /^(\\s*)(\\d*)\\|/\n        group = $2\n      end\n\n      if group == nil\n        # Check for thousands or millions (llvm-cov outputs hit counts as 25.3k or 3.8M)\n        if line_numbers_first\n          did_match = line =~ /^(\\s*)(\\d+)\\|(\\s*)(\\d+\\.\\d+)(k|M)\\|/\n          group = $4\n          units_group = $5\n        else\n          did_match = line =~ /^(\\s*)(\\d+\\.\\d+)(k|M)\\|/\n          group = $2\n          units_group = $3\n        end\n\n        if did_match\n          count = group.strip\n          units = units_group == 'k' ? 1000 : 1000000\n\n          (count.to_f * units).to_i\n        else\n          return nil\n        end\n      else\n        match = group.strip\n        case match\n        when /[0-9]+/\n          match.to_i\n        when /#+/\n          0\n        when \"-\"\n          nil\n        end\n      end\n    end\n\n    def branch_coverage_data\n      @branch_coverage_data ||= begin\n        branch_coverage_data = Hash.new\n\n        self.segments.each do |segment|\n          line, col, hits, has_count, *rest = segment\n          next if !has_count\n          if branch_coverage_data.key?(line)\n            branch_coverage_data[line] = branch_coverage_data[line] + [hits]\n          else\n            branch_coverage_data[line] = [hits]\n          end\n        end\n\n        branch_coverage_data\n      end\n    end\n\n    def branch_region_data\n      @branch_region_data ||= begin\n        branch_region_data = Hash.new\n        region_start = nil\n        current_line = 0\n        @segments ||= []\n        @segments.each do |segment|\n          line, col, hits, has_count, *rest = segment\n          # Make column 0 based index\n          col = col - 1\n          if hits == 0 && has_count\n            current_line = line\n            region_start = col\n          elsif region_start != nil && hits > 0 && has_count\n            # if the region wrapped to a new line before ending, put nil to indicate it didnt end on this line\n            region_end = line == current_line ? col - region_start : nil\n            if branch_region_data.key?(current_line)\n              branch_region_data[current_line] << [region_start, region_end]\n            else\n              branch_region_data[current_line] = [[region_start, region_end]]\n            end\n            region_start = nil\n          end\n        end\n        branch_region_data\n      end\n    end\n\n    def source_file_basename\n      File.basename(source_file_pathname, '.swift')\n    end\n\n    def line_number_separator\n      \"|\"\n    end\n\n    def supported_file_extensions\n      [\"swift\"]\n    end\n    private :supported_file_extensions\n\n    def ignored?\n      path = source_file_pathname.to_s\n\n      # This indicates a llvm-cov coverage warning (occurs if a passed in source file\n      # is not covered or with cache in some cases).\n      return true if path.end_with?(\"isn't covered.\")\n      # Ignore source files inside of platform SDKs\n      return true if path.include?(\"/Xcode.*\\.app\\/Contents\\/Developer\\/Platforms\")\n\n      super\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/project.rb",
    "content": "require 'fileutils'\nrequire 'xcodeproj'\nrequire 'json'\nrequire 'yaml'\nrequire 'shellwords'\n\nmodule Xcodeproj\n\n  class Project\n\n    def slather_setup_for_coverage(format = :auto)\n      unless [:gcov, :clang, :auto].include?(format)\n        raise StandardError, \"Only supported formats for setup are gcov, clang or auto\"\n      end\n      if format == :auto\n        format = Slather.xcode_version[0] < 7 ? :gcov : :clang\n      end\n\n      build_configurations.each do |build_configuration|\n        if format == :clang\n          build_configuration.build_settings[\"CLANG_ENABLE_CODE_COVERAGE\"] = \"YES\"\n        else\n          build_configuration.build_settings[\"GCC_INSTRUMENT_PROGRAM_FLOW_ARCS\"] = \"YES\"\n          build_configuration.build_settings[\"GCC_GENERATE_TEST_COVERAGE_FILES\"] = \"YES\"\n        end\n      end\n\n      # Patch xcschemes too\n      if format == :clang\n        schemes_path = Xcodeproj::XCScheme.shared_data_dir(self.path)\n        Xcodeproj::Project.schemes(self.path).each do |scheme_name|\n          xcscheme_path = \"#{schemes_path + scheme_name}.xcscheme\"\n          xcscheme = Xcodeproj::XCScheme.new(xcscheme_path)\n          xcscheme.test_action.xml_element.attributes['codeCoverageEnabled'] = 'YES'\n          xcscheme.save_as(self.path, scheme_name)\n        end\n      end\n    end\n\n  end\nend\n\nmodule Slather\n  class Project < Xcodeproj::Project\n\n    attr_accessor :build_directory, :ignore_list, :ci_service, :coverage_service, :coverage_access_token, :source_directory,\n      :output_directory, :xcodeproj, :show_html, :cdn_assets, :verbose_mode, :input_format, :scheme, :workspace, :binary_file, :binary_basename, :arch, :source_files,\n      :decimals, :llvm_version, :configuration\n\n    alias_method :setup_for_coverage, :slather_setup_for_coverage\n\n    def self.open(xcodeproj)\n      proj = super\n      proj.xcodeproj = xcodeproj\n      proj\n    end\n\n    def failure_help_string\n      \"\\n\\tAre you sure your project is generating coverage? Make sure you enable code coverage in the Test section of your Xcode scheme.\\n\\tDid you specify your Xcode scheme? (--scheme or 'scheme' in .slather.yml)\\n\\tIf you're using a workspace, did you specify it? (--workspace or 'workspace' in .slather.yml)\\n\\tIf you use a different Xcode configuration, did you specify it? (--configuration or 'configuration' in .slather.yml)\"\n    end\n\n    def derived_data_path\n      # Get the derived data path from xcodebuild\n      # Use OBJROOT when possible, as it provides regardless of whether or not the Derived Data location is customized\n      if self.workspace\n        projectOrWorkspaceArgument = \"-workspace \\\"#{self.workspace}\\\"\"\n      else\n        projectOrWorkspaceArgument = \"-project \\\"#{self.path}\\\"\"\n      end\n\n      if self.scheme\n        schemeArgument = \"-scheme \\\"#{self.scheme}\\\"\"\n        buildAction = \"test\"\n      else\n        schemeArgument = nil\n        buildAction = nil\n      end\n\n      # redirect stderr to avoid xcodebuild errors being printed.\n      build_settings = `xcodebuild #{projectOrWorkspaceArgument} #{schemeArgument} -showBuildSettings #{buildAction} CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO 2>&1`\n\n      if build_settings\n        derived_data_path = build_settings.match(/ OBJROOT = (.+)/)\n        # when match fails derived_data_path is nil\n        derived_data_path = derived_data_path[1] if derived_data_path\n      end\n\n      if derived_data_path == nil\n        derived_data_path = File.expand_path('~') + \"/Library/Developer/Xcode/DerivedData/\"\n      end\n\n      derived_data_path\n    end\n    private :derived_data_path\n\n    def coverage_files\n      if self.input_format == \"profdata\"\n        profdata_coverage_files\n      else\n        gcov_coverage_files\n      end\n    end\n\n    def gcov_coverage_files\n      coverage_files = Dir[\"#{build_directory}/**/*.gcno\"].map do |file|\n        coverage_file = coverage_file_class.new(self, file)\n        # If there's no source file for this gcno, it probably belongs to another project.\n        coverage_file.source_file_pathname && !coverage_file.ignored? ? coverage_file : nil\n      end.compact\n\n      if coverage_files.empty?\n        raise StandardError, \"No coverage files found.\"\n      else\n        dedupe(coverage_files)\n      end\n    end\n    private :gcov_coverage_files\n\n    def profdata_coverage_files\n      coverage_files = []\n\n      if self.binary_file\n        self.binary_file.each do |binary_path|\n          pathnames_per_binary = pathnames_per_binary(binary_path)\n          coverage_files.concat(create_coverage_files_for_binary(binary_path, pathnames_per_binary))\n        end\n      end\n\n      if coverage_files.empty?\n        raise StandardError, \"No coverage files found.\"\n      else\n        dedupe(coverage_files)\n      end\n    end\n    private :profdata_coverage_files\n\n    def pathnames_per_binary(binary_path)\n      coverage_json_string = llvm_cov_export_output(binary_path)\n      if coverage_json_string.strip != \"\"\n        # JSON.parse will crash on an empty string, so just skip everything if the string is empty.\n        coverage_json = JSON.parse(coverage_json_string)\n        coverage_json[\"data\"].reduce([]) do |result, chunk|\n          result.concat(chunk[\"files\"].map do |file|\n            filename = file[\"filename\"]\n            path = Pathname(filename)\n            # Don't crash if the file doesn't exist on disk.\n            # This may happen for autogenerated files that have been deleted.\n            filename = path.exist? ? path.realpath : filename\n            {\"filename\" => filename, \"segments\" => file[\"segments\"]}\n          end)\n        end\n      end\n    end\n    private :pathnames_per_binary\n\n    def create_coverage_files_for_binary(binary_path, pathnames_per_binary)\n      return [] unless pathnames_per_binary != nil\n\n      coverage_files = []\n\n      begin\n        coverage_files.concat(create_coverage_files(binary_path, pathnames_per_binary))\n      rescue Errno::E2BIG => e\n        # pathnames_per_binary is too big for the OS to handle so it's split in two halfs which are processed independently\n        if pathnames_per_binary.count > 1\n          left, right = pathnames_per_binary.each_slice( (pathnames_per_binary.size/2.0).round ).to_a\n          coverage_files.concat(create_coverage_files_for_binary(binary_path, left))\n          coverage_files.concat(create_coverage_files_for_binary(binary_path, right))\n        else\n          # pathnames_per_binary contains one element which is too big for the OS to handle. \n          raise e, \"#{e}. A path in your project is close to the E2BIG limit. https://github.com/SlatherOrg/slather/pull/414\", e.backtrace\n        end\n      end\n\n      coverage_files\n    end\n    private :create_coverage_files_for_binary\n\n    def create_coverage_files(binary_path, path_objects)\n      line_numbers_first = Gem::Version.new(self.llvm_version) >= Gem::Version.new('8.1.0')\n      # get just file names from the path objects\n      pathnames = path_objects.map { |path_obj| path_obj[\"filename\"] }.compact\n      # Map of path name => segment array\n      paths_to_segments = path_objects.reduce(Hash.new) do |hash, path_obj|\n        hash[path_obj[\"filename\"]] = path_obj[\"segments\"]\n        hash\n      end\n      files = create_profdata(binary_path, pathnames)\n      files.map do |source|\n        coverage_file = coverage_file_class.new(self, source, line_numbers_first)\n        # If a single source file is used, the resulting output does not contain the file name.\n        coverage_file.source_file_pathname = pathnames.first if pathnames.count == 1\n        # if there is segment data for the given path, add it to the coverage_file\n        if paths_to_segments.key?(coverage_file.source_file_pathname)\n          coverage_file.segments = paths_to_segments[coverage_file.source_file_pathname]\n        end\n        coverage_file.source_file_pathname && !coverage_file.ignored? && coverage_file.include_file? ? coverage_file : nil\n      end.compact\n    end\n    private :create_coverage_files\n\n    def create_profdata(binary_path, pathnames)\n      profdata_llvm_cov_output(binary_path, pathnames).split(\"\\n\\n\")\n    end\n    private :create_profdata\n\n    def remove_extension(path)\n      path.split(\".\")[0..-2].join(\".\")\n    end\n\n    def first_product_name\n      first_product = self.products.first\n      # If name is not available it computes it using\n      # the path by dropping the 'extension' of the path.\n      first_product.name || remove_extension(first_product.path)\n    end\n\n    def profdata_coverage_dir\n      @profdata_coverage_dir ||= begin\n        raise StandardError, \"The specified build directory (#{self.build_directory}) does not exist\" unless File.exist?(self.build_directory)\n        dir = nil\n        if self.scheme\n          dir = Dir[File.join(build_directory,\"/**/CodeCoverage/#{self.scheme}\")].first\n        else\n          dir = Dir[File.join(build_directory,\"/**/#{first_product_name}\")].first\n        end\n\n        if dir == nil\n          # Xcode 7.3 moved the location of Coverage.profdata\n          dir = Dir[File.join(build_directory,\"/**/CodeCoverage\")].first\n        end\n\n        if dir == nil && Slather.xcode_version[0] >= 9\n          # Xcode 9 moved the location of Coverage.profdata\n          coverage_files = Dir[File.join(build_directory, \"/**/ProfileData/*/Coverage.profdata\")]\n\n          if coverage_files.count == 0\n            # Look up one directory\n            # The ProfileData directory is next to Intermediates.noindex (in previous versions of Xcode the coverage was inside Intermediates)\n            coverage_files = Dir[File.join(build_directory, \"../**/ProfileData/*/Coverage.profdata\")]\n          end\n\n          if coverage_files != nil && coverage_files.count != 0\n            dir = Pathname.new(coverage_files.first).parent()\n          end\n        end\n\n        raise StandardError, \"No coverage directory found.\" unless dir != nil\n        dir\n      end\n    end\n\n    def profdata_file\n      profdata_coverage_dir = self.profdata_coverage_dir\n      if profdata_coverage_dir == nil\n        raise StandardError, \"No coverage directory found. Please make sure the \\\"Code Coverage\\\" checkbox is enabled in your scheme's Test action or the build_directory property is set.\"\n      end\n\n      file =  Dir[\"#{profdata_coverage_dir}/**/Coverage.profdata\"].first\n      unless file != nil\n        return nil\n      end\n      return File.expand_path(file)\n    end\n    private :profdata_file\n\n    def unsafe_llvm_cov_export_output(binary_path)\n      profdata_file_arg = profdata_file\n      if profdata_file_arg == nil\n        raise StandardError, \"No Coverage.profdata files found. Please make sure the \\\"Code Coverage\\\" checkbox is enabled in your scheme's Test action or the build_directory property is set.\"\n      end\n\n      if binary_path == nil\n        raise StandardError, \"No binary file found.\"\n      end\n\n      llvm_cov_args = %W(export -instr-profile #{profdata_file_arg} #{binary_path})\n      if self.arch\n        llvm_cov_args << \"--arch\" << self.arch\n      end\n      `xcrun llvm-cov #{llvm_cov_args.shelljoin}`\n    end\n    private :unsafe_llvm_cov_export_output\n\n    def llvm_cov_export_output(binary_path)\n      output = unsafe_llvm_cov_export_output(binary_path)\n      output.valid_encoding? ? output : output.encode!('UTF-8', 'binary', :invalid => :replace, undef: :replace)\n    end\n    private :llvm_cov_export_output\n\n    def unsafe_profdata_llvm_cov_output(binary_path, source_files)\n      profdata_file_arg = profdata_file\n      if profdata_file_arg == nil\n        raise StandardError, \"No Coverage.profdata files found. Please make sure the \\\"Code Coverage\\\" checkbox is enabled in your scheme's Test action or the build_directory property is set.\"\n      end\n\n      if binary_path == nil\n        raise StandardError, \"No binary file found.\"\n      end\n\n      llvm_cov_args = %W(show -instr-profile #{profdata_file_arg} #{binary_path})\n      if self.arch\n        llvm_cov_args << \"--arch\" << self.arch\n      end\n\n      # POSIX systems have an ARG_MAX for the maximum total length of the command line, so the command may fail with an error message of \"Argument list too long\".\n      # Using the xargs command we can break the list of source_files into sublists small enough to be acceptable.\n      `printf '%s\\\\0' #{source_files.shelljoin} | xargs -0 xcrun llvm-cov #{llvm_cov_args.shelljoin}`\n    end\n    private :unsafe_profdata_llvm_cov_output\n\n    def profdata_llvm_cov_output(binary_path, source_files)\n      output = unsafe_profdata_llvm_cov_output(binary_path, source_files)\n      output.valid_encoding? ? output : output.encode!('UTF-8', 'binary', :invalid => :replace, undef: :replace)\n    end\n    private :profdata_llvm_cov_output\n\n    def dedupe(coverage_files)\n      coverage_files.group_by(&:source_file_pathname).values.map { |cf_array| cf_array.max_by(&:percentage_lines_tested) }\n    end\n    private :dedupe\n\n    @@ymlfile = '.slather.yml'\n\n    def self.yml_filename=(var)\n      @@ymlfile = var\n    end\n\n    def self.yml_filename\n      @@ymlfile\n    end\n\n    def self.yml\n      @yml ||= File.exist?(yml_filename) ? YAML.load_file(yml_filename) : {}\n    end\n\n    def configure\n      begin\n        configure_scheme\n        configure_configuration\n        configure_workspace\n        configure_build_directory\n        configure_ignore_list\n        configure_ci_service\n        configure_coverage_access_token\n        configure_coverage_service\n        configure_source_directory\n        configure_output_directory\n        configure_input_format\n        configure_arch\n        configure_binary_file\n        configure_decimals\n        configure_source_files\n\n        self.llvm_version = `xcrun llvm-cov --version`.match(/LLVM version ([\\d\\.]+)/).captures[0]\n      rescue => e\n        puts e.message\n        puts failure_help_string\n        puts \"\\n\"\n        raise\n      end\n\n      if self.verbose_mode\n        puts \"\\nProcessing coverage file: #{profdata_file}\"\n        if self.binary_file\n          puts \"Against binary files:\"\n          self.binary_file.each do |binary_file|\n            puts \"\\t#{binary_file}\"\n          end\n        else\n          puts \"No binary files found.\"\n        end\n        puts \"\\n\"\n      end\n    end\n\n    def configure_build_directory\n      self.build_directory ||= self.class.yml[\"build_directory\"] || derived_data_path\n    end\n\n    def configure_source_directory\n      self.source_directory ||= self.class.yml[\"source_directory\"] if self.class.yml[\"source_directory\"]\n    end\n\n    def configure_output_directory\n      self.output_directory ||= self.class.yml[\"output_directory\"] if self.class.yml[\"output_directory\"]\n    end\n\n    def configure_ignore_list\n      self.ignore_list ||= [(self.class.yml[\"ignore\"] || [])].flatten\n    end\n\n    def configure_source_files\n      self.source_files ||= [(self.class.yml[\"source_files\"] || [])].flatten\n    end\n\n    def configure_ci_service\n      self.ci_service ||= (ENV[\"CI_SERVICE\"] || self.class.yml[\"ci_service\"] || :other)\n    end\n\n    def configure_input_format\n      self.input_format ||= (self.class.yml[\"input_format\"] || \"auto\")\n    end\n\n    def input_format=(format)\n      format ||= \"auto\"\n      unless %w(gcov profdata auto).include?(format)\n        raise StandardError, \"Only supported input formats are gcov, profdata or auto\"\n      end\n      if format == \"auto\"\n        @input_format = Slather.xcode_version[0] < 7 ? \"gcov\" : \"profdata\"\n      else\n        @input_format = format\n      end\n    end\n\n    def configure_scheme\n      self.scheme ||= self.class.yml[\"scheme\"] if self.class.yml[\"scheme\"]\n    end\n\n    def configure_configuration\n      self.configuration ||= self.class.yml[\"configuration\"] if self.class.yml[\"configuration\"]\n    end\n\n    def configure_decimals\n      return if self.decimals\n      self.decimals ||= self.class.yml[\"decimals\"] if self.class.yml[\"decimals\"]\n      self.decimals = self.decimals ? Integer(self.decimals) : 2\n    end\n\n    def configure_workspace\n      self.workspace ||= self.class.yml[\"workspace\"] if self.class.yml[\"workspace\"]\n    end\n\n    def ci_service=(service)\n      @ci_service = service && service.to_sym\n    end\n\n    def configure_coverage_service\n      self.coverage_service ||= (self.class.yml[\"coverage_service\"] || :terminal)\n    end\n\n    def configure_coverage_access_token\n      self.coverage_access_token ||= (ENV[\"COVERAGE_ACCESS_TOKEN\"] || self.class.yml[\"coverage_access_token\"] || \"\")\n    end\n\n    def coverage_service=(service)\n      service = service && service.to_sym\n      case service\n      when :coveralls\n        extend(Slather::CoverageService::Coveralls)\n      when :hardcover\n        extend(Slather::CoverageService::Hardcover)\n      when :terminal\n        extend(Slather::CoverageService::SimpleOutput)\n      when :gutter_json\n        extend(Slather::CoverageService::GutterJsonOutput)\n      when :cobertura_xml\n        extend(Slather::CoverageService::CoberturaXmlOutput)\n      when :llvm_cov\n        extend(Slather::CoverageService::LlvmCovOutput)\n      when :html\n        extend(Slather::CoverageService::HtmlOutput)\n      when :json\n        extend(Slather::CoverageService::JsonOutput)\n      when :sonarqube_xml\n        extend(Slather::CoverageService::SonarqubeXmlOutput)\n      else\n        raise ArgumentError, \"`#{coverage_service}` is not a valid coverage service. Try `terminal`, `coveralls`, `gutter_json`, `cobertura_xml` or `html`\"\n      end\n      @coverage_service = service\n    end\n\n    def configure_binary_file\n      if self.input_format == \"profdata\"\n        self.binary_file = load_option_array(\"binary_file\") || find_binary_files\n      end\n    end\n\n    def configure_arch\n      self.arch ||= self.class.yml[\"arch\"] if self.class.yml[\"arch\"]\n    end\n\n    def decimal_f decimal_arg\n      configure_decimals unless decimals\n      decimal = \"%.#{decimals}f\" % decimal_arg\n      return decimal if decimals == 2 # special case 2 for backwards compatibility\n      decimal.to_f.to_s\n    end\n\n    def find_binary_file_in_bundle(bundle_file)\n      if File.directory? bundle_file\n        bundle_file_noext = File.basename(bundle_file, File.extname(bundle_file))\n\n        # Search for .debug.dylib binaries\n        # See https://developer.apple.com/documentation/xcode/build-settings-reference#Enable-Debug-Dylib-Support for details\n        debug_dylib_matches = Dir[\"#{bundle_file}/**/#{bundle_file_noext}.debug.dylib\"]\n\n        if debug_dylib_matches.length() > 0\n          debug_dylib_matches.first\n        else\n          Dir[\"#{bundle_file}/**/#{bundle_file_noext}\"].first\n        end\n      else\n        bundle_file\n      end\n    end\n\n    def find_binary_files\n      binary_basename = load_option_array(\"binary_basename\")\n      found_binaries = []\n\n      # Get scheme info out of the xcodeproj\n      if self.scheme\n        schemes_path = Xcodeproj::XCScheme.shared_data_dir(self.path)\n        xcscheme_path = \"#{schemes_path + self.scheme}.xcscheme\"\n\n        # Try to look inside 'xcuserdata' if the scheme is not found in 'xcshareddata'\n        if !File.file?(xcscheme_path)\n          schemes_path = Xcodeproj::XCScheme.user_data_dir(self.path)\n          xcscheme_path = \"#{schemes_path + self.scheme}.xcscheme\"\n        end\n\n        if self.workspace and !File.file?(xcscheme_path)\n          # No scheme was found in the xcodeproj, check the workspace\n          schemes_path = Xcodeproj::XCScheme.shared_data_dir(self.workspace)\n          xcscheme_path = \"#{schemes_path + self.scheme}.xcscheme\"\n\n          if !File.file?(xcscheme_path)\n            schemes_path = Xcodeproj::XCScheme.user_data_dir(self.workspace)\n            xcscheme_path = \"#{schemes_path + self.scheme}.xcscheme\"\n          end\n        end\n\n        raise StandardError, \"No scheme named '#{self.scheme}' found in #{self.path}\" unless File.exist? xcscheme_path\n\n        xcscheme = Xcodeproj::XCScheme.new(xcscheme_path)\n\n        if self.configuration\n          configuration = self.configuration\n        else\n          configuration = xcscheme.test_action.build_configuration\n        end\n\n        search_list = binary_basename || find_buildable_names(xcscheme)\n        search_dir = profdata_coverage_dir\n\n        if Slather.xcode_version[0] >= 9\n          # Go from the directory containing Coverage.profdata back to the directory containing Products (back out of ProfileData/UUID-dir)\n          search_dir = File.join(search_dir, '../..')\n        end\n\n        search_list.each do |search_for|\n          found_product = Dir[\"#{search_dir}/Products/#{configuration}*/#{search_for}*\"].sort { |x, y|\n            # Sort the matches without the file extension to ensure better matches when there are multiple candidates\n            # For example, if the binary_basename is Test then we want Test.app to be matched before Test Helper.app\n            File.basename(x, File.extname(x)) <=> File.basename(y, File.extname(y))\n          }.find { |path|\n            next if path.end_with? \".dSYM\"\n            next if path.end_with? \".swiftmodule\"\n\n            if File.directory? path\n              path = find_binary_file_in_bundle(path)\n              next if path.nil?\n            end\n\n            matches_arch(path)\n          }\n\n          if found_product and File.directory? found_product\n            found_binary = find_binary_file_in_bundle(found_product)\n          else\n            found_binary = found_product\n          end\n\n          if found_binary\n            found_binaries.push(found_binary)\n          end\n        end\n      else\n        xctest_bundle = Dir[\"#{profdata_coverage_dir}/**/*.xctest\"].reject { |bundle|\n            # Ignore xctest bundles that are in the UI runner app\n            bundle.include? \"-Runner.app/PlugIns/\"\n        }.first\n\n        # Find the matching binary file\n        search_list = binary_basename || ['*']\n\n        search_list.each do |search_for|\n          xctest_bundle_file_directory = Pathname.new(xctest_bundle).dirname\n          app_bundle = Dir[\"#{xctest_bundle_file_directory}/#{search_for}.app\"].first\n          matched_xctest_bundle = Dir[\"#{xctest_bundle_file_directory}/#{search_for}.xctest\"].first\n          dynamic_lib_bundle = Dir[\"#{xctest_bundle_file_directory}/#{search_for}.{framework,dylib}\"].first\n\n          if app_bundle != nil\n            found_binary = find_binary_file_in_bundle(app_bundle)\n          elsif matched_xctest_bundle != nil\n            found_binary = find_binary_file_in_bundle(matched_xctest_bundle)\n          elsif dynamic_lib_bundle != nil\n            found_binary = find_binary_file_in_bundle(dynamic_lib_bundle)\n          else\n            found_binary = find_binary_file_in_bundle(xctest_bundle)\n          end\n\n          if found_binary\n            found_binaries.push(found_binary)\n          end\n        end\n      end\n\n      raise StandardError, \"No product binary found in #{profdata_coverage_dir}.\" unless found_binaries.count > 0\n\n      found_binaries.map { |binary| File.expand_path(binary) }\n    end\n\n    def find_buildable_names(xcscheme)\n      found_buildable_names = []\n\n      # enumerate code coverage targets\n      begin\n        code_coverage_targets = xcscheme.test_action.xml_element.elements['CodeCoverageTargets']\n        targets = code_coverage_targets.map do |node|\n          Xcodeproj::XCScheme::BuildableReference.new(node) if node.is_a?(REXML::Element)\n        end.compact\n        buildable_names = targets.each do |target|\n          found_buildable_names.push(target.buildable_name)\n        end\n      rescue\n        # just in case if there are no entries in the test action\n      end\n\n      # enumerate build action entries\n      begin\n        xcscheme.build_action.entries.each do |entry|\n          buildable_name = entry.buildable_references[0].buildable_name\n\n          if !buildable_name.end_with? \".a\"\n            # Can't run code coverage on static libraries\n            found_buildable_names.push(buildable_name)\n          end\n        end\n      rescue\n        # xcodeproj will raise an exception if there are no entries in the build action\n      end\n\n      # enumerate test action entries\n      begin\n        xcscheme.test_action.testables.each do |entry|\n          buildable_name = entry.buildable_references[0].buildable_name\n          found_buildable_names.push(buildable_name)\n        end\n      rescue\n        # just in case if there are no entries in the test action\n      end\n\n      # some items are both buildable and testable, so return only unique ones\n      found_buildable_names.uniq\n    end\n\n    def matches_arch(binary_path)\n      if self.arch\n        lipo_output = `lipo -info \"#{binary_path}\"`\n        archs_in_binary = lipo_output.split(':').last.split(' ')\n        archs_in_binary.include? self.arch\n      else\n        true\n      end\n    end\n\n    def find_source_files\n      source_files = load_option_array(\"source_files\")\n      return [] if source_files.nil?\n\n      current_dir = Pathname(\"./\").realpath\n      paths = source_files.flat_map { |pattern| Dir.glob(pattern) }.uniq\n\n      paths.map do |path|\n        source_file_absolute_path = Pathname(path).realpath\n        source_file_relative_path = source_file_absolute_path.relative_path_from(current_dir)\n        self.ignore_list.any? { |ignore| File.fnmatch(ignore, source_file_relative_path) } ? nil : source_file_absolute_path\n      end.compact\n    end\n\n    def load_option_array(option)\n      value = self.send(option.to_sym)\n      # Only load if a value is not already set\n      if !value\n        value_yml = self.class.yml[option]\n        # Need to check the type in the config file because it can be a string or array\n        if value_yml and value_yml.is_a? Array\n          value = value_yml\n        elsif value_yml\n          value = [value_yml]\n        end\n      end\n      value\n    end\n  end\nend\n"
  },
  {
    "path": "lib/slather/version.rb",
    "content": "module Slather\n  VERSION = '2.8.5' unless defined?(Slather::VERSION)\nend\n"
  },
  {
    "path": "lib/slather.rb",
    "content": "require_relative 'slather/version'\nrequire_relative 'slather/project'\nrequire_relative 'slather/coverage_info'\nrequire_relative 'slather/coverage_file'\nrequire_relative 'slather/coveralls_coverage'\nrequire_relative 'slather/profdata_coverage_file'\nrequire_relative 'slather/coverage_service/cobertura_xml_output'\nrequire_relative 'slather/coverage_service/coveralls'\nrequire_relative 'slather/coverage_service/hardcover'\nrequire_relative 'slather/coverage_service/gutter_json_output'\nrequire_relative 'slather/coverage_service/simple_output'\nrequire_relative 'slather/coverage_service/html_output'\nrequire_relative 'slather/coverage_service/json_output'\nrequire_relative 'slather/coverage_service/llvm_cov_output'\nrequire_relative 'slather/coverage_service/sonarqube_xml_output'\nrequire 'cfpropertylist'\n\nmodule Slather\n\n  Encoding.default_external = \"utf-8\"\n\n  def self.prepare_pods(pods)\n    Pod::UI.warn(\"[Slather] prepare_pods is now deprecated. The call to prepare_pods in your Podfile can simply be ommitted.\")\n  end\n\n  def self.xcode_version\n    xcode_path = `xcode-select -p`.strip\n    plist = CFPropertyList::List.new(:file => File.join(xcode_path, '..', 'Info.plist'))\n    xcode_version = CFPropertyList.native_types(plist.value)[\"CFBundleShortVersionString\"]\n    xcode_version.split('.').map(&:to_i)\n  end\n\nend\n"
  },
  {
    "path": "slather.gemspec",
    "content": "# encoding: utf-8\nlib = File.expand_path('../lib', __FILE__)\n$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)\nrequire 'slather/version'\n\nGem::Specification.new do |spec|\n  spec.name          = 'slather'\n  spec.version       = Slather::VERSION\n  spec.authors       = ['Mark Larsen']\n  spec.email         = ['mark@venmo.com']\n  spec.summary       = %q{Test coverage reports for Xcode projects}\n  spec.homepage      = 'https://github.com/SlatherOrg/slather'\n  spec.license       = 'MIT'\n\n  spec.files         = `git ls-files -z`.force_encoding('utf-8').split(\"\\x0\")\n  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }\n  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})\n  spec.require_paths = ['lib']\n\n  spec.add_development_dependency 'bundler', '~> 2.0'\n  spec.add_development_dependency 'coveralls', '~> 0.8'\n  spec.add_development_dependency 'simplecov', '~> 0'\n  spec.add_development_dependency 'rake', '~> 12.3'\n  spec.add_development_dependency 'rspec', '~> 3.8'\n  spec.add_development_dependency 'pry', '~> 0.12'\n  spec.add_development_dependency 'cocoapods', '~> 1.10.beta.1'\n  spec.add_development_dependency 'json_spec', '~> 1.1'\n  spec.add_development_dependency 'equivalent-xml', '~> 0.6'\n\n  spec.add_dependency 'clamp', '~> 1.3'\n  spec.add_dependency 'xcodeproj', '~> 1.27'\n  spec.add_dependency 'nokogiri', '>= 1.14.3'\n  spec.add_dependency 'CFPropertyList', '>= 2.2', '< 4'\n\n  spec.add_runtime_dependency 'activesupport'\nend\n"
  },
  {
    "path": "spec/fixtures/FixtureFramework/FixtureFramework.h",
    "content": "//\n//  FixtureFramework.h\n//  FixtureFramework\n//\n//  Created by Stephen Williams on 11/03/21.\n//  Copyright © 2021 marklarr. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n//! Project version number for FixtureFramework.\nFOUNDATION_EXPORT double FixtureFrameworkVersionNumber;\n\n//! Project version string for FixtureFramework.\nFOUNDATION_EXPORT const unsigned char FixtureFrameworkVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <FixtureFramework/PublicHeader.h>\n\n\n"
  },
  {
    "path": "spec/fixtures/FixtureFramework/FlashExperiment.swift",
    "content": "import Foundation\n\npublic struct FlashExperiment {\n    public let isAwesome = true\n    \n    public init() {}\n}\n"
  },
  {
    "path": "spec/fixtures/FixtureFramework/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2021 marklarr. All rights reserved.</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "spec/fixtures/FixtureFrameworkTests/FixtureFrameworkTests.swift",
    "content": "//\n//  FixtureFrameworkTests.swift\n//  FixtureFrameworkTests\n//\n//  Created by Stephen Williams on 11/03/21.\n//  Copyright © 2021 marklarr. All rights reserved.\n//\n\nimport XCTest\n@testable import FixtureFramework\n\nclass FixtureFrameworkTests: XCTestCase {\n\n    override func setUpWithError() throws {\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n\n    override func tearDownWithError() throws {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n    }\n\n    func testExample() throws {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n\n    func testPerformanceExample() throws {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n\n}\n"
  },
  {
    "path": "spec/fixtures/FixtureFrameworkTests/FlashExperimentTests.swift",
    "content": "import XCTest\nimport FixtureFramework\n\nclass FlashExperimentTests: XCTestCase {\n    func testExample() throws {\n        let sut = FlashExperiment()\n        XCTAssertTrue(sut.isAwesome, \"Your flash experiment isn't awesome!\")\n    }\n}\n"
  },
  {
    "path": "spec/fixtures/FixtureFrameworkTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "spec/fixtures/fixtures/Fixtures.swift",
    "content": "\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n        return true\n    }\n\n    func applicationWillResignActive(application: UIApplication) {\n    }\n}"
  },
  {
    "path": "spec/fixtures/fixtures/Supporting Files/fixtures-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures.h",
    "content": "//\n//  fixtures.h\n//  fixtures\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface fixtures : NSObject\n\n- (void)testedMethod;\n- (void)untestedMethod;\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures.m",
    "content": "//\n//  fixtures.m\n//  fixtures\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr 🌟. All rights reserved.\n//\n\n#import \"fixtures.h\"\n\n@implementation fixtures\n\n- (void)testedMethod\n{\n    NSLog(@\"tested\");\n}\n\n- (void)untestedMethod\n{\n    NSLog(@\"untested\");\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_cpp.cpp",
    "content": "//\n//  fixtures_cpp.cpp\n//  fixtures\n//\n//  Created by Larsen, Mark on 4/3/15.\n//  Copyright (c) 2015 marklarr. All rights reserved.\n//\n\n#include \"fixtures_cpp.h\"\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_cpp.h",
    "content": "#ifndef __fixtures__fixtures_cpp__\n#define __fixtures__fixtures_cpp__\n\n#include <stdio.h>\n\n#endif /* defined(__fixtures__fixtures_cpp__) */\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_m.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface fixtures_m : NSObject\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_m.m",
    "content": "#import \"fixtures_m.h\"\n\n@implementation fixtures_m\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_mm.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface fixtures_mm : NSObject\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/fixtures_mm.mm",
    "content": "#import \"fixtures_mm.h\"\n\n@implementation fixtures_mm\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/Branches.h",
    "content": "//\n//  Branches.h\n//  fixtures\n//\n//  Created by Julian Krumow on 11.10.14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Branches : NSObject\n\n- (void)branches:(BOOL)goIf skipBranches:(BOOL)skipBranches;\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/Branches.m",
    "content": "//\n//  Branches.m\n//  fixtures\n//\n//  Created by Julian Krumow on 11.10.14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import \"Branches.h\"\n\n@implementation Branches\n\n- (void)branches:(BOOL)goIf skipBranches:(BOOL)skipBranches\n{\n    if (goIf) {\n        NSLog(@\"foo.\");\n        \n        if (!skipBranches) {\n            NSLog(@\"not skipped.\");\n        }\n    } else {\n        NSLog(@\"bar.\");\n    }\n    \n    int i = 5;\n    if (i == 5) {\n        return;\n    }\n    switch (i) {\n        case 0:\n            NSLog(@\"0\");\n            break;\n            \n        case 1:\n            NSLog(@\"1\");\n            break;\n        case 5:\n            NSLog(@\"5\");\n            break;\n        default:\n            break;\n    }\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/Empty.h",
    "content": "//\n//  Empty.h\n//  fixtures\n//\n//  Created by Julian Krumow on 27.10.14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface Empty : NSObject\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/Empty.m",
    "content": "//\n//  Empty.m\n//  fixtures\n//\n//  Created by Julian Krumow on 27.10.14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import \"Empty.h\"\n\n@implementation Empty\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/peekaview.h",
    "content": "//\n//  peekaview.h\n//  fixtures\n//\n//  Created by Mark Larsen on 6/25/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <AppKit/AppKit.h>\n\n@interface peekaview : NSView\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/more_files/peekaview.m",
    "content": "//\n//  peekaview.m\n//  fixtures\n//\n//  Created by Mark Larsen on 6/25/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import \"peekaview.h\"\n\n@implementation peekaview\n\n- (id)initWithFrame:(CGRect)frame\n{\n    self = [super initWithFrame:frame];\n    if (self) {\n        // Initialization code\n    }\n    return self;\n}\n\n/*\n// Only override drawRect: if you perform custom drawing.\n// An empty implementation adversely affects performance during animation.\n- (void)drawRect:(CGRect)rect\n{\n    // Drawing code\n}\n*/\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures/other_fixtures.m",
    "content": "//\n//  other_fixtures.m\n//  fixtures\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import \"other_fixtures.h\"\n\n@implementation other_fixtures\n\n- (void)testedMethod\n{\n    NSLog(@\"tested\");\n}\n\n- (void)untestedMethod\n{\n    NSLog(@\"untested\");\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t155BBCA519E9CB6700BACB13 /* Branches.h in Headers */ = {isa = PBXBuildFile; fileRef = 155BBCA319E9CB6700BACB13 /* Branches.h */; };\n\t\t155BBCA619E9CB6700BACB13 /* Branches.m in Sources */ = {isa = PBXBuildFile; fileRef = 155BBCA419E9CB6700BACB13 /* Branches.m */; };\n\t\t155BBCA819E9CCC500BACB13 /* BranchesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 155BBCA719E9CCC500BACB13 /* BranchesTests.m */; };\n\t\t155D8AFE19FED984004666BA /* Empty.h in Headers */ = {isa = PBXBuildFile; fileRef = 155D8AFC19FED984004666BA /* Empty.h */; };\n\t\t155D8AFF19FED984004666BA /* Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = 155D8AFD19FED984004666BA /* Empty.m */; };\n\t\t3773307C1CC42A58005EAF65 /* fixturesTwo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3773307B1CC42A58005EAF65 /* fixturesTwo.h */; };\n\t\t3773307E1CC42A58005EAF65 /* fixturesTwo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3773307D1CC42A58005EAF65 /* fixturesTwo.m */; };\n\t\t377330821CC42ABF005EAF65 /* libfixturesTwo.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 377330791CC42A58005EAF65 /* libfixturesTwo.dylib */; };\n\t\t8554482F1E461FAF0032518E /* fixturesTestsSecond.m in Sources */ = {isa = PBXBuildFile; fileRef = 8554482E1E461FAF0032518E /* fixturesTestsSecond.m */; };\n\t\t85AE69041E45F0F900DA2D47 /* libfixtures.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9A202D195965F10013B6B3 /* libfixtures.a */; };\n\t\t85AE69051E45F0F900DA2D47 /* libfixturesTwo.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 377330791CC42A58005EAF65 /* libfixturesTwo.dylib */; };\n\t\t85AE69061E45F0F900DA2D47 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9A2030195965F10013B6B3 /* Cocoa.framework */; };\n\t\t85AE69081E45F0F900DA2D47 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8C9A204A195965F10013B6B3 /* InfoPlist.strings */; };\n\t\t8C0F0B401ACF43A300793B7D /* fixtures_m.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C0F0B3E1ACF43A300793B7D /* fixtures_m.h */; };\n\t\t8C0F0B411ACF43A300793B7D /* fixtures_m.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0F0B3F1ACF43A300793B7D /* fixtures_m.m */; };\n\t\t8C0F0B441ACF44E000793B7D /* fixtures_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C0F0B421ACF44E000793B7D /* fixtures_cpp.cpp */; };\n\t\t8C0F0B451ACF44E000793B7D /* fixtures_cpp.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C0F0B431ACF44E000793B7D /* fixtures_cpp.h */; };\n\t\t8C0F0B481ACF44F200793B7D /* fixtures_mm.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C0F0B461ACF44F200793B7D /* fixtures_mm.h */; };\n\t\t8C0F0B491ACF44F200793B7D /* fixtures_mm.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8C0F0B471ACF44F200793B7D /* fixtures_mm.mm */; };\n\t\t8C52AEF7195AAE32008A882A /* peekaview.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C52AEF5195AAE32008A882A /* peekaview.h */; };\n\t\t8C52AEF8195AAE33008A882A /* peekaview.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C52AEF6195AAE32008A882A /* peekaview.m */; };\n\t\t8C52AEFA195AAE70008A882A /* peekaviewTests💣.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C52AEF9195AAE70008A882A /* peekaviewTests💣.m */; };\n\t\t8C9A2031195965F10013B6B3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9A2030195965F10013B6B3 /* Cocoa.framework */; };\n\t\t8C9A203B195965F10013B6B3 /* fixtures.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9A203A195965F10013B6B3 /* fixtures.m */; };\n\t\t8C9A2043195965F10013B6B3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9A2030195965F10013B6B3 /* Cocoa.framework */; };\n\t\t8C9A2046195965F10013B6B3 /* libfixtures.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9A202D195965F10013B6B3 /* libfixtures.a */; };\n\t\t8C9A204C195965F10013B6B3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8C9A204A195965F10013B6B3 /* InfoPlist.strings */; };\n\t\t8C9A204E195965F10013B6B3 /* fixturesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9A204D195965F10013B6B3 /* fixturesTests.m */; };\n\t\tB1E6981225F96B680086A3E2 /* FixtureFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E6980425F96B670086A3E2 /* FixtureFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tB1E6982025F96B930086A3E2 /* FlashExperiment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E6981F25F96B930086A3E2 /* FlashExperiment.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t85AE68FE1E45F0F900DA2D47 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8C9A2025195965F00013B6B3 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8C9A202C195965F10013B6B3;\n\t\t\tremoteInfo = fixtures;\n\t\t};\n\t\t8C9A2044195965F10013B6B3 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8C9A2025195965F00013B6B3 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8C9A202C195965F10013B6B3;\n\t\t\tremoteInfo = fixtures;\n\t\t};\n\t\tB1E6982F25F96F490086A3E2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8C9A2025195965F00013B6B3 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B1E6980125F96B670086A3E2;\n\t\t\tremoteInfo = FixtureFramework;\n\t\t};\n\t\tB1E6983725F970320086A3E2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8C9A2025195965F00013B6B3 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B1E6980125F96B670086A3E2;\n\t\t\tremoteInfo = FixtureFramework;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t155BBCA319E9CB6700BACB13 /* Branches.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Branches.h; sourceTree = \"<group>\"; };\n\t\t155BBCA419E9CB6700BACB13 /* Branches.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Branches.m; sourceTree = \"<group>\"; };\n\t\t155BBCA719E9CCC500BACB13 /* BranchesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BranchesTests.m; sourceTree = \"<group>\"; };\n\t\t155D8AFC19FED984004666BA /* Empty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Empty.h; sourceTree = \"<group>\"; };\n\t\t155D8AFD19FED984004666BA /* Empty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Empty.m; sourceTree = \"<group>\"; };\n\t\t377330791CC42A58005EAF65 /* libfixturesTwo.dylib */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.dylib\"; includeInIndex = 0; path = libfixturesTwo.dylib; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3773307B1CC42A58005EAF65 /* fixturesTwo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fixturesTwo.h; sourceTree = \"<group>\"; };\n\t\t3773307D1CC42A58005EAF65 /* fixturesTwo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = fixturesTwo.m; sourceTree = \"<group>\"; };\n\t\t8554482E1E461FAF0032518E /* fixturesTestsSecond.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = fixturesTestsSecond.m; sourceTree = \"<group>\"; };\n\t\t85AE690C1E45F0F900DA2D47 /* fixturesTestsSecond.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = fixturesTestsSecond.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8C0F0B3E1ACF43A300793B7D /* fixtures_m.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixtures_m.h; sourceTree = \"<group>\"; };\n\t\t8C0F0B3F1ACF43A300793B7D /* fixtures_m.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = fixtures_m.m; sourceTree = \"<group>\"; };\n\t\t8C0F0B421ACF44E000793B7D /* fixtures_cpp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fixtures_cpp.cpp; sourceTree = \"<group>\"; };\n\t\t8C0F0B431ACF44E000793B7D /* fixtures_cpp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixtures_cpp.h; sourceTree = \"<group>\"; };\n\t\t8C0F0B461ACF44F200793B7D /* fixtures_mm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixtures_mm.h; sourceTree = \"<group>\"; };\n\t\t8C0F0B471ACF44F200793B7D /* fixtures_mm.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = fixtures_mm.mm; sourceTree = \"<group>\"; };\n\t\t8C52AEF5195AAE32008A882A /* peekaview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peekaview.h; sourceTree = \"<group>\"; };\n\t\t8C52AEF6195AAE32008A882A /* peekaview.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = peekaview.m; sourceTree = \"<group>\"; };\n\t\t8C52AEF9195AAE70008A882A /* peekaviewTests💣.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"peekaviewTests💣.m\"; sourceTree = \"<group>\"; };\n\t\t8C9A202D195965F10013B6B3 /* libfixtures.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfixtures.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8C9A2030195965F10013B6B3 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\t8C9A2033195965F10013B6B3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t8C9A2034195965F10013B6B3 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\t8C9A2035195965F10013B6B3 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\t8C9A2038195965F10013B6B3 /* fixtures-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"fixtures-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t8C9A2039195965F10013B6B3 /* fixtures.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fixtures.h; sourceTree = \"<group>\"; };\n\t\t8C9A203A195965F10013B6B3 /* fixtures.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = fixtures.m; sourceTree = \"<group>\"; };\n\t\t8C9A2040195965F10013B6B3 /* fixturesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = fixturesTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8C9A2049195965F10013B6B3 /* fixturesTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"fixturesTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t8C9A204B195965F10013B6B3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t8C9A204D195965F10013B6B3 /* fixturesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = fixturesTests.m; sourceTree = \"<group>\"; };\n\t\tB1E6980225F96B670086A3E2 /* FixtureFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FixtureFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB1E6980425F96B670086A3E2 /* FixtureFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FixtureFramework.h; sourceTree = \"<group>\"; };\n\t\tB1E6980525F96B670086A3E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB1E6980F25F96B680086A3E2 /* FixtureFrameworkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixtureFrameworkTests.swift; sourceTree = \"<group>\"; };\n\t\tB1E6981125F96B680086A3E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB1E6981F25F96B930086A3E2 /* FlashExperiment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlashExperiment.swift; sourceTree = \"<group>\"; };\n\t\tB1E6982725F96BD30086A3E2 /* FlashExperimentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlashExperimentTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t377330761CC42A58005EAF65 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t85AE69031E45F0F900DA2D47 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t85AE69041E45F0F900DA2D47 /* libfixtures.a in Frameworks */,\n\t\t\t\t85AE69051E45F0F900DA2D47 /* libfixturesTwo.dylib in Frameworks */,\n\t\t\t\t85AE69061E45F0F900DA2D47 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A202A195965F10013B6B3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C9A2031195965F10013B6B3 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A203D195965F10013B6B3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C9A2046195965F10013B6B3 /* libfixtures.a in Frameworks */,\n\t\t\t\t377330821CC42ABF005EAF65 /* libfixturesTwo.dylib in Frameworks */,\n\t\t\t\t8C9A2043195965F10013B6B3 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1E697FF25F96B670086A3E2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t3773307A1CC42A58005EAF65 /* fixturesTwo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3773307B1CC42A58005EAF65 /* fixturesTwo.h */,\n\t\t\t\t3773307D1CC42A58005EAF65 /* fixturesTwo.m */,\n\t\t\t);\n\t\t\tpath = fixturesTwo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C52AEF4195AAE16008A882A /* more_files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C52AEF5195AAE32008A882A /* peekaview.h */,\n\t\t\t\t8C52AEF6195AAE32008A882A /* peekaview.m */,\n\t\t\t\t155BBCA319E9CB6700BACB13 /* Branches.h */,\n\t\t\t\t155BBCA419E9CB6700BACB13 /* Branches.m */,\n\t\t\t\t155D8AFC19FED984004666BA /* Empty.h */,\n\t\t\t\t155D8AFD19FED984004666BA /* Empty.m */,\n\t\t\t);\n\t\t\tpath = more_files;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2024195965F00013B6B3 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A2036195965F10013B6B3 /* fixtures */,\n\t\t\t\t3773307A1CC42A58005EAF65 /* fixturesTwo */,\n\t\t\t\t8C9A2047195965F10013B6B3 /* fixturesTests */,\n\t\t\t\tB1E6980325F96B670086A3E2 /* FixtureFramework */,\n\t\t\t\tB1E6980E25F96B670086A3E2 /* FixtureFrameworkTests */,\n\t\t\t\t8C9A202F195965F10013B6B3 /* Frameworks */,\n\t\t\t\t8C9A202E195965F10013B6B3 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A202E195965F10013B6B3 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A202D195965F10013B6B3 /* libfixtures.a */,\n\t\t\t\t8C9A2040195965F10013B6B3 /* fixturesTests.xctest */,\n\t\t\t\t377330791CC42A58005EAF65 /* libfixturesTwo.dylib */,\n\t\t\t\t85AE690C1E45F0F900DA2D47 /* fixturesTestsSecond.xctest */,\n\t\t\t\tB1E6980225F96B670086A3E2 /* FixtureFramework.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A202F195965F10013B6B3 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A2030195965F10013B6B3 /* Cocoa.framework */,\n\t\t\t\t8C9A2032195965F10013B6B3 /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2032195965F10013B6B3 /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A2033195965F10013B6B3 /* Foundation.framework */,\n\t\t\t\t8C9A2034195965F10013B6B3 /* CoreData.framework */,\n\t\t\t\t8C9A2035195965F10013B6B3 /* AppKit.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2036195965F10013B6B3 /* fixtures */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C52AEF4195AAE16008A882A /* more_files */,\n\t\t\t\t8C9A2039195965F10013B6B3 /* fixtures.h */,\n\t\t\t\t8C9A203A195965F10013B6B3 /* fixtures.m */,\n\t\t\t\t8C0F0B3E1ACF43A300793B7D /* fixtures_m.h */,\n\t\t\t\t8C0F0B3F1ACF43A300793B7D /* fixtures_m.m */,\n\t\t\t\t8C9A2037195965F10013B6B3 /* Supporting Files */,\n\t\t\t\t8C0F0B421ACF44E000793B7D /* fixtures_cpp.cpp */,\n\t\t\t\t8C0F0B431ACF44E000793B7D /* fixtures_cpp.h */,\n\t\t\t\t8C0F0B461ACF44F200793B7D /* fixtures_mm.h */,\n\t\t\t\t8C0F0B471ACF44F200793B7D /* fixtures_mm.mm */,\n\t\t\t);\n\t\t\tpath = fixtures;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2037195965F10013B6B3 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A2038195965F10013B6B3 /* fixtures-Prefix.pch */,\n\t\t\t);\n\t\t\tpath = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2047195965F10013B6B3 /* fixturesTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A204D195965F10013B6B3 /* fixturesTests.m */,\n\t\t\t\t8554482E1E461FAF0032518E /* fixturesTestsSecond.m */,\n\t\t\t\t8C9A2048195965F10013B6B3 /* Supporting Files */,\n\t\t\t\t8C52AEF9195AAE70008A882A /* peekaviewTests💣.m */,\n\t\t\t\t155BBCA719E9CCC500BACB13 /* BranchesTests.m */,\n\t\t\t);\n\t\t\tpath = fixturesTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8C9A2048195965F10013B6B3 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A2049195965F10013B6B3 /* fixturesTests-Info.plist */,\n\t\t\t\t8C9A204A195965F10013B6B3 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tpath = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1E6980325F96B670086A3E2 /* FixtureFramework */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1E6980425F96B670086A3E2 /* FixtureFramework.h */,\n\t\t\t\tB1E6980525F96B670086A3E2 /* Info.plist */,\n\t\t\t\tB1E6981F25F96B930086A3E2 /* FlashExperiment.swift */,\n\t\t\t);\n\t\t\tpath = FixtureFramework;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1E6980E25F96B670086A3E2 /* FixtureFrameworkTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1E6980F25F96B680086A3E2 /* FixtureFrameworkTests.swift */,\n\t\t\t\tB1E6981125F96B680086A3E2 /* Info.plist */,\n\t\t\t\tB1E6982725F96BD30086A3E2 /* FlashExperimentTests.swift */,\n\t\t\t);\n\t\t\tpath = FixtureFrameworkTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t377330771CC42A58005EAF65 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3773307C1CC42A58005EAF65 /* fixturesTwo.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A202B195965F10013B6B3 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C0F0B481ACF44F200793B7D /* fixtures_mm.h in Headers */,\n\t\t\t\t8C0F0B401ACF43A300793B7D /* fixtures_m.h in Headers */,\n\t\t\t\t155D8AFE19FED984004666BA /* Empty.h in Headers */,\n\t\t\t\t155BBCA519E9CB6700BACB13 /* Branches.h in Headers */,\n\t\t\t\t8C0F0B451ACF44E000793B7D /* fixtures_cpp.h in Headers */,\n\t\t\t\t8C52AEF7195AAE32008A882A /* peekaview.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1E697FD25F96B670086A3E2 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB1E6981225F96B680086A3E2 /* FixtureFramework.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t377330781CC42A58005EAF65 /* fixturesTwo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3773307F1CC42A58005EAF65 /* Build configuration list for PBXNativeTarget \"fixturesTwo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t377330751CC42A58005EAF65 /* Sources */,\n\t\t\t\t377330761CC42A58005EAF65 /* Frameworks */,\n\t\t\t\t377330771CC42A58005EAF65 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = fixturesTwo;\n\t\t\tproductName = fixturesTwo;\n\t\t\tproductReference = 377330791CC42A58005EAF65 /* libfixturesTwo.dylib */;\n\t\t\tproductType = \"com.apple.product-type.library.dynamic\";\n\t\t};\n\t\t85AE68FC1E45F0F900DA2D47 /* fixturesTestsSecond */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 85AE69091E45F0F900DA2D47 /* Build configuration list for PBXNativeTarget \"fixturesTestsSecond\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t85AE68FF1E45F0F900DA2D47 /* Sources */,\n\t\t\t\t85AE69031E45F0F900DA2D47 /* Frameworks */,\n\t\t\t\t85AE69071E45F0F900DA2D47 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t85AE68FD1E45F0F900DA2D47 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = fixturesTestsSecond;\n\t\t\tproductName = fixturesTests;\n\t\t\tproductReference = 85AE690C1E45F0F900DA2D47 /* fixturesTestsSecond.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t8C9A202C195965F10013B6B3 /* fixtures */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8C9A2051195965F10013B6B3 /* Build configuration list for PBXNativeTarget \"fixtures\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8C9A2029195965F10013B6B3 /* Sources */,\n\t\t\t\t8C9A202A195965F10013B6B3 /* Frameworks */,\n\t\t\t\t8C9A202B195965F10013B6B3 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tB1E6983025F96F490086A3E2 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = fixtures;\n\t\t\tproductName = fixtures;\n\t\t\tproductReference = 8C9A202D195965F10013B6B3 /* libfixtures.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t8C9A203F195965F10013B6B3 /* fixturesTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8C9A2054195965F10013B6B3 /* Build configuration list for PBXNativeTarget \"fixturesTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8C9A203C195965F10013B6B3 /* Sources */,\n\t\t\t\t8C9A203D195965F10013B6B3 /* Frameworks */,\n\t\t\t\t8C9A203E195965F10013B6B3 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tB1E6983825F970320086A3E2 /* PBXTargetDependency */,\n\t\t\t\t8C9A2045195965F10013B6B3 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = fixturesTests;\n\t\t\tproductName = fixturesTests;\n\t\t\tproductReference = 8C9A2040195965F10013B6B3 /* fixturesTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tB1E6980125F96B670086A3E2 /* FixtureFramework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B1E6981725F96B680086A3E2 /* Build configuration list for PBXNativeTarget \"FixtureFramework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB1E697FD25F96B670086A3E2 /* Headers */,\n\t\t\t\tB1E697FE25F96B670086A3E2 /* Sources */,\n\t\t\t\tB1E697FF25F96B670086A3E2 /* Frameworks */,\n\t\t\t\tB1E6980025F96B670086A3E2 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FixtureFramework;\n\t\t\tproductName = FixtureFramework;\n\t\t\tproductReference = B1E6980225F96B670086A3E2 /* FixtureFramework.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t8C9A2025195965F00013B6B3 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1240;\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t\tORGANIZATIONNAME = marklarr;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t377330781CC42A58005EAF65 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t};\n\t\t\t\t\tB1E6980125F96B670086A3E2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.4;\n\t\t\t\t\t\tLastSwiftMigration = 1240;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 8C9A2028195965F00013B6B3 /* Build configuration list for PBXProject \"fixtures\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 8C9A2024195965F00013B6B3;\n\t\t\tproductRefGroup = 8C9A202E195965F10013B6B3 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8C9A202C195965F10013B6B3 /* fixtures */,\n\t\t\t\t377330781CC42A58005EAF65 /* fixturesTwo */,\n\t\t\t\t8C9A203F195965F10013B6B3 /* fixturesTests */,\n\t\t\t\t85AE68FC1E45F0F900DA2D47 /* fixturesTestsSecond */,\n\t\t\t\tB1E6980125F96B670086A3E2 /* FixtureFramework */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t85AE69071E45F0F900DA2D47 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t85AE69081E45F0F900DA2D47 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A203E195965F10013B6B3 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C9A204C195965F10013B6B3 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1E6980025F96B670086A3E2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t377330751CC42A58005EAF65 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3773307E1CC42A58005EAF65 /* fixturesTwo.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t85AE68FF1E45F0F900DA2D47 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8554482F1E461FAF0032518E /* fixturesTestsSecond.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A2029195965F10013B6B3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C9A203B195965F10013B6B3 /* fixtures.m in Sources */,\n\t\t\t\t155D8AFF19FED984004666BA /* Empty.m in Sources */,\n\t\t\t\t8C0F0B411ACF43A300793B7D /* fixtures_m.m in Sources */,\n\t\t\t\t8C0F0B441ACF44E000793B7D /* fixtures_cpp.cpp in Sources */,\n\t\t\t\t155BBCA619E9CB6700BACB13 /* Branches.m in Sources */,\n\t\t\t\t8C0F0B491ACF44F200793B7D /* fixtures_mm.mm in Sources */,\n\t\t\t\t8C52AEF8195AAE33008A882A /* peekaview.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C9A203C195965F10013B6B3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8C9A204E195965F10013B6B3 /* fixturesTests.m in Sources */,\n\t\t\t\t8C52AEFA195AAE70008A882A /* peekaviewTests💣.m in Sources */,\n\t\t\t\t155BBCA819E9CCC500BACB13 /* BranchesTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1E697FE25F96B670086A3E2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB1E6982025F96B930086A3E2 /* FlashExperiment.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t85AE68FD1E45F0F900DA2D47 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8C9A202C195965F10013B6B3 /* fixtures */;\n\t\t\ttargetProxy = 85AE68FE1E45F0F900DA2D47 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8C9A2045195965F10013B6B3 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8C9A202C195965F10013B6B3 /* fixtures */;\n\t\t\ttargetProxy = 8C9A2044195965F10013B6B3 /* PBXContainerItemProxy */;\n\t\t};\n\t\tB1E6983025F96F490086A3E2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = B1E6980125F96B670086A3E2 /* FixtureFramework */;\n\t\t\ttargetProxy = B1E6982F25F96F490086A3E2 /* PBXContainerItemProxy */;\n\t\t};\n\t\tB1E6983825F970320086A3E2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = B1E6980125F96B670086A3E2 /* FixtureFramework */;\n\t\t\ttargetProxy = B1E6983725F970320086A3E2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t8C9A204A195965F10013B6B3 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t8C9A204B195965F10013B6B3 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t377330801CC42A58005EAF65 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t377330811CC42A58005EAF65 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t85AE690A1E45F0F900DA2D47 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t85AE690B1E45F0F900DA2D47 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8C9A204F195965F10013B6B3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_GENERATE_TEST_COVERAGE_FILES = YES;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8C9A2050195965F10013B6B3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_GENERATE_TEST_COVERAGE_FILES = YES;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8C9A2052195965F10013B6B3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_GENERATE_TEST_COVERAGE_FILES = YES;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8C9A2053195965F10013B6B3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_GENERATE_TEST_COVERAGE_FILES = YES;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8C9A2055195965F10013B6B3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"fixturesTests/Supporting Files/fixturesTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8C9A2056195965F10013B6B3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"fixtures/Supporting Files/fixtures-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"fixturesTests/Supporting Files/fixturesTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tB1E6981325F96B680086A3E2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = FixtureFramework/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.onato.FixtureFramework;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB1E6981425F96B680086A3E2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = FixtureFramework/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.onato.FixtureFramework;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3773307F1CC42A58005EAF65 /* Build configuration list for PBXNativeTarget \"fixturesTwo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t377330801CC42A58005EAF65 /* Debug */,\n\t\t\t\t377330811CC42A58005EAF65 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t85AE69091E45F0F900DA2D47 /* Build configuration list for PBXNativeTarget \"fixturesTestsSecond\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t85AE690A1E45F0F900DA2D47 /* Debug */,\n\t\t\t\t85AE690B1E45F0F900DA2D47 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8C9A2028195965F00013B6B3 /* Build configuration list for PBXProject \"fixtures\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8C9A204F195965F10013B6B3 /* Debug */,\n\t\t\t\t8C9A2050195965F10013B6B3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8C9A2051195965F10013B6B3 /* Build configuration list for PBXNativeTarget \"fixtures\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8C9A2052195965F10013B6B3 /* Debug */,\n\t\t\t\t8C9A2053195965F10013B6B3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8C9A2054195965F10013B6B3 /* Build configuration list for PBXNativeTarget \"fixturesTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8C9A2055195965F10013B6B3 /* Debug */,\n\t\t\t\t8C9A2056195965F10013B6B3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB1E6981725F96B680086A3E2 /* Build configuration list for PBXNativeTarget \"FixtureFramework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB1E6981325F96B680086A3E2 /* Debug */,\n\t\t\t\tB1E6981425F96B680086A3E2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 8C9A2025195965F00013B6B3 /* Project object */;\n}\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:fixtures.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/aggregateFixturesTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n               BuildableName = \"fixturesTestsSecond.xctest\"\n               BlueprintName = \"fixturesTestsSecond\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n               BuildableName = \"fixturesTestsSecond.xctest\"\n               BlueprintName = \"fixturesTestsSecond\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A203F195965F10013B6B3\"\n               BuildableName = \"fixturesTests.xctest\"\n               BlueprintName = \"fixturesTests\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/fixtures.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0600\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n               BuildableName = \"libfixtures.a\"\n               BlueprintName = \"fixtures\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\"\n      onlyGenerateCoverageForSpecifiedTargets = \"YES\">\n      <CodeCoverageTargets>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B1E6980125F96B670086A3E2\"\n            BuildableName = \"FixtureFramework.framework\"\n            BlueprintName = \"FixtureFramework\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </CodeCoverageTargets>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A203F195965F10013B6B3\"\n               BuildableName = \"fixturesTests.xctest\"\n               BlueprintName = \"fixturesTests\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n            BuildableName = \"libfixtures.a\"\n            BlueprintName = \"fixtures\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n            BuildableName = \"libfixtures.a\"\n            BlueprintName = \"fixtures\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/fixturesTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0600\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A203F195965F10013B6B3\"\n               BuildableName = \"fixturesTests.xctest\"\n               BlueprintName = \"fixturesTests\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/fixturesTestsSecond.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0600\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n               BuildableName = \"fixturesTestsSecond.xctest\"\n               BlueprintName = \"fixturesTestsSecond\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n               BuildableName = \"fixturesTestsSecond.xctest\"\n               BlueprintName = \"fixturesTestsSecond\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"85AE68FC1E45F0F900DA2D47\"\n            BuildableName = \"fixturesTestsSecond.xctest\"\n            BlueprintName = \"fixturesTestsSecond\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/fixturesTwo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"377330781CC42A58005EAF65\"\n               BuildableName = \"libfixturesTwo.dylib\"\n               BlueprintName = \"fixturesTwo\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"377330781CC42A58005EAF65\"\n            BuildableName = \"libfixturesTwo.dylib\"\n            BlueprintName = \"fixturesTwo\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"377330781CC42A58005EAF65\"\n            BuildableName = \"libfixturesTwo.dylib\"\n            BlueprintName = \"fixturesTwo\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:fixtures.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "spec/fixtures/fixtures.xcworkspace/xcshareddata/xcschemes/fixturesTestsWorkspace.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n               BuildableName = \"libfixtures.a\"\n               BlueprintName = \"fixtures\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8C9A203F195965F10013B6B3\"\n               BuildableName = \"fixturesTests.xctest\"\n               BlueprintName = \"fixturesTests\"\n               ReferencedContainer = \"container:fixtures.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n            BuildableName = \"libfixtures.a\"\n            BlueprintName = \"fixtures\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n            BuildableName = \"libfixtures.a\"\n            BlueprintName = \"fixtures\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8C9A202C195965F10013B6B3\"\n            BuildableName = \"libfixtures.a\"\n            BlueprintName = \"fixtures\"\n            ReferencedContainer = \"container:fixtures.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/BranchesTests.m",
    "content": "//\n//  BranchesTests.m\n//  fixtures\n//\n//  Created by Julian Krumow on 11.10.14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n#import \"Branches.h\"\n\n@interface BranchesTests : XCTestCase\n\n@end\n\n@implementation BranchesTests\n\n- (void)setUp {\n    [super setUp];\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n}\n\n- (void)tearDown {\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    [super tearDown];\n}\n\n- (void)testBranchesNoBranches {\n    Branches *branches = [[Branches alloc] init];\n    [branches branches:NO skipBranches:NO];\n}\n\n- (void)testBranchesFirstBranchAndSkip {\n    Branches *branches = [[Branches alloc] init];\n    [branches branches:YES skipBranches:YES];\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/Supporting Files/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/Supporting Files/fixturesTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>marklarr.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/fixturesTests.m",
    "content": "//\n//  fixturesTests.m\n//  fixturesTests\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n#import \"fixtures.h\"\n#import \"fixturesTwo.h\"\n\n@interface fixturesTests : XCTestCase\n\n@end\n\n@implementation fixturesTests\n\n- (void)setUp\n{\n    [super setUp];\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n}\n\n- (void)tearDown\n{\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    [super tearDown];\n}\n\n- (void)testExample\n{\n    fixtures *f = [[fixtures alloc] init];\n    [f testedMethod];\n}\n\n- (void)testFixturesTwo\n{\n    fixturesTwo *f2 = [[fixturesTwo alloc] init];\n\n    XCTAssertEqual([f2 doSomething], 11);\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/fixturesTestsSecond.m",
    "content": "//\n//  fixturesTestsSecond.m\n//  fixturesTests\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n\n@interface fixturesTestsSecond : XCTestCase\n\n@end\n\n@implementation fixturesTestsSecond\n\n- (void)testExample\n{\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixturesTests/peekaviewTests💣.m",
    "content": "//\n//  peekaviewTests💣.m\n//  fixtures\n//\n//  Created by Mark Larsen on 6/25/14.\n//  Copyright (c) 2014 marklarr. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n\n@interface peekaviewTests : XCTestCase\n\n@end\n\n@implementation peekaviewTests\n\n- (void)setUp\n{\n    [super setUp];\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n}\n\n- (void)tearDown\n{\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    [super tearDown];\n}\n\n- (void)testExample\n{\n    XCTAssert(YES, @\"woot\");\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixturesTwo/fixturesTwo.h",
    "content": "//\n//  fixturesTwo.h\n//  fixturesTwo\n//\n//  Created by Kent Sutherland on 4/17/16.\n//  Copyright © 2016 marklarr. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface fixturesTwo : NSObject\n\n- (NSInteger)doSomething;\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixturesTwo/fixturesTwo.m",
    "content": "//\n//  fixturesTwo.m\n//  fixturesTwo\n//\n//  Created by Kent Sutherland on 4/17/16.\n//  Copyright © 2016 marklarr. All rights reserved.\n//\n\n#import \"fixturesTwo.h\"\n\n@implementation fixturesTwo\n\n- (NSInteger)doSomething\n{\n    NSInteger a = 5;\n    NSInteger b = 6;\n\n    return a + b;\n}\n\n@end\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/Branches.m.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>Branches.m - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2 class=\"cov_title\">\n<span>Coverage for \"Branches.m\" : </span><span class=\"cov_low\">43.33%</span>\n</h2>\n<h4 class=\"cov_subtitle\">(13 of 30 relevant lines covered)</h4>\n<h4 class=\"cov_filepath\">spec/fixtures/fixtures/more_files/Branches.m</h4>\n<table class=\"source_code\">\n<tr class=\"never\">\n<td class=\"num\">1</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">2</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Branches.m</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">3</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixtures</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">4</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">5</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Created by Julian Krumow on 11.10.14.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">6</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Copyright (c) 2014 marklarr. All rights reserved.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">7</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">8</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">9</td>\n<td class=\"src\"><pre><code class=\"objc\">#import \"Branches.h\"</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">10</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">11</td>\n<td class=\"src\"><pre><code class=\"objc\">@implementation Branches</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">12</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">13</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)branches:(BOOL)goIf skipBranches:(BOOL)skipBranches</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">14</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">15</td>\n<td class=\"src\"><pre><code class=\"objc\">    if (goIf) {</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">16</td>\n<td class=\"src\"><pre><code class=\"objc\">        NSLog(@\"foo.\");</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">17</td>\n<td class=\"src\"><pre><code class=\"objc\">        </code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">18</td>\n<td class=\"src\"><pre><code class=\"objc\">        if (!skipBranches) {</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">19</td>\n<td class=\"src\"><pre><code class=\"objc\">            NSLog(@\"not skipped.\");</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">20</td>\n<td class=\"src\"><pre><code class=\"objc\">        }</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">21</td>\n<td class=\"src\"><pre><code class=\"objc\">    } else {</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">22</td>\n<td class=\"src\"><pre><code class=\"objc\">        NSLog(@\"bar.\");</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">23</td>\n<td class=\"src\"><pre><code class=\"objc\">    }</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">24</td>\n<td class=\"src\"><pre><code class=\"objc\">    </code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">25</td>\n<td class=\"src\"><pre><code class=\"objc\">    int i = 5;</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">26</td>\n<td class=\"src\"><pre><code class=\"objc\">    if (i == 5) {</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">27</td>\n<td class=\"src\"><pre><code class=\"objc\">        return;</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">28</td>\n<td class=\"src\"><pre><code class=\"objc\">    }</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">29</td>\n<td class=\"src\"><pre><code class=\"objc\">    switch (i) {</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">30</td>\n<td class=\"src\"><pre><code class=\"objc\">        case 0:</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">31</td>\n<td class=\"src\"><pre><code class=\"objc\">            NSLog(@\"0\");</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">32</td>\n<td class=\"src\"><pre><code class=\"objc\">            break;</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">33</td>\n<td class=\"src\"><pre><code class=\"objc\">            </code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">34</td>\n<td class=\"src\"><pre><code class=\"objc\">        case 1:</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">35</td>\n<td class=\"src\"><pre><code class=\"objc\">            NSLog(@\"1\");</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">36</td>\n<td class=\"src\"><pre><code class=\"objc\">            break;</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">37</td>\n<td class=\"src\"><pre><code class=\"objc\">        case 5:</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">38</td>\n<td class=\"src\"><pre><code class=\"objc\">            NSLog(@\"5\");</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">39</td>\n<td class=\"src\"><pre><code class=\"objc\">            break;</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">40</td>\n<td class=\"src\"><pre><code class=\"objc\">        default:</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">41</td>\n<td class=\"src\"><pre><code class=\"objc\">            break;</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">42</td>\n<td class=\"src\"><pre><code class=\"objc\">    }</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">43</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">44</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">45</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"highlight.pack.js\"></script><script>hljs.initHighlightingOnLoad();</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/BranchesTests.m.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>BranchesTests.m - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2 class=\"cov_title\">\n<span>Coverage for \"BranchesTests.m\" : </span><span class=\"cov_high\">100.00%</span>\n</h2>\n<h4 class=\"cov_subtitle\">(16 of 16 relevant lines covered)</h4>\n<h4 class=\"cov_filepath\">spec/fixtures/fixturesTests/BranchesTests.m</h4>\n<table class=\"source_code\">\n<tr class=\"never\">\n<td class=\"num\">1</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">2</td>\n<td class=\"src\"><pre><code class=\"objc\">//  BranchesTests.m</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">3</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixtures</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">4</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">5</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Created by Julian Krumow on 11.10.14.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">6</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Copyright (c) 2014 marklarr. All rights reserved.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">7</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">8</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">9</td>\n<td class=\"src\"><pre><code class=\"objc\">#import &lt;XCTest/XCTest.h&gt;</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">10</td>\n<td class=\"src\"><pre><code class=\"objc\">#import \"Branches.h\"</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">11</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">12</td>\n<td class=\"src\"><pre><code class=\"objc\">@interface BranchesTests : XCTestCase</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">13</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">14</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">15</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">16</td>\n<td class=\"src\"><pre><code class=\"objc\">@implementation BranchesTests</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">17</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">18</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)setUp {</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">19</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super setUp];</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">20</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put setup code here. This method is called before the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">21</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">22</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">23</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)tearDown {</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">24</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put teardown code here. This method is called after the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">25</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super tearDown];</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">26</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">27</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">28</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testBranchesNoBranches {</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">29</td>\n<td class=\"src\"><pre><code class=\"objc\">    Branches *branches = [[Branches alloc] init];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">30</td>\n<td class=\"src\"><pre><code class=\"objc\">    [branches branches:NO skipBranches:NO];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">31</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">32</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">33</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testBranchesFirstBranchAndSkip {</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">34</td>\n<td class=\"src\"><pre><code class=\"objc\">    Branches *branches = [[Branches alloc] init];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">35</td>\n<td class=\"src\"><pre><code class=\"objc\">    [branches branches:YES skipBranches:YES];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">36</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">37</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">38</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"highlight.pack.js\"></script><script>hljs.initHighlightingOnLoad();</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/fixtures.m.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>fixtures.m - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2 class=\"cov_title\">\n<span>Coverage for \"fixtures.m\" : </span><span class=\"cov_low\">50.00%</span>\n</h2>\n<h4 class=\"cov_subtitle\">(3 of 6 relevant lines covered)</h4>\n<h4 class=\"cov_filepath\">spec/fixtures/fixtures/fixtures.m</h4>\n<table class=\"source_code\">\n<tr class=\"never\">\n<td class=\"num\">1</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">2</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixtures.m</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">3</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixtures</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">4</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">5</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Created by Mark Larsen on 6/24/14.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">6</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Copyright (c) 2014 marklarr &#127775;. All rights reserved.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">7</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">8</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">9</td>\n<td class=\"src\"><pre><code class=\"objc\">#import \"fixtures.h\"</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">10</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">11</td>\n<td class=\"src\"><pre><code class=\"objc\">@implementation fixtures</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">12</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">13</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testedMethod</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">14</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">15</td>\n<td class=\"src\"><pre><code class=\"objc\">    NSLog(@\"tested\");</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">16</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">17</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">18</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)untestedMethod</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">19</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">20</td>\n<td class=\"src\"><pre><code class=\"objc\">    NSLog(@\"untested\");</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"missed\">\n<td class=\"num\">21</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">!</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">22</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">23</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"highlight.pack.js\"></script><script>hljs.initHighlightingOnLoad();</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/fixturesTests.m.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>fixturesTests.m - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2 class=\"cov_title\">\n<span>Coverage for \"fixturesTests.m\" : </span><span class=\"cov_high\">100.00%</span>\n</h2>\n<h4 class=\"cov_subtitle\">(17 of 17 relevant lines covered)</h4>\n<h4 class=\"cov_filepath\">spec/fixtures/fixturesTests/fixturesTests.m</h4>\n<table class=\"source_code\">\n<tr class=\"never\">\n<td class=\"num\">1</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">2</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixturesTests.m</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">3</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixturesTests</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">4</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">5</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Created by Mark Larsen on 6/24/14.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">6</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Copyright (c) 2014 marklarr. All rights reserved.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">7</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">8</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">9</td>\n<td class=\"src\"><pre><code class=\"objc\">#import &lt;XCTest/XCTest.h&gt;</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">10</td>\n<td class=\"src\"><pre><code class=\"objc\">#import \"fixtures.h\"</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">11</td>\n<td class=\"src\"><pre><code class=\"objc\">#import \"fixturesTwo.h\"</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">12</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">13</td>\n<td class=\"src\"><pre><code class=\"objc\">@interface fixturesTests : XCTestCase</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">14</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">15</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">16</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">17</td>\n<td class=\"src\"><pre><code class=\"objc\">@implementation fixturesTests</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">18</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">19</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)setUp</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">20</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">21</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super setUp];</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">22</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put setup code here. This method is called before the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">23</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">24</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">25</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)tearDown</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">26</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">27</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put teardown code here. This method is called after the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">28</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super tearDown];</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">29</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">2x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">30</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">31</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testExample</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">32</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">33</td>\n<td class=\"src\"><pre><code class=\"objc\">    fixtures *f = [[fixtures alloc] init];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">34</td>\n<td class=\"src\"><pre><code class=\"objc\">    [f testedMethod];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">35</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">36</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">37</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testFixturesTwo</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">38</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">39</td>\n<td class=\"src\"><pre><code class=\"objc\">    fixturesTwo *f2 = [[fixturesTwo alloc] init];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">40</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">41</td>\n<td class=\"src\"><pre><code class=\"objc\">    XCTAssertEqual([f2 doSomething], 11);</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">42</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">43</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">44</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"highlight.pack.js\"></script><script>hljs.initHighlightingOnLoad();</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/index.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>fixtures.xcodeproj - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2>Files for \"fixtures.xcodeproj\"</h2>\n<h4>\n<span>Total Coverage : </span><span class=\"cov_medium\" id=\"total_coverage\">75.00%</span>\n</h4>\n<input class=\"search\" placeholder=\"Search\"><table class=\"coverage_list\" cellspacing=\"0\" cellpadding=\"0\">\n<thead><tr>\n<th class=\"col_num sort\" data-sort=\"data_percentage\">%</th>\n<th class=\"sort\" data-sort=\"data_filename\">File</th>\n<th class=\"col_percent sort\" data-sort=\"data_lines\">Lines</th>\n<th class=\"col_percent sort\" data-sort=\"data_relevant\">Relevant</th>\n<th class=\"col_percent sort\" data-sort=\"data_covered\">Covered</th>\n<th class=\"col_percent sort\" data-sort=\"data_missed\">Missed</th>\n</tr></thead>\n<tbody class=\"list\">\n<tr>\n<td><span class=\"percentage cov_low data_percentage\">50.00</span></td>\n<td class=\"data_filename\"><a href=\"fixtures.m.html\">fixtures.m</a></td>\n<td class=\"data_lines\">23</td>\n<td class=\"data_relevant\">6</td>\n<td class=\"data_covered\">3</td>\n<td class=\"data_missed\">3</td>\n</tr>\n<tr>\n<td><span class=\"percentage cov_low data_percentage\">43.33</span></td>\n<td class=\"data_filename\"><a href=\"Branches.m.html\">Branches.m</a></td>\n<td class=\"data_lines\">45</td>\n<td class=\"data_relevant\">30</td>\n<td class=\"data_covered\">13</td>\n<td class=\"data_missed\">17</td>\n</tr>\n<tr>\n<td><span class=\"percentage cov_high data_percentage\">100.00</span></td>\n<td class=\"data_filename\"><a href=\"BranchesTests.m.html\">BranchesTests.m</a></td>\n<td class=\"data_lines\">38</td>\n<td class=\"data_relevant\">16</td>\n<td class=\"data_covered\">16</td>\n<td class=\"data_missed\">0</td>\n</tr>\n<tr>\n<td><span class=\"percentage cov_high data_percentage\">100.00</span></td>\n<td class=\"data_filename\"><a href=\"fixturesTests.m.html\">fixturesTests.m</a></td>\n<td class=\"data_lines\">44</td>\n<td class=\"data_relevant\">17</td>\n<td class=\"data_covered\">17</td>\n<td class=\"data_missed\">0</td>\n</tr>\n<tr>\n<td><span class=\"percentage cov_high data_percentage\">100.00</span></td>\n<td class=\"data_filename\"><a href=\"peekaviewTests&#x1f4a3;.m.html\">peekaviewTests&#x1f4a3;.m</a></td>\n<td class=\"data_lines\">34</td>\n<td class=\"data_relevant\">11</td>\n<td class=\"data_covered\">11</td>\n<td class=\"data_missed\">0</td>\n</tr>\n</tbody>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"list.min.js\"></script><script>var reports = new List('reports', { valueNames: [ 'data_percentage', 'data_filename', 'data_lines', 'data_relevant', 'data_covered', 'data_missed' ]});</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/fixtures_html/peekaviewTests💣.m.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html>\n<head>\n<title>peekaviewTests&#x1f4a3;.m - Slather</title>\n<link href=\"slather.css\" media=\"all\" rel=\"stylesheet\">\n</head>\n<body>\n<header><div class=\"row\"><a href=\"index.html\"><img src=\"logo.jpg\" alt=\"Slather logo\"></a></div></header><div class=\"row\"><div id=\"reports\">\n<h2 class=\"cov_title\">\n<span>Coverage for \"peekaviewTests&#x1f4a3;.m\" : </span><span class=\"cov_high\">100.00%</span>\n</h2>\n<h4 class=\"cov_subtitle\">(11 of 11 relevant lines covered)</h4>\n<h4 class=\"cov_filepath\">spec/fixtures/fixturesTests/peekaviewTests&#x1f4a3;.m</h4>\n<table class=\"source_code\">\n<tr class=\"never\">\n<td class=\"num\">1</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">2</td>\n<td class=\"src\"><pre><code class=\"objc\">//  peekaviewTests&#x1f4a3;.m</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">3</td>\n<td class=\"src\"><pre><code class=\"objc\">//  fixtures</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">4</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">5</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Created by Mark Larsen on 6/25/14.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">6</td>\n<td class=\"src\"><pre><code class=\"objc\">//  Copyright (c) 2014 marklarr. All rights reserved.</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">7</td>\n<td class=\"src\"><pre><code class=\"objc\">//</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">8</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">9</td>\n<td class=\"src\"><pre><code class=\"objc\">#import &lt;XCTest/XCTest.h&gt;</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">10</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">11</td>\n<td class=\"src\"><pre><code class=\"objc\">@interface peekaviewTests : XCTestCase</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">12</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">13</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">14</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">15</td>\n<td class=\"src\"><pre><code class=\"objc\">@implementation peekaviewTests</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">16</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">17</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)setUp</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">18</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">19</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super setUp];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">20</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put setup code here. This method is called before the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">21</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">22</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">23</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)tearDown</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">24</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">25</td>\n<td class=\"src\"><pre><code class=\"objc\">    // Put teardown code here. This method is called after the invocation of each test method in the class.</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">26</td>\n<td class=\"src\"><pre><code class=\"objc\">    [super tearDown];</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">27</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">28</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">29</td>\n<td class=\"src\"><pre><code class=\"objc\">- (void)testExample</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">30</td>\n<td class=\"src\"><pre><code class=\"objc\">{</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">31</td>\n<td class=\"src\"><pre><code class=\"objc\">    XCTAssert(YES, @\"woot\");</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"covered\">\n<td class=\"num\">32</td>\n<td class=\"src\"><pre><code class=\"objc\">}</code></pre></td>\n<td class=\"coverage\">1x</td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">33</td>\n<td class=\"src\"><pre><code class=\"objc\"></code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n<tr class=\"never\">\n<td class=\"num\">34</td>\n<td class=\"src\"><pre><code class=\"objc\">@end</code></pre></td>\n<td class=\"coverage\"></td>\n</tr>\n</table>\n</div></div>\n<footer><div class=\"row\">\n<p><a href=\"https://github.com/SlatherOrg/slather\">Fork me on Github</a></p>\n<p>&copy; 2016 Slather</p>\n</div></footer><script src=\"highlight.pack.js\"></script><script>hljs.initHighlightingOnLoad();</script>\n</body>\n</html>\n"
  },
  {
    "path": "spec/fixtures/gutter.json",
    "content": "{\"meta\":{\"timestamp\":\"2016-04-17 16:53:43.919308\"},\"symbols_by_file\":{\"spec/fixtures/fixtures/fixtures.m\":[{\"line\":1,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":2,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":3,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":4,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":5,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":6,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":7,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":8,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":9,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":10,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":11,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":12,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":13,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":14,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":15,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":16,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":17,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":18,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":19,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":20,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":21,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":22,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":23,\"long_text\":\"\",\"short_text\":\"-\"}],\"spec/fixtures/fixtures/more_files/Branches.m\":[{\"line\":1,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":2,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":3,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":4,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":5,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":6,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":7,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":8,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":9,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":10,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":11,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":12,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":13,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":14,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":15,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":16,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":17,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":18,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":19,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":20,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":21,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":22,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":23,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":24,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":25,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":26,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":27,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":28,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":29,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":30,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":31,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":32,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":33,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":34,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":35,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":36,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":37,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":38,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":39,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":40,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":41,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":42,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":43,\"long_text\":\"\",\"short_text\":\"0\",\"background_color\":\"0xFC635E\"},{\"line\":44,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":45,\"long_text\":\"\",\"short_text\":\"-\"}],\"spec/fixtures/fixturesTests/BranchesTests.m\":[{\"line\":1,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":2,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":3,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":4,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":5,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":6,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":7,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":8,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":9,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":10,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":11,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":12,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":13,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":14,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":15,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":16,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":17,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":18,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":19,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":20,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":21,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":22,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":23,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":24,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":25,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":26,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":27,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":28,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":29,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":30,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":31,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":32,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":33,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":34,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":35,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":36,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":37,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":38,\"long_text\":\"\",\"short_text\":\"-\"}],\"spec/fixtures/fixturesTests/fixturesTests.m\":[{\"line\":1,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":2,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":3,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":4,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":5,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":6,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":7,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":8,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":9,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":10,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":11,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":12,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":13,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":14,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":15,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":16,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":17,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":18,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":19,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":20,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":21,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":22,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":23,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":24,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":25,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":26,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":27,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":28,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":29,\"long_text\":\"\",\"short_text\":\"2\",\"background_color\":\"0x35CC4B\"},{\"line\":30,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":31,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":32,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":33,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":34,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":35,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":36,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":37,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":38,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":39,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":40,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":41,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":42,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":43,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":44,\"long_text\":\"\",\"short_text\":\"-\"}],\"spec/fixtures/fixturesTests/peekaviewTests💣.m\":[{\"line\":1,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":2,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":3,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":4,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":5,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":6,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":7,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":8,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":9,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":10,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":11,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":12,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":13,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":14,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":15,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":16,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":17,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":18,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":19,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":20,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":21,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":22,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":23,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":24,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":25,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":26,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":27,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":28,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":29,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":30,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":31,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":32,\"long_text\":\"\",\"short_text\":\"1\",\"background_color\":\"0x35CC4B\"},{\"line\":33,\"long_text\":\"\",\"short_text\":\"-\"},{\"line\":34,\"long_text\":\"\",\"short_text\":\"-\"}]}}\n"
  },
  {
    "path": "spec/fixtures/sonarqube-generic-coverage.xml",
    "content": "<?xml version=\"1.0\"?>\n<coverage version=\"1\">\n  <file path=\"spec/fixtures/fixtures/fixtures.m\">\n    <lineToCover lineNumber=\"14\" covered=\"true\"/>\n    <lineToCover lineNumber=\"15\" covered=\"true\"/>\n    <lineToCover lineNumber=\"16\" covered=\"true\"/>\n    <lineToCover lineNumber=\"19\" covered=\"false\"/>\n    <lineToCover lineNumber=\"20\" covered=\"false\"/>\n    <lineToCover lineNumber=\"21\" covered=\"false\"/>\n  </file>\n  <file path=\"spec/fixtures/fixtures/more_files/Branches.m\">\n    <lineToCover lineNumber=\"14\" covered=\"true\"/>\n    <lineToCover lineNumber=\"15\" covered=\"true\"/>\n    <lineToCover lineNumber=\"16\" covered=\"true\"/>\n    <lineToCover lineNumber=\"17\" covered=\"true\"/>\n    <lineToCover lineNumber=\"18\" covered=\"true\"/>\n    <lineToCover lineNumber=\"19\" covered=\"false\"/>\n    <lineToCover lineNumber=\"20\" covered=\"false\"/>\n    <lineToCover lineNumber=\"21\" covered=\"true\"/>\n    <lineToCover lineNumber=\"22\" covered=\"true\"/>\n    <lineToCover lineNumber=\"23\" covered=\"true\"/>\n    <lineToCover lineNumber=\"24\" covered=\"true\"/>\n    <lineToCover lineNumber=\"25\" covered=\"true\"/>\n    <lineToCover lineNumber=\"26\" covered=\"true\"/>\n    <lineToCover lineNumber=\"27\" covered=\"true\"/>\n    <lineToCover lineNumber=\"28\" covered=\"true\"/>\n    <lineToCover lineNumber=\"29\" covered=\"false\"/>\n    <lineToCover lineNumber=\"30\" covered=\"false\"/>\n    <lineToCover lineNumber=\"31\" covered=\"false\"/>\n    <lineToCover lineNumber=\"32\" covered=\"false\"/>\n    <lineToCover lineNumber=\"33\" covered=\"false\"/>\n    <lineToCover lineNumber=\"34\" covered=\"false\"/>\n    <lineToCover lineNumber=\"35\" covered=\"false\"/>\n    <lineToCover lineNumber=\"36\" covered=\"false\"/>\n    <lineToCover lineNumber=\"37\" covered=\"false\"/>\n    <lineToCover lineNumber=\"38\" covered=\"false\"/>\n    <lineToCover lineNumber=\"39\" covered=\"false\"/>\n    <lineToCover lineNumber=\"40\" covered=\"false\"/>\n    <lineToCover lineNumber=\"41\" covered=\"false\"/>\n    <lineToCover lineNumber=\"42\" covered=\"false\"/>\n    <lineToCover lineNumber=\"43\" covered=\"false\"/>\n  </file>\n  <file path=\"spec/fixtures/fixturesTests/BranchesTests.m\">\n    <lineToCover lineNumber=\"18\" covered=\"true\"/>\n    <lineToCover lineNumber=\"19\" covered=\"true\"/>\n    <lineToCover lineNumber=\"20\" covered=\"true\"/>\n    <lineToCover lineNumber=\"21\" covered=\"true\"/>\n    <lineToCover lineNumber=\"23\" covered=\"true\"/>\n    <lineToCover lineNumber=\"24\" covered=\"true\"/>\n    <lineToCover lineNumber=\"25\" covered=\"true\"/>\n    <lineToCover lineNumber=\"26\" covered=\"true\"/>\n    <lineToCover lineNumber=\"28\" covered=\"true\"/>\n    <lineToCover lineNumber=\"29\" covered=\"true\"/>\n    <lineToCover lineNumber=\"30\" covered=\"true\"/>\n    <lineToCover lineNumber=\"31\" covered=\"true\"/>\n    <lineToCover lineNumber=\"33\" covered=\"true\"/>\n    <lineToCover lineNumber=\"34\" covered=\"true\"/>\n    <lineToCover lineNumber=\"35\" covered=\"true\"/>\n    <lineToCover lineNumber=\"36\" covered=\"true\"/>\n  </file>\n  <file path=\"spec/fixtures/fixturesTests/fixturesTests.m\">\n    <lineToCover lineNumber=\"20\" covered=\"true\"/>\n    <lineToCover lineNumber=\"21\" covered=\"true\"/>\n    <lineToCover lineNumber=\"22\" covered=\"true\"/>\n    <lineToCover lineNumber=\"23\" covered=\"true\"/>\n    <lineToCover lineNumber=\"26\" covered=\"true\"/>\n    <lineToCover lineNumber=\"27\" covered=\"true\"/>\n    <lineToCover lineNumber=\"28\" covered=\"true\"/>\n    <lineToCover lineNumber=\"29\" covered=\"true\"/>\n    <lineToCover lineNumber=\"32\" covered=\"true\"/>\n    <lineToCover lineNumber=\"33\" covered=\"true\"/>\n    <lineToCover lineNumber=\"34\" covered=\"true\"/>\n    <lineToCover lineNumber=\"35\" covered=\"true\"/>\n    <lineToCover lineNumber=\"38\" covered=\"true\"/>\n    <lineToCover lineNumber=\"39\" covered=\"true\"/>\n    <lineToCover lineNumber=\"40\" covered=\"true\"/>\n    <lineToCover lineNumber=\"41\" covered=\"true\"/>\n    <lineToCover lineNumber=\"42\" covered=\"true\"/>\n  </file>\n  <file path=\"spec/fixtures/fixturesTests/peekaviewTests&#x1F4A3;.m\">\n    <lineToCover lineNumber=\"18\" covered=\"true\"/>\n    <lineToCover lineNumber=\"19\" covered=\"true\"/>\n    <lineToCover lineNumber=\"20\" covered=\"true\"/>\n    <lineToCover lineNumber=\"21\" covered=\"true\"/>\n    <lineToCover lineNumber=\"24\" covered=\"true\"/>\n    <lineToCover lineNumber=\"25\" covered=\"true\"/>\n    <lineToCover lineNumber=\"26\" covered=\"true\"/>\n    <lineToCover lineNumber=\"27\" covered=\"true\"/>\n    <lineToCover lineNumber=\"30\" covered=\"true\"/>\n    <lineToCover lineNumber=\"31\" covered=\"true\"/>\n    <lineToCover lineNumber=\"32\" covered=\"true\"/>\n  </file>\n</coverage>\n"
  },
  {
    "path": "spec/slather/cocoapods_plugin_spec.rb",
    "content": "require 'cocoapods'\nrequire File.join(File.dirname(__FILE__), '..', 'spec_helper')\nrequire File.join(File.dirname(__FILE__), '../../lib/cocoapods_plugin')\n\ndescribe Slather do\n  describe 'CocoaPods Plugin' do\n    it 'should setup slather for coverage in the Pods project' do\n      mock_project = double(Xcodeproj::Project)\n      allow(Xcodeproj::Project).to receive(:open).and_return(mock_project)\n      expect(mock_project).to receive(:slather_setup_for_coverage)\n      expect(mock_project).to receive(:save)\n\n      # Execute the post_install hook via CocoaPods\n      sandbox_root = 'Pods'\n      sandbox = Pod::Sandbox.new(sandbox_root)\n      context = Pod::Installer::PostInstallHooksContext.generate(sandbox, mock_project, [])\n      Pod::HooksManager.run(:post_install, context, {'slather' => nil})\n    end\n  end\nend\n\n"
  },
  {
    "path": "spec/slather/coverage_file_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', 'spec_helper')\n\ndescribe Slather::CoverageFile do\n\n  let(:fixtures_project) do\n    project = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    project.build_directory = TEMP_DERIVED_DATA_PATH\n    project.send(:configure)\n    allow(project).to receive(:input_format).and_return(\"gcov\")\n    project\n  end\n\n  let(:coverage_file) do\n    fixtures_project.coverage_files.detect { |cf| cf.source_file_pathname.basename.to_s == \"fixtures.m\" }\n  end\n\n  describe \"#initialize\" do\n    it \"should convert the provided path string to a Pathname object, and set it as the gcno_file_pathname\" do\n      expect(coverage_file.gcno_file_pathname).to be_exist\n      expect(coverage_file.gcno_file_pathname.basename.to_s).to eq(\"fixtures.gcno\")\n    end\n  end\n\n  describe \"#source_file_pathname\" do\n    it \"should look in the source_directory if it has been set on the project\" do\n      coverage_file = Slather::CoverageFile.new(fixtures_project, \"fixtures.m\")\n      fixtures_project.source_directory = Pathname(File.join(File.dirname(__FILE__), '../fixtures/')).realpath.to_s\n      expect(coverage_file.source_file_pathname).to eq(fixtures_project[\"fixtures/fixtures.m\"].real_path)\n    end\n\n    it \"should look in the source_directory if it has been set on the project\" do\n      coverage_file = Slather::CoverageFile.new(fixtures_project, \"fixtures.m\")\n      fixtures_project.source_directory = Pathname(File.join(File.dirname(__FILE__), '../fixtures/fixturesTests')).realpath.to_s\n      expect(coverage_file.source_file_pathname).to be_nil\n    end\n\n    it \"should return nil if it couldn't find the coverage files's source implementation file in the project\" do\n      whoami_file = Slather::CoverageFile.new(fixtures_project, \"/some/path/whoami.gcno\")\n      expect(whoami_file.source_file_pathname).to be_nil\n    end\n\n    [\"cpp\", \"mm\", \"m\"].each do |file_ext|\n      it \"should work for #{file_ext} files\" do\n        file_name = \"fixtures_#{file_ext}.#{file_ext}\"\n        coverage_file = fixtures_project.coverage_files.detect { |cf| cf.source_file_pathname.basename.to_s == file_name }\n        expect(coverage_file.source_file_pathname).to eq(fixtures_project[\"fixtures/#{file_name}\"].real_path)\n      end\n    end\n  end\n\n  describe \"#source_file\" do\n    it \"should return a file object for the source_file_pathname\" do\n      file = coverage_file.source_file\n      expect(file).to be_a File\n      expect(Pathname(file.path)).to eq(coverage_file.source_file_pathname)\n    end\n  end\n\n  describe \"#source_data\" do\n    it \"should return the contents of the source_file\" do\n      expected = <<-OBJC\n//\n//  fixtures.m\n//  fixtures\n//\n//  Created by Mark Larsen on 6/24/14.\n//  Copyright (c) 2014 marklarr 🌟. All rights reserved.\n//\n\n#import \"fixtures.h\"\n\n@implementation fixtures\n\n- (void)testedMethod\n{\n    NSLog(@\"tested\");\n}\n\n- (void)untestedMethod\n{\n    NSLog(@\"untested\");\n}\n\n@end\nOBJC\n      expect(coverage_file.source_data).to eq(expected)\n    end\n  end\n\n  describe \"source_file_basename\" do\n    it \"returns the base name of the source file\" do\n      expect(coverage_file.source_file_basename).to eq(\"fixtures\")\n    end\n  end\n\n  describe \"source_file_pathname_relative_to_repo_root\" do\n    it \"should return a pathname to the source_file, relative to the root of the repo\" do\n      expect(coverage_file.source_file_pathname_relative_to_repo_root).to eq(Pathname(\"spec/fixtures/fixtures/fixtures.m\"))\n    end\n  end\n\n  describe \"#ignored\" do\n    it \"should return true if the source_file_pathname globs against anything in the project.ignore_list\" do\n      coverage_file.project.ignore_list = [\"*spec*\", \"*test*\"]\n      expect(coverage_file).to be_ignored\n    end\n\n    it \"should return false if the source_file_pathname does not glob against anything in the project.ignore_list\" do\n      coverage_file.project.ignore_list = [\"*test*\", \"*XCTest*\"]\n      expect(coverage_file).not_to be_ignored\n    end\n  end\n\n  describe \"gcov_data\" do\n    it \"should process the gcno file with gcov and return the contents of the file\" do\n      expect(coverage_file.gcov_data).to include(\":   15:    NSLog(@\\\"tested\\\");\")\n    end\n  end\n\n  describe \"line coverage\" do\n\n    before(:each) {\n      allow(fixtures_project).to receive(:input_format).and_return(\"gcov\")\n    }\n\n    let(:line_coverage_file) do\n      fixtures_project.coverage_files.detect { |cf| cf.source_file_pathname.basename.to_s == \"fixtures.m\" }\n    end\n\n    describe \"#coverage_for_line\" do\n      it \"should return nil if the line is not relevant to coverage\" do\n        expect(line_coverage_file.coverage_for_line(\"        -:   75: }\")).to be_nil\n      end\n\n      it \"should return the number of times the line was executed if the line is relevant to coverage\" do\n        expect(line_coverage_file.coverage_for_line(\"        1:   75: }\")).to eq(1)\n        expect(line_coverage_file.coverage_for_line(\"        15:   75: }\")).to eq(15)\n        expect(line_coverage_file.coverage_for_line(\"        ####:   75: }\")).to eq(0)\n      end\n    end\n\n    describe \"num_lines_tested\" do\n      it \"should return the correct number of lines tested\" do\n        expect(line_coverage_file.num_lines_tested).to eq(3)\n      end\n    end\n\n    describe \"num_lines_testable\" do\n      it \"should return the correct number of lines that are testable\" do\n        expect(line_coverage_file.num_lines_testable).to eq(6)\n      end\n    end\n\n    describe \"percentage_lines_tested\" do\n      it \"should return the correct percentage of lines that are tested\" do\n        expect(line_coverage_file.percentage_lines_tested).to eq(50)\n      end\n\n      it \"should return 100 if no testable lines\" do\n        allow(line_coverage_file).to receive(:num_lines_testable).and_return(0)\n        expect(line_coverage_file.percentage_lines_tested).to eq(100)\n      end\n    end\n  end\n\n  describe \"branch coverage\" do\n\n    let(:branch_coverage_file) do\n      fixtures_project.coverage_files.detect { |cf| cf.source_file_pathname.basename.to_s == \"Branches.m\" }\n    end\n\n    describe \"branch_coverage_data\" do\n      it \"should return a hash with keys representing the line number of a branch statement\" do\n        expect(branch_coverage_file.branch_coverage_data.keys[0]).to eq(15)\n        expect(branch_coverage_file.branch_coverage_data.keys[1]).to eq(18)\n        expect(branch_coverage_file.branch_coverage_data.keys[2]).to eq(26)\n        expect(branch_coverage_file.branch_coverage_data.keys[3]).to eq(29)\n      end\n\n      it \"should store an array for each line number which contains the hit count for each branch\" do\n        data = branch_coverage_file.branch_coverage_data[15]\n        expect(data.length).to eq(2)\n        expect(data[0]).to be >= 1\n        expect(data[1]).to be >= 1\n\n        data = branch_coverage_file.branch_coverage_data[18]\n        expect(data.length).to eq(2)\n        expect(data[0]).to eq(0)\n        expect(data[1]).to be >= 1\n\n        data = branch_coverage_file.branch_coverage_data[26]\n        expect(data.length).to eq(2)\n        expect(data[0]).to be >= 2\n        expect(data[1]).to eq(0)\n\n        data = branch_coverage_file.branch_coverage_data[29]\n        expect(data.length).to eq(4)\n        expect(data[0]).to eq(0)\n        expect(data[1]).to eq(0)\n        expect(data[2]).to eq(0)\n        expect(data[3]).to eq(0)\n      end\n    end\n\n    describe \"branch_coverage_data_for_statement_on_line\" do\n      it \"return the array with branch hit counts for statement at a given line number\" do\n        data = branch_coverage_file.branch_coverage_data[15]\n        expect(data.length).to eq(2)\n        expect(data[0]).to be >= 1\n        expect(data[1]).to be >= 1\n\n        data = branch_coverage_file.branch_coverage_data[18]\n        expect(data.length).to eq(2)\n        expect(data[0]).to eq(0)\n        expect(data[1]).to be >= 1\n\n        data = branch_coverage_file.branch_coverage_data[26]\n        expect(data.length).to eq(2)\n        expect(data[0]).to be >= 2\n        expect(data[1]).to eq(0)\n\n        data = branch_coverage_file.branch_coverage_data[29]\n        expect(data.length).to eq(4)\n        expect(data[0]).to eq(0)\n        expect(data[1]).to eq(0)\n        expect(data[2]).to eq(0)\n        expect(data[3]).to eq(0)\n      end\n    end\n\n    describe \"num_branch_hits_for_statement_on_line\" do\n      it \"returns the number of branches executed below the statement at a given line number\" do\n        expect(branch_coverage_file.num_branch_hits_for_statement_on_line(15)).to eq(2)\n        expect(branch_coverage_file.num_branch_hits_for_statement_on_line(18)).to eq(1)\n        expect(branch_coverage_file.num_branch_hits_for_statement_on_line(26)).to eq(1)\n        expect(branch_coverage_file.num_branch_hits_for_statement_on_line(29)).to eq(0)\n      end\n    end\n\n    describe \"rate_branch_coverage_for_statement_on_line\" do\n      it \"returns the ratio between number of executed and number of total branches at a given line number\" do\n        expect(branch_coverage_file.rate_branch_coverage_for_statement_on_line(15)).to eq(1.0)\n        expect(branch_coverage_file.rate_branch_coverage_for_statement_on_line(18)).to eq(0.5)\n        expect(branch_coverage_file.rate_branch_coverage_for_statement_on_line(26)).to eq(0.5)\n        expect(branch_coverage_file.rate_branch_coverage_for_statement_on_line(29)).to eq(0.0)\n      end\n\n      it \"return 0.0 for a line without branch data\" do\n        expect(branch_coverage_file.rate_branch_coverage_for_statement_on_line(1)).to eq(0.0)\n      end\n    end\n\n    describe \"percentage_branch_coverage_for_statement_on_line\" do\n      it \"returns the average hit percentage of all branches below the statement at a given line number\" do\n        expect(branch_coverage_file.percentage_branch_coverage_for_statement_on_line(15)).to eq(100)\n        expect(branch_coverage_file.percentage_branch_coverage_for_statement_on_line(18)).to eq(50)\n        expect(branch_coverage_file.percentage_branch_coverage_for_statement_on_line(26)).to eq(50)\n        expect(branch_coverage_file.percentage_branch_coverage_for_statement_on_line(29)).to eq(0)\n      end\n    end\n\n    describe \"num_branches_testable\" do\n      it \"returns the number of testable branches inside the class\" do\n        expect(branch_coverage_file.num_branches_testable).to eq(10)\n      end\n    end\n\n    describe \"num_branches_tested\" do\n      it \"returns the number of tested branches inside the class\" do\n        expect(branch_coverage_file.num_branches_tested).to eq(4)\n      end\n    end\n\n    describe \"rate_branches_tested\" do\n      it \"returns the ratio between tested and testable branches inside the class\" do\n        expect(branch_coverage_file.rate_branches_tested).to eq(0.4)\n      end\n    end\n  end\n\n  describe \"empty coverage data\" do\n\n    let(:empty_file) do\n      fixtures_project.coverage_files.detect { |cf| cf.source_file_pathname.basename.to_s == \"Empty.m\" }\n    end\n\n    describe \"gcov_data\" do\n      it \"returns an empty string\" do\n        gcov_data = empty_file.gcov_data\n        expect(gcov_data).to be_empty\n      end\n    end\n\n    describe \"cleaned_gcov_data\" do\n      it \"returns an empty string\" do\n        cleaned_gcov_data = empty_file.cleaned_gcov_data\n        expect(cleaned_gcov_data).to be_empty\n      end\n    end\n\n    describe \"branch_coverage_data\" do\n      it \"returns an empty hash for branch_coverage_data of an empty file\" do\n        data = empty_file.branch_coverage_data\n        expect(data).to be_empty\n      end\n    end\n\n    describe \"num_branch_hits_for_statement_on_line\" do\n      it \"returns 0.0 when no data is available\" do\n        expect(empty_file.num_branch_hits_for_statement_on_line(1)).to eq(0)\n      end\n    end\n\n    describe \"rate_branch_coverage_for_statement_on_line\" do\n      it \"returns 0.0 when no data is available\" do\n        expect(empty_file.rate_branch_coverage_for_statement_on_line(1)).to eq(0.0)\n      end\n    end\n\n    describe \"percentage_branch_coverage_for_statement_on_line\" do\n      it \"returns 0 when no data is available\" do\n        expect(empty_file.percentage_branch_coverage_for_statement_on_line(1)).to eq(0)\n      end\n    end\n\n    describe \"num_branches_testable\" do\n      it \"returns 0 when no data is available\" do\n        expect(empty_file.num_branches_testable).to eq(0)\n      end\n    end\n\n    describe \"num_branches_tested\" do\n      it \"returns 0 when no data is available\" do\n        expect(empty_file.num_branches_tested).to eq(0)\n      end\n    end\n\n    describe \"rate_branches_tested\" do\n      it \"returns 0.0 when no data is available\" do\n        expect(empty_file.rate_branches_tested).to eq(0.0)\n      end\n    end\n  end\n\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/cobertura_xml_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\nrequire 'json'\n\ndescribe Slather::CoverageService::CoberturaXmlOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"cobertura_xml\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return CoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should create an XML report spanning all coverage files\" do\n      fixtures_project.post\n\n      file = File.open(FIXTURES_XML_PATH)\n      fixture_xml_doc = Nokogiri::XML(file)\n      file.close\n\n      file = File.open('cobertura.xml')\n      current_xml_doc = Nokogiri::XML(file)\n      file.close\n\n      [current_xml_doc, fixture_xml_doc].each do |xml_doc|\n        xml_doc.root['timestamp'] = ''\n        xml_doc.root['version'] = ''\n        source_node = xml_doc.at_css \"source\"\n        source_node.content = ''\n      end\n\n      expect(EquivalentXml.equivalent?(current_xml_doc, fixture_xml_doc)).to be_truthy\n    end\n\n    it \"should create an XML report in the given output directory\" do\n      fixtures_project.output_directory = \"./output\"\n      fixtures_project.post\n\n      filepath = \"#{fixtures_project.output_directory}/cobertura.xml\"\n      expect(File.exist?(filepath)).to be_truthy\n\n      FileUtils.rm_rf(fixtures_project.output_directory)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/coveralls_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\n\ndescribe Slather::CoverageService::Coveralls do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"coveralls\"\n    proj.send(:configure)\n    proj\n  end\n\n  describe \"#coverage_file_class\" do\n    it \"should return CoverallsCoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe \"#travis_job_id\" do\n    it \"should return the TRAVIS_JOB_ID environment variable\" do\n      actual_travis_job_id = ENV['TRAVIS_JOB_ID']\n      ENV['TRAVIS_JOB_ID'] = \"9182\"\n      expect(fixtures_project.send(:travis_job_id)).to eq(\"9182\")\n      ENV['TRAVIS_JOB_ID'] = actual_travis_job_id\n    end\n  end\n\n  describe '#coveralls_coverage_data' do\n\n    context \"coverage_service is :travis_ci\" do\n      before(:each) { fixtures_project.ci_service = :travis_ci }\n\n      it \"should return valid json for coveralls coverage gcov data\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"travis-ci\\\"}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no TRAVIS_JOB_ID\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n\n      it \"should raise an error if there is a COVERAGE_ACCESS_TOKEN\" do        \n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n\n    end\n\n    context \"coverage_service is :travis_pro\" do\n      before(:each) { fixtures_project.ci_service = :travis_pro }\n\n      it \"should return valid json for coveralls coverage data\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"travis-pro\\\",\\\"repo_token\\\":\\\"abc123\\\"}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no TRAVIS_JOB_ID\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n\n      it \"should raise an error if there is no COVERAGE_ACCESS_TOKEN\" do        \n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"\")\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n\n    end\n\n    context \"coverage_service is :circleci\" do\n      before(:each) { fixtures_project.ci_service = :circleci }\n\n      it \"should return valid json for coveralls coverage data\" do\n        allow(fixtures_project).to receive(:circleci_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        allow(fixtures_project).to receive(:circleci_pull_request).and_return(\"1\")\n        allow(fixtures_project).to receive(:circleci_build_url).and_return(\"https://circleci.com/gh/Bruce/Wayne/1\")\n        allow(fixtures_project).to receive(:circleci_git_info).and_return({ :head => { :id => \"ababa123\", :author_name => \"bwayne\", :message => \"hello\" }, :branch => \"master\" })\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"circleci\\\",\\\"repo_token\\\":\\\"abc123\\\",\\\"service_pull_request\\\":\\\"1\\\",\\\"service_build_url\\\":\\\"https://circleci.com/gh/Bruce/Wayne/1\\\",\\\"git\\\":{\\\"head\\\":{\\\"id\\\":\\\"ababa123\\\",\\\"author_name\\\":\\\"bwayne\\\",\\\"message\\\":\\\"hello\\\"},\\\"branch\\\":\\\"master\\\"}}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no CIRCLE_BUILD_NUM\" do\n        allow(fixtures_project).to receive(:circleci_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n    end\n\n    context \"coverage_service is :jenkins\" do\n      before(:each) { fixtures_project.ci_service = :jenkins }\n\n      it \"should return valid json for coveralls coverage data\" do\n        allow(fixtures_project).to receive(:jenkins_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        allow(fixtures_project).to receive(:jenkins_git_info).and_return({head: {id: \"master\", author_name: \"author\", message: \"pull title\" }, branch: \"branch\"})\n        allow(fixtures_project).to receive(:jenkins_branch_name).and_return('master')\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"jenkins\\\",\\\"repo_token\\\":\\\"abc123\\\",\\\"git\\\":{\\\"head\\\":{\\\"id\\\":\\\"master\\\",\\\"author_name\\\":\\\"author\\\",\\\"message\\\":\\\"pull title\\\"},\\\"branch\\\":\\\"branch\\\"}}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no BUILD_ID\" do\n        allow(fixtures_project).to receive(:jenkins_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n    end\n\n    it \"should raise an error if it does not recognize the ci_service\" do\n      fixtures_project.ci_service = :jenkins_ci\n      expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n    end\n\n    context \"coverage_service is :teamcity\" do\n      before(:each) { fixtures_project.ci_service = :teamcity }\n\n      it \"should return valid json for coveralls coverage data\" do\n        allow(fixtures_project).to receive(:teamcity_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        allow(fixtures_project).to receive(:teamcity_git_info).and_return({head: {id: \"master\", author_name: \"author\", author_email: \"john.doe@slather.com\", message: \"pull title\" }, branch: \"branch\"})\n        allow(fixtures_project).to receive(:teamcity_branch_name).and_return('master')\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"teamcity\\\",\\\"repo_token\\\":\\\"abc123\\\",\\\"git\\\":{\\\"head\\\":{\\\"id\\\":\\\"master\\\",\\\"author_name\\\":\\\"author\\\",\\\"author_email\\\":\\\"john.doe@slather.com\\\",\\\"message\\\":\\\"pull title\\\"},\\\"branch\\\":\\\"branch\\\"}}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no TC_BUILD_NUMBER\" do\n        allow(fixtures_project).to receive(:teamcity_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n\n      it \"should return the teamcity branch name\" do\n        git_branch = ENV['GIT_BRANCH']\n        ENV['GIT_BRANCH'] = \"master\"\n        expect(fixtures_project.send(:teamcity_branch_name)).to eq(\"master\")\n        ENV['GIT_BRANCH'] = git_branch\n      end\n\n      it \"should return the teamcity job id\" do\n        teamcity_job_id = ENV['TC_BUILD_NUMBER']\n        ENV['TC_BUILD_NUMBER'] = \"9182\"\n        expect(fixtures_project.send(:teamcity_job_id)).to eq(\"9182\")\n        ENV['TC_BUILD_NUMBER'] = teamcity_job_id\n      end\n\n      it \"should return teamcity git info\" do\n        git_branch = ENV['GIT_BRANCH']\n        ENV['GIT_BRANCH'] = \"master\"\n        expect(fixtures_project.send(:teamcity_git_info)).to eq({head: {id: `git log --format=%H -n 1 HEAD`.chomp, author_name: `git log --format=%an -n 1 HEAD`.chomp, author_email: `git log --format=%ae -n 1 HEAD`.chomp, message: `git log --format=%s -n 1 HEAD`.chomp }, branch: \"master\"})\n        ENV['GIT_BRANCH'] = git_branch\n      end\n    end\n\n    context \"coverage_service is :github\" do\n      before(:each) { fixtures_project.ci_service = :github }\n\n      it \"should return valid json for coveralls coverage data\" do\n        allow(fixtures_project).to receive(:github_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:coverage_access_token).and_return(\"abc123\")\n        allow(fixtures_project).to receive(:github_pull_request).and_return(\"1\")\n        allow(fixtures_project).to receive(:github_build_url).and_return(\"https://github.com/Bruce/Wayne/actions/runs/1\")\n        allow(fixtures_project).to receive(:github_git_info).and_return({ :head => { :id => \"ababa123\", :author_name => \"bwayne\", :message => \"hello\" }, :branch => \"master\" })\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"github\\\",\\\"repo_name\\\":\\\"\\\",\\\"repo_token\\\":\\\"abc123\\\",\\\"service_pull_request\\\":\\\"1\\\",\\\"service_build_url\\\":\\\"https://github.com/Bruce/Wayne/actions/runs/1\\\",\\\"git\\\":{\\\"head\\\":{\\\"id\\\":\\\"ababa123\\\",\\\"author_name\\\":\\\"bwayne\\\",\\\"message\\\":\\\"hello\\\"},\\\"branch\\\":\\\"master\\\"}}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n\n      it \"should raise an error if there is no GITHUB_RUN_ID\" do\n        allow(fixtures_project).to receive(:github_job_id).and_return(nil)\n        expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)\n      end\n    end\n\n  end\n\n  describe '#coveralls_coverage_data' do\n    context \"coverage_service is :travis_ci\" do\n      before(:each) {\n        fixtures_project.ci_service = :travis_ci\n        project_root = Pathname(\"./\").realpath\n        allow(fixtures_project).to receive(:llvm_cov_export_output).and_return(%q(\n          {\n             \"data\":[\n                {\n                   \"files\":[]\n                }\n             ]\n          }\n        ))\n        allow(fixtures_project).to receive(:profdata_llvm_cov_output).and_return(\"#{project_root}/spec/fixtures/fixtures/fixtures.m:\n       |    1|//\n       |    2|//  fixtures.m\n       |    3|//  fixtures\n       |    4|//\n       |    5|//  Created by Mark Larsen on 6/24/14.\n       |    6|//  Copyright (c) 2014 marklarr. All rights reserved.\n       |    7|//\n       |    8|\n       |    9|#import \\\"fixtures.h\\\"\n       |   10|\n       |   11|@implementation fixtures\n       |   12|\n       |   13|- (void)testedMethod\n      1|   14|{\n      1|   15|    NSLog(@\\\"tested\\\");\n      1|   16|}\n       |   17|\n       |   18|- (void)untestedMethod\n      0|   19|{\n      0|   20|    NSLog(@\\\"untested\\\");\n      0|   21|}\n       |   22|\n       |   23|@end\n\")\n      }\n\n      it \"should save the coveralls_coverage_data to a file and post it to coveralls\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        expect(fixtures_project).to receive(:`) do |cmd|\n          expect(cmd).to eq(\"curl -s --form json_file=@coveralls_json_file https://coveralls.io/api/v1/jobs\")\n          expect(File.read('coveralls_json_file')).to be_json_eql(fixtures_project.send(:coveralls_coverage_data))\n        end.once\n        fixtures_project.post\n      end\n\n      it \"should save the coveralls_coverage_data to a file, post it to coveralls, and fail due to a Coveralls error\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        allow(fixtures_project).to receive(:`).and_return(\"{\\\"message\\\":\\\"Couldn't find a repository matching this job.\\\",\\\"error\\\":true}\")\n        expect(fixtures_project).to receive(:`).once\n        expect { fixtures_project.post }.to raise_error(StandardError)        \n      end\n\n      it \"should always remove the coveralls_json_file after it's done\" do\n        allow(fixtures_project).to receive(:`)\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        fixtures_project.post\n        expect(File.exist?(\"coveralls_json_file\")).to be_falsy\n        allow(fixtures_project).to receive(:travis_job_id).and_return(nil)\n        expect { fixtures_project.post }.to raise_error(StandardError)\n        expect(File.exist?(\"coveralls_json_file\")).to be_falsy\n      end\n\n      it \"should return valid json for coveralls coverage profdata data\" do\n        allow(fixtures_project).to receive(:travis_job_id).and_return(\"9182\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(\"{\\\"service_job_id\\\":\\\"9182\\\",\\\"service_name\\\":\\\"travis-ci\\\"}\").excluding(\"source_files\")\n        expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.coverage_files.map(&:as_json).to_json).at_path(\"source_files\")\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/gutter_json_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\nrequire 'json'\n\ndescribe Slather::CoverageService::GutterJsonOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"gutter_json\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return CoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should print out the coverage for each file, and then total coverage\" do\n      fixtures_project.post\n\n      fixture_json = File.read(FIXTURES_GUTTER_JSON_PATH)\n      current_json = File.read('.gutter.json')\n\n      expect(current_json).to be_json_eql(fixture_json)\n      File.unlink('.gutter.json')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/hardcover_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\n\ndescribe Slather::CoverageService::Hardcover do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"hardcover\"\n    proj.configure\n    proj\n  end\n\n  let(:fixture_yaml) do\n      yaml_text = <<-EOF\n        hardcover_repo_token: \"27dd855e706b22126ec6daaaf7bb40b5\"\n        hardcover_base_url: \"http://api.hardcover.io\"\n      EOF\n      yaml = YAML.load(yaml_text)\n  end\n\n  describe \"#coverage_file_class\" do\n    it \"should return CoverallsCoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe \"#job_id\" do\n    it \"should return the Jenkins JOB_NAME and BUILD_NUMBER environment variables\" do\n      ENV['BUILD_NUMBER'] = \"9182\"\n      ENV['JOB_NAME'] = \"slather-master\"\n      expect(fixtures_project.send(:jenkins_job_id)).to eq(\"slather-master/9182\")\n    end\n  end\n\n  describe '#hardcover_coverage_data' do\n\n    context \"coverage_service is :jenkins_ci\" do\n      before(:each) do\n        fixtures_project.ci_service = :jenkins_ci\n        allow(Slather::Project).to receive(:yml).and_return(fixture_yaml)\n      end\n\n      it \"should return a valid json\" do\n        json = JSON(fixtures_project.send(:hardcover_coverage_data))\n        expect(json[\"service_job_id\"]).to eq(\"slather-master/9182\")\n        expect(json[\"service_name\"]).to eq(\"jenkins-ci\")\n        expect(json[\"repo_token\"]).to eq(\"27dd855e706b22126ec6daaaf7bb40b5\")\n        expect(json[\"source_files\"]).to_not be_empty\n      end\n\n      it \"should raise an error if there is no BUILD_NUMBER or JOB_NAME\" do\n        allow(fixtures_project).to receive(:jenkins_job_id).and_return(nil)\n        expect { fixtures_project.send(:hardcover_coverage_data) }.to raise_error(StandardError)\n      end\n    end\n\n    it \"should raise an error if it does not recognize the ci_service\" do\n      fixtures_project.ci_service = :non_existing_ci\n      expect { fixtures_project.send(:hardcover_coverage_data) }.to raise_error(StandardError)\n    end\n  end\n\n  describe '#post' do\n    before(:each) do\n      allow(Slather::Project).to receive(:yml).and_return(fixture_yaml)\n      fixtures_project.ci_service = :jenkins_ci\n      project_root = Pathname(\"./\").realpath\n      allow(fixtures_project).to receive(:llvm_cov_export_output).and_return(%q(\n        {\n           \"data\":[\n              {\n                 \"files\":[]\n              }\n           ]\n        }\n      ))\n      allow(fixtures_project).to receive(:profdata_llvm_cov_output).and_return(\"#{project_root}/spec/fixtures/fixtures/fixtures.m:\n       |    1|//\n       |    2|//  fixtures.m\n       |    3|//  fixtures\n       |    4|//\n       |    5|//  Created by Mark Larsen on 6/24/14.\n       |    6|//  Copyright (c) 2014 marklarr. All rights reserved.\n       |    7|//\n       |    8|\n       |    9|#import \\\"fixtures.h\\\"\n       |   10|\n       |   11|@implementation fixtures\n       |   12|\n       |   13|- (void)testedMethod\n      1|   14|{\n      1|   15|    NSLog(@\\\"tested\\\");\n      1|   16|}\n       |   17|\n       |   18|- (void)untestedMethod\n      0|   19|{\n      0|   20|    NSLog(@\\\"untested\\\");\n      0|   21|}\n       |   22|\n       |   23|@end\n\")\n    end\n\n    it \"should save the hardcover_coverage_data to a file and post it to hardcover\" do\n      allow(fixtures_project).to receive(:jenkins_job_id).and_return(\"slather-master/9182\")\n      allow(fixtures_project).to receive(:coverage_service_url).and_return(\"http://api.hardcover.io\")\n      expect(fixtures_project).to receive(:`) do |cmd|\n        expect(cmd).to eq(\"curl --form json_file=@hardcover_json_file http://api.hardcover.io/v1/jobs\")\n      end.once\n      fixtures_project.post\n    end\n\n    it \"should always remove the hardcover_json_file after it's done\" do\n      allow(fixtures_project).to receive(:`)\n      allow(fixtures_project).to receive(:jenkins_job_id).and_return(\"slather-master/9182\")\n      allow(fixtures_project).to receive(:coverage_service_url).and_return(\"http://api.hardcover.io\")\n      fixtures_project.post\n      expect(File.exist?(\"hardcover_json_file\")).to be_falsy\n      allow(fixtures_project).to receive(:jenkins_job_id).and_return(nil)\n      expect { fixtures_project.post }.to raise_error(StandardError)\n      expect(File.exist?(\"hardcover_json_file\")).to be_falsy\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/html_output_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\nrequire 'nokogiri'\n\ndescribe Slather::CoverageService::HtmlOutput do\n\n  OUTPUT_DIR_PATH = \"html\"\n\n  let(:fixture_html_files) do\n    [\"index\",\n    \"fixtures.m\",\n    \"Branches.m\",\n    \"fixturesTests.m\",\n    \"peekaviewTests💣.m\",\n    \"BranchesTests.m\"].map { |file| \"#{file}.html\"}\n  end\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"html\"\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return CoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n\n    it \"should allow accessing docs via attribute\" do\n      expect(fixtures_project.docs).to eq(nil)\n    end\n  end\n\n  describe '#post' do\n    before(:each) {\n      allow(fixtures_project).to receive(:print_path_coverage)\n      fixtures_project.send(:configure)\n    }\n\n    after(:each) {\n      FileUtils.rm_rf(OUTPUT_DIR_PATH) if Dir.exist?(OUTPUT_DIR_PATH)\n    }\n\n    def extract_header_title(doc)\n      doc.at_css('title').text\n    end\n\n    it \"should create all coverage as static html files\" do\n      fixtures_project.post\n\n      fixture_html_files.map { |filename|\n        File.join(OUTPUT_DIR_PATH, filename)\n      }.each { |filepath|\n        expect(File.exist?(filepath)).to be_truthy\n      }\n    end\n\n    it \"should print out the path of the html folder by default\" do\n      fixtures_project.post\n\n      expect(fixtures_project).to have_received(:print_path_coverage).with(\"html/index.html\")\n    end\n\n    it \"should open the index.html automatically if --show is flagged\" do\n      allow(fixtures_project).to receive(:open_coverage)\n\n      fixtures_project.show_html = true\n      fixtures_project.post\n\n      expect(fixtures_project).to have_received(:open_coverage).with(\"html/index.html\")\n    end\n\n    it \"should create index html with correct coverage information\" do\n      def extract_title(doc)\n        doc.at_css('#reports > h2').text\n      end\n\n      def extract_coverage_text(doc)\n        doc.at_css('#total_coverage').text\n      end\n\n      def extract_coverage_class(doc)\n        doc.at_css('#total_coverage').attribute(\"class\").to_s\n      end\n\n      def extract_cov_header(doc)\n        doc.css(\"table.coverage_list > thead > tr > th\").map { |header|\n          [header.text, header.attribute(\"data-sort\")].join(\", \")\n        }.join(\"; \")\n      end\n\n      def extract_cov_index(doc)\n        coverages = doc.css(\"table.coverage_list > tbody > tr\").map { |tr|\n          tr.css(\"td\").map { |td|\n            if td.attribute(\"class\")\n              td.attribute(\"class\").to_s.split.join(\", \") + \", #{td.text}\"\n            elsif span = td.at_css(\"span\")\n              span.attribute(\"class\").to_s.split.join(\", \")  + \", #{td.text}\"\n            else\n              td.text\n            end\n          }.join(\"; \")\n        }\n\n        list = doc.css(\"table.coverage_list > tbody\").attribute(\"class\")\n        coverages.append(list.to_s)\n      end\n\n      fixtures_project.post\n\n      file = File.open(File.join(FIXTURES_HTML_FOLDER_PATH, \"index.html\"))\n      fixture_doc = Nokogiri::HTML(file)\n      file.close\n\n      file = File.open(File.join(OUTPUT_DIR_PATH, \"index.html\"))\n      current_doc = Nokogiri::HTML(file)\n      file.close\n\n      expect(extract_header_title(current_doc)).to eq(extract_header_title(fixture_doc))\n      expect(extract_title(current_doc)).to eq(extract_title(fixture_doc))\n      expect(extract_coverage_text(current_doc)).to eq(extract_coverage_text(fixture_doc))\n      expect(extract_coverage_class(current_doc)).to eq(extract_coverage_class(fixture_doc))\n      expect(extract_cov_header(current_doc)).to eq(extract_cov_header(fixture_doc))\n      expect(extract_cov_index(current_doc)).to eq(extract_cov_index(fixture_doc))\n    end\n\n    it \"should create html coverage for each file with correct coverage\" do\n      def extract_title(doc)\n        doc.css('#coverage > h2 > span').map{ |x| x.text.strip }.join(\", \")\n      end\n\n      def extract_subtitle(doc)\n        (sub = doc.at_css('h4.cov_subtitle')) ? sub.text : \"\"\n      end\n\n      def extract_filepath(doc)\n        (path = doc.at_css('h4.cov_filepath'))? path.text : \"\"\n      end\n\n      def extract_cov_data(doc)\n        doc.css(\"table.source_code > tr\").map { |tr|\n          ([tr.attribute(\"class\")] + tr.css('td').map(&:text)).join(\",\")\n        }\n      end\n\n      fixtures_project.post\n\n      fixture_html_files.each { |filename|\n        file = File.open(File.join(FIXTURES_HTML_FOLDER_PATH, filename))\n        fixture_doc = Nokogiri::HTML(file)\n        file.close\n\n        file = File.open(File.join(OUTPUT_DIR_PATH, filename))\n        current_doc = Nokogiri::HTML(file)\n        file.close\n\n        expect(extract_title(fixture_doc)).to eq(extract_title(current_doc))\n        expect(extract_subtitle(fixture_doc)).to eq(extract_subtitle(current_doc))\n        expect(extract_filepath(fixture_doc)).to eq(extract_filepath(current_doc))\n        expect(extract_cov_data(fixture_doc)).to eq(extract_cov_data(current_doc))\n      }\n    end\n\n    it \"should create an HTML report directory in the given output directory\" do\n      fixtures_project.output_directory = \"./output\"\n      fixtures_project.post\n\n      expect(Dir.exist?(fixtures_project.output_directory)).to be_truthy\n\n      FileUtils.rm_rf(fixtures_project.output_directory) if Dir.exist?(fixtures_project.output_directory)\n    end\n\n    it \"should create the default directory (html) if output directory is faulty\" do\n      fixtures_project.output_directory = \"  \"\n      fixtures_project.post\n\n      expect(Dir.exist?(OUTPUT_DIR_PATH)).to be_truthy\n    end\n\n    it \"should create a valid report when using profdata format\" do\n\n      def extract_filepath(doc)\n        (path = doc.at_css('h4.cov_filepath'))? path.text : \"\"\n      end\n\n      allow(fixtures_project).to receive(:input_format).and_return(\"profdata\")\n      allow(fixtures_project).to receive(:pathnames_per_binary).and_return([{\"filename\" => Pathname.new(\"./spec/fixtures/fixtures/other_fixtures.m\"), \"segments\" => []}])\n      allow(fixtures_project).to receive(:profdata_llvm_cov_output).and_return(\"1|     |//\n    2|     |//  other_fixtures.m\n    3|     |//  fixtures\n    4|     |//\n    5|     |//  Created by Mark Larsen on 6/24/14.\n    6|     |//  Copyright (c) 2014 marklarr. All rights reserved.\n    7|     |//\n    8|     |\n    9|     |#import \\\"other_fixtures.h\\\"\n   10|     |\n   11|     |@implementation other_fixtures\n   12|     |\n   13|     |- (void)testedMethod\n   14|    1|{\n   15|    1|    NSLog(@\\\"tested\\\");\n   16|    1|}\n   17|     |\n   18|     |- (void)untestedMethod\n   19|    0|{\n   20|    0|    NSLog(@\\\"untested\\\");\n   21|    0|}\n   22|     |\n   23|     |@end\n\")\n      fixtures_project.post\n\n      file = File.open(File.join(OUTPUT_DIR_PATH, \"other_fixtures.m.html\"))\n      doc = Nokogiri::HTML(file)\n      file.close\n\n      expect(extract_header_title(doc)).to eq(\"other_fixtures.m - Slather\")\n      expect(extract_filepath(doc)).to eq(\"spec/fixtures/fixtures/other_fixtures.m\")\n    end\n\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/json_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\nrequire 'json'\n\ndescribe Slather::CoverageService::JsonOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.binary_basename = [\"fixturesTests\", \"libfixturesTwo\"]\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"json\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return ProfdataCoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should create an JSON report spanning all coverage files\" do\n      fixtures_project.post\n\n      output_json = JSON.parse(File.read('report.json'))\n      fixture_json = JSON.parse(File.read(FIXTURES_JSON_PATH))\n\n      expect(output_json).to eq(fixture_json)\n      FileUtils.rm('report.json')\n    end\n\n    it \"should create an JSON report in the given output directory\" do\n      fixtures_project.output_directory = \"./output\"\n      fixtures_project.post\n\n      filepath = \"#{fixtures_project.output_directory}/report.json\"\n      expect(File.exist?(filepath)).to be_truthy\n\n      FileUtils.rm_rf(fixtures_project.output_directory)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/llvm_cov_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\n\ndescribe Slather::CoverageService::LlvmCovOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.binary_basename = [\"fixturesTests\", \"libfixturesTwo\"]\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"llvm_cov\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return ProfdataCoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should create an llvm-cov report spanning all coverage files\" do\n      fixtures_project.post\n\n      output_llcov = File.read('report.llcov')\n      fixture_llcov = File.read(FIXTURES_LLCOV_PATH)\n\n      output_llcov, fixture_llcov = [output_llcov, fixture_llcov].map do |llcov_doc|\n        llcov_doc.gsub(/^\\/.+:$/, '')\n      end\n\n      expect(output_llcov).to eq(fixture_llcov)\n      FileUtils.rm('report.llcov')\n    end\n\n    it \"should create an llvm-cov report in the given output directory\" do\n      fixtures_project.output_directory = \"./output\"\n      fixtures_project.post\n\n      filepath = \"#{fixtures_project.output_directory}/report.llcov\"\n      expect(File.exist?(filepath)).to be_truthy\n\n      FileUtils.rm_rf(fixtures_project.output_directory)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/simple_output_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\n\ndescribe Slather::CoverageService::SimpleOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.binary_basename = [\"fixturesTests\", \"libfixturesTwo\"]\n    proj.input_format = \"profdata\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return CoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should print out the coverage for each file, and then total coverage\" do\n      [\"spec/fixtures/fixtures/fixtures.m: 3 of 6 lines (50.00%)\",\n      \"spec/fixtures/fixtures/more_files/Branches.m: 13 of 30 lines (43.33%)\",\n      \"spec/fixtures/fixturesTests/BranchesTests.m: 16 of 16 lines (100.00%)\",\n      \"spec/fixtures/fixturesTests/fixturesTests.m: 17 of 17 lines (100.00%)\",\n      \"spec/fixtures/fixturesTests/peekaviewTests💣.m: 11 of 11 lines (100.00%)\",\n      \"spec/fixtures/fixturesTwo/fixturesTwo.m: 6 of 6 lines (100.00%)\",\n      \"Tested 66/86 statements\",\n      \"Test Coverage: 76.74%\"\n      ].each do |line|\n        expect(fixtures_project).to receive(:puts).with(line)\n      end\n\n      fixtures_project.post\n    end\n\n    describe 'ci_service reporting output' do\n\n      context \"ci_service is :teamcity\" do\n        before(:each) { fixtures_project.ci_service = :teamcity }\n\n        it \"should print out the coverage\" do\n          [\"spec/fixtures/fixtures/fixtures.m: 3 of 6 lines (50.00%)\",\n           \"spec/fixtures/fixtures/more_files/Branches.m: 13 of 30 lines (43.33%)\",\n           \"spec/fixtures/fixturesTests/BranchesTests.m: 16 of 16 lines (100.00%)\",\n           \"spec/fixtures/fixturesTests/fixturesTests.m: 17 of 17 lines (100.00%)\",\n           \"spec/fixtures/fixturesTests/peekaviewTests💣.m: 11 of 11 lines (100.00%)\",\n           \"spec/fixtures/fixturesTwo/fixturesTwo.m: 6 of 6 lines (100.00%)\",\n           \"##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='66']\",\n           \"##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='86']\",\n           \"Tested 66/86 statements\",\n           \"Test Coverage: 76.74%\"\n          ].each do |line|\n            expect(fixtures_project).to receive(:puts).with(line)\n          end\n\n          fixtures_project.post\n        end\n      end\n\n    end\n\n  end\nend\n"
  },
  {
    "path": "spec/slather/coverage_service/sonarqube_xml_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')\nrequire 'json'\n\ndescribe Slather::CoverageService::SonarqubeXmlOutput do\n\n  let(:fixtures_project) do\n    proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n    proj.build_directory = TEMP_DERIVED_DATA_PATH\n    proj.input_format = \"profdata\"\n    proj.coverage_service = \"sonarqube_xml\"\n    proj.configure\n    proj\n  end\n\n  describe '#coverage_file_class' do\n    it \"should return CoverageFile\" do\n      expect(fixtures_project.send(:coverage_file_class)).to eq(Slather::ProfdataCoverageFile)\n    end\n  end\n\n  describe '#post' do\n    it \"should create an XML report spanning all coverage files\" do\n      fixtures_project.post\n\n      file = File.open(FIXTURES_SONARQUBE_XML_PATH)\n      fixture_xml_doc = Nokogiri::XML(file)\n      file.close\n\n      file = File.open('sonarqube-generic-coverage.xml')\n      current_xml_doc = Nokogiri::XML(file)\n      file.close\n\n      expect(EquivalentXml.equivalent?(current_xml_doc, fixture_xml_doc)).to be_truthy\n    end\n\n    it \"should create an XML report in the given output directory\" do\n      fixtures_project.output_directory = \"./output\"\n      fixtures_project.post\n\n      filepath = \"#{fixtures_project.output_directory}/sonarqube-generic-coverage.xml\"\n      expect(File.exist?(filepath)).to be_truthy\n\n      FileUtils.rm_rf(fixtures_project.output_directory)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/slather/profdata_coverage_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', 'spec_helper')\n\ndescribe Slather::ProfdataCoverageFile do\n\n  let(:fixtures_project) do\n    Slather::Project.open(FIXTURES_PROJECT_PATH)\n  end\n\n  let(:profdata_coverage_file) do\n    Slather::ProfdataCoverageFile.new(fixtures_project, \"/Users/venmo/ExampleProject/AppDelegate.swift:\n       |    1|//\n       |    2|//  AppDelegate.swift\n       |    3|//  xcode7workbench01\n       |    4|//\n       |    5|//  Created by Simone Civetta on 08/06/15.\n       |    6|//  Copyright © 2015 Xebia IT Architects. All rights reserved.\n       |    7|//\n       |    8|\n       |    9|import UIKit\n       |   10|\n       |   11|@UIApplicationMain\n       |   12|class AppDelegate: UIResponder, UIApplicationDelegate {\n       |   13|\n       |   14|    var window: UIWindow?\n       |   15|\n       |   16|\n      1|   17|    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n      1|   18|        // Override point for customization after application launch.\n      1|   19|        return true\n      1|   20|    }\n       |   21|\n      0|   22|    func applicationWillResignActive(application: UIApplication) {\n      0|   23|        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n      0|   24|        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n      0|   25|    }\n       |   26|\n      0|   27|    func applicationDidEnterBackground(application: UIApplication) {\n      0|   28|        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n      0|   29|        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n      0|   30|    }\n       |   31|\n      0|   32|    func applicationWillEnterForeground(application: UIApplication) {\n      0|   33|        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n      0|   34|    }\n       |   35|\n      1|   36|    func applicationDidBecomeActive(application: UIApplication) {\n      0|   37|        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n      0|   38|    }\n       |   39|\n      0|   40|    func applicationWillTerminate(application: UIApplication) {\n      0|   41|    }\n       |   42|\n       |   43|\n       |   44|}\n       |   45|\", false)\n  end\n\n  describe \"#initialize\" do\n    it \"should create a list of lines\" do\n      expect(profdata_coverage_file.line_data.length).to eq(45)\n      expect(profdata_coverage_file.line_data[9]).to eq(\"       |    9|import UIKit\")\n    end\n  end\n\n  describe \"#all_lines\" do\n    it \"should return a list of all the lines\" do\n      expect(profdata_coverage_file.all_lines.length).to eq(45)\n      expect(profdata_coverage_file.all_lines[8]).to eq(\"       |    9|import UIKit\")\n    end\n  end\n\n  describe \"#line_number_in_line\" do\n    it \"should return the correct line number for coverage represented as decimals\" do\n      expect(profdata_coverage_file.line_number_in_line(\"      0|   40|    func applicationWillTerminate(application: UIApplication) {\", false)).to eq(40)\n    end\n\n    it \"should return the correct line number for coverage represented as thousands\" do\n      expect(profdata_coverage_file.line_number_in_line(\"  11.8k|   41|    func applicationWillTerminate(application: UIApplication) {\", false)).to eq(41)\n    end\n\n    it \"should return the correct line number for coverage represented as milions\" do\n      expect(profdata_coverage_file.line_number_in_line(\"  2.58M|   42|    func applicationWillTerminate(application: UIApplication) {\", false)).to eq(42)\n    end\n\n    it \"should handle line numbers first\" do\n      expect(profdata_coverage_file.line_number_in_line(\"   18|      1|    return a + b;\", true)).to eq(18)\n      expect(profdata_coverage_file.line_number_in_line(\"   18|  2.58M|    return a + b;\", true)).to eq(18)\n      expect(profdata_coverage_file.line_number_in_line(\"   18|  11.8k|    return a + b;\", true)).to eq(18)\n      expect(profdata_coverage_file.line_number_in_line(\"    4|       |//\", true)).to eq(4)\n    end\n  end\n\n  describe '#ignore_error_lines' do\n    it 'should ignore lines starting with - when line_numbers_first is true' do\n      expect(profdata_coverage_file.ignore_error_lines(['--------'], true)).to eq([])\n      expect(profdata_coverage_file.ignore_error_lines(['--------', 'not ignored'], true)).to eq(['not ignored'])\n    end\n\n    it 'should ignore lines starting with | when line_numbers_first is true' do\n      expect(profdata_coverage_file.ignore_error_lines(['| Unexecuted instantiation'], true)).to eq([])\n      expect(profdata_coverage_file.ignore_error_lines(['| Unexecuted instantiation', 'not ignored'], true)).to eq(['not ignored'])\n    end\n\n    it 'should not ignore any lines when line_numbers_first is false' do\n      lines = ['| Unexecuted instantiation', '------']\n      expect(profdata_coverage_file.ignore_error_lines(lines, false)).to eq(lines)\n    end\n  end\n\n  describe \"#coverage_for_line\" do\n    it \"should return the number of hits for the line\" do\n      expect(profdata_coverage_file.coverage_for_line(\"      10|   40|    func applicationWillTerminate(application: UIApplication) {\", false)).to eq(10)\n    end\n\n    it \"should return the number of hits for a line in thousands as an integer\" do\n      result = profdata_coverage_file.coverage_for_line(\"  11.8k|   49|    return result;\", false)\n      expect(result).to eq(11800)\n      expect(result).to be_a(Integer)\n    end\n\n    it \"should return the number of hits for a line in millions as an integer\" do\n      result = profdata_coverage_file.coverage_for_line(\"  2.58M|   49|    return result;\", false)\n      expect(result).to eq(2580000)\n      expect(result).to be_a(Integer)\n    end\n\n    it \"should return the number of hits for an uncovered line\" do\n      expect(profdata_coverage_file.coverage_for_line(\"      0|   49|    return result;\", false)).to eq(0)\n    end\n\n    it \"should handle line numbers first\" do\n      expect(profdata_coverage_file.coverage_for_line(\"   18|      1|    return a + b;\", true)).to eq(1)\n      expect(profdata_coverage_file.coverage_for_line(\"   18|  11.8k|    return a + b;\", true)).to eq(11800)\n      expect(profdata_coverage_file.coverage_for_line(\"   18|  2.58M|    return a + b;\", true)).to eq(2580000)\n    end\n\n    it 'should ignore errors in profdata' do\n      expect(profdata_coverage_file.coverage_for_line('------------------', true)).to eq(nil)\n    end\n  end\n\n  describe \"#num_lines_tested\" do\n    it \"should count the actual number of line tested\" do\n      expect(profdata_coverage_file.num_lines_tested).to eq(5)\n    end\n  end\n\n  describe \"#num_lines_testable\" do\n    it \"should count the actual testable number of line\" do\n      expect(profdata_coverage_file.num_lines_testable).to eq(20)\n    end\n  end\n\n  describe \"#percentage_line_tested\" do\n    it \"should count the percentage of tested lines\" do\n      expect(profdata_coverage_file.percentage_lines_tested).to eq(25)\n    end\n  end\n\n  describe \"#branch_coverage_data\" do\n    it \"should have branch data for line 19\" do\n      # these segments correspond to the only statement on line 19\n      profdata_coverage_file.segments = [[19, 9, 0, true, false], [19, 20, 1, true, false]]\n      expect(profdata_coverage_file.branch_coverage_data[19]).to eq([0,1])\n    end\n    it \"should have missing region data for line 19\" do\n      profdata_coverage_file.segments = [[19, 9, 0, true, false], [19, 20, 1, true, false]]\n      expect(profdata_coverage_file.branch_region_data[19]).to eq([[8,11]])\n    end\n    it \"should have two missing region data for line 19\" do\n      profdata_coverage_file.segments = [[19, 9, 0, true, false], [19, 20, 1, true, false], [19, 30, 0, true, false], [19, 40, 1, true, true]]\n      expect(profdata_coverage_file.branch_region_data[19]).to eq([[8,11], [29,10]])\n    end\n  end\n\n  describe \"#ignored\" do\n\n    before(:each) {\n      allow(fixtures_project).to receive(:ignore_list).and_return([])\n    }\n\n    it \"shouldn't ignore project files\" do\n      ignorable_file = Slather::ProfdataCoverageFile.new(fixtures_project, \"/Users/venmo/ExampleProject/AppDelegate.swift:\n       |    1|//\n       |    2|//  AppDelegate.swift\n       |    3|//  xcode7workbench01\", false)\n\n      expect(ignorable_file.ignored?).to be_falsy\n    end\n\n    it \"should ignore platform files\" do\n      ignorable_file = Slather::ProfdataCoverageFile.new(fixtures_project, \"../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTestAssertionsImpl.h:\n       |    1|//\n       |    2|//  AppDelegate.swift\n       |    3|//  xcode7workbench01\", false)\n\n      expect(ignorable_file.ignored?).to be_truthy\n    end\n\n    it \"should ignore warnings\" do\n      ignorable_file = Slather::ProfdataCoverageFile.new(fixtures_project, \"warning The file '/Users/ci/.ccache/tmp/CALayer-KI.stdout.macmini08.92540.QAQaxt.mi' isn't covered.\", false)\n\n      expect(ignorable_file.ignored?).to be_truthy\n    end\n\n  end\n\nend\n"
  },
  {
    "path": "spec/slather/project_spec.rb",
    "content": "require File.join(File.dirname(__FILE__), '..', 'spec_helper')\n\ndescribe Slather::Project do\n\n  FIXTURES_PROJECT_SETUP_PATH = 'fixtures_setup.xcodeproj'\n\n  let(:fixtures_project) do\n    Slather::Project.open(FIXTURES_PROJECT_PATH)\n  end\n\n  describe \"#build_directory\" do\n    it \"should return the build_directory property, if it has been explicitly set\" do\n      build_directory_mock = double(String)\n      fixtures_project.build_directory = build_directory_mock\n      expect(fixtures_project.build_directory).to eq(build_directory_mock)\n    end\n  end\n\n  describe \"::yml\" do\n    before(:each) { Slather::Project.instance_variable_set(\"@yml\", nil) }\n\n    context \".slather.yml file exists\" do\n      before(:all) { File.open(\".slather.yml\", \"w\") { |f| f.write(\"two: 2\") } }\n      after(:all) { File.delete(\".slather.yml\") }\n\n      it \"should load and return .slather.yml, if it exists\" do\n        expect(Slather::Project.yml).to eq({\"two\" => 2})\n      end\n    end\n\n    context \".slather.yml file doesn't exist\" do\n      it \"should return an empy hash\" do\n        expect(Slather::Project.yml).to eq({})\n      end\n    end\n  end\n\n  describe \"#coverage_files\" do\n    class SpecCoverageFile < Slather::CoverageFile\n    end\n\n    before(:each) do\n      allow(Dir).to receive(:[]).and_call_original\n      allow(Dir).to receive(:[]).with(\"#{fixtures_project.build_directory}/**/*.gcno\").and_return([\"/some/path/fixtures.gcno\",\n                                                                                  \"/some/path/peekaview.gcno\",\n                                                                                  \"/some/path/fixturesTests.gcno\",\n                                                                                  \"/some/path/peekaviewTests💣.gcno\",\n                                                                                  \"/some/path/NotInProject.gcno\",\n                                                                                  \"/some/path/NSRange.gcno\"])\n      allow(fixtures_project).to receive(:coverage_file_class).and_return(SpecCoverageFile)\n    end\n\n    it \"should return coverage file objects of type coverage_file_class for unignored project files\" do\n      fixtures_project.ignore_list = [\"*fixturesTests*\"]\n      allow(fixtures_project).to receive(:dedupe) { |coverage_files| coverage_files }\n      coverage_files = fixtures_project.coverage_files\n      coverage_files.each { |cf| expect(cf.kind_of?(SpecCoverageFile)).to be_truthy }\n      expect(coverage_files.map { |cf| cf.source_file_pathname.basename.to_s }).to eq([\"fixtures.m\", \"peekaview.m\"])\n    end\n\n    it \"should raise an exception if no unignored project coverage file files were found\" do\n      fixtures_project.ignore_list = [\"*fixturesTests*\", \"*fixtures*\"]\n      expect {fixtures_project.coverage_files}.to raise_error(StandardError)\n    end\n  end\n\n  describe \"#profdata_coverage_files with large file lists\" do\n    class SpecXcode7CoverageFile < Slather::ProfdataCoverageFile\n    end\n\n    llvm_cov_export_output = %q(\n        {\n           \"data\":[\n              {\n                 \"files\":[\n                    {\n                       \"filename\":\"spec/fixtures/fixtures/Fixtures.swift\"\n                    }\n                 ]\n              },\n              {\n                 \"files\":[\n                    {\n                       \"filename\":\"spec/fixtures/fixtures/Fixtures.swift\"\n                    }\n                 ]\n              }\n           ]\n        })\n\n    profdata_llvm_cov_output = \"#{FIXTURES_SWIFT_FILE_PATH}:\n       |    0|\n       |    1|import UIKit\n       |    2|\n       |    3|@UIApplicationMain\n       |    4|class AppDelegate: UIResponder, UIApplicationDelegate {\n       |    5|\n       |    6|    var window: UIWindow?\n       |    7|\n      1|    8|    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n      1|    9|        return true\n      1|   10|    }\n       |   11|\n      0|   12|    func applicationWillResignActive(application: UIApplication) {\n      0|   13|    }\n      0|   14|}\"\n\n    before(:each) do\n      allow(Dir).to receive(:[]).and_call_original\n      allow(Dir).to receive(:[]).with(\"#{fixtures_project.build_directory}/**/Coverage.profdata\").and_return([\"/some/path/Coverage.profdata\"])\n      allow(fixtures_project).to receive(:binary_file).and_return([\"Fixtures\"])\n      allow(fixtures_project).to receive(:llvm_cov_export_output).and_return(llvm_cov_export_output)\n      allow(fixtures_project).to receive(:coverage_file_class).and_return(SpecXcode7CoverageFile)\n      allow(fixtures_project).to receive(:ignore_list).and_return([])\n    end\n\n    it \"Should catch Errno::E2BIG and re-raise if the input is too large to split into multiple chunks\" do\n      allow(fixtures_project).to receive(:unsafe_profdata_llvm_cov_output).and_raise(Errno::E2BIG)\n      expect { fixtures_project.send(:profdata_coverage_files) }.to raise_error(Errno::E2BIG, \"Argument list too long. A path in your project is close to the E2BIG limit. https://github.com/SlatherOrg/slather/pull/414\")\n    end\n\n    it \"Should catch Errno::E2BIG and return Coverage.profdata file objects when the work can be split into two\" do\n      allow(fixtures_project).to receive(:unsafe_profdata_llvm_cov_output).once { \n        # raise once and then insert the stub\n        allow(fixtures_project).to receive(:profdata_llvm_cov_output).and_return(profdata_llvm_cov_output)\n        raise Errno::E2BIG \n      }\n      profdata_coverage_files = fixtures_project.send(:profdata_coverage_files)\n      profdata_coverage_files.each { |cf| expect(cf.kind_of?(SpecXcode7CoverageFile)).to be_truthy }\n      expect(profdata_coverage_files.map { |cf| cf.source_file_pathname.basename.to_s }).to eq([\"Fixtures.swift\", \"Fixtures.swift\"])\n    end\n  end\n\n  describe \"#profdata_coverage_files\" do\n    class SpecXcode7CoverageFile < Slather::ProfdataCoverageFile\n    end\n\n    llvm_cov_export_output = %q(\n        {\n           \"data\":[\n              {\n                 \"files\":[\n                    {\n                       \"filename\":\"spec/fixtures/fixtures/Fixtures.swift\"\n                    }\n                 ]\n              }\n           ]\n        })\n\n    profdata_llvm_cov_output = \"#{FIXTURES_SWIFT_FILE_PATH}:\n       |    0|\n       |    1|import UIKit\n       |    2|\n       |    3|@UIApplicationMain\n       |    4|class AppDelegate: UIResponder, UIApplicationDelegate {\n       |    5|\n       |    6|    var window: UIWindow?\n       |    7|\n      1|    8|    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n      1|    9|        return true\n      1|   10|    }\n       |   11|\n      0|   12|    func applicationWillResignActive(application: UIApplication) {\n      0|   13|    }\n      0|   14|}\"\n\n    before(:each) do\n      allow(Dir).to receive(:[]).and_call_original\n      allow(Dir).to receive(:[]).with(\"#{fixtures_project.build_directory}/**/Coverage.profdata\").and_return([\"/some/path/Coverage.profdata\"])\n      allow(fixtures_project).to receive(:binary_file).and_return([\"Fixtures\"])\n      allow(fixtures_project).to receive(:llvm_cov_export_output).and_return(llvm_cov_export_output)\n      allow(fixtures_project).to receive(:profdata_llvm_cov_output).and_return(profdata_llvm_cov_output)\n      allow(fixtures_project).to receive(:coverage_file_class).and_return(SpecXcode7CoverageFile)\n      allow(fixtures_project).to receive(:ignore_list).and_return([])\n    end\n\n    it \"should return Coverage.profdata file objects\" do\n      profdata_coverage_files = fixtures_project.send(:profdata_coverage_files)\n      profdata_coverage_files.each { |cf| expect(cf.kind_of?(SpecXcode7CoverageFile)).to be_truthy }\n      expect(profdata_coverage_files.map { |cf| cf.source_file_pathname.basename.to_s }).to eq([\"Fixtures.swift\"])\n    end\n\n    it \"should ignore files from the ignore list\" do\n      allow(fixtures_project).to receive(:ignore_list).and_return([\"**/Fixtures.swift\"])\n      profdata_coverage_files = fixtures_project.send(:profdata_coverage_files)\n      expect(profdata_coverage_files.count).to eq(0)\n    end\n  end\n\n  describe \"#invalid_characters\" do\n    it \"should correctly encode invalid characters\" do\n      allow(fixtures_project).to receive(:input_format).and_return(\"profdata\")\n      allow(fixtures_project).to receive(:ignore_list).and_return([])\n      allow(Dir).to receive(:[]).with(\"#{fixtures_project.build_directory}/**/Coverage.profdata\").and_return([\"/some/path/Coverage.profdata\"])\n      allow(fixtures_project).to receive(:binary_file).and_return([\"Fixtures\"])\n      allow(fixtures_project).to receive(:unsafe_llvm_cov_export_output).and_return(\"\n      {\n         \\\"data\\\":[\n            {\n               \\\"files\\\":[\n                  {\n                     \\\"filename\\\":\\\"sp\\145c/fixtures/fixtures/fixtures.m\\\"\n                  }\n               ]\n            }\n         ]\n      }\")\n      allow(fixtures_project).to receive(:unsafe_profdata_llvm_cov_output).and_return(\"#{FIXTURES_SWIFT_FILE_PATH}:\n      1|    8|    func application(application: \\255, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n      1|    9|        return true\n      0|   14|}\")\n      fixtures_project.extend(Slather::CoverageService::HtmlOutput)\n      profdata_coverage_files = fixtures_project.send(:profdata_coverage_files)\n      expect(profdata_coverage_files.count).to eq(1)\n    end\n  end\n\n  describe \"#binary_file\" do\n\n    let(:build_directory) do\n      TEMP_DERIVED_DATA_PATH\n    end\n\n    before(:each) do\n      allow(Dir).to receive(:[]).and_call_original\n      allow(fixtures_project).to receive(:build_directory).and_return(build_directory)\n      allow(fixtures_project).to receive(:input_format).and_return(\"profdata\")\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixtures\")\n      allow(Dir).to receive(:[]).with(\"#{build_directory}/**/CodeCoverage/FixtureScheme\").and_return([\"#{build_directory}/Build/Intermediates/CodeCoverage/FixtureScheme\"])\n      allow(Dir).to receive(:[]).with(\"#{build_directory}/Build/Intermediates/CodeCoverage/FixtureScheme/**/*.xctest\").and_return([\"#{build_directory}/Build/Intermediates/CodeCoverage/FixtureScheme/FixtureAppTests.xctest\"])\n    end\n\n    it \"should use binary_file\" do\n      fixtures_project.binary_file = [\"/path/to/binary\"]\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location.count).to eq(1)\n      expect(binary_file_location.first).to eq(\"/path/to/binary\")\n    end\n\n    it \"should find the product path provided a scheme\" do\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixtures\")\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location.count).to eq(2)\n      expect(binary_file_location.first).to end_with(\"Debug/FixtureFramework.framework/Versions/A/FixtureFramework\")\n      expect(binary_file_location.last).to end_with(\"Debug/fixturesTests.xctest/Contents/MacOS/fixturesTests\")\n    end\n\n    it \"should find the product path provided a workspace and scheme\" do\n      allow(fixtures_project).to receive(:workspace).and_return(\"fixtures.xcworkspace\")\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixtures\")\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location.count).to eq(2)\n      expect(binary_file_location.first).to end_with(\"Debug/FixtureFramework.framework/Versions/A/FixtureFramework\")\n      expect(binary_file_location.last).to end_with(\"Debug/fixturesTests.xctest/Contents/MacOS/fixturesTests\")\n    end\n\n    it \"should find the product path for a scheme with no buildable products\" do\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixturesTests\")\n      allow(fixtures_project).to receive(:arch).and_return(\"x86_64\")\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location.count).to eq(1)\n      expect(binary_file_location.first).to end_with(\"Debug/fixturesTests.xctest/Contents/MacOS/fixturesTests\")\n    end\n\n    it \"should not find a product path for an invalid architecture\" do\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixturesTests\")\n      allow(fixtures_project).to receive(:arch).and_return(\"arm64\")\n      expect { fixtures_project.send(:configure_binary_file) }.to raise_error.with_message(/No product binary found in (.+)./)\n    end\n\n    it \"should find multiple unique paths for a scheme with serveral buildable/testable products\" do\n      allow(fixtures_project).to receive(:scheme).and_return(\"aggregateFixturesTests\")\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location).to contain_exactly(\n                                          end_with(\"Debug/fixturesTests.xctest/Contents/MacOS/fixturesTests\"),\n                                          end_with(\"Debug/fixturesTestsSecond.xctest/Contents/MacOS/fixturesTestsSecond\"),\n                                      )\n    end\n\n    let(:fixture_yaml) do\n        yaml_text = <<-EOF\n          binary_file: \"/FixtureScheme/From/Yaml/Contents/MacOS/FixturesFromYaml\"\n        EOF\n        yaml = YAML.load(yaml_text)\n    end\n\n    it \"should configure the binary_file from yml\" do\n      allow(Slather::Project).to receive(:yml).and_return(fixture_yaml)\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location).to eq([\"/FixtureScheme/From/Yaml/Contents/MacOS/FixturesFromYaml\"])\n    end\n\n    let(:other_fixture_yaml) do\n      yaml_text = <<-EOF\n        binary_basename: \"fixtures\"\n      EOF\n      yaml = YAML.load(yaml_text)\n    end\n\n    it \"should configure the binary_basename from yml\" do\n      allow(Slather::Project).to receive(:yml).and_return(other_fixture_yaml)\n      allow(Dir).to receive(:[]).with(\"#{build_directory}/Build/Intermediates/CodeCoverage/Products/Debug/fixtureTests.xctest\").and_return([\"fixtureTests.xctest\"])\n      fixtures_project.send(:configure_binary_file)\n      binary_file_location = fixtures_project.send(:binary_file)\n      expect(binary_file_location.count).to eq(1)\n      expect(binary_file_location.first).to end_with(\"/fixturesTests.xctest/Contents/MacOS/fixturesTests\")\n    end\n  end\n\n  describe \"#dedupe\" do\n    it \"should return a deduplicated list of coverage files, favoring the file with higher coverage\" do\n      coverage_file_1 = double(Slather::CoverageFile)\n      allow(coverage_file_1).to receive(:source_file_pathname).and_return(\"some/path/class1.m\")\n      allow(coverage_file_1).to receive(:percentage_lines_tested).and_return(100)\n\n      coverage_file_2 = double(Slather::CoverageFile)\n      allow(coverage_file_2).to receive(:source_file_pathname).and_return(\"some/path/class2.m\")\n      allow(coverage_file_2).to receive(:percentage_lines_tested).and_return(100)\n\n      coverage_file_2b = double(Slather::CoverageFile)\n      allow(coverage_file_2b).to receive(:source_file_pathname).and_return(\"some/path/class2.m\")\n      allow(coverage_file_2b).to receive(:percentage_lines_tested).and_return(0)\n\n      coverage_files = [coverage_file_1, coverage_file_2, coverage_file_2b]\n      deduped_coverage_files = fixtures_project.send(:dedupe, coverage_files)\n      expect(deduped_coverage_files.size).to eq(2)\n      expect(deduped_coverage_files).to include(coverage_file_1)\n      expect(deduped_coverage_files).to include(coverage_file_2)\n    end\n  end\n\n  describe \"#configure\" do\n    it \"should configure all properties from the yml\" do\n      unstubbed_project = Slather::Project.open(FIXTURES_PROJECT_PATH)\n      expect(unstubbed_project).to receive(:configure_build_directory)\n      expect(unstubbed_project).to receive(:configure_source_directory)\n      expect(unstubbed_project).to receive(:configure_ignore_list)\n      expect(unstubbed_project).to receive(:configure_ci_service)\n      expect(unstubbed_project).to receive(:configure_coverage_service)\n      expect(unstubbed_project).to receive(:configure_input_format)\n      expect(unstubbed_project).to receive(:configure_scheme)\n      expect(unstubbed_project).to receive(:configure_configuration)\n      expect(unstubbed_project).to receive(:configure_workspace)\n      unstubbed_project.configure\n    end\n  end\n\n  describe \"#configure_ignore_list\" do\n    it \"should set the ignore_list if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"ignore\" => [\"test\", \"ing\"] })\n      fixtures_project.configure_ignore_list\n      expect(fixtures_project.ignore_list).to eq([\"test\", \"ing\"])\n    end\n\n    it \"should force the ignore_list into an array\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"ignore\" => \"test\" })\n      fixtures_project.configure_ignore_list\n      expect(fixtures_project.ignore_list).to eq([\"test\"])\n    end\n\n    it \"should not set the ignore_list if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"ignore\" => [\"test\", \"ing\"] })\n      fixtures_project.ignore_list = [\"already\", \"set\"]\n      fixtures_project.configure_ignore_list\n      expect(fixtures_project.ignore_list).to eq([\"already\", \"set\"])\n    end\n\n    it \"should default the ignore_list to an empty array if nothing is provided in the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({})\n      fixtures_project.configure_ignore_list\n      expect(fixtures_project.ignore_list).to eq([])\n    end\n  end\n\n  describe \"#configure_build_directory\" do\n    it \"should set the build_directory if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"build_directory\" => \"/some/path\"})\n      fixtures_project.configure_build_directory\n      expect(fixtures_project.build_directory).to eq(\"/some/path\")\n    end\n\n    it \"should not set the build_directory if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"build_directory\" => \"/some/path\"})\n      fixtures_project.build_directory = \"/already/set\"\n      fixtures_project.configure_build_directory\n      expect(fixtures_project.build_directory).to eq(\"/already/set\")\n    end\n\n    it \"should default the build_directory to derived data if nothing is provided in the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({})\n      fixtures_project.configure_build_directory\n      expect(fixtures_project.build_directory).to eq(fixtures_project.send(:derived_data_path))\n    end\n  end\n\n  describe \"#configure_source_directory\" do\n    it \"should set the source_directory if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"source_directory\" => \"/some/path\"})\n      fixtures_project.configure_source_directory\n      expect(fixtures_project.source_directory).to eq(\"/some/path\")\n    end\n\n    it \"should not set the source_directory if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"source_directory\" => \"/some/path\"})\n      fixtures_project.source_directory = \"/already/set\"\n      fixtures_project.configure_source_directory\n      expect(fixtures_project.source_directory).to eq(\"/already/set\")\n    end\n  end\n\n  describe \"#configure_output_directory\" do\n    it \"should set the output_directory if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"output_directory\" => \"/some/path\"})\n      fixtures_project.configure_output_directory\n      expect(fixtures_project.output_directory).to eq(\"/some/path\")\n    end\n\n    it \"should not set the output_directory if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"output_directory\" => \"/some/path\"})\n      fixtures_project.output_directory = \"/already/set\"\n      fixtures_project.configure_output_directory\n      expect(fixtures_project.output_directory).to eq(\"/already/set\")\n    end\n  end\n\n  describe \"#configure_configuration\" do\n    it \"should set the configuration if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"configuration\" => \"Release\"})\n      fixtures_project.configure_configuration\n      expect(fixtures_project.configuration).to eq(\"Release\")\n    end\n\n    it \"should not set the configuration if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"configuration\" => \"Release\"})\n      fixtures_project.configuration = \"Debug\"\n      fixtures_project.configure_configuration\n      expect(fixtures_project.configuration).to eq(\"Debug\")\n    end\n  end\n\n  describe \"#configure_workspace\" do\n    it \"should set the workspace if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"workspace\" => \"fixtures.xcworkspace\"})\n      fixtures_project.configure_workspace\n      expect(fixtures_project.workspace).to eq(\"fixtures.xcworkspace\")\n    end\n\n    it \"should not set the workspace if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"workspace\" => \"fixtures.xcworkspace\"})\n      fixtures_project.workspace = \"MyWorkspace.xcworkspace\"\n      fixtures_project.configure_workspace\n      expect(fixtures_project.workspace).to eq(\"MyWorkspace.xcworkspace\")\n    end\n  end\n\n  describe \"#configure_ci_service\" do\n    it \"should set the ci_service if it has been provided in the yml and has not already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"ci_service\" => \"some_service\"})\n      fixtures_project.configure_ci_service\n      expect(fixtures_project.ci_service).to eq(:some_service)\n    end\n\n    it \"should not set the ci_service if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"ci_service\" => \"some service\"})\n      fixtures_project.ci_service = \"already_set\"\n      fixtures_project.configure_ci_service\n      expect(fixtures_project.ci_service).to eq(:already_set)\n    end\n\n    it \"should default the ci_service to :travis_ci if nothing is provided in the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({})\n      fixtures_project.configure_ci_service\n      expect(fixtures_project.ci_service).to eq(:travis_ci)\n    end\n  end\n\n  describe \"#ci_service=\" do\n    it \"should set the ci_service as a symbol\" do\n      fixtures_project.ci_service = \"foobar\"\n      expect(fixtures_project.ci_service).to eq(:foobar)\n    end\n  end\n\n  describe \"#configure_coverage_service\" do\n    it \"should set the coverage_service if it has been provided by the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"coverage_service\" => \"some_service\"})\n      expect(fixtures_project).to receive(:coverage_service=).with(\"some_service\")\n      fixtures_project.configure_coverage_service\n    end\n\n    it \"should default the coverage_service to :terminal if nothing is provided in the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({})\n      expect(fixtures_project).to receive(:coverage_service=).with(:terminal)\n      fixtures_project.configure_coverage_service\n    end\n\n    it \"should not set the coverage_service if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"coverage_service\" => \"some_service\" })\n      allow(fixtures_project).to receive(:coverage_service).and_return(\"already set\")\n      expect(fixtures_project).to_not receive(:coverage_service=)\n      fixtures_project.configure_coverage_service\n    end\n  end\n\n  describe \"#configure_coverage_access_token\" do\n    it \"should set the coverage_access_token if it has been provided by the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"coverage_access_token\" => \"abc123\"})\n      expect(fixtures_project).to receive(:coverage_access_token=).with(\"abc123\")\n      fixtures_project.configure_coverage_access_token\n    end\n\n    it \"should set the coverage_access_token if it is in the ENV\" do\n      stub_const('ENV', ENV.to_hash.merge('COVERAGE_ACCESS_TOKEN' => 'asdf456'))\n      expect(fixtures_project).to receive(:coverage_access_token=).with(\"asdf456\")\n      fixtures_project.configure_coverage_access_token\n    end\n\n  end\n\n  describe \"#configure_input_format\" do\n    it \"should set the input_format if it has been provided by the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"input_format\" => \"gcov\"})\n      fixtures_project.configure_input_format\n      expect(fixtures_project.input_format).to eq(\"gcov\")\n    end\n\n    it \"should default the input_format to auto if nothing is provided in the yml\" do\n      allow(Slather::Project).to receive(:yml).and_return({})\n      expect(fixtures_project).to receive(:input_format=).with(\"auto\")\n      fixtures_project.configure_input_format\n    end\n\n    it \"should not set the input_format if it has already been set\" do\n      allow(Slather::Project).to receive(:yml).and_return({\"input_format\" => \"some_format\" })\n      fixtures_project.input_format = \"gcov\"\n      expect(fixtures_project).to_not receive(:input_format=)\n      fixtures_project.configure_input_format\n    end\n\n  end\n\n  describe \"#coverage_service=\" do\n    it \"should extend Slather::CoverageService::Coveralls and set coverage_service = :coveralls if given coveralls\" do\n      expect(fixtures_project).to receive(:extend).with(Slather::CoverageService::Coveralls)\n      fixtures_project.coverage_service = \"coveralls\"\n      expect(fixtures_project.coverage_service).to eq(:coveralls)\n    end\n\n    it \"should extend Slather::CoverageService::SimpleOutput and set coverage_service = :terminal if given terminal\" do\n      expect(fixtures_project).to receive(:extend).with(Slather::CoverageService::SimpleOutput)\n      fixtures_project.coverage_service = \"terminal\"\n      expect(fixtures_project.coverage_service).to eq(:terminal)\n    end\n\n    it \"should raise an exception if it does not recognize the coverage service\" do\n      expect { fixtures_project.coverage_service = \"xcode bots, lol\" }.to raise_error(StandardError)\n    end\n  end\n\n  describe \"#slather_setup_for_coverage\" do\n\n    let(:fixtures_project_setup) do\n      FileUtils.cp_r \"#{FIXTURES_PROJECT_PATH}/\", \"#{FIXTURES_PROJECT_SETUP_PATH}/\"\n      allow_any_instance_of(Slather::Project).to receive(:configure)\n      Slather::Project.open(FIXTURES_PROJECT_SETUP_PATH)\n    end\n\n    after(:each) do\n      FileUtils.rm_rf(FIXTURES_PROJECT_SETUP_PATH)\n    end\n\n    it \"should enable the correct flags to generate test coverage on all of the build_configurations build settings\" do\n      fixtures_project_setup.slather_setup_for_coverage\n      fixtures_project_setup.build_configurations.each do |build_configuration|\n        expect(build_configuration.build_settings[\"GCC_INSTRUMENT_PROGRAM_FLOW_ARCS\"]).to eq(\"YES\")\n        expect(build_configuration.build_settings[\"GCC_GENERATE_TEST_COVERAGE_FILES\"]).to eq(\"YES\")\n      end\n    end\n\n    it \"should apply Xcode7 enableCodeCoverage setting\" do\n      fixtures_project_setup.slather_setup_for_coverage\n      schemes_path = Xcodeproj::XCScheme.shared_data_dir(fixtures_project_setup.path)\n      Xcodeproj::Project.schemes(fixtures_project_setup.path).each do |scheme_name|\n        xcscheme_path = \"#{schemes_path + scheme_name}.xcscheme\"\n        xcscheme = Xcodeproj::XCScheme.new(xcscheme_path)\n        expect(xcscheme.test_action.xml_element.attributes['codeCoverageEnabled']).to eq(\"YES\")\n      end\n    end\n\n    it \"should fail for unknown coverage type\" do\n      expect { fixtures_project_setup.slather_setup_for_coverage \"this should fail\" }.to raise_error(StandardError)\n    end\n  end\n\n  describe \"#verbose_mode\" do\n\n    let(:fixtures_project) do\n      proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n      proj.build_directory = TEMP_DERIVED_DATA_PATH\n      proj.input_format = \"profdata\"\n      proj.verbose_mode = true\n      proj.configure\n      proj\n    end\n\n    it \"should print out environment info when in verbose_mode\" do\n      project_root = Pathname(\"./\").realpath\n\n      [/\\nProcessing coverage file: #{project_root}\\/spec\\/DerivedData\\/libfixtures\\/Build\\/ProfileData\\/[A-Z0-9-]+\\/Coverage.profdata/,\n       \"Against binary files:\",\n       \"\\t#{project_root}/spec/DerivedData/libfixtures/Build/Products/Debug/fixturesTests.xctest/Contents/MacOS/fixturesTests\",\n       \"\\n\"\n      ].each do |line|\n        expect(fixtures_project).to receive(:puts).with(line)\n      end\n\n      fixtures_project.send(:configure)\n    end\n\n    it \"should print error when no binaries found\" do\n      allow(fixtures_project).to receive(:binary_file).and_return(nil)\n\n      project_root = Pathname(\"./\").realpath\n\n      [/\\nProcessing coverage file: #{project_root}\\/spec\\/DerivedData\\/libfixtures\\/Build\\/ProfileData\\/[A-Z0-9-]+\\/Coverage.profdata/,\n       \"No binary files found.\",\n       \"\\n\",\n      ].each do |line|\n        expect(fixtures_project).to receive(:puts).with(line)\n      end\n\n      fixtures_project.send(:configure)\n    end\n  end\n\n  describe \"#source_files\" do\n\n    let(:fixtures_project) do\n      proj = Slather::Project.open(FIXTURES_PROJECT_PATH)\n      proj.build_directory = TEMP_DERIVED_DATA_PATH\n      proj.input_format = \"profdata\"\n      proj.source_files = [\"./**/fixtures{,Two}.m\"]\n      proj.binary_basename = [\"fixturesTests\", \"libfixturesTwo\"]\n      proj.configure\n      proj\n    end\n\n    it \"should find relevant source files\" do\n      source_files = fixtures_project.find_source_files\n      expect(source_files.count).to eq(2)\n      expect(source_files.first.to_s).to include(\"fixturesTwo.m\")\n      expect(source_files.last.to_s).to include(\"fixtures.m\")\n    end\n\n    it \"should print out the coverage for each file, and then total coverage\" do\n      allow(fixtures_project).to receive(:llvm_cov_export_output).and_return(%q(\n        {\n           \"data\":[\n              {\n                 \"files\":[\n                    {\n                       \"filename\":\"spec/fixtures/fixtures/fixtures.m\",\n                       \"segments\": []\n                    },\n                    {\n                       \"filename\":\"spec/fixtures/fixturesTwo/fixturesTwo.m\",\n                       \"segments\": []\n                    }\n                 ]\n              }\n           ]\n        }\n      ))\n      [\"spec/fixtures/fixtures/fixtures.m: 3 of 6 lines (50.00%)\",\n      \"spec/fixtures/fixturesTwo/fixturesTwo.m: 6 of 6 lines (100.00%)\",\n      \"Tested 9/12 statements\",\n      \"Test Coverage: 75.00%\"\n      ].each do |line|\n        expect(fixtures_project).to receive(:puts).with(line)\n      end\n      fixtures_project.post\n    end\n  end\n\n  def decimal_f *args\n    fixtures_project.decimal_f *args\n  end\n\n  describe '#decimal_f' do\n    it 'should preserve length 2 decimals for backwards compatibility' do\n      expect(decimal_f('100.00')).to eq('100.00')\n      expect(decimal_f('50.00')).to eq('50.00')\n    end\n\n    it 'should convert length >= 3 decimals to floats' do\n      fixtures_project.decimals = 3\n      expect(decimal_f('100.000')).to eq('100.0')\n      expect(decimal_f('50.00000')).to eq('50.0')\n    end\n  end\n\n  describe '#find_binary_files' do\n    let(:configuration) { 'Debug' }\n    let(:project_root) { Pathname(\"./\").realpath }\n    let(:coverage_dir) { \"#{project_root}/spec/DerivedData/DerivedData/Build/Intermediates/CodeCoverage\" }\n    let(:search_dir) { \"#{coverage_dir}/../../Products/#{configuration}*/fixtures*\" }\n    let(:binary_file) { \"#{coverage_dir}/Products/#{configuration}-iphonesimulator/fixtures.app/fixtures\" }\n\n    before do\n      allow(fixtures_project).to receive(:scheme).and_return(\"fixtures\")\n      allow(fixtures_project).to receive(:workspace).and_return(\"fixtures.xcworkspace\")\n      allow(fixtures_project).to receive(:binary_basename).and_return([\"fixtures\"])\n      allow(fixtures_project).to receive(:profdata_coverage_dir).and_return(coverage_dir)\n      allow(Dir).to receive(:[]).with(search_dir).and_return([binary_file])\n    end\n\n    context 'load configuration from xcsheme' do\n      it \"search binary from 'Products/Debug*'\" do\n        expect(fixtures_project.find_binary_files).to eq([binary_file])\n      end\n    end\n\n    context 'load configuration from option' do\n      let(:configuration) { 'Release' }\n      it \"search binary from 'Products/Release*'\" do\n        fixtures_project.configuration = configuration\n        expect(fixtures_project.find_binary_files).to eq([binary_file])\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/spec_helper.rb",
    "content": "if ENV['SIMPLECOV']\n  require 'simplecov'\n  SimpleCov.start\nelsif ENV['TRAVIS']\n  require 'coveralls'\n  Coveralls.wear!\nend\n\nrequire 'slather'\nrequire 'pry'\nrequire 'json_spec'\nrequire 'equivalent-xml'\n\n\nFIXTURES_XML_PATH = File.join(File.dirname(__FILE__), 'fixtures/cobertura.xml')\nFIXTURES_SONARQUBE_XML_PATH = File.join(File.dirname(__FILE__), 'fixtures/sonarqube-generic-coverage.xml')\nFIXTURES_JSON_PATH = File.join(File.dirname(__FILE__), 'fixtures/report.json')\nFIXTURES_LLCOV_PATH = File.join(File.dirname(__FILE__), 'fixtures/report.llcov')\nFIXTURES_GUTTER_JSON_PATH = File.join(File.dirname(__FILE__), 'fixtures/gutter.json')\nFIXTURES_HTML_FOLDER_PATH = File.join(File.dirname(__FILE__), 'fixtures/fixtures_html')\nFIXTURES_PROJECT_PATH = File.join(File.dirname(__FILE__), 'fixtures/fixtures.xcodeproj')\nFIXTURES_WORKSPACE_PATH = File.join(File.dirname(__FILE__), 'fixtures/fixtures.xcworkspace')\nFIXTURES_SWIFT_FILE_PATH = File.join(File.dirname(__FILE__), 'fixtures/fixtures/Fixtures.swift')\nTEMP_DERIVED_DATA_PATH = File.join(File.dirname(__FILE__), 'DerivedData')\nTEMP_PROJECT_BUILD_PATH = File.join(TEMP_DERIVED_DATA_PATH, \"libfixtures\")\nTEMP_WORKSPACE_BUILD_PATH = File.join(TEMP_DERIVED_DATA_PATH, \"libfixtures\")\nTEMP_OBJC_GCNO_PATH = File.join(File.dirname(__FILE__), 'fixtures/ObjectiveC.gcno')\nTEMP_OBJC_GCDA_PATH = File.join(File.dirname(__FILE__), 'fixtures/ObjectiveC.gcda')\n\nmodule FixtureHelpers\n  def self.delete_derived_data\n    dir = Dir[TEMP_DERIVED_DATA_PATH].first\n    if dir\n      FileUtils.rm_rf(dir)\n    end\n  end\n\n  def self.delete_temp_gcov_files\n    if File.file?(TEMP_OBJC_GCNO_PATH)\n      FileUtils.rm(TEMP_OBJC_GCNO_PATH)\n    end\n\n    if File.file?(TEMP_OBJC_GCDA_PATH)\n      FileUtils.rm_f(TEMP_OBJC_GCDA_PATH)\n    end\n  end\nend\n\nRSpec.configure do |config|\n  config.before(:suite) do\n    FixtureHelpers.delete_derived_data\n    FixtureHelpers.delete_temp_gcov_files\n    `xcodebuild -project \"#{FIXTURES_PROJECT_PATH}\" -scheme fixtures -configuration Debug -derivedDataPath #{TEMP_PROJECT_BUILD_PATH} -enableCodeCoverage YES clean test`\n    `xcodebuild -workspace \"#{FIXTURES_WORKSPACE_PATH}\" -scheme aggregateFixturesTests -configuration Debug -derivedDataPath #{TEMP_WORKSPACE_BUILD_PATH} -enableCodeCoverage YES clean test`\n  end\n\n  config.after(:suite) do\n    FixtureHelpers.delete_derived_data\n    FixtureHelpers.delete_temp_gcov_files\n  end\nend\n\nJsonSpec.configure do\n  exclude_keys \"timestamp\"\nend\n"
  }
]