gitlab_quality-test_tooling 1.39.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e87f64ae21e1503086674e077ee9c65072bbb34b6d5c90a97473aa771c949998
4
- data.tar.gz: c01d95a8ffc05fb31c58e552c73ba76f60e847dca360bf45f3e5d60a6ebb59f8
3
+ metadata.gz: 69b4478a8c7af86d2dae63c79d0924037feb673486f1ae6f15d5617121a0b9f4
4
+ data.tar.gz: 9a7f797d54687a515d834cfe0585bca7b87f5a28cd33000d5c06ebea292de56e
5
5
  SHA512:
6
- metadata.gz: 12ce0cf0811d94f50244de3f61247ba992096a8801130f7801d0901f7edfa67861c166e76366d75cf5d3ecbb62112c632b1bac6aa49bda33eeb162c8b36ea146
7
- data.tar.gz: ed223adb0e1729db0637a49de34e337a1fbfd8b684eadc7272010317008ddaf1503e63b68a7a8caccbc2331b8553c24e7b4bf7e345d6a4b4d1038a6142e31c6f
6
+ metadata.gz: 50206a9f212b2d78ab38b8433ffb5f22864e8a322b6065b6492a9023104e2caf0097042c8935c913f7d16de982fd3fb04a8438d294865f61caac84eee60d943e
7
+ data.tar.gz: 1267891667d8bf81617843d65ea6cd9bee2aef24007a2dc53ba92d970529f771dcbf8b8209aba7d59531f40ffac2e2c549444441dcae123c8e70bac1c0d417e7
data/.rubocop_todo.yml CHANGED
@@ -1,17 +1,11 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2023-05-02 23:14:58 UTC using RuboCop version 1.43.0.
3
+ # on 2024-10-10 06:12:01 UTC using RuboCop version 1.62.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 1
10
- # This cop supports safe autocorrection (--autocorrect).
11
- Cop/CustomErrorClass:
12
- Exclude:
13
- - 'lib/gitlab_quality/test_tooling.rb'
14
-
15
9
  # Offense count: 1
16
10
  # This cop supports safe autocorrection (--autocorrect).
17
11
  # Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
@@ -20,9 +14,54 @@ Gemspec/OrderedDependencies:
20
14
  Exclude:
21
15
  - 'gitlab_quality-test_tooling.gemspec'
22
16
 
17
+ # Offense count: 3
18
+ # This cop supports unsafe autocorrection (--autocorrect-all).
19
+ # Configuration parameters: Categories, ExpectedOrder.
20
+ # ExpectedOrder: module_inclusion, constants, public_class_methods, initializer, public_methods, protected_methods, private_methods
21
+ Layout/ClassStructure:
22
+ Exclude:
23
+ - 'lib/gitlab_quality/test_tooling/labels_inference.rb'
24
+ - 'lib/gitlab_quality/test_tooling/report/concerns/issue_reports.rb'
25
+ - 'lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb'
26
+
27
+ # Offense count: 6
28
+ # This cop supports safe autocorrection (--autocorrect).
29
+ # Configuration parameters: EnforcedStyle, IndentationWidth.
30
+ # SupportedStyles: aligned, indented
31
+ Layout/LineEndStringConcatenationIndentation:
32
+ Exclude:
33
+ - 'lib/gitlab_quality/test_tooling/gitlab_client/merge_requests_dry_client.rb'
34
+ - 'lib/gitlab_quality/test_tooling/report/report_results.rb'
35
+ - 'spec/gitlab_quality/test_tooling/gitlab_client/issues_client_spec.rb'
36
+ - 'spec/gitlab_quality/test_tooling/report/failed_test_issue_spec.rb'
37
+ - 'spec/gitlab_quality/test_tooling/report/slow_test_issue_spec.rb'
38
+
39
+ # Offense count: 200
40
+ # Configuration parameters: EnforcedStyle, IgnoreSharedExamples.
41
+ # SupportedStyles: always, named_only
42
+ RSpec/NamedSubject:
43
+ Enabled: false
44
+
45
+ # Offense count: 2
46
+ # This cop supports safe autocorrection (--autocorrect).
47
+ # Configuration parameters: AllowOnlyRestArgument, UseAnonymousForwarding, RedundantRestArgumentNames, RedundantKeywordRestArgumentNames, RedundantBlockArgumentNames.
48
+ # RedundantRestArgumentNames: args, arguments
49
+ # RedundantKeywordRestArgumentNames: kwargs, options, opts
50
+ # RedundantBlockArgumentNames: blk, block, proc
51
+ Style/ArgumentsForwarding:
52
+ Exclude:
53
+ - 'lib/gitlab_quality/test_tooling/test_results/base_test_results.rb'
54
+
55
+ # Offense count: 2
56
+ # This cop supports safe autocorrection (--autocorrect).
57
+ # Configuration parameters: AllowMultipleReturnValues.
58
+ Style/RedundantReturn:
59
+ Exclude:
60
+ - 'lib/gitlab_quality/test_tooling/runtime/env.rb'
61
+
23
62
  # Offense count: 1
24
- # Configuration parameters: Severity, Include.
25
- # Include: **/*.gemspec
26
- Gemspec/RequiredRubyVersion:
63
+ # This cop supports unsafe autocorrection (--autocorrect-all).
64
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
65
+ Style/ReturnNilInPredicateMethodDefinition:
27
66
  Exclude:
28
- - 'gitlab_quality-test_tooling.gemspec'
67
+ - 'lib/gitlab_quality/test_tooling/knapsack_reports/spec_run_time.rb'
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.2.3
1
+ 3.2.5
data/.tool-versions CHANGED
@@ -1 +1,2 @@
1
- ruby 3.0.5
1
+ ruby 3.2.5
2
+ lefthook 1.7.14
data/Gemfile.lock CHANGED
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab_quality-test_tooling (1.39.0)
4
+ gitlab_quality-test_tooling (2.1.0)
5
5
  activesupport (>= 7.0, < 7.2)
6
6
  amatch (~> 0.4.1)
