selective-ruby-rspec 0.1.4 → 0.1.6

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: 357a3e88c5faad8cc7d188615b158094058f55b9342977bc999c14cfcdc82980
4
- data.tar.gz: 6afe356356bd83ae83cce8267a3d98446489621dee5960eda86772bd29861273
3
+ metadata.gz: ab16214c977e214c1768f9151be4d4eb3f89f4400279c1e269947b353792981d
4
+ data.tar.gz: b19ed802819f65223e9ef8a2f262a1fd7c0d3baa70329d6e1de8fe9d5f3b7981
5
5
  SHA512:
6
- metadata.gz: 47046465fbc086af40e51f7bf74e8ffd65c4d2b5c92ba914eff1e6a567e8cc005abad6b4f8e5e08492f0e35d076afd2c1f1cb3faa50f05ced435c72e5a910518
7
- data.tar.gz: d7013aba148b15d7a9f7576cf8e99f7497cf1860610d32ad6d5a6d802903862152921fa3fe8b8104767320e7012606afb6d0f758ab887fd8ac59c26293c57f13
6
+ metadata.gz: d4ba21e4eee2ded289e1d2448401b8078c10eddecb4fa6acaf489954becd0a0166d17be966dce11d96489d63fb8da890c99e1fdb961d2b18853801d536167b02
7
+ data.tar.gz: 4f585e62586e20423913e0ad0940dc8c13901de771876de44766b9eb705c58e193ad87083d4df5c56be90bc6814722d6337860c99e20d46e58fa74ebc978d45e
@@ -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,28 @@
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.runner_wrapper=(runner_wrapper)
10
+ @runner_wrapper = runner_wrapper
11
+ end
12
+
13
+ def self.runner_wrapper
14
+ @runner_wrapper
15
+ end
16
+
17
+ %i(example_passed example_failed example_pending).each do |method|
18
+ define_method(method) do |notification|
19
+ self.class.runner_wrapper.report_example(notification.example)
20
+ rescue Selective::Ruby::Core::ConnectionLostError
21
+ ::RSpec.world.wants_to_quit = true
22
+ self.class.runner_wrapper.remove_test_case_result(notification.example.id)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -97,6 +97,16 @@ module Selective
97
97
  super
98
98
  @example_map = {}
99
99
  end
100
+
101
+ def prepare_example_filtering
102
+ @filtered_examples = Hash.new do |hash, group|
103
+ hash[group] = if ::RSpec.configuration.dry_run?
104
+ filter_manager.prune(group.examples)
105
+ else
106
+ []
107
+ end
108
+ end
109
+ end
100
110
  end
101
111
 
102
112
  module Runner
@@ -106,7 +116,7 @@ module Selective
106
116
  module Example
107
117
  def initialize(*args)
108
118
  super
109
- ::RSpec.world.example_map[id] = example_group.parent_groups.last
119
+ ::RSpec.world.example_map[id] = self
110
120
  end
111
121
 
112
122
  def run(*args)
@@ -7,12 +7,13 @@ module Selective
7
7
  class RunnerWrapper
8
8
  class TestManifestError < StandardError; end
9
9
 
10
- attr_reader :rspec_runner, :config
10
+ attr_reader :rspec_runner, :config, :example_callback
11
11
 
12
12
  FRAMEWORK = "rspec"
13
13
  DEFAULT_SPEC_PATH = "./spec"
14
14
 
15
- def initialize(args)
15
+ def initialize(args, example_callback)
16
+ @example_callback = example_callback
16
17
  rspec_args, wrapper_config_hash = parse_args(args)
17
18
  Selective::Ruby::RSpec::Monkeypatches.apply(wrapper_config_hash)
18
19
  apply_rspec_configuration
@@ -22,27 +23,12 @@ module Selective
22
23
  config.options[:files_or_directories_to_run] = [DEFAULT_SPEC_PATH]
23
24
  end
24
25
 
26
+ Formatter.runner_wrapper = self
27
+
25
28
  @rspec_runner = ::RSpec::Core::Runner.new(@config)
26
29
  @rspec_runner.setup($stderr, $stdout)
27
30
  end
28
31
 
29
- def parse_args(args)
30
- supported_wrapper_args = %w[--require-each-hooks]
31
- wrapper_args, rspec_args = args.partition do |arg|
32
- supported_wrapper_args.any? do |p|
33
- arg.start_with?(p)
34
- end
35
- end
36
-
37
- wrapper_config_hash = wrapper_args.each_with_object({}) do |arg, hash|
38
- key = arg.sub('--', '').tr('-', '_').to_sym
39
- hash[key] = true
40
- end
41
-
42
- rspec_args << "--format=progress" unless args.any? { |e| e.start_with?("--format") }
43
- [rspec_args, wrapper_config_hash]
44
- end
45
-
46
32
  def manifest
47
33
  output = nil
48
34
  Tempfile.create("selective-rspec-dry-run") do |f|
@@ -59,19 +45,17 @@ module Selective
59
45
  raise_test_manifest_error(e.message)
60
46
  end
61
47
 
62
- def run_test_cases(test_case_ids, callback)
63
- ::RSpec.world.reporter.send(:start, nil)
64
- Selective::Ruby::Core::Controller.suppress_reporting!
65
- test_case_ids.flatten.each do |test_case_id|
66
- run_test_case(test_case_id, callback)
67
- end
48
+ def run_test_cases(test_case_ids)
49
+ ensure_test_phase
50
+ configure(test_case_ids)
51
+ rspec_runner.run_specs(optimize_test_filtering(test_case_ids).to_a)
68
52
  end
69
53
 
70
54
  def exec
71
55
  rspec_runner.run($stderr, $stdout)
72
56
  end
73
57
 
74
- def remove_failed_test_case_result(test_case_id)
58
+ def remove_test_case_result(test_case_id)
75
59
  failure = ::RSpec.world.reporter.failed_examples.detect { |e| e.id == test_case_id }
76
60
  if (failed_example_index = ::RSpec.world.reporter.failed_examples.index(failure))
77
61
  ::RSpec.world.reporter.failed_examples.delete_at(failed_example_index)
@@ -106,18 +90,27 @@ module Selective
106
90
  RSpec::VERSION
107
91
  end
108
92
 
93
+ def report_example(example)
94
+ example_callback.call(format_example(example))
95
+ end
96
+
109
97
  private
110
98
 
111
- def run_test_case(test_case_id, callback)
112
- ::RSpec.configuration.reset_filters
113
- ::RSpec.world.prepare_example_filtering
114
- config.options[:files_or_directories_to_run] = test_case_id
115
- rspec_runner.options = config
116
- rspec_runner.setup($stderr, $stdout)
99
+ def parse_args(args)
100
+ supported_wrapper_args = %w[--require-each-hooks]
101
+ wrapper_args, rspec_args = args.partition do |arg|
102
+ supported_wrapper_args.any? do |p|
103
+ arg.start_with?(p)
104
+ end
105
+ end
117
106
 
118
- # $rspec_rerun_debug = true if test_case == './spec/selective_spec.rb[1:2]' && ::RSpec.world.reporter.examples.length == 5
119
- rspec_runner.run_specs([::RSpec.world.example_map[test_case_id]])
120
- callback.call(format_example(get_example_from_reporter(test_case_id)))
107
+ wrapper_config_hash = wrapper_args.each_with_object({}) do |arg, hash|
108
+ key = arg.sub('--', '').tr('-', '_').to_sym
109
+ hash[key] = true
110
+ end
111
+
112
+ rspec_args << "--format=progress" unless args.any? { |e| e.start_with?("--format") }
113
+ [rspec_args, wrapper_config_hash]
121
114
  end
122
115
 
123
116
  def get_example_from_reporter(test_case_id)
@@ -161,6 +154,42 @@ module Selective
161
154
  def raise_test_manifest_error(output)
162
155
  raise TestManifestError.new("Selective could not generate a test manifest. The output was:\n#{output}")
163
156
  end
157
+
158
+ def configure(test_case_ids)
159
+ ::RSpec.world.wants_to_quit = false
160
+ ::RSpec.configuration.reset_filters
161
+ ::RSpec.world.filtered_examples.clear
162
+
163
+ config.options[:files_or_directories_to_run] = test_case_ids
164
+ rspec_runner.configure($stderr, $stdout)
165
+ ::RSpec.configuration.load_spec_files
166
+ end
167
+
168
+ def optimize_test_filtering(test_case_ids)
169
+ # The following is an optimization to avoid RSpec's usual filtering mechanism
170
+ # which has a significant performance overhead.
171
+ test_case_ids.each_with_object(Set.new) do |test_case_id, set|
172
+ example = ::RSpec.world.example_map[test_case_id]
173
+ if ::RSpec.world.filtered_examples.key?(example.example_group)
174
+ ::RSpec.world.filtered_examples[example.example_group] << example
175
+ else
176
+ ::RSpec.world.filtered_examples[example.example_group] = [example]
177
+ end
178
+ set << example.example_group.parent_groups.last
179
+ end
180
+ end
181
+
182
+ def ensure_test_phase
183
+ @test_phase_initialized ||= begin
184
+ ::RSpec.world.reporter.send(:start, nil)
185
+ Selective::Ruby::Core::Controller.suppress_reporting!
186
+ apply_formatter
187
+ end
188
+ end
189
+
190
+ def apply_formatter
191
+ config.options[:formatters] << [Selective::Ruby::RSpec::Formatter.to_s]
192
+ end
164
193
  end
165
194
  end
166
195
  end
@@ -3,7 +3,7 @@
3
3
  module Selective
4
4
  module Ruby
5
5
  module RSpec
6
- VERSION = "0.1.4"
6
+ VERSION = "0.1.6"
7
7
  end
8
8
  end
9
9
  end
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
4
+ version: 0.1.6
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: 2024-01-04 00:00:00.000000000 Z
12
+ date: 2024-02-06 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.3
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.3
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