-------
[![Twitter: @carlostify](https://img.shields.io/badge/contact-@carlostify-blue.svg?style=flat)](https://twitter.com/carlostify)
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/nakiostudio/xcov/blob/master/LICENSE)
[![Gem](https://img.shields.io/gem/v/xcov.svg?style=flat)](http://rubygems.org/gems/xcov)
[![Gem Downloads](https://img.shields.io/gem/dt/xcov.svg?style=flat)](http://rubygems.org/gems/xcov)
**xcov** is a friendly visualizer for Xcode's code coverage files.
## Installation
```
sudo gem install xcov
```
## Features
* Built on top of [fastlane](https://fastlane.tools), you can easily plug it on to your CI environment.
* Blacklisting of those files which coverage you want to ignore.
* Minimum acceptable coverage percentage.
* Compatible with [Coveralls](https://coveralls.io).
* Nice HTML, JSON and Markdown reports.
* Slack integration.
## Requirements
In order to make *xcov* run you must:
* Use Xcode 7 or above.
* Have the latest version of Xcode command line tools.
* Set your project scheme as **shared**.
* Enable the **Gather coverage data** setting available on your scheme settings window.
## Usage
*xcov* analyzes the `.xccoverage` and `.xccovreport` files created after running your tests therefore, before executing xcov, you need to run your tests with either `Xcode`, `xcodebuild` or [scan](https://github.com/fastlane/fastlane/tree/master/scan). Once completed, obtain your coverage report by providing a few parameters:
```
xcov -w LystSDK.xcworkspace -s LystSDK -o xcov_output
```
### Parameters allowed
* `--workspace` `-w`: Path of your `xcworkspace` file.
* `--project` `-p`: Path of your `xcodeproj` file (optional).
* `--scheme` `-s`: Scheme of the project to analyze.
* `--configuration` `-q`: The configuration used when building the app. Defaults to 'Release' (optional).
* `--output_directory` `-o`: Path for the output folder where the report files will be saved.
* `--source_directory` `-r`: The path to project's root directory (optional).
* `--derived_data_path` `-j`: Path of your project `Derived Data` folder (optional).
* `--minimum_coverage_percentage` `-m`: Raise exception if overall coverage percentage is under this value (ie. 75.0).
* `--include_test_targets`: Enables coverage reports for `.xctest` targets.
* `--ignore_file_path` `-x`: Relative or absolute path to the file containing the list of ignored files.
* `--exclude_targets`: Comma separated list of targets to exclude from coverage report.
* `--include_targets`: Comma separated list of targets to include in coverage report.
* `--slack_url` `-i`: Incoming WebHook for your Slack group to post results (optional).
* `--slack_channel` `-e`: Slack channel where the results will be posted (optional).
* `--html_report`: Enables the creation of a html report. Enabled by default (optional).
* `--json_report`: Enables the creation of a json report (optional).
* `--markdown_report`: Enables the creation of a markdown report (optional).
* `--skip_slack`: Add this flag to avoid publishing results on Slack (optional).
* `--only_project_targets`: Display the coverage only for main project targets (e.g. skip Pods targets).
* `--disable_coveralls`: Add this flag to disable automatic submission to Coveralls.
* `--coveralls_service_name`: Name of the CI service compatible with Coveralls. i.e. travis-ci. This option must be defined along with coveralls_service_job_id (optional).
* `--coveralls_service_job_id`: Name of the current job running on a CI service compatible with Coveralls. This option must be defined along with coveralls_service_name (optional).
* `--coveralls_repo_token`: Repository token to be used by integrations not compatible with Coveralls (optional).
* `--slack_username`: The username which is used to publish to slack (optional).
* `--slack_message`: The message which is published together with a successful report (optional).
* `--legacy_support`: Enables parsing coverage reports generated by Xcode 9.2 or previous versions.
_**Note:** All paths you provide should be absolute and unescaped_
### Ignoring files
You can easily ignore the coverage for a specified set of files by adding their filenames to the *ignore file* specified with the `--ignore_file_path` parameter (this file is `.xcovignore` by default). You can also specify a wildcard expression for matching a group of files.
If you want to ignore all the files from a directory (folder), specify directory's relative path in *ignore file*. Also, specify `source_directory` if that differs from working directory (which is the default value).
Each one of the filenames you would like to ignore must be prefixed by the dash symbol `-`. In addition you can comment lines by prefixing them by `#`. Example:
```yaml
# Api files
- LSTSessionApi.swift
- LSTComponentsApi.swift
- LSTNotificationsApi.swift
# Managers
- LSTRequestManager.m
- LSTCookiesManager.m
# Utils
- LSTStateMachine.swift
# Exclude all files ending by "View.swift"
- .*View.swift
# Exclude all dependencies
- Pods
- Carthage/Checkouts
```
**Note:** Ignores are handled case-insensitively. `Pods` will match any of `pods`, `PODS`, or `Pods`.
## [Fastlane](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md)
*Fastlane 1.61.0* includes *xcov* as a custom action. You can easily create your coverage reports as follows:
```ruby
xcov(
workspace: "YourWorkspace.xcworkspace",
scheme: "YourScheme",
output_directory: "xcov_output"
)
```
## [Danger](https://danger.systems)
With the *Danger* plugin you can receive your coverage reports directly on your pull requests. You can find more information on the plugin repository available [here](https://github.com/nakiostudio/danger-xcov).
## [Coveralls](https://coveralls.io)
If you want to keep track of the coverage evolution and get some extra features, *xcov* allows you to submit coverage reports to *Coveralls*. To do so, simply create an account and run *xcov* setting the options `coveralls_service_name` and `coveralls_service_job_id` for compatible CI environments. However, if you want to post to *Coveralls* from the console or any custom environment simply set the `coveralls_repo_token` option.
## Contributors
[![nakiostudio](https://avatars2.githubusercontent.com/u/1814571?v=3&s=50)](https://github.com/nakiostudio)
[![opfeffer](https://avatars3.githubusercontent.com/u/1138127?v=3&s=50)](https://github.com/opfeffer)
[![stevenreinisch](https://avatars0.githubusercontent.com/u/675216?v=3&s=50)](https://github.com/stevenreinisch)
[![hds](https://avatars0.githubusercontent.com/u/89589?v=3&s=50)](https://github.com/hds)
[![michaelharro](https://avatars3.githubusercontent.com/u/318260?v=3&s=50)](https://github.com/michaelharro)
[![thelvis4](https://avatars1.githubusercontent.com/u/1589385?v=3&s=50)](https://github.com/thelvis4)
[![KrauseFx](https://avatars1.githubusercontent.com/u/869950?v=3&s=50)](https://github.com/KrauseFx)
[![BennX](https://avatars1.githubusercontent.com/u/4281635?v=3&s=50)](https://github.com/BennX)
[![initFabian](https://avatars1.githubusercontent.com/u/8469495?v=3&s=50)](https://github.com/initFabian)
[![revolter](https://avatars1.githubusercontent.com/u/5748627?v=3&s=50)](https://github.com/revolter)
[![chrisballinger](https://avatars1.githubusercontent.com/u/518687?v=3&s=50)](https://github.com/chrisballinger)
## License
This project is licensed under the terms of the MIT license. See the LICENSE file.