7
7
  fog-google (~> 1.24, >= 1.24.1)
8
- gitlab (~> 4.19)
8
+ gitlab (>= 4.19, < 6.0)
9
9
  http (~> 5.0)
10
10
  influxdb-client (~> 3.1)
11
11
  nokogiri (~> 1.10)
@@ -18,7 +18,7 @@ PATH
18
18
  GEM
19
19
  remote: https://rubygems.org/
20
20
  specs:
21
- activesupport (7.1.3.2)
21
+ activesupport (7.1.4)
22
22
  base64
23
23
  bigdecimal
24
24
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -28,8 +28,8 @@ GEM
28
28
  minitest (>= 5.1)
29
29
  mutex_m
30
30
  tzinfo (~> 2.0)
31
- addressable (2.8.6)
32
- public_suffix (>= 2.0.2, < 6.0)
31
+ addressable (2.8.7)
32
+ public_suffix (>= 2.0.2, < 7.0)
33
33
  amatch (0.4.1)
34
34
  mize
35
35
  tins (~> 1.0)
@@ -38,8 +38,8 @@ GEM
38
38
  base64 (0.2.0)
39
39
  benchmark (0.3.0)
40
40
  bigdecimal (3.1.8)
41
- binding_of_caller (1.0.0)
42
- debug_inspector (>= 0.0.1)
41
+ binding_of_caller (1.0.1)
42
+ debug_inspector (>= 1.2.0)
43
43
  builder (3.3.0)
44
44
  byebug (11.1.3)
45
45
  claide (1.1.0)
@@ -50,13 +50,15 @@ GEM
50
50
  climate_control (1.2.0)
51
51
  coderay (1.1.3)
52
52
  colored2 (3.1.2)
53
- concurrent-ruby (1.2.3)
53
+ concurrent-ruby (1.3.4)
54
54
  connection_pool (2.4.1)
55
55
  cork (0.3.0)
56
56
  colored2 (~> 3.1)
57
- crack (0.4.5)
57
+ crack (1.0.0)
58
+ bigdecimal
58
59
  rexml
59
- danger (9.4.2)
60
+ csv (3.3.0)
61
+ danger (9.5.0)
60
62
  claide (~> 1.0)
61
63
  claide-plugins (>= 0.9.2)
62
64
  colored2 (~> 3.1)
@@ -66,29 +68,30 @@ GEM
66
68
  git (~> 1.13)
67
69
  kramdown (~> 2.3)
68
70
  kramdown-parser-gfm (~> 1.0)
69
- no_proxy_fix
70
71
  octokit (>= 4.0)
71
72
  terminal-table (>= 1, < 4)
72
- danger-gitlab (8.0.0)
73
+ danger-gitlab (9.0.0)
73
74
  danger
74
- gitlab (~> 4.2, >= 4.2.0)
75
+ gitlab (~> 5.0)
75
76
  debug_inspector (1.2.0)
76
77
  declarative (0.0.20)
77
- diff-lcs (1.5.0)
78
- docile (1.4.0)
78
+ diff-lcs (1.5.1)
79
+ docile (1.4.1)
79
80
  domain_name (0.6.20240107)
80
81
  drb (2.2.1)
81
82
  e2mmap (0.1.0)
82
- excon (0.111.0)
83
- faraday (2.9.0)
84
- faraday-net_http (>= 2.0, < 3.2)
83
+ excon (0.112.0)
84
+ faraday (2.12.0)
85
+ faraday-net_http (>= 2.0, < 3.4)
86
+ json
87
+ logger
85
88
  faraday-http-cache (2.5.1)
86
89
  faraday (>= 0.8)
87
- faraday-net_http (3.1.0)
90
+ faraday-net_http (3.3.0)
88
91
  net-http
89
- ffi (1.16.3)
90
- ffi-compiler (1.0.1)
91
- ffi (>= 1.0.0)
92
+ ffi (1.17.0)
93
+ ffi-compiler (1.3.2)
94
+ ffi (>= 1.15.5)
92
95
  rake
93
96
  fog-core (2.4.0)
94
97
  builder
@@ -118,44 +121,45 @@ GEM
118
121
  git (1.19.1)
119
122
  addressable (~> 2.8)
120
123
  rchardet (~> 1.8)
121
- gitlab (4.19.0)
124
+ gitlab (5.0.0)
122
125
  httparty (~> 0.20)
123
126
  terminal-table (>= 1.5.1)
124
127
  gitlab-dangerfiles (3.13.0)
125
128
  danger (>= 8.4.5)
126
129
  danger-gitlab (>= 8.0.0)
127
130
  rake
128
- gitlab-styles (10.1.0)
129
- rubocop (~> 1.50.2)
130
- rubocop-graphql (~> 0.18)
131
- rubocop-performance (~> 1.15)
132
- rubocop-rails (~> 2.17)
133
- rubocop-rspec (~> 2.22)
134
- google-apis-compute_v1 (0.102.0)
131
+ gitlab-styles (12.0.1)
132
+ rubocop (~> 1.62.1)
133
+ rubocop-factory_bot (~> 2.25.1)
134
+ rubocop-graphql (~> 1.5.0)
135
+ rubocop-performance (~> 1.20.2)
136
+ rubocop-rails (~> 2.24.0)
137
+ rubocop-rspec (~> 2.27.1)
138
+ google-apis-compute_v1 (0.108.0)
135
139
  google-apis-core (>= 0.15.0, < 2.a)
136
- google-apis-core (0.15.0)
140
+ google-apis-core (0.15.1)
137
141
  addressable (~> 2.5, >= 2.5.1)
138
142
  googleauth (~> 1.9)
139
- httpclient (>= 2.8.1, < 3.a)
143
+ httpclient (>= 2.8.3, < 3.a)
140
144
  mini_mime (~> 1.0)
145
+ mutex_m
141
146
  representable (~> 3.0)
142
147
  retriable (>= 2.0, < 4.a)
143
- rexml
144
148
  google-apis-dns_v1 (0.44.0)
