coverage-reporter 0.3.0 → 0.3.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/lib/coverage_reporter/cli.rb +3 -4
- data/lib/coverage_reporter/collate_runner.rb +24 -0
- data/lib/coverage_reporter/coverage_collator.rb +32 -13
- data/lib/coverage_reporter/modified_files_extractor.rb +49 -0
- data/lib/coverage_reporter/options/collate.rb +36 -4
- data/lib/coverage_reporter/{runner.rb → report_runner.rb} +1 -1
- data/lib/coverage_reporter/version.rb +1 -1
- data/lib/coverage_reporter.rb +3 -1
- metadata +19 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 884a32e980f3653582c7d5972cb7b685b68c9d8a549bbbeb8e13dc795ca1804f
|
|
4
|
+
data.tar.gz: f272ed73340191e6164e9ba9fef97f9a07fa822018818fdfadf7d156580cd92e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d44af9425eec9e3c847ecdaf1c6cb372a357fde57a591763caff5d58a010fb64f67f0009e5aa338b624bd022d65036d93c7158aa33f530fc1aeeda6accdd8440
|
|
7
|
+
data.tar.gz: 384dd0a379da698f8ef4749436d20efb71229b9f2d3c36bbccd4c66d35ed2754655ce2db451240b79b77e0382dbaf0c8b4379cf8f2ff29c94d57172c2e0c13f9
|
|
@@ -9,12 +9,11 @@ module CoverageReporter
|
|
|
9
9
|
when nil
|
|
10
10
|
show_usage_and_exit
|
|
11
11
|
when "report"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Runner.new(options).run
|
|
12
|
+
report_options = Options::Report.parse(argv[1..])
|
|
13
|
+
ReportRunner.new(report_options).run
|
|
15
14
|
when "collate"
|
|
16
15
|
collate_options = Options::Collate.parse(argv[1..])
|
|
17
|
-
|
|
16
|
+
CollateRunner.new(collate_options).run
|
|
18
17
|
else
|
|
19
18
|
show_unknown_command_error(argv.first)
|
|
20
19
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module CoverageReporter
|
|
4
|
+
class CollateRunner
|
|
5
|
+
def initialize(options)
|
|
6
|
+
@coverage_dir = options[:coverage_dir]
|
|
7
|
+
@modified_only = options[:modified_only]
|
|
8
|
+
@github_token = options[:github_token]
|
|
9
|
+
@repo = options[:repo]
|
|
10
|
+
@pr_number = options[:pr_number]
|
|
11
|
+
@working_dir = options[:working_dir]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def run
|
|
15
|
+
pull_request = PullRequest.new(github_token:, repo:, pr_number:)
|
|
16
|
+
filenames = modified_only ? ModifiedFilesExtractor.new(pull_request.diff).call : []
|
|
17
|
+
CoverageCollator.new(coverage_dir:, filenames:, working_dir:).call
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
attr_reader :coverage_dir, :modified_only, :github_token, :repo, :pr_number, :working_dir
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -4,26 +4,25 @@ module CoverageReporter
|
|
|
4
4
|
class CoverageCollator
|
|
5
5
|
def initialize(options={})
|
|
6
6
|
@coverage_dir = options[:coverage_dir]
|
|
7
|
+
@filenames = options[:filenames]
|
|
8
|
+
@working_dir = options[:working_dir]
|
|
7
9
|
end
|
|
8
10
|
|
|
9
11
|
def call
|
|
10
12
|
require "simplecov"
|
|
11
13
|
require "simplecov_json_formatter"
|
|
14
|
+
require "simplecov_hypertext"
|
|
12
15
|
require "coverage_reporter/simple_cov/patches/result_hash_formatter_patch"
|
|
13
16
|
|
|
14
17
|
# Collate JSON coverage reports and generate both HTML and JSON outputs
|
|
15
|
-
|
|
16
|
-
abort "No coverage JSON files found to collate" if
|
|
17
|
-
|
|
18
|
-
puts "Collate coverage files: #{
|
|
19
|
-
|
|
20
|
-
::SimpleCov.collate(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
::SimpleCov::Formatter::HTMLFormatter,
|
|
24
|
-
::SimpleCov::Formatter::JSONFormatter
|
|
25
|
-
]
|
|
26
|
-
)
|
|
18
|
+
coverage_files = Dir["#{coverage_dir}/resultset-*.json"]
|
|
19
|
+
abort "No coverage JSON files found to collate" if coverage_files.empty?
|
|
20
|
+
|
|
21
|
+
puts "Collate coverage files: #{coverage_files.join(', ')}"
|
|
22
|
+
|
|
23
|
+
::SimpleCov.collate(coverage_files) do
|
|
24
|
+
add_filter(build_filter) if filenames.any?
|
|
25
|
+
formatter(build_formatter)
|
|
27
26
|
end
|
|
28
27
|
|
|
29
28
|
puts "✅ Coverage merged and report generated."
|
|
@@ -31,6 +30,26 @@ module CoverageReporter
|
|
|
31
30
|
|
|
32
31
|
private
|
|
33
32
|
|
|
34
|
-
attr_reader :coverage_dir
|
|
33
|
+
attr_reader :coverage_dir, :filenames, :working_dir
|
|
34
|
+
|
|
35
|
+
def build_formatter
|
|
36
|
+
::SimpleCov::Formatter::MultiFormatter.new(
|
|
37
|
+
[
|
|
38
|
+
::SimpleCov::Formatter::JSONFormatter,
|
|
39
|
+
::SimpleCov::Formatter::HypertextFormatter
|
|
40
|
+
]
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def build_filter
|
|
45
|
+
lambda do |src_file|
|
|
46
|
+
normalized_filename = normalize_filename(src_file.filename)
|
|
47
|
+
filenames.none?(normalized_filename)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def normalize_filename(filename)
|
|
52
|
+
working_dir ? filename.gsub(working_dir, "").gsub(%r{^/}, "") : filename
|
|
53
|
+
end
|
|
35
54
|
end
|
|
36
55
|
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "set"
|
|
4
|
+
|
|
5
|
+
module CoverageReporter
|
|
6
|
+
# Extracts a list of modified files from diff text
|
|
7
|
+
class ModifiedFilesExtractor
|
|
8
|
+
def initialize(diff_text)
|
|
9
|
+
@diff_text = diff_text
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def call
|
|
13
|
+
return [] unless @diff_text
|
|
14
|
+
|
|
15
|
+
parse_diff(@diff_text)
|
|
16
|
+
rescue StandardError => e
|
|
17
|
+
puts "Warning: Could not parse diff text: #{e.message}"
|
|
18
|
+
[]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def parse_diff(text)
|
|
24
|
+
modified_files = Set.new
|
|
25
|
+
|
|
26
|
+
text.each_line do |line|
|
|
27
|
+
if file_header_line?(line)
|
|
28
|
+
file_path = parse_file_path(line)
|
|
29
|
+
modified_files.add(file_path) if file_path
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
modified_files.to_a.sort
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def file_header_line?(line)
|
|
37
|
+
line.start_with?("+++ ")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def parse_file_path(line)
|
|
41
|
+
return nil if line.end_with?(File::NULL)
|
|
42
|
+
|
|
43
|
+
line = line.chomp
|
|
44
|
+
if (m = line.match(%r{\A\+\+\+\s[wb]/(.+)\z}))
|
|
45
|
+
m[1]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -7,26 +7,58 @@ module CoverageReporter
|
|
|
7
7
|
class Collate < Base
|
|
8
8
|
def self.defaults
|
|
9
9
|
{
|
|
10
|
-
coverage_dir:
|
|
10
|
+
coverage_dir: "coverage",
|
|
11
|
+
modified_only: false,
|
|
12
|
+
github_token: ENV.fetch("GITHUB_TOKEN", nil),
|
|
13
|
+
repo: normalize_repo(ENV.fetch("REPO", nil)),
|
|
14
|
+
pr_number: ENV.fetch("PR_NUMBER", nil),
|
|
15
|
+
working_dir: nil
|
|
11
16
|
}
|
|
12
17
|
end
|
|
13
18
|
|
|
14
19
|
def self.parse(argv)
|
|
15
20
|
opts = defaults.dup
|
|
21
|
+
parser = build_parser(opts)
|
|
22
|
+
parser.parse!(argv)
|
|
23
|
+
opts
|
|
24
|
+
end
|
|
16
25
|
|
|
17
|
-
|
|
26
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
27
|
+
def self.build_parser(opts)
|
|
28
|
+
OptionParser.new do |o|
|
|
18
29
|
o.banner = "Usage: coverage-reporter collate [options]"
|
|
19
30
|
o.on("--coverage-dir DIR", "Directory containing coverage files (default: coverage)") do |v|
|
|
20
31
|
opts[:coverage_dir] = v
|
|
21
32
|
end
|
|
33
|
+
o.on("--modified-only", "Filter to only modified files") do
|
|
34
|
+
opts[:modified_only] = true
|
|
35
|
+
end
|
|
36
|
+
o.on("--github-token TOKEN", "GitHub token") do |v|
|
|
37
|
+
opts[:github_token] = v
|
|
38
|
+
end
|
|
39
|
+
o.on("--repo REPO", "Repository") do |v|
|
|
40
|
+
opts[:repo] = v
|
|
41
|
+
end
|
|
42
|
+
o.on("--pr-number PR_NUMBER", "Pull request number") do |v|
|
|
43
|
+
opts[:pr_number] = v
|
|
44
|
+
end
|
|
45
|
+
o.on("--working-dir DIR", "Working directory for coverage files") do |v|
|
|
46
|
+
opts[:working_dir] = v
|
|
47
|
+
end
|
|
22
48
|
o.on_tail("-h", "--help", "Show help") do
|
|
23
49
|
puts o
|
|
24
50
|
exit 0
|
|
25
51
|
end
|
|
26
52
|
end
|
|
53
|
+
end
|
|
54
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
27
55
|
|
|
28
|
-
|
|
29
|
-
|
|
56
|
+
def self.normalize_repo(repo)
|
|
57
|
+
return repo if repo.nil? || repo.strip.empty?
|
|
58
|
+
|
|
59
|
+
repo.strip
|
|
60
|
+
.gsub(%r{^(https://github\.com/|git@github\.com:)}, "")
|
|
61
|
+
.gsub(/\.git$/, "")
|
|
30
62
|
end
|
|
31
63
|
end
|
|
32
64
|
end
|
data/lib/coverage_reporter.rb
CHANGED
|
@@ -41,12 +41,14 @@ module CoverageReporter
|
|
|
41
41
|
require_relative "coverage_reporter/inline_comment"
|
|
42
42
|
require_relative "coverage_reporter/inline_comment_factory"
|
|
43
43
|
require_relative "coverage_reporter/inline_comment_poster"
|
|
44
|
+
require_relative "coverage_reporter/modified_files_extractor"
|
|
44
45
|
require_relative "coverage_reporter/modified_ranges_extractor"
|
|
45
46
|
require_relative "coverage_reporter/options/base"
|
|
46
47
|
require_relative "coverage_reporter/options/collate"
|
|
47
48
|
require_relative "coverage_reporter/options/report"
|
|
48
49
|
require_relative "coverage_reporter/pull_request"
|
|
49
|
-
require_relative "coverage_reporter/
|
|
50
|
+
require_relative "coverage_reporter/report_runner"
|
|
51
|
+
require_relative "coverage_reporter/collate_runner"
|
|
50
52
|
require_relative "coverage_reporter/uncovered_ranges_extractor"
|
|
51
53
|
require_relative "coverage_reporter/simple_cov/patches/result_hash_formatter_patch"
|
|
52
54
|
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: coverage-reporter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Gabriel Taylor Russ
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2025-
|
|
10
|
+
date: 2025-11-04 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: octokit
|
|
@@ -37,6 +37,20 @@ dependencies:
|
|
|
37
37
|
- - ">="
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
39
|
version: '0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: simplecov-hypertext
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
40
54
|
- !ruby/object:Gem::Dependency
|
|
41
55
|
name: simplecov_json_formatter
|
|
42
56
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -63,6 +77,7 @@ files:
|
|
|
63
77
|
- exe/coverage-reporter
|
|
64
78
|
- lib/coverage_reporter.rb
|
|
65
79
|
- lib/coverage_reporter/cli.rb
|
|
80
|
+
- lib/coverage_reporter/collate_runner.rb
|
|
66
81
|
- lib/coverage_reporter/coverage_analyzer.rb
|
|
67
82
|
- lib/coverage_reporter/coverage_collator.rb
|
|
68
83
|
- lib/coverage_reporter/coverage_report_loader.rb
|
|
@@ -71,12 +86,13 @@ files:
|
|
|
71
86
|
- lib/coverage_reporter/inline_comment.rb
|
|
72
87
|
- lib/coverage_reporter/inline_comment_factory.rb
|
|
73
88
|
- lib/coverage_reporter/inline_comment_poster.rb
|
|
89
|
+
- lib/coverage_reporter/modified_files_extractor.rb
|
|
74
90
|
- lib/coverage_reporter/modified_ranges_extractor.rb
|
|
75
91
|
- lib/coverage_reporter/options/base.rb
|
|
76
92
|
- lib/coverage_reporter/options/collate.rb
|
|
77
93
|
- lib/coverage_reporter/options/report.rb
|
|
78
94
|
- lib/coverage_reporter/pull_request.rb
|
|
79
|
-
- lib/coverage_reporter/
|
|
95
|
+
- lib/coverage_reporter/report_runner.rb
|
|
80
96
|
- lib/coverage_reporter/simple_cov/patches/result_hash_formatter_patch.rb
|
|
81
97
|
- lib/coverage_reporter/uncovered_ranges_extractor.rb
|
|
82
98
|
- lib/coverage_reporter/version.rb
|