knapsack_pro 3.8.0 → 7.0.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 +4 -4
- data/.circleci/config.yml +377 -23
- data/.github/dependabot.yml +11 -0
- data/.github/pull_request_template.md +22 -0
- data/.gitignore +4 -0
- data/CHANGELOG.md +325 -1
- data/Gemfile +9 -0
- data/README.md +3 -10
- data/bin/test +15 -0
- data/knapsack_pro.gemspec +7 -6
- data/lib/knapsack_pro/adapters/base_adapter.rb +17 -2
- data/lib/knapsack_pro/adapters/cucumber_adapter.rb +3 -3
- data/lib/knapsack_pro/adapters/minitest_adapter.rb +2 -0
- data/lib/knapsack_pro/adapters/rspec_adapter.rb +88 -49
- data/lib/knapsack_pro/adapters/spinach_adapter.rb +2 -0
- data/lib/knapsack_pro/adapters/test_unit_adapter.rb +2 -0
- data/lib/knapsack_pro/allocator.rb +2 -0
- data/lib/knapsack_pro/allocator_builder.rb +2 -0
- data/lib/knapsack_pro/base_allocator_builder.rb +8 -25
- data/lib/knapsack_pro/build_distribution_fetcher.rb +2 -0
- data/lib/knapsack_pro/client/api/action.rb +2 -0
- data/lib/knapsack_pro/client/api/v1/base.rb +2 -0
- data/lib/knapsack_pro/client/api/v1/build_distributions.rb +5 -0
- data/lib/knapsack_pro/client/api/v1/build_subsets.rb +2 -0
- data/lib/knapsack_pro/client/api/v1/queues.rb +6 -1
- data/lib/knapsack_pro/client/connection.rb +5 -6
- data/lib/knapsack_pro/config/ci/app_veyor.rb +18 -0
- data/lib/knapsack_pro/config/ci/base.rb +27 -0
- data/lib/knapsack_pro/config/ci/buildkite.rb +18 -0
- data/lib/knapsack_pro/config/ci/circle.rb +18 -0
- data/lib/knapsack_pro/config/ci/cirrus_ci.rb +18 -0
- data/lib/knapsack_pro/config/ci/codefresh.rb +18 -0
- data/lib/knapsack_pro/config/ci/codeship.rb +18 -0
- data/lib/knapsack_pro/config/ci/github_actions.rb +26 -0
- data/lib/knapsack_pro/config/ci/gitlab_ci.rb +20 -1
- data/lib/knapsack_pro/config/ci/heroku.rb +18 -0
- data/lib/knapsack_pro/config/ci/semaphore.rb +16 -0
- data/lib/knapsack_pro/config/ci/semaphore2.rb +19 -0
- data/lib/knapsack_pro/config/ci/travis.rb +18 -0
- data/lib/knapsack_pro/config/env.rb +46 -22
- data/lib/knapsack_pro/config/env_generator.rb +2 -0
- data/lib/knapsack_pro/config/temp_files.rb +8 -4
- data/lib/knapsack_pro/crypto/branch_encryptor.rb +2 -0
- data/lib/knapsack_pro/crypto/decryptor.rb +2 -0
- data/lib/knapsack_pro/crypto/digestor.rb +2 -0
- data/lib/knapsack_pro/crypto/encryptor.rb +2 -0
- data/lib/knapsack_pro/extensions/rspec_extension.rb +137 -0
- data/lib/knapsack_pro/formatters/rspec_json_formatter.rb +2 -0
- data/lib/knapsack_pro/formatters/time_tracker.rb +152 -0
- data/lib/knapsack_pro/formatters/time_tracker_fetcher.rb +20 -0
- data/lib/knapsack_pro/hooks/queue.rb +2 -0
- data/lib/knapsack_pro/logger_wrapper.rb +2 -0
- data/lib/knapsack_pro/mask_string.rb +9 -0
- data/lib/knapsack_pro/presenter.rb +6 -3
- data/lib/knapsack_pro/pure/queue/rspec_pure.rb +92 -0
- data/lib/knapsack_pro/queue_allocator.rb +2 -0
- data/lib/knapsack_pro/queue_allocator_builder.rb +2 -0
- data/lib/knapsack_pro/railtie.rb +2 -0
- data/lib/knapsack_pro/report.rb +15 -9
- data/lib/knapsack_pro/repository_adapter_initiator.rb +2 -0
- data/lib/knapsack_pro/repository_adapters/base_adapter.rb +2 -0
- data/lib/knapsack_pro/repository_adapters/env_adapter.rb +2 -0
- data/lib/knapsack_pro/repository_adapters/git_adapter.rb +50 -0
- data/lib/knapsack_pro/runners/base_runner.rb +2 -0
- data/lib/knapsack_pro/runners/cucumber_runner.rb +2 -0
- data/lib/knapsack_pro/runners/minitest_runner.rb +2 -0
- data/lib/knapsack_pro/runners/queue/base_runner.rb +29 -0
- data/lib/knapsack_pro/runners/queue/cucumber_runner.rb +9 -6
- data/lib/knapsack_pro/runners/queue/minitest_runner.rb +13 -6
- data/lib/knapsack_pro/runners/queue/rspec_runner.rb +128 -135
- data/lib/knapsack_pro/runners/rspec_runner.rb +22 -3
- data/lib/knapsack_pro/runners/spinach_runner.rb +2 -0
- data/lib/knapsack_pro/runners/test_unit_runner.rb +2 -0
- data/lib/knapsack_pro/slow_test_file_determiner.rb +2 -0
- data/lib/knapsack_pro/slow_test_file_finder.rb +2 -0
- data/lib/knapsack_pro/task_loader.rb +2 -0
- data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +2 -0
- data/lib/knapsack_pro/test_case_mergers/base_merger.rb +2 -0
- data/lib/knapsack_pro/test_case_mergers/rspec_merger.rb +2 -0
- data/lib/knapsack_pro/test_file_cleaner.rb +2 -0
- data/lib/knapsack_pro/test_file_finder.rb +2 -0
- data/lib/knapsack_pro/test_file_pattern.rb +2 -0
- data/lib/knapsack_pro/test_file_presenter.rb +2 -0
- data/lib/knapsack_pro/test_files_with_test_cases_composer.rb +2 -0
- data/lib/knapsack_pro/test_flat_distributor.rb +2 -0
- data/lib/knapsack_pro/tracker.rb +3 -3
- data/lib/knapsack_pro/urls.rb +4 -0
- data/lib/knapsack_pro/utils.rb +2 -0
- data/lib/knapsack_pro/version.rb +3 -1
- data/lib/knapsack_pro.rb +5 -3
- data/lib/tasks/cucumber.rake +2 -0
- data/lib/tasks/encrypted_branch_names.rake +2 -0
- data/lib/tasks/encrypted_test_file_names.rake +2 -0
- data/lib/tasks/minitest.rake +2 -0
- data/lib/tasks/queue/cucumber.rake +13 -0
- data/lib/tasks/queue/minitest.rake +13 -0
- data/lib/tasks/queue/rspec.rake +13 -0
- data/lib/tasks/rspec.rake +5 -0
- data/lib/tasks/salt.rake +2 -0
- data/lib/tasks/spinach.rake +2 -0
- data/lib/tasks/test_unit.rake +2 -0
- data/spec/integration/api/build_distributions_subset_spec.rb +1 -0
- data/spec/integration/runners/queue/rspec_runner.rb +80 -0
- data/spec/integration/runners/queue/rspec_runner_spec.rb +2232 -0
- data/spec/knapsack_pro/adapters/base_adapter_spec.rb +30 -11
- data/spec/knapsack_pro/adapters/cucumber_adapter_spec.rb +2 -5
- data/spec/knapsack_pro/adapters/rspec_adapter_spec.rb +146 -174
- data/spec/knapsack_pro/base_allocator_builder_spec.rb +22 -48
- data/spec/knapsack_pro/client/api/v1/build_distributions_spec.rb +19 -27
- data/spec/knapsack_pro/client/api/v1/queues_spec.rb +23 -43
- data/spec/knapsack_pro/client/connection_spec.rb +59 -7
- data/spec/knapsack_pro/config/ci/app_veyor_spec.rb +22 -8
- data/spec/knapsack_pro/config/ci/base_spec.rb +1 -0
- data/spec/knapsack_pro/config/ci/buildkite_spec.rb +51 -16
- data/spec/knapsack_pro/config/ci/circle_spec.rb +48 -13
- data/spec/knapsack_pro/config/ci/cirrus_ci_spec.rb +12 -12
- data/spec/knapsack_pro/config/ci/codefresh_spec.rb +21 -6
- data/spec/knapsack_pro/config/ci/codeship_spec.rb +20 -6
- data/spec/knapsack_pro/config/ci/github_actions_spec.rb +37 -10
- data/spec/knapsack_pro/config/ci/gitlab_ci_spec.rb +48 -13
- data/spec/knapsack_pro/config/ci/heroku_spec.rb +12 -12
- data/spec/knapsack_pro/config/ci/semaphore2_spec.rb +11 -11
- data/spec/knapsack_pro/config/ci/semaphore_spec.rb +12 -12
- data/spec/knapsack_pro/config/ci/travis_spec.rb +8 -8
- data/spec/knapsack_pro/config/env_spec.rb +204 -124
- data/spec/knapsack_pro/formatters/time_tracker_specs.rb +424 -0
- data/spec/knapsack_pro/hooks/queue_spec.rb +2 -2
- data/spec/knapsack_pro/presenter_spec.rb +1 -1
- data/spec/knapsack_pro/pure/queue/rspec_pure_spec.rb +224 -0
- data/spec/knapsack_pro/repository_adapters/git_adapter_spec.rb +72 -0
- data/spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb +18 -16
- data/spec/knapsack_pro/runners/queue/minitest_runner_spec.rb +17 -14
- data/spec/knapsack_pro/runners/rspec_runner_spec.rb +40 -23
- data/spec/knapsack_pro/test_case_detectors/rspec_test_example_detector_spec.rb +1 -0
- data/spec/knapsack_pro/tracker_spec.rb +0 -4
- data/spec/knapsack_pro_spec.rb +3 -3
- data/spec/spec_helper.rb +0 -1
- metadata +26 -23
- data/lib/knapsack_pro/config/ci/snap_ci.rb +0 -35
- data/lib/knapsack_pro/config/ci/solano_ci.rb +0 -32
- data/lib/knapsack_pro/extensions/time.rb +0 -7
- data/lib/knapsack_pro/formatters/rspec_queue_profile_formatter_extension.rb +0 -56
- data/lib/knapsack_pro/formatters/rspec_queue_summary_formatter.rb +0 -112
- data/spec/knapsack_pro/config/ci/snap_ci_spec.rb +0 -104
- data/spec/knapsack_pro/config/ci/solano_ci_spec.rb +0 -73
- data/spec/knapsack_pro/extensions/time_spec.rb +0 -5
- data/spec/knapsack_pro/runners/queue/rspec_runner_spec.rb +0 -342
|
@@ -31,4 +31,76 @@ describe KnapsackPro::RepositoryAdapters::GitAdapter do
|
|
|
31
31
|
it { expect(subject.include?('master')).to be true }
|
|
32
32
|
it { expect(subject.include?(circle_branch)).to be true } if ENV['CIRCLECI']
|
|
33
33
|
end
|
|
34
|
+
|
|
35
|
+
describe '#build_author' do
|
|
36
|
+
it "returns the masked build author" do
|
|
37
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_build_author).and_return(
|
|
38
|
+
"John Doe <john.doe@example.com>" + "\n"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
42
|
+
|
|
43
|
+
expect(subject.build_author).to eq 'Jo** Do* <jo**.do*@ex*****.co*>'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context "when the command raises an exception" do
|
|
47
|
+
it "returns the no-git author" do
|
|
48
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_build_author).and_raise(Exception)
|
|
49
|
+
|
|
50
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
51
|
+
|
|
52
|
+
expect(subject.build_author).to eq "no git <no.git@example.com>"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context "when the command returns an empty string" do
|
|
57
|
+
it "returns the no-git author" do
|
|
58
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_build_author).and_return("")
|
|
59
|
+
|
|
60
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
61
|
+
|
|
62
|
+
expect(subject.build_author).to eq "no git <no.git@example.com>"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe '#commit_authors' do
|
|
68
|
+
it "returns the masked commit authors" do
|
|
69
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_commit_authors).and_return([
|
|
70
|
+
" 5\t3v0k4 <riccardo@example.com>\n",
|
|
71
|
+
" 10\tArtur Nowak <artur@example.com>\n",
|
|
72
|
+
" 2\tRiccardo <riccardo@example.com>\n",
|
|
73
|
+
" 3 \tshadre <shadi@example.com>\n",
|
|
74
|
+
].join(""))
|
|
75
|
+
|
|
76
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
77
|
+
|
|
78
|
+
expect(subject.commit_authors).to eq([
|
|
79
|
+
{ commits: 5, author: "3v0*4 <ri******@ex*****.co*>" },
|
|
80
|
+
{ commits: 10, author: "Ar*** No*** <ar***@ex*****.co*>" },
|
|
81
|
+
{ commits: 2, author: "Ri****** <ri******@ex*****.co*>" },
|
|
82
|
+
{ commits: 3, author: "sh**** <sh***@ex*****.co*>" },
|
|
83
|
+
])
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "when the authors command raises an exception" do
|
|
87
|
+
it "returns []" do
|
|
88
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_commit_authors).and_raise(Exception)
|
|
89
|
+
|
|
90
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
91
|
+
|
|
92
|
+
expect(subject.commit_authors).to eq []
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "when the authors command returns an empty string" do
|
|
97
|
+
it "returns []" do
|
|
98
|
+
allow_any_instance_of(KnapsackPro::RepositoryAdapters::GitAdapter).to receive(:git_commit_authors).and_return("")
|
|
99
|
+
|
|
100
|
+
subject = KnapsackPro::RepositoryAdapters::GitAdapter.new
|
|
101
|
+
|
|
102
|
+
expect(subject.commit_authors).to eq []
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
34
106
|
end
|
|
@@ -24,7 +24,7 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
24
24
|
expect(described_class).to receive(:new).with(KnapsackPro::Adapters::CucumberAdapter).and_return(runner)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
context 'when args provided' do
|
|
27
|
+
context 'when args are provided' do
|
|
28
28
|
let(:args) { '--retry 5 --no-strict-flaky' }
|
|
29
29
|
|
|
30
30
|
it do
|
|
@@ -39,8 +39,9 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
39
39
|
can_initialize_queue: true,
|
|
40
40
|
args: args,
|
|
41
41
|
exitstatus: 0,
|
|
42
|
-
|
|
42
|
+
node_test_file_paths: [],
|
|
43
43
|
}
|
|
44
|
+
expect(described_class).to receive(:handle_signal!)
|
|
44
45
|
expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
|
|
45
46
|
|
|
46
47
|
expect(Kernel).to receive(:exit).with(expected_exitstatus)
|
|
@@ -49,7 +50,7 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
49
50
|
end
|
|
50
51
|
end
|
|
51
52
|
|
|
52
|
-
context 'when args not provided' do
|
|
53
|
+
context 'when args are not provided' do
|
|
53
54
|
let(:args) { nil }
|
|
54
55
|
|
|
55
56
|
it do
|
|
@@ -64,8 +65,9 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
64
65
|
can_initialize_queue: true,
|
|
65
66
|
args: nil,
|
|
66
67
|
exitstatus: 0,
|
|
67
|
-
|
|
68
|
+
node_test_file_paths: [],
|
|
68
69
|
}
|
|
70
|
+
expect(described_class).to receive(:handle_signal!)
|
|
69
71
|
expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
|
|
70
72
|
|
|
71
73
|
expect(Kernel).to receive(:exit).with(expected_exitstatus)
|
|
@@ -83,21 +85,21 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
83
85
|
let(:can_initialize_queue) { double(:can_initialize_queue) }
|
|
84
86
|
let(:args) { '--retry 5 --no-strict-flaky' }
|
|
85
87
|
let(:exitstatus) { 0 }
|
|
86
|
-
let(:
|
|
88
|
+
let(:node_test_file_paths) { [] }
|
|
87
89
|
let(:accumulator) do
|
|
88
90
|
{
|
|
89
91
|
runner: runner,
|
|
90
92
|
can_initialize_queue: can_initialize_queue,
|
|
91
93
|
args: args,
|
|
92
94
|
exitstatus: exitstatus,
|
|
93
|
-
|
|
95
|
+
node_test_file_paths: node_test_file_paths,
|
|
94
96
|
}
|
|
95
97
|
end
|
|
96
98
|
|
|
97
99
|
subject { described_class.run_tests(accumulator) }
|
|
98
100
|
|
|
99
101
|
before do
|
|
100
|
-
expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files:
|
|
102
|
+
expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files: node_test_file_paths).and_return(test_file_paths)
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
context 'when test files exist' do
|
|
@@ -127,7 +129,7 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
127
129
|
allow(child_status).to receive(:exitstatus).and_return(exitstatus)
|
|
128
130
|
end
|
|
129
131
|
|
|
130
|
-
context 'when system process finished
|
|
132
|
+
context 'when system process finished (exited)' do
|
|
131
133
|
let(:process_exited) { true }
|
|
132
134
|
|
|
133
135
|
context 'when tests are passing' do
|
|
@@ -140,7 +142,7 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
140
142
|
can_initialize_queue: false,
|
|
141
143
|
args: args,
|
|
142
144
|
exitstatus: exitstatus,
|
|
143
|
-
|
|
145
|
+
node_test_file_paths: test_file_paths,
|
|
144
146
|
})
|
|
145
147
|
end
|
|
146
148
|
end
|
|
@@ -155,13 +157,13 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
155
157
|
can_initialize_queue: false,
|
|
156
158
|
args: args,
|
|
157
159
|
exitstatus: 1, # tests failed
|
|
158
|
-
|
|
160
|
+
node_test_file_paths: test_file_paths,
|
|
159
161
|
})
|
|
160
162
|
end
|
|
161
163
|
end
|
|
162
164
|
end
|
|
163
165
|
|
|
164
|
-
context
|
|
166
|
+
context 'when system process did not finish (it has not exited)' do
|
|
165
167
|
let(:process_exited) { false }
|
|
166
168
|
|
|
167
169
|
it 'raises an error' do
|
|
@@ -170,11 +172,11 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
170
172
|
end
|
|
171
173
|
end
|
|
172
174
|
|
|
173
|
-
context
|
|
175
|
+
context 'when test files do not exist' do
|
|
174
176
|
let(:test_file_paths) { [] }
|
|
175
177
|
|
|
176
|
-
context 'when
|
|
177
|
-
let(:
|
|
178
|
+
context 'when node_test_file_paths exists' do
|
|
179
|
+
let(:node_test_file_paths) { ['features/a.feature'] }
|
|
178
180
|
|
|
179
181
|
it 'returns exit code 0' do
|
|
180
182
|
expect(KnapsackPro::Adapters::CucumberAdapter).to receive(:verify_bind_method_called)
|
|
@@ -189,8 +191,8 @@ describe KnapsackPro::Runners::Queue::CucumberRunner do
|
|
|
189
191
|
end
|
|
190
192
|
end
|
|
191
193
|
|
|
192
|
-
context
|
|
193
|
-
let(:
|
|
194
|
+
context 'when node_test_file_paths do not exist' do
|
|
195
|
+
let(:node_test_file_paths) { [] }
|
|
194
196
|
|
|
195
197
|
it 'returns exit code 0' do
|
|
196
198
|
expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
|
|
@@ -26,7 +26,7 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
26
26
|
expect($LOAD_PATH).to receive(:unshift).with(test_dir)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
context 'when args provided' do
|
|
29
|
+
context 'when args are provided' do
|
|
30
30
|
let(:args) { '--verbose --pride' }
|
|
31
31
|
|
|
32
32
|
it do
|
|
@@ -41,8 +41,9 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
41
41
|
can_initialize_queue: true,
|
|
42
42
|
args: ['--verbose', '--pride'],
|
|
43
43
|
exitstatus: 0,
|
|
44
|
-
|
|
44
|
+
node_test_file_paths: [],
|
|
45
45
|
}
|
|
46
|
+
expect(described_class).to receive(:handle_signal!)
|
|
46
47
|
expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
|
|
47
48
|
|
|
48
49
|
expect(Kernel).to receive(:exit).with(expected_exitstatus)
|
|
@@ -51,7 +52,7 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
51
52
|
end
|
|
52
53
|
end
|
|
53
54
|
|
|
54
|
-
context 'when args not provided' do
|
|
55
|
+
context 'when args are not provided' do
|
|
55
56
|
let(:args) { nil }
|
|
56
57
|
|
|
57
58
|
it do
|
|
@@ -66,8 +67,9 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
66
67
|
can_initialize_queue: true,
|
|
67
68
|
args: [],
|
|
68
69
|
exitstatus: 0,
|
|
69
|
-
|
|
70
|
+
node_test_file_paths: [],
|
|
70
71
|
}
|
|
72
|
+
expect(described_class).to receive(:handle_signal!)
|
|
71
73
|
expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
|
|
72
74
|
|
|
73
75
|
expect(Kernel).to receive(:exit).with(expected_exitstatus)
|
|
@@ -82,21 +84,21 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
82
84
|
let(:can_initialize_queue) { double(:can_initialize_queue) }
|
|
83
85
|
let(:args) { ['--verbose', '--pride'] }
|
|
84
86
|
let(:exitstatus) { 0 }
|
|
85
|
-
let(:
|
|
87
|
+
let(:node_test_file_paths) { [] }
|
|
86
88
|
let(:accumulator) do
|
|
87
89
|
{
|
|
88
90
|
runner: runner,
|
|
89
91
|
can_initialize_queue: can_initialize_queue,
|
|
90
92
|
args: args,
|
|
91
93
|
exitstatus: exitstatus,
|
|
92
|
-
|
|
94
|
+
node_test_file_paths: node_test_file_paths,
|
|
93
95
|
}
|
|
94
96
|
end
|
|
95
97
|
|
|
96
98
|
subject { described_class.run_tests(accumulator) }
|
|
97
99
|
|
|
98
100
|
before do
|
|
99
|
-
expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files:
|
|
101
|
+
expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files: node_test_file_paths).and_return(test_file_paths)
|
|
100
102
|
end
|
|
101
103
|
|
|
102
104
|
context 'when test files exist' do
|
|
@@ -114,6 +116,7 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
114
116
|
expect(tracker).to receive(:set_prerun_tests).with(test_file_paths)
|
|
115
117
|
|
|
116
118
|
# .minitest_run
|
|
119
|
+
allow(File).to receive(:exist?)
|
|
117
120
|
expect(File).to receive(:exist?).with('./a_test.rb').and_return(true)
|
|
118
121
|
expect(File).to receive(:exist?).with('./b_test.rb').and_return(true)
|
|
119
122
|
expect(File).to receive(:exist?).with('./fake_path_test.rb').and_return(false)
|
|
@@ -142,7 +145,7 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
142
145
|
can_initialize_queue: false,
|
|
143
146
|
args: args,
|
|
144
147
|
exitstatus: exitstatus,
|
|
145
|
-
|
|
148
|
+
node_test_file_paths: test_file_paths,
|
|
146
149
|
})
|
|
147
150
|
end
|
|
148
151
|
end
|
|
@@ -157,17 +160,17 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
157
160
|
can_initialize_queue: false,
|
|
158
161
|
args: args,
|
|
159
162
|
exitstatus: 1, # tests failed
|
|
160
|
-
|
|
163
|
+
node_test_file_paths: test_file_paths,
|
|
161
164
|
})
|
|
162
165
|
end
|
|
163
166
|
end
|
|
164
167
|
end
|
|
165
168
|
|
|
166
|
-
context
|
|
169
|
+
context 'when test files do not exist' do
|
|
167
170
|
let(:test_file_paths) { [] }
|
|
168
171
|
|
|
169
|
-
context 'when
|
|
170
|
-
let(:
|
|
172
|
+
context 'when node_test_file_paths exists' do
|
|
173
|
+
let(:node_test_file_paths) { ['a_test.rb'] }
|
|
171
174
|
|
|
172
175
|
it 'returns exit code 0' do
|
|
173
176
|
expect(KnapsackPro::Adapters::MinitestAdapter).to receive(:verify_bind_method_called)
|
|
@@ -182,8 +185,8 @@ describe KnapsackPro::Runners::Queue::MinitestRunner do
|
|
|
182
185
|
end
|
|
183
186
|
end
|
|
184
187
|
|
|
185
|
-
context
|
|
186
|
-
let(:
|
|
188
|
+
context 'when node_test_file_paths do not exist' do
|
|
189
|
+
let(:node_test_file_paths) { [] }
|
|
187
190
|
|
|
188
191
|
it 'returns exit code 0' do
|
|
189
192
|
expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
|
|
@@ -36,47 +36,64 @@ describe KnapsackPro::Runners::RSpecRunner do
|
|
|
36
36
|
test_files_to_execute_exist?: true)
|
|
37
37
|
end
|
|
38
38
|
let(:task) { double }
|
|
39
|
+
let(:task_config) { double }
|
|
39
40
|
|
|
40
41
|
before do
|
|
41
42
|
expect(KnapsackPro::Adapters::RSpecAdapter).to receive(:verify_bind_method_called).ordered
|
|
42
43
|
expect(KnapsackPro::Adapters::RSpecAdapter).to receive(:ensure_no_tag_option_when_rspec_split_by_test_examples_enabled!).with(['--profile', '--color']).ordered
|
|
43
44
|
|
|
44
|
-
tracker = instance_double(KnapsackPro::Tracker)
|
|
45
|
-
expect(KnapsackPro).to receive(:tracker).and_return(tracker)
|
|
46
|
-
expect(tracker).to receive(:set_prerun_tests).with(test_file_paths)
|
|
47
|
-
|
|
48
45
|
expect(Rake::Task).to receive(:[]).with('knapsack_pro:rspec_run').at_least(1).and_return(task)
|
|
49
46
|
|
|
50
|
-
|
|
51
|
-
expect(RSpec::Core::
|
|
52
|
-
expect(
|
|
53
|
-
expect(
|
|
47
|
+
expect(RSpec::Core::RakeTask).to receive(:new).with('knapsack_pro:rspec_run').and_yield(task_config)
|
|
48
|
+
expect(RSpec::Core::ConfigurationOptions).to receive_message_chain(:new, :options).and_return({})
|
|
49
|
+
expect(task_config).to receive(:rspec_opts=).with('--profile --color --format progress --format KnapsackPro::Formatters::TimeTracker --default-path fake-test-dir spec/a_spec.rb spec/b_spec.rb[1:1]')
|
|
50
|
+
expect(task_config).to receive(:pattern=).with([])
|
|
54
51
|
end
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
shared_examples 'invokes RSpec rake task' do
|
|
54
|
+
context 'when rake task already exists' do
|
|
55
|
+
before do
|
|
56
|
+
expect(Rake::Task).to receive(:task_defined?).with('knapsack_pro:rspec_run').and_return(true)
|
|
57
|
+
expect(task).to receive(:clear)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it do
|
|
61
|
+
result = double(:result)
|
|
62
|
+
expect(task).to receive(:invoke).and_return(result)
|
|
63
|
+
expect(subject).to eq result
|
|
64
|
+
end
|
|
60
65
|
end
|
|
61
66
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
context "when rake task doesn't exist" do
|
|
68
|
+
before do
|
|
69
|
+
expect(Rake::Task).to receive(:task_defined?).with('knapsack_pro:rspec_run').and_return(false)
|
|
70
|
+
expect(task).not_to receive(:clear)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it do
|
|
74
|
+
result = double(:result)
|
|
75
|
+
expect(task).to receive(:invoke).and_return(result)
|
|
76
|
+
expect(subject).to eq result
|
|
77
|
+
end
|
|
66
78
|
end
|
|
67
79
|
end
|
|
68
80
|
|
|
69
|
-
context
|
|
81
|
+
context 'when the default log level' do
|
|
70
82
|
before do
|
|
71
|
-
expect(
|
|
72
|
-
expect(task).not_to receive(:clear)
|
|
83
|
+
expect(task_config).to receive(:verbose=).with(true)
|
|
73
84
|
end
|
|
74
85
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
it_behaves_like 'invokes RSpec rake task'
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context 'when the warning log level' do
|
|
90
|
+
before do
|
|
91
|
+
expect(KnapsackPro::Config::Env).to receive(:log_level).and_return(::Logger::WARN)
|
|
92
|
+
|
|
93
|
+
expect(task_config).to receive(:verbose=).with(false)
|
|
79
94
|
end
|
|
95
|
+
|
|
96
|
+
it_behaves_like 'invokes RSpec rake task'
|
|
80
97
|
end
|
|
81
98
|
end
|
|
82
99
|
|
|
@@ -11,6 +11,7 @@ describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
|
|
11
11
|
|
|
12
12
|
expect(FileUtils).to receive(:mkdir_p).with(report_dir)
|
|
13
13
|
|
|
14
|
+
allow(File).to receive(:exist?)
|
|
14
15
|
expect(File).to receive(:exist?).at_least(:once).with(report_path).and_return(true)
|
|
15
16
|
expect(File).to receive(:delete).with(report_path)
|
|
16
17
|
|
|
@@ -177,10 +177,6 @@ describe KnapsackPro::Tracker do
|
|
|
177
177
|
|
|
178
178
|
it_behaves_like 'default trakcer attributes'
|
|
179
179
|
|
|
180
|
-
it "global time since beginning won't be reset" do
|
|
181
|
-
expect(tracker.global_time_since_beginning).to be >= 0.1
|
|
182
|
-
end
|
|
183
|
-
|
|
184
180
|
it 'resets prerun_tests_loaded to false' do
|
|
185
181
|
expect(tracker.prerun_tests_loaded).to be false
|
|
186
182
|
end
|
data/spec/knapsack_pro_spec.rb
CHANGED
|
@@ -24,7 +24,7 @@ describe KnapsackPro do
|
|
|
24
24
|
})
|
|
25
25
|
|
|
26
26
|
expect(Logger).to receive(:new).with('log/knapsack_pro_node_1.log').and_return(logger)
|
|
27
|
-
expect(logger).to receive(:level=).with(Logger::
|
|
27
|
+
expect(logger).to receive(:level=).with(Logger::INFO)
|
|
28
28
|
expect(KnapsackPro::LoggerWrapper).to receive(:new).with(logger).and_return(logger_wrapper)
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -38,7 +38,7 @@ describe KnapsackPro do
|
|
|
38
38
|
})
|
|
39
39
|
|
|
40
40
|
expect(Logger).to receive(:new).with('log/knapsack_pro_node_0.log').and_return(logger)
|
|
41
|
-
expect(logger).to receive(:level=).with(Logger::
|
|
41
|
+
expect(logger).to receive(:level=).with(Logger::INFO)
|
|
42
42
|
expect(KnapsackPro::LoggerWrapper).to receive(:new).with(logger).and_return(logger_wrapper)
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -51,7 +51,7 @@ describe KnapsackPro do
|
|
|
51
51
|
|
|
52
52
|
before do
|
|
53
53
|
expect(Logger).to receive(:new).with(STDOUT).and_return(logger)
|
|
54
|
-
expect(logger).to receive(:level=).with(Logger::
|
|
54
|
+
expect(logger).to receive(:level=).with(Logger::INFO)
|
|
55
55
|
expect(KnapsackPro::LoggerWrapper).to receive(:new).with(logger).and_return(logger_wrapper)
|
|
56
56
|
end
|
|
57
57
|
|
data/spec/spec_helper.rb
CHANGED
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:
|
|
4
|
+
version: 7.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ArturT
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-02-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -178,12 +178,12 @@ dependencies:
|
|
|
178
178
|
- - ">="
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
180
|
version: 0.9.4
|
|
181
|
-
description:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
181
|
+
description: Knapsack Pro wraps your current test runner(s) and works with your existing
|
|
182
|
+
CI infrastructure to parallelize tests optimally. It dynamically splits your tests
|
|
183
|
+
based on up-to-date test execution data. It's designed from the ground up for CI
|
|
184
|
+
and supports all of them.
|
|
185
185
|
email:
|
|
186
|
-
-
|
|
186
|
+
- support@knapsackpro.com
|
|
187
187
|
executables:
|
|
188
188
|
- knapsack_pro
|
|
189
189
|
extensions: []
|
|
@@ -192,6 +192,8 @@ files:
|
|
|
192
192
|
- ".circleci/config.yml"
|
|
193
193
|
- ".github/assets/install-button.png"
|
|
194
194
|
- ".github/assets/knapsack-diamonds.png"
|
|
195
|
+
- ".github/dependabot.yml"
|
|
196
|
+
- ".github/pull_request_template.md"
|
|
195
197
|
- ".gitignore"
|
|
196
198
|
- ".rspec"
|
|
197
199
|
- CHANGELOG.md
|
|
@@ -200,6 +202,7 @@ files:
|
|
|
200
202
|
- README.md
|
|
201
203
|
- Rakefile
|
|
202
204
|
- bin/knapsack_pro
|
|
205
|
+
- bin/test
|
|
203
206
|
- knapsack_pro.gemspec
|
|
204
207
|
- lib/knapsack_pro.rb
|
|
205
208
|
- lib/knapsack_pro/adapters/base_adapter.rb
|
|
@@ -230,8 +233,6 @@ files:
|
|
|
230
233
|
- lib/knapsack_pro/config/ci/heroku.rb
|
|
231
234
|
- lib/knapsack_pro/config/ci/semaphore.rb
|
|
232
235
|
- lib/knapsack_pro/config/ci/semaphore2.rb
|
|
233
|
-
- lib/knapsack_pro/config/ci/snap_ci.rb
|
|
234
|
-
- lib/knapsack_pro/config/ci/solano_ci.rb
|
|
235
236
|
- lib/knapsack_pro/config/ci/travis.rb
|
|
236
237
|
- lib/knapsack_pro/config/env.rb
|
|
237
238
|
- lib/knapsack_pro/config/env_generator.rb
|
|
@@ -240,13 +241,15 @@ files:
|
|
|
240
241
|
- lib/knapsack_pro/crypto/decryptor.rb
|
|
241
242
|
- lib/knapsack_pro/crypto/digestor.rb
|
|
242
243
|
- lib/knapsack_pro/crypto/encryptor.rb
|
|
243
|
-
- lib/knapsack_pro/extensions/
|
|
244
|
+
- lib/knapsack_pro/extensions/rspec_extension.rb
|
|
244
245
|
- lib/knapsack_pro/formatters/rspec_json_formatter.rb
|
|
245
|
-
- lib/knapsack_pro/formatters/
|
|
246
|
-
- lib/knapsack_pro/formatters/
|
|
246
|
+
- lib/knapsack_pro/formatters/time_tracker.rb
|
|
247
|
+
- lib/knapsack_pro/formatters/time_tracker_fetcher.rb
|
|
247
248
|
- lib/knapsack_pro/hooks/queue.rb
|
|
248
249
|
- lib/knapsack_pro/logger_wrapper.rb
|
|
250
|
+
- lib/knapsack_pro/mask_string.rb
|
|
249
251
|
- lib/knapsack_pro/presenter.rb
|
|
252
|
+
- lib/knapsack_pro/pure/queue/rspec_pure.rb
|
|
250
253
|
- lib/knapsack_pro/queue_allocator.rb
|
|
251
254
|
- lib/knapsack_pro/queue_allocator_builder.rb
|
|
252
255
|
- lib/knapsack_pro/railtie.rb
|
|
@@ -299,6 +302,8 @@ files:
|
|
|
299
302
|
- spec/fixtures/vcr_cassettes/api/v1/build_subsets/create/success.yml
|
|
300
303
|
- spec/integration/api/build_distributions_subset_spec.rb
|
|
301
304
|
- spec/integration/api/build_subsets_create_spec.rb
|
|
305
|
+
- spec/integration/runners/queue/rspec_runner.rb
|
|
306
|
+
- spec/integration/runners/queue/rspec_runner_spec.rb
|
|
302
307
|
- spec/knapsack_pro/adapters/base_adapter_spec.rb
|
|
303
308
|
- spec/knapsack_pro/adapters/cucumber_adapter_spec.rb
|
|
304
309
|
- spec/knapsack_pro/adapters/minitest_adapter_spec.rb
|
|
@@ -327,8 +332,6 @@ files:
|
|
|
327
332
|
- spec/knapsack_pro/config/ci/heroku_spec.rb
|
|
328
333
|
- spec/knapsack_pro/config/ci/semaphore2_spec.rb
|
|
329
334
|
- spec/knapsack_pro/config/ci/semaphore_spec.rb
|
|
330
|
-
- spec/knapsack_pro/config/ci/snap_ci_spec.rb
|
|
331
|
-
- spec/knapsack_pro/config/ci/solano_ci_spec.rb
|
|
332
335
|
- spec/knapsack_pro/config/ci/travis_spec.rb
|
|
333
336
|
- spec/knapsack_pro/config/env_generator_spec.rb
|
|
334
337
|
- spec/knapsack_pro/config/env_spec.rb
|
|
@@ -337,10 +340,11 @@ files:
|
|
|
337
340
|
- spec/knapsack_pro/crypto/decryptor_spec.rb
|
|
338
341
|
- spec/knapsack_pro/crypto/digestor_spec.rb
|
|
339
342
|
- spec/knapsack_pro/crypto/encryptor_spec.rb
|
|
340
|
-
- spec/knapsack_pro/
|
|
343
|
+
- spec/knapsack_pro/formatters/time_tracker_specs.rb
|
|
341
344
|
- spec/knapsack_pro/hooks/queue_spec.rb
|
|
342
345
|
- spec/knapsack_pro/logger_wrapper_spec.rb
|
|
343
346
|
- spec/knapsack_pro/presenter_spec.rb
|
|
347
|
+
- spec/knapsack_pro/pure/queue/rspec_pure_spec.rb
|
|
344
348
|
- spec/knapsack_pro/queue_allocator_builder_spec.rb
|
|
345
349
|
- spec/knapsack_pro/queue_allocator_spec.rb
|
|
346
350
|
- spec/knapsack_pro/report_spec.rb
|
|
@@ -354,7 +358,6 @@ files:
|
|
|
354
358
|
- spec/knapsack_pro/runners/queue/base_runner_spec.rb
|
|
355
359
|
- spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb
|
|
356
360
|
- spec/knapsack_pro/runners/queue/minitest_runner_spec.rb
|
|
357
|
-
- spec/knapsack_pro/runners/queue/rspec_runner_spec.rb
|
|
358
361
|
- spec/knapsack_pro/runners/rspec_runner_spec.rb
|
|
359
362
|
- spec/knapsack_pro/runners/spinach_runner_spec.rb
|
|
360
363
|
- spec/knapsack_pro/runners/test_unit_runner_spec.rb
|
|
@@ -390,7 +393,7 @@ licenses:
|
|
|
390
393
|
metadata:
|
|
391
394
|
bug_tracker_uri: https://github.com/KnapsackPro/knapsack_pro-ruby/issues
|
|
392
395
|
changelog_uri: https://github.com/KnapsackPro/knapsack_pro-ruby/blob/master/CHANGELOG.md
|
|
393
|
-
documentation_uri: https://docs.knapsackpro.com/
|
|
396
|
+
documentation_uri: https://docs.knapsackpro.com/knapsack_pro-ruby/guide/
|
|
394
397
|
homepage_uri: https://knapsackpro.com
|
|
395
398
|
source_code_uri: https://github.com/KnapsackPro/knapsack_pro-ruby
|
|
396
399
|
post_install_message:
|
|
@@ -401,14 +404,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
401
404
|
requirements:
|
|
402
405
|
- - ">="
|
|
403
406
|
- !ruby/object:Gem::Version
|
|
404
|
-
version:
|
|
407
|
+
version: 2.7.0
|
|
405
408
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
406
409
|
requirements:
|
|
407
410
|
- - ">="
|
|
408
411
|
- !ruby/object:Gem::Version
|
|
409
412
|
version: '0'
|
|
410
413
|
requirements: []
|
|
411
|
-
rubygems_version: 3.
|
|
414
|
+
rubygems_version: 3.4.19
|
|
412
415
|
signing_key:
|
|
413
416
|
specification_version: 4
|
|
414
417
|
summary: Knapsack Pro splits tests across parallel CI nodes and ensures each parallel
|
|
@@ -421,6 +424,8 @@ test_files:
|
|
|
421
424
|
- spec/fixtures/vcr_cassettes/api/v1/build_subsets/create/success.yml
|
|
422
425
|
- spec/integration/api/build_distributions_subset_spec.rb
|
|
423
426
|
- spec/integration/api/build_subsets_create_spec.rb
|
|
427
|
+
- spec/integration/runners/queue/rspec_runner.rb
|
|
428
|
+
- spec/integration/runners/queue/rspec_runner_spec.rb
|
|
424
429
|
- spec/knapsack_pro/adapters/base_adapter_spec.rb
|
|
425
430
|
- spec/knapsack_pro/adapters/cucumber_adapter_spec.rb
|
|
426
431
|
- spec/knapsack_pro/adapters/minitest_adapter_spec.rb
|
|
@@ -449,8 +454,6 @@ test_files:
|
|
|
449
454
|
- spec/knapsack_pro/config/ci/heroku_spec.rb
|
|
450
455
|
- spec/knapsack_pro/config/ci/semaphore2_spec.rb
|
|
451
456
|
- spec/knapsack_pro/config/ci/semaphore_spec.rb
|
|
452
|
-
- spec/knapsack_pro/config/ci/snap_ci_spec.rb
|
|
453
|
-
- spec/knapsack_pro/config/ci/solano_ci_spec.rb
|
|
454
457
|
- spec/knapsack_pro/config/ci/travis_spec.rb
|
|
455
458
|
- spec/knapsack_pro/config/env_generator_spec.rb
|
|
456
459
|
- spec/knapsack_pro/config/env_spec.rb
|
|
@@ -459,10 +462,11 @@ test_files:
|
|
|
459
462
|
- spec/knapsack_pro/crypto/decryptor_spec.rb
|
|
460
463
|
- spec/knapsack_pro/crypto/digestor_spec.rb
|
|
461
464
|
- spec/knapsack_pro/crypto/encryptor_spec.rb
|
|
462
|
-
- spec/knapsack_pro/
|
|
465
|
+
- spec/knapsack_pro/formatters/time_tracker_specs.rb
|
|
463
466
|
- spec/knapsack_pro/hooks/queue_spec.rb
|
|
464
467
|
- spec/knapsack_pro/logger_wrapper_spec.rb
|
|
465
468
|
- spec/knapsack_pro/presenter_spec.rb
|
|
469
|
+
- spec/knapsack_pro/pure/queue/rspec_pure_spec.rb
|
|
466
470
|
- spec/knapsack_pro/queue_allocator_builder_spec.rb
|
|
467
471
|
- spec/knapsack_pro/queue_allocator_spec.rb
|
|
468
472
|
- spec/knapsack_pro/report_spec.rb
|
|
@@ -476,7 +480,6 @@ test_files:
|
|
|
476
480
|
- spec/knapsack_pro/runners/queue/base_runner_spec.rb
|
|
477
481
|
- spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb
|
|
478
482
|
- spec/knapsack_pro/runners/queue/minitest_runner_spec.rb
|
|
479
|
-
- spec/knapsack_pro/runners/queue/rspec_runner_spec.rb
|
|
480
483
|
- spec/knapsack_pro/runners/rspec_runner_spec.rb
|
|
481
484
|
- spec/knapsack_pro/runners/spinach_runner_spec.rb
|
|
482
485
|
- spec/knapsack_pro/runners/test_unit_runner_spec.rb
|