145
149
  google-apis-core (>= 0.15.0, < 2.a)
146
150
  google-apis-iamcredentials_v1 (0.21.0)
147
151
  google-apis-core (>= 0.15.0, < 2.a)
148
- google-apis-monitoring_v3 (0.65.0)
152
+ google-apis-monitoring_v3 (0.69.0)
149
153
  google-apis-core (>= 0.15.0, < 2.a)
150
- google-apis-pubsub_v1 (0.54.0)
154
+ google-apis-pubsub_v1 (0.56.0)
151
155
  google-apis-core (>= 0.15.0, < 2.a)
152
156
  google-apis-sqladmin_v1beta4 (0.74.0)
153
157
  google-apis-core (>= 0.15.0, < 2.a)
154
- google-apis-storage_v1 (0.41.0)
158
+ google-apis-storage_v1 (0.46.0)
155
159
  google-apis-core (>= 0.15.0, < 2.a)
156
- google-cloud-env (2.1.1)
160
+ google-cloud-env (2.2.1)
157
161
  faraday (>= 1.0, < 3.a)
158
- googleauth (1.11.0)
162
+ googleauth (1.11.1)
159
163
  faraday (>= 1.0, < 3.a)
160
164
  google-cloud-env (~> 2.1)
161
165
  jwt (>= 1.4, < 3.0)
@@ -176,93 +180,95 @@ GEM
176
180
  guard (~> 2.1)
177
181
  guard-compat (~> 1.1)
178
182
  rspec (>= 2.99.0, < 4.0)
179
- hashdiff (1.1.0)
180
- http (5.1.1)
183
+ hashdiff (1.1.1)
184
+ http (5.2.0)
181
185
  addressable (~> 2.8)
186
+ base64 (~> 0.1)
182
187
  http-cookie (~> 1.0)
183
188
  http-form_data (~> 2.2)
184
- llhttp-ffi (~> 0.4.0)
185
- http-cookie (1.0.5)
189
+ llhttp-ffi (~> 0.5.0)
190
+ http-cookie (1.0.7)
186
191
  domain_name (~> 0.5)
187
192
  http-form_data (2.3.0)
188
- httparty (0.21.0)
193
+ httparty (0.22.0)
194
+ csv
189
195
  mini_mime (>= 1.0.0)
190
196
  multi_xml (>= 0.5.2)
191
197
  httpclient (2.8.3)
192
- i18n (1.14.5)
198
+ i18n (1.14.6)
193
199
  concurrent-ruby (~> 1.0)
194
200
  influxdb-client (3.1.0)
195
- jaro_winkler (1.5.6)
196
- json (2.7.1)
197
- jwt (2.8.2)
201
+ jaro_winkler (1.6.0)
202
+ json (2.7.2)
203
+ jwt (2.9.3)
198
204
  base64
199
205
  kramdown (2.4.0)
200
206
  rexml
201
207
  kramdown-parser-gfm (1.1.0)
202
208
  kramdown (~> 2.0)
203
- lefthook (1.6.1)
204
- listen (3.8.0)
209
+ language_server-protocol (3.17.0.3)
210
+ lefthook (1.7.18)
211
+ listen (3.9.0)
205
212
  rb-fsevent (~> 0.10, >= 0.10.3)
206
213
  rb-inotify (~> 0.9, >= 0.9.10)
207
- llhttp-ffi (0.4.0)
214
+ llhttp-ffi (0.5.0)
208
215
  ffi-compiler (~> 1.0)
209
216
  rake (~> 13.0)
217
+ logger (1.6.1)
210
218
  lumberjack (1.2.10)
211
- method_source (1.0.0)
212
- mime-types (3.5.2)
219
+ method_source (1.1.0)
220
+ mime-types (3.6.0)
221
+ logger
213
222
  mime-types-data (~> 3.2015)
214
- mime-types-data (3.2024.0702)
223
+ mime-types-data (3.2024.1001)
215
224
  mini_mime (1.1.5)
216
- mini_portile2 (2.8.5)
217
- minitest (5.23.0)
218
- mize (0.4.1)
219
- protocol (~> 2.0)
225
+ mini_portile2 (2.8.7)
226
+ minitest (5.25.1)
227
+ mize (0.6.0)
220
228
  multi_json (1.15.0)
221
- multi_xml (0.6.0)
229
+ multi_xml (0.7.1)
230
+ bigdecimal (~> 3.1)
222
231
  mutex_m (0.2.0)
223
232
  nap (1.1.0)
224
233
  nenv (0.3.0)
225
234
  net-http (0.4.1)
226
235
  uri
227
- no_proxy_fix (0.1.2)
228
- nokogiri (1.16.0)
236
+ nokogiri (1.16.7)
229
237
  mini_portile2 (~> 2.8.2)
230
238
  racc (~> 1.4)
231
239
  notiffany (0.1.3)
232
240
  nenv (~> 0.1)
233
241
  shellany (~> 0.0)
234
- octokit (8.0.0)
242
+ octokit (9.1.0)
235
243
  faraday (>= 1, < 3)
236
244
  sawyer (~> 0.9)
237
245
  open4 (1.3.4)
238
246
  os (1.1.4)
239
- parallel (1.24.0)
240
- parser (3.3.0.5)
247
+ parallel (1.26.3)
248
+ parser (3.3.5.0)
241
249
  ast (~> 2.4.1)
242
250
  racc
243
- proc_to_ast (0.1.0)
244
- coderay
251
+ proc_to_ast (0.2.0)
245
252
  parser
253
+ rouge
246
254
  unparser
247
- protocol (2.0.0)
248
- ruby_parser (~> 3.0)
249
255
  pry (0.14.2)
250
256
  coderay (~> 1.1)
251
257
  method_source (~> 1.0)
252
258
  pry-byebug (3.10.1)
253
259
  byebug (~> 11.0)
254
260
  pry (>= 0.13, < 0.15)
