diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90f4c54e..8ebac1ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,4 +58,4 @@ jobs: COVERALLS_REPO_TOKEN: ${{ github.token }} run: | cd coverage - ../bin/coveralls --base-path src/coverage_reporter/ + ../bin/coveralls report --measure --base-path src/coverage_reporter/ diff --git a/spec/coverage_reporter/cli/cmd_spec.cr b/spec/coverage_reporter/cli/cmd_spec.cr index 457cce90..6cbdf5f4 100644 --- a/spec/coverage_reporter/cli/cmd_spec.cr +++ b/spec/coverage_reporter/cli/cmd_spec.cr @@ -84,6 +84,7 @@ Spectator.describe CoverageReporter::Cli do --build-number=build-number --compare-ref=develop --attempt=4 + --measure --dry-run ) end @@ -159,6 +160,7 @@ Spectator.describe CoverageReporter::Cli do let(options) do %w( done + -m --build-number 3 --carryforward 1,2,3 --dry-run diff --git a/spec/coverage_reporter/parser_spec.cr b/spec/coverage_reporter/parser_spec.cr index 93f2a83d..5b80f60c 100644 --- a/spec/coverage_reporter/parser_spec.cr +++ b/spec/coverage_reporter/parser_spec.cr @@ -14,7 +14,7 @@ Spectator.describe CoverageReporter::Parser do it "returns reports for one file" do reports = subject.parse - expect(reports.size).to eq 1 + expect(reports.size).to eq 2 end context "for non-existing file" do @@ -27,9 +27,9 @@ Spectator.describe CoverageReporter::Parser do end context "for an unknown file format" do - let(coverage_files) { ["spec/fixtures/lcov/test.js"] } + let(coverage_files) { ["spec/fixtures/lcov/index.js"] } - it "returns reports for one file" do + it "returns an empty report" do reports = subject.parse expect(reports.size).to eq 0 @@ -42,7 +42,7 @@ Spectator.describe CoverageReporter::Parser do it "returns report only for specified format" do reports = subject.parse - expect(reports.size).to eq 1 + expect(reports.size).to eq 2 end context "when a file is specified" do @@ -52,7 +52,7 @@ Spectator.describe CoverageReporter::Parser do it "returns report only for specified file" do reports = subject.parse - expect(reports.size).to eq 1 + expect(reports.size).to eq 2 end end @@ -81,7 +81,7 @@ Spectator.describe CoverageReporter::Parser do it "returns reports for all files" do reports = subject.parse - expect(reports.size).to be > 1 + expect(reports.size).to be > 2 end end end diff --git a/spec/coverage_reporter/parsers/lcov_parser_spec.cr b/spec/coverage_reporter/parsers/lcov_parser_spec.cr index 4b2b0882..881b7803 100644 --- a/spec/coverage_reporter/parsers/lcov_parser_spec.cr +++ b/spec/coverage_reporter/parsers/lcov_parser_spec.cr @@ -30,26 +30,33 @@ Spectator.describe CoverageReporter::LcovParser do describe "#parse" do let(filename) { "spec/fixtures/lcov/test.lcov" } + let(digest) { "bbc3522fe6728f6e24bfe930a87ecc54" } let(coverage) do - [1, 1, 1, nil, 1, 66, 66, nil, nil, 1, 323, 18446744073709551615u64, 63, 63, 60, - nil, 3, nil, 63, 32, nil, 63, 63, 63, 3, nil, 63, 60, nil, 3, nil, 63, 27, 27, 27, - nil, nil, 323, nil, nil, 1, 5, 5, nil, 2, nil, nil, 3, 3, 1, 1, 1, 1, nil, 0, nil, - nil, 2, 2, 2, 0, nil, 2, nil, nil, 2, 2, nil, nil, nil, nil, 1, 1, 1, 1, 1, 1, nil, - 1, 1, nil, 1, 87, 87, 6, 6, 6, 6, 9, 6, 6, nil, 81, nil, nil, nil, 1, 1, nil, nil, - 1, 1, nil, nil, 1, nil, 2, 2, 2, 1, nil, 2, nil, nil, 1, 3, 1, 1, nil, nil, 2, 2, - 2, nil, 1, 1, nil, 2, nil, nil, nil, 1, 1, nil, nil, 1, 50, 50, 50, 50, 20, nil, - 50, 50, 2, nil, 50, 50, 50, 31, nil, 50, 24, nil, 50, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] of UInt64? + [1, nil, nil, 1, nil, nil, nil, nil, nil, 2, 2, nil, 18446744073709551615u64, + nil, nil, nil, 2, 2, nil, 2, nil, 2, nil, nil, nil, 1, 1, nil, nil, nil, + 1, nil, nil, nil, 0, nil, nil, nil, 1] of UInt64? + end + let(branches) do + [10, 0, 0, 1, 10, 0, 1, 1, + 10, 1, 0, 0, 10, 1, 1, 1, + 11, 2, 0, 1, 11, 2, 1, 1, + 20, 3, 0, 1, 20, 3, 1, 1] of UInt64 end it "parses correctly" do reports = subject.parse(filename) - expect(reports.size).to eq 1 + expect(reports.size).to eq 2 expect(reports[0].to_h).to eq({ - :name => "spec/fixtures/lcov/test.js", + :name => "spec/fixtures/lcov/index.js", + :coverage => [1, 1], + :source_digest => "97afaf84480a9f3fbb13393085b1d49d", + }) + expect(reports[1].to_h).to eq({ + :name => "spec/fixtures/lcov/lib/run.js", :coverage => coverage, - :source_digest => "6e7aea5aa7198489561a44359dc7e1a4", + :branches => branches, + :source_digest => digest, }) end @@ -60,11 +67,12 @@ Spectator.describe CoverageReporter::LcovParser do it "parses correctly" do reports = subject.parse(filename) - expect(reports.size).to eq 1 - expect(reports[0].to_h).to eq({ - :name => "spec/fixtures/lcov/test.js", + expect(reports.size).to eq 2 + expect(reports[1].to_h).to eq({ + :name => "spec/fixtures/lcov/lib/run.js", :coverage => coverage, - :source_digest => "6e7aea5aa7198489561a44359dc7e1a4", + :branches => branches, + :source_digest => digest, }) end end @@ -75,11 +83,12 @@ Spectator.describe CoverageReporter::LcovParser do it "parses correctly" do reports = subject.parse(filename) - expect(reports.size).to eq 1 - expect(reports[0].to_h).to eq({ - :name => "spec/fixtures/lcov/test.js", + expect(reports.size).to eq 2 + expect(reports[1].to_h).to eq({ + :name => "spec/fixtures/lcov/lib/run.js", :coverage => coverage, - :source_digest => "6e7aea5aa7198489561a44359dc7e1a4", + :branches => branches, + :source_digest => digest, }) end end @@ -90,11 +99,12 @@ Spectator.describe CoverageReporter::LcovParser do it "parses correctly" do reports = subject.parse(filename) - expect(reports.size).to eq 1 - expect(reports[0].to_h).to eq({ - :name => "spec/fixtures/lcov/test.js", + expect(reports.size).to eq 2 + expect(reports[1].to_h).to eq({ + :name => "spec/fixtures/lcov/lib/run.js", :coverage => coverage, - :source_digest => "6e7aea5aa7198489561a44359dc7e1a4", + :branches => branches, + :source_digest => digest, }) end end diff --git a/spec/fixtures/lcov/coverage/test.lcov b/spec/fixtures/lcov/coverage/test.lcov index 8eadb175..f2588d8c 100644 --- a/spec/fixtures/lcov/coverage/test.lcov +++ b/spec/fixtures/lcov/coverage/test.lcov @@ -7,117 +7,57 @@ LH:1 BRF:0 BRH:0 end_of_record -SF:spec/fixtures/lcov/test.js +TN: +SF:spec/fixtures/lcov/index.js +FNF:0 +FNH:0 DA:1,1 DA:2,1 -DA:3,1 -DA:5,1 -DA:6,66 -DA:7,66 -DA:10,1 -DA:11,323 -DA:12,18446744073709551615 -DA:13,63 -DA:14,63 -DA:15,60 -DA:17,3 -DA:19,63 -DA:20,32 -DA:22,63 -DA:23,63 -DA:24,63 -DA:25,3 -DA:27,63 -DA:28,60 -DA:30,3 -DA:32,63 -DA:33,27 -DA:34,27 -DA:35,27 -DA:38,323 -DA:41,1 -DA:42,5 -DA:43,5 -DA:45,2 -DA:48,3 -DA:49,3 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:55,0 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,0 -DA:63,2 -DA:66,2 -DA:67,2 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:79,1 -DA:80,1 -DA:82,1 -DA:83,87 -DA:84,87 -DA:85,6 -DA:86,6 -DA:87,6 -DA:88,6 -DA:89,9 -DA:90,6 -DA:91,6 -DA:93,81 -DA:97,1 -DA:98,1 -DA:101,1 -DA:102,1 -DA:105,1 -DA:107,2 -DA:108,2 -DA:109,2 -DA:110,1 -DA:112,2 -DA:115,1 -DA:116,3 -DA:117,1 -DA:118,1 -DA:121,2 -DA:122,2 -DA:123,2 -DA:125,1 -DA:126,1 -DA:128,2 -DA:132,1 -DA:133,1 -DA:136,1 -DA:137,50 -DA:138,50 -DA:139,50 -DA:140,50 -DA:141,20 -DA:143,50 -DA:144,50 -DA:145,2 -DA:147,50 -DA:148,50 -DA:149,50 -DA:150,31 -DA:152,50 -DA:153,24 -DA:155,50 -DA:210,40 -DA:212,1 -DA:213,8 -DA:214,6 -DA:216,8 -DA:217,186 -DA:218,21 -DA:219,21 -DA:220,21 -DA:222,165 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:spec/fixtures/lcov/lib/run.js +FN:2,(anonymous_0) +FN:7,(anonymous_1) +FN:16,(anonymous_2) +FN:25,(anonymous_3) +FN:30,(anonymous_4) +FN:34,(anonymous_5) +FNF:6 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:4,1 +DA:10,2 +DA:11,2 +DA:13,18446744073709551615 +DA:17,2 +DA:18,2 +DA:20,2 +DA:22,2 +DA:26,1 +DA:27,1 +DA:31,1 +DA:35,0 +DA:39,1 +LF:14 +LH:13 +BRDA:10,0,0,1 +BRDA:10,0,1,1 +BRDA:10,1,0,0 +BRDA:10,1,1,1 +BRDA:11,2,0,1 +BRDA:11,2,1,1 +BRDA:20,3,0,1 +BRDA:20,3,1,1 +BRF:8 +BRH:7 end_of_record diff --git a/spec/fixtures/lcov/for-base-path-lcov b/spec/fixtures/lcov/for-base-path-lcov index 8883519f..9147fa45 100644 --- a/spec/fixtures/lcov/for-base-path-lcov +++ b/spec/fixtures/lcov/for-base-path-lcov @@ -1,114 +1,63 @@ -SF:test.js +SF:dist/ +FNF:0 +FNH:0 +DA:1,1 +LF:1 +LH:1 +BRF:0 +BRH:0 +end_of_record +TN: +SF:index.js +FNF:0 +FNH:0 DA:1,1 DA:2,1 -DA:3,1 -DA:5,1 -DA:6,66 -DA:7,66 -DA:10,1 -DA:11,323 -DA:12,18446744073709551615 -DA:13,63 -DA:14,63 -DA:15,60 -DA:17,3 -DA:19,63 -DA:20,32 -DA:22,63 -DA:23,63 -DA:24,63 -DA:25,3 -DA:27,63 -DA:28,60 -DA:30,3 -DA:32,63 -DA:33,27 -DA:34,27 -DA:35,27 -DA:38,323 -DA:41,1 -DA:42,5 -DA:43,5 -DA:45,2 -DA:48,3 -DA:49,3 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:55,0 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,0 -DA:63,2 -DA:66,2 -DA:67,2 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:79,1 -DA:80,1 -DA:82,1 -DA:83,87 -DA:84,87 -DA:85,6 -DA:86,6 -DA:87,6 -DA:88,6 -DA:89,9 -DA:90,6 -DA:91,6 -DA:93,81 -DA:97,1 -DA:98,1 -DA:101,1 -DA:102,1 -DA:105,1 -DA:107,2 -DA:108,2 -DA:109,2 -DA:110,1 -DA:112,2 -DA:115,1 -DA:116,3 -DA:117,1 -DA:118,1 -DA:121,2 -DA:122,2 -DA:123,2 -DA:125,1 -DA:126,1 -DA:128,2 -DA:132,1 -DA:133,1 -DA:136,1 -DA:137,50 -DA:138,50 -DA:139,50 -DA:140,50 -DA:141,20 -DA:143,50 -DA:144,50 -DA:145,2 -DA:147,50 -DA:148,50 -DA:149,50 -DA:150,31 -DA:152,50 -DA:153,24 -DA:155,50 -DA:210,40 -DA:212,1 -DA:213,8 -DA:214,6 -DA:216,8 -DA:217,186 -DA:218,21 -DA:219,21 -DA:220,21 -DA:222,165 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:lib/run.js +FN:2,(anonymous_0) +FN:7,(anonymous_1) +FN:16,(anonymous_2) +FN:25,(anonymous_3) +FN:30,(anonymous_4) +FN:34,(anonymous_5) +FNF:6 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:4,1 +DA:10,2 +DA:11,2 +DA:13,18446744073709551615 +DA:17,2 +DA:18,2 +DA:20,2 +DA:22,2 +DA:26,1 +DA:27,1 +DA:31,1 +DA:35,0 +DA:39,1 +LF:14 +LH:13 +BRDA:10,0,0,1 +BRDA:10,0,1,1 +BRDA:10,1,0,0 +BRDA:10,1,1,1 +BRDA:11,2,0,1 +BRDA:11,2,1,1 +BRDA:20,3,0,1 +BRDA:20,3,1,1 +BRF:8 +BRH:7 end_of_record diff --git a/spec/fixtures/lcov/index.js b/spec/fixtures/lcov/index.js new file mode 100644 index 00000000..94ca0c5e --- /dev/null +++ b/spec/fixtures/lcov/index.js @@ -0,0 +1,2 @@ +var dir = './lib/'; +exports.run = require(dir + 'run'); diff --git a/spec/fixtures/lcov/lib/run.js b/spec/fixtures/lcov/lib/run.js new file mode 100644 index 00000000..c800f0ae --- /dev/null +++ b/spec/fixtures/lcov/lib/run.js @@ -0,0 +1,39 @@ +var run = { + a: function(){ + // more changes + return 1; + }, + + b: function(x){ + var y; + + if(x === 0) (y = x === -1 ? 1 : 0); + if(x > 0) y = 2; + + return y; + }, + + c: function(x){ + var zero = 0; + var one = 1; + + var y = x > zero ? one : zero; + + return y; + }, + + d: function(){ + var one = 1; + return 1; + }, + + e: function(){ + return 'blah'; + }, + + f: function(){ + return 'untested'; + } +}; + +module.exports = run; diff --git a/spec/fixtures/lcov/test-current-folder.lcov b/spec/fixtures/lcov/test-current-folder.lcov index fdf29ce9..9147fa45 100644 --- a/spec/fixtures/lcov/test-current-folder.lcov +++ b/spec/fixtures/lcov/test-current-folder.lcov @@ -7,117 +7,57 @@ LH:1 BRF:0 BRH:0 end_of_record -SF:test.js +TN: +SF:index.js +FNF:0 +FNH:0 DA:1,1 DA:2,1 -DA:3,1 -DA:5,1 -DA:6,66 -DA:7,66 -DA:10,1 -DA:11,323 -DA:12,18446744073709551615 -DA:13,63 -DA:14,63 -DA:15,60 -DA:17,3 -DA:19,63 -DA:20,32 -DA:22,63 -DA:23,63 -DA:24,63 -DA:25,3 -DA:27,63 -DA:28,60 -DA:30,3 -DA:32,63 -DA:33,27 -DA:34,27 -DA:35,27 -DA:38,323 -DA:41,1 -DA:42,5 -DA:43,5 -DA:45,2 -DA:48,3 -DA:49,3 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:55,0 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,0 -DA:63,2 -DA:66,2 -DA:67,2 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:79,1 -DA:80,1 -DA:82,1 -DA:83,87 -DA:84,87 -DA:85,6 -DA:86,6 -DA:87,6 -DA:88,6 -DA:89,9 -DA:90,6 -DA:91,6 -DA:93,81 -DA:97,1 -DA:98,1 -DA:101,1 -DA:102,1 -DA:105,1 -DA:107,2 -DA:108,2 -DA:109,2 -DA:110,1 -DA:112,2 -DA:115,1 -DA:116,3 -DA:117,1 -DA:118,1 -DA:121,2 -DA:122,2 -DA:123,2 -DA:125,1 -DA:126,1 -DA:128,2 -DA:132,1 -DA:133,1 -DA:136,1 -DA:137,50 -DA:138,50 -DA:139,50 -DA:140,50 -DA:141,20 -DA:143,50 -DA:144,50 -DA:145,2 -DA:147,50 -DA:148,50 -DA:149,50 -DA:150,31 -DA:152,50 -DA:153,24 -DA:155,50 -DA:210,40 -DA:212,1 -DA:213,8 -DA:214,6 -DA:216,8 -DA:217,186 -DA:218,21 -DA:219,21 -DA:220,21 -DA:222,165 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:lib/run.js +FN:2,(anonymous_0) +FN:7,(anonymous_1) +FN:16,(anonymous_2) +FN:25,(anonymous_3) +FN:30,(anonymous_4) +FN:34,(anonymous_5) +FNF:6 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:4,1 +DA:10,2 +DA:11,2 +DA:13,18446744073709551615 +DA:17,2 +DA:18,2 +DA:20,2 +DA:22,2 +DA:26,1 +DA:27,1 +DA:31,1 +DA:35,0 +DA:39,1 +LF:14 +LH:13 +BRDA:10,0,0,1 +BRDA:10,0,1,1 +BRDA:10,1,0,0 +BRDA:10,1,1,1 +BRDA:11,2,0,1 +BRDA:11,2,1,1 +BRDA:20,3,0,1 +BRDA:20,3,1,1 +BRF:8 +BRH:7 end_of_record diff --git a/spec/fixtures/lcov/test.js b/spec/fixtures/lcov/test.js deleted file mode 100644 index f9941ea3..00000000 --- a/spec/fixtures/lcov/test.js +++ /dev/null @@ -1,172 +0,0 @@ -var nodeUrl = require('url'); -var querystring = require('querystring'); -var _ = require('underscore'); - -var UrlGrey = function(url){ - this.url = url; - this._parsed = null; -}; - -UrlGrey.prototype.parsed = function(){ - if (!this._parsed){ - this._parsed = nodeUrl.parse(this.url); - var p = this._parsed; - if (p.protocol){ - p.protocol = p.protocol.slice(0,-1); - } else { - p.protocol = 'http'; - } - if (p.hash){ - p.hash = p.hash.substring(1); - } - p.username = ''; - p.password = ''; - if (!p.hostname){ - p.hostname = 'localhost'; - } - if (!p.port){ - p.port = 80; - } else { - p.port = parseInt(p.port, 10); - } - if (p.auth){ - var auth = p.auth.split(':'); - p.username = auth[0]; - p.password = auth[1]; - } - } - return this._parsed; -}; - -UrlGrey.prototype.query = function(mergeObject){ - var path; - if (mergeObject === false){ - // clear the query entirely if the input === false - return this.queryString(''); - } - - var url = this.url; - if (!mergeObject){ - var parsed = nodeUrl.parse(url); - if (!!parsed.search){ - var qstr = parsed.search.substring(1); - return querystring.parse(qstr); - } - return {}; - } else { - // read the object out - var oldQuery = querystring.parse(this.queryString()); - _.each(mergeObject, function(v, k){ - if (v === null){ - delete oldQuery[k]; - } else { - oldQuery[k] = v; - } - }); - var newString = querystring.stringify(oldQuery, '&', '='); - return this.queryString(newString); - } -}; - - -addPropertyGetterSetter('protocol'); -addPropertyGetterSetter('port'); -addPropertyGetterSetter('username'); -addPropertyGetterSetter('password'); -addPropertyGetterSetter('hostname'); -addPropertyGetterSetter('hash'); -// add a method called queryString that manipulates 'query' -addPropertyGetterSetter('query', 'queryString'); -addPropertyGetterSetter('pathname', 'path'); - -UrlGrey.prototype.path = function(){ - var args = _.toArray(arguments); - if (args.length !== 0){ - var obj = new UrlGrey(this.toString()); - var str = _.flatten(args).join('/'); - str = str.replace(/\/+/g, '/'); // remove double slashes - str = str.replace(/\/$/, ''); // remove all trailing slashes - if (str[0] !== '/'){ str = '/' + str; } - obj.parsed().pathname = str; - return obj; - } - return this.parsed().pathname; -}; - - -UrlGrey.prototype.encode = function(str){ - return querystring.escape(str); -}; - -UrlGrey.prototype.decode = function(str){ - return querystring.unescape(str); -}; - -UrlGrey.prototype.parent = function(){ - // read-only. (can't SET parent) - var pieces = this.path().split("/"); - var popped = pieces.pop(); - if (popped === ''){ // ignore trailing slash - pieces.pop(); - } - return this.path(pieces.join("/")); -}; - -UrlGrey.prototype.child = function(suffix){ - if (suffix){ - suffix = encodeURIComponent(suffix); - return this.path(this.path(), suffix); - } else { - // if no suffix, return the child - var pieces = this.path().split("/"); - var last = _.last(pieces); - if ((pieces.length > 1) && (last === '')){ - // ignore trailing slashes - pieces.pop(); - last = _.last(pieces); - } - return last; - } -}; - -UrlGrey.prototype.toJSON = function(){ - return this.toString(); -}; - -UrlGrey.prototype.toString = function(){ - var p = this.parsed(); - var userinfo = p.username + ':' + p.password; - var retval = this.protocol() + '://'; - if (userinfo != ':'){ - retval += userinfo + '@'; - } - retval += p.hostname; - if (this.port() !== 80){ - retval += ':' + this.port(); - } - retval += this.path() === '/' ? '' : this.path(); - var qs = this.queryString(); - if (qs){ - retval += '?' + qs; - } - if (p.hash){ - retval += '#' + p.hash; - } - return retval; -}; - -module.exports = function(url){ return new UrlGrey(url); }; - -function addPropertyGetterSetter(propertyName, methodName){ - if (!methodName){ - methodName = propertyName; - } - UrlGrey.prototype[methodName] = function(str){ - if (!!str || str === ''){ - var obj = new UrlGrey(this.toString()); - obj.parsed()[propertyName] = str; - return obj; - } - return this.parsed()[propertyName]; - }; -} diff --git a/spec/fixtures/lcov/test.lcov b/spec/fixtures/lcov/test.lcov index 8eadb175..f2588d8c 100644 --- a/spec/fixtures/lcov/test.lcov +++ b/spec/fixtures/lcov/test.lcov @@ -7,117 +7,57 @@ LH:1 BRF:0 BRH:0 end_of_record -SF:spec/fixtures/lcov/test.js +TN: +SF:spec/fixtures/lcov/index.js +FNF:0 +FNH:0 DA:1,1 DA:2,1 -DA:3,1 -DA:5,1 -DA:6,66 -DA:7,66 -DA:10,1 -DA:11,323 -DA:12,18446744073709551615 -DA:13,63 -DA:14,63 -DA:15,60 -DA:17,3 -DA:19,63 -DA:20,32 -DA:22,63 -DA:23,63 -DA:24,63 -DA:25,3 -DA:27,63 -DA:28,60 -DA:30,3 -DA:32,63 -DA:33,27 -DA:34,27 -DA:35,27 -DA:38,323 -DA:41,1 -DA:42,5 -DA:43,5 -DA:45,2 -DA:48,3 -DA:49,3 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:55,0 -DA:58,2 -DA:59,2 -DA:60,2 -DA:61,0 -DA:63,2 -DA:66,2 -DA:67,2 -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -DA:76,1 -DA:77,1 -DA:79,1 -DA:80,1 -DA:82,1 -DA:83,87 -DA:84,87 -DA:85,6 -DA:86,6 -DA:87,6 -DA:88,6 -DA:89,9 -DA:90,6 -DA:91,6 -DA:93,81 -DA:97,1 -DA:98,1 -DA:101,1 -DA:102,1 -DA:105,1 -DA:107,2 -DA:108,2 -DA:109,2 -DA:110,1 -DA:112,2 -DA:115,1 -DA:116,3 -DA:117,1 -DA:118,1 -DA:121,2 -DA:122,2 -DA:123,2 -DA:125,1 -DA:126,1 -DA:128,2 -DA:132,1 -DA:133,1 -DA:136,1 -DA:137,50 -DA:138,50 -DA:139,50 -DA:140,50 -DA:141,20 -DA:143,50 -DA:144,50 -DA:145,2 -DA:147,50 -DA:148,50 -DA:149,50 -DA:150,31 -DA:152,50 -DA:153,24 -DA:155,50 -DA:210,40 -DA:212,1 -DA:213,8 -DA:214,6 -DA:216,8 -DA:217,186 -DA:218,21 -DA:219,21 -DA:220,21 -DA:222,165 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:spec/fixtures/lcov/lib/run.js +FN:2,(anonymous_0) +FN:7,(anonymous_1) +FN:16,(anonymous_2) +FN:25,(anonymous_3) +FN:30,(anonymous_4) +FN:34,(anonymous_5) +FNF:6 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:4,1 +DA:10,2 +DA:11,2 +DA:13,18446744073709551615 +DA:17,2 +DA:18,2 +DA:20,2 +DA:22,2 +DA:26,1 +DA:27,1 +DA:31,1 +DA:35,0 +DA:39,1 +LF:14 +LH:13 +BRDA:10,0,0,1 +BRDA:10,0,1,1 +BRDA:10,1,0,0 +BRDA:10,1,1,1 +BRDA:11,2,0,1 +BRDA:11,2,1,1 +BRDA:20,3,0,1 +BRDA:20,3,1,1 +BRF:8 +BRH:7 end_of_record diff --git a/src/coverage_reporter/cli/cmd.cr b/src/coverage_reporter/cli/cmd.cr index 9652a9be..8bbdb78d 100644 --- a/src/coverage_reporter/cli/cmd.cr +++ b/src/coverage_reporter/cli/cmd.cr @@ -23,6 +23,7 @@ module CoverageReporter::Cli overrides: opts.overrides, parallel: opts.parallel?, repo_token: opts.repo_token, + measure: opts.debug? || opts.measure?, ) if opts.parallel_done? @@ -93,6 +94,7 @@ module CoverageReporter::Cli property? dry_run = false property? debug = false property? allow_empty = false + property? measure = false # CI options overrides property service_name : String? @@ -189,6 +191,10 @@ module CoverageReporter::Cli opts.service_attempt = attempt end + parser.on("-m", "--measure", "Measure time for parsing and HTTP requests") do + opts.measure = true + end + parser.unknown_args do |unknown_args, after_dash_args| opts.coverage_files = unknown_args + after_dash_args end @@ -210,6 +216,10 @@ module CoverageReporter::Cli parser.on("--attempt", "Run attempt number") do |attempt| opts.service_attempt = attempt end + + parser.on("-m", "--measure", "Measure time for parsing and HTTP requests") do + opts.measure = true + end end parser.on("version", "Show version") do diff --git a/src/coverage_reporter/parsers/lcov_parser.cr b/src/coverage_reporter/parsers/lcov_parser.cr index d0c1be26..7a3ca6a9 100644 --- a/src/coverage_reporter/parsers/lcov_parser.cr +++ b/src/coverage_reporter/parsers/lcov_parser.cr @@ -80,9 +80,7 @@ module CoverageReporter end private def report(filename, info) : FileReport - lines = 0 - File.each_line(filename) { lines += 1 } - + lines = info.coverage.keys.max? || 0 coverage = Array(Hits?).new(lines, 0) lines.times do |index| coverage[index] = info.coverage[index + 1]? diff --git a/src/coverage_reporter/reporter.cr b/src/coverage_reporter/reporter.cr index cf4f1374..1b8ae2e2 100644 --- a/src/coverage_reporter/reporter.cr +++ b/src/coverage_reporter/reporter.cr @@ -15,7 +15,8 @@ module CoverageReporter job_flag_name : String? = nil, overrides : CI::Options? = nil, parallel : Bool = false, - repo_token : String? = nil + repo_token : String? = nil, + measure : Bool = false class NoSourceFiles < BaseException def message @@ -39,16 +40,20 @@ module CoverageReporter # If *coverage_file* is provided only its content will be parsed. Otherwise # current directory will be searched for all supported report formats. def report - source_files = Parser.new( - coverage_files: settings.coverage_files, - coverage_format: settings.coverage_format, - base_path: settings.base_path, - ).parse + source_files = measure("Report parsing") do + Parser.new( + coverage_files: settings.coverage_files, + coverage_format: settings.coverage_format, + base_path: settings.base_path, + ).parse + end raise NoSourceFiles.new(settings.fail_empty) unless source_files.size > 0 api = Api::Jobs.new(config, settings.parallel, source_files, Git.info(config)) - api.send_request(settings.dry_run) + measure("Report request") do + api.send_request(settings.dry_run) + end end # Reports that all parallel jobs were reported and Coveralls can aggregate @@ -60,7 +65,9 @@ module CoverageReporter def parallel_done api = Api::Webhook.new(config, settings.carryforward || config.carryforward) - api.send_request(settings.dry_run) + measure("Webhook request") do + api.send_request(settings.dry_run) + end end private def config @@ -73,5 +80,17 @@ module CoverageReporter overrides: settings.overrides, ) end + + private def measure(name : String, &) + return yield unless settings.measure + start = Time.monotonic + + yield + ensure + if start + elapsed_time = Time.monotonic - start + Log.info("⏱️ #{name}: #{elapsed_time}") + end + end end end