evilution 0.30.0 → 0.30.1

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: 34bc612e6537f856f98a6b1911989ddb89d5211bca426ebd1a08f8dddfe4eade
4
- data.tar.gz: c6875ae71bb4092184df2c7a05f3efccca97a9db57c91c85e09f6bbf20c3c8d9
3
+ metadata.gz: df5ef86d0b451e9629f95ab8115ebfbf4cab99b6a16dfd543582e51fab368158
4
+ data.tar.gz: 924099a4fec1e9b1af0d84d5daf67b26883476112ea4346556086882e198d2fc
5
5
  SHA512:
6
- metadata.gz: 46d8c283c0fef3758c0369533a00a8db31337b263119d182133ad5d86d2dab7c2d60d2baa3ffcc53f87d7e605a84c880be2f9f9692a1bdef63642b670a50cb57
7
- data.tar.gz: 7f492bfbff46d333d68e271b63b1ac10f1b9adf97a9d38a20f1255b77f3ada298ae92bad102a8835797432450130b179009129ce826a622a33b5346f9bfac58b
6
+ metadata.gz: 987dfe13f4d495e220fd90fb207ee17fbede833d97cf1f62b109601c2009fa3e68dd68f8b56e8f457ed68139af6f5743902e1562dcd9b73335945d11155b83ea
7
+ data.tar.gz: 154501f04dd8c867506ebb479934af83909e2568a175f7cbf5d2d5c59f68d50143da062bae16599c71e97edb3f43bc0158d31af2ca01febe2fc32d7634203f23
@@ -364,3 +364,9 @@
364
364
  {"id":"int-78870411","kind":"field_change","created_at":"2026-05-14T07:28:17.94685909Z","actor":"Denis Kiselev","issue_id":"EV-05tp","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"PR merged: explicit_super_mutation extends byte range structurally (block start / rparen / args end). Short-circuit spec switched to synthetic in-test operator."}}
365
365
  {"id":"int-36e5c972","kind":"field_change","created_at":"2026-05-14T08:23:06.045690955Z","actor":"Denis Kiselev","issue_id":"EV-b0ee","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"PR merged: GemDetector multi-gemspec disambiguation via exact-entry, lib-subdir, then shortest-name fallback."}}
366
366
  {"id":"int-00368bf4","kind":"field_change","created_at":"2026-05-14T09:07:21.14041556Z","actor":"Denis Kiselev","issue_id":"EV-blnq","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Not a hang — slow run with no progress feedback. Investigated 2026-05-14: 269 mutations / 202 killed / 42 survived / 25 timed_out / 0 errors / score 0.75 in 4min with -j 4 -t 10 on Shopify/liquid v5.12.0. Per-mutation Minitest test_helper re-bootstrap + 25 worker timeouts caused the perceived 10-min hang. Combined with --no-progress + non-TTY stderr (no parent output) the run looks silent until the JSON dump. Worker logs (--quiet-children --quiet-children-dir DIR) show steady progress. README updated with a 'Long Minitest fork runs — not a hang' section under §7 explaining the timing math + recommended -j/-t flags. No code change needed."}}
367
+ {"id":"int-00d1068f","kind":"field_change","created_at":"2026-05-15T04:10:03.085170043Z","actor":"Denis Kiselev","issue_id":"EV-lqpn","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
368
+ {"id":"int-0f978a1b","kind":"field_change","created_at":"2026-05-15T04:10:03.499346683Z","actor":"Denis Kiselev","issue_id":"EV-720r","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
369
+ {"id":"int-27d908cc","kind":"field_change","created_at":"2026-05-15T04:10:03.883249046Z","actor":"Denis Kiselev","issue_id":"EV-70hd","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
370
+ {"id":"int-5c439789","kind":"field_change","created_at":"2026-05-15T04:10:04.253005681Z","actor":"Denis Kiselev","issue_id":"EV-m47s","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
371
+ {"id":"int-9c968bc0","kind":"field_change","created_at":"2026-05-15T04:10:02.826901138Z","actor":"Denis Kiselev","issue_id":"EV-74e3","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
372
+ {"id":"int-4677d561","kind":"field_change","created_at":"2026-05-15T05:18:42.843114482Z","actor":"Denis Kiselev","issue_id":"EV-ju3o","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  Versioning policy: see [docs/versioning.md](docs/versioning.md).
4
4
 
5
+ ## [0.30.1] - 2026-05-15
6
+
7
+ ### Fixed
8
+
9
+ - **Minitest 5.11+ / 6.x reporter contract: `MinitestCrashDetector` now implements `prerecord(klass, name)`** — `Minitest::AbstractReporter` calls `prerecord` on every reporter immediately before each test runs; the crash detector implemented `start` / `report` / `record` / `passed?` but not `prerecord`, so on any project using Minitest ≥ 5.11 every mutation aborted with `undefined method 'prerecord' for an instance of Evilution::Integration::MinitestCrashDetector` and the run reported score 0.0 / all-errored regardless of actual test behavior. PR #1207 (EV-l6gx) addressed the `run_all_suites` vs `__run` dispatch gap but did not audit the reporter interface; this patch closes the remaining hole. Surfaced by the EV-5rtm redis-rb stability canary against Minitest 6.0.6 (EV-ju3o, PR #1243, GH #1240)
10
+ - **`Minitest.autorun` no longer installs an at-exit handler when invoked by evilution-loaded user helpers** — Minitest-based projects (redis-rb, mail, others) routinely have `test/helper.rb` do `require "minitest/autorun"`, which installs an `at_exit` block calling `Minitest.run(ARGV)`. Evilution loads those helpers during baseline and per-mutation execution, so the handler ran at evilution's own process exit, saw the original `ARGV` (still carrying `--integration`, `--spec`, `--preload`, ...), and Minitest's option parser printed a misleading "invalid option: --integration" usage banner after the mutation summary. `Evilution::Integration::Minitest.stub_autorun!` is now invoked right after `require "minitest"` in both the orchestrator's baseline path (`run_baseline_test_file`) and the per-instance `ensure_framework_loaded`; it redefines `Minitest.autorun` to a no-op (idempotently, keyed on the redefined method's `source_location`) so subsequent `require "minitest/autorun"` calls in user code never register the handler. Cosmetic-only fix: mutation scoring and exit code were already correct (EV-7u9c, PR #1244, GH #1241)
11
+
5
12
  ## [0.30.0] - 2026-05-15
6
13
 
7
14
  ### Added
@@ -16,11 +16,24 @@ class Evilution::Integration::Minitest < Evilution::Integration::Base
16
16
  def self.run_baseline_test_file(test_file)
17
17
  require "minitest"
18
18
  require "stringio"
19
+ stub_autorun!
19
20
  ::Minitest::Runnable.runnables.clear
20
21
  baseline_test_files(test_file).each { |f| load(File.expand_path(f)) }
21
22
  run_baseline_minitest
22
23
  end
23
24
 
25
+ # User helpers that `require "minitest/autorun"` install an at_exit handler
26
+ # calling `Minitest.run(ARGV)`. At evilution process exit ARGV still holds
27
+ # evilution flags (--integration, --spec, ...) and Minitest's option parser
28
+ # prints a misleading "invalid option" banner. Stubbing autorun before user
29
+ # code loads prevents the handler from ever being installed.
30
+ def self.stub_autorun!
31
+ location = ::Minitest.singleton_class.instance_method(:autorun).source_location
32
+ return if location && location.first == __FILE__
33
+
34
+ ::Minitest.define_singleton_method(:autorun) { nil }
35
+ end
36
+
24
37
  def self.baseline_test_files(test_file)
25
38
  File.directory?(test_file) ? Dir.glob(File.join(test_file, "**/*_test.rb")) : [test_file]
26
39
  end
@@ -96,6 +109,7 @@ class Evilution::Integration::Minitest < Evilution::Integration::Base
96
109
 
97
110
  fire_hook(:setup_integration_pre, integration: :minitest)
98
111
  require "minitest"
112
+ self.class.stub_autorun!
99
113
  @minitest_loaded = true
100
114
  fire_hook(:setup_integration_post, integration: :minitest)
101
115
  rescue LoadError => e
@@ -11,6 +11,10 @@ class Evilution::Integration::MinitestCrashDetector
11
11
  # Required by Minitest reporter interface
12
12
  end
13
13
 
14
+ def prerecord(_klass, _name)
15
+ # Required by Minitest::AbstractReporter (5.11+/6.x) before each test
16
+ end
17
+
14
18
  def report
15
19
  # Required by Minitest reporter interface
16
20
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Evilution
4
- VERSION = "0.30.0"
4
+ VERSION = "0.30.1"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evilution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.0
4
+ version: 0.30.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Kiselev