slather 1.5.1 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +18 -3
- data/bin/slather +6 -0
- data/lib/slather/coverage_service/cobertura_xml_output.rb +10 -3
- data/lib/slather/coverage_service/coveralls.rb +15 -6
- data/lib/slather/project.rb +11 -1
- data/lib/slather/version.rb +1 -1
- data/slather.gemspec +1 -0
- data/spec/slather/coverage_file_spec.rb +5 -5
- data/spec/slather/coverage_service/cobertura_xml_spec.rb +10 -0
- data/spec/slather/coverage_service/coveralls_spec.rb +19 -2
- data/spec/slather/coverage_service/gutter_json_spec.rb +3 -6
- data/spec/slather/coverage_service/simple_output_spec.rb +11 -8
- data/spec/slather/project_spec.rb +23 -0
- data/spec/spec_helper.rb +5 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c81c8298dd7e5d03d440067813e42429f437f230
|
4
|
+
data.tar.gz: 01deae864fd161f898c75d90b8c7eaab9bf4d4b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb215d533208cd99d38b18481bb11e91dc40a6db8e5e43d601229d26108d56e5fef118cc2d3aa3296459c7e7adaad8d2bc5d5886a852c30e219a1c7114ede654
|
7
|
+
data.tar.gz: a630985a0f07c4d32e158246f43e5c6e2cc2296e6944020a0f2db716d17d846256c6be4b30417e6dcf09d9bb64cc7435f9ad5ec116d8d3bb2a1797556f9f6865
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## v1.6.0
|
6
|
+
|
7
|
+
* Add an option to define the output directory for cobertura xml reports
|
8
|
+
[Julian Krumow](https://github.com/tarbrain)
|
9
|
+
[#37](https://github.com/venmo/slather/pull/37)
|
10
|
+
|
5
11
|
## v1.5.1
|
6
12
|
|
7
13
|
* Avoid crashes when coverage data is empty
|
data/README.md
CHANGED
@@ -72,24 +72,39 @@ install: bundle install --without=documentation --path ../travis_bundle_dir
|
|
72
72
|
after_success: slather
|
73
73
|
```
|
74
74
|
|
75
|
+
#### Travis CI Pro
|
76
|
+
|
77
|
+
To use Coveralls with Travis CI Pro (for private repos), add following lines along with other settings to `.slather.yml`:
|
78
|
+
|
79
|
+
```yml
|
80
|
+
# .slather.yml
|
81
|
+
|
82
|
+
ci_service: travis_pro
|
83
|
+
ci_access_token: <YOUR ACCESS TOKEN>
|
84
|
+
```
|
85
|
+
|
86
|
+
Repo token can be found at https://coveralls.io/ repo page.
|
87
|
+
|
75
88
|
### Cobertura
|
76
89
|
|
77
|
-
To create a Cobertura XML report set `cobertura_xml` as coverage service inside your `.slather.yml
|
90
|
+
To 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:
|
78
91
|
|
79
92
|
```yml
|
80
93
|
# .slather.yml
|
81
94
|
|
82
95
|
coverage_service: cobertura_xml
|
83
96
|
xcodeproj: path/to/project.xcodeproj
|
97
|
+
source_directory: path/to/sources/to/include
|
98
|
+
output_directory: path/to/xml_report
|
84
99
|
ignore:
|
85
100
|
- ExamplePodCode/*
|
86
101
|
- ProjectTestsGroup/*
|
87
102
|
```
|
88
103
|
|
89
|
-
Or use the command line options `--cobertura-xml` or `-x`:
|
104
|
+
Or use the command line options `--cobertura-xml` or `-x` and `--output_directory`:
|
90
105
|
|
91
106
|
```sh
|
92
|
-
$ slather coverage -x
|
107
|
+
$ slather coverage -x --output-directory path/to/xml_report
|
93
108
|
```
|
94
109
|
|
95
110
|
### Coverage for code included via CocoaPods
|
data/bin/slather
CHANGED
@@ -20,6 +20,7 @@ Clamp do
|
|
20
20
|
|
21
21
|
option ["--build-directory", "-b"], "BUILD_DIRECTORY", "The directory where gcno files will be written to. Defaults to derived data."
|
22
22
|
option ["--source-directory"], "SOURCE_DIRECTORY", "The directory where your source files are located."
|
23
|
+
option ["--output-directory"], "OUTPUT_DIRECTORY", "The directory where your Cobertura XML report will be written to."
|
23
24
|
option ["--ignore", "-i"], "IGNORE", "ignore files conforming to a path", :multivalued => true
|
24
25
|
|
25
26
|
def execute
|
@@ -29,6 +30,7 @@ Clamp do
|
|
29
30
|
setup_ignore_list
|
30
31
|
setup_build_directory
|
31
32
|
setup_source_directory
|
33
|
+
setup_output_directory
|
32
34
|
setup_coverage_service
|
33
35
|
|
34
36
|
post
|
@@ -44,6 +46,10 @@ Clamp do
|
|
44
46
|
project.source_directory = source_directory if source_directory
|
45
47
|
end
|
46
48
|
|
49
|
+
def setup_output_directory
|
50
|
+
project.output_directory = output_directory if output_directory
|
51
|
+
end
|
52
|
+
|
47
53
|
def setup_ignore_list
|
48
54
|
project.ignore_list = ignore_list if !ignore_list.empty?
|
49
55
|
end
|
@@ -11,9 +11,16 @@ module Slather
|
|
11
11
|
|
12
12
|
def post
|
13
13
|
cobertura_xml_report = create_xml_report(coverage_files)
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
store_report(cobertura_xml_report)
|
15
|
+
end
|
16
|
+
|
17
|
+
def store_report(report)
|
18
|
+
output_file = 'cobertura.xml'
|
19
|
+
if output_directory
|
20
|
+
FileUtils.mkdir_p(output_directory)
|
21
|
+
output_file = File.join(output_directory, output_file)
|
22
|
+
end
|
23
|
+
File.write(output_file, report.to_s)
|
17
24
|
end
|
18
25
|
|
19
26
|
def grouped_coverage_files
|
@@ -13,13 +13,22 @@ module Slather
|
|
13
13
|
private :travis_job_id
|
14
14
|
|
15
15
|
def coveralls_coverage_data
|
16
|
-
if ci_service == :travis_ci
|
16
|
+
if ci_service == :travis_ci || ci_service == :travis_pro
|
17
17
|
if travis_job_id
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
if ci_service == :travis_ci
|
19
|
+
{
|
20
|
+
:service_job_id => travis_job_id,
|
21
|
+
:service_name => "travis-ci",
|
22
|
+
:source_files => coverage_files.map(&:as_json)
|
23
|
+
}.to_json
|
24
|
+
elsif ci_service == :travis_pro
|
25
|
+
{
|
26
|
+
:service_job_id => travis_job_id,
|
27
|
+
:service_name => "travis-pro",
|
28
|
+
:repo_token => ci_access_token,
|
29
|
+
:source_files => coverage_files.map(&:as_json)
|
30
|
+
}.to_json
|
31
|
+
end
|
23
32
|
else
|
24
33
|
raise StandardError, "Environment variable `TRAVIS_JOB_ID` not set. Is this running on a travis build?"
|
25
34
|
end
|
data/lib/slather/project.rb
CHANGED
@@ -19,7 +19,7 @@ end
|
|
19
19
|
module Slather
|
20
20
|
class Project < Xcodeproj::Project
|
21
21
|
|
22
|
-
attr_accessor :build_directory, :ignore_list, :ci_service, :coverage_service, :source_directory
|
22
|
+
attr_accessor :build_directory, :ignore_list, :ci_service, :coverage_service, :ci_access_token, :source_directory, :output_directory
|
23
23
|
|
24
24
|
alias_method :setup_for_coverage, :slather_setup_for_coverage
|
25
25
|
|
@@ -70,8 +70,10 @@ module Slather
|
|
70
70
|
configure_build_directory_from_yml
|
71
71
|
configure_ignore_list_from_yml
|
72
72
|
configure_ci_service_from_yml
|
73
|
+
configure_ci_access_token_from_yml
|
73
74
|
configure_coverage_service_from_yml
|
74
75
|
configure_source_directory_from_yml
|
76
|
+
configure_output_directory_from_yml
|
75
77
|
end
|
76
78
|
|
77
79
|
def configure_build_directory_from_yml
|
@@ -82,6 +84,10 @@ module Slather
|
|
82
84
|
self.source_directory ||= self.class.yml["source_directory"] if self.class.yml["source_directory"]
|
83
85
|
end
|
84
86
|
|
87
|
+
def configure_output_directory_from_yml
|
88
|
+
self.output_directory ||= self.class.yml["output_directory"] if self.class.yml["output_directory"]
|
89
|
+
end
|
90
|
+
|
85
91
|
def configure_ignore_list_from_yml
|
86
92
|
self.ignore_list ||= [(self.class.yml["ignore"] || [])].flatten
|
87
93
|
end
|
@@ -98,6 +104,10 @@ module Slather
|
|
98
104
|
self.coverage_service ||= (self.class.yml["coverage_service"] || :terminal)
|
99
105
|
end
|
100
106
|
|
107
|
+
def configure_ci_access_token_from_yml
|
108
|
+
self.ci_access_token ||= (self.class.yml["ci_access_token"] || "")
|
109
|
+
end
|
110
|
+
|
101
111
|
def coverage_service=(service)
|
102
112
|
service = service && service.to_sym
|
103
113
|
if service == :coveralls
|
data/lib/slather/version.rb
CHANGED
data/slather.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "rspec", "~> 2.14"
|
24
24
|
spec.add_development_dependency "pry", "~> 0.9"
|
25
25
|
spec.add_development_dependency "cocoapods", "~> 0.34"
|
26
|
+
spec.add_development_dependency "json_spec", "~> 1.1.4"
|
26
27
|
|
27
28
|
spec.add_dependency "clamp", "~> 0.6"
|
28
29
|
spec.add_dependency "xcodeproj", "~> 0.19.2"
|
@@ -12,7 +12,7 @@ describe Slather::CoverageFile do
|
|
12
12
|
|
13
13
|
describe "#initialize" do
|
14
14
|
it "should convert the provided path string to a Pathname object, and set it as the gcno_file_pathname" do
|
15
|
-
expect(coverage_file.gcno_file_pathname
|
15
|
+
expect(coverage_file.gcno_file_pathname).to be_exist
|
16
16
|
expect(coverage_file.gcno_file_pathname.basename.to_s).to eq("fixtures.gcno")
|
17
17
|
end
|
18
18
|
end
|
@@ -43,7 +43,7 @@ describe Slather::CoverageFile do
|
|
43
43
|
describe "#source_file" do
|
44
44
|
it "should return a file object for the source_file_pathname" do
|
45
45
|
file = coverage_file.source_file
|
46
|
-
expect(file
|
46
|
+
expect(file).to be_a File
|
47
47
|
expect(Pathname(file.path)).to eq(coverage_file.source_file_pathname)
|
48
48
|
end
|
49
49
|
end
|
@@ -94,18 +94,18 @@ OBJC
|
|
94
94
|
describe "#ignored" do
|
95
95
|
it "should return true if the source_file_pathname globs against anything in the project.ignore_list" do
|
96
96
|
coverage_file.project.ignore_list = ["*spec*", "*test*"]
|
97
|
-
expect(coverage_file
|
97
|
+
expect(coverage_file).to be_ignored
|
98
98
|
end
|
99
99
|
|
100
100
|
it "should return false if the source_file_pathname does not glob against anything in the project.ignore_list" do
|
101
101
|
coverage_file.project.ignore_list = ["*test*", "*XCTest*"]
|
102
|
-
expect(coverage_file
|
102
|
+
expect(coverage_file).not_to be_ignored
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
106
|
describe "gcov_data" do
|
107
107
|
it "should process the gcno file with gcov and return the contents of the file" do
|
108
|
-
expect(coverage_file.gcov_data.include
|
108
|
+
expect(coverage_file.gcov_data).to include("1: 15: NSLog(@\"tested\");")
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -34,5 +34,15 @@ describe Slather::CoverageService::CoberturaXmlOutput do
|
|
34
34
|
|
35
35
|
File.unlink('cobertura.xml')
|
36
36
|
end
|
37
|
+
|
38
|
+
it "should create an XML report in the given output directory" do
|
39
|
+
fixtures_project.output_directory = "./output"
|
40
|
+
fixtures_project.post
|
41
|
+
|
42
|
+
filepath = "#{fixtures_project.output_directory}/cobertura.xml"
|
43
|
+
expect(File.exists?(filepath)).to be_truthy
|
44
|
+
|
45
|
+
FileUtils.rm_rf(fixtures_project.output_directory)
|
46
|
+
end
|
37
47
|
end
|
38
48
|
end
|
@@ -27,7 +27,24 @@ describe Slather::CoverageService::Coveralls do
|
|
27
27
|
|
28
28
|
it "should return valid json for coveralls coverage data" do
|
29
29
|
fixtures_project.stub(:travis_job_id).and_return("9182")
|
30
|
-
expect(fixtures_project.send(:coveralls_coverage_data)).to
|
30
|
+
expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql("{\"service_job_id\":\"9182\",\"service_name\":\"travis-ci\"}").excluding("source_files")
|
31
|
+
expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.send(:coverage_files).map(&:as_json).to_json).at_path("source_files")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should raise an error if there is no TRAVIS_JOB_ID" do
|
35
|
+
fixtures_project.stub(:travis_job_id).and_return(nil)
|
36
|
+
expect { fixtures_project.send(:coveralls_coverage_data) }.to raise_error(StandardError)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "coverage_service is :travis_pro" do
|
41
|
+
before(:each) { fixtures_project.ci_service = :travis_pro }
|
42
|
+
|
43
|
+
it "should return valid json for coveralls coverage data" do
|
44
|
+
fixtures_project.stub(:travis_job_id).and_return("9182")
|
45
|
+
fixtures_project.stub(:ci_access_token).and_return("abc123")
|
46
|
+
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")
|
47
|
+
expect(fixtures_project.send(:coveralls_coverage_data)).to be_json_eql(fixtures_project.send(:coverage_files).map(&:as_json).to_json).at_path("source_files")
|
31
48
|
end
|
32
49
|
|
33
50
|
it "should raise an error if there is no TRAVIS_JOB_ID" do
|
@@ -47,7 +64,7 @@ describe Slather::CoverageService::Coveralls do
|
|
47
64
|
fixtures_project.stub(:travis_job_id).and_return("9182")
|
48
65
|
expect(fixtures_project).to receive(:`) do |cmd|
|
49
66
|
expect(cmd).to eq("curl -s --form json_file=@coveralls_json_file https://coveralls.io/api/v1/jobs")
|
50
|
-
expect(File.
|
67
|
+
expect(File.read('coveralls_json_file')).to be_json_eql(fixtures_project.send(:coveralls_coverage_data))
|
51
68
|
end.once
|
52
69
|
fixtures_project.post
|
53
70
|
end
|
@@ -18,13 +18,10 @@ describe Slather::CoverageService::GutterJsonOutput do
|
|
18
18
|
it "should print out the coverage for each file, and then total coverage" do
|
19
19
|
fixtures_project.post
|
20
20
|
|
21
|
-
fixture_json =
|
22
|
-
|
21
|
+
fixture_json = File.read(FIXTURES_JSON_PATH)
|
22
|
+
current_json = File.read('.gutter.json')
|
23
23
|
|
24
|
-
current_json
|
25
|
-
current_json['meta']['timestamp'] = ''
|
26
|
-
|
27
|
-
expect(current_json).to eq(fixture_json)
|
24
|
+
expect(current_json).to be_json_eql(fixture_json)
|
28
25
|
File.unlink('.gutter.json')
|
29
26
|
end
|
30
27
|
end
|
@@ -15,14 +15,17 @@ describe Slather::CoverageService::SimpleOutput do
|
|
15
15
|
|
16
16
|
describe '#post' do
|
17
17
|
it "should print out the coverage for each file, and then total coverage" do
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
["spec/fixtures/fixtures/fixtures.m: 2 of 4 lines (50.00%)",
|
19
|
+
"spec/fixtures/fixtures/more_files/peekaview.m: 0 of 6 lines (0.00%)",
|
20
|
+
"spec/fixtures/fixtures/more_files/Branches.m: 10 of 20 lines (50.00%)",
|
21
|
+
"spec/fixtures/fixtures/more_files/Empty.m: 0 of 0 lines (0.00%)",
|
22
|
+
"spec/fixtures/fixturesTests/fixturesTests.m: 7 of 7 lines (100.00%)",
|
23
|
+
"spec/fixtures/fixturesTests/peekaviewTests.m: 6 of 6 lines (100.00%)",
|
24
|
+
"spec/fixtures/fixturesTests/BranchesTests.m: 10 of 10 lines (100.00%)",
|
25
|
+
"Test Coverage: 66.04%"].each do |line|
|
26
|
+
expect(fixtures_project).to receive(:puts).with(line)
|
27
|
+
end
|
28
|
+
|
26
29
|
fixtures_project.post
|
27
30
|
end
|
28
31
|
end
|
@@ -179,6 +179,21 @@ describe Slather::Project do
|
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
|
+
describe "#configure_output_directory_from_yml" do
|
183
|
+
it "should set the output_directory if it has been provided in the yml and has not already been set" do
|
184
|
+
Slather::Project.stub(:yml).and_return({"output_directory" => "/some/path"})
|
185
|
+
fixtures_project.configure_output_directory_from_yml
|
186
|
+
expect(fixtures_project.output_directory).to eq("/some/path")
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should not set the output_directory if it has already been set" do
|
190
|
+
Slather::Project.stub(:yml).and_return({"output_directory" => "/some/path"})
|
191
|
+
fixtures_project.output_directory = "/already/set"
|
192
|
+
fixtures_project.configure_output_directory_from_yml
|
193
|
+
expect(fixtures_project.output_directory).to eq("/already/set")
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
182
197
|
describe "#configure_ci_service_from_yml" do
|
183
198
|
it "should set the ci_service if it has been provided in the yml and has not already been set" do
|
184
199
|
Slather::Project.stub(:yml).and_return({"ci_service" => "some_service"})
|
@@ -228,6 +243,14 @@ describe Slather::Project do
|
|
228
243
|
end
|
229
244
|
end
|
230
245
|
|
246
|
+
describe "#configure_ci_access_token_from_yml" do
|
247
|
+
it "should set the ci_access_token if it has been provided by the yml" do
|
248
|
+
Slather::Project.stub(:yml).and_return({"ci_access_token" => "abc123"})
|
249
|
+
expect(fixtures_project).to receive(:ci_access_token=).with("abc123")
|
250
|
+
fixtures_project.configure_ci_access_token_from_yml
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
231
254
|
describe "#coverage_service=" do
|
232
255
|
it "should extend Slather::CoverageService::Coveralls and set coverage_service = :coveralls if given coveralls" do
|
233
256
|
expect(fixtures_project).to receive(:extend).with(Slather::CoverageService::Coveralls)
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,7 @@ Bundler.setup
|
|
4
4
|
require 'slather'
|
5
5
|
require 'pry'
|
6
6
|
require 'coveralls'
|
7
|
+
require 'json_spec'
|
7
8
|
|
8
9
|
Coveralls.wear!
|
9
10
|
|
@@ -16,3 +17,7 @@ RSpec.configure do |config|
|
|
16
17
|
FileUtils.rm_rf(Dir[File.expand_path('~') + "/Library/Developer/Xcode/DerivedData/fixture*"].first)
|
17
18
|
end
|
18
19
|
end
|
20
|
+
|
21
|
+
JsonSpec.configure do
|
22
|
+
exclude_keys "timestamp"
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Larsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.34'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: json_spec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.1.4
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.1.4
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: clamp
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|