polyrun 2.2.9 → 3.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -8
  3. data/README.md +7 -6
  4. data/docs/SETUP_PROFILE.md +2 -1
  5. data/lib/polyrun/cli/ci_shard_run_command.rb +31 -0
  6. data/lib/polyrun/cli/default_run.rb +10 -3
  7. data/lib/polyrun/cli/help.rb +5 -3
  8. data/lib/polyrun/cli/run_shards_command.rb +17 -0
  9. data/lib/polyrun/cli.rb +5 -2
  10. data/lib/polyrun/coverage/collector.rb +21 -49
  11. data/lib/polyrun/coverage/collector_blob.rb +53 -0
  12. data/lib/polyrun/data/parallel_provisioning.rb +2 -2
  13. data/lib/polyrun/hooks/dsl.rb +6 -6
  14. data/lib/polyrun/{minitest.rb → minitest_support.rb} +4 -4
  15. data/lib/polyrun/partition/paths.rb +95 -48
  16. data/lib/polyrun/partition/suite.rb +10 -6
  17. data/lib/polyrun/quick/config.rb +56 -0
  18. data/lib/polyrun/quick/example_group.rb +49 -4
  19. data/lib/polyrun/quick/example_runner.rb +30 -7
  20. data/lib/polyrun/quick/matchers.rb +6 -3
  21. data/lib/polyrun/quick/matchers_predicates.rb +122 -0
  22. data/lib/polyrun/quick/reporter.rb +40 -6
  23. data/lib/polyrun/quick/runner.rb +30 -16
  24. data/lib/polyrun/reporting/rspec_failure_fragment_formatter.rb +1 -1
  25. data/lib/polyrun/reporting/rspec_junit.rb +2 -2
  26. data/lib/polyrun/{rspec → rspec_support}/active_record_timeout_recovery.rb +1 -1
  27. data/lib/polyrun/{rspec → rspec_support}/example_debug.rb +1 -1
  28. data/lib/polyrun/{rspec → rspec_support}/example_debug_instrumentation.rb +1 -1
  29. data/lib/polyrun/{rspec → rspec_support}/sharded_formatter_compat.rb +1 -1
  30. data/lib/polyrun/{rspec.rb → rspec_support.rb} +12 -12
  31. data/lib/polyrun/sus_support.rb +55 -0
  32. data/lib/polyrun/templates/POLYRUN.md +1 -1
  33. data/lib/polyrun/timing/rspec_example_formatter.rb +2 -2
  34. data/lib/polyrun/version.rb +1 -1
  35. data/lib/polyrun/worker_ping.rb +9 -6
  36. data/sig/polyrun/{minitest.rbs → minitest_support.rbs} +1 -1
  37. data/sig/polyrun/{rspec.rbs → rspec_support.rbs} +1 -1
  38. data/sig/polyrun/sus_support.rbs +7 -0
  39. metadata +14 -9
@@ -1,6 +1,9 @@
1
1
  module Polyrun
2
2
  module Quick
3
3
  class Reporter
4
+ SLOW_THRESHOLD_SECONDS = 0.05
5
+ SLOWEST_LIMIT = 5
6
+
4
7
  def initialize(out, err, verbose)
5
8
  @out = out
6
9
  @err = err
@@ -8,24 +11,28 @@ module Polyrun
8
11
  @passed = 0
9
12
  @failed = 0
10
13
  @errors = 0
14
+ @timings = []
11
15
  end
12
16
 
13
- def pass(group, description)
17
+ def pass(group, description, duration_seconds: nil)
14
18
  @passed += 1
19
+ record_timing(group, description, duration_seconds)
15
20
  return unless @verbose
16
21
 
17
- @out.puts " ok #{group} #{description}"
22
+ @out.puts " ok #{group} #{description}#{duration_suffix(duration_seconds)}"
18
23
  end
19
24
 
20
- def fail(group, description, exc)
25
+ def fail(group, description, exc, duration_seconds: nil)
21
26
  @failed += 1