255
- public_suffix (5.0.4)
256
- racc (1.7.3)
257
- rack (3.0.8)
261
+ public_suffix (6.0.1)
262
+ racc (1.8.1)
263
+ rack (3.1.7)
258
264
  rainbow (3.1.1)
259
- rake (13.1.0)
265
+ rake (13.2.1)
260
266
  rb-fsevent (0.11.2)
261
- rb-inotify (0.10.1)
267
+ rb-inotify (0.11.1)
262
268
  ffi (~> 1.0)
263
269
  rbs (2.8.4)
264
270
  rchardet (1.8.0)
265
- regexp_parser (2.9.0)
271
+ regexp_parser (2.9.2)
266
272
  representable (3.2.0)
267
273
  declarative (< 0.1.0)
268
274
  trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -270,69 +276,69 @@ GEM
270
276
  retriable (3.1.2)
271
277
  reverse_markdown (2.1.1)
272
278
  nokogiri
273
- rexml (3.2.6)
274
- rspec (3.12.0)
275
- rspec-core (~> 3.12.0)
276
- rspec-expectations (~> 3.12.0)
277
- rspec-mocks (~> 3.12.0)
278
- rspec-core (3.12.2)
279
- rspec-support (~> 3.12.0)
280
- rspec-expectations (3.12.3)
279
+ rexml (3.3.8)
280
+ rouge (4.4.0)
281
+ rspec (3.13.0)
282
+ rspec-core (~> 3.13.0)
283
+ rspec-expectations (~> 3.13.0)
284
+ rspec-mocks (~> 3.13.0)
285
+ rspec-core (3.13.1)
286
+ rspec-support (~> 3.13.0)
287
+ rspec-expectations (3.13.3)
281
288
  diff-lcs (>= 1.2.0, < 2.0)
282
- rspec-support (~> 3.12.0)
283
- rspec-mocks (3.12.6)
289
+ rspec-support (~> 3.13.0)
290
+ rspec-mocks (3.13.2)
284
291
  diff-lcs (>= 1.2.0, < 2.0)
285
- rspec-support (~> 3.12.0)
286
- rspec-parameterized (1.0.0)
292
+ rspec-support (~> 3.13.0)
293
+ rspec-parameterized (1.0.2)
287
294
  rspec-parameterized-core (< 2)
288
295
  rspec-parameterized-table_syntax (< 2)
289
- rspec-parameterized-core (1.0.0)
296
+ rspec-parameterized-core (1.0.1)
290
297
  parser
291
- proc_to_ast
298
+ proc_to_ast (>= 0.2.0)
292
299
  rspec (>= 2.13, < 4)
293
300
  unparser
294
301
  rspec-parameterized-table_syntax (1.0.1)
295
302
  binding_of_caller
296
303
  rspec-parameterized-core (< 2)
297
- rspec-support (3.12.1)
298
- rubocop (1.50.2)
304
+ rspec-support (3.13.1)
305
+ rspec_junit_formatter (0.6.0)
306
+ rspec-core (>= 2, < 4, != 2.12.0)
307
+ rubocop (1.62.1)
299
308
  json (~> 2.3)
309
+ language_server-protocol (>= 3.17.0)
300
310
  parallel (~> 1.10)
301
- parser (>= 3.2.0.0)
311
+ parser (>= 3.3.0.2)
302
312
  rainbow (>= 2.2.2, < 4.0)
303
313
  regexp_parser (>= 1.8, < 3.0)
304
314
  rexml (>= 3.2.5, < 4.0)
305
- rubocop-ast (>= 1.28.0, < 2.0)
315
+ rubocop-ast (>= 1.31.1, < 2.0)
306
316
  ruby-progressbar (~> 1.7)
307
317
  unicode-display_width (>= 2.4.0, < 3.0)
308
- rubocop-ast (1.30.0)
309
- parser (>= 3.2.1.0)
310
- rubocop-capybara (2.20.0)
318
+ rubocop-ast (1.32.3)
319
+ parser (>= 3.3.1.0)
320
+ rubocop-capybara (2.21.0)
311
321
  rubocop (~> 1.41)
312
322
  rubocop-factory_bot (2.25.1)
313
323
  rubocop (~> 1.41)
314
- rubocop-graphql (0.19.0)
315
- rubocop (>= 0.87, < 2)
324
+ rubocop-graphql (1.5.4)
325
+ rubocop (>= 1.50, < 2)
316
326
  rubocop-performance (1.20.2)
317
327
  rubocop (>= 1.48.1, < 2.0)
318
328
  rubocop-ast (>= 1.30.0, < 2.0)
319
- rubocop-rails (2.23.1)
329
+ rubocop-rails (2.24.1)
320
330
  activesupport (>= 4.2.0)
321
331
  rack (>= 1.1)
322
332
  rubocop (>= 1.33.0, < 2.0)
323
- rubocop-ast (>= 1.30.0, < 2.0)
324
- rubocop-rspec (2.26.1)
333
+ rubocop-ast (>= 1.31.1, < 2.0)
334
+ rubocop-rspec (2.27.1)
325
335
  rubocop (~> 1.40)
326
336
  rubocop-capybara (~> 2.17)
327
337
  rubocop-factory_bot (~> 2.22)
328
338
  ruby-progressbar (1.13.0)
329
- ruby_parser (3.21.0)
330
- racc (~> 1.5)
331
- sexp_processor (~> 4.16)
332
339
  sawyer (0.9.2)
333
340
  addressable (>= 2.3.5)
334
341
  faraday (>= 0.17.3, < 3)
335
- sexp_processor (4.17.1)
336
342
  shellany (0.0.1)
337
343
  signet (0.19.0)
338
344
  addressable (~> 2.8)
@@ -346,7 +352,7 @@ GEM
346
352
  simplecov-cobertura (2.1.0)
347
353
  rexml
348
354
  simplecov (~> 0.19)
349
- simplecov-html (0.12.3)
355
+ simplecov-html (0.13.1)
350
356
  simplecov_json_formatter (0.1.4)
351
357
  solargraph (0.50.0)
352
358
  backport (~> 1.2)
@@ -368,26 +374,27 @@ GEM
368
374
  table_print (1.5.7)
369
375
  terminal-table (3.0.2)
370
376
  unicode-display_width (>= 1.1.1, < 3)
371
- thor (1.3.0)
372
- tilt (2.3.0)
373
- timecop (0.9.8)
374
- tins (1.32.1)
377
+ thor (1.3.2)
378
+ tilt (2.4.0)
379
+ timecop (0.9.10)
380
+ tins (1.34.0)
381
+ bigdecimal
375
382
  sync
376
383
  trailblazer-option (0.1.2)
377
384
  tzinfo (2.0.6)
378
385
  concurrent-ruby (~> 1.0)
379
386
  uber (0.1.0)
380
- unicode-display_width (2.5.0)
381
- unparser (0.6.12)
387
+ unicode-display_width (2.6.0)
388
+ unparser (0.6.15)
382
389
  diff-lcs (~> 1.3)
383
- parser (>= 3.2.2.4)
384
- uri (0.13.0)
390
+ parser (>= 3.3.0)
391
+ uri (0.13.1)
385
392
  webmock (3.7.0)
386
393
  addressable (>= 2.3.6)
387
394
  crack (>= 0.3.2)
388
395
  hashdiff (>= 0.4.0, < 2.0.0)
389
- yard (0.9.34)
390
- zeitwerk (2.6.12)
396
+ yard (0.9.37)
397
+ zeitwerk (2.6.18)
391
398
 
392
399
  PLATFORMS
393
400
  ruby
@@ -395,13 +402,14 @@ PLATFORMS
395
402
  DEPENDENCIES
396
403
  climate_control (~> 1.2)
397
404
  gitlab-dangerfiles (~> 3.8)
398
- gitlab-styles (~> 10.0)
405
+ gitlab-styles (~> 12.0)
399
406
  gitlab_quality-test_tooling!
400
407
  guard-rspec (~> 4.7)
401
408
  lefthook (~> 1.3)
402
409
  pry-byebug (= 3.10.1)
403
410
  rake (~> 13.0)
404
411
  rspec (~> 3.12)
412
+ rspec_junit_formatter (~> 0.6.0)
405
413
  simplecov (~> 0.22)
406
414
  simplecov-cobertura (~> 2.1)
407
415
  solargraph (~> 0.41)
@@ -409,4 +417,4 @@ DEPENDENCIES
409
417
  webmock (= 3.7.0)
410
418
 
411
419
  BUNDLED WITH
412
- 2.5.15
420
+ 2.5.19
data/README.md CHANGED
@@ -177,6 +177,20 @@ Usage: exe/failed-test-issues [options]
177
177
  -h, --help Show the usage
178
178
  ```
179
179
 
180
+ ### `exe/existing-test-health-issue`
181
+
182
+ ```shell
183
+ Purpose: Checks whether tests coming from the rspec JSON report files has an existing test health issue opened.
184
+ Usage: exe/existing-test-health-issue [options]
185
+ -i, --input-files INPUT_FILES JSON rspec-retry report files
186
+ -p, --project PROJECT Can be an integer or a group/project string
187
+ -t, --token TOKEN A valid access token with `api` scope and Maintainer permission in PROJECT
188
+ --health-problem-type PROBLEM_TYPE
189
+ Look for the given health problem type (failures, pass-after-retry, slow)
190
+ -v, --version Show the version
191
+ -h, --help Show the usage
192
+ ```
193
+
180
194
  ### `exe/flaky-test-issues`
181
195
 
182
196
  ```shell
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "optparse"
6
+
7
+ require_relative "../lib/gitlab_quality/test_tooling"
8
+
9
+ params = {}
10
+ HEALTH_PROBLEM_TYPES = GitlabQuality::TestTooling::Report::TestHealthIssueFinder::HEALTH_PROBLEM_TYPE_TO_LABEL.keys
11
+
12
+ options = OptionParser.new do |opts|
13
+ opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
14
+
15
+ opts.on('-i', '--input-files INPUT_FILES', String, 'JSON rspec-retry report files') do |input_files|
16
+ params[:input_files] = input_files
17
+ end
18
+
19
+ opts.on('-p', '--project PROJECT', String, 'Can be an integer or a group/project string') do |project|
20
+ params[:project] = project
21
+ end
22
+
23
+ opts.on('-t', '--token TOKEN', String, 'A valid access token with `api` scope and Maintainer permission in PROJECT') do |token|
24
+ params[:token] = token
25
+ end
26
+
27
+ opts.on("--health-problem-type PROBLEM_TYPE", String, "Look for the given health problem type (#{HEALTH_PROBLEM_TYPES.join(', ')})") do |value|
28
+ raise ArgumentError, "Invalid health problem type: #{value}. Valid options are: #{HEALTH_PROBLEM_TYPES.join(', ')}" unless HEALTH_PROBLEM_TYPES.include?(value)
29
+
30
+ params[:health_problem_type] = value
31
+ end
32
+
33
+ opts.on_tail('-v', '--version', 'Show the version') do
34
+ require_relative "../lib/gitlab_quality/test_tooling/version"
35
+ puts "#{$PROGRAM_NAME} : #{GitlabQuality::TestTooling::VERSION}"
36
+ exit
37
+ end
38
+
39
+ opts.on_tail('-h', '--help', 'Show the usage') do
40
+ puts "Purpose: Checks whether tests coming from the rspec JSON report files has an existing test health issue opened."
41
+ puts opts
42
+ exit
43
+ end
44
+
45
+ opts.parse(ARGV)
46
+ end
47
+
48
+ if params.any?
49
+ raise ArgumentError, "No health problem type given. Valid options are: #{HEALTH_PROBLEM_TYPES.join(', ')}" unless params.key?(:health_problem_type)
50
+
51
+ if GitlabQuality::TestTooling::Report::TestHealthIssueFinder.new(**params).found_existing_unhealthy_test_issue?
52
+ exit 0
53
+ else
54
+ exit 1
55
+ end
56
+ else
57
+ puts options
58
+ exit 1
59
+ end
@@ -29,6 +29,17 @@ module GitlabQuality
29
29
  @max_diff_ratio = max_diff_ratio.to_f
