selective-ruby-rspec 0.1.3 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28d546ae7d10547709d4b3180b1b52851d9ba8ab1f9e9f819d5b49abcde56136
4
- data.tar.gz: 1037b6b16f88ab08b67a51d4176f4d41d0ef43c7693793b8886b1e93f1c01dbe
3
+ metadata.gz: 742c9d113ea3409cd38857cad3943deaf6bf8c660f8061e97c57957b35ff2d07
4
+ data.tar.gz: 420c8ea9dac4e9b21a0346c7eba4ee8a0430ee83225f8f2dc1254bd175b0d413
5
5
  SHA512:
6
- metadata.gz: c50265ba4980fc2d49b2cca5eff7320b7ed6357d9ce03153b10e0bc8a3a1e180a6d65ec9645da1d89ff5fbc8eadecd3bbebd97150fe927e5d5354f94f1151786
7
- data.tar.gz: 29995bbfea2b82f9ffc3fb3996b3d35138ba9a95bee280e70d4adb0a5e73aaed1e83e3d2856b97909ccecfaa909fccfe76d4561e34d3c4665e7fbb25970354ab
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
- hooks.each do |hook|
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
- def self.apply
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
- ::RSpec::Core::ExampleGroup.extend(Hooks)
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 :args, :rspec_runner, :config
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
- Selective::Ruby::RSpec::Monkeypatches.apply
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
- args << "--format=progress" unless args.any? { |e| e.start_with?("--format") }
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, callback)
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
- test_case_ids.flatten.each do |test_case_id|
50
- run_test_case(test_case_id, callback)
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
- private
110
+ def framework
111
+ RunnerWrapper::FRAMEWORK
112
+ end
82
113
 
83
- def run_test_case(test_case_id, callback)
84
- ::RSpec.configuration.reset_filters
85
- ::RSpec.world.prepare_example_filtering
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
- # $rspec_rerun_debug = true if test_case == './spec/selective_spec.rb[1:2]' && ::RSpec.world.reporter.examples.length == 5
91
- rspec_runner.run_specs([::RSpec.world.example_map[test_case_id]])
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
@@ -3,7 +3,7 @@
3
3
  module Selective
4
4
  module Ruby
5
5
  module RSpec
6
- VERSION = "0.1.3"
6
+ VERSION = "0.1.5"
7
7
  end
8
8
  end
9
9
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "zeitwerk"
4
4
  require "rspec/core"
5
+ require "#{__dir__}/selective/ruby/rspec/version"
5
6
 
6
7
  loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
7
8
  loader.inflector.inflect("rspec" => "RSpec")
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.3
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: 2023-12-08 00:00:00.000000000 Z
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: '0'
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: '0'
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