Skip to content

Commit

Permalink
feat: allow passing multiple coverage files
Browse files Browse the repository at this point in the history
  • Loading branch information
mrexox committed Jun 6, 2023
1 parent 6cf9786 commit 455be16
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 49 deletions.
58 changes: 40 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,45 +49,59 @@ Invoke-WebRequest -Uri "https://github.com/coverallsapp/coverage-reporter/releas

```bash
# Automatic lookup for supported reports and sending them to https://coveralls.io
coveralls
coveralls report

# Provide explicit repo token
coveralls --repo-token=rg8ZznwNq05g3HDfknodmueeRciuiiPDE
coveralls report --repo-token=rg8ZznwNq05g3HDfknodmueeRciuiiPDE

# Use concrete report file
coveralls --file coverage/lcov.info
coveralls report coverage/lcov.info

# Use parallel reports
coveralls --file project1/coverage/lcov.info --parallel
coveralls --file project2/coverage/lcov.info --parallel
coveralls report project1/coverage/lcov.info --parallel
coveralls report project2/coverage/lcov.info --parallel
# ...
coveralls --done
coveralls done

# Provide a job flag and use carry-forwarding
coveralls --job-flag "unit-tests" --parallel
coveralls --job-flag "integration-tests" --parallel
coveralls --done --carryforward "unit-tests,integration-tests"
coveralls report --job-flag "unit-tests" --parallel
coveralls report --job-flag "integration-tests" --parallel
coveralls done --carryforward "unit-tests,integration-tests"

# Testing options: no real reporting, print payload
coveralls --debug --dry-run
coveralls report --debug --dry-run
```

<details>
<summary>For more options see <code>coveralls -h/--help</code></summary>

```
$ coveralls -h
Coveralls Coverage Reporter v0.3.3
Usage: coveralls [options]
Usage: coveralls [command] [options]
report Report coverage
done Close a parallel build
version Print version
--debug Debug mode: data being sent to Coveralls will be printed to console
--dry-run Dry run (no request sent)
-n, --no-logo Do not show Coveralls logo in logs
-q, --quiet Suppress all output
-h, --help Show this help
-rTOKEN, --repo-token=TOKEN Sets coveralls repo token, overrides settings in yaml or environment variable
-cPATH, --config-path=PATH Set the coveralls yaml config file location, will default to check '.coveralls.yml'
-bPATH, --base-path=PATH Path to the root folder of the project the coverage was collected in
-fFILENAME, --file=FILENAME Coverage artifact file to be reported, e.g. coverage/lcov.info (detected by default)
-jFLAG, --job-flag=FLAG Coverage job flag name, e.g. Unit Tests
-p, --parallel Set the parallel flag. Requires webhook for completion (coveralls --done)
-d, --done Call webhook after all parallel jobs (-p) done
$ coveralls report -h
Usage: coveralls report [file reports] [options]
--debug Debug mode: data being sent to Coveralls will be printed to console
--dry-run Dry run (no request sent)
-n, --no-logo Do not show Coveralls logo in logs
-q, --quiet Suppress all output
-h, --help Show this help
-rTOKEN, --repo-token=TOKEN Sets coveralls repo token, overrides settings in yaml or environment variable
-cPATH, --config-path=PATH Set the coveralls yaml config file location, will default to check '.coveralls.yml'
--build-number=ID Build number
-bPATH, --base-path=PATH Path to the root folder of the project the coverage was collected in
-jFLAG, --job-flag=FLAG Coverage job flag name, e.g. Unit Tests
-p, --parallel Set the parallel flag. Requires webhook for completion (coveralls done)
--format=FORMAT Force coverage file format, supported formats: lcov, simplecov, cobertura, jacoco, gcov, golang, python
--allow-empty Allow empty coverage results and exit 0
--compare-ref=REF Git branch name to compare the coverage with
Expand All @@ -99,10 +113,18 @@ Usage: coveralls [options]
--service-job-url=URL Build job URL override
--service-branch=NAME Branch name override
--service-pull-request=NUMBER PR number override
$ coveralls done -h
Usage: coveralls done [options]
--debug Debug mode: data being sent to Coveralls will be printed to console
--dry-run Dry run (no request sent)
-v, --version Show version
-n, --no-logo Do not show Coveralls logo in logs
-q, --quiet Suppress all output
-h, --help Show this help
-rTOKEN, --repo-token=TOKEN Sets coveralls repo token, overrides settings in yaml or environment variable
-cPATH, --config-path=PATH Set the coveralls yaml config file location, will default to check '.coveralls.yml'
--carryforward=FLAGS Comma-separated list of parallel job flags
--build-number=ID Build number
```

</details>
Expand Down
68 changes: 67 additions & 1 deletion spec/coverage_reporter/cli/cmd_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,31 @@ Spectator.describe CoverageReporter::Cli do
})
end

it "parses overrides" do
reporter = subject.run %w(
report
--service-name=service-name
--service-job-id=job-id
--service-build-url=build-url
--service-job-url=job-url
--service-branch=branch
--service-pull-request=pr
--build-number=build-number
--dry-run
)

expect(reporter.dry_run).to eq true
expect(reporter.overrides.try(&.to_h)).to eq({
:service_name => "service-name",
:service_number => "build-number",
:service_job_id => "job-id",
:service_build_url => "build-url",
:service_job_url => "job-url",
:service_branch => "branch",
:service_pull_request => "pr",
})
end

it "doesn't apply empty values as overrides" do
reporter = subject.run %w(
--service-name=
Expand Down Expand Up @@ -56,6 +81,16 @@ Spectator.describe CoverageReporter::Cli do
expect(reporter.carryforward).to eq "\"1,2,3\""
end

it "accepts --carryforward option" do
reporter = subject.run %w(
done
--carryforward "1,2,3"
--dry-run
)

expect(reporter.carryforward).to eq "\"1,2,3\""
end

it "accepts --format option" do
reporter = subject.run %w(
--format lcov
Expand All @@ -71,7 +106,38 @@ Spectator.describe CoverageReporter::Cli do
--dry-run
)

expect(reporter.coverage_file).to eq "spec/fixtures/lcov/test.lcov"
expect(reporter.coverage_files).to eq ["spec/fixtures/lcov/test.lcov"]
end

it "reports multiple files" do
reporter = subject.run %w(
report
spec/fixtures/lcov/test.lcov
spec/fixtures/lcov/test.lcov
spec/fixtures/lcov/empty.lcov
--dry-run
)

expect(reporter.coverage_files).to eq [
"spec/fixtures/lcov/test.lcov",
"spec/fixtures/lcov/empty.lcov",
]
end

it "reports multiple files after --" do
reporter = subject.run %w(
report
--dry-run
--
spec/fixtures/lcov/test.lcov
spec/fixtures/lcov/test.lcov
spec/fixtures/lcov/empty.lcov
)

expect(reporter.coverage_files).to eq [
"spec/fixtures/lcov/test.lcov",
"spec/fixtures/lcov/empty.lcov",
]
end
end
end
14 changes: 7 additions & 7 deletions spec/coverage_reporter/parser_spec.cr
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
require "../spec_helper"

Spectator.describe CoverageReporter::Parser do
subject { described_class.new(coverage_file, coverage_format, base_path) }
subject { described_class.new(coverage_files, coverage_format, base_path) }

let(coverage_file) { nil }
let(coverage_files) { nil }
let(coverage_format) { nil }
let(base_path) { nil }

describe "#parse" do
context "for exact file" do
let(coverage_file) { "spec/fixtures/lcov/test.lcov" }
let(coverage_files) { ["spec/fixtures/lcov/test.lcov"] }

it "returns reports for one file" do
reports = subject.parse
Expand All @@ -18,7 +18,7 @@ Spectator.describe CoverageReporter::Parser do
end

context "for non-existing file" do
let(coverage_file) { "spec/fixtures/oops/coverage" }
let(coverage_files) { ["spec/fixtures/oops/coverage"] }

it "raises error" do
expect { subject.parse }
Expand All @@ -27,7 +27,7 @@ Spectator.describe CoverageReporter::Parser do
end

context "for an unknown file format" do
let(coverage_file) { "spec/fixtures/lcov/test.js" }
let(coverage_files) { ["spec/fixtures/lcov/test.js"] }

it "returns reports for one file" do
reports = subject.parse
Expand All @@ -46,7 +46,7 @@ Spectator.describe CoverageReporter::Parser do
end

context "when a file is specified" do
let(coverage_file) { "spec/fixtures/lcov/for-base-path-lcov" }
let(coverage_files) { ["spec/fixtures/lcov/for-base-path-lcov"] }
let(base_path) { "spec/fixtures/lcov" }

it "returns report only for specified file" do
Expand All @@ -57,7 +57,7 @@ Spectator.describe CoverageReporter::Parser do
end

context "when another format file specified" do
let(coverage_file) { "spec/fixtures/gcov/main.c.gcov" }
let(coverage_files) { ["spec/fixtures/gcov/main.c.gcov"] }

it "returns empty report" do
reports = subject.parse
Expand Down
6 changes: 3 additions & 3 deletions spec/coverage_reporter/reporter_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Spectator.describe CoverageReporter::Reporter do
compare_ref: compare_ref,
compare_sha: compare_sha,
config_path: config_path,
coverage_file: coverage_file,
coverage_files: coverage_files,
coverage_format: coverage_format,
dry_run: false,
fail_empty: fail_empty,
Expand All @@ -24,7 +24,7 @@ Spectator.describe CoverageReporter::Reporter do
let(compare_ref) { nil }
let(compare_sha) { nil }
let(config_path) { nil }
let(coverage_file) { nil }
let(coverage_files) { nil }
let(coverage_format) { nil }
let(fail_empty) { true }
let(job_flag_name) { nil }
Expand Down Expand Up @@ -73,7 +73,7 @@ Spectator.describe CoverageReporter::Reporter do
end

context "when report is empty" do
let(coverage_file) { "spec/fixtures/lcov/empty.lcov" }
let(coverage_files) { ["spec/fixtures/lcov/empty.lcov"] }

it "raises NoSourceFiles" do
expect { subject.report }
Expand Down
22 changes: 12 additions & 10 deletions src/coverage_reporter/cli/cmd.cr
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module CoverageReporter::Cli
compare_ref: opts.compare_ref,
compare_sha: opts.compare_sha,
config_path: opts.config_path,
coverage_file: opts.filename,
coverage_files: opts.coverage_files.try(&.uniq),
coverage_format: opts.format,
dry_run: opts.dry_run?,
fail_empty: !opts.allow_empty?,
Expand Down Expand Up @@ -67,7 +67,7 @@ module CoverageReporter::Cli
end

private class Opts
property filename : String?
property coverage_files : Array(String) | Nil
property format : String?
property repo_token : String?
property base_path : String?
Expand Down Expand Up @@ -112,7 +112,7 @@ module CoverageReporter::Cli
parser.banner = "Usage: coveralls [command] [options]"

parser.on("report", "Report coverage") do
parser.banner = "Usage: coveralls report [options]"
parser.banner = "Usage: coveralls report [file reports] [options]"

parser.on("--build-number=ID", "Build number") do |build_number|
opts.service_number = build_number
Expand All @@ -126,15 +126,11 @@ module CoverageReporter::Cli
opts.base_path = path
end

parser.on("-fFILENAME", "--file=FILENAME", "Coverage artifact file to be reported, e.g. coverage/lcov.info (detected by default)") do |name|
opts.filename = name.presence
end

parser.on("-jFLAG", "--job-flag=FLAG", "Coverage job flag name, e.g. Unit Tests") do |flag|
opts.job_flag_name = flag.presence
end

parser.on("-p", "--parallel", "Set the parallel flag. Requires webhook for completion (coveralls --done)") do
parser.on("-p", "--parallel", "Set the parallel flag. Requires webhook for completion (coveralls done)") do
opts.parallel = true
end

Expand Down Expand Up @@ -181,9 +177,13 @@ module CoverageReporter::Cli
parser.on("--service-pull-request=NUMBER", "PR number override") do |service_pull_request|
opts.service_pull_request = service_pull_request.presence
end

parser.unknown_args do |unknown_args, after_dash_args|
opts.coverage_files = unknown_args + after_dash_args
end
end

parser.on("done", "Close a parallel build") do
parser.on("done", "Call a webhook after all parallel reports") do
parser.banner = "Usage: coveralls done [options]"

opts.parallel_done = true
Expand Down Expand Up @@ -253,7 +253,9 @@ module CoverageReporter::Cli
end

parser.on("-fFILENAME", "--file=FILENAME", "DEPRECATED: Coverage artifact file to be reported, e.g. coverage/lcov.info (detected by default)") do |name|
opts.filename = name.presence
next if name.blank?

opts.coverage_files = [name]
end

parser.on("-jFLAG", "--job-flag=FLAG", "DEPRECATED: Coverage job flag name, e.g. Unit Tests") do |flag|
Expand Down
18 changes: 11 additions & 7 deletions src/coverage_reporter/parser.cr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module CoverageReporter
#
# New parsers can be easily added. See `BaseParser` for details.
class Parser
getter coverage_file : String?
getter coverage_files : Array(String) | Nil
getter coverage_format : String?
getter base_path : String?
getter parsers : Array(BaseParser)
Expand Down Expand Up @@ -46,19 +46,23 @@ module CoverageReporter
end
end

def initialize(@coverage_file : String?, @coverage_format : String?, @base_path : String?)
def initialize(@coverage_files : Array(String) | Nil, @coverage_format : String?, @base_path : String?)
@parsers = PARSERS.map(&.new(@base_path)).to_a
end

# Returns coverage report files that can be parsed by utility.
def files : Array(String)
if custom_file = coverage_file
if !File.exists?(custom_file)
raise NotFound.new(custom_file)
custom_files = coverage_files
if custom_files && !custom_files.empty?
custom_files.each do |custom_file|
if !File.exists?(custom_file)
raise NotFound.new(custom_file)
end

Log.info "📄 Using coverage file: #{custom_file}"
end

Log.info "📄 Using coverage file: #{custom_file}"
return [custom_file]
return custom_files
end

files = [] of String
Expand Down
Loading

0 comments on commit 455be16

Please sign in to comment.