30
30
  end
31
31
 
32
+ def most_recent_report_date_for_issue(issue_iid:)
33
+ reports_discussion = existing_reports_discussion(issue_iid: issue_iid)
34
+ return unless reports_discussion
35
+
36
+ # We're skipping the first note of the discussion as this is the "non-collapsible note", aka
37
+ # the "header note", which doesn't contain any stack trace.
38
+ reports_discussion.notes[1..].filter_map do |reports_note|
39
+ most_recent_report_from_reports_note(reports_note)&.report_date
40
+ end.max
41
+ end
42
+
32
43
  private
33
44
 
34
45
  attr_reader :base_issue_labels, :max_diff_ratio
@@ -37,12 +48,57 @@ module GitlabQuality
37
48
  'failed'
38
49
  end
39
50
 
40
- def test_is_applicable?(test)
41
- test.status == 'failed'
51
+ # We redefine this method, because we are reporting failed tests in a discussion instead of a comment.
52
+ #
53
+ # We do this because a test could fail for many different reasons, so we report
54
+ # different test failures in the same discussion, under different threads.
55
+ def add_report_to_issue(issue:, test:, related_issues:)
56
+ reports_discussion = find_or_create_reports_discussion(issue_iid: issue.iid)
57
+ current_reports_note = find_failure_discussion_note(issue: issue, test: test, reports_discussion: reports_discussion)
58
+
59
+ new_reports_list = new_reports_list(current_reports_note: current_reports_note, test: test)
60
+ note_body = new_note_body(
61
+ new_reports_list: new_reports_list,
62
+ related_issues: related_issues,
63
+ options: {
64
+ reports_discussion: reports_discussion,
65
+ test: test
66
+ }
67
+ )
68
+
69
+ if current_reports_note
70
+ gitlab.edit_issue_note(
71
+ issue_iid: issue.iid,
72
+ note_id: current_reports_note.id,
73
+ note: note_body
74
+ )
75
+ else
76
+ gitlab.add_note_to_issue_discussion_as_thread(
77
+ iid: issue.iid,
78
+ discussion_id: reports_discussion.id,
79
+ note: note_body
80
+ )
81
+ end
82
+ end
83
+
84
+ def find_or_create_reports_discussion(issue_iid:)
85
+ reports_discussion = existing_reports_discussion(issue_iid: issue_iid)
86
+ return reports_discussion if reports_discussion
87
+
88
+ gitlab.create_issue_discussion(iid: issue_iid, note: report_section_header)
42
89
  end
43
90
 
44
- def report_in_discussion?
45
- true
91
+ def existing_reports_discussion(issue_iid:)
92
+ gitlab.find_issue_discussions(iid: issue_iid).find do |discussion|
93
+ next if discussion.individual_note
94
+ next unless discussion.notes.first
95
+
96
+ discussion.notes.first.body.start_with?(report_section_header)
97
+ end
98
+ end
99
+
100
+ def test_is_applicable?(test)
101
+ test.status == 'failed'
46
102
  end
47
103
 
48
104
  def identity_labels
@@ -57,8 +113,30 @@ module GitlabQuality
57
113
  "##### Stack trace\n\n```\n#{test.full_stacktrace}\n```"
58
114
  end
59
115
 
60
- def health_problem_status_label_quick_action(reports_list)
61
- '/label ~"priority::1" ~"severity::1"' if reports_list.spiked_in_short_period?
116
+ def health_problem_status_label_quick_action(reports_list, options: {})
117
+ quick_actions = []
118
+ quick_actions << '/label ~"priority::1" ~"severity::1"' if reports_list.spiked_in_short_period?
119
+
120
+ # We can have several kinds of failures for a single test.
121
+ # We want to count all the failures that are reported for a test.
122
+ reports_notes = options[:reports_discussion].notes[1..] || []
123
+ all_reports_count = reports_notes.sum do |report_note|
124
+ new_reports_list(current_reports_note: report_note, test: options[:test]).reports_count
125
+ end
126
+
127
+ quick_actions <<
128
+ case all_reports_count
129
+ when 149..Float::INFINITY
130
+ '/label ~"failed-tests::1"'
131
+ when 137..148
132
+ '/label ~"failed-tests::2"'
133
+ when 130..136
134
+ '/label ~"failed-tests::3"'
135
+ else
136
+ '/label ~"failed-tests::4"'
137
+ end
138
+
139
+ quick_actions.join("\n")
62
140
  end
63
141
 
64
142
  def up_to_date_labels(test:, issue: nil, new_labels: Set.new)
@@ -52,7 +52,7 @@ module GitlabQuality
52
52
  REPORTS_DOCUMENTATION
53
53
  end
54
54
 
55
- def health_problem_status_label_quick_action(reports_list)
55
+ def health_problem_status_label_quick_action(reports_list, **)
56
56
  case reports_list.reports_count
57
57
  when 399..Float::INFINITY
58
58
  '/label ~"flakiness::1"'
@@ -11,7 +11,7 @@ module GitlabQuality
11
11
  # - Takes a project where flaky test issues should be created
12
12
  # - For every passed test in the report:
13
13
  # - Find issue by test hash or create a new issue if no issue was found
14
- # - Add a flakiness report in the "Flakiness reports" note
14
+ # - Add a Failures/Flakiness/Slowness/... report in the "<Failures/Flakiness/Slowness/...> reports" note
15
15
  class HealthProblemReporter < ReportAsIssue
16
16
  include Concerns::GroupAndCategoryLabels
17
17
  include Concerns::IssueReports
@@ -25,11 +25,10 @@ module GitlabQuality
25
25
  end
26
26
 
27
27
  def most_recent_report_date_for_issue(issue_iid:)
