knapsack_pro 3.3.1 → 3.4.1

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: 11036d33c04d07966ab4acadc55b1fb20a885b0e9b0d78fc8cf03fe798b7c3bf
4
- data.tar.gz: 8ddfce179b4f7fce9bd28ae965bf15bec132b26b217326d5ce156e94e21cb145
3
+ metadata.gz: 6c1d109eab55a41f0ad16de94f9675299a8df07eca2c1bca2edf92c588fe2adb
4
+ data.tar.gz: 05d6fec7a5c6a8d594b78e80eecff4bad0282e4f10bb5e772eae25d659c39bb3
5
5
  SHA512:
6
- metadata.gz: 4c27910d9850ad2d229864dac8b07cb17d9d23a9bd2d14aa05052b6e95a3e218667b32fb40f711324651d2bcd6ee8d180fc7d743ba5cd3b990908ab05d5c57de
7
- data.tar.gz: a868ac3c2ef9c1fdefc655b2dbb59c8034cc21101717be46400fdeec087bd99c62c43c5357fbba1eccfe8a8cc23b032ee1e9e8eb14e75304357ccbe6a179a32b
6
+ metadata.gz: 01bd206ae95503b54abad29acc5bd29e658b5ee9b8fe0c7d31b1a78e8aee0b364a0d74f619306633e599f004a2e2fdb8c8b188b389e5e26255838c9b17b45c33
7
+ data.tar.gz: 7067285b1dc323859d8547df7c6d3edcb7c1cfa2f14251be9a857d957212d08666fdd82ae1426c7a614d93692b86131283606e6b57e73f9a1064b47b4af9355a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ### 3.4.1
4
+
5
+ * Improve the RSpec Queue Mode runner log output (add seed)
6
+
7
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/178
8
+
9
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v3.4.0...v3.4.1
10
+
11
+ ### 3.4.0
12
+
13
+ * Update documentation and code because the encryption feature does not work with the RSpec split by examples feature
14
+
15
+ Update docs: https://github.com/KnapsackPro/knapsack_pro-ruby/pull/176
16
+
17
+ Update code: https://github.com/KnapsackPro/knapsack_pro-ruby/pull/177
18
+
19
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v3.3.1...v3.4.0
20
+
3
21
  ### 3.3.1
4
22
 
5
23
  * Skip loading a test file path for Minitest in Queue Mode when it does not exist on the disk
