Skip to content

docs: the legacy API is removed in 2.1, not 3.0 - #247

Merged
pftg merged 1 commit into
masterfrom
docs/removal-version-2-1
Aug 23, 2026
Merged

docs: the legacy API is removed in 2.1, not 3.0#247
pftg merged 1 commit into
masterfrom
docs/removal-version-2-1

Conversation

@pftg

@pftg pftg commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

2.0 is the transitional release (old and new APIs, with warnings); 2.1 deletes the legacy namespace trees. Several places still said 3.0 — including the runtime migration notice, which ships to users in 2.0.

Changed:

  • lib/snap_diff/deprecation.rb — the notice now reads "It still works in 2.0 and is REMOVED in 2.1"
  • test/legacy/snap_diff_deprecation_test.rb — the pin was assert_includes out, "REMOVED in 3.0"; it now asserts the whole clause "still works in 2.0 and is REMOVED in 2.1", so a wrong window fails it too, not just a wrong removal version
  • test/unit/core_tree_has_no_legacy_deps_test.rbDELETED_IN_3_0DELETED_WITH_LEGACY_TREES (durable phrasing; the version number added nothing)
  • test/unit/deletion_3_0_test.rbtest/unit/legacy_deletion_test.rb, Deletion30TestLegacyDeletionTest
  • docs/UPGRADING.md and ~15 test comments

Supersedes #241, which could not be rebased cleanly: #246 had since landed 2.1 language in drivers.md/configuration.md, so that branch conflicted with work that overtook it. Its two substantive ideas are carried over here — the whole-clause assertion and the durable naming.

standardrb 151 files clean · rake test:unit 585/0 · rake test:canonical 482/0/1.

🤖 Generated with Claude Code

Summary by Sourcery

Align legacy API migration documentation, runtime notices, and deletion coverage with its removal in 2.1 after the transitional 2.0 release.

Bug Fixes:

  • Correct the documented and runtime legacy API removal timeline from 3.0 to 2.1, including the transitional 2.0 support window.

Enhancements:

  • Use durable legacy-surface terminology for deletion checks and rename the deletion test to reflect the compatibility-tree removal rather than a specific version.

Documentation:

  • Update upgrading guidance and related user-facing migration messaging to state that legacy namespaces remain supported in 2.0 and are removed in 2.1.

Tests:

  • Strengthen the deprecation notice assertion to validate the complete 2.0-to-2.1 support and removal window.
  • Update legacy deletion coverage and references to use the revised 2.1 timeline and durable test naming.

2.0 is the transitional release; 2.1 deletes the legacy namespace trees.
The migration notice, its pinning test, the reverse gate's constant and
the deletion test's name all still said 3.0 -- text that ships to users
in 2.0.

The notice test now asserts the whole clause rather than the version
alone, so a wrong deprecation WINDOW fails it too, not just a wrong
removal version.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @pftg, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@pftg, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 37 minutes

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

Wait for the limit to reset, then comment @coderabbitai review or push new commits to the PR.

An organization admin can change what happens after included review limits in Billing.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c9ca63d7-7dc4-414d-9870-a8d7cde5962e

📥 Commits

Reviewing files that changed from the base of the PR and between 08b3343 and ec468c7.

📒 Files selected for processing (20)
  • docs/UPGRADING.md
  • lib/snap_diff/deprecation.rb
  • test/legacy/errors_alias_test.rb
  • test/legacy/legacy_config_accessors_test.rb
  • test/legacy/legacy_config_default_timing_test.rb
  • test/legacy/legacy_forwarders_test.rb
  • test/legacy/legacy_namespace_deprecation_test.rb
  • test/legacy/legacy_tree_is_alias_only_test.rb
  • test/legacy/namespace_forwarding_test.rb
  • test/legacy/snap_diff_deprecation_test.rb
  • test/unit/canonical_suite_has_no_legacy_refs_test.rb
  • test/unit/config_default_timing_test.rb
  • test/unit/core_tree_has_no_legacy_deps_test.rb
  • test/unit/drivers_test.rb
  • test/unit/errors_test.rb
  • test/unit/image_compare_test.rb
  • test/unit/legacy_deletion_test.rb
  • test/unit/snap_diff_config_test.rb
  • test/unit/snap_diff_test.rb
  • test/unit/support_load_probe_test.rb

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pftg
pftg merged commit 5137f16 into master Aug 23, 2026
5 of 6 checks passed
@pftg
pftg deleted the docs/removal-version-2-1 branch August 23, 2026 17:23
@sourcery-ai

sourcery-ai Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Aligns all deprecation copy, docs, and tests with the fact that the legacy v1 API is removed in 2.1 (not 3.0), and makes the deletion tests use durable, version-agnostic naming while tightening the migration notice assertion.

File-Level Changes

Change Details Files
Update the runtime migration notice and docs to state the legacy API is removed in 2.1, not 3.0, with the transitional release being 2.0.
  • Change MIGRATION_NOTICE text in the deprecation channel to "still works in 2.0 and is REMOVED in 2.1" and adjust its surrounding comment to reference 2.1 instead of 3.0.
  • Update UPGRADING.md to reflect the 2.0/2.1 transition window, including the NameError occurring in 2.1 and CONFIG_MAPPING disappearing in 2.1.
  • Refresh scattered inline comments in tests to say legacy trees and shims are deleted in 2.1 instead of 3.0, keeping narrative in sync with the actual schedule.
lib/snap_diff/deprecation.rb
docs/UPGRADING.md
test/legacy/errors_alias_test.rb
test/legacy/legacy_config_accessors_test.rb
test/legacy/legacy_config_default_timing_test.rb
test/legacy/legacy_forwarders_test.rb
test/legacy/legacy_namespace_deprecation_test.rb
test/legacy/legacy_tree_is_alias_only_test.rb
test/legacy/namespace_forwarding_test.rb
test/unit/config_default_timing_test.rb
test/unit/drivers_test.rb
test/unit/errors_test.rb
test/unit/image_compare_test.rb
test/unit/snap_diff_config_test.rb
test/unit/snap_diff_test.rb
test/unit/support_load_probe_test.rb
Tighten the deprecation test so it pins the entire migration notice clause, not just the removal version string.
  • Change the legacy deprecation test to assert the full phrase "still works in 2.0 and is REMOVED in 2.1" rather than only checking for "REMOVED in 3.0".
  • Keep existing assertions on the notice marker, docs reference, and silence knob text so the notice remains fully covered.
test/legacy/snap_diff_deprecation_test.rb
Rename deletion constants, tests, and class names to use durable, version-agnostic wording tied to the legacy-tree deletion rather than a specific 3.0 version number.
  • Rename DELETED_IN_3_0 to DELETED_WITH_LEGACY_TREES and update its usage in the core-tree gate so the deletion set is described by behavior (with legacy trees) instead of version.
  • Rename the integration test file and class from deletion_3_0/deletion30 to legacy_deletion/LegacyDeletion to decouple the test name from the specific release version.
  • Update references in the canonical-suite gate to point at the new legacy_deletion test filename while preserving the gate’s coverage of the deletion edits.
test/unit/core_tree_has_no_legacy_deps_test.rb
test/unit/deletion_3_0_test.rb
test/unit/legacy_deletion_test.rb
test/unit/canonical_suite_has_no_legacy_refs_test.rb

Possibly linked issues

  • #ADR-004: The PR updates legacy namespace deprecation and deletion timing within ADR-004’s Phase 3 migration.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

pftg added a commit that referenced this pull request Aug 24, 2026
* docs: 2.0.0 release readiness

Audit of everything a 2.0.0 final would ship, and the fixes that did not
need lib/ changes.

CHANGELOG
- A v2.0.0 entry written for someone upgrading from 1.15.1, not a diff of
  the betas. What to change (the version), what they will see (exact
  warning text), the five things that can actually break, and what 2.1
  removes. Every claim verified against a real install; the beta sections
  stay as history.

Version consistency
- README, docs/UPGRADING.md: no more "beta"/"alpha"/"experiment" framing
  and no beta pins. Gemfile examples say `~> 2.0`.
- Gem name: `capybara-screenshot-diff` is the one we tell people to
  install; `snap_diff-capybara` is a reserved identical mirror. Stated
  once in the README with the dual-install consequence, applied
  everywhere else.
- Stale "3.0" references in the Rakefile and docs/architecture.md are now
  2.1 (#247 fixed the user docs and missed these).

Corrections to claims that were not true
- docs/drivers.md promised that everything 2.1 removes "warns once per
  process naming 2.1". `driver: :auto` is silent whenever ruby-vips is
  present, and the `driver:` setting itself never warns at all even
  though 2.1 deletes it (`NoMethodError`). Both are now written down as
  silent, in drivers.md and UPGRADING.md, since a note is the only notice
  they can get.
- README called ruby-vips "Optional". With neither ruby-vips nor
  chunky_png installed, comparisons raise
  `Wrong adapter nil. Available adapters: []`. Says so now.
- Setup examples no longer teach `driver: :vips`, a line users have to
  delete for 2.1.

Gem hygiene
- gemspec: summary/description that describe what the gem does, the
  rubygems metadata links (source, changelog, bug tracker, docs), and
  docs/docker-testing.md dropped from the package (it documents
  bin/dtest, which is not packaged). Dead bindir/executables removed --
  the allow-list never matched exe/.
- README's links to CONTRIBUTING.md and docker-testing.md are absolute,
  so they resolve from inside the gem too.
- test/unit/gemspec_packaging_test.rb pins the packaged file list: both
  Bundler.require entry files present (this broke twice), consumer docs
  in, contributor docs and build files out, capybara the only runtime
  dependency. Verified it fails when an entry file is unpackaged.
- *.gem is gitignored.

Release process
- The GitHub Release body linked to blob/main on a repo whose default
  branch is master -- 404 on every release so far. Links to the tag now.
- docs/RELEASE_PREP.md was a stale v1.15.1 checklist. It is now a runbook
  for how releases actually happen: what the workflow does step by step,
  the trusted-publisher prerequisite for BOTH gem names, prereleases,
  post-release verification, and what to do when a run fails halfway.
- CONTRIBUTING.md pointed at the wrong version.rb and recommended
  `rake release`, which publishes only one of the two gem names.

Verified with real installs on ruby 4.0.6: 1.15.1 -> this master via
path:, a canonical-names setup, `Bundler.require` under each gem name
from the built .gem, and the dual-install guard with both gems installed.

No lib/ changes. Version not bumped.

* docs: SnapDiff::Error is the base class for errors the gem defines, not every error it raises

docs/snapdiff.md's object map said "Base class for every error this gem
raises". It is not: a missing image backend raises a bare RuntimeError
("Wrong adapter nil. Available adapters: []", reproduced on a bundle with
neither ruby-vips nor chunky_png) and StableScreenshoter raises
ArgumentError. Verified the four defined errors -- ExpectationNotMet,
UnstableImage, WindowSizeMismatchError, DualInstallError -- do all inherit
SnapDiff::Error, so the useful half of the promise holds and is now the
one being made.

* docs: tag protection, not branch protection, is what gates the release tag push

Branch protection rules do not govern tag pushes; tag protection rules
(or rulesets) do. The runbook prerequisite now names the right control.

* docs: the per-screenshot driver: override dies quietly, the config setting dies loudly

Both were lumped together as "raises NoMethodError on 2.1". Only the config
setting does. Per-screenshot options are a free-form hash, so on 2.1
`screenshot "index", driver: :vips` is inert and nothing tells you the line
is dead -- #249's own upgrade note spells out the split. Grep-for-it advice
added, since that is the only signal a user gets.

* docs: pin versions, and stop telling people to delete baselines

Second pass, from customer-persona findings. Each verified here before
acting; two of the four reported items turned out to be artifacts of the
PUBLISHED beta3 rather than of master, and are handled as such.

Baselines (the oldest bug in the tracker: #5 and #6 in 2018, #133 in 2024)
- README told users to "delete the baseline and re-run" in two places.
  It cannot work. `Vcs.checkout_vcs` (lib/snap_diff/vcs.rb:24) resolves
  every baseline with `git show HEAD:<path>`, and
  `ScreenshotMatcher#check_base_screenshot` calls it before
  `need_to_compare?` tests `base_path.exist?` -- so a committed baseline is
  fetched from HEAD no matter what the working tree says, and `rm` changes
  nothing.
- New first-class "Accepting an intentional change" section: the mechanism,
  the commit that actually accepts it, and the surprising part -- staging is
  not enough, so no local run goes green until you commit. The FAQ answer
  now says the same thing instead of the opposite.
- Deliberately does NOT document RECORD_SCREENSHOTS. It is printed by our
  own error message (screenshot_matcher.rb:73) but read nowhere in lib/;
  a separate lane is implementing it, and it should be documented once it
  works, not before.

Version pinning
- `gem "snap_diff-capybara"` unpinned installs 0.0.1 -- a placeholder whose
  entire payload is one README and zero Ruby files (verified by fetching and
  unpacking it), so the user gets an immediate LoadError. And unpinned
  `gem "capybara-screenshot-diff"` resolves to 1.15.1, not to the 2.0 the
  surrounding prose is selling. Every install instruction now pins, and the
  README says plainly that the mirror name is not the one to reach for.

CHANGELOG, all verified
- Failure messages leaked a libvips pointer struct via the comparison
  metadata; `to_h` excludes `diff_mask` since #234, which landed after the
  beta3 tag, so 2.0.0 final is the fix.
- Known limitation: fork-parallel runs write no HTML report. Workers
  accumulate assertions per process; the report is written from
  `Minitest.after_run` in the parent (integrations/minitest.rb:69), which
  never sees them. Artifacts and pass/fail are unaffected.
- A note for anyone sitting on a prerelease: beta3's deprecation channel was
  incomplete, so its silence is not evidence of being migrated.

Constants
- `Capybara::Screenshot::Os` -> `SnapDiff::Os` was in no rename table.

Gemspec
- rubygems_mfa_required. The four URI fields were added in the first commit.

* docs: stop teaching two commands that do not work

Two customer personas independently followed the docs and got a green bar
on a page they had deliberately broken.

`rake test` does not run `test/system/` in a Rails app. The Quick Start
told users to run it, so step 1 produced `0 runs` and no baselines --
which reads as a pass. The example is a Rails system test; the command
now matches it, with a callout, because "0 runs" is the single easiest
way to believe visual testing is working when nothing is running.

`RECORD_SCREENSHOTS=1` appeared in three user-facing docs for a feature
that has never existed in `lib/` -- it is this repository's own test-suite
convention, read by `test/test_helper.rb`. The user-facing copies are
replaced with the flow that actually works: run the suite, which rewrites
every changed baseline in place, then `git add` and commit. The
contributor page keeps it and now says plainly that it is not a library
feature.

* docs: make the Quick Start something a new user can actually run

A reviewer built a stock Rails 8.1 app, ran the documented Quick Start
end to end, and none of it worked. Fixes, each verified against a scratch
app or against lib/:

- `gem "capybara-screenshot-diff", "~> 2.0"` does not resolve. rubygems
  has 1.15.1 and 2.0.0.alpha1..beta3 and no final 2.x, and Bundler never
  picks a prerelease from a plain requirement, so `bundle install` fails
  with `Could not find gem 'capybara-screenshot-diff (~> 2.0)'`. All five
  install snippets now pin `2.0.0.beta3` and say why. RELEASE_PREP gains
  the step that swaps them back to `~> 2.0` as part of the 2.0.0 push,
  so the good pin lands with the release rather than before it.

- The Quick Start taught the API 2.1 deletes, silently. `require
  "capybara_screenshot_diff/minitest"` + `include
  CapybaraScreenshotDiff::Minitest::Assertions` print nothing: they are
  eager aliases, so `const_missing` never fires. The Quick Start now
  starts on canonical `SnapDiff`, and README/CHANGELOG/snapdiff.md say
  which doors actually warn (config accessors, `include`,
  `default_options`, `const_missing`) and which cannot.

- The CI "Record new baselines" job could not record a new baseline.
  `check_base_screenshot` runs before `capture_screenshot` and
  `fail_if_new` is true whenever `ENV["CI"]` is set, so a new screenshot
  raises before anything is written and the commit step finds nothing.
  The job now clears `CI` for that step.

- `bundle exec rake test` / `rails test` swept out of the three CI
  workflows, "The Short Version", and the historical upgrade sections:
  in a Rails app they skip `test/system/` and report `0 runs`.

- The delete-the-baselines block in UPGRADING replaced with the commit
  workflow the README documents.

- `docs/drivers.md` told you to delete the `driver:` setting on one
  screen and to add it on another; same for configuration.md,
  migration-guide.md.

- `rescue SnapDiff::Error` does not catch a failed assertion under the
  framework integrations -- Minitest converts it to `Minitest::Assertion`
  and RSpec to `ExpectationNotMetError`. Said so.

- "2.0 will not rewrite a baseline you already committed" contradicted
  the README and reality: a failing run does rewrite the baseline path.
  Reworded to what is meant (no re-encoding) plus what actually happens.

Also, all verified in a scratch app: the `git add
test/fixtures/screenshots/` path was never the default (`doc/screenshots`
is); the example failure output showed a `max_color_distance` key the
vips path never emits; the artifact table listed three of five files;
`application_system_test_case.rb` omitted both `require "test_helper"`
and `driven_by` (without the latter the same page captures at 2800x1610
instead of 1400x1257); `homepage_test.rb` omitted `require
"application_system_test_case"` and raised NameError as printed; and
`DEBUG=1` never had anything to do with keeping `.diff.png` files.

Docs only. rake test:unit 610/0, standardrb clean.

* docs: three residuals from the verifier pass

- bug_report template told reporters to run `rake test`, which runs zero
  system tests in a Rails app -- the same trap this branch exists to remove.
- drivers.md said an unknown per-screenshot `driver:` key is "simply inert".
  It is validated and raises; only the deprecation warning is absent.
- drivers.md said `:auto` and `:chunky_png` each warn once per process.
  `:auto` is silent when ruby-vips resolves; only `:chunky_png` warns.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant