selective-ruby-rspec 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.semaphore/semaphore.yml +19 -0
- data/lib/selective/ruby/rspec/formatter.rb +25 -0
- data/lib/selective/ruby/rspec/monkeypatches.rb +23 -5
- data/lib/selective/ruby/rspec/runner_wrapper.rb +60 -20
- data/lib/selective/ruby/rspec/version.rb +1 -1
- data/lib/selective-ruby-rspec.rb +1 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 742c9d113ea3409cd38857cad3943deaf6bf8c660f8061e97c57957b35ff2d07
|
4
|
+
data.tar.gz: 420c8ea9dac4e9b21a0346c7eba4ee8a0430ee83225f8f2dc1254bd175b0d413
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e8e31650ee078e7f0cabf43120c99b06f3a500b463b3c04fbe49dd9723db2a97ced3565c82729956f1f13a8c3fc0d0442d4eac96e8f228a7a02b2e3e483592e
|
7
|
+
data.tar.gz: 269a44800fb7a24bf58f32552d7313d54ddf6cb033eb252f1cebc220f2364b92fe67ee822d25cce1db731d1175266a85bf7d58931f770f1054409c32cfcff1d4
|
@@ -0,0 +1,19 @@
|
|
1
|
+
version: v1.0
|
2
|
+
name: Ruby
|
3
|
+
agent:
|
4
|
+
machine:
|
5
|
+
type: e1-standard-2
|
6
|
+
os_image: ubuntu2004
|
7
|
+
blocks:
|
8
|
+
- name: Run RSpec tests
|
9
|
+
task:
|
10
|
+
jobs:
|
11
|
+
- name: Run RSpec tests
|
12
|
+
parallelism: 2
|
13
|
+
commands:
|
14
|
+
- sem-version ruby 3.3.0
|
15
|
+
- checkout
|
16
|
+
- bundle install
|
17
|
+
- bundle exec selective rspec
|
18
|
+
secrets:
|
19
|
+
- name: Selective
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Selective
|
2
|
+
module Ruby
|
3
|
+
module RSpec
|
4
|
+
class Formatter
|
5
|
+
::RSpec::Core::Formatters.register self, :example_passed, :example_failed, :example_pending
|
6
|
+
|
7
|
+
def initialize(...); end
|
8
|
+
|
9
|
+
def self.callback=(callback)
|
10
|
+
@callback = callback
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.callback
|
14
|
+
@callback
|
15
|
+
end
|
16
|
+
|
17
|
+
%i(example_passed example_failed example_pending).each do |method|
|
18
|
+
define_method(method) do |notification|
|
19
|
+
self.class.callback.call(notification.example)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -139,10 +139,10 @@ module Selective
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
|
142
|
-
module Hooks
|
143
|
-
hooks = %i(before prepend_before after append_after)
|
144
142
|
|
145
|
-
|
143
|
+
HOOKS = %i(before prepend_before after append_after)
|
144
|
+
module Hooks
|
145
|
+
HOOKS.each do |hook|
|
146
146
|
define_method(hook) do |*args, &block|
|
147
147
|
args = args.map { |a| a == :all ? :each : a }
|
148
148
|
super(*args, &block)
|
@@ -150,7 +150,21 @@ module Selective
|
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
|
-
|
153
|
+
module RequireEachHooks
|
154
|
+
HOOKS.each do |hook|
|
155
|
+
define_method(hook) do |*args, &block|
|
156
|
+
if args.none? { |a| a == :all}
|
157
|
+
super(*args, &block)
|
158
|
+
else
|
159
|
+
super(*args) do
|
160
|
+
raise "Before :all hooks are not supported when using --require-each-hooks. Please use before(:each) instead."
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.apply(config)
|
154
168
|
::RSpec::Support.require_rspec_core("formatters/base_text_formatter")
|
155
169
|
|
156
170
|
MAP.each do |module_name, _methods|
|
@@ -163,7 +177,11 @@ module Selective
|
|
163
177
|
# a bug in < Ruby 3.0 that prevents us from doing so. Instead,
|
164
178
|
# we extend the ExampleGroup class which is where the Hooks module
|
165
179
|
# is included.
|
166
|
-
|
180
|
+
if config[:require_each_hooks]
|
181
|
+
::RSpec::Core::ExampleGroup.extend(RequireEachHooks)
|
182
|
+
else
|
183
|
+
::RSpec::Core::ExampleGroup.extend(Hooks)
|
184
|
+
end
|
167
185
|
|
168
186
|
::RSpec.singleton_class.prepend(RSpec)
|
169
187
|
::RSpec::Core::Reporter.prepend(Reporter)
|
@@ -7,26 +7,45 @@ module Selective
|
|
7
7
|
class RunnerWrapper
|
8
8
|
class TestManifestError < StandardError; end
|
9
9
|
|
10
|
-
attr_reader :
|
10
|
+
attr_reader :rspec_runner, :config, :example_callback
|
11
11
|
|
12
|
+
FRAMEWORK = "rspec"
|
12
13
|
DEFAULT_SPEC_PATH = "./spec"
|
13
14
|
|
14
|
-
def initialize(args)
|
15
|
-
|
15
|
+
def initialize(args, example_callback)
|
16
|
+
@example_callback = example_callback
|
17
|
+
rspec_args, wrapper_config_hash = parse_args(args)
|
18
|
+
Selective::Ruby::RSpec::Monkeypatches.apply(wrapper_config_hash)
|
16
19
|
apply_rspec_configuration
|
17
20
|
|
18
|
-
|
19
|
-
@args = args
|
20
|
-
|
21
|
-
@config = ::RSpec::Core::ConfigurationOptions.new(args)
|
21
|
+
@config = ::RSpec::Core::ConfigurationOptions.new(rspec_args)
|
22
22
|
if config.options[:files_or_directories_to_run].empty?
|
23
23
|
config.options[:files_or_directories_to_run] = [DEFAULT_SPEC_PATH]
|
24
24
|
end
|
25
25
|
|
26
|
+
Formatter.callback = method(:report_example)
|
27
|
+
|
26
28
|
@rspec_runner = ::RSpec::Core::Runner.new(@config)
|
27
29
|
@rspec_runner.setup($stderr, $stdout)
|
28
30
|
end
|
29
31
|
|
32
|
+
def parse_args(args)
|
33
|
+
supported_wrapper_args = %w[--require-each-hooks]
|
34
|
+
wrapper_args, rspec_args = args.partition do |arg|
|
35
|
+
supported_wrapper_args.any? do |p|
|
36
|
+
arg.start_with?(p)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
wrapper_config_hash = wrapper_args.each_with_object({}) do |arg, hash|
|
41
|
+
key = arg.sub('--', '').tr('-', '_').to_sym
|
42
|
+
hash[key] = true
|
43
|
+
end
|
44
|
+
|
45
|
+
rspec_args << "--format=progress" unless args.any? { |e| e.start_with?("--format") }
|
46
|
+
[rspec_args, wrapper_config_hash]
|
47
|
+
end
|
48
|
+
|
30
49
|
def manifest
|
31
50
|
output = nil
|
32
51
|
Tempfile.create("selective-rspec-dry-run") do |f|
|
@@ -43,12 +62,22 @@ module Selective
|
|
43
62
|
raise_test_manifest_error(e.message)
|
44
63
|
end
|
45
64
|
|
46
|
-
def run_test_cases(test_case_ids
|
65
|
+
def run_test_cases(test_case_ids)
|
47
66
|
::RSpec.world.reporter.send(:start, nil)
|
48
67
|
Selective::Ruby::Core::Controller.suppress_reporting!
|
49
|
-
|
50
|
-
|
68
|
+
|
69
|
+
::RSpec.configuration.reset_filters
|
70
|
+
::RSpec.world.prepare_example_filtering
|
71
|
+
config.options[:files_or_directories_to_run] = test_case_ids
|
72
|
+
ensure_formatter
|
73
|
+
|
74
|
+
rspec_runner.setup($stderr, $stdout)
|
75
|
+
|
76
|
+
example_groups = test_case_ids.each_with_object(Set.new) do |test_case_id, set|
|
77
|
+
set << ::RSpec.world.example_map[test_case_id]
|
51
78
|
end
|
79
|
+
|
80
|
+
rspec_runner.run_specs(example_groups.to_a)
|
52
81
|
end
|
53
82
|
|
54
83
|
def exec
|
@@ -78,20 +107,20 @@ module Selective
|
|
78
107
|
::RSpec.world.reporter.finish
|
79
108
|
end
|
80
109
|
|
81
|
-
|
110
|
+
def framework
|
111
|
+
RunnerWrapper::FRAMEWORK
|
112
|
+
end
|
82
113
|
|
83
|
-
def
|
84
|
-
::RSpec
|
85
|
-
|
86
|
-
config.options[:files_or_directories_to_run] = test_case_id
|
87
|
-
rspec_runner.options = config
|
88
|
-
rspec_runner.setup($stderr, $stdout)
|
114
|
+
def framework_version
|
115
|
+
::RSpec::Core::Version::STRING
|
116
|
+
end
|
89
117
|
|
90
|
-
|
91
|
-
|
92
|
-
callback.call(format_example(get_example_from_reporter(test_case_id)))
|
118
|
+
def wrapper_version
|
119
|
+
RSpec::VERSION
|
93
120
|
end
|
94
121
|
|
122
|
+
private
|
123
|
+
|
95
124
|
def get_example_from_reporter(test_case_id)
|
96
125
|
::RSpec.world.reporter.examples.detect { |e| e.id == test_case_id }
|
97
126
|
end
|
@@ -123,6 +152,10 @@ module Selective
|
|
123
152
|
}
|
124
153
|
end
|
125
154
|
|
155
|
+
def report_example(example)
|
156
|
+
example_callback.call(format_example(example))
|
157
|
+
end
|
158
|
+
|
126
159
|
def apply_rspec_configuration
|
127
160
|
::RSpec.configure do |config|
|
128
161
|
config.backtrace_exclusion_patterns = config.backtrace_exclusion_patterns | [/lib\/selective/]
|
@@ -133,6 +166,13 @@ module Selective
|
|
133
166
|
def raise_test_manifest_error(output)
|
134
167
|
raise TestManifestError.new("Selective could not generate a test manifest. The output was:\n#{output}")
|
135
168
|
end
|
169
|
+
|
170
|
+
def ensure_formatter
|
171
|
+
formatter = [Selective::Ruby::RSpec::Formatter.to_s]
|
172
|
+
return if config.options[:formatters].include?(formatter)
|
173
|
+
|
174
|
+
config.options[:formatters] << formatter
|
175
|
+
end
|
136
176
|
end
|
137
177
|
end
|
138
178
|
end
|
data/lib/selective-ruby-rspec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selective-ruby-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Wood
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-01-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: zeitwerk
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 0.2.2
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 0.2.2
|
42
42
|
description: Selective is an intelligent test runner for your current CI provider.
|
43
43
|
Get real-time test results, intelligent ordering based on code changes, shorter
|
44
44
|
run times, automatic flake detection, the ability to re-enqueue failed tests, and
|
@@ -50,9 +50,11 @@ executables: []
|
|
50
50
|
extensions: []
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
|
+
- ".semaphore/semaphore.yml"
|
53
54
|
- LICENSE
|
54
55
|
- Rakefile
|
55
56
|
- lib/selective-ruby-rspec.rb
|
57
|
+
- lib/selective/ruby/rspec/formatter.rb
|
56
58
|
- lib/selective/ruby/rspec/monkeypatches.rb
|
57
59
|
- lib/selective/ruby/rspec/runner_wrapper.rb
|
58
60
|
- lib/selective/ruby/rspec/version.rb
|