28
- if report_in_discussion?
29
- most_recent_report_from_discussion(issue_iid: issue_iid)
30
- else
31
- most_recent_report_from_note(issue_iid: issue_iid)
32
- end
28
+ reports_note = existing_reports_note(issue_iid: issue_iid)
29
+ return unless reports_note
30
+
31
+ most_recent_report_from_reports_note(reports_note)&.report_date
33
32
  end
34
33
 
35
34
  private
@@ -42,10 +41,6 @@ module GitlabQuality
42
41
  false
43
42
  end
44
43
 
45
- def report_in_discussion?
46
- false
47
- end
48
-
49
44
  def identity_labels
50
45
  []
51
46
  end
@@ -58,15 +53,11 @@ module GitlabQuality
58
53
  ''
59
54
  end
60
55
 
61
- def find_failure_discussion_note(_issue:, _test:, _reports_discussion:)
62
- nil
63
- end
64
-
65
56
  def reports_extra_content(_test)
66
57
  ''
67
58
  end
68
59
 
69
- def health_problem_status_label_quick_action(_reports_count)
60
+ def health_problem_status_label_quick_action(*)
70
61
  ''
71
62
  end
72
63
 
@@ -74,24 +65,6 @@ module GitlabQuality
74
65
  found_label
75
66
  end
76
67
 
77
- def most_recent_report_from_discussion(issue_iid:)
78
- reports_discussion = existing_reports_discussion(issue_iid: issue_iid)
79
- return unless reports_discussion
80
-
81
- # We're skipping the first note of the discussion as this is the "non-collapsible note", aka
82
- # the "header note", which doesn't contain any stack trace.
83
- reports_discussion.notes[1..].filter_map do |reports_note|
84
- most_recent_report_from_reports_note(reports_note)&.report_date
85
- end.max
86
- end
87
-
88
- def most_recent_report_from_note(issue_iid:)
89
- reports_note = existing_reports_note(issue_iid: issue_iid)
90
- return unless reports_note
91
-
92
- most_recent_report_from_reports_note(reports_note)&.report_date
93
- end
94
-
95
68
  def most_recent_report_from_reports_note(reports_note)
96
69
  @most_recent_report_from_reports_note ||= report_lines(reports_note&.body.to_s).first
97
70
  end
@@ -138,24 +111,11 @@ module GitlabQuality
138
111
  end
139
112
  end
140
113
 
141
- def add_report_to_issue(issue:, test:, related_issues:) # rubocop:disable Metrics/AbcSize -- FIXME
142
- current_reports_note =
143
- if report_in_discussion?
144
- reports_discussion = find_or_create_reports_discussion(issue_iid: issue.iid)
145
-
146
- find_failure_discussion_note(issue: issue, test: test, reports_discussion: reports_discussion)
147
- else
148
- existing_reports_note(issue_iid: issue.iid)
149
- end
114
+ def add_report_to_issue(issue:, test:, related_issues:)
115
+ current_reports_note = existing_reports_note(issue_iid: issue.iid)
150
116
 
151
- new_reports_list = add_report_for_test(current_reports_content: current_reports_note&.body.to_s, test: test)
152
-
153
- note_body = [
154
- new_reports_list.to_s,
155
- health_problem_status_label_quick_action(new_reports_list),
156
- identity_labels_quick_action,
157
- relate_issues_quick_actions(related_issues)
158
- ].join("\n")
117
+ new_reports_list = new_reports_list(current_reports_note: current_reports_note, test: test)
118
+ note_body = new_note_body(new_reports_list: new_reports_list, related_issues: related_issues)
159
119
 
160
120
  if current_reports_note
161
121
  gitlab.edit_issue_note(
@@ -163,31 +123,31 @@ module GitlabQuality
163
123
  note_id: current_reports_note.id,
164
124
  note: note_body
165
125
  )
166
- elsif report_in_discussion?
167
- gitlab.add_note_to_issue_discussion_as_thread(
168
- iid: issue.iid,
169
- discussion_id: reports_discussion.id,
170
- note: note_body
171
- )
172
126
  else
173
127
  gitlab.create_issue_note(iid: issue.iid, note: note_body)
174
128
  end
175
129
  end
176
130
 
177
- def find_or_create_reports_discussion(issue_iid:)
178
- reports_discussion = existing_reports_discussion(issue_iid: issue_iid)
179
- return reports_discussion if reports_discussion
180
-
181
- gitlab.create_issue_discussion(iid: issue_iid, note: report_section_header)
131
+ def new_reports_list(current_reports_note:, test:)
132
+ increment_reports(
133
+ current_reports_content: current_reports_note&.body.to_s,
134
+ test: test,
135
+ reports_section_header: report_section_header,
136
+ item_extra_content: item_extra_content(test),
137
+ reports_extra_content: reports_extra_content(test)
138
+ )
182
139
  end
183
140
 
184
- def existing_reports_discussion(issue_iid:)
185
- gitlab.find_issue_discussions(iid: issue_iid).find do |discussion|
186
- next if discussion.individual_note
187
- next unless discussion.notes.first
141
+ def new_note_body(new_reports_list:, related_issues:, options: {})
142
+ report = new_reports_list
188
143
 
189
- discussion.notes.first.body.start_with?(report_section_header)
190
- end
144
+ quick_actions = [
145
+ health_problem_status_label_quick_action(new_reports_list, options: options),
146
+ identity_labels_quick_action,
147
+ relate_issues_quick_actions(related_issues)
148
+ ]
149
+
150
+ quick_actions.unshift(report).join("\n")
191
151
  end
192
152
 
193
153
  def existing_reports_note(issue_iid:)
@@ -196,16 +156,6 @@ module GitlabQuality
196
156
  end
197
157
  end
198
158
 
199
- def add_report_for_test(current_reports_content:, test:)
200
- increment_reports(
201
- current_reports_content: current_reports_content,
202
- test: test,
203
- reports_section_header: report_section_header,
204
- item_extra_content: item_extra_content(test),
205
- reports_extra_content: reports_extra_content(test)
206
- )
207
- end
208
-
209
159
  def found_label