22
- @err.puts " FAIL #{group} #{description}"
27
+ record_timing(group, description, duration_seconds)
28
+ @err.puts " FAIL #{group} #{description}#{duration_suffix(duration_seconds)}"
23
29
  @err.puts " #{exc.message}"
24
30
  end
25
31
 
26
- def error(group, description, exc)
32
+ def error(group, description, exc, duration_seconds: nil)
27
33
  @errors += 1
28
- @err.puts " ERROR #{group} #{description}"
34
+ record_timing(group, description, duration_seconds)
35
+ @err.puts " ERROR #{group} #{description}#{duration_suffix(duration_seconds)}"
29
36
  @err.puts " #{exc.class}: #{exc.message}"
30
37
  loc = exc.backtrace&.first
31
38
  @err.puts " #{loc}" if loc
@@ -35,8 +42,35 @@ module Polyrun
35
42
  total = @passed + @failed + @errors
36
43
  @out.puts
37
44
  @out.puts "Polyrun::Quick: #{@passed} passed, #{@failed} failed, #{@errors} errors (#{total} examples)"
45
+ print_slowest!
38
46
  (@failed + @errors).positive? ? 1 : 0
39
47
  end
48
+
49
+ private
50
+
51
+ def record_timing(group, description, duration_seconds)
52
+ return if duration_seconds.nil?
53
+
54
+ @timings << ["#{group} #{description}".strip, duration_seconds.to_f]
55
+ end
56
+
57
+ def duration_suffix(duration_seconds)
58
+ return "" if duration_seconds.nil?
59
+
60
+ format(" (%.3fs)", duration_seconds)
61
+ end
62
+
63
+ def print_slowest!
64
+ slow = @timings.select { |(_, sec)| sec >= SLOW_THRESHOLD_SECONDS }
65
+ .sort_by { |(_, sec)| -sec }
66
+ .first(SLOWEST_LIMIT)
67
+ return if slow.empty?
68
+
69
+ @out.puts "Slowest:"
70
+ slow.each do |label, sec|
71
+ @out.puts format(" %.3fs %s", sec, label)
72
+ end
73
+ end
40
74
  end
41
75
  end
42
76
  end
@@ -1,20 +1,22 @@
1
- # rubocop:disable Polyrun/FileLength -- quick runner + spec quality wiring
1
+ # rubocop:disable Polyrun/FileLength -- quick runner + suite config + coverage wiring
2
2
  require "pathname"
3
3
 
4
4
  require_relative "assertions"
5
+ require_relative "config"
5
6
  require_relative "errors"
6
7
  require_relative "example_group"
7
8
  require_relative "example_runner"
8
9
  require_relative "reporter"
9
10
 
10
11
  module Polyrun
11
- # Micro test runner: nested +describe+, +it+ / +test+, +before+ / +after+, +let+ / +let!+,
12
- # +expect().to+ matchers, optional +Polyrun::Quick.capybara!+ when the +capybara+ gem is loaded.
12
+ # Micro test runner: nested +describe+ / +with+, +it+ / +test+, +before+ / +after+ / +around+,
13
+ # +let+ / +let!+ / +subject+, +expect().to+ matchers, optional +Polyrun::Quick.capybara!+.
13
14
  #
14
15
  # Run: +polyrun quick+ or +polyrun quick spec/foo.rb+
16
+ # Optional suite file: +config/polyrun_quick.rb+ (+before_suite+, +after_suite+, +add_load_path+).
15
17
  #
16
- # Coverage: when +POLYRUN_COVERAGE=1+ or (+config/polyrun_coverage.yml+ and +POLYRUN_QUICK_COVERAGE=1+), starts
17
- # {Polyrun::Coverage::Rails} before loading quick files so stdlib +Coverage+ records them.
18
+ # Coverage: when +POLYRUN_COVERAGE=1+, Covered-style +COVERAGE+, or (+config/polyrun_coverage.yml+ and
19
+ # +POLYRUN_QUICK_COVERAGE=1+), starts {Polyrun::Coverage::Rails} before loading quick files.
18
20
  module Quick
