gitlab_quality-test_tooling 2.24.1 → 2.25.0

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: b18e1abd81ec1c5b3c2d215c28fe53d68880a94d76b12c8693afb64d4b3cc9c2
4
- data.tar.gz: f9b3ede1d0e05492f9395ffedfd3132ee528df4343074a89518cffe1521f466d
3
+ metadata.gz: 00140ea21de2c5a562b7eaf3af41ee5d304a60d9bf73fb812a7e08fa04170a5e
4
+ data.tar.gz: 9e8cdf91f59d43b782872ee3c625e21d0c00381feb260ab95454fd5d3cb920c7
5
5
  SHA512:
6
- metadata.gz: 4f36f26d06eda97591aa4b46b5beb6db2563b269cc97e8cc987b6fb17310e836efeb2b600fef03a0d70305fbf82282bc251a6206c1e7123b80500fe3f6d6b6d5
7
- data.tar.gz: 53f3dd0472c5539605440db234c7c6b3f361831af54e418dbc482a5ae9b608b33179c9bdc2d671fe2b0a99b11b873433c2fe3c8b6c0d0394fae2a58021fd7f08
6
+ metadata.gz: 2e9561c50c8b365001cce2047d448a403c2f5de4ee3ee35841c4ce2e2d2748ca17c135b0b9e5b22389e9245a0922a6171fb99705016040a4206c139d3a3033f5
7
+ data.tar.gz: 88359d86bf0cdb99b48d748570a39fa6fd3a73d9908c352d3bd956f9fea7f6c4b8d880763b2e6bccd10fa439e211bc139ea2f952952b7cef7b2e9107a7c8f31f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab_quality-test_tooling (2.24.1)
4
+ gitlab_quality-test_tooling (2.25.0)
5
5
  activesupport (>= 7.0, < 7.3)
6
6
  amatch (~> 0.4.1)
7
7
  fog-google (~> 1.24, >= 1.24.1)
data/exe/test-coverage CHANGED
@@ -15,29 +15,21 @@ require_relative '../lib/gitlab_quality/test_tooling/code_coverage/rspec_report'
15
15
  require_relative '../lib/gitlab_quality/test_tooling/code_coverage/test_map'
16
16
 
17
17
  params = {}
18
- required_params = [:working_dir, :rspec_reports_jobs, :rspec_reports_glob, :coverage_report_path, :test_map_url]
18
+ required_params = [:rspec_reports, :coverage_report, :test_map]
19
19
 
20
20
  options = OptionParser.new do |opts|
21
21
  opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
22
22
 
23
- opts.on('--working_dir PATH', 'Working directory path') do |path|
24
- params[:working_dir] = path
23
+ opts.on('--rspec-reports GLOB', 'Glob pattern for RSpec JSON reports (e.g., "rspec/rspec-*.json")') do |pattern|
24
+ params[:rspec_reports] = pattern
25
25
  end
26
26
 
27
- opts.on('--rspec-reports-jobs JOB1,...', Array, 'Comma-separated names of RSpec JSON jobs') do |jobs|
28
- params[:rspec_reports_jobs] = jobs
27
+ opts.on('--coverage-report PATH', 'Path to the LCOV coverage report (e.g., "coverage/lcov/gitlab.lcov")') do |path|
28
+ params[:coverage_report] = path
29
29
  end
30
30
 
31
- opts.on('--rspec-reports-glob GLOB', 'Glob pattern for RSpec JSON reports') do |pattern|
32
- params[:rspec_reports_glob] = pattern
33
- end
34
-
35
- opts.on('--coverage-report-path PATH', 'Path to LCOV coverage report') do |path|
36
- params[:coverage_report_path] = path
37
- end
38
-
39
- opts.on('--test-map-url URL', 'URL for the test map') do |url|
40
- params[:test_map_url] = url
31
+ opts.on('--test-map PATH', 'Path to the test map file (e.g., "crystalball/packed-mapping.json.gz")') do |path|
32
+ params[:test_map] = path
41
33
  end
42
34
 
43
35
  opts.on('-h', '--help', 'Show the usage') do
@@ -58,11 +50,9 @@ end
58
50
 
59
51
  if params.any? && (required_params - params.keys).none?
60
52
  artifacts = GitlabQuality::TestTooling::CodeCoverage::Artifacts.new(
61
- working_dir: params[:working_dir],
62
- rspec_reports_jobs: params[:rspec_reports_jobs],
63
- rspec_reports_glob: params[:rspec_reports_glob],
64
- coverage_report_path: params[:coverage_report_path],
65
- test_map_url: params[:test_map_url]
53
+ rspec_reports: params[:rspec_reports],
54
+ coverage_report: params[:coverage_report],
55
+ test_map: params[:test_map]
66
56
  )
