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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13b5ede2585f67e28da56541940a417c9a2266f334a836d8ba4aae949f35a7aa
4
- data.tar.gz: a23afcc6d059da70d2b0857e9a06af23177b0058690d66695596f7b7e0f774df
3
+ metadata.gz: 884a32e980f3653582c7d5972cb7b685b68c9d8a549bbbeb8e13dc795ca1804f
4
+ data.tar.gz: f272ed73340191e6164e9ba9fef97f9a07fa822018818fdfadf7d156580cd92e
5
5
  SHA512:
6
- metadata.gz: 29ba80d86581dd7f99b7141cec2e3a9a1fd81ae41dcff5d82d9305556b2a63489121946a9279cb92e905b24b983352ceb690c50ef1946f82ba7a95a2201dd25e
7
- data.tar.gz: 592e4e220fea3f616aa7ca89938638fa463bb3a7a1ab5a3dce42ce4c0c9923baf44cba5fb2e7bfda525d5e30e524903a42c17296b0c44a547b9e02e611925cd7
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
- # Report command
13
- options = Options::Report.parse(argv[1..])
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
- CoverageCollator.new(collate_options).call
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
- files = Dir["#{coverage_dir}/resultset-*.json"]
16
- abort "No coverage JSON files found to collate" if files.empty?
17
-
18
- puts "Collate coverage files: #{files.join(', ')}"
19
-
20
- ::SimpleCov.collate(files) do
21
- formatter ::SimpleCov::Formatter::MultiFormatter.new(
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: "coverage"
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
- parser = OptionParser.new do |o|
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
- parser.parse!(argv)
29
- opts
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
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CoverageReporter
4
- class Runner
4
+ class ReportRunner
5
5
  def initialize(options)
6
6
  @commit_sha = options[:commit_sha]
7
7
  @coverage_report_path = options[:coverage_report_path]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CoverageReporter
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.2"
5
5
  end
@@ -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/runner"
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.0
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-21 00:00:00.000000000 Z
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/runner.rb
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