19
21
  module DSL
20
22
  def describe(name, &block)
@@ -103,6 +105,10 @@ module Polyrun
103
105
 
104
106
  def run(paths)
105
107
  Quick.reset_capybara_flag!
108
+ config = Config.load!(root: Dir.pwd)
109
+ config.apply_load_paths!(root: Dir.pwd)
110
+ status = 2
111
+ suite_hooks = false
106
112
 
107
113
  files = expand_paths(paths)
108
114
  if files.empty?
@@ -110,18 +116,27 @@ module Polyrun
110
116
  return 2
111
117
  end
112
118
 
113
- quick_start_coverage_if_configured!
114
- quick_start_spec_quality_if_configured!
119
+ begin
120
+ config.run_before_suite!
121
+ suite_hooks = true
122
+ quick_start_coverage_if_configured!
123
+ quick_start_spec_quality_if_configured!
115
124
 
116
- collector = load_quick_files!(files)
117
- return 1 unless collector
125
+ collector = load_quick_files!(files)
126
+ unless collector
127
+ status = 1
128
+ return 1
129
+ end
118
130
 
119
- reporter = Reporter.new(@out, @err, @verbose)
120
- run_examples!(collector, reporter)
121
- reporter.summary
122
- ensure
123
- Quick.collector = nil
124
- Quick.reset_capybara_flag!
131
+ reporter = Reporter.new(@out, @err, @verbose)
132
+ run_examples!(collector, reporter)
133
+ status = reporter.summary
134
+ status
135
+ ensure
136
+ config.run_after_suite!(status) if suite_hooks
137
+ Quick.collector = nil
138
+ Quick.reset_capybara_flag!
139
+ end
125
140
  end
126
141
 
127
142
  def load_quick_files!(files)
@@ -200,7 +215,6 @@ module Polyrun
200
215
  Runner.parallel_default_paths(Dir.pwd)
201
216
  end
202
217
 
203
- # Omit RSpec/Minitest files and common helpers so +polyrun quick+ with no args does not load normal suites.
204
218
  def default_quick_exclude?(path, base)
205
219
  Runner.quick_path_excluded?(path, base)
206
220
  end
@@ -4,7 +4,7 @@ require "fileutils"
4
4
  module Polyrun
5
5
  module Reporting
6
6
  # RSpec formatter: appends one JSON object per failed example to the shard fragment file.
7
- # Enable via +Polyrun::RSpec.install_failure_fragments!+ and +POLYRUN_FAILURE_FRAGMENTS=1+ (set by run-shards --merge-failures).
7
+ # Enable via +Polyrun::RSpecSupport.install_failure_fragments!+ and +POLYRUN_FAILURE_FRAGMENTS=1+ (set by run-shards --merge-failures).
8
8
  #
9
9
  # Output: +tmp/polyrun_failures/polyrun-failure-fragment-<workerN|shardM-workerN>.jsonl+
10
10
  # (same basename rules as {Coverage::CollectorFragmentMeta}.)
@@ -21,8 +21,8 @@ module Polyrun
21
21
  require "rspec/core"
22
22
  require "rspec/core/formatters/json_formatter"
23
23
 
24
- RSpec.configure do |config|
25
- config.add_formatter RSpec::Core::Formatters::JsonFormatter, json_abs
24
+ ::RSpec.configure do |config|
25
+ config.add_formatter ::RSpec::Core::Formatters::JsonFormatter, json_abs
26
26
  end
27
27
 
28
28
  at_exit do
@@ -1,5 +1,5 @@
1
1
  module Polyrun
2
- module RSpec
2
+ module RSpecSupport
3
3
  # Drops pooled connections after per-example Timeout interrupts database I/O.
4
4
  # Uses only ActiveRecord connection-pool APIs (PostgreSQL, MySQL, SQLite, SQL Server, etc.).
5
5
  module ActiveRecordTimeoutRecovery
@@ -3,7 +3,7 @@ require "timeout"
3
3
  require_relative "example_debug_instrumentation"
4
4
 
5
5
  module Polyrun