67
57
 
68
58
  coverage_report = artifacts.coverage_report
@@ -1,27 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
- require 'net/http'
5
4
  require 'stringio'
6
- require 'uri'
7
5
  require 'zlib'
8
6
 
9
- require_relative 'utils'
10
-
11
7
  module GitlabQuality
12
8
  module TestTooling
13
9
  module CodeCoverage
14
10
  class Artifacts
15
- include Utils
16
-
17
- MAX_RETRIES = 7 # retries with exponential backoff: 1s, 2s, 4s, 8s, 16s, 32s, 64s (+ 0-1s jitter)
18
-
19
- def initialize(working_dir:, coverage_report_path:, rspec_reports_jobs:, rspec_reports_glob:, test_map_url:)
20
- @working_dir = working_dir
21
- @rspec_reports_jobs = rspec_reports_jobs
22
- @rspec_reports_glob = rspec_reports_glob
23
- @coverage_report_path = coverage_report_path
24
- @test_map_uri = URI.parse(test_map_url)
11
+ # Loads coverage artifacts from the filesystem
12
+ #
13
+ # @param rspec_reports [String] Glob pattern for RSpec JSON report files (e.g., "rspec/rspec-*.json")
14
+ # @param coverage_report [String] Path to the LCOV coverage report file (e.g., "coverage/lcov/gitlab.lcov")
15
+ # @param test_map [String] Path to the test map file, gzipped or plain JSON (e.g., "crystalball/packed-mapping.json.gz")
16
+ def initialize(rspec_reports:, coverage_report:, test_map:)
17
+ @rspec_reports_glob = rspec_reports
18
+ @coverage_report_path = coverage_report
19
+ @test_map_path = test_map
25
20
  end
26
21
 
27
22
  def rspec_reports
@@ -37,20 +32,16 @@ module GitlabQuality
37
32
  end
38
33
 
39
34
  def test_map
40
- @test_map ||= fetch_test_map_from_url
35
+ @test_map ||= fetch_test_map
41
36
  end
42
37
 
43
38
  private
44
39
 
45
40
  def rspec_reports_paths
46
41
  @rspec_reports_paths ||= begin
47
- paths = @rspec_reports_jobs.flat_map do |job_name|
48
- Dir.glob(File.join(@working_dir, job_name, @rspec_reports_glob))
49
- end.compact
42
+ paths = Dir.glob(@rspec_reports_glob)
50
43
 
51
- if paths.empty? || paths.none? { |path| File.exist?(path) } # rubocop:disable Style/IfUnlessModifier
52
- raise "No RSpec reports found in #{@working_dir}/<job-name>/ for these jobs: #{@rspec_reports_jobs}."
53
- end
44
+ raise "No RSpec reports found matching pattern: #{@rspec_reports_glob}" if paths.empty?
54
45
 
55
46
  paths
56
47
  end
@@ -62,30 +53,18 @@ module GitlabQuality
62
53
  File.read(@coverage_report_path)
63
54
  end
64
55
 
65
- def fetch_test_map_from_url
66
- attempt = 0
56
+ def fetch_test_map
57
+ raise "Test map file not found: #{@test_map_path}" unless File.exist?(@test_map_path)
67
58
 
68
59
  begin
69
- attempt += 1
70
- response = http_get(@test_map_uri)
71
- raise "HTTP #{response.code}: #{response.message}" unless response.is_a?(Net::HTTPSuccess)
60
+ content = File.read(@test_map_path)
72
61
 
73
- JSON.parse(decompressed_gzip(response.body))
74
- rescue StandardError => e
75
- if attempt <= MAX_RETRIES
76
- sleep_duration = exponential_delay_with_jitter(attempt)
77
- warn "Attempt #{attempt}/#{MAX_RETRIES} failed: #{e.message}. Retrying in #{sleep_duration.round(2)}s..."
78
- sleep(sleep_duration)
79
- retry
80
- end
81
-
82
- raise "Failed to fetch test map from #{@test_map_uri} after #{MAX_RETRIES} attempts: #{e.message}"
83
- end
84
- end
62
+ # If it's a gzipped file, decompress it
63
+ content = decompressed_gzip(content) if @test_map_path.end_with?('.gz')
85
64
 
86
- def http_get(uri)
87
- Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
88
- http.get(uri.request_uri)
65
+ JSON.parse(content)
66
+ rescue StandardError => e
67
+ raise "Failed to read test map from #{@test_map_path}: #{e.message}"
89
68
  end
90
69
  end
91
70
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitlabQuality
4
4
  module TestTooling
5
- VERSION = "2.24.1"
5
+ VERSION = "2.25.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_quality-test_tooling
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.24.1
4
+ version: 2.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-24 00:00:00.000000000 Z
11
+ date: 2025-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control