diff --git a/README.md b/README.md index 8afef7d..05cf19c 100644 --- a/README.md +++ b/README.md @@ -49,27 +49,27 @@ 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 ```
@@ -77,17 +77,31 @@ coveralls --debug --dry-run ``` $ 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 @@ -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 ```
diff --git a/spec/coverage_reporter/cli/cmd_spec.cr b/spec/coverage_reporter/cli/cmd_spec.cr index 286d234..c58f9a9 100644 --- a/spec/coverage_reporter/cli/cmd_spec.cr +++ b/spec/coverage_reporter/cli/cmd_spec.cr @@ -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= @@ -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 @@ -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 diff --git a/spec/coverage_reporter/parser_spec.cr b/spec/coverage_reporter/parser_spec.cr index 0933fed..93f2a83 100644 --- a/spec/coverage_reporter/parser_spec.cr +++ b/spec/coverage_reporter/parser_spec.cr @@ -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 @@ -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 } @@ -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 @@ -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 @@ -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 diff --git a/spec/coverage_reporter/reporter_spec.cr b/spec/coverage_reporter/reporter_spec.cr index d2c756d..1add3ac 100644 --- a/spec/coverage_reporter/reporter_spec.cr +++ b/spec/coverage_reporter/reporter_spec.cr @@ -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, @@ -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 } @@ -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 } diff --git a/src/coverage_reporter/cli/cmd.cr b/src/coverage_reporter/cli/cmd.cr index 54fe0c2..15f6c17 100644 --- a/src/coverage_reporter/cli/cmd.cr +++ b/src/coverage_reporter/cli/cmd.cr @@ -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?, @@ -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? @@ -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 @@ -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 @@ -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 @@ -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| diff --git a/src/coverage_reporter/parser.cr b/src/coverage_reporter/parser.cr index f1d0cd4..7e724ee 100644 --- a/src/coverage_reporter/parser.cr +++ b/src/coverage_reporter/parser.cr @@ -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) @@ -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 diff --git a/src/coverage_reporter/reporter.cr b/src/coverage_reporter/reporter.cr index bfdb479..dd5a226 100644 --- a/src/coverage_reporter/reporter.cr +++ b/src/coverage_reporter/reporter.cr @@ -7,7 +7,7 @@ module CoverageReporter compare_ref, compare_sha, config_path, - coverage_file, + coverage_files, coverage_format, dry_run, fail_empty, @@ -28,7 +28,7 @@ module CoverageReporter @compare_ref : String?, @compare_sha : String?, @config_path : String?, - @coverage_file : String?, + @coverage_files : Array(String) | Nil, @coverage_format : String?, @dry_run : Bool, @fail_empty : Bool, @@ -46,7 +46,7 @@ module CoverageReporter # current directory will be searched for all supported report formats. def report source_files = Parser.new( - coverage_file: coverage_file, + coverage_files: coverage_files, coverage_format: coverage_format, base_path: base_path, ).parse