6
- module RSpec
6
+ module RSpecSupport
7
7
  # Per-example RSpec debugging for local investigation (SQL, TracePoint, timeouts).
8
8
  #
9
9
  # +POLYRUN_EXAMPLE_DEBUG=1+ enables print helpers, Rails logging, and disables per-example timeouts.
@@ -1,5 +1,5 @@
1
1
  module Polyrun
2
- module RSpec
2
+ module RSpecSupport
3
3
  module ExampleDebug
4
4
  SKIPPED_SQL_PREFIX = /\A(?:SELECT|SET|SHOW|BEGIN|COMMIT|ROLLBACK|RELEASE|SAVEPOINT)/
5
5
 
@@ -1,5 +1,5 @@
1
1
  module Polyrun
2
- module RSpec
2
+ module RSpecSupport
3
3
  # Formatter tweaks for progress formatters under +POLYRUN_SHARD_*+ workers.
4
4
  module ShardedFormatterCompat
5
5
  TextFormatterSilencer = Module.new do
@@ -1,8 +1,8 @@
1
1
  require_relative "../polyrun"
2
2
 
3
3
  module Polyrun
4
- # Optional RSpec wiring (require +polyrun/rspec+ explicitly).
5
- module RSpec
4
+ # Optional RSpec wiring (require +polyrun/rspec_support+ explicitly).
5
+ module RSpecSupport
6
6
  module_function
7
7
 
8
8
  # Registers +before(:suite)+ to run {Data::ParallelProvisioning.run_suite_hooks!}.
@@ -74,31 +74,31 @@ module Polyrun
74
74
  end
75
75
 
76
76
  def install_example_debug!(rspec_config: nil)
77
- require_relative "rspec/example_debug"
78
- Polyrun::RSpec::ExampleDebug.install!(rspec_config: rspec_config || fetch_rspec_configuration!)
77
+ require_relative "rspec_support/example_debug"
78
+ Polyrun::RSpecSupport::ExampleDebug.install!(rspec_config: rspec_config || fetch_rspec_configuration!)
79
79
  end
80
80
 
81
81
  def install_example_timeout!(rspec_config: nil, seconds: ENV.fetch("RSPEC_EXAMPLE_TIMEOUT_SEC", "30").to_f)
82
- require_relative "rspec/example_debug"
83
- Polyrun::RSpec::ExampleDebug.install_example_timeout!(
82
+ require_relative "rspec_support/example_debug"
83
+ Polyrun::RSpecSupport::ExampleDebug.install_example_timeout!(
84
84
  rspec_config || fetch_rspec_configuration!,
85
85
  seconds: seconds
86
86
  )
87
87
  end
88
88
 
89
89
  def install_example_rails_logging!(rspec_config: nil)
90
- require_relative "rspec/example_debug"
91
- Polyrun::RSpec::ExampleDebug.install_rails_logging!(rspec_config: rspec_config || fetch_rspec_configuration!)
90
+ require_relative "rspec_support/example_debug"
91
+ Polyrun::RSpecSupport::ExampleDebug.install_rails_logging!(rspec_config: rspec_config || fetch_rspec_configuration!)
92
92
  end
93
93
 
94
94
  def install_example_prosopite!(rspec_config: nil)
95
- require_relative "rspec/example_debug"
96
- Polyrun::RSpec::ExampleDebug.install_prosopite!(rspec_config: rspec_config || fetch_rspec_configuration!)
95
+ require_relative "rspec_support/example_debug"
96
+ Polyrun::RSpecSupport::ExampleDebug.install_prosopite!(rspec_config: rspec_config || fetch_rspec_configuration!)
97
97
  end
98
98
 
99
99
  def install_sharded_formatter_compat!(rspec_config: nil)
100
- require_relative "rspec/sharded_formatter_compat"
101
- Polyrun::RSpec::ShardedFormatterCompat.install!(rspec_config: rspec_config || fetch_rspec_configuration!)
100
+ require_relative "rspec_support/sharded_formatter_compat"
101
+ Polyrun::RSpecSupport::ShardedFormatterCompat.install!(rspec_config: rspec_config || fetch_rspec_configuration!)
102
102
  end
103
103
 
104
104
  def fetch_rspec_configuration!
@@ -0,0 +1,55 @@
1
+ require_relative "../polyrun"
2
+
3
+ module Polyrun
4
+ # Optional Sus-oriented wiring (require +polyrun/sus_support+ explicitly).
5
+ #
6
+ # Does not load the +sus+ gem. Call installers from +config/sus.rb+ after Sus is available
7
+ # when a hook needs +Sus::Config+.
8
+ module SusSupport
9
+ module WorkerPingConfigHook
10
+ def before_tests(assertions, output: self.output)
11
+ Polyrun::WorkerPing.ping!(location: "sus:before_tests")
12
+ super
13
+ end
14
+
15
+ def after_tests(assertions, output: self.output)
16
+ super
17
+ Polyrun::WorkerPing.ping!(location: "sus:after_tests")
18
+ end
19
+ end
20
+
21
+ module_function
22
+
23
+ # Runs {Data::ParallelProvisioning.run_suite_hooks!} (serial vs shard worker hooks).
24
+ def install_parallel_provisioning!
25
+ Polyrun::Data::ParallelProvisioning.run_suite_hooks!
26
+ end
27
+
28
+ # Start {Coverage::Collector} when Polyrun or Covered coverage env is on.
29
+ # Prefer this for shard fragment merge. If Covered::Sus is already included on +Sus::Config+,
30
+ # skip starting the collector so +Coverage.start+ is not contested in one process.
31
+ def install_coverage!(root: Dir.pwd, **kwargs)
32
+ require_relative "coverage/collector"
33
+ return unless Polyrun::Coverage::Collector.coverage_requested_for_quick?(root)
34
+
35
+ if defined?(::Covered::Sus) && defined?(::Sus::Config) && ::Sus::Config.ancestors.include?(::Covered::Sus)
36
+ Polyrun::Log.warn "polyrun sus_support: install_coverage! skipped (Covered::Sus already on Sus::Config; use one coverage collector per process)"
37
+ return
38
+ end
39
+
40
+ Polyrun::Coverage::Collector.start!(root: root, **kwargs)
41
+ end
42
+
43
+ # Ping at Sus +before_tests+ / +after_tests+ when +Sus::Config+ is defined.
44
+ def install_worker_ping!
45
+ require_relative "worker_ping"
46
+ unless defined?(::Sus::Config)
47
+ Polyrun::Log.warn "polyrun sus_support: install_worker_ping! skipped (load Sus before calling)"
48
+ return
49
+ end
50
+
51
+ ::Sus::Config.prepend(WorkerPingConfigHook)
52
+ Polyrun::WorkerPing.ensure_interval_ping_thread!
53
+ end
54
+ end
55
+ end
@@ -42,7 +42,7 @@ Do not combine Model A and Model B in one workflow without a documented reason (
42
42
 
43
43
  ## Spec quality (optional)
44
44
 
45
- - `POLYRUN_SPEC_QUALITY=1` and `Polyrun::RSpec.install_spec_quality!` in `spec_helper` (requires coverage enabled for line deltas).
45
+ - `POLYRUN_SPEC_QUALITY=1` and `Polyrun::RSpecSupport.install_spec_quality!` in `spec_helper` (requires coverage enabled for line deltas).
46
46
  - `config/polyrun_spec_quality.yml` — thresholds and CI gates (`polyrun init --profile spec-quality`).
47
47
  - Parallel: `run-shards --merge-spec-quality` → `coverage/polyrun-spec-quality.json` → `report-spec-quality`.
48
48
 
@@ -10,7 +10,7 @@ module Polyrun
10
10
  # Use after RSpec is loaded:
11
11
  # require "polyrun/timing/rspec_example_formatter"
12
12
  # RSpec.configure { |c| c.add_formatter Polyrun::Timing::RSpecExampleFormatter }
13
- # Or {Polyrun::RSpec.install_example_timing!} (+output_path:+ avoids touching +ENV+).
13
+ # Or {Polyrun::RSpecSupport.install_example_timing!} (+output_path:+ avoids touching +ENV+).
14
14
  #
15
15
  # Default output path: +ENV["POLYRUN_EXAMPLE_TIMING_OUT"]+ if set, else +polyrun_timing_examples.json+.
16
16
  class RSpecExampleFormatter
@@ -44,7 +44,7 @@ module Polyrun
44
44
  File.write(timing_output_path, JSON.pretty_generate(@times))
45
45
  end
46
46
 
47
- # Override in a subclass from {Polyrun::RSpec.install_example_timing!(output_path: ...)}.
47
+ # Override in a subclass from {Polyrun::RSpecSupport.install_example_timing!(output_path: ...)}.
48
48
  def timing_output_path
49
49
  ENV["POLYRUN_EXAMPLE_TIMING_OUT"] || "polyrun_timing_examples.json"
50
50
  end
@@ -1,3 +1,3 @@
1
1
  module Polyrun
2
- VERSION = "2.2.9"
2
+ VERSION = "3.0.0"
3
3
  end
@@ -7,11 +7,11 @@ module Polyrun
7
7
  #
8
8
  # Prefer framework installs (call from helpers *after* loading the runner):
9
9
  #
10
- # require "polyrun/rspec"
11
- # Polyrun::RSpec.install_worker_ping!
10
+ # require "polyrun/rspec_support"
11
+ # Polyrun::RSpecSupport.install_worker_ping!
12
12
  #
13
- # require "polyrun/minitest"
14
- # Polyrun::Minitest.install_worker_ping!
13
+ # require "polyrun/minitest_support"
14
+ # Polyrun::MinitestSupport.install_worker_ping!
15
15
  #
16
16
  # Polyrun Quick runs +ping!+ automatically when requiring the Quick stack.
17
17
  #
@@ -19,6 +19,10 @@ module Polyrun
19
19
  # {#ensure_interval_ping_thread!} once at worker startup if you rely on periodic pings without per-example {#ping!};
20
20
  # installers call this so the env toggle works out of the box.
21
21
  module WorkerPing
22
+ # Load-time constant: `||=` can create two mutexes.
23
+ INTERVAL_PING_MX = Mutex.new
24
+ private_constant :INTERVAL_PING_MX
25
+
22
26
  class << self
23
27
  def ping!(location: nil)
24
28
  path = ping_file_path
@@ -46,8 +50,7 @@ module Polyrun
46
50
  path = ping_file_path
47
51
  return if path.empty?
48
52
 
49
- @interval_ping_mx ||= Mutex.new
50
- @interval_ping_mx.synchronize do
53
+ INTERVAL_PING_MX.synchronize do
51
54
  return if @interval_ping_started
52
55
 
53
56
  raw = ENV["POLYRUN_WORKER_PING_INTERVAL_SEC"].to_s.strip
@@ -1,5 +1,5 @@
1
1
  module Polyrun
2
- module Minitest
2
+ module MinitestSupport
3
3
  def self.install_parallel_provisioning!: () -> void
4
4
 
5
5
  def self.install_worker_ping!: () -> void
@@ -1,5 +1,5 @@
1
1
  module Polyrun
2
- module RSpec
2
+ module RSpecSupport
3
3
  def self.install_parallel_provisioning!: (untyped rspec_config) -> void
4
4
 
5
5
  def self.install_example_timing!: (?output_path: String? ) -> void
@@ -0,0 +1,7 @@
1
+ module Polyrun
2
+ module SusSupport
3
+ def self.install_parallel_provisioning!: () -> void
4
+ def self.install_coverage!: (?root: String, **untyped) -> void
5
+ def self.install_worker_ping!: () -> void
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyrun
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.9
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Makarov
@@ -261,6 +261,7 @@ files:
261
261
  - lib/polyrun/config/suite.rb
262
262
  - lib/polyrun/coverage/cobertura_zero_lines.rb
263
263
  - lib/polyrun/coverage/collector.rb
264
+ - lib/polyrun/coverage/collector_blob.rb
264
265
  - lib/polyrun/coverage/collector_finish.rb
265
266
  - lib/polyrun/coverage/collector_fragment_meta.rb
266
267
  - lib/polyrun/coverage/config_resolve.rb
@@ -311,7 +312,7 @@ files:
311
312
  - lib/polyrun/hooks/worker_runner.rb
312
313
  - lib/polyrun/hooks/worker_shell.rb
313
314
  - lib/polyrun/log.rb
314
- - lib/polyrun/minitest.rb
315
+ - lib/polyrun/minitest_support.rb
315
316
  - lib/polyrun/partition/constraints.rb
316
317
  - lib/polyrun/partition/hrw.rb
317
318
  - lib/polyrun/partition/min_heap.rb
@@ -335,10 +336,12 @@ files:
335
336
  - lib/polyrun/queue/worker_loop.rb
336
337
  - lib/polyrun/quick.rb
337
338
  - lib/polyrun/quick/assertions.rb
339
+ - lib/polyrun/quick/config.rb
338
340
  - lib/polyrun/quick/errors.rb
339
341
  - lib/polyrun/quick/example_group.rb
340
342
  - lib/polyrun/quick/example_runner.rb
341
343
  - lib/polyrun/quick/matchers.rb
344
+ - lib/polyrun/quick/matchers_predicates.rb
342
345
  - lib/polyrun/quick/reporter.rb
343
346
  - lib/polyrun/quick/runner.rb
344
347
  - lib/polyrun/railtie.rb
@@ -348,11 +351,11 @@ files:
348
351
  - lib/polyrun/reporting/junit_report.rb
349
352
  - lib/polyrun/reporting/rspec_failure_fragment_formatter.rb
350
353
  - lib/polyrun/reporting/rspec_junit.rb
351
- - lib/polyrun/rspec.rb
352
- - lib/polyrun/rspec/active_record_timeout_recovery.rb
353
- - lib/polyrun/rspec/example_debug.rb
354
- - lib/polyrun/rspec/example_debug_instrumentation.rb
355
- - lib/polyrun/rspec/sharded_formatter_compat.rb
354
+ - lib/polyrun/rspec_support.rb
355
+ - lib/polyrun/rspec_support/active_record_timeout_recovery.rb
356
+ - lib/polyrun/rspec_support/example_debug.rb
357
+ - lib/polyrun/rspec_support/example_debug_instrumentation.rb
358
+ - lib/polyrun/rspec_support/sharded_formatter_compat.rb
356
359
  - lib/polyrun/spec_quality.rb
357
360
  - lib/polyrun/spec_quality/config.rb
358
361
  - lib/polyrun/spec_quality/fragment.rb
@@ -363,6 +366,7 @@ files:
363
366
  - lib/polyrun/spec_quality/report.rb
364
367
  - lib/polyrun/spec_quality/rspec_hook.rb
365
368
  - lib/polyrun/spec_quality/sql_counter.rb
369
+ - lib/polyrun/sus_support.rb
366
370
  - lib/polyrun/templates/POLYRUN.md
367
371
  - lib/polyrun/templates/ci_matrix.polyrun.yml
368
372
  - lib/polyrun/templates/minimal_gem.polyrun.yml
@@ -385,9 +389,10 @@ files:
385
389
  - sig/polyrun/config.rbs
386
390
  - sig/polyrun/debug.rbs
387
391
  - sig/polyrun/log.rbs
388
- - sig/polyrun/minitest.rbs
392
+ - sig/polyrun/minitest_support.rbs
389
393
  - sig/polyrun/quick.rbs
390
- - sig/polyrun/rspec.rbs
394
+ - sig/polyrun/rspec_support.rbs
395
+ - sig/polyrun/sus_support.rbs
391
396
  - sig/polyrun/worker_output.rbs
392
397
  - sig/polyrun/worker_ping.rbs
393
398
  homepage: https://github.com/amkisko/polyrun.rb