Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump html-pipeline from 3.0.3 to 3.2.2 #700

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

dependabot[bot]
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Dec 16, 2024

Bumps html-pipeline from 3.0.3 to 3.2.2.

Release notes

Sourced from html-pipeline's releases.

v3.2.2

What's Changed

New Contributors

Full Changelog: gjtorikian/html-pipeline@v3.2.1...v3.2.2

v3.2.1

What's Changed

New Contributors

Full Changelog: gjtorikian/html-pipeline@v3.2.0...v3.2.1

v3.2.0

What's Changed

Full Changelog: gjtorikian/html-pipeline@v3.1.1...v3.2.0

v3.1.1

What's Changed

Full Changelog: gjtorikian/html-pipeline@v3.1.0...v3.1.1

v3.1.0

What's Changed

New Contributors

Full Changelog: gjtorikian/html-pipeline@v3.0.3...v3.1.0

Changelog

Sourced from html-pipeline's changelog.

[v3.2.2] - 09-08-2024

What's Changed

New Contributors

Full Changelog: gjtorikian/html-pipeline@v3.2.1...v3.2.2

[v3.2.1] - 16-07-2024

What's Changed

Full Changelog: gjtorikian/html-pipeline@v3.2.0...v3.2.1

[v3.2.0] - 30-04-2024

What's Changed

Full Changelog: gjtorikian/html-pipeline@v3.1.1...v3.2.0

[v3.1.1] - 09-04-2024

What's Changed

Full Changelog: gjtorikian/html-pipeline@v3.1.0...v3.1.1

[v3.1.0] - 28-02-2024

What's Changed

New Contributors

Full Changelog: gjtorikian/html-pipeline@v3.0.3...v3.1.0

Commits
  • 713f663 Merge pull request #417 from gjtorikian/dependabot/bundler/bundler-dependenci...
  • 0cb820d update for commonmarker
  • f3695bf ignore cache
  • 56037b4 Update commonmarker requirement from ~> 1.1.2 to ~> 2.0.1
  • 3e9be8d Merge pull request #412 from jeremysmithco/bug-combining-mention-filters
  • bf9d961 lint
  • cd9749d literally none of these have been updated
  • 3eadd4c Merge pull request #415 from gjtorikian/release/v3.2.2
  • 9f32c44 [skip test] update changelog
  • 35549ef Merge pull request #414 from gjtorikian/fix-sanitization-only
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

@dependabot dependabot bot added dependencies ruby Pull requests that update Ruby code labels Dec 16, 2024
Copy link

gem compare html-pipeline 3.0.3 3.2.2

Compared versions: ["3.0.3", "3.2.2"]
  DIFFERENT date:
    3.0.3: 2024-02-02 00:00:00 UTC
    3.2.2: 2024-12-15 00:00:00 UTC
  DIFFERENT rubygems_version:
    3.0.3: 3.5.5
    3.2.2: 3.4.6
  DIFFERENT version:
    3.0.3: 3.0.3
    3.2.2: 3.2.2
  DIFFERENT files:
    3.0.3->3.2.2:
      * Changed:
            .github/workflows/publish.yml +7/-2
            .gitignore +1/-1
            CHANGELOG.md +113/-52
            Gemfile +1/-3
            README.md +26/-41
            UPGRADING.md +0/-2
            html-pipeline.gemspec +1/-1
            lib/html_pipeline.rb +17/-11
            lib/html_pipeline/convert_filter.rb +1/-1
            lib/html_pipeline/convert_filter/markdown_filter.rb +4/-4
            lib/html_pipeline/filter.rb +1/-1
            lib/html_pipeline/node_filter.rb +2/-0
            lib/html_pipeline/node_filter/mention_filter.rb +2/-1
            lib/html_pipeline/node_filter/syntax_highlight_filter.rb +1/-1
            lib/html_pipeline/node_filter/team_mention_filter.rb +2/-1
            lib/html_pipeline/text_filter.rb +8/-8
            lib/html_pipeline/text_filter/image_filter.rb +2/-2
            lib/html_pipeline/text_filter/plain_text_input_filter.rb +2/-2
            lib/html_pipeline/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.0.3->3.2.2:
      * Updated:
            selma from: ["~> 0.1"] to: ["~> 0.4"]
  DIFFERENT Gemfile dependencies
    3.0.3->3.2.2:
      * Deleted
            github_changelog_generator ["~> 1.16"] (runtime)
      * Updated
            commonmarker from: ["~> 1.0.0.pre7"] to: ["~> 2.0.1"]

Copy link

gem compare --diff html-pipeline 3.0.3 3.2.2

Compared versions: ["3.0.3", "3.2.2"]
  DIFFERENT files:
    3.0.3->3.2.2:
      * Changed:
        .github/workflows/publish.yml
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/.github/workflows/publish.yml	2024-12-16 03:48:21.415068603 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/.github/workflows/publish.yml	2024-12-16 03:48:21.423068504 +0000
                @@ -1 +1 @@
                -name: Release
                +name: Tag and Release
                @@ -9,0 +10,3 @@
                +  pull_request_target:
                +    types:
                +      - closed
                @@ -16 +19 @@
                -      gh_token: ${{ secrets.PUBLIC_PUSH_TO_PROTECTED_BRANCH }}
                +      gh_token: ${{ secrets.GITHUB_TOKEN }}
                @@ -19,0 +23,2 @@
                +      prepare: ${{ github.event_name == 'push' }}
                +      release: ${{ github.event_name == 'workflow_dispatch' || ((github.event.pull_request.merged == true) && (contains(github.event.pull_request.labels.*.name, 'release'))) }}
        .gitignore
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/.gitignore	2024-12-16 03:48:21.415068603 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/.gitignore	2024-12-16 03:48:21.423068504 +0000
                @@ -20 +20 @@
                -vendor/gems
                \ No newline at end of file
                +vendor/cache/
        CHANGELOG.md
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/CHANGELOG.md	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/CHANGELOG.md	2024-12-16 03:48:21.423068504 +0000
                @@ -0,0 +1,51 @@
                +# [v3.2.2] - 09-08-2024
                +## What's Changed
                +* Add support for @ prefix on MentionFilter base_url by @jeremysmithco in https://github.com/gjtorikian/html-pipeline/pull/411
                +* Bugfix: sanitization-only filters should still work by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/414
                +
                +## New Contributors
                +* @jeremysmithco made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/411
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.2.1...v3.2.2
                +# [v3.2.1] - 16-07-2024
                +## What's Changed
                +* Update commonmarker requirement from ~> 1.0.0.pre7 to ~> 1.1.2 in the bundler-dependencies group by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/404
                +* Remove superfluous sanitization by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/408
                +
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.2.0...v3.2.1
                +## [v3.2.0] - 30-04-2024
                +## What's Changed
                +* Pass context along to every part of the pipeline by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/403
                +
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.1.1...v3.2.0
                +## [v3.1.1] - 09-04-2024
                +## What's Changed
                +* Correct missing method implementation by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/401
                +
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.1.0...v3.1.1
                +## [v3.1.0] - 28-02-2024
                +## What's Changed
                +* UPGRADING:  not removed by @dentarg in https://github.com/gjtorikian/html-pipeline/pull/397
                +* [BREAKING]  now requires instantiation by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/398
                +
                +## New Contributors
                +* @dentarg made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/397
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.0.3...v3.1.0
                +## [v3.0.3] - 02-02-2024
                +
                +## What's Changed
                +
                +- Fix typo in README by @ppworks in https://github.com/gjtorikian/html-pipeline/pull/394
                +- Prevent exception by @ppworks in https://github.com/gjtorikian/html-pipeline/pull/395
                +- Cut 3.0.3 by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/396
                +
                +## New Contributors
                +
                +- @ppworks made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/394
                +
                +**Full Changelog**: https://github.com/gjtorikian/html-pipeline/compare/v3.0.2...v3.0.3
                +
                @@ -1,0 +53 @@
                +
                @@ -3,2 +55,3 @@
                -* README.md: Fix example code by @grekko in https://github.com/gjtorikian/html-pipeline/pull/390
                -* Allow pipeline to run without node filters by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/392
                +
                +- README.md: Fix example code by @grekko in https://github.com/gjtorikian/html-pipeline/pull/390
                +- Allow pipeline to run without node filters by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/392
                @@ -7 +60,2 @@
                -* @grekko made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/390
                +
                +- @grekko made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/390
                @@ -9,0 +64 @@
                +
                @@ -10,0 +66 @@
                +
                @@ -12 +68,2 @@
                -* Handle odd numbers of NodeFilters to be configured by @stevehill1981 in https://github.com/gjtorikian/html-pipeline/pull/389
                +
                +- Handle odd numbers of NodeFilters to be configured by @stevehill1981 in https://github.com/gjtorikian/html-pipeline/pull/389
                @@ -15 +72,2 @@
                -* @stevehill1981 made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/389
                +
                +- @stevehill1981 made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/389
                @@ -17,0 +76 @@
                +
                @@ -18,0 +78 @@
                +
                @@ -20,20 +80,21 @@
                -* Switch to GitHub Actions by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/346
                -* add truffleruby-head by @gogainda in https://github.com/gjtorikian/html-pipeline/pull/348
                -* Add Rubocop by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/349
                -* Support multiple dependencies per filter by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/351
                -* Split filters up by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/360
                -* Migrate from Nokogiri to Selma by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/368
                -* You shall pass by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/369
                -* Update Selma signatures by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/370
                -* Close sanitization-related issues by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/371
                -* Drop SyntaxHighlightFilter by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/372
                -* V3 Release by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/347
                -* Use emoji from commonmarker by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/373
                -* req convert_filter if filter present by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/375
                -* Update selma requirement from ~> 0.0.1 to >= 0.0.1, < 0.2.0 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/377
                -* Add the AssetProxyFilter by @digitalmoksha in https://github.com/gjtorikian/html-pipeline/pull/379
                -* Update rouge requirement from ~> 3.1 to ~> 4.1 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/381
                -* Update gemoji requirement from ~> 3.0 to ~> 4.1 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/382
                -* Have Zeitwerk not automatically load filters by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/383
                -* Bump the github-actions group with 1 update by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/384
                -* :gem: 3.0.0 by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/386
                +
                +- Switch to GitHub Actions by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/346
                +- add truffleruby-head by @gogainda in https://github.com/gjtorikian/html-pipeline/pull/348
                +- Add Rubocop by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/349
                +- Support multiple dependencies per filter by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/351
                +- Split filters up by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/360
                +- Migrate from Nokogiri to Selma by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/368
                +- You shall pass by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/369
                +- Update Selma signatures by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/370
                +- Close sanitization-related issues by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/371
                +- Drop SyntaxHighlightFilter by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/372
                +- V3 Release by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/347
                +- Use emoji from commonmarker by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/373
                +- req convert_filter if filter present by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/375
                +- Update selma requirement from ~> 0.0.1 to >= 0.0.1, < 0.2.0 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/377
                +- Add the AssetProxyFilter by @digitalmoksha in https://github.com/gjtorikian/html-pipeline/pull/379
                +- Update rouge requirement from ~> 3.1 to ~> 4.1 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/381
                +- Update gemoji requirement from ~> 3.0 to ~> 4.1 by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/382
                +- Have Zeitwerk not automatically load filters by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/383
                +- Bump the github-actions group with 1 update by @dependabot in https://github.com/gjtorikian/html-pipeline/pull/384
                +- :gem: 3.0.0 by @gjtorikian in https://github.com/gjtorikian/html-pipeline/pull/386
                @@ -42,3 +103,4 @@
                -* @gogainda made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/348
                -* @dependabot made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/377
                -* @digitalmoksha made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/379
                +
                +- @gogainda made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/348
                +- @dependabot made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/377
                +- @digitalmoksha made their first contribution in https://github.com/gjtorikian/html-pipeline/pull/379
                @@ -46,0 +109 @@
                +
                @@ -47,0 +111 @@
                +
                @@ -48,0 +113 @@
                +
                @@ -79 +144 @@
                -- req convert\_filter if `text/node`filter present [\#375](https://github.com/gjtorikian/html-pipeline/pull/375) ([gjtorikian](https://github.com/gjtorikian))
                +- req convert_filter if `text/node`filter present [\#375](https://github.com/gjtorikian/html-pipeline/pull/375) ([gjtorikian](https://github.com/gjtorikian))
                @@ -140 +205 @@
                -- Replace EscapeUtils.escape\_html with CGI.escape\_html [\#365](https://github.com/gjtorikian/html-pipeline/pull/365) ([ramhoj](https://github.com/ramhoj))
                +- Replace EscapeUtils.escape_html with CGI.escape_html [\#365](https://github.com/gjtorikian/html-pipeline/pull/365) ([ramhoj](https://github.com/ramhoj))
                @@ -312 +377 @@
                -- New feature request for hashtags \# filter  [\#301](https://github.com/gjtorikian/html-pipeline/issues/301)
                +- New feature request for hashtags \# filter [\#301](https://github.com/gjtorikian/html-pipeline/issues/301)
                @@ -415 +480 @@
                --   add korgi to 3rd party extensions \[ci skip\] [\#271](https://github.com/gjtorikian/html-pipeline/pull/271) ([jodeci](https://github.com/jodeci))
                +- add korgi to 3rd party extensions \[ci skip\] [\#271](https://github.com/gjtorikian/html-pipeline/pull/271) ([jodeci](https://github.com/jodeci))
                @@ -424 +489 @@
                -- Missing context keys for HTML::Pipeline::EmojiFilter: :asset\_root [\#262](https://github.com/gjtorikian/html-pipeline/issues/262)
                +- Missing context keys for HTML::Pipeline::EmojiFilter: :asset_root [\#262](https://github.com/gjtorikian/html-pipeline/issues/262)
                @@ -507,2 +572,2 @@
                -- Fix for calling mention\_link\_filter with only one argument [\#230](https://github.com/gjtorikian/html-pipeline/pull/230) ([benbalter](https://github.com/benbalter))
                -- Add html-pipeline-linkify\_github to 3rd Party Extensions \[ci skip\] [\#228](https://github.com/gjtorikian/html-pipeline/pull/228) ([JuanitoFatas](https://github.com/JuanitoFatas))
                +- Fix for calling mention_link_filter with only one argument [\#230](https://github.com/gjtorikian/html-pipeline/pull/230) ([benbalter](https://github.com/benbalter))
                +- Add html-pipeline-linkify_github to 3rd Party Extensions \[ci skip\] [\#228](https://github.com/gjtorikian/html-pipeline/pull/228) ([JuanitoFatas](https://github.com/JuanitoFatas))
                @@ -564 +629 @@
                -- MentionFilter base\_url config question [\#161](https://github.com/gjtorikian/html-pipeline/issues/161)
                +- MentionFilter base_url config question [\#161](https://github.com/gjtorikian/html-pipeline/issues/161)
                @@ -576,2 +641,2 @@
                -- Add 3rd party gem: html-pipeline-rouge\_filter. [\#174](https://github.com/gjtorikian/html-pipeline/pull/174) ([JuanitoFatas](https://github.com/JuanitoFatas))
                -- MentionFilter\#link\_to\_mentioned\_user: Replace String introspection with Regexp match [\#172](https://github.com/gjtorikian/html-pipeline/pull/172) ([simeonwillbanks](https://github.com/simeonwillbanks))
                +- Add 3rd party gem: html-pipeline-rouge_filter. [\#174](https://github.com/gjtorikian/html-pipeline/pull/174) ([JuanitoFatas](https://github.com/JuanitoFatas))
                +- MentionFilter\#link_to_mentioned_user: Replace String introspection with Regexp match [\#172](https://github.com/gjtorikian/html-pipeline/pull/172) ([simeonwillbanks](https://github.com/simeonwillbanks))
                @@ -579 +644 @@
                -- Implement new context option: ignored\_ancestor\_tags to accept more ignored tags. [\#170](https://github.com/gjtorikian/html-pipeline/pull/170) ([JuanitoFatas](https://github.com/JuanitoFatas))
                +- Implement new context option: ignored_ancestor_tags to accept more ignored tags. [\#170](https://github.com/gjtorikian/html-pipeline/pull/170) ([JuanitoFatas](https://github.com/JuanitoFatas))
                @@ -596 +661 @@
                -- @mention\_filter should not replace mentions in style blocks. [\#143](https://github.com/gjtorikian/html-pipeline/issues/143)
                +- @mention_filter should not replace mentions in style blocks. [\#143](https://github.com/gjtorikian/html-pipeline/issues/143)
                @@ -603 +668 @@
                -- Prefer http\_url in HttpsFilter [\#142](https://github.com/gjtorikian/html-pipeline/pull/142) ([bkeepers](https://github.com/bkeepers))
                +- Prefer http_url in HttpsFilter [\#142](https://github.com/gjtorikian/html-pipeline/pull/142) ([bkeepers](https://github.com/bkeepers))
                @@ -635 +700 @@
                -- Remove RUBY\_VERSION conditionals from gemspec [\#130](https://github.com/gjtorikian/html-pipeline/pull/130) ([mislav](https://github.com/mislav))
                +- Remove RUBY_VERSION conditionals from gemspec [\#130](https://github.com/gjtorikian/html-pipeline/pull/130) ([mislav](https://github.com/mislav))
                @@ -662 +727 @@
                -- AutolinkFilter link\_attr doesn't seem to work [\#114](https://github.com/gjtorikian/html-pipeline/issues/114)
                +- AutolinkFilter link_attr doesn't seem to work [\#114](https://github.com/gjtorikian/html-pipeline/issues/114)
                @@ -750 +815 @@
                -- Add link\_attr option to Autolink filter [\#89](https://github.com/gjtorikian/html-pipeline/pull/89) ([excid3](https://github.com/excid3))
                +- Add link_attr option to Autolink filter [\#89](https://github.com/gjtorikian/html-pipeline/pull/89) ([excid3](https://github.com/excid3))
                @@ -752 +817 @@
                -- use xml\_mini extracted from activesupport [\#85](https://github.com/gjtorikian/html-pipeline/pull/85) ([mojavelinux](https://github.com/mojavelinux))
                +- use xml_mini extracted from activesupport [\#85](https://github.com/gjtorikian/html-pipeline/pull/85) ([mojavelinux](https://github.com/mojavelinux))
                @@ -820 +885 @@
                -- Allow passing skip\_tags in autolink filter context [\#65](https://github.com/gjtorikian/html-pipeline/pull/65) ([pengwynn](https://github.com/pengwynn))
                +- Allow passing skip_tags in autolink filter context [\#65](https://github.com/gjtorikian/html-pipeline/pull/65) ([pengwynn](https://github.com/pengwynn))
                @@ -873 +938 @@
                -- add result\[:mentioned\_usernames\] for MentionFilter [\#42](https://github.com/gjtorikian/html-pipeline/pull/42) ([fahchen](https://github.com/fahchen))
                +- add result\[:mentioned_usernames\] for MentionFilter [\#42](https://github.com/gjtorikian/html-pipeline/pull/42) ([fahchen](https://github.com/fahchen))
                @@ -889 +954 @@
                -- Bump escape\_utils [\#41](https://github.com/gjtorikian/html-pipeline/pull/41) ([brianmario](https://github.com/brianmario))
                +- Bump escape_utils [\#41](https://github.com/gjtorikian/html-pipeline/pull/41) ([brianmario](https://github.com/brianmario))
                @@ -981,4 +1045,0 @@
                -
                -
                -
                -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
        Gemfile
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/Gemfile	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/Gemfile	2024-12-16 03:48:21.423068504 +0000
                @@ -13,2 +12,0 @@
                -gem "github_changelog_generator", "~> 1.16"
                -
                @@ -30 +28 @@
                -  gem "commonmarker", "~> 1.0.0.pre7", require: false
                +  gem "commonmarker", "~> 2.0.1", require: false
        README.md
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/README.md	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/README.md	2024-12-16 03:48:21.423068504 +0000
                @@ -3,3 +2,0 @@
                -> **Note**
                -> This README refers to the behavior in the new 3.0.0.pre gem.
                -
                @@ -63 +60,7 @@
                -As an example, suppose we want to transform Commonmark source text into Markdown HTML. With the content, we also want to:
                +As an example, suppose we want to transform Commonmark source text into Markdown HTML:
                +
                +```
                +Hey there, @gjtorikian
                +```
                +
                +With the content, we also want to:
                @@ -65 +68 @@
                -- change every instance of `$NAME` to "`Johnny"
                +- change every instance of `Hey` to `Hello`
                @@ -76 +79 @@
                -    text.gsub("$NAME", "Johnny")
                +    text.gsub("Hey", "Hello")
                @@ -107 +110 @@
                -context =  { markdown: { extensions: { footnotes: false } } }
                +context = { markdown: { extensions: { footnotes: false } } }
                @@ -111,0 +115,10 @@
                +Alternatively, you can construct a pipeline, and pass in a context during the call:
                +
                +```ruby
                +pipeline = HTMLPipeline.new(
                +  convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter.new,
                +  node_filters: [HTMLPipeline::NodeFilter::MentionFilter.new]
                +)
                +pipeline.call(user_supplied_text, context: { markdown: { extensions: { footnotes: false } } })
                +```
                +
                @@ -161 +174 @@
                -Because the web can be a scary place, HTML is automatically sanitized after the `ConvertFilter` runs and before the `NodeFilter`s are processed. This is to prevent malicious or unexpected input from entering the pipeline.
                +Because the web can be a scary place, **HTML is automatically sanitized** after the `ConvertFilter` runs and before the `NodeFilter`s are processed. This is to prevent malicious or unexpected input from entering the pipeline.
                @@ -163 +176 @@
                -The sanitization process takes a hash configuration of settings. See the [Selma](https://www.github.com/gjtorikian/selma) documentation for more information on how to configure these settings.
                +The sanitization process takes a hash configuration of settings. See the [Selma](https://www.github.com/gjtorikian/selma) documentation for more information on how to configure these settings. Note that users must correctly configure the sanitization configuration if they expect to use it correctly in conjunction with handlers which manipulate HTML.
                @@ -174 +187 @@
                -    HTMLPipeline::MarkdownFilter,
                +    HTMLPipeline::TextFilter::ImageFilter.new,
                @@ -202 +215 @@
                -    HTMLPipeline::MarkdownFilter,
                +    HTMLPipeline::TextFilter::ImageFilter.new,
                @@ -214 +227 @@
                -`NodeFilter` also has an optional method, `after_initialize`, which is run after the filter initializes. This can be useful in setting up a custom state for `result` to take advantage of.
                +`NodeFilter` also has an optional method, `after_initialize`, which is run after the filter initializes. This can be useful in setting up a fresh custom state for `result` to start from each time the pipeline is called.
                @@ -333,28 +345,0 @@
                -## Third Party Extensions
                -
                -If you have an idea for a filter, propose it as
                -[an issue](https://github.com/gjtorikian/html-pipeline/issues) first. This allows us to discuss
                -whether the filter is a common enough use case to belong in this gem, or should be
                -built as an external gem.
                -
                -Here are some extensions people have built:
                -
                -- [html-pipeline-asciidoc_filter](https://github.com/asciidoctor/html-pipeline-asciidoc_filter)
                -- [jekyll-html-pipeline](https://github.com/gjtorikian/jekyll-html-pipeline)
                -- [nanoc-html-pipeline](https://github.com/burnto/nanoc-html-pipeline)
                -- [html-pipeline-bitly](https://github.com/dewski/html-pipeline-bitly)
                -- [html-pipeline-cite](https://github.com/lifted-studios/html-pipeline-cite)
                -- [tilt-html-pipeline](https://github.com/bradgessler/tilt-html-pipeline)
                -- [html-pipeline-wiki-link'](https://github.com/lifted-studios/html-pipeline-wiki-link) - WikiMedia-style wiki links
                -- [task_list](https://github.com/github/task_list) - GitHub flavor Markdown Task List
                -- [html-pipeline-nico_link](https://github.com/rutan/html-pipeline-nico_link) - An HTMLPipeline filter for [niconico](http://www.nicovideo.jp) description links
                -- [html-pipeline-gitlab](https://gitlab.com/gitlab-org/html-pipeline-gitlab) - This gem implements various filters for html-pipeline used by GitLab
                -- [html-pipeline-youtube](https://github.com/st0012/html-pipeline-youtube) - An HTMLPipeline filter for YouTube links
                -- [html-pipeline-flickr](https://github.com/st0012/html-pipeline-flickr) - An HTMLPipeline filter for Flickr links
                -- [html-pipeline-vimeo](https://github.com/dlackty/html-pipeline-vimeo) - An HTMLPipeline filter for Vimeo links
                -- [html-pipeline-hashtag](https://github.com/mr-dxdy/html-pipeline-hashtag) - An HTMLPipeline filter for hashtags
                -- [html-pipeline-linkify_github](https://github.com/jollygoodcode/html-pipeline-linkify_github) - An HTMLPipeline filter to autolink GitHub urls
                -- [html-pipeline-redcarpet_filter](https://github.com/bmikol/html-pipeline-redcarpet_filter) - Render Markdown source text into Markdown HTML using Redcarpet
                -- [html-pipeline-typogruby_filter](https://github.com/bmikol/html-pipeline-typogruby_filter) - Add Typogruby text filters to your HTMLPipeline
                -- [korgi](https://github.com/jodeci/korgi) - HTMLPipeline filters for links to Rails resources
                -
                @@ -378 +363 @@
                -config = HTMLPipeline::SanitizationFilter::DEFAULT_CONFIG.dup
                +config = HTMLPipeline::SanitizationFilter::DEFAULT_CONFIG.deep_dup
        UPGRADING.md
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/UPGRADING.md	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/UPGRADING.md	2024-12-16 03:48:21.423068504 +0000
                @@ -17 +16,0 @@
                -
                @@ -20 +18,0 @@
                -- `TextFilter`
        html-pipeline.gemspec
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/html-pipeline.gemspec	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/html-pipeline.gemspec	2024-12-16 03:48:21.423068504 +0000
                @@ -28 +28 @@
                -  gem.add_dependency("selma", "~> 0.1")
                +  gem.add_dependency("selma", "~> 0.4")
        lib/html_pipeline.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline.rb	2024-12-16 03:48:21.423068504 +0000
                @@ -156 +156 @@
                -        text_filters: @text_filters.map(&:name),
                +        text_filters: @text_filters.map { |f| f.class.name },
                @@ -163 +163 @@
                -            perform_filter(filter, doc, context: context, result: result)
                +            perform_filter(filter, doc, context: (filter.context || {}).merge(context), result: result)
                @@ -174 +174 @@
                -        html = @convert_filter.call(text)
                +        html = @convert_filter.call(text, context: (@convert_filter.context || {}).merge(context))
                @@ -178 +178,11 @@
                -    unless @node_filters.empty?
                +    rewriter_options = {
                +      memory: {
                +        max_allowed_memory_usage: 5242880, # arbitrary limit of 5MB
                +      },
                +    }
                +
                +    if @node_filters.empty?
                +      instrument("sanitization.html_pipeline", payload) do
                +        result[:output] = Selma::Rewriter.new(sanitizer: @sanitization_config, options: rewriter_options).rewrite(html)
                +      end
                +    else
                @@ -180,2 +190,2 @@
                -        result[:output] = Selma::Rewriter.new(sanitizer: @sanitization_config, handlers: @node_filters).rewrite(html)
                -        html = result[:output]
                +        @node_filters.each { |filter| filter.context = (filter.context || {}).merge(context) }
                +        result[:output] = Selma::Rewriter.new(sanitizer: @sanitization_config, handlers: @node_filters, options: rewriter_options).rewrite(html)
                @@ -190,4 +199,0 @@
                -    instrument("html_pipeline.sanitization", payload) do
                -      result[:output] = Selma::Rewriter.new(sanitizer: @sanitization_config, handlers: @node_filters).rewrite(html)
                -    end
                -
                @@ -207 +213 @@
                -      filter: filter.name,
                +      filter: filter.class.name,
        lib/html_pipeline/convert_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/convert_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/convert_filter.rb	2024-12-16 03:48:21.423068504 +0000
                @@ -8 +8 @@
                -      super(context: context, result: result)
                +      super
        lib/html_pipeline/convert_filter/markdown_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/convert_filter/markdown_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/convert_filter/markdown_filter.rb	2024-12-16 03:48:21.423068504 +0000
                @@ -6 +6 @@
                -  class ConvertFilter
                +  class ConvertFilter < Filter
                @@ -15 +15 @@
                -        super(context: context, result: result)
                +        super
                @@ -19,2 +19,2 @@
                -      def call(text)
                -        options = @context.fetch(:markdown, {})
                +      def call(text, context: @context)
                +        options = context.fetch(:markdown, {})
        lib/html_pipeline/filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/filter.rb	2024-12-16 03:48:21.423068504 +0000
                @@ -30 +30 @@
                -    attr_reader :context
                +    attr_accessor :context
        lib/html_pipeline/node_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/node_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/node_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -6,0 +7,2 @@
                +    attr_accessor :context
                +
        lib/html_pipeline/node_filter/mention_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/node_filter/mention_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/node_filter/mention_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -118 +118,2 @@
                -        url << "/" unless %r{[/~]\z}.match?(url)
                +        excluded_prefixes = %r{[/(?:~|@]\z}
                +        url << "/" unless excluded_prefixes.match?(url)
        lib/html_pipeline/node_filter/syntax_highlight_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/node_filter/syntax_highlight_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/node_filter/syntax_highlight_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -18 +18 @@
                -        super(context: context, result: result)
                +        super
        lib/html_pipeline/node_filter/team_mention_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/node_filter/team_mention_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/node_filter/team_mention_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -97 +97,2 @@
                -        url << "/" unless %r{[/~]\z}.match?(url)
                +        excluded_prefixes = %r{[/(?:~|@]\z}
                +        url << "/" unless excluded_prefixes.match?(url)
        lib/html_pipeline/text_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/text_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/text_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -7,6 +7,2 @@
                -    def initialize(text, context: {}, result: {})
                -      raise TypeError, "text must be a String" unless text.is_a?(String)
                -
                -      # Ensure that this is always a string
                -      @text = text.respond_to?(:to_str) ? text.to_str : text.to_s
                -      super(context: context, result: result)
                +    def initialize(context: {}, result: {})
                +      super
                @@ -16,2 +12,6 @@
                -      def call(input, context: {}, result: {})
                -        new(input, context: context, result: result).call
                +      def call(text, context: {}, result: {})
                +        raise TypeError, "text must be a String" unless text.is_a?(String)
                +
                +        # Ensure that this is always a string
                +        text = text.respond_to?(:to_str) ? text.to_str : text.to_s
                +        new(context: context, result: result).call(text)
        lib/html_pipeline/text_filter/image_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/text_filter/image_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/text_filter/image_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -12,2 +12,2 @@
                -      def call
                -        @text.gsub(%r{(https|http)?://.+\.(jpg|jpeg|bmp|gif|png)(\?\S+)?}i) do |match|
                +      def call(text, context: {}, result: {})
                +        text.gsub(%r{(https|http)?://.+\.(jpg|jpeg|bmp|gif|png)(\?\S+)?}i) do |match|
        lib/html_pipeline/text_filter/plain_text_input_filter.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/text_filter/plain_text_input_filter.rb	2024-12-16 03:48:21.419068553 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/text_filter/plain_text_input_filter.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -8,2 +8,2 @@
                -      def call
                -        "<div>#{CGI.escapeHTML(@text)}</div>"
                +      def call(text, context: {}, result: {})
                +        "<div>#{CGI.escapeHTML(text)}</div>"
        lib/html_pipeline/version.rb
                --- /tmp/d20241216-1952-jypma1/html-pipeline-3.0.3/lib/html_pipeline/version.rb	2024-12-16 03:48:21.423068504 +0000
                +++ /tmp/d20241216-1952-jypma1/html-pipeline-3.2.2/lib/html_pipeline/version.rb	2024-12-16 03:48:21.543067012 +0000
                @@ -4 +4 @@
                -  VERSION = "3.0.3"
                +  VERSION = "3.2.2"

Copy link

gem compare rb_sys 0.9.88 0.9.103

Compared versions: ["0.9.88", "0.9.103"]
  DIFFERENT cert_chain:
    0.9.88: ["-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQsFADBCMRQwEgYDVQQDDAtpLmtl\ncnNleW1lcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYD\nY29tMB4XDTIzMDQxNDEzMzYxNVoXDTI0MDQxMzEzMzYxNVowQjEUMBIGA1UEAwwL\naS5rZXJzZXltZXIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk\nARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMJ2pG+er4cP\nPasxsMIKL9/tmLL4gh80EMuF3SCS0qZoh+Oo8dkvRYxW8NXdwEIcp3cCNgE+5G+J\nTCMOVF8S15n1Z1P7xxXiXxa/BIofKKbtatVRngm14uR/6pjdkvLXqlrWdS57bNwv\n7LtpzYVfDHfsl/qRWaEi4jq00PNCRSWjcva8teqswjBg8KlwGtyygpezPbVSWP8Y\nvzWZmVF7fqRBXU78Ah0+pNOhslBXDTvI3xJdN4hQ3H7rLjpD/qxKWq/8o+Qvx6cX\ndNZ3ugH/Pr3BAsqt4JFLXin9AK7PO9GDMH5JXJrUb+hAt2VNIZqpz9VlKA6BA0jN\neWGea+yCZkECAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFOkrF6hsocaIMOjR/K3JBzyXCLJPMCAGA1UdEQQZMBeBFWkua2Vyc2V5bWVy\nQGdtYWlsLmNvbTAgBgNVHRIEGTAXgRVpLmtlcnNleW1lckBnbWFpbC5jb20wDQYJ\nKoZIhvcNAQELBQADggEBAMAohCl0cdVlYrJl9viGtzbEyLV/Krn0ZD/LM9d2cIRj\nWBu7HRkP6AfYVzhZwdgUgDYw67d715kOMpLNGeWQw3QGEHFqbVzRML64jL8IxuTz\nJ8ttZVqM8f4GrHyISJnL92u6iP4WzdbVqx89EFjrrHd14OJXK+ZpdRh0YvnN/vMJ\nt2EcDweRHkN/MEdrwbH+PbYjELnKcTIEZqcCWTk8pgssGrNyjkMhxGSsSUo9qTz0\nDIZ6NVmpBvohJVCCCDxQQxFKLXZp1ivoxjN+m7eJSW7yzIz062pH4u8pPNQsiVSb\nI5rgRPbDr2rAFGXKoQ0+u6CLkRxqrVsITl/OPfZhBQI=\n-----END CERTIFICATE-----\n"]
    0.9.103: ["-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBCMRQwEgYDVQQDDAtpLmtl\ncnNleW1lcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYD\nY29tMB4XDTI0MDQxODA1MzY0N1oXDTI1MDQxODA1MzY0N1owQjEUMBIGA1UEAwwL\naS5rZXJzZXltZXIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk\nARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMJ2pG+er4cP\nPasxsMIKL9/tmLL4gh80EMuF3SCS0qZoh+Oo8dkvRYxW8NXdwEIcp3cCNgE+5G+J\nTCMOVF8S15n1Z1P7xxXiXxa/BIofKKbtatVRngm14uR/6pjdkvLXqlrWdS57bNwv\n7LtpzYVfDHfsl/qRWaEi4jq00PNCRSWjcva8teqswjBg8KlwGtyygpezPbVSWP8Y\nvzWZmVF7fqRBXU78Ah0+pNOhslBXDTvI3xJdN4hQ3H7rLjpD/qxKWq/8o+Qvx6cX\ndNZ3ugH/Pr3BAsqt4JFLXin9AK7PO9GDMH5JXJrUb+hAt2VNIZqpz9VlKA6BA0jN\neWGea+yCZkECAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFOkrF6hsocaIMOjR/K3JBzyXCLJPMA0GCSqGSIb3DQEBCwUAA4IBAQARHgco\nyCxWUqN+HBGewmSB7T4oq6YS2FtU62K+GuWWCTqjl5byLKMXQW8HPDja9TC1My1m\n2r0uDshtUvUjuB/Vfe9jVMTjnPBspHZYo0MRuMPc7owJaahjkqD3l7w9aa8Ci5aC\nYU4Aj71Sc8s7YIxgHn/yIUdCe1yu6cC0+h+Ss9r/Yjr53NNXwjGQlDmH1eHcVQGZ\nmEoVcZO1uWNtRPPsn1gfvKLPjRe5pclXQnGviS5DiH0Du+8QMxQGBJnYz2zSMW7G\nLvd35BNvZkhFzs9xfykhurpkT2TiP2F3ZFn9dwLXMFe41pwrtEYLIWhYi8mUG4Ek\n6aR8M/tqIpChVV39\n-----END CERTIFICATE-----\n"]
  DIFFERENT date:
    0.9.88: 1980-01-01 00:00:00 UTC
    0.9.103: 2024-11-19 00:00:00 UTC
  DIFFERENT required_ruby_version:
    0.9.88: >= 2.3.0
    0.9.103: >= 2.5.0
  DIFFERENT rubygems_version:
    0.9.88: 3.5.5
    0.9.103: 3.5.9
  DIFFERENT version:
    0.9.88: 0.9.88
    0.9.103: 0.9.103
  DIFFERENT files:
    0.9.88->0.9.103:
      * Changed:
            certs/ianks.pem +10/-11
            exe/rb-sys-dock +11/-5
            lib/rb_sys/cargo/metadata.rb +30/-0
            lib/rb_sys/cargo_builder.rb +25/-6
            lib/rb_sys/extensiontask.rb +1/-1
            lib/rb_sys/mkmf.rb +21/-8
            lib/rb_sys/mkmf/config.rb +6/-1
            lib/rb_sys/toolchain_info.rb +7/-0
            lib/rb_sys/toolchain_info/data.rb +1/-1
            lib/rb_sys/version.rb +1/-1

Copy link

gem compare --diff rb_sys 0.9.88 0.9.103

Compared versions: ["0.9.88", "0.9.103"]
  DIFFERENT files:
    0.9.88->0.9.103:
      * Changed:
        certs/ianks.pem
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/certs/ianks.pem	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/certs/ianks.pem	2024-12-16 03:48:44.986726142 +0000
                @@ -2 +2 @@
                -MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQsFADBCMRQwEgYDVQQDDAtpLmtl
                +MIIDODCCAiCgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBCMRQwEgYDVQQDDAtpLmtl
                @@ -4 +4 @@
                -Y29tMB4XDTIzMDQxNDEzMzYxNVoXDTI0MDQxMzEzMzYxNVowQjEUMBIGA1UEAwwL
                +Y29tMB4XDTI0MDQxODA1MzY0N1oXDTI1MDQxODA1MzY0N1owQjEUMBIGA1UEAwwL
                @@ -12,9 +12,8 @@
                -eWGea+yCZkECAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
                -BBYEFOkrF6hsocaIMOjR/K3JBzyXCLJPMCAGA1UdEQQZMBeBFWkua2Vyc2V5bWVy
                -QGdtYWlsLmNvbTAgBgNVHRIEGTAXgRVpLmtlcnNleW1lckBnbWFpbC5jb20wDQYJ
                -KoZIhvcNAQELBQADggEBAMAohCl0cdVlYrJl9viGtzbEyLV/Krn0ZD/LM9d2cIRj
                -WBu7HRkP6AfYVzhZwdgUgDYw67d715kOMpLNGeWQw3QGEHFqbVzRML64jL8IxuTz
                -J8ttZVqM8f4GrHyISJnL92u6iP4WzdbVqx89EFjrrHd14OJXK+ZpdRh0YvnN/vMJ
                -t2EcDweRHkN/MEdrwbH+PbYjELnKcTIEZqcCWTk8pgssGrNyjkMhxGSsSUo9qTz0
                -DIZ6NVmpBvohJVCCCDxQQxFKLXZp1ivoxjN+m7eJSW7yzIz062pH4u8pPNQsiVSb
                -I5rgRPbDr2rAFGXKoQ0+u6CLkRxqrVsITl/OPfZhBQI=
                +eWGea+yCZkECAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
                +BBYEFOkrF6hsocaIMOjR/K3JBzyXCLJPMA0GCSqGSIb3DQEBCwUAA4IBAQARHgco
                +yCxWUqN+HBGewmSB7T4oq6YS2FtU62K+GuWWCTqjl5byLKMXQW8HPDja9TC1My1m
                +2r0uDshtUvUjuB/Vfe9jVMTjnPBspHZYo0MRuMPc7owJaahjkqD3l7w9aa8Ci5aC
                +YU4Aj71Sc8s7YIxgHn/yIUdCe1yu6cC0+h+Ss9r/Yjr53NNXwjGQlDmH1eHcVQGZ
                +mEoVcZO1uWNtRPPsn1gfvKLPjRe5pclXQnGviS5DiH0Du+8QMxQGBJnYz2zSMW7G
                +Lvd35BNvZkhFzs9xfykhurpkT2TiP2F3ZFn9dwLXMFe41pwrtEYLIWhYi8mUG4Ek
                +6aR8M/tqIpChVV39
        exe/rb-sys-dock
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/exe/rb-sys-dock	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/exe/rb-sys-dock	2024-12-16 03:48:44.986726142 +0000
                @@ -21 +21,7 @@
                -  @cargo_metadata ||= RbSys::Cargo::Metadata.new("rb-sys-dock", deps: true)
                +  return @cargo_metadata if defined?(@cargo_metadata)
                +
                +  @cargo_metadata = begin
                +    RbSys::Cargo::Metadata.inferred(deps: true)
                +  rescue
                +    nil
                +  end
                @@ -175 +181 @@
                -  return File.join(ENV["XDG_CACHE_HOME"], "rb-sys-dock") if ENV["XDG_CACHE_HOME"]
                +  return File.join(ENV["XDG_CACHE_HOME"], "rb-sys") if ENV["XDG_CACHE_HOME"]
                @@ -177 +183 @@
                -  File.join(ENV["HOME"], ".cache", "rb-sys-dock")
                +  File.join(ENV["HOME"], ".cache", "rb-sys")
                @@ -362 +368 @@
                -      -v #{working_directory}:#{working_directory} \
                +      -v $(pwd):$(pwd) \
                @@ -424 +430 @@
                -  cargo_version = cargo_metadata.rb_sys_version
                +  cargo_version = cargo_metadata&.rb_sys_version || RbSys::VERSION
        lib/rb_sys/cargo/metadata.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/cargo/metadata.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/cargo/metadata.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -11,0 +12,20 @@
                +      class << self
                +        # Infers the Cargo project's name from the Cargo.toml file.
                +        #
                +        # @return [RbSys::Cargo::Metadata]
                +        def inferred(deps: false)
                +          new(File.read("Cargo.toml").match(/^name = "(.*)"/)[1], deps: deps)
                +        rescue
                +          new(File.basename(Dir.pwd), deps: deps)
                +        end
                +
                +        # Initializes a new Cargo::Metadata instance or infers the Cargo project's name.
                +        #
                +        # @param name [String] the name of the Cargo project
                +        def new_or_inferred(name, deps: false)
                +          new(name, deps: deps).load!
                +        rescue CargoMetadataError
                +          inferred
                +        end
                +      end
                +
                @@ -94,0 +115,2 @@
                +      #
                +      # @return [String]
                @@ -98,0 +121,8 @@
                +      end
                +
                +      # Eagerly run `cargo metadata`, raising a RbSys::CargoCargoMetadataError` if it fails.
                +      #
                +      # @return [RbSys::Cargo::Metadata]
                +      def load!
                +        cargo_metadata
                +        self
        lib/rb_sys/cargo_builder.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/cargo_builder.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/cargo_builder.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -12 +12 @@
                -      :extra_cargo_args
                +      :extra_cargo_args, :config
                @@ -69 +69,5 @@
                -      cmd += ["cargo", "rustc"]
                +      cmd += if config.use_cargo_build
                +        ["cargo", "build"]
                +      else
                +        ["cargo", "rustc"]
                +      end
                @@ -77,3 +81,5 @@
                -      cmd += ["--"]
                -      cmd += [*rustc_args(dest_path)]
                -      cmd += extra_rustc_args
                +      if !config.use_cargo_build
                +        cmd += ["--"]
                +        cmd += [*rustc_args(dest_path)]
                +        cmd += extra_rustc_args
                +      end
                @@ -142,0 +149,9 @@
                +      elsif RUBY_ENGINE == "truffleruby"
                +        dl_flag = "-Wl,-z,lazy"
                +        flags += ["-C", "link-arg=#{dl_flag}"] unless makefile_config("DLDFLAGS")&.include?(dl_flag)
                +        # lazy binding requires RELRO to be off, see https://users.rust-lang.org/t/linux-executable-lazy-loading/65621/2
                +        flags += ["-C", "relro-level=off"]
                +      end
                +
                +      if musl?
                +        flags += ["-C", "target-feature=-crt-static"]
                @@ -331 +346,5 @@
                -      ENV.key?("SOURCE_DATE_EPOCH") && !ENV["RB_SYS_TEST"] == "1"
                +      ENV.key?("SOURCE_DATE_EPOCH") && ENV["RB_SYS_TEST"] != "1"
                +    end
                +
                +    def musl?
                +      RbConfig::CONFIG["target_os"] == "linux-musl" || RbConfig::CONFIG["CC"]&.include?("musl-gcc")
        lib/rb_sys/extensiontask.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/extensiontask.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/extensiontask.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -60 +60 @@
                -      @cargo_metadata ||= Cargo::Metadata.new(@name)
                +      @cargo_metadata ||= Cargo::Metadata.new_or_inferred(@name)
        lib/rb_sys/mkmf.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/mkmf.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/mkmf.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -13,3 +12,0 @@
                -    # @api private
                -    GLOBAL_RUSTFLAGS = ["--cfg=rb_sys_gem"]
                -
                @@ -35 +32 @@
                -    #     r.rustflags = %w[--cfg=foo]
                +    #     r.extra_rustflags = %w[--cfg=foo]
                @@ -56 +53,4 @@
                -      global_rustflags = GLOBAL_RUSTFLAGS.dup
                +
                +      global_rustflags = []
                +      # Re-enable if this causes issues, but it should be fine and it prevents unnecessary recompilation
                +      # global_rustflags << "--cfg=rb_sys_gem" unless builder.use_cargo_build
                @@ -104,0 +105 @@
                +        POSTLINK = #{RbConfig::CONFIG["POSTLINK"] || "$(ECHO) skipping postlink"}
                @@ -134,0 +136 @@
                +        \t$(Q) $(POSTLINK)
                @@ -137,0 +140 @@
                +        \t#{fixup_libnames}
                @@ -167,2 +170,2 @@
                -      args = ARGV.dup
                -      args.shift if args.first == "--"
                +      args = []
                +      args = ARGV.dup.shift if args.first == "--"
                @@ -172 +175,5 @@
                -      cmd.gsub!(/\Acargo rustc/, "$(CARGO) rustc $(RB_SYS_EXTRA_CARGO_ARGS) --manifest-path $(RB_SYS_CARGO_MANIFEST_DIR)/Cargo.toml")
                +      if builder.use_cargo_build
                +        cmd.gsub!(/\Acargo rustc/, "$(CARGO) build $(RB_SYS_EXTRA_CARGO_ARGS) --manifest-path $(RB_SYS_CARGO_MANIFEST_DIR)/Cargo.toml")
                +      else
                +        cmd.gsub!(/\Acargo rustc/, "$(CARGO) rustc $(RB_SYS_EXTRA_CARGO_ARGS) --manifest-path $(RB_SYS_CARGO_MANIFEST_DIR)/Cargo.toml")
                +      end
                @@ -275,0 +283,6 @@
                +    end
                +
                +    def fixup_libnames
                +      return unless find_executable("install_name_tool")
                +
                +      '$(Q) install_name_tool -id "" $(DLLIB)'
        lib/rb_sys/mkmf/config.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/mkmf/config.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/mkmf/config.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -27,0 +28,4 @@
                +      # Instead of the default `cargo rustc` behaviour, just call `cargo build`.
                +      # Requires manually setting relevant rb-sys environment (default: false)
                +      attr_accessor :use_cargo_build
                +
                @@ -29,0 +34 @@
                +        @builder.config = self
                @@ -58 +63 @@
                -        ENV.key?("SOURCE_DATE_EPOCH") && !ENV["RB_SYS_TEST"] == "1"
                +        ENV.key?("SOURCE_DATE_EPOCH") && ENV["RB_SYS_TEST"] != "1"
        lib/rb_sys/toolchain_info.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/toolchain_info.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/toolchain_info.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -30,0 +31,7 @@
                +      # Get all supported toolchain names, as strings.
                +      #
                +      # @return [Array<String>]
                +      def supported_ruby_platforms
                +        supported.map(&:platform)
                +      end
                +
        lib/rb_sys/toolchain_info/data.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/toolchain_info/data.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/toolchain_info/data.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -8 +8 @@
                -    DATA = {"arm-linux" => {"rust-target" => "arm-unknown-linux-gnueabihf", "rake-compiler-dock" => {"cc" => "arm-linux-gnueabihf-gcc"}, "docker-platform" => "linux/arm/v7", "supported" => true}, "aarch64-linux" => {"rust-target" => "aarch64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "aarch64-linux-gnu-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "arm64-darwin" => {"rust-target" => "aarch64-apple-darwin", "rake-compiler-dock" => {"cc" => "aarch64-apple-darwin-clang"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "x64-mingw-ucrt" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x64-mingw32" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86-linux" => {"rust-target" => "i686-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "i686-redhat-linux-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86-mingw32" => {"rust-target" => "i686-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "i686-w64-mingw32-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86_64-darwin" => {"rust-target" => "x86_64-apple-darwin", "rake-compiler-dock" => {"cc" => "x86_64-apple-darwin-clang"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux" => {"rust-target" => "x86_64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "x86_64-redhat-linux-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux-musl" => {"rust-target" => "x86_64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "x86_64-unknown-linux-musl-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}}
                +    DATA = {"arm-linux" => {"rust-target" => "arm-unknown-linux-gnueabihf", "rake-compiler-dock" => {"cc" => "arm-linux-gnueabihf-gcc"}, "docker-platform" => "linux/arm/v7", "supported" => true}, "aarch64-linux" => {"rust-target" => "aarch64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "aarch64-linux-gnu-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "aarch64-linux-musl" => {"rust-target" => "aarch64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "aarch64-linux-musl-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "arm64-darwin" => {"rust-target" => "aarch64-apple-darwin", "rake-compiler-dock" => {"cc" => "aarch64-apple-darwin-clang"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "x64-mingw-ucrt" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x64-mingw32" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86-linux" => {"rust-target" => "i686-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "i686-redhat-linux-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86-mingw32" => {"rust-target" => "i686-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "i686-w64-mingw32-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86_64-darwin" => {"rust-target" => "x86_64-apple-darwin", "rake-compiler-dock" => {"cc" => "x86_64-apple-darwin-clang"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux" => {"rust-target" => "x86_64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "x86_64-redhat-linux-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux-musl" => {"rust-target" => "x86_64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "x86_64-unknown-linux-musl-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}}
        lib/rb_sys/version.rb
                --- /tmp/d20241216-2224-cdojkd/rb_sys-0.9.88/lib/rb_sys/version.rb	2024-12-16 03:48:44.982726190 +0000
                +++ /tmp/d20241216-2224-cdojkd/rb_sys-0.9.103/lib/rb_sys/version.rb	2024-12-16 03:48:44.986726142 +0000
                @@ -4 +4 @@
                -  VERSION = "0.9.88"
                +  VERSION = "0.9.103"

Copy link

gem compare selma 0.2.2 0.4.10

Compared versions: ["0.2.2", "0.4.10"]
  DIFFERENT date:
    0.2.2: 2024-01-11 00:00:00 UTC
    0.4.10: 2024-11-26 00:00:00 UTC
  DIFFERENT require_paths:
    0.2.2: ["/opt/hostedtoolcache/Ruby/3.3.6/x64/lib/ruby/gems/3.3.0/extensions/x86_64-linux/3.3.0/selma-0.2.2", "lib"]
    0.4.10: ["/opt/hostedtoolcache/Ruby/3.3.6/x64/lib/ruby/gems/3.3.0/extensions/x86_64-linux/3.3.0/selma-0.4.10", "lib"]
  DIFFERENT version:
    0.2.2: 0.2.2
    0.4.10: 0.4.10
  DIFFERENT files:
    0.2.2->0.4.10:
      * Added:
            lib/selma/config.rb +12/-0
            lib/selma/html/element.rb +11/-0
      * Changed:
            Cargo.lock +129/-124
            README.md +138/-30
            ext/selma/Cargo.toml +6/-3
            ext/selma/src/html/element.rs +32/-27
            ext/selma/src/html/end_tag.rs +5/-5
            ext/selma/src/html/text_chunk.rs +55/-12
            ext/selma/src/native_ref_wrap.rs +30/-33
            ext/selma/src/rewriter.rs +299/-139
            ext/selma/src/sanitizer.rs +256/-138
            lib/selma/html.rb +2/-0
            lib/selma/sanitizer.rb +0/-77
            lib/selma/sanitizer/config.rb +2/-2
            lib/selma/sanitizer/config/default.rb +1/-1
            lib/selma/sanitizer/config/relaxed.rb +1/-0
            lib/selma/version.rb +1/-1

Copy link

gem compare --diff selma 0.2.2 0.4.10

Diff too large (102549 chars)

Copy link

gem compare zeitwerk 2.6.13 2.7.1

Compared versions: ["2.6.13", "2.7.1"]
  DIFFERENT date:
    2.6.13: 2024-02-06 00:00:00 UTC
    2.7.1: 2024-10-18 00:00:00 UTC
  DIFFERENT required_ruby_version:
    2.6.13: >= 2.5
    2.7.1: >= 3.2
  DIFFERENT rubygems_version:
    2.6.13: 3.5.5
    2.7.1: 3.5.21
  DIFFERENT version:
    2.6.13: 2.6.13
    2.7.1: 2.7.1
  DIFFERENT files:
    2.6.13->2.7.1:
      * Deleted:
            lib/zeitwerk/kernel.rb
      * Added:
            lib/zeitwerk/core_ext/kernel.rb +64/-0
            lib/zeitwerk/core_ext/module.rb +19/-0
            lib/zeitwerk/cref.rb +68/-0
      * Changed:
            README.md +58/-45
            lib/zeitwerk.rb +4/-1
            lib/zeitwerk/explicit_namespace.rb +80/-60
            lib/zeitwerk/gem_loader.rb +1/-2
            lib/zeitwerk/loader.rb +128/-96
            lib/zeitwerk/loader/callbacks.rb +15/-15
            lib/zeitwerk/loader/eager_load.rb +13/-15
            lib/zeitwerk/loader/helpers.rb +23/-64
            lib/zeitwerk/real_mod_name.rb +2/-8
            lib/zeitwerk/registry.rb +5/-2
            lib/zeitwerk/version.rb +1/-1

Copy link

gem compare --diff zeitwerk 2.6.13 2.7.1

Compared versions: ["2.6.13", "2.7.1"]
  DIFFERENT files:
    2.6.13->2.7.1:
      * Deleted:
            lib/zeitwerk/kernel.rb
      * Added:
        lib/zeitwerk/core_ext/kernel.rb
                --- /tmp/20241216-2715-1ufjfp	2024-12-16 03:49:32.178087470 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/core_ext/kernel.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -0,0 +1,64 @@
                +# frozen_string_literal: true
                +
                +module Kernel
                +  module_function
                +
                +  # Zeitwerk's main idea is to define autoloads for project constants, and then
                +  # intercept them when triggered in this thin `Kernel#require` wrapper.
                +  #
                +  # That allows us to complete the circle, invoke callbacks, autovivify modules,
                +  # define autoloads for just autoloaded namespaces, update internal state, etc.
                +  #
                +  # On the other hand, if you publish a new version of a gem that is now managed
                +  # by Zeitwerk, client code can reference directly your classes and modules and
                +  # should not require anything. But if someone has legacy require calls around,
                +  # they will work as expected, and in a compatible way. This feature is by now
                +  # EXPERIMENTAL and UNDOCUMENTED.
                +  alias_method :zeitwerk_original_require, :require
                +  class << self
                +    alias_method :zeitwerk_original_require, :require
                +  end
                +
                +  # @sig (String) -> true | false
                +  def require(path)
                +    if loader = Zeitwerk::Registry.loader_for(path)
                +      if path.end_with?(".rb")
                +        required = zeitwerk_original_require(path)
                +        loader.__on_file_autoloaded(path) if required
                +        required
                +      else
                +        loader.__on_dir_autoloaded(path)
                +        true
                +      end
                +    else
                +      required = zeitwerk_original_require(path)
                +      if required
                +        abspath = $LOADED_FEATURES.last
                +        if loader = Zeitwerk::Registry.loader_for(abspath)
                +          loader.__on_file_autoloaded(abspath)
                +        end
                +      end
                +      required
                +    end
                +  end
                +
                +  # By now, I have seen no way so far to decorate require_relative.
                +  #
                +  # For starters, at least in CRuby, require_relative does not delegate to
                +  # require. Both require and require_relative delegate the bulk of their work
                +  # to an internal C function called rb_require_safe. So, our require wrapper is
                +  # not executed.
                +  #
                +  # On the other hand, we cannot use the aliasing technique above because
                +  # require_relative receives a path relative to the directory of the file in
                +  # which the call is performed. If a wrapper here invoked the original method,
                +  # Ruby would resolve the relative path taking lib/zeitwerk as base directory.
                +  #
                +  # A workaround could be to extract the base directory from caller_locations,
                +  # but what if someone else decorated require_relative before us? You can't
                +  # really know with certainty where's the original call site in the stack.
                +  #
                +  # However, the main use case for require_relative is to load files from your
                +  # own project. Projects managed by Zeitwerk don't do this for files managed by
                +  # Zeitwerk, precisely.
                +end
        lib/zeitwerk/core_ext/module.rb
                --- /tmp/20241216-2715-9i0x1v	2024-12-16 03:49:32.182087418 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/core_ext/module.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -0,0 +1,19 @@
                +# frozen_string_literal: true
                +
                +module Zeitwerk::ConstAdded
                +  def const_added(cname)
                +    if loader = Zeitwerk::ExplicitNamespace.__loader_for(self, cname)
                +      namespace = const_get(cname, false)
                +
                +      unless namespace.is_a?(Module)
                +        cref = Zeitwerk::Cref.new(self, cname)
                +        raise Zeitwerk::Error, "#{cref.path} is expected to be a namespace, should be a class or module (got #{namespace.class})"
                +      end
                +
                +      loader.on_namespace_loaded(namespace)
                +    end
                +    super
                +  end
                +
                +  Module.prepend(self)
                +end
        lib/zeitwerk/cref.rb
                --- /tmp/20241216-2715-v2hz5j	2024-12-16 03:49:32.182087418 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/cref.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -0,0 +1,68 @@
                +# frozen_string_literal: true
                +
                +# This private class encapsulates pairs (mod, cname).
                +#
                +# Objects represent the constant cname in the class or module object mod, and
                +# have API to manage them that encapsulates the constants API. Examples:
                +#
                +#   cref.path
                +#   cref.set(value)
                +#   cref.get
                +#
                +# The constant may or may not exist in mod.
                +class Zeitwerk::Cref
                +  include Zeitwerk::RealModName
                +
                +  # @sig Module
                +  attr_reader :mod
                +
                +  # @sig Symbol
                +  attr_reader :cname
                +
                +  # The type of the first argument is Module because Class < Module, class
                +  # objects are also valid.
                +  #
                +  # @sig (Module, Symbol) -> void
                +  def initialize(mod, cname)
                +    @mod   = mod
                +    @cname = cname
                +    @path  = nil
                +  end
                +
                +  # @sig () -> String
                +  def path
                +    @path ||= Object.equal?(@mod) ? @cname.name : "#{real_mod_name(@mod)}::#{@cname.name}".freeze
                +  end
                +
                +  # @sig () -> String?
                +  def autoload?
                +    @mod.autoload?(@cname, false)
                +  end
                +
                +  # @sig (String) -> bool
                +  def autoload(abspath)
                +    @mod.autoload(@cname, abspath)
                +  end
                +
                +  # @sig () -> bool
                +  def defined?
                +    @mod.const_defined?(@cname, false)
                +  end
                +
                +  # @sig (Object) -> Object
                +  def set(value)
                +    @mod.const_set(@cname, value)
                +  end
                +
                +  # @raise [NameError]
                +  # @sig () -> Object
                +  def get
                +    @mod.const_get(@cname, false)
                +  end
                +
                +  # @raise [NameError]
                +  # @sig () -> void
                +  def remove
                +    @mod.__send__(:remove_const, @cname)
                +  end
                +end
      * Changed:
        README.md
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/README.md	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/README.md	2024-12-16 03:49:32.174087524 +0000
                @@ -57 +56,0 @@
                -  - [Edge cases](#edge-cases)
                @@ -62,0 +62 @@
                +    - [`Zeitwerk::Loader#all_expected_cpaths`](#zeitwerkloaderall_expected_cpaths)
                @@ -65 +64,0 @@
                -  - [Debuggers](#debuggers)
                @@ -262 +261 @@
                -To trigger this behavior, the directory must contain non-ignored Ruby files with the `.rb` extension, either directly or recursively. Otherwise, the directory is ignored. This condition is reevaluated during reloads.
                +To trigger this behavior, the directory must contain non-ignored Ruby files with the ".rb" extension, either directly or recursively. Otherwise, the directory is ignored. This condition is reevaluated during reloads.
                @@ -284,0 +284,2 @@
                +When autoloaded, Zeitwerk verifies the expected constant (`Hotel` in the example) stores a class or module object. If it doesn't, `Zeitwerk::Error` is raised.
                +
                @@ -1067 +1068 @@
                -There is an edge case related to nested root directories. Conceptually, root directories are independent source trees. If you ignore a parent of a nested root directory, the nested root directory is not affected. You need to ignore it explictly if you want it ignored too.
                +There is an edge case related to nested root directories. Conceptually, root directories are independent source trees. If you ignore a parent of a nested root directory, the nested root directory is not affected. You need to ignore it explicitly if you want it ignored too.
                @@ -1180,30 +1180,0 @@
                -<a id="markdown-edge-cases" name="edge-cases"></a>
                -### Edge cases
                -
                -[Explicit namespaces](#explicit-namespaces) like `Trip` here:
                -
                -```ruby
                -# trip.rb
                -class Trip
                -  include Geolocation
                -end
                -
                -# trip/geolocation.rb
                -module Trip::Geolocation
                -  ...
                -end
                -```
                -
                -have to be defined with the `class`/`module` keywords, as in the example above.
                -
                -For technical reasons, raw constant assignment is not supported:
                -
                -```ruby
                -# trip.rb
                -Trip = Class { ...}        # NOT SUPPORTED
                -Trip = Struct.new { ... }  # NOT SUPPORTED
                -Trip = Data.define { ... } # NOT SUPPORTED
                -```
                -
                -This only affects explicit namespaces, those idioms work well for any other ordinary class or module.
                -
                @@ -1332,0 +1304,48 @@
                +`Zeitwerk::Loader#cpath_expected_at` is designed to be used with individual paths. If you want to know all the expected constant paths in the project, please use `Zeitwerk::Loader#all_expected_cpaths`, documented next.
                +
                +<a id="markdown-zeitwerkloaderall_expected_cpaths" name="zeitwerkloaderall_expected_cpaths"></a>
                +#### `Zeitwerk::Loader#all_expected_cpaths`
                +
                +The method `Zeitwerk::Loader#all_expected_cpaths` returns a hash that maps the absolute paths of the files and directories managed by the receiver to their expected constant paths.
                +
                +Ignored files, hidden files, and files whose extension is not ".rb" are not included in the result. Same for directories, hidden or ignored directories are not included in the result. Additionally, directories that contain no files with extension ".rb" (recursively) are also excluded, since those are not considered to represent Ruby namespaces.
                +
                +For example, if `lib` is the root directory of a gem with the following contents:
                +
                +```
                +lib/.DS_Store
                +lib/my_gem.rb
                +lib/my_gem/version.rb
                +lib/my_gem/ignored.rb
                +lib/my_gem/drivers/unix.rb
                +lib/my_gem/drivers/windows.rb
                +lib/my_gem/collapsed/foo.rb
                +lib/tasks/my_gem.rake
                +```
                +
                +`Zeitwerk::Loader#all_expected_cpaths` would return (maybe in a different order):
                +
                +```ruby
                +{
                +  "/.../lib"                           => "Object",
                +  "/.../lib/my_gem.rb"                 => "MyGem",
                +  "/.../lib/my_gem"                    => "MyGem",
                +  "/.../lib/my_gem/version.rb"         => "MyGem::VERSION",
                +  "/.../lib/my_gem/drivers"            => "MyGem::Drivers",
                +  "/.../lib/my_gem/drivers/unix.rb"    => "MyGem::Drivers::Unix",
                +  "/.../lib/my_gem/drivers/windows.rb" => "MyGem::Drivers::Windows",
                +  "/.../lib/my_gem/collapsed"          => "MyGem"
                +  "/.../lib/my_gem/collapsed/foo.rb"   => "MyGem::Foo"
                +}
                +```
                +
                +In the previous example we assume `lib/my_gem/ignored.rb` is ignored, and therefore it is not present in the returned hash. Also, `lib/my_gem/collapsed` is a collapsed directory, so the expected namespace at that level is still `MyGem` (this is an edge case).
                +
                +The file `lib/.DS_Store` is hidden, hence excluded. The directory `lib/tasks` is also not present because it contains no files with extension ".rb".
                +
                +Directory paths do not have trailing slashes.
                +
                +The order of the hash entries is undefined.
                +
                +This method does not parse or execute file contents and does not guarantee files define the corresponding constant paths. It just says which are the _expected_ ones.
                +
                @@ -1360,9 +1378,0 @@
                -<a id="markdown-debuggers" name="debuggers"></a>
                -### Debuggers
                -
                -Zeitwerk and [debug.rb](https://github.com/ruby/debug) are fully compatible if CRuby is ≥ 3.1 (see [ruby/debug#558](https://github.com/ruby/debug/pull/558)).
                -
                -[Byebug](https://github.com/deivid-rodriguez/byebug) is compatible except for an edge case explained in [deivid-rodriguez/byebug#564](https://github.com/deivid-rodriguez/byebug/issues/564). Prior to CRuby 3.1, `debug.rb` has a similar edge incompatibility.
                -
                -[Break](https://github.com/gsamokovarov/break) is fully compatible.
                -
                @@ -1377 +1387 @@
                -Zeitwerk works with CRuby 2.5 and above.
                +Starting with version 2.7, Zeitwerk requires Ruby 3.2 or newer.
                @@ -1379 +1389,4 @@
                -On TruffleRuby all is good except for thread-safety. Right now, in TruffleRuby `Module#autoload` does not block threads accessing a constant that is being autoloaded. CRuby prevents such access to avoid concurrent threads from seeing partial evaluations of the corresponding file. Zeitwerk inherits autoloading thread-safety from this property. This is not an issue if your project gets eager loaded, or if you lazy load in single-threaded environments. (See https://github.com/oracle/truffleruby/issues/2431.)
                +Zeitwerk 2.7 requires TruffleRuby 24.1.2+ due to https://github.com/oracle/truffleruby/issues/3683.
                +Alternatively, TruffleRuby users can use a `< 2.7` version constraint for the `zeitwerk` gem.
                +As of this writing, [autoloading is not fully thread-safe yet on TruffleRuby](https://github.com/oracle/truffleruby/issues/2431).
                +If your program is multi-threaded, you need to eager load before threads are created.
        lib/zeitwerk.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk.rb	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -5,0 +6 @@
                +  require_relative "zeitwerk/cref"
                @@ -13 +13,0 @@
                -  require_relative "zeitwerk/kernel"
                @@ -15,0 +16,3 @@
                +
                +  require_relative "zeitwerk/core_ext/kernel"
                +  require_relative "zeitwerk/core_ext/module"
        lib/zeitwerk/explicit_namespace.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/explicit_namespace.rb	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/explicit_namespace.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -4,3 +4,11 @@
                -  # Centralizes the logic for the trace point used to detect the creation of
                -  # explicit namespaces, needed to descend into matching subdirectories right
                -  # after the constant has been defined.
                +  # This module is essentially a registry for explicit namespaces.
                +  #
                +  # When a loader determines that a certain file should define an explicit
                +  # namespace, it registers it here, associating its cref with itself.
                +  #
                +  # If the namespace is autoloaded, our const_added callback retrieves its
                +  # loader by calling loader_for. That way, the loader is able to scan the
                +  # subdirectories that conform the namespace and set autoloads for their
                +  # expected constants just in time.
                +  #
                +  # Once autoloaded, the namespace is unregistered.
                @@ -11,0 +20,20 @@
                +    # Maps cnames or cpaths of explicit namespaces with their corresponding
                +    # loader. They are symbols for top-level ones, and strings for nested ones:
                +    #
                +    #   {
                +    #     :Admin => #<Zeitwerk::Loader:...>,
                +    #     "Hotel::Pricing" => #<Zeitwerk::Loader:...>
                +    #   }
                +    #
                +    # There are two types of keys to make loader_for as fast as possible, since
                +    # it is invoked by our const_added for all autoloads and constant actually
                +    # added. Globally. With this trick, for top-level constants we do not need
                +    # to call Symbol#name and perform a string lookup. Instead, we can directly
                +    # perform a fast symbol lookup.
                +    #
                +    # Entries are added as the namespaces are found, and removed as they are
                +    # autoloaded.
                +    #
                +    # @sig Hash[(Symbol | String) => Zeitwerk::Loader]
                +    @loaders = {}
                +
                @@ -16,17 +44,2 @@
                -      # Maps constant paths that correspond to explicit namespaces according to
                -      # the file system, to the loader responsible for them.
                -      #
                -      # @sig Hash[String, Zeitwerk::Loader]
                -      attr_reader :cpaths
                -      private :cpaths
                -
                -      # @sig Mutex
                -      attr_reader :mutex
                -      private :mutex
                -
                -      # @sig TracePoint
                -      attr_reader :tracer
                -      private :tracer
                -
                -      # Asserts `cpath` corresponds to an explicit namespace for which `loader`
                -      # is responsible.
                +      # Registers `cref` as being the constant path of an explicit namespace
                +      # managed by `loader`.
                @@ -35,6 +48,14 @@
                -      internal def register(cpath, loader)
                -        mutex.synchronize do
                -          cpaths[cpath] = loader
                -          # We check enabled? because, looking at the C source code, enabling an
                -          # enabled tracer does not seem to be a simple no-op.
                -          tracer.enable unless tracer.enabled?
                +      internal def register(cref, loader)
                +        if Object.equal?(cref.mod)
                +          @loaders[cref.cname] = loader
                +        else
                +          @loaders[cref.path] = loader
                +        end
                +      end
                +
                +      # @sig (Module, Symbol) -> Zeitwerk::Loader?
                +      internal def loader_for(mod, cname)
                +        if Object.equal?(mod)
                +          @loaders.delete(cname)
                +        else
                +          @loaders.delete("#{real_mod_name(mod)}::#{cname}")
                @@ -46,2 +67 @@
                -        cpaths.delete_if { |_cpath, l| l == loader }
                -        disable_tracer_if_unneeded
                +        @loaders.delete_if { _2.equal?(loader) }
                @@ -52,3 +72,3 @@
                -      # @sig (String) -> bool
                -      internal def registered?(cpath)
                -        cpaths.key?(cpath)
                +      # @sig (String) -> Zeitwerk::Loader?
                +      internal def registered?(cname_or_cpath)
                +        @loaders[cname_or_cpath]
                @@ -56,0 +77,2 @@
                +      # This is an internal method only used by the test suite.
                +      #
                @@ -58,4 +80,2 @@
                -      private def disable_tracer_if_unneeded
                -        mutex.synchronize do
                -          tracer.disable if cpaths.empty?
                -        end
                +      internal def clear
                +        @loaders.clear
                @@ -64,18 +84,19 @@
                -      # @sig (TracePoint) -> void
                -      private def tracepoint_class_callback(event)
                -        # If the class is a singleton class, we won't do anything with it so we
                -        # can bail out immediately. This is several orders of magnitude faster
                -        # than accessing its name.
                -        return if event.self.singleton_class?
                -
                -        # It might be tempting to return if name.nil?, to avoid the computation
                -        # of a hash code and delete call. But Ruby does not trigger the :class
                -        # event on Class.new or Module.new, so that would incur in an extra call
                -        # for nothing.
                -        #
                -        # On the other hand, if we were called, cpaths is not empty. Otherwise
                -        # the tracer is disabled. So we do need to go ahead with the hash code
                -        # computation and delete call.
                -        if loader = cpaths.delete(real_mod_name(event.self))
                -          loader.on_namespace_loaded(event.self)
                -          disable_tracer_if_unneeded
                +      module Synchronized
                +        extend Internal
                +
                +        MUTEX = Mutex.new
                +
                +        internal def register(...)
                +          MUTEX.synchronize { super }
                +        end
                +
                +        internal def loader_for(...)
                +          MUTEX.synchronize { super }
                +        end
                +
                +        internal def unregister_loader(...)
                +          MUTEX.synchronize { super }
                +        end
                +
                +        internal def registered?(...)
                +          MUTEX.synchronize { super }
                @@ -83,2 +103,0 @@
                -      end
                -    end
                @@ -86,2 +105,4 @@
                -    @cpaths = {}
                -    @mutex  = Mutex.new
                +        internal def clear
                +          MUTEX.synchronize { super }
                +        end
                +      end
                @@ -89,3 +110,2 @@
                -    # We go through a method instead of defining a block mainly to have a better
                -    # label when profiling.
                -    @tracer = TracePoint.new(:class, &method(:tracepoint_class_callback))
                +      prepend Synchronized unless RUBY_ENGINE == "ruby"
                +    end
        lib/zeitwerk/gem_loader.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/gem_loader.rb	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/gem_loader.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -45 +45 @@
                -      ls(@root_dir) do |basename, abspath|
                +      ls(@root_dir) do |basename, abspath, ftype|
                @@ -51 +50,0 @@
                -        ftype = dir?(abspath) ? "directory" : "file"
        lib/zeitwerk/loader.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/loader.rb	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/loader.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -25,2 +25 @@
                -    # executed--- to their corresponding parent class or module and constant
                -    # name.
                +    # executed--- to their corresponding Zeitwerk::Cref object.
                @@ -28,2 +27,2 @@
                -    #   "/Users/fxn/blog/app/models/user.rb"          => [Object, :User],
                -    #   "/Users/fxn/blog/app/models/hotel/pricing.rb" => [Hotel, :Pricing]
                +    #   "/Users/fxn/blog/app/models/user.rb"          => #<Zeitwerk::Cref:... @mod=Object, @cname=:User, ...>,
                +    #   "/Users/fxn/blog/app/models/hotel/pricing.rb" => #<Zeitwerk::Cref:... @mod=Hotel, @cname=:Pricing, ...>,
                @@ -32 +31 @@
                -    # @sig Hash[String, [Module, Symbol]]
                +    # @sig Hash[String, Zeitwerk::Cref]
                @@ -48 +47,4 @@
                -    #   "Admin::Role" => [".../admin/role.rb", [Admin, :Role]]
                +    #   "Admin::Role" => [
                +    #     ".../admin/role.rb",
                +    #     #<Zeitwerk::Cref:... @mod=Admin, @cname=:Role, ...>
                +    #   ]
                @@ -52,2 +54 @@
                -    # pair [Module, Symbol] is used to remove_const the constant from the class
                -    # or module object.
                +    # cref is used to remove the constant from the parent class or module.
                @@ -58 +59 @@
                -    # @sig Hash[String, [String, [Module, Symbol]]]
                +    # @sig Hash[String, [String, Zeitwerk::Cref]]
                @@ -157,3 +158,3 @@
                -        autoloads.each do |abspath, (parent, cname)|
                -          if parent.autoload?(cname)
                -            unload_autoload(parent, cname)
                +        autoloads.each do |abspath, cref|
                +          if cref.autoload?
                +            unload_autoload(cref)
                @@ -164 +165 @@
                -            unload_cref(parent, cname)
                +            unload_cref(cref)
                @@ -169 +170 @@
                -        to_unload.each do |cpath, (abspath, (parent, cname))|
                +        to_unload.each do |cpath, (abspath, cref)|
                @@ -172 +173 @@
                -              value = cget(parent, cname)
                +              value = cref.get
                @@ -182 +183 @@
                -          unload_cref(parent, cname)
                +          unload_cref(cref)
                @@ -233,3 +234,6 @@
                -  # @sig (String | Pathname) -> String?
                -  def cpath_expected_at(path)
                -    abspath = File.expand_path(path)
                +    # Returns a hash that maps the absolute paths of the managed files and
                +    # directories to their respective expected constant paths.
                +    #
                +    # @sig () -> Hash[String, String]
                +    def all_expected_cpaths
                +      result = {}
                @@ -237 +241,2 @@
                -    raise Zeitwerk::Error.new("#{abspath} does not exist") unless File.exist?(abspath)
                +      actual_roots.each do |root_dir, root_namespace|
                +        queue = [[root_dir, real_mod_name(root_namespace)]]
                @@ -239,2 +244,2 @@
                -    return unless dir?(abspath) || ruby?(abspath)
                -    return if ignored_path?(abspath)
                +        while (dir, cpath = queue.shift)
                +          result[dir] = cpath
                @@ -242 +247 @@
                -    paths = []
                +          prefix = cpath == "Object" ? "" : cpath + "::"
                @@ -244,3 +249,14 @@
                -    if ruby?(abspath)
                -      basename = File.basename(abspath, ".rb")
                -      return if hidden?(basename)
                +          ls(dir) do |basename, abspath, ftype|
                +            if ftype == :file
                +              basename.delete_suffix!(".rb")
                +              result[abspath] = prefix + inflector.camelize(basename, abspath)
                +            else
                +              if collapse?(abspath)
                +                queue << [abspath, cpath]
                +              else
                +                queue << [abspath, prefix + inflector.camelize(basename, abspath)]
                +              end
                +            end
                +          end
                +        end
                +      end
                @@ -248,4 +264 @@
                -      paths << [basename, abspath]
                -      walk_up_from = File.dirname(abspath)
                -    else
                -      walk_up_from = abspath
                +      result
                @@ -254 +267,3 @@
                -    root_namespace = nil
                +    # @sig (String | Pathname) -> String?
                +    def cpath_expected_at(path)
                +      abspath = File.expand_path(path)
                @@ -256,3 +271 @@
                -    walk_up(walk_up_from) do |dir|
                -      break if root_namespace = roots[dir]
                -      return if ignored_path?(dir)
                +      raise Zeitwerk::Error.new("#{abspath} does not exist") unless File.exist?(abspath)
                @@ -260,2 +273,2 @@
                -      basename = File.basename(dir)
                -      return if hidden?(basename)
                +      return unless dir?(abspath) || ruby?(abspath)
                +      return if ignored_path?(abspath)
                @@ -263,2 +276 @@
                -      paths << [basename, abspath] unless collapse?(dir)
                -    end
                +      paths = []
                @@ -266 +278,3 @@
                -    return unless root_namespace
                +      if ruby?(abspath)
                +        basename = File.basename(abspath, ".rb")
                +        return if hidden?(basename)
                @@ -268,4 +282,17 @@
                -    if paths.empty?
                -      real_mod_name(root_namespace)
                -    else
                -      cnames = paths.reverse_each.map { |b, a| cname_for(b, a) }
                +        paths << [basename, abspath]
                +        walk_up_from = File.dirname(abspath)
                +      else
                +        walk_up_from = abspath
                +      end
                +
                +      root_namespace = nil
                +
                +      walk_up(walk_up_from) do |dir|
                +        break if root_namespace = roots[dir]
                +        return if ignored_path?(dir)
                +
                +        basename = File.basename(dir)
                +        return if hidden?(basename)
                +
                +        paths << [basename, abspath] unless collapse?(dir)
                +      end
                @@ -273,2 +300,4 @@
                -      if root_namespace == Object
                -        cnames.join("::")
                +      return unless root_namespace
                +
                +      if paths.empty?
                +        real_mod_name(root_namespace)
                @@ -276 +305,7 @@
                -        "#{real_mod_name(root_namespace)}::#{cnames.join("::")}"
                +        cnames = paths.reverse_each.map { |b, a| cname_for(b, a) }
                +
                +        if root_namespace == Object
                +          cnames.join("::")
                +        else
                +          "#{real_mod_name(root_namespace)}::#{cnames.join("::")}"
                +        end
                @@ -279 +313,0 @@
                -  end
                @@ -411,2 +445,2 @@
                -      ls(dir) do |basename, abspath|
                -        if ruby?(basename)
                +      ls(dir) do |basename, abspath, ftype|
                +        if ftype == :file
                @@ -414 +448,2 @@
                -          autoload_file(parent, cname_for(basename, abspath), abspath)
                +          cref = Cref.new(parent, cname_for(basename, abspath))
                +          autoload_file(cref, abspath)
                @@ -419 +454,2 @@
                -            autoload_subdir(parent, cname_for(basename, abspath), abspath)
                +            cref = Cref.new(parent, cname_for(basename, abspath))
                +            autoload_subdir(cref, abspath)
                @@ -426,3 +462,2 @@
                -    private def autoload_subdir(parent, cname, subdir)
                -      if autoload_path = autoload_path_set_by_me_for?(parent, cname)
                -        cpath = cpath(parent, cname)
                +    private def autoload_subdir(cref, subdir)
                +      if autoload_path = autoload_path_set_by_me_for?(cref)
                @@ -437 +472 @@
                -          register_explicit_namespace(cpath)
                +          register_explicit_namespace(cref)
                @@ -442,2 +477,2 @@
                -        namespace_dirs[cpath] << subdir
                -      elsif !cdef?(parent, cname)
                +        namespace_dirs[cref.path] << subdir
                +      elsif !cref.defined?
                @@ -445,2 +480,2 @@
                -        namespace_dirs[cpath(parent, cname)] << subdir
                -        define_autoload(parent, cname, subdir)
                +        namespace_dirs[cref.path] << subdir
                +        define_autoload(cref, subdir)
                @@ -450,2 +485,2 @@
                -        log("the namespace #{cpath(parent, cname)} already exists, descending into #{subdir}") if logger
                -        define_autoloads_for_dir(subdir, cget(parent, cname))
                +        log("the namespace #{cref.path} already exists, descending into #{subdir}") if logger
                +        define_autoloads_for_dir(subdir, cref.get)
                @@ -456,2 +491,2 @@
                -    private def autoload_file(parent, cname, file)
                -      if autoload_path = strict_autoload_path(parent, cname) || Registry.inception?(cpath(parent, cname))
                +    private def autoload_file(cref, file)
                +      if autoload_path = cref.autoload? || Registry.inception?(cref.path)
                @@ -463,6 +498 @@
                -          promote_namespace_from_implicit_to_explicit(
                -            dir:    autoload_path,
                -            file:   file,
                -            parent: parent,
                -            cname:  cname
                -          )
                +          promote_namespace_from_implicit_to_explicit(dir: autoload_path, file: file, cref: cref)
                @@ -470 +500 @@
                -      elsif cdef?(parent, cname)
                +      elsif cref.defined?
                @@ -472 +502 @@
                -        log("file #{file} is ignored because #{cpath(parent, cname)} is already defined") if logger
                +        log("file #{file} is ignored because #{cref.path} is already defined") if logger
                @@ -474 +504 @@
                -        define_autoload(parent, cname, file)
                +        define_autoload(cref, file)
                @@ -481,2 +511,2 @@
                -    # @sig (dir: String, file: String, parent: Module, cname: Symbol) -> void
                -    private def promote_namespace_from_implicit_to_explicit(dir:, file:, parent:, cname:)
                +    # @sig (dir: String, file: String, cref: Zeitwerk::Cref) -> void
                +    private def promote_namespace_from_implicit_to_explicit(dir:, file:, cref:)
                @@ -486 +516 @@
                -      log("earlier autoload for #{cpath(parent, cname)} discarded, it is actually an explicit namespace defined in #{file}") if logger
                +      log("earlier autoload for #{cref.path} discarded, it is actually an explicit namespace defined in #{file}") if logger
                @@ -488,2 +518,4 @@
                -      define_autoload(parent, cname, file)
                -      register_explicit_namespace(cpath(parent, cname))
                +      # Order matters: When Module#const_added is triggered by the autoload, we
                +      # don't want the namespace to be registered yet.
                +      define_autoload(cref, file)
                +      register_explicit_namespace(cref)
                @@ -493,2 +525,2 @@
                -    private def define_autoload(parent, cname, abspath)
                -      parent.autoload(cname, abspath)
                +    private def define_autoload(cref, abspath)
                +      cref.autoload(abspath)
                @@ -498 +530 @@
                -          log("autoload set for #{cpath(parent, cname)}, to be loaded from #{abspath}")
                +          log("autoload set for #{cref.path}, to be loaded from #{abspath}")
                @@ -500 +532 @@
                -          log("autoload set for #{cpath(parent, cname)}, to be autovivified from #{abspath}")
                +          log("autoload set for #{cref.path}, to be autovivified from #{abspath}")
                @@ -504 +536 @@
                -      autoloads[abspath] = [parent, cname]
                +      autoloads[abspath] = cref
                @@ -508,2 +540,2 @@
                -      unless parent.autoload?(cname)
                -        Registry.register_inception(cpath(parent, cname), abspath, self)
                +      unless cref.autoload?
                +        Registry.register_inception(cref.path, abspath, self)
                @@ -514,2 +546,2 @@
                -    private def autoload_path_set_by_me_for?(parent, cname)
                -      if autoload_path = strict_autoload_path(parent, cname)
                +    private def autoload_path_set_by_me_for?(cref)
                +      if autoload_path = cref.autoload?
                @@ -518 +550 @@
                -        Registry.inception?(cpath(parent, cname))
                +        Registry.inception?(cref.path, self)
                @@ -522,3 +554,3 @@
                -    # @sig (String) -> void
                -    private def register_explicit_namespace(cpath)
                -      ExplicitNamespace.__register(cpath, self)
                +    # @sig (Zeitwerk::Cref) -> void
                +    private def register_explicit_namespace(cref)
                +      ExplicitNamespace.__register(cref, self)
                @@ -559,3 +591,3 @@
                -    private def unload_autoload(parent, cname)
                -      crem(parent, cname)
                -      log("autoload for #{cpath(parent, cname)} removed") if logger
                +    private def unload_autoload(cref)
                +      cref.remove
                +      log("autoload for #{cref.path} removed") if logger
                @@ -565 +597 @@
                -    private def unload_cref(parent, cname)
                +    private def unload_cref(cref)
                @@ -568 +600 @@
                -      crem(parent, cname)
                +      cref.remove
                @@ -573 +605 @@
                -      log("#{cpath(parent, cname)} unloaded") if logger
                +      log("#{cref.path} unloaded") if logger
        lib/zeitwerk/loader/callbacks.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/loader/callbacks.rb	2024-12-16 03:49:32.170087577 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/loader/callbacks.rb	2024-12-16 03:49:32.174087524 +0000
                @@ -8,0 +9 @@
                +  # @raise [Zeitwerk::NameError]
                @@ -11,2 +12 @@
                -    cref  = autoloads.delete(file)
                -    cpath = cpath(*cref)
                +    cref = autoloads.delete(file)
                @@ -16,4 +16,4 @@
                -    if cdef?(*cref)
                -      log("constant #{cpath} loaded from file #{file}") if logger
                -      to_unload[cpath] = [file, cref] if reloading_enabled?
                -      run_on_load_callbacks(cpath, cget(*cref), file) unless on_load_callbacks.empty?
                +    if cref.defined?
                +      log("constant #{cref.path} loaded from file #{file}") if logger
                +      to_unload[cref.path] = [file, cref] if reloading_enabled?
                +      run_on_load_callbacks(cref.path, cref.get, file) unless on_load_callbacks.empty?
                @@ -21 +21 @@
                -      msg = "expected file #{file} to define constant #{cpath}, but didn't"
                +      msg = "expected file #{file} to define constant #{cref.path}, but didn't"
                @@ -26 +26 @@
                -      crem(*cref)
                +      cref.remove
                @@ -31 +31 @@
                -      to_unload[cpath] = [file, cref] if reloading_enabled?
                +      to_unload[cref.path] = [file, cref] if reloading_enabled?
                @@ -33 +33 @@
                -      raise Zeitwerk::NameError.new(msg, cref.last)
                +      raise Zeitwerk::NameError.new(msg, cref.cname)
                @@ -56,2 +56,2 @@
                -        autovivified_module = cref[0].const_set(cref[1], Module.new)
                -        cpath = autovivified_module.name
                +        implicit_namespace = cref.set(Module.new)
                +        cpath = implicit_namespace.name
                @@ -68 +68 @@
                -        on_namespace_loaded(autovivified_module)
                +        on_namespace_loaded(implicit_namespace)
                @@ -70 +70 @@
                -        run_on_load_callbacks(cpath, autovivified_module, dir) unless on_load_callbacks.empty?
                +        run_on_load_callbacks(cpath, implicit_namespace, dir) unless on_load_callbacks.empty?
                @@ -76 +76 @@
                -  # tracer or from module autovivification. If the namespace has matching
                +  # const_added or from module autovivification. If the namespace has matching
        lib/zeitwerk/loader/eager_load.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/loader/eager_load.rb	2024-12-16 03:49:32.174087524 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb	2024-12-16 03:49:32.178087470 +0000
                @@ -64,2 +64,2 @@
                -      return unless cdef?(namespace, cname)
                -      namespace = cget(namespace, cname)
                +      return unless namespace.const_defined?(cname, false)
                +      namespace = namespace.const_get(cname, false)
                @@ -87 +87 @@
                -      if mod.equal?(Object)
                +      if Object.equal?(mod)
                @@ -148 +148 @@
                -      namespace = cget(namespace, cname)
                +      namespace = namespace.const_get(cname, false)
                @@ -153 +153 @@
                -    cget(namespace, base_cname)
                +    namespace.const_get(base_cname, false)
                @@ -167,4 +167,2 @@
                -    while to_eager_load = queue.shift
                -      dir, namespace = to_eager_load
                -
                -      ls(dir) do |basename, abspath|
                +    while (current_dir, namespace = queue.shift)
                +      ls(current_dir) do |basename, abspath, ftype|
                @@ -173 +171 @@
                -        if ruby?(abspath)
                +        if ftype == :file
                @@ -175 +173 @@
                -            cget(*cref)
                +            cref.get
                @@ -182 +180 @@
                -            queue << [abspath, cget(namespace, cname)]
                +            queue << [abspath, namespace.const_get(cname, false)]
                @@ -212,3 +210,3 @@
                -      while dir = dirs.shift
                -        ls(dir) do |basename, abspath|
                -          next unless dir?(abspath)
                +      while (dir = dirs.shift)
                +        ls(dir) do |basename, abspath, ftype|
                +          next unless ftype == :directory
        lib/zeitwerk/loader/helpers.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/loader/helpers.rb	2024-12-16 03:49:32.174087524 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/loader/helpers.rb	2024-12-16 03:49:32.178087470 +0000
                @@ -33 +33,7 @@
                -        next if !has_at_least_one_ruby_file?(abspath)
                +
                +        if !has_at_least_one_ruby_file?(abspath)
                +          log("directory #{abspath} is ignored because it has no Ruby files") if logger
                +          next
                +        end
                +
                +        ftype = :directory
                @@ -35,0 +42 @@
                +        ftype = :file
                @@ -40 +47 @@
                -      yield basename, abspath.freeze
                +      yield basename, abspath.freeze, ftype
                @@ -43,0 +51,4 @@
                +  # Looks for a Ruby file using breadth-first search. This type of search is
                +  # important to list as less directories as possible and return fast in the
                +  # common case in which there are Ruby files.
                +  #
                @@ -48,2 +59,7 @@
                -    while dir = to_visit.shift
                -      ls(dir) do |_basename, abspath|
                +    while (dir = to_visit.shift)
                +      Dir.each_child(dir) do |basename|
                +        next if hidden?(basename)
                +
                +        abspath = File.join(dir, basename)
                +        next if ignored_path?(abspath)
                +
                @@ -51 +67 @@
                -          to_visit << abspath
                +          to_visit << abspath unless roots.key?(abspath)
                @@ -53 +69 @@
                -          return true
                +          return true if ruby?(abspath)
                @@ -85,58 +101 @@
                -  # --- Constants ---------------------------------------------------------------------------------
                -
                -  # The autoload? predicate takes into account the ancestor chain of the
                -  # receiver, like const_defined? and other methods in the constants API do.
                -  #
                -  # For example, given
                -  #
                -  #   class A
                -  #     autoload :X, "x.rb"
                -  #   end
                -  #
                -  #   class B < A
                -  #   end
                -  #
                -  # B.autoload?(:X) returns "x.rb".
                -  #
                -  # We need a way to strictly check in parent ignoring ancestors.
                -  #
                -  # @sig (Module, Symbol) -> String?
                -  if method(:autoload?).arity == 1
                -    private def strict_autoload_path(parent, cname)
                -      parent.autoload?(cname) if cdef?(parent, cname)
                -    end
                -  else
                -    private def strict_autoload_path(parent, cname)
                -      parent.autoload?(cname, false)
                -    end
                -  end
                -
                -  # @sig (Module, Symbol) -> String
                -  if Symbol.method_defined?(:name)
                -    # Symbol#name was introduced in Ruby 3.0. It returns always the same
                -    # frozen object, so we may save a few string allocations.
                -    private def cpath(parent, cname)
                -      Object == parent ? cname.name : "#{real_mod_name(parent)}::#{cname.name}"
                -    end
                -  else
                -    private def cpath(parent, cname)
                -      Object == parent ? cname.to_s : "#{real_mod_name(parent)}::#{cname}"
                -    end
                -  end
                -
                -  # @sig (Module, Symbol) -> bool
                -  private def cdef?(parent, cname)
                -    parent.const_defined?(cname, false)
                -  end
                -
                -  # @raise [NameError]
                -  # @sig (Module, Symbol) -> Object
                -  private def cget(parent, cname)
                -    parent.const_get(cname, false)
                -  end
                -
                -  # @raise [NameError]
                -  # @sig (Module, Symbol) -> Object
                -  private def crem(parent, cname)
                -    parent.__send__(:remove_const, cname)
                -  end
                +  # --- Inflection --------------------------------------------------------------------------------
        lib/zeitwerk/real_mod_name.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/real_mod_name.rb	2024-12-16 03:49:32.174087524 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/real_mod_name.rb	2024-12-16 03:49:32.178087470 +0000
                @@ -13,8 +13,2 @@
                -  if UnboundMethod.method_defined?(:bind_call)
                -    def real_mod_name(mod)
                -      UNBOUND_METHOD_MODULE_NAME.bind_call(mod)
                -    end
                -  else
                -    def real_mod_name(mod)
                -      UNBOUND_METHOD_MODULE_NAME.bind(mod).call
                -    end
                +  def real_mod_name(mod)
                +    UNBOUND_METHOD_MODULE_NAME.bind_call(mod)
        lib/zeitwerk/registry.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/registry.rb	2024-12-16 03:49:32.174087524 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/registry.rb	2024-12-16 03:49:32.178087470 +0000
                @@ -113 +113 @@
                -      def inception?(cpath)
                +      def inception?(cpath, registered_by_loader=nil)
                @@ -115 +115,4 @@
                -          pair.first
                +          abspath, loader = pair
                +          if registered_by_loader.nil? || registered_by_loader.equal?(loader)
                +            abspath
                +          end
        lib/zeitwerk/version.rb
                --- /tmp/d20241216-2715-lt74k2/zeitwerk-2.6.13/lib/zeitwerk/version.rb	2024-12-16 03:49:32.174087524 +0000
                +++ /tmp/d20241216-2715-lt74k2/zeitwerk-2.7.1/lib/zeitwerk/version.rb	2024-12-16 03:49:32.178087470 +0000
                @@ -4 +4 @@
                -  VERSION = "2.6.13"
                +  VERSION = "2.7.1"

@dependabot dependabot bot force-pushed the dependabot/bundler/html-pipeline-3.2.2 branch 4 times, most recently from cfdd13f to 6a3f7be Compare December 21, 2024 14:38
Bumps [html-pipeline](https://github.com/gjtorikian/html-pipeline) from 3.0.3 to 3.2.2.
- [Release notes](https://github.com/gjtorikian/html-pipeline/releases)
- [Changelog](https://github.com/gjtorikian/html-pipeline/blob/main/CHANGELOG.md)
- [Commits](gjtorikian/html-pipeline@v3.0.3...v3.2.2)

---
updated-dependencies:
- dependency-name: html-pipeline
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
@dependabot dependabot bot force-pushed the dependabot/bundler/html-pipeline-3.2.2 branch from 6a3f7be to 81b6f4f Compare December 25, 2024 16:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies ruby Pull requests that update Ruby code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

0 participants