rspec-tracer 1.2.4 → 2.0.0.pre.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 +4 -4
- data/CHANGELOG.md +191 -164
- data/README.md +439 -429
- data/bin/rspec-tracer +15 -0
- data/lib/rspec_tracer/cache/Rakefile +43 -0
- data/lib/rspec_tracer/cli/cache_clear.rb +98 -0
- data/lib/rspec_tracer/cli/cache_info.rb +103 -0
- data/lib/rspec_tracer/cli/doctor.rb +275 -0
- data/lib/rspec_tracer/cli/explain.rb +148 -0
- data/lib/rspec_tracer/cli/report_open.rb +82 -0
- data/lib/rspec_tracer/cli.rb +116 -0
- data/lib/rspec_tracer/configuration.rb +1100 -3
- data/lib/rspec_tracer/engine.rb +1076 -0
- data/lib/rspec_tracer/example.rb +24 -113
- data/lib/rspec_tracer/filter.rb +35 -0
- data/lib/rspec_tracer/line_stub.rb +61 -0
- data/lib/rspec_tracer/load_config.rb +2 -2
- data/lib/rspec_tracer/logger.rb +15 -0
- data/lib/rspec_tracer/rails/README.md +78 -0
- data/lib/rspec_tracer/rails/i18n_tracking.rb +137 -0
- data/lib/rspec_tracer/rails/notifications.rb +263 -0
- data/lib/rspec_tracer/rails/preset.rb +94 -0
- data/lib/rspec_tracer/rails/railtie.rb +22 -0
- data/lib/rspec_tracer/rails.rb +15 -0
- data/lib/rspec_tracer/remote_cache/README.md +140 -0
- data/lib/rspec_tracer/remote_cache/Rakefile +35 -11
- data/lib/rspec_tracer/remote_cache/archive.rb +137 -0
- data/lib/rspec_tracer/remote_cache/backend.rb +73 -0
- data/lib/rspec_tracer/remote_cache/git_ancestry.rb +241 -0
- data/lib/rspec_tracer/remote_cache/local_fs_backend.rb +439 -0
- data/lib/rspec_tracer/remote_cache/redis_backend.rb +554 -0
- data/lib/rspec_tracer/remote_cache/s3_backend.rb +712 -0
- data/lib/rspec_tracer/remote_cache/user_tasks.rb +397 -0
- data/lib/rspec_tracer/remote_cache/validator.rb +40 -62
- data/lib/rspec_tracer/remote_cache.rb +22 -0
- data/lib/rspec_tracer/reporters/README.md +103 -0
- data/lib/rspec_tracer/reporters/base.rb +87 -0
- data/lib/rspec_tracer/reporters/coverage_json_reporter.rb +338 -0
- data/lib/rspec_tracer/reporters/html/.gitignore +19 -0
- data/lib/rspec_tracer/reporters/html/.prettierignore +4 -0
- data/lib/rspec_tracer/reporters/html/.prettierrc.json +9 -0
- data/lib/rspec_tracer/reporters/html/README.md +80 -0
- data/lib/rspec_tracer/reporters/html/dist/assets/index.css +2 -0
- data/lib/rspec_tracer/reporters/html/dist/assets/index.js +1 -0
- data/lib/rspec_tracer/reporters/html/dist/index.html +24 -0
- data/lib/rspec_tracer/reporters/html/eslint.config.js +62 -0
- data/lib/rspec_tracer/reporters/html/package-lock.json +4941 -0
- data/lib/rspec_tracer/reporters/html/package.json +29 -0
- data/lib/rspec_tracer/reporters/html/src/app.jsx +130 -0
- data/lib/rspec_tracer/reporters/html/src/components/AllExamples.jsx +86 -0
- data/lib/rspec_tracer/reporters/html/src/components/DuplicateExamples.jsx +68 -0
- data/lib/rspec_tracer/reporters/html/src/components/ExamplesDependency.jsx +78 -0
- data/lib/rspec_tracer/reporters/html/src/components/FilesDependency.jsx +72 -0
- data/lib/rspec_tracer/reporters/html/src/components/FlakyExamples.jsx +42 -0
- data/lib/rspec_tracer/reporters/html/src/components/ReportTable.jsx +131 -0
- data/lib/rspec_tracer/reporters/html/src/components/SearchBar.jsx +19 -0
- data/lib/rspec_tracer/reporters/html/src/index.html +23 -0
- data/lib/rspec_tracer/reporters/html/src/main.jsx +37 -0
- data/lib/rspec_tracer/reporters/html/src/styles.css +434 -0
- data/lib/rspec_tracer/reporters/html/vite.config.js +42 -0
- data/lib/rspec_tracer/reporters/html_reporter.rb +266 -0
- data/lib/rspec_tracer/reporters/json_reporter.rb +88 -0
- data/lib/rspec_tracer/reporters/payload_builder.rb +235 -0
- data/lib/rspec_tracer/reporters/registry.rb +120 -0
- data/lib/rspec_tracer/reporters/terminal_reporter.rb +264 -0
- data/lib/rspec_tracer/rspec/README.md +73 -0
- data/lib/rspec_tracer/rspec/installation.rb +97 -0
- data/lib/rspec_tracer/rspec/metadata.rb +96 -0
- data/lib/rspec_tracer/rspec/parallel_tests.rb +459 -0
- data/lib/rspec_tracer/rspec/reporter_hook.rb +84 -0
- data/lib/rspec_tracer/rspec/runner_hook.rb +178 -0
- data/lib/rspec_tracer/source_file.rb +24 -7
- data/lib/rspec_tracer/storage/README.md +35 -0
- data/lib/rspec_tracer/storage/backend.rb +68 -0
- data/lib/rspec_tracer/storage/json_backend.rb +866 -0
- data/lib/rspec_tracer/storage/lazy_snapshot.rb +65 -0
- data/lib/rspec_tracer/storage/schema.rb +43 -0
- data/lib/rspec_tracer/storage/serializer/json.rb +41 -0
- data/lib/rspec_tracer/storage/serializer/msgpack.rb +90 -0
- data/lib/rspec_tracer/storage/snapshot.rb +127 -0
- data/lib/rspec_tracer/storage/sqlite_backend.rb +686 -0
- data/lib/rspec_tracer/time_formatter.rb +37 -18
- data/lib/rspec_tracer/tracker/README.md +36 -0
- data/lib/rspec_tracer/tracker/coverage_adapter.rb +174 -0
- data/lib/rspec_tracer/tracker/declared_globs.rb +100 -0
- data/lib/rspec_tracer/tracker/dependency_graph.rb +134 -0
- data/lib/rspec_tracer/tracker/env_matcher.rb +127 -0
- data/lib/rspec_tracer/tracker/env_snapshot.rb +77 -0
- data/lib/rspec_tracer/tracker/example_registry.rb +153 -0
- data/lib/rspec_tracer/tracker/file_digest.rb +61 -0
- data/lib/rspec_tracer/tracker/filter.rb +127 -0
- data/lib/rspec_tracer/tracker/input.rb +99 -0
- data/lib/rspec_tracer/tracker/io_hooks/file.rb +55 -0
- data/lib/rspec_tracer/tracker/io_hooks/io.rb +24 -0
- data/lib/rspec_tracer/tracker/io_hooks/json.rb +23 -0
- data/lib/rspec_tracer/tracker/io_hooks/kernel.rb +26 -0
- data/lib/rspec_tracer/tracker/io_hooks/yaml.rb +38 -0
- data/lib/rspec_tracer/tracker/io_hooks.rb +195 -0
- data/lib/rspec_tracer/tracker/loaded_files_tracker.rb +295 -0
- data/lib/rspec_tracer/tracker/new_file_detector.rb +62 -0
- data/lib/rspec_tracer/tracker/whole_suite_invalidators.rb +96 -0
- data/lib/rspec_tracer/version.rb +4 -1
- data/lib/rspec_tracer.rb +223 -493
- metadata +93 -44
- data/lib/rspec_tracer/cache.rb +0 -207
- data/lib/rspec_tracer/coverage_merger.rb +0 -42
- data/lib/rspec_tracer/coverage_reporter.rb +0 -187
- data/lib/rspec_tracer/coverage_writer.rb +0 -58
- data/lib/rspec_tracer/html_reporter/Rakefile +0 -18
- data/lib/rspec_tracer/html_reporter/assets/javascripts/application.js +0 -56
- data/lib/rspec_tracer/html_reporter/assets/javascripts/libraries/jquery.js +0 -10881
- data/lib/rspec_tracer/html_reporter/assets/javascripts/plugins/datatables.js +0 -15381
- data/lib/rspec_tracer/html_reporter/assets/stylesheets/application.css +0 -196
- data/lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/datatables.css +0 -459
- data/lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/jquery-ui.css +0 -436
- data/lib/rspec_tracer/html_reporter/assets/stylesheets/print.css +0 -92
- data/lib/rspec_tracer/html_reporter/assets/stylesheets/reset.css +0 -265
- data/lib/rspec_tracer/html_reporter/public/application.css +0 -5
- data/lib/rspec_tracer/html_reporter/public/application.js +0 -6
- data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc_disabled.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_both.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc_disabled.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/favicon.png +0 -0
- data/lib/rspec_tracer/html_reporter/public/loading.gif +0 -0
- data/lib/rspec_tracer/html_reporter/reporter.rb +0 -242
- data/lib/rspec_tracer/html_reporter/views/duplicate_examples.erb +0 -34
- data/lib/rspec_tracer/html_reporter/views/examples.erb +0 -58
- data/lib/rspec_tracer/html_reporter/views/examples_dependency.erb +0 -36
- data/lib/rspec_tracer/html_reporter/views/files_dependency.erb +0 -36
- data/lib/rspec_tracer/html_reporter/views/flaky_examples.erb +0 -38
- data/lib/rspec_tracer/html_reporter/views/layout.erb +0 -38
- data/lib/rspec_tracer/remote_cache/aws.rb +0 -176
- data/lib/rspec_tracer/remote_cache/cache.rb +0 -77
- data/lib/rspec_tracer/remote_cache/repo.rb +0 -210
- data/lib/rspec_tracer/report_generator.rb +0 -158
- data/lib/rspec_tracer/report_merger.rb +0 -68
- data/lib/rspec_tracer/report_writer.rb +0 -141
- data/lib/rspec_tracer/reporter.rb +0 -204
- data/lib/rspec_tracer/rspec_reporter.rb +0 -41
- data/lib/rspec_tracer/rspec_runner.rb +0 -56
- data/lib/rspec_tracer/ruby_coverage.rb +0 -9
- data/lib/rspec_tracer/runner.rb +0 -278
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 04d2e3c76b8351f5f71f93cd722af23975f80da067f19970471455b3b2ed16aa
|
|
4
|
+
data.tar.gz: 0ab86f0d744275db42ed0d355d5781d25a6f65ed49a76fcd70d3df1acd7e01b4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e802e4c67a41d1d1ebd16df2fd4ee874f0993678097563f38b5bd3e443024662040547df140dd45196c0e81e7d510ecfe79dbf4a3e01ab1a4685f380f9ec829f
|
|
7
|
+
data.tar.gz: 72435a0282503ff2c90b6b80168fb810bd48412bc162043b4d70780b35f74478fc5236c43710bb9e948657b2c6c17734a59406fc617cb712eaba7e1a3c2e4dfb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,181 +1,208 @@
|
|
|
1
|
-
## [
|
|
1
|
+
## [2.0.0.pre.1] - 2026-05-06
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
generated class name, which carries a load-order-dependent `_2` /
|
|
9
|
-
`_3` suffix when two spec files share a `describe` name) and the
|
|
10
|
-
example's `line_number`. The same example got a different id
|
|
11
|
-
depending on rspec's file load order — silently thrashing the
|
|
12
|
-
cache and breaking the always-re-run guarantees for failed,
|
|
13
|
-
pending, and flaky examples. A no-op blank-line edit above the
|
|
14
|
-
example flipped the id with the same effect.
|
|
15
|
-
|
|
16
|
-
The digest now uses a stable subset: the describe block's
|
|
17
|
-
*description* string (the user-supplied text, not RSpec's
|
|
18
|
-
generated class name), the example's `description`,
|
|
19
|
-
`full_description`, `shared_group` inclusion locations with the
|
|
20
|
-
trailing `:LINE` stripped, and `file_name`. `line_number` /
|
|
21
|
-
`rerun_file_name` / `rerun_line_number` still ride along in the
|
|
22
|
-
returned Hash for the HTML and JSON reporters' location columns,
|
|
23
|
-
but no longer enter the digest. Contract: **rename = new identity;
|
|
24
|
-
restructure = same identity.**
|
|
25
|
-
|
|
26
|
-
Unnamed examples (`it { }`, `specify { }`, `example { }`) needed
|
|
27
|
-
an extra step. RSpec's pre-run `description` for an unnamed
|
|
28
|
-
example is the line-bearing `"example at <path>:<line>"`
|
|
29
|
-
fallback, which would have re-leaked the line number straight
|
|
30
|
-
into the digest. The digest substitutes a line-independent
|
|
31
|
-
positional discriminator: the example's ordinal among the
|
|
32
|
-
*unnamed* examples of its group. Stability is preserved across
|
|
33
|
-
blank-line edits and across adding or renaming *named* siblings;
|
|
34
|
-
reordering the unnamed examples re-keys them (the documented
|
|
35
|
-
trade-off — give the example an explicit description for a fully
|
|
36
|
-
reorder-stable id).
|
|
37
|
-
|
|
38
|
-
**Upgrade note**: the cache file format is unchanged, so a v1.2.3
|
|
39
|
-
cache loads cleanly through v1.2.4 code. But every cached
|
|
40
|
-
`example_id` was computed against the old payload and the new
|
|
41
|
-
lookups will not match them, so the first run after upgrade
|
|
42
|
-
treats every example as `:no_cache` and re-runs the full suite.
|
|
43
|
-
Warm caches resume from the second run onward.
|
|
44
|
-
|
|
45
|
-
Surfaced by 2.0.0.pre.1 field testing against third-party Rails
|
|
46
|
-
apps. Fixed upstream in
|
|
47
|
-
[#209](https://github.com/avmnu-sng/rspec-tracer/pull/209) and
|
|
48
|
-
[#211](https://github.com/avmnu-sng/rspec-tracer/pull/211).
|
|
49
|
-
|
|
50
|
-
- **`RSpecTracer.start` crashed when the user pre-started
|
|
51
|
-
`::Coverage`.** Users opting into branch coverage typically call
|
|
52
|
-
`Coverage.start(lines: true, branches: true)` before loading
|
|
53
|
-
rspec-tracer. The tracer's `setup_coverage` then called bare
|
|
54
|
-
`::Coverage.start` with no `running?` guard, raising
|
|
55
|
-
`RuntimeError: coverage measurement is already setup` and taking
|
|
56
|
-
the tracer down at boot.
|
|
57
|
-
|
|
58
|
-
Add a `Coverage.running?` predicate guard before the start call,
|
|
59
|
-
plus a defensive `RuntimeError` rescue with a `logger.warn` for
|
|
60
|
-
the case where the predicate returns false but `start` still
|
|
61
|
-
raises. Graceful degradation: coverage measurement is skipped
|
|
62
|
-
with a visible warn, the rest of the tracer pipeline continues.
|
|
63
|
-
|
|
64
|
-
Partial port of upstream
|
|
65
|
-
[#207](https://github.com/avmnu-sng/rspec-tracer/pull/207); the
|
|
66
|
-
`coverage_modes` config DSL half is 2.0-only.
|
|
67
|
-
|
|
68
|
-
- **`remote_cache` success paths were silent at default log level.**
|
|
69
|
-
`RemoteCache::Cache#download` and `#upload` returned without
|
|
70
|
-
emitting anything after the underlying AWS calls succeeded, so a
|
|
71
|
-
successful `rake rspec_tracer:remote_cache:download` produced
|
|
72
|
-
zero output. Users couldn't tell from CI logs whether the cache
|
|
73
|
-
was actually restored or whether the run was cold.
|
|
74
|
-
|
|
75
|
-
Emit a single `RSpecTracer.logger.info` line on each operation's
|
|
76
|
-
success path: `"rspec-tracer remote_cache: restored cache from
|
|
77
|
-
<sha>"` on download, `"rspec-tracer remote_cache: uploaded cache
|
|
78
|
-
to <ref>"` on upload.
|
|
79
|
-
|
|
80
|
-
Partial port of upstream
|
|
81
|
-
[#201](https://github.com/avmnu-sng/rspec-tracer/pull/201); the
|
|
82
|
-
cross-branch-fallback qualifier is specific to 2.0's multi-tier
|
|
83
|
-
cache model and not applicable here.
|
|
84
|
-
|
|
85
|
-
### Changed
|
|
3
|
+
The first pre-release of the 2.0 line. Architecture rewrite around
|
|
4
|
+
the input-taxonomy mental model documented in
|
|
5
|
+
[`ARCHITECTURE.md`](ARCHITECTURE.md): every test is a pure function
|
|
6
|
+
of its inputs; tracking is input identification; cache invalidation
|
|
7
|
+
is input-digest mismatch.
|
|
86
8
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
9
|
+
The 1.x cache is not readable by 2.0 — first run on the new version
|
|
10
|
+
is cold, then warm caches resume. Existing CI integration (`rake
|
|
11
|
+
rspec_tracer:remote_cache:download` / `:upload`, the env vars,
|
|
12
|
+
the `rspec_tracer_cache/` / `rspec_tracer_coverage/` /
|
|
13
|
+
`rspec_tracer_report/` directory contracts) is preserved bit-for-bit.
|
|
91
14
|
|
|
92
|
-
|
|
93
|
-
to the strict `'v[0-9]+.[0-9]+.[0-9]+'` form** (1.x is
|
|
94
|
-
final-release only). The previous loose `'v*.*.*'` form would
|
|
95
|
-
have matched 4-segment shapes like `v2.0.0.rc.1` accidentally
|
|
96
|
-
because `*` greedy-matches dots; the strict per-segment digit
|
|
97
|
-
class rejects any non-digit. Documentation block above the
|
|
98
|
-
pattern explains the GHA filter-pattern flavor for future
|
|
99
|
-
maintainers. Workflow-only; no user-visible change.
|
|
15
|
+
### Added
|
|
100
16
|
|
|
101
|
-
|
|
17
|
+
- **Pluggable storage backends.** `storage_backend :json` (default,
|
|
18
|
+
preserves 1.x JSON layout) or `storage_backend :sqlite` (single-
|
|
19
|
+
file SQLite database; MRI only — JRuby falls back to `:json` with
|
|
20
|
+
a one-time warn). The 10-file per-run JSON layout (`last_run.json`
|
|
21
|
+
+ `<run_id>/{all_examples,duplicate_examples,interrupted_examples,
|
|
22
|
+
flaky_examples,failed_examples,pending_examples,skipped_examples,
|
|
23
|
+
all_files,dependency,examples_coverage}.json`) is unchanged.
|
|
24
|
+
- **Pluggable remote-cache backends.** `remote_cache_backend :s3`
|
|
25
|
+
(preserves the 1.x S3 layout including `awslocal` / LocalStack
|
|
26
|
+
support), `:local_fs` (filesystem-backed; no S3 needed), or
|
|
27
|
+
`:redis` (with optional per-key TTL + `<prefix>:pr_branches`
|
|
28
|
+
sidecar SADD on PR-tier uploads for ops dashboards).
|
|
29
|
+
- **Per-example `tracks:` DSL.** Annotate any describe / context /
|
|
30
|
+
example with `tracks: { files: 'app/policies/**/*.rb', env:
|
|
31
|
+
'ROLE_CONFIG' }` to declare extra inputs the tracker can't auto-
|
|
32
|
+
observe — config files baked at boot, env-var branches, and
|
|
33
|
+
similar. `:files` accepts a string glob or array; `:env` accepts a
|
|
34
|
+
literal name, array, or single-wildcard pattern (`'RAILS_*'`,
|
|
35
|
+
`'*_TOKEN'`, `'*'`). Cascade unions parent + child without
|
|
36
|
+
clobbering.
|
|
37
|
+
- **`track_env(*names)` config-level DSL** for env vars every test
|
|
38
|
+
depends on (`AUTH_TOKEN`, `DATABASE_URL`, `RAILS_ENV`). Same
|
|
39
|
+
wildcard syntax as the per-example `tracks: { env: ... }`.
|
|
40
|
+
Persists as `env_snapshot.json` (concrete keys only, no pattern
|
|
41
|
+
leakage).
|
|
42
|
+
- **`track_files(*globs)` config-level DSL** for files every test
|
|
43
|
+
depends on (`Gemfile.lock`, schema, locale catalogs).
|
|
44
|
+
- **Rails preset** via `track_rails_defaults` — auto-attaches the
|
|
45
|
+
common Rails-side declared globs (views, locales, fixtures,
|
|
46
|
+
factories, helpers, config). `track_rails_defaults except:
|
|
47
|
+
[:views, :schema]` opts specific globs out so framework-event
|
|
48
|
+
subscribers (`render_template.action_view` for views; the opt-in
|
|
49
|
+
`sql.active_record` observer enabled by
|
|
50
|
+
`track_ar_schema_notifications` for `db/schema.rb`) attribute
|
|
51
|
+
them per-example instead.
|
|
52
|
+
- **Auto-detection of Rails** at start time; the engine attaches
|
|
53
|
+
`ActionView` template + `ActiveRecord` schema (when opted in)
|
|
54
|
+
notification observers automatically when `::Rails::VERSION` is
|
|
55
|
+
defined.
|
|
56
|
+
- **`bin/rspec-tracer` CLI** with five sub-commands:
|
|
57
|
+
`doctor` (config + environment diagnosis, schema-version + remote-
|
|
58
|
+
cache reachability + AR-schema-narrow checks), `cache:info`
|
|
59
|
+
(size, last run, invalidation stats), `cache:clear` (rm cache
|
|
60
|
+
dirs), `report:open` (open the HTML report in the default
|
|
61
|
+
browser), `explain <example_id>` (show why a given example is
|
|
62
|
+
scheduled to run or skip). The CLI is opt-in for local-dev
|
|
63
|
+
convenience; the `rake rspec_tracer:remote_cache:*` tasks remain
|
|
64
|
+
first-class for CI integration.
|
|
65
|
+
- **Boot-time warns** for two common user-trust traps:
|
|
66
|
+
- SimpleCov loaded but not started before `RSpecTracer.start`
|
|
67
|
+
(load-order is part of the documented contract; the warn
|
|
68
|
+
surfaces it instead of silently bolting onto a Coverage already
|
|
69
|
+
in flight).
|
|
70
|
+
- `track_ar_schema_notifications` enabled with
|
|
71
|
+
`use_transactional_fixtures` defaulting to true (per-example
|
|
72
|
+
BEGIN/COMMIT fires `sql.active_record` and attributes
|
|
73
|
+
`db/schema.rb` to every AR-touching example; the warn points
|
|
74
|
+
at the README "Narrow AR-schema attribution" guidance).
|
|
75
|
+
- **`.rspec-tracer` DSL typo `did you mean?` suggestions** at config
|
|
76
|
+
load — typos like `track_filez` raise `InvalidUsageError` with a
|
|
77
|
+
pointer at `track_files`.
|
|
78
|
+
- **Rails 8.0 CI-gated support** (Ruby 3.2+ required; Rails 8.0
|
|
79
|
+
dropped Ruby 3.1 support upstream). `jruby-9.4 × Rails 8.0` is
|
|
80
|
+
unsupported (no `activerecord-jdbcsqlite3-adapter ~> 80.0`
|
|
81
|
+
upstream).
|
|
82
|
+
- **Schema-version field** in `last_run.json` for explicit
|
|
83
|
+
cross-version cache validation. Cache-shape changes bump the
|
|
84
|
+
field; mismatched caches refuse-to-load with an info-level "cold
|
|
85
|
+
run" log line.
|
|
86
|
+
- **`docs/CI_RECIPES.md`** translating the
|
|
87
|
+
[`.github/workflows/example-tracer-cache.yml`](.github/workflows/example-tracer-cache.yml)
|
|
88
|
+
GitHub Actions cache pattern to CircleCI / GitLab CI / Buildkite
|
|
89
|
+
/ Heroku CI. The 4-component cache key (`runner.os` +
|
|
90
|
+
`.ruby-version` + `lib/rspec_tracer/version.rb` + Gemfile-hash)
|
|
91
|
+
translates 1:1 across providers; only the YAML envelope is
|
|
92
|
+
GHA-specific.
|
|
93
|
+
- **Coexistence smokes** for `rspec-retry`, `rspec-rerun`, and
|
|
94
|
+
`knapsack`. All three compose with rspec-tracer's `Module#prepend`
|
|
95
|
+
chain on `RSpec::Core::Runner` / `Reporter` without override.
|
|
96
|
+
- **`bin/rspec-tracer doctor` reachability checks** for the
|
|
97
|
+
configured remote-cache backend (S3 / Local-FS / Redis) — surfaces
|
|
98
|
+
misconfigured credentials / missing buckets / unreachable Redis
|
|
99
|
+
hosts at first invocation instead of mid-CI-run.
|
|
100
|
+
- **HTML reporter** (committed build output, no `assets:precompile`
|
|
101
|
+
step on user installs) and **JSON reporter** (machine-readable,
|
|
102
|
+
for CI dashboards) alongside the existing terminal output. The
|
|
103
|
+
terminal line now includes a `by reason:` breakdown
|
|
104
|
+
(`12 Files changed · 3 Whole-suite invalidator changed · ...`)
|
|
105
|
+
and a cache size + delta suffix (`14.4 MiB; +6.7 KiB vs prev
|
|
106
|
+
run`).
|
|
102
107
|
|
|
103
|
-
###
|
|
108
|
+
### Changed
|
|
104
109
|
|
|
105
|
-
- **
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
the
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
## [1.2.2] - 2026-05-04
|
|
110
|
+
- **Ruby ≥ 3.1** is the floor (1.x supported Ruby 2.5+). 3.2, 3.3,
|
|
111
|
+
3.4, 4.0 + JRuby 9.4 are CI-gated. Rails 7.0 / 7.1 / 7.2 / 8.0 +
|
|
112
|
+
RSpec 3.12 / 3.13 are CI-gated.
|
|
113
|
+
- **SimpleCov branch coverage now works alongside rspec-tracer.**
|
|
114
|
+
The 1.x caveat ("SimpleCov would not report branch coverage
|
|
115
|
+
results even when enabled") is **no longer applicable** — the
|
|
116
|
+
coverage-stack rewrite decoupled rspec-tracer's line-only
|
|
117
|
+
emission from SimpleCov's branch-tracking. Users who turned
|
|
118
|
+
`enable_coverage :branch` off when adopting rspec-tracer 1.x can
|
|
119
|
+
re-enable in 2.0.
|
|
120
|
+
- **Cache schema bump.** First run on 2.0 is cold; subsequent runs
|
|
121
|
+
return to warm.
|
|
122
|
+
- **Coverage adapter** consolidated: a single
|
|
123
|
+
`Reporters::CoverageJsonReporter` owns `coverage.json` emission
|
|
124
|
+
(replacing the 1.x `CoverageReporter` + `CoverageWriter` pair).
|
|
125
|
+
Output shape preserved.
|
|
126
|
+
- **Parallel-tests reporter behavior:** terminal / JSON / HTML
|
|
127
|
+
reports now emit ONCE at the merged top-level location after
|
|
128
|
+
`merge_snapshot!` runs, instead of per-worker (where
|
|
129
|
+
`purge_worker_dirs!` then removed them and left users with no
|
|
130
|
+
usable output). Per-worker emission was a pre-2.0 behavior bug.
|
|
127
131
|
|
|
128
132
|
### Fixed
|
|
129
133
|
|
|
134
|
+
- **ERB template tracking via `render_template.action_view`** (closes
|
|
135
|
+
the issue behind upstream
|
|
136
|
+
[#66](https://github.com/avmnu-sng/rspec-tracer/issues/66)). The
|
|
137
|
+
Rails subscriber attributes rendered ERB partials to the example
|
|
138
|
+
that triggered the render.
|
|
139
|
+
- **Phantom `metadata[:file_path]` graceful skip** (closes the issue
|
|
140
|
+
behind upstream
|
|
141
|
+
[#72](https://github.com/avmnu-sng/rspec-tracer/issues/72)). Specs
|
|
142
|
+
whose `metadata[:file_path]` doesn't resolve to a readable file
|
|
143
|
+
(gem-generated examples, deleted-between-runs files) now log
|
|
144
|
+
debug + skip dependency registration instead of raising.
|
|
130
145
|
- **Default filter list now excludes rspec-tracer's own output
|
|
131
|
-
directories**
|
|
132
|
-
`rspec_tracer_report/`,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
effect only for fresh attributions on cold runs; previously-cached
|
|
147
|
-
paths matching the new filter persisted in `all_files` and
|
|
148
|
-
`dependency` until the next cold run. Filter additions now take
|
|
146
|
+
directories** — `rspec_tracer_cache/`, `rspec_tracer_coverage/`,
|
|
147
|
+
`rspec_tracer_report/`, `rspec_tracer.lock`. Previously, tests
|
|
148
|
+
that read the tracer's own cache files (e.g. integration specs
|
|
149
|
+
asserting on cache state after a fixture subprocess run) got
|
|
150
|
+
those paths attributed as deps. The tracer's output is
|
|
151
|
+
regenerated every run by design and should never invalidate a
|
|
152
|
+
test. Both `add_filter` (dep graph) and `add_coverage_filter`
|
|
153
|
+
(coverage report) lists were updated.
|
|
154
|
+
- **`add_filter` / `add_coverage_filter` now apply uniformly to
|
|
155
|
+
both fresh attributions AND prior-snapshot carry-forward.**
|
|
156
|
+
Previously, `Engine#seed_all_files_from_previous` and
|
|
157
|
+
`Engine#seed_graph_from_previous` seeded paths from the previous
|
|
158
|
+
run's snapshot WITHOUT re-applying the current filter list — so
|
|
159
|
+
a filter added between runs would NOT exclude already-cached
|
|
160
|
+
paths until a cold run wiped them. Filter additions now take
|
|
149
161
|
effect on the very next warm run.
|
|
150
162
|
|
|
151
|
-
|
|
163
|
+
### Deprecated
|
|
152
164
|
|
|
153
|
-
|
|
165
|
+
The 1.x configuration surface keeps working; each deprecated entry
|
|
166
|
+
fires one `logger.warn` at first use pointing at the replacement.
|
|
167
|
+
The deprecated values still resolve semantically. All four are slated
|
|
168
|
+
for removal in 3.0.
|
|
169
|
+
|
|
170
|
+
- **`reports_s3_path(uri)`** → use **`remote_cache_uri(uri)`**.
|
|
171
|
+
- **`use_local_aws(bool)`** → use **`remote_cache_backend :s3,
|
|
172
|
+
local: true`**.
|
|
173
|
+
- **`RSPEC_TRACER_REPORTS_S3_PATH`** → use
|
|
174
|
+
**`RSPEC_TRACER_REMOTE_CACHE_URI`**.
|
|
175
|
+
- **`RSPEC_TRACER_USE_LOCAL_AWS`** → fold into
|
|
176
|
+
`remote_cache_backend` params.
|
|
177
|
+
|
|
178
|
+
### Removed
|
|
154
179
|
|
|
155
|
-
- **
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
`
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
`
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
180
|
+
- **Cucumber feature-file integration suite.** Contributor-facing
|
|
181
|
+
only; users see no change. Replaced by RSpec subprocess
|
|
182
|
+
integration specs under `spec/integration/`. The `bundle exec
|
|
183
|
+
rake` legacy entry point is removed; `task` (Taskfile) is the
|
|
184
|
+
canonical dev loop.
|
|
185
|
+
- **Ruby ≤ 3.0 and Rails ≤ 6.x support** (already dropped in 1.1.0;
|
|
186
|
+
re-stated here for clarity at the major boundary).
|
|
187
|
+
- **Windows support** (no CI gate; never actively maintained).
|
|
188
|
+
|
|
189
|
+
### Deferred to 2.1
|
|
190
|
+
|
|
191
|
+
- **Per-example dependency attribution under Rails
|
|
192
|
+
`config.eager_load = true`.** When `eager_load = true` (Rails
|
|
193
|
+
default for CI tests to mirror prod), all `app/` files load at
|
|
194
|
+
boot and land in the boot-set; the whole-suite invalidator fires
|
|
195
|
+
on any `app/` edit, re-running every example. This is SAFE (never
|
|
196
|
+
misses a dep) but coarser than per-example attribution. The 2.1
|
|
197
|
+
enhancement will install a class-attribution mechanism (working
|
|
198
|
+
name: `track_class_attribution`) using `TracePoint(:class)` at
|
|
199
|
+
boot + `TracePoint(:call)` per example to trim the invalidator
|
|
200
|
+
scope to only examples that touched the changed file's class /
|
|
201
|
+
method surface. Opt-in by default; designed from scratch on the
|
|
202
|
+
user-shape problem (not a resurrection of any 1.x DSL name).
|
|
203
|
+
Today's escape hatches: set `config.eager_load = false` in test
|
|
204
|
+
env for full per-example precision, or use `tracks: { files:
|
|
205
|
+
'...' }` for per-example narrowing on specific groups.
|
|
179
206
|
|
|
180
207
|
## [1.2.0] - 2026-04-24
|
|
181
208
|
|