knapsack_pro 2.0.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +11 -0
- data/lib/knapsack_pro/adapters/cucumber_adapter.rb +1 -1
- data/lib/knapsack_pro/adapters/minitest_adapter.rb +3 -3
- data/lib/knapsack_pro/adapters/rspec_adapter.rb +1 -1
- data/lib/knapsack_pro/adapters/test_unit_adapter.rb +2 -2
- data/lib/knapsack_pro/base_allocator_builder.rb +7 -2
- data/lib/knapsack_pro/config/env.rb +4 -0
- data/lib/knapsack_pro/formatters/rspec_json_formatter.rb +2 -2
- data/lib/knapsack_pro/formatters/rspec_queue_profile_formatter_extension.rb +1 -1
- data/lib/knapsack_pro/formatters/rspec_queue_summary_formatter.rb +2 -2
- data/lib/knapsack_pro/runners/cucumber_runner.rb +1 -1
- data/lib/knapsack_pro/runners/queue/minitest_runner.rb +2 -2
- data/lib/knapsack_pro/runners/queue/rspec_runner.rb +11 -11
- data/lib/knapsack_pro/runners/rspec_runner.rb +1 -1
- data/lib/knapsack_pro/runners/test_unit_runner.rb +1 -1
- data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +3 -3
- data/lib/knapsack_pro/version.rb +1 -1
- data/spec/knapsack_pro/config/env_spec.rb +14 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 653a964b0c75547cec30531146adeb0075f251e6bc6511d4d85d710b778cf539
|
4
|
+
data.tar.gz: 21bb3baafa53c8dcc609d87e8fd8adb2b700df40f3275908968dee74f4186921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a09a6f1318b285910c1db3eb8828a2d79034cfd7a1cf23926995b91b89d68f768bdab003f33ee4fc1480c1431fd22cffe6236bc69413494147bc9d12619ee73e
|
7
|
+
data.tar.gz: 1aa7010f7a371a8dca1f333a1254261341bfec1143e101dc2e6a717aa0dac43f31f4382050da248bb87a387268bd2ef39eeeb64ed76f348293dd5efafe9607e3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
### 2.1.1
|
4
|
+
|
5
|
+
* Explicitly call root test runner class to avoid a confusing error when test runner gem is not loaded
|
6
|
+
|
7
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/120
|
8
|
+
|
9
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v2.1.0...v2.1.1
|
10
|
+
|
11
|
+
### 2.1.0
|
12
|
+
|
13
|
+
* Add `KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX` to customize prefix for generating test examples report when using RSpec split by test examples
|
14
|
+
|
15
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/118
|
16
|
+
|
17
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v2.0.0...v2.1.0
|
18
|
+
|
3
19
|
### 2.0.0
|
4
20
|
|
5
21
|
* Add support for CI build ID for Github Actions
|
data/README.md
CHANGED
@@ -84,6 +84,7 @@ We keep this old FAQ in README to not break old links spread across the web. You
|
|
84
84
|
- [Supported test runners in queue mode](#supported-test-runners-in-queue-mode)
|
85
85
|
- [Split test files by test cases](#split-test-files-by-test-cases)
|
86
86
|
- [RSpec split test files by test examples (by individual `it`s)](#rspec-split-test-files-by-test-examples-by-individual-its)
|
87
|
+
- [Why I see error: Don't know how to build task 'knapsack_pro:rspec_test_example_detector'?](#why-i-see-error-dont-know-how-to-build-task-knapsack_prorspec_test_example_detector)
|
87
88
|
- [How to manually define a list of slow test files to be split by test cases](#how-to-manually-define-a-list-of-slow-test-files-to-be-split-by-test-cases)
|
88
89
|
- [Extra configuration for CI server](#extra-configuration-for-ci-server)
|
89
90
|
- [Info about ENV variables](#info-about-env-variables)
|
@@ -618,6 +619,16 @@ KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
|
|
618
619
|
|
619
620
|
Thanks to that your CI build speed can be faster. We recommend using this feature with [Queue Mode](https://youtu.be/hUEB1XDKEFY) to ensure parallel CI nodes finish work at a similar time which gives you the shortest CI build time.
|
620
621
|
|
622
|
+
#### Why I see error: Don't know how to build task 'knapsack_pro:rspec_test_example_detector'?
|
623
|
+
|
624
|
+
If you will see error like:
|
625
|
+
|
626
|
+
```
|
627
|
+
Don't know how to build task 'knapsack_pro:rspec_test_example_detector' (See the list of available tasks with `rake --tasks`)
|
628
|
+
```
|
629
|
+
|
630
|
+
It probably means bundler can't find the rake task. You can try to remove the default prefix `bundle exec` used by knapsack_pro gem by setting `KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX=""`.
|
631
|
+
|
621
632
|
### How to manually define a list of slow test files to be split by test cases
|
622
633
|
|
623
634
|
If you don't want to rely on a list of test files from Knapsack Pro API to determine slow test files that should be split by test cases then you can define your own list of slow test files.
|
@@ -85,10 +85,10 @@ module KnapsackPro
|
|
85
85
|
private
|
86
86
|
|
87
87
|
def add_post_run_callback(&block)
|
88
|
-
if Minitest.respond_to?(:after_run)
|
89
|
-
Minitest.after_run { block.call }
|
88
|
+
if ::Minitest.respond_to?(:after_run)
|
89
|
+
::Minitest.after_run { block.call }
|
90
90
|
else
|
91
|
-
Minitest::Unit.after_tests { block.call }
|
91
|
+
::Minitest::Unit.after_tests { block.call }
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
@@ -4,7 +4,7 @@ module KnapsackPro
|
|
4
4
|
TEST_DIR_PATTERN = 'spec/**{,/*/**}/*_spec.rb'
|
5
5
|
|
6
6
|
def self.test_path(example_group)
|
7
|
-
if defined?(Turnip) && Turnip::VERSION.to_i < 2
|
7
|
+
if defined?(::Turnip) && ::Turnip::VERSION.to_i < 2
|
8
8
|
unless example_group[:turnip]
|
9
9
|
until example_group[:parent_example_group].nil?
|
10
10
|
example_group = example_group[:parent_example_group]
|
@@ -42,7 +42,7 @@ module KnapsackPro
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def bind_time_tracker
|
45
|
-
Test::Unit::TestSuite.send(:prepend, BindTimeTrackerTestUnitPlugin)
|
45
|
+
::Test::Unit::TestSuite.send(:prepend, BindTimeTrackerTestUnitPlugin)
|
46
46
|
|
47
47
|
add_post_run_callback do
|
48
48
|
KnapsackPro.logger.debug(KnapsackPro::Presenter.global_time)
|
@@ -63,7 +63,7 @@ module KnapsackPro
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def add_post_run_callback(&block)
|
66
|
-
Test::Unit.at_exit do
|
66
|
+
::Test::Unit.at_exit do
|
67
67
|
block.call
|
68
68
|
end
|
69
69
|
end
|
@@ -34,7 +34,7 @@ module KnapsackPro
|
|
34
34
|
test_files_to_run = all_test_files_to_run
|
35
35
|
|
36
36
|
if adapter_class == KnapsackPro::Adapters::RSpecAdapter && KnapsackPro::Config::Env.rspec_split_by_test_examples?
|
37
|
-
unless Gem::Version.new(RSpec::Core::Version::STRING) >= Gem::Version.new('3.3.0')
|
37
|
+
unless Gem::Version.new(::RSpec::Core::Version::STRING) >= Gem::Version.new('3.3.0')
|
38
38
|
raise 'RSpec >= 3.3.0 is required to split test files by test examples. Learn more: https://github.com/KnapsackPro/knapsack_pro-ruby#split-test-files-by-test-cases'
|
39
39
|
end
|
40
40
|
|
@@ -43,7 +43,12 @@ module KnapsackPro
|
|
43
43
|
KnapsackPro.logger.info("Generating RSpec test examples JSON report for slow test files to prepare it to be split by test examples (by individual 'it's. Thanks to that a single slow test file can be split across parallel CI nodes). Analyzing #{slow_test_files.size} slow test files.")
|
44
44
|
|
45
45
|
# generate RSpec JSON report in separate process to not pollute RSpec state
|
46
|
-
cmd =
|
46
|
+
cmd = [
|
47
|
+
'RACK_ENV=test',
|
48
|
+
'RAILS_ENV=test',
|
49
|
+
KnapsackPro::Config::Env.rspec_test_example_detector_prefix,
|
50
|
+
'rake knapsack_pro:rspec_test_example_detector',
|
51
|
+
].join(' ')
|
47
52
|
unless Kernel.system(cmd)
|
48
53
|
raise "Could not generate JSON report for RSpec. Rake task failed when running #{cmd}"
|
49
54
|
end
|
@@ -179,6 +179,10 @@ module KnapsackPro
|
|
179
179
|
rspec_split_by_test_examples.to_s == 'true'
|
180
180
|
end
|
181
181
|
|
182
|
+
def rspec_test_example_detector_prefix
|
183
|
+
ENV.fetch('KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX', 'bundle exec')
|
184
|
+
end
|
185
|
+
|
182
186
|
def test_suite_token
|
183
187
|
env_name = 'KNAPSACK_PRO_TEST_SUITE_TOKEN'
|
184
188
|
ENV[env_name] || raise("Missing environment variable #{env_name}. You should set environment variable like #{env_name}_RSPEC (note there is suffix _RSPEC at the end). knapsack_pro gem will set #{env_name} based on #{env_name}_RSPEC value. If you use other test runner than RSpec then use proper suffix.")
|
@@ -3,8 +3,8 @@ RSpec::Support.require_rspec_core('formatters/json_formatter')
|
|
3
3
|
# based on https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
|
4
4
|
module KnapsackPro
|
5
5
|
module Formatters
|
6
|
-
class RSpecJsonFormatter < RSpec::Core::Formatters::JsonFormatter
|
7
|
-
RSpec::Core::Formatters.register self
|
6
|
+
class RSpecJsonFormatter < ::RSpec::Core::Formatters::JsonFormatter
|
7
|
+
::RSpec::Core::Formatters.register self
|
8
8
|
|
9
9
|
private
|
10
10
|
|
@@ -5,7 +5,7 @@ module KnapsackPro
|
|
5
5
|
module RSpecQueueProfileFormatterExtension
|
6
6
|
def self.print_summary
|
7
7
|
return unless KnapsackPro::Config::Env.modify_default_rspec_formatters?
|
8
|
-
RSpec::Core::Formatters::ProfileFormatter.print_profile_summary
|
8
|
+
::RSpec::Core::Formatters::ProfileFormatter.print_profile_summary
|
9
9
|
end
|
10
10
|
|
11
11
|
def initialize(output)
|
@@ -9,8 +9,8 @@ module KnapsackPro
|
|
9
9
|
def dump_summary(summary); end
|
10
10
|
end
|
11
11
|
|
12
|
-
class RSpecQueueSummaryFormatter < RSpec::Core::Formatters::BaseFormatter
|
13
|
-
RSpec::Core::Formatters.register self, :dump_summary, :dump_failures, :dump_pending
|
12
|
+
class RSpecQueueSummaryFormatter < ::RSpec::Core::Formatters::BaseFormatter
|
13
|
+
::RSpec::Core::Formatters.register self, :dump_summary, :dump_failures, :dump_pending
|
14
14
|
|
15
15
|
def self.registered_output=(output)
|
16
16
|
@registered_output = {
|
@@ -15,7 +15,7 @@ module KnapsackPro
|
|
15
15
|
Rake::Task[task_name].clear
|
16
16
|
end
|
17
17
|
|
18
|
-
Cucumber::Rake::Task.new(task_name) do |t|
|
18
|
+
::Cucumber::Rake::Task.new(task_name) do |t|
|
19
19
|
t.cucumber_opts = "#{args} --require #{runner.test_dir} -- #{runner.stringify_test_file_paths}"
|
20
20
|
end
|
21
21
|
Rake::Task[task_name].invoke
|
@@ -79,8 +79,8 @@ module KnapsackPro
|
|
79
79
|
|
80
80
|
log_rspec_command(args, test_file_paths, :subset_queue)
|
81
81
|
|
82
|
-
options = RSpec::Core::ConfigurationOptions.new(cli_args)
|
83
|
-
exit_code = RSpec::Core::Runner.new(options).run($stderr, $stdout)
|
82
|
+
options = ::RSpec::Core::ConfigurationOptions.new(cli_args)
|
83
|
+
exit_code = ::RSpec::Core::Runner.new(options).run($stderr, $stdout)
|
84
84
|
exitstatus = exit_code if exit_code != 0
|
85
85
|
|
86
86
|
rspec_clear_examples
|
@@ -124,26 +124,26 @@ module KnapsackPro
|
|
124
124
|
#
|
125
125
|
# Keep formatters and report to accumulate info about failed/pending tests
|
126
126
|
def self.rspec_clear_examples
|
127
|
-
if RSpec::ExampleGroups.respond_to?(:remove_all_constants)
|
128
|
-
RSpec::ExampleGroups.remove_all_constants
|
127
|
+
if ::RSpec::ExampleGroups.respond_to?(:remove_all_constants)
|
128
|
+
::RSpec::ExampleGroups.remove_all_constants
|
129
129
|
else
|
130
|
-
RSpec::ExampleGroups.constants.each do |constant|
|
131
|
-
RSpec::ExampleGroups.__send__(:remove_const, constant)
|
130
|
+
::RSpec::ExampleGroups.constants.each do |constant|
|
131
|
+
::RSpec::ExampleGroups.__send__(:remove_const, constant)
|
132
132
|
end
|
133
133
|
end
|
134
|
-
RSpec.world.example_groups.clear
|
135
|
-
RSpec.configuration.start_time = ::RSpec::Core::Time.now
|
134
|
+
::RSpec.world.example_groups.clear
|
135
|
+
::RSpec.configuration.start_time = ::RSpec::Core::Time.now
|
136
136
|
|
137
137
|
if KnapsackPro::Config::Env.rspec_split_by_test_examples?
|
138
138
|
# Reset example group counts to ensure scoped example ids in metadata
|
139
139
|
# have correct index (not increased by each subsequent run).
|
140
140
|
# Solves this problem: https://github.com/rspec/rspec-core/issues/2721
|
141
|
-
RSpec.world.instance_variable_set(:@example_group_counts_by_spec_file, Hash.new(0))
|
141
|
+
::RSpec.world.instance_variable_set(:@example_group_counts_by_spec_file, Hash.new(0))
|
142
142
|
end
|
143
143
|
|
144
144
|
# skip reset filters for old RSpec versions
|
145
|
-
if RSpec.configuration.respond_to?(:reset_filters)
|
146
|
-
RSpec.configuration.reset_filters
|
145
|
+
if ::RSpec.configuration.respond_to?(:reset_filters)
|
146
|
+
::RSpec.configuration.reset_filters
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
@@ -15,7 +15,7 @@ module KnapsackPro
|
|
15
15
|
Rake::Task[task_name].clear
|
16
16
|
end
|
17
17
|
|
18
|
-
RSpec::Core::RakeTask.new(task_name) do |t|
|
18
|
+
::RSpec::Core::RakeTask.new(task_name) do |t|
|
19
19
|
# we cannot pass runner.test_file_paths array to t.pattern
|
20
20
|
# because pattern does not accept test example path like spec/a_spec.rb[1:2]
|
21
21
|
# instead we pass test files and test example paths to t.rspec_opts
|
@@ -7,7 +7,7 @@ module KnapsackPro
|
|
7
7
|
require 'rspec/core'
|
8
8
|
|
9
9
|
cli_format =
|
10
|
-
if Gem::Version.new(RSpec::Core::Version::STRING) < Gem::Version.new('3.6.0')
|
10
|
+
if Gem::Version.new(::RSpec::Core::Version::STRING) < Gem::Version.new('3.6.0')
|
11
11
|
require_relative '../formatters/rspec_json_formatter'
|
12
12
|
['--format', KnapsackPro::Formatters::RSpecJsonFormatter.to_s]
|
13
13
|
else
|
@@ -30,8 +30,8 @@ module KnapsackPro
|
|
30
30
|
'--out', report_path,
|
31
31
|
'--default-path', test_dir,
|
32
32
|
] + KnapsackPro::TestFilePresenter.paths(test_file_entities)
|
33
|
-
options = RSpec::Core::ConfigurationOptions.new(cli_args)
|
34
|
-
exit_code = RSpec::Core::Runner.new(options).run($stderr, $stdout)
|
33
|
+
options = ::RSpec::Core::ConfigurationOptions.new(cli_args)
|
34
|
+
exit_code = ::RSpec::Core::Runner.new(options).run($stderr, $stdout)
|
35
35
|
if exit_code != 0
|
36
36
|
raise 'There was problem to generate test examples for test suite'
|
37
37
|
end
|
data/lib/knapsack_pro/version.rb
CHANGED
@@ -658,6 +658,20 @@ describe KnapsackPro::Config::Env do
|
|
658
658
|
end
|
659
659
|
end
|
660
660
|
|
661
|
+
describe '.rspec_test_example_detector_prefix' do
|
662
|
+
subject { described_class.rspec_test_example_detector_prefix }
|
663
|
+
|
664
|
+
context 'when ENV exists' do
|
665
|
+
before { stub_const("ENV", { 'KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX' => '' }) }
|
666
|
+
it { should eq '' }
|
667
|
+
end
|
668
|
+
|
669
|
+
context "when ENV doesn't exist" do
|
670
|
+
before { stub_const("ENV", {}) }
|
671
|
+
it { should eq 'bundle exec' }
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
661
675
|
describe '.test_suite_token' do
|
662
676
|
subject { described_class.test_suite_token }
|
663
677
|
|
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: 2.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ArturT
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|