data/README.md CHANGED
@@ -97,7 +97,6 @@ The knapsack_pro has also [queue mode](#queue-mode) to get an optimal test suite
97
97
  - [Test file names encryption](#test-file-names-encryption)
98
98
  - [How to enable test file names encryption?](#how-to-enable-test-file-names-encryption)
99
99
  - [How to debug test file names?](#how-to-debug-test-file-names)
100
- - [Preview encrypted RSpec test example paths?](#preview-encrypted-rspec-test-example-paths)
101
100
  - [How to enable branch names encryption?](#how-to-enable-branch-names-encryption)
102
101
  - [How to debug branch names?](#how-to-debug-branch-names)
103
102
  - [Supported CI providers](#supported-ci-providers)
@@ -719,72 +718,61 @@ This is optional way of using knapsack_pro when you don't want to add it to `Gem
719
718
 
720
719
  ### Test file names encryption
721
720
 
722
- knapsack_pro gem collects information about you test file names and time execution. Those data are stored on KnapsackPro.com server.
723
- If your test file names or branch names are sensitive data then you can encrypt the names before sending them to KnapsackPro.com API.
721
+ The knapsack_pro gem collects information about your test file names, branch names, and execution times. The data are stored on the KnapsackPro.com server.
722
+ If your test file names or branch names are considered sensitive data, then you can encrypt the data before sending it to the KnapsackPro.com API.
724
723
 
725
- By default, encryption is disabled because knapsack_pro can use your test files names to prepare better test suite split when the time execution data are not yet collected on KnapsackPro.com server.
726
- When you will enable test file names encryption then your first test suite split may be less optimal than it could be.
724
+ Encryption is disabled by default because the knapsack_pro gem uses your test file names to prepare a better test suite split when the execution time data are not collected on the KnapsackPro.com server yet.
725
+ When you enable the encryption, then your first test suite split may not be optimal.
727
726
 
728
- Each test file name is generated with `Digest::SHA2.hexdigest` method and 64 chars salt.
727
+ Each test file name is generated with the `Digest::SHA2.hexdigest` method and 64 chars salt.
729
728
 
730
- Before you enable test file encryption please ensure you are using fresh API key. You should not use the same API key for encrypted and non encrypted test suite.
731
- You can generate API key for your test suite in [your dashboard](https://knapsackpro.com).
729
+ Before you enable encryption, please ensure you are using a fresh API token. Do not use the same API token for the encrypted and non-encrypted test suite. You can generate an API token for your test suite in the [user dashboard](https://knapsackpro.com/dashboard).
732
730
 
733
- Next step is to generate salt which will be used to encrypt test files or branch names.
731
+ The next step is to generate a salt to encrypt test files or branch names with it.
734
732
 
735
733
  ```bash
736
734
  bundle exec rake knapsack_pro:salt
737
735
  ```
738
736
 
739
- Add to your CI server generated environment variable `KNAPSACK_PRO_SALT`.
737
+ Add the salt to your CI server as the `KNAPSACK_PRO_SALT` environment variable.
740
738
 
741
739
  #### How to enable test file names encryption?
742
740
 
743
- You need to add environment variable `KNAPSACK_PRO_TEST_FILES_ENCRYPTED=true` to your CI server.
741
+ You need to add the `KNAPSACK_PRO_TEST_FILES_ENCRYPTED=true` environment variable to your CI server.
744
742
 
745
743
  #### How to debug test file names?
746
744
 
747
- If you need to check what is the encryption hash for particular test file you can check that with the rake task:
745
+ If you need to check what is the hash value for a particular test file you can check that with the rake task:
748
746
 
749
747
  ```bash
750
- KNAPSACK_PRO_SALT=xxx bundle exec rake knapsack_pro:encrypted_test_file_names[rspec]
748
+ KNAPSACK_PRO_SALT=xxx bundle exec rake "knapsack_pro:encrypted_test_file_names[rspec]"
751
749
  ```
752
750
 
753
- You can pass the name of test runner like `rspec`, `minitest`, `test_unit`, `cucumber`, `spinach` as argument to rake task.
754
-
755
- ##### Preview encrypted RSpec test example paths?
756
-
757
- If you split RSpec tests by test examples (by individual `it`) you can preview encrypted test example paths this way:
758
-
759
- ```bash
760
- KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true \
761
- KNAPSACK_PRO_SALT=xxx \
762
- bundle exec rake knapsack_pro:encrypted_test_file_names[rspec]
763
- ```
751
+ You can pass the name of a test runner like `rspec`, `minitest`, `test_unit`, `cucumber`, `spinach` as an argument to the rake task.
764
752
 
765
753
  #### How to enable branch names encryption?
766
754
 
767
- You need to add environment variable `KNAPSACK_PRO_BRANCH_ENCRYPTED=true` to your CI server.
755
+ You need to add the `KNAPSACK_PRO_BRANCH_ENCRYPTED=true` environment variable to your CI server.
768
756
 
769
- Note: there are a few branch names that won't be encrypted because we use them as fallback branches on Knapsack Pro API side to determine time execution for test files during split for newly created branches.
757
+ Note a few branch names won't be encrypted because we use them as fallback branches on the Knapsack Pro API side to determine time execution for test files during split for newly created branches.
770
758
 
771
759
  * develop
772
760
  * development
773
761
  * dev
774
762
  * master
775
763
  * staging
776
- * [see full list of encryption excluded branch names](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/lib/knapsack_pro/crypto/branch_encryptor.rb#L4)
764
+ * [see the full list of excluded branch names from encryption](https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/lib/knapsack_pro/crypto/branch_encryptor.rb#L4)
777
765
 
778
766
  #### How to debug branch names?
779
767
 
780
- If you need to check what is the encryption hash for particular branch then use the rake task:
768
+ If you need to check what is the hash for a particular branch, then use the rake task:
781
769
 
782
770
  ```bash
783
771
  # show all local branches and respective hashes
784
772
  $ KNAPSACK_PRO_SALT=xxx bundle exec rake knapsack_pro:encrypted_branch_names
785
773
 
786
- # show hash for branch provided as argument to rake task
787
- $ KNAPSACK_PRO_SALT=xxx bundle exec rake knapsack_pro:encrypted_branch_names[not-encrypted-branch-name]
774
+ # show the hash for a branch name passed as an argument to the rake task
775
+ $ KNAPSACK_PRO_SALT=xxx bundle exec rake "knapsack_pro:encrypted_branch_names[not-encrypted-branch-name]"
788
776
  ```
789
777
 
790
778
  ### Supported CI providers
@@ -12,16 +12,15 @@ module KnapsackPro
12
12
  end
13
13
 
14
14
  def self.has_tag_option?(cli_args)
15
- # use start_with? because user can define tag option in a few ways:
16
- # -t mytag
17
- # -tmytag
18
- # --tag mytag
19
- # --tag=mytag
20
- cli_args.any? { |arg| arg.start_with?('-t') || arg.start_with?('--tag') }
15
+ !!parsed_options(cli_args)&.[](:inclusion_filter)
21
16
  end
22
17
 
23
18
  def self.has_format_option?(cli_args)
24
- cli_args.any? { |arg| arg.start_with?('-f') || arg.start_with?('--format') }
19
+ !!parsed_options(cli_args)&.[](:formatters)
20
+ end
21
+
22
+ def self.order_option(cli_args)
23
+ parsed_options(cli_args)&.[](:order)
25
24
  end
26
25
 
27
26
  def self.test_path(example)
@@ -107,6 +106,12 @@ module KnapsackPro
107
106
  def self.rspec_configuration
108
107
  ::RSpec.configuration
109
108
  end
109
+
110
+ def self.parsed_options(cli_args)
111
+ ::RSpec::Core::Parser.parse(cli_args)
112
+ rescue SystemExit
113
+ nil
114
+ end
110
115
  end
111
116
 
112
117
  # This is added to provide backwards compatibility
@@ -2,6 +2,8 @@ module KnapsackPro
2
2
  module Runners
3
3
  module Queue
4
4
  class RSpecRunner < BaseRunner
5
+ @@used_seed = nil
6
+
5
7
  def self.run(args)
6
8
  require 'rspec/core'
7
9
  require_relative '../../formatters/rspec_queue_summary_formatter'
@@ -11,7 +13,6 @@ module KnapsackPro
11
13
  ENV['KNAPSACK_PRO_QUEUE_RECORDING_ENABLED'] = 'true'
12
14
  ENV['KNAPSACK_PRO_QUEUE_ID'] = KnapsackPro::Config::EnvGenerator.set_queue_id
13
15
 
14
- adapter_class = KnapsackPro::Adapters::RSpecAdapter
15
16
  KnapsackPro::Config::Env.set_test_runner_adapter(adapter_class)
16
17
  runner = new(adapter_class)
17
18
 
@@ -61,6 +62,8 @@ module KnapsackPro
61
62
  KnapsackPro::Formatters::RSpecQueueSummaryFormatter.print_summary
62
63
  KnapsackPro::Formatters::RSpecQueueProfileFormatterExtension.print_summary
63
64
 
65
+ args += ['--seed', @@used_seed] if @@used_seed
66
+
64
67
  log_rspec_command(args, all_test_file_paths, :end_of_queue)
65
68
  end
66
69
 
@@ -82,12 +85,15 @@ module KnapsackPro
82
85
  all_test_file_paths += test_file_paths
83
86
  cli_args = args + test_file_paths
84
87
 
85
- log_rspec_command(args, test_file_paths, :subset_queue)
86
-
87
88
  options = ::RSpec::Core::ConfigurationOptions.new(cli_args)
88
- exit_code = ::RSpec::Core::Runner.new(options).run($stderr, $stdout)
89
+ rspec_runner = ::RSpec::Core::Runner.new(options)
90
+
91
+ exit_code = rspec_runner.run($stderr, $stdout)
89
92
  exitstatus = exit_code if exit_code != 0
90
93
 
94
+ printable_args = args_with_seed_option_added_when_viable(args, rspec_runner)
95
+ log_rspec_command(printable_args, test_file_paths, :subset_queue)
96
+
91
97
  rspec_clear_examples
92
98
 
93
99
  KnapsackPro::Hooks::Queue.call_after_subset_queue
@@ -107,19 +113,22 @@ module KnapsackPro
107
113
 
108
114
  private
109
115
 
116
+ def self.adapter_class
117
+ KnapsackPro::Adapters::RSpecAdapter
118
+ end
119
+
110
120
  def self.log_rspec_command(cli_args, test_file_paths, type)
111
121
  case type
112
122
  when :subset_queue
113
- KnapsackPro.logger.info("To retry the last batch of tests fetched from the API Queue, please run the following command on your machine. (If you use the `-- order random` option, remember to add correct `--seed 123` that you can find at the end of the RSpec output.)")
123
+ KnapsackPro.logger.info("To retry the last batch of tests fetched from the API Queue, please run the following command on your machine:")
114
124
  when :end_of_queue
115
125
  KnapsackPro.logger.info("To retry all the tests assigned to this CI node, please run the following command on your machine:")
116
126
  end
117
127
 
118
- stringify_cli_args = cli_args.join(' ')
119
- stringify_cli_args.slice!("--format #{KnapsackPro::Formatters::RSpecQueueSummaryFormatter}")
128
+ stringified_cli_args = cli_args.join(' ').sub(" --format #{KnapsackPro::Formatters::RSpecQueueSummaryFormatter}", '')
120
129
 
121
130
  KnapsackPro.logger.info(
122
- "bundle exec rspec #{stringify_cli_args} " +
131
+ "bundle exec rspec #{stringified_cli_args} " +
123
132
  KnapsackPro::TestFilePresenter.stringify_paths(test_file_paths)
124
133
  )
125
134
  end
@@ -151,6 +160,24 @@ module KnapsackPro
151
160
  ::RSpec.configuration.reset_filters
152
161
  end
153
162
  end
163
+
164
+ def self.args_with_seed_option_added_when_viable(args, rspec_runner)
165
+ order_option = adapter_class.order_option(args)
166
+
167
+ if order_option
168
+ # Don't add the seed option for order other than random, e.g. `defined`
169
+ return args unless order_option.include?('rand')
170
+ # Don't add the seed option if the seed is already set in args, e.g. `rand:12345`
171
+ return args if order_option.to_s.split(':')[1]
172
+ end
173
+
174
+ # Don't add the seed option if the seed was not used (i.e. a different order is being used, e.g. `defined`)
175
+ return args unless rspec_runner.configuration.seed_used?
176
+
177
+ @@used_seed = rspec_runner.configuration.seed.to_s
178
+
179
+ args + ['--seed', @@used_seed]
180
+ end
154
181
  end
155
182
  end
156
183
  end
@@ -1,3 +1,3 @@
1
1
  module KnapsackPro
2
- VERSION = '3.3.1'
2
+ VERSION = '3.4.1'
3
3
  end
@@ -19,15 +19,8 @@ namespace :knapsack_pro do
19
19
  raise('Provide adapter name like rspec, minitest, test_unit, cucumber, spinach')
20
20
  end
21
21
 
22
- test_files =
23
- if adapter_class == KnapsackPro::Adapters::RSpecAdapter && KnapsackPro::Config::Env.rspec_split_by_test_examples?
24
- detector = KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector.new
25
- detector.generate_json_report
26
- detector.test_file_example_paths
27
- else
28
- test_file_pattern = KnapsackPro::TestFilePattern.call(adapter_class)
29
- KnapsackPro::TestFileFinder.call(test_file_pattern)
30
- end
22
+ test_file_pattern = KnapsackPro::TestFilePattern.call(adapter_class)
23
+ test_files = KnapsackPro::TestFileFinder.call(test_file_pattern)
31
24
 
32
25
  test_file_names = []
33
26
  test_files.each do |t|
@@ -110,6 +110,58 @@ describe KnapsackPro::Adapters::RSpecAdapter do
110
110
  end
111
111
  end
112
112
 
113
+ describe '.order_option' do
114
+ subject { described_class.order_option(cli_args) }
115
+
116
+ context "when order is 'defined'" do
117
+ let(:cli_args) { ['--order', 'defined'] }
118
+
119
+ it { expect(subject).to eq 'defined' }
120
+ end
121
+
122
+ context "when order is 'recently-modified'" do
123
+ let(:cli_args) { ['--order', 'recently-modified'] }
124
+
125
+ it { expect(subject).to eq 'recently-modified' }
126
+ end
127
+
128
+ context "when order is 'rand'" do
129
+ let(:cli_args) { ['--order', 'rand'] }
130
+
131
+ it { expect(subject).to eq 'rand' }
132
+
133
+ context 'with the seed' do
134
+ let(:cli_args) { ['--order', 'rand:123456'] }
135
+
136
+ it { expect(subject).to eq 'rand:123456' }
137
+ end
138
+ end
139
+
140
+ context "when order is 'random'" do
141
+ let(:cli_args) { ['--order', 'random'] }
142
+
143
+ it { expect(subject).to eq 'random' }
144
+
145
+ context 'with the seed' do
146
+ let(:cli_args) { ['--order', 'random:123456'] }
147
+
148
+ it { expect(subject).to eq 'random:123456' }
149
+ end
150
+ end
151
+
152
+ context 'when some custom order is specified' do
153
+ let(:cli_args) { ['--order', 'some-custom-order'] }
154
+
155
+ it { expect(subject).to eq 'some-custom-order' }
156
+ end
157
+
158
+ context "when the seed is given with the --seed command" do
159
+ let(:cli_args) { ['--seed', '123456'] }
160
+
161
+ it { expect(subject).to eq 'rand:123456' }
162
+ end
163
+ end
164
+
113
165
  describe '.test_path' do
114
166
  let(:example_group) do
115
167
  {
@@ -177,7 +177,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
177
177
  describe '.run_tests' do
178
178
  let(:runner) { instance_double(described_class) }
179
179
  let(:can_initialize_queue) { double(:can_initialize_queue) }
180
- let(:args) { ['--example-arg', 'example-value', '--default-path', 'fake-test-dir'] }
180
+ let(:args) { ['--no-color', '--default-path', 'fake-test-dir'] }
181
181
  let(:exitstatus) { double }
182
182
  let(:all_test_file_paths) { [] }
183
183
  let(:accumulator) do
@@ -198,6 +198,8 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
198
198
 
199
199
  context 'when test files exist' do
200
200
  let(:test_file_paths) { ['a_spec.rb', 'b_spec.rb'] }
201
+ let(:logger) { double }
202
+ let(:rspec_seed) { 7771 }
201
203
 
202
204
  before do
203
205
  subset_queue_id = 'fake-subset-queue-id'
@@ -212,7 +214,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
212
214
 
213
215
  options = double
214
216
  expect(RSpec::Core::ConfigurationOptions).to receive(:new).with([
215
- '--example-arg', 'example-value',
217
+ '--no-color',
216
218
  '--default-path', 'fake-test-dir',
217
219
  'a_spec.rb', 'b_spec.rb',
218
220
  ]).and_return(options)
@@ -226,6 +228,16 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
226
228
  expect(KnapsackPro::Hooks::Queue).to receive(:call_after_subset_queue)
227
229
 
228
230
  expect(KnapsackPro::Report).to receive(:save_subset_queue_to_file)
231
+
232
+ configuration = double
233
+ expect(rspec_core_runner).to receive(:configuration).twice.and_return(configuration)
234
+ expect(configuration).to receive(:seed_used?).and_return(true)
235
+ expect(configuration).to receive(:seed).and_return(rspec_seed)
236
+
237
+ expect(KnapsackPro).to receive(:logger).twice.and_return(logger)
238
+ expect(logger).to receive(:info)
239
+ .with("To retry the last batch of tests fetched from the API Queue, please run the following command on your machine:")
240
+ expect(logger).to receive(:info).with(/#{args.join(' ')} --seed #{rspec_seed}/)
229
241
  end
230
242
 
231
243
  context 'when exit code is zero' do
@@ -264,8 +276,13 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
264
276
 
265
277
  context 'when all_test_file_paths exist' do
266
278
  let(:all_test_file_paths) { ['a_spec.rb'] }
279
+ let(:logger) { double }
280
+
281
+ before do
282
+ described_class.class_variable_set(:@@used_seed, used_seed)
283
+
284
+ expect(KnapsackPro).to receive(:logger).twice.and_return(logger)
267
285
 
268
- it do
269
286
  expect(KnapsackPro::Adapters::RSpecAdapter).to receive(:verify_bind_method_called)
270
287
 
271
288
  expect(KnapsackPro::Formatters::RSpecQueueSummaryFormatter).to receive(:print_summary)
@@ -274,10 +291,33 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
274
291
  expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
275
292
  expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
276
293
 
277
- expect(subject).to eq({
278
- status: :completed,
279
- exitstatus: exitstatus,
280
- })
294
+ expect(logger).to receive(:info)
295
+ .with('To retry all the tests assigned to this CI node, please run the following command on your machine:')
296
+ expect(logger).to receive(:info).with(logged_rspec_command_matcher)
297
+ end
298
+
299
+ context 'when @@used_seed has been set' do
300
+ let(:used_seed) { '8333' }
301
+ let(:logged_rspec_command_matcher) { /#{args.join(' ')} --seed #{used_seed} \"a_spec.rb"/ }
302
+
303
+ it do
304
+ expect(subject).to eq({
305
+ status: :completed,
306
+ exitstatus: exitstatus,
307
+ })
308
+ end
309
+ end
310
+
311
+ context 'when @@used_seed has not been set' do
312
+ let(:used_seed) { nil }
313
+ let(:logged_rspec_command_matcher) { /#{args.join(' ')} \"a_spec.rb"/ }
314
+
315
+ it do
316
+ expect(subject).to eq({
317
+ status: :completed,
318
+ exitstatus: exitstatus,
319
+ })
320
+ end
281
321
  end
282
322
  end
283
323
 
@@ -287,6 +327,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
287
327
  it do
288
328
  expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
289
329
  expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
330
+ expect(KnapsackPro).to_not receive(:logger)
290
331
 
291
332
  expect(subject).to eq({
292
333
  status: :completed,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knapsack_pro
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.1
4
+ version: 3.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ArturT
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-19 00:00:00.000000000 Z
11
+ date: 2022-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -390,7 +390,7 @@ metadata:
390
390
  documentation_uri: https://docs.knapsackpro.com/integration/
391
391
  homepage_uri: https://knapsackpro.com
392
392
  source_code_uri: https://github.com/KnapsackPro/knapsack_pro-ruby
393
- post_install_message:
393
+ post_install_message:
394
394
  rdoc_options: []
395
395
  require_paths:
396
396
  - lib
@@ -405,8 +405,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
405
405
  - !ruby/object:Gem::Version
406
406
  version: '0'
407
407
  requirements: []
408
- rubygems_version: 3.3.7
409
- signing_key:
408
+ rubygems_version: 3.1.6
409
+ signing_key:
410
410
  specification_version: 4
411
411
  summary: Knapsack Pro splits tests across parallel CI nodes and ensures each parallel
412
412
  job finish work at a similar time.