210
160
  if ENV.key?('CI_MERGE_REQUEST_IID')
211
161
  FOUND_IN_MR_LABEL
@@ -42,7 +42,7 @@ module GitlabQuality
42
42
  REPORTS_DOCUMENTATION
43
43
  end
44
44
 
45
- def health_problem_status_label_quick_action(reports_list)
45
+ def health_problem_status_label_quick_action(reports_list, **)
46
46
  case reports_list.reports_count
47
47
  when 6099..Float::INFINITY
48
48
  '/label ~"slowness::1"'
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'http'
4
+ require 'json'
5
+
6
+ module GitlabQuality
7
+ module TestTooling
8
+ module Report
9
+ class TestHealthIssueFinder < ReportAsIssue
10
+ HEALTH_PROBLEM_TYPE_TO_LABEL = {
11
+ 'pass-after-retry' => 'test-health:pass-after-retry',
12
+ 'slow' => 'test-health:slow',
13
+ 'failures' => 'test-health:failures'
14
+ }.freeze
15
+
16
+ def initialize(health_problem_type: [], **kwargs)
17
+ super(**kwargs)
18
+
19
+ @health_problem_type = health_problem_type
20
+ end
21
+
22
+ def found_existing_unhealthy_test_issue?
23
+ issue_url = invoke!
24
+
25
+ !issue_url.nil? && !issue_url.empty?
26
+ end
27
+
28
+ def run!
29
+ existing_issue_found = nil
30
+
31
+ applicable_tests.each do |test|
32
+ issues = find_issues_by_hash(test_hash(test), state: 'opened', labels: search_labels)
33
+ next if issues.empty?
34
+
35
+ existing_issue_found = issues.first.web_url
36
+ puts "Found an existing test health issue of type #{health_problem_type} for test #{test.file}:#{test.line_number}: #{existing_issue_found}."
37
+ break
38
+ end
39
+
40
+ puts "Did not find an existing test health issue of type #{health_problem_type}." unless existing_issue_found
41
+
42
+ existing_issue_found
43
+ end
44
+
45
+ def applicable_tests
46
+ applicable_tests = []
47
+
48
+ TestResults::Builder.new(file_glob: files, token: token, project: project).test_results_per_file do |test_results|
49
+ applicable_tests = test_results.select { |test| test_is_applicable?(test) }
50
+ end
51
+
52
+ applicable_tests
53
+ end
54
+
55
+ private
56
+
57
+ attr_reader :health_problem_type
58
+
59
+ # Be mindful about the number of tests this method would return,
60
+ # as we will make at least one API request per test.
61
+ def test_is_applicable?(test)
62
+ expected_test_status =
63
+ case health_problem_type
64
+ when 'failures'
65
+ 'failed'
66
+ else
67
+ 'passed'
68
+ end
69
+
70
+ test.status == expected_test_status
71
+ end
72
+
73
+ def search_labels
74
+ ['test', HEALTH_PROBLEM_TYPE_TO_LABEL[health_problem_type]]
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitlabQuality
4
4
  module TestTooling
5
- VERSION = "1.39.0"
5
+ VERSION = "2.1.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: 1.39.0
4
+ version: 2.1.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: 2024-10-07 00:00:00.000000000 Z
11
+ date: 2024-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '12.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '12.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: guard-rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +192,20 @@ dependencies:
192
192
  - - '='
193
193
  - !ruby/object:Gem::Version
194
194
  version: 3.7.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: rspec_junit_formatter
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: 0.6.0
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: 0.6.0
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: activesupport
197
211
  requirement: !ruby/object:Gem::Requirement
@@ -230,16 +244,22 @@ dependencies:
230
244
  name: gitlab
231
245
  requirement: !ruby/object:Gem::Requirement
232
246
  requirements:
233
- - - "~>"
247
+ - - ">="
234
248
  - !ruby/object:Gem::Version
235
249
  version: '4.19'
250
+ - - "<"
251
+ - !ruby/object:Gem::Version
252
+ version: '6.0'
236
253
  type: :runtime
237
254
  prerelease: false
238
255
  version_requirements: !ruby/object:Gem::Requirement
239
256
  requirements:
240
- - - "~>"
257
+ - - ">="
241
258
  - !ruby/object:Gem::Version
242
259
  version: '4.19'
260
+ - - "<"
261
+ - !ruby/object:Gem::Version
262
+ version: '6.0'
243
263
  - !ruby/object:Gem::Dependency
244
264
  name: http
245
265
  requirement: !ruby/object:Gem::Requirement
@@ -394,6 +414,7 @@ description: A collection of test-related tools.
394
414
  email:
395
415
  - quality@gitlab.com
396
416
  executables:
417
+ - existing-test-health-issue
397
418
  - failed-test-issues
398
419
  - flaky-test-issues
399
420
  - generate-test-session
@@ -423,6 +444,7 @@ files:
423
444
  - LICENSE.txt
424
445
  - README.md
425
446
  - Rakefile
447
+ - exe/existing-test-health-issue
426
448
  - exe/failed-test-issues
427
449
  - exe/flaky-test-issues
428
450
  - exe/generate-test-session
@@ -471,6 +493,7 @@ files:
471
493
  - lib/gitlab_quality/test_tooling/report/results_in_issues.rb
472
494
  - lib/gitlab_quality/test_tooling/report/results_in_test_cases.rb
473
495
  - lib/gitlab_quality/test_tooling/report/slow_test_issue.rb
496
+ - lib/gitlab_quality/test_tooling/report/test_health_issue_finder.rb
474
497
  - lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb
475
498
  - lib/gitlab_quality/test_tooling/runtime/env.rb
476
499
  - lib/gitlab_quality/test_tooling/runtime/logger.rb
@@ -527,7 +550,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
527
550
  requirements:
528
551
  - - ">="
529
552
  - !ruby/object:Gem::Version
530
- version: 2.6.0
553
+ version: 3.1.0
531
554
  required_rubygems_version: !ruby/object:Gem::Requirement
532
555
  requirements:
533
556
  - - ">="