Skip to content

Bump rubocop from 1.79.2 to 1.86.2#929

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/rubocop-1.86.2
Closed

Bump rubocop from 1.79.2 to 1.86.2#929
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/rubocop-1.86.2

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github May 15, 2026

Copy link
Copy Markdown
Contributor

Bumps rubocop from 1.79.2 to 1.86.2.

Release notes

Sourced from rubocop's releases.

RuboCop v1.86.2

New features

Bug fixes

  • #15156: Fix an error for Style/HashLookupMethod when chaining fetch (or []) calls on the same expression. (@​koic)
  • #15161: Fix an error for Style/ReduceToHash when nested each_with_object/inject/reduce calls would build hashes. (@​koic)
  • #15144: Fix an error in Style/SoleNestedConditional when autocorrecting nested conditionals containing comments. (@​koic)
  • #15040: Exclude constants from Style/ModuleMemberExistenceCheck. (@​t-daisuke)
  • #15155: Fix false negatives in Style/RedundantSelf when an explicit self receiver in one scope matches the LHS of an ||=, &&=, or op_asgn in another scope. (@​koic)
  • #15107: Fix false positives in Lint/RequireRelativeSelfPath when a non-.rb file uses require_relative with its own basename. (@​koic)
  • #15137: Fix incorrect "does not support IndentationWidth parameter" warning for Layout/ClosingParenthesisIndentation and Layout/CommentIndentation. (@​koic)
  • #15148: Fix false positives in Lint/RedundantSafeNavigation when safe navigation appears in rescue or ensure bodies. (@​koic)
  • #15147: Fix false positives in Lint/RedundantSafeNavigation when safe navigation appears in the body of unless. (@​koic)
  • #15163: Fix false positives in Style/Copyright when Notice pattern starts with \A#, uses \s metacharacters, or has multiple spaces after #. (@​koic)
  • #10179: Fix false positives in Style/DocumentDynamicEvalDefinition when the heredoc contains an escaped interpolation (\#{...}). (@​eyupcanakman)
  • #15154: Fix bug where specifying --out disables parallelization. (@​deivid-rodriguez)
  • #15106: Fix TargetFinder to work correctly inside hidden parent directories. (@​alpaca-tc)
  • #15102: Fix FrozenError in DisabledConfigFormatter for frozen array config parameters. (@​koic)
  • #15141: Fix incorrect autocorrect for Gemspec/RequireMFA causing an infinite loop when rubygems_mfa_required metadata uses a symbol key. (@​koic)
  • #15142: Fix infinite loop for --disable-uncorrectable and offense near heredoc. (@​jonas054)
  • #15054: Fix false positive for Layout/MultilineMethodCallIndentation when a dot-aligned method chain is inside a hash pair value. (@​nicolas-finary)
  • #15136: Fix false positive for Lint/MissingCopEnableDirective when # rubocop:disable is wrapped in a # rubocop:push / # rubocop:pop block. (@​koic)
  • #15115: Fix an incorrect autocorrect in Style/RegexpLiteral when the regexp contains unbalanced braces that conflict with the preferred %r delimiters. (@​koic)
  • #15130: Fix incorrect autocorrect in Style/Copyright when AutocorrectNotice lacks a # prefix or Notice pattern starts with ^#. (@​koic)
  • #14821: Fix Style/IfInsideElse autocorrect moving comments into the wrong branch when a comment precedes the nested if in an else. (@​hammadxcm)
  • #14583: Fix template extractor applying only the last fragment's autocorrection. (@​zeronosu77108)
  • #14971: Fix false positive for Style/WhileUntilModifier when the body is a conditional. (@​fujitanisora)

RuboCop v1.86.1

Bug fixes

  • #11051: Fix Style/AccessModifierDeclarations inline autocorrect dropping comments between the access modifier and the following method definition. ([@​dduugg][])
  • #14665: Cache plugin integration in CopHelper to avoid repeated loading. ([@​55728][])
  • #15091: Fix Lint/DuplicateMethods false positives for anonymous classes in constant assignments and method return values. ([@​eugeneius][])
  • #15055: Fix Lint/DuplicateMethods false positives with anonymous classes inside blocks (e.g. RSpec let, describe). ([@​ShkumbinDelija][])

... (truncated)

Changelog

Sourced from rubocop's changelog.

1.86.2 (2026-05-14)

New features

Bug fixes

  • #15156: Fix an error for Style/HashLookupMethod when chaining fetch (or []) calls on the same expression. ([@​koic][])
  • #15161: Fix an error for Style/ReduceToHash when nested each_with_object/inject/reduce calls would build hashes. ([@​koic][])
  • #15144: Fix an error in Style/SoleNestedConditional when autocorrecting nested conditionals containing comments. ([@​koic][])
  • #15040: Exclude constants from Style/ModuleMemberExistenceCheck. ([@​t-daisuke][])
  • #15155: Fix false negatives in Style/RedundantSelf when an explicit self receiver in one scope matches the LHS of an ||=, &&=, or op_asgn in another scope. ([@​koic][])
  • #15107: Fix false positives in Lint/RequireRelativeSelfPath when a non-.rb file uses require_relative with its own basename. ([@​koic][])
  • #15137: Fix incorrect "does not support IndentationWidth parameter" warning for Layout/ClosingParenthesisIndentation and Layout/CommentIndentation. ([@​koic][])
  • #15148: Fix false positives in Lint/RedundantSafeNavigation when safe navigation appears in rescue or ensure bodies. ([@​koic][])
  • #15147: Fix false positives in Lint/RedundantSafeNavigation when safe navigation appears in the body of unless. ([@​koic][])
  • #15163: Fix false positives in Style/Copyright when Notice pattern starts with \A#, uses \s metacharacters, or has multiple spaces after #. ([@​koic][])
  • #10179: Fix false positives in Style/DocumentDynamicEvalDefinition when the heredoc contains an escaped interpolation (\#{...}). ([@​eyupcanakman][])
  • #15154: Fix bug where specifying --out disables parallelization. ([@​deivid-rodriguez][])
  • #15106: Fix TargetFinder to work correctly inside hidden parent directories. ([@​alpaca-tc][])
  • #15102: Fix FrozenError in DisabledConfigFormatter for frozen array config parameters. ([@​koic][])
  • #15141: Fix incorrect autocorrect for Gemspec/RequireMFA causing an infinite loop when rubygems_mfa_required metadata uses a symbol key. ([@​koic][])
  • #15142: Fix infinite loop for --disable-uncorrectable and offense near heredoc. ([@​jonas054][])
  • #15054: Fix false positive for Layout/MultilineMethodCallIndentation when a dot-aligned method chain is inside a hash pair value. ([@​nicolas-finary][])
  • #15136: Fix false positive for Lint/MissingCopEnableDirective when # rubocop:disable is wrapped in a # rubocop:push / # rubocop:pop block. ([@​koic][])
  • #15115: Fix an incorrect autocorrect in Style/RegexpLiteral when the regexp contains unbalanced braces that conflict with the preferred %r delimiters. ([@​koic][])
  • #15130: Fix incorrect autocorrect in Style/Copyright when AutocorrectNotice lacks a # prefix or Notice pattern starts with ^#. ([@​koic][])
  • #14821: Fix Style/IfInsideElse autocorrect moving comments into the wrong branch when a comment precedes the nested if in an else. ([@​hammadxcm][])
  • #14583: Fix template extractor applying only the last fragment's autocorrection. ([@​zeronosu77108][])
  • #14971: Fix false positive for Style/WhileUntilModifier when the body is a conditional. ([@​fujitanisora][])

1.86.1 (2026-04-09)

Bug fixes

  • #11051: Fix Style/AccessModifierDeclarations inline autocorrect dropping comments between the access modifier and the following method definition. ([@​dduugg][])
  • #14665: Cache plugin integration in CopHelper to avoid repeated loading. ([@​55728][])
  • #15091: Fix Lint/DuplicateMethods false positives for anonymous classes in constant assignments and method return values. ([@​eugeneius][])
  • #15055: Fix Lint/DuplicateMethods false positives with anonymous classes inside blocks (e.g. RSpec let, describe). ([@​ShkumbinDelija][])
  • #15035: Exclude included_modules from Style/ModuleMemberExistenceCheck. ([@​koic][])
  • #15087: Fix false positive for Style/RedundantLineContinuation when using interpolated string literals. ([@​koic][])
  • #14361: Fix false positive in file_to_include? when a relative Include pattern matches a parent directory name in the absolute file path. ([@​jonas054][])
  • #15090: Fix false positives for Layout/EmptyLineAfterGuardClause when consecutive guard clauses use and return. ([@​eugeneius][])
  • #15070: Fix false positive for Lint/RedundantSafeNavigation when chained safe navigation is used in a conditional expression with InferNonNilReceiver enabled. ([@​koic][])
  • #15074: Fix false positives in Style/RedundantParentheses when using parentheses around an endless range in assignment. ([@​koic][])
  • #15048: Fix issue where the url_for is missing for Cops without instance methods. ([@​Fryguy][])
  • #15051: Fix Style/RedundantParentheses handling of beginless ranges. ([@​oggy][])
  • #14980: Fix Lint/Syntax zero-length diagnostic range for syntax errors at EOF. ([@​55728][])
  • #15084: Handle heredocs with methods calls correctly when fixing guard clauses. ([@​G-Rath][])

... (truncated)

Commits
  • e513d33 Cut 1.86.2
  • 5fea1b5 Update Changelog
  • 2a3dfcd Don't use Registry#to_h
  • 836b275 Simplify registry internals
  • 90348d5 Fix false positives in Style/Copyright
  • 7419163 Fix extension suggestion documentation link
  • e467335 Merge pull request #15161 from koic/fix_an_error_for_style_reduce_to_hash.md
  • bd48b6b Merge pull request #15160 from lovro-bikic/autoload-mixins
  • b9cda61 Autoload mixins instead of requiring them
  • 55a8278 Fix an error for Style/ReduceToHash cop
  • Additional commits viewable in compare view

@dependabot dependabot Bot added dependencies ruby Pull requests that update Ruby code labels May 15, 2026
4 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

gem compare json 2.13.2 2.19.5

Compared versions: ["2.13.2", "2.19.5"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.19.5: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.19.5: 4.0.6
  DIFFERENT version:
    2.13.2: 2.13.2
    2.19.5: 2.19.5
  DIFFERENT files:
    2.13.2->2.19.5:
      * Added:
            ext/json/ext/json.h +116/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +114/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +47/-66
            ext/json/ext/generator/extconf.rb +3/-1
            ext/json/ext/generator/generator.c +393/-563
            ext/json/ext/parser/extconf.rb +6/-1
            ext/json/ext/parser/parser.c +665/-502
            ext/json/ext/simd/simd.h +42/-22
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +58/-3
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +101/-33
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +133/-71
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.19.5:
      * Changed:
            README.md +19/-1

3 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

gem compare json 2.13.2 2.19.5

Compared versions: ["2.13.2", "2.19.5"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.19.5: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.19.5: 4.0.6
  DIFFERENT version:
    2.13.2: 2.13.2
    2.19.5: 2.19.5
  DIFFERENT files:
    2.13.2->2.19.5:
      * Added:
            ext/json/ext/json.h +116/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +114/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +47/-66
            ext/json/ext/generator/extconf.rb +3/-1
            ext/json/ext/generator/generator.c +393/-563
            ext/json/ext/parser/extconf.rb +6/-1
            ext/json/ext/parser/parser.c +665/-502
            ext/json/ext/simd/simd.h +42/-22
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +58/-3
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +101/-33
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +133/-71
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.19.5:
      * Changed:
            README.md +19/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare json 2.13.2 2.19.5

Compared versions: ["2.13.2", "2.19.5"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.19.5: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.19.5: 4.0.6
  DIFFERENT version:
    2.13.2: 2.13.2
    2.19.5: 2.19.5
  DIFFERENT files:
    2.13.2->2.19.5:
      * Added:
            ext/json/ext/json.h +116/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +114/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +47/-66
            ext/json/ext/generator/extconf.rb +3/-1
            ext/json/ext/generator/generator.c +393/-563
            ext/json/ext/parser/extconf.rb +6/-1
            ext/json/ext/parser/parser.c +665/-502
            ext/json/ext/simd/simd.h +42/-22
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +58/-3
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +101/-33
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +133/-71
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.19.5:
      * Changed:
            README.md +19/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare json 2.13.2 2.19.5

Compared versions: ["2.13.2", "2.19.5"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.19.5: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.19.5: 4.0.6
  DIFFERENT version:
    2.13.2: 2.13.2
    2.19.5: 2.19.5
  DIFFERENT files:
    2.13.2->2.19.5:
      * Added:
            ext/json/ext/json.h +116/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +114/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +47/-66
            ext/json/ext/generator/extconf.rb +3/-1
            ext/json/ext/generator/generator.c +393/-563
            ext/json/ext/parser/extconf.rb +6/-1
            ext/json/ext/parser/parser.c +665/-502
            ext/json/ext/simd/simd.h +42/-22
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +58/-3
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +101/-33
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +133/-71
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.19.5:
      * Changed:
            README.md +19/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff json 2.13.2 2.19.5

Diff too large (257522 chars)

2 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff json 2.13.2 2.19.5

Diff too large (257522 chars)

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff json 2.13.2 2.19.5

Diff too large (257522 chars)

@github-actions

Copy link
Copy Markdown
Contributor

gem compare parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT date:
    1.27.0: 2025-04-14 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.27.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.27.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.27.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki"}
    2.1.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v2.1.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki", "changelog_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/CHANGELOG.md", "rubygems_mfa_required" => "true"}
  DIFFERENT required_ruby_version:
    1.27.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.27.0: 3.6.2
    2.1.0: 4.0.3
  DIFFERENT version:
    1.27.0: 1.27.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +79/-40
            lib/parallel/version.rb +1/-1

2 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

gem compare parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT date:
    1.27.0: 2025-04-14 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.27.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.27.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.27.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki"}
    2.1.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v2.1.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki", "changelog_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/CHANGELOG.md", "rubygems_mfa_required" => "true"}
  DIFFERENT required_ruby_version:
    1.27.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.27.0: 3.6.2
    2.1.0: 4.0.3
  DIFFERENT version:
    1.27.0: 1.27.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +79/-40
            lib/parallel/version.rb +1/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT date:
    1.27.0: 2025-04-14 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.27.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.27.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.27.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki"}
    2.1.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v2.1.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki", "changelog_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/CHANGELOG.md", "rubygems_mfa_required" => "true"}
  DIFFERENT required_ruby_version:
    1.27.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.27.0: 3.6.2
    2.1.0: 4.0.3
  DIFFERENT version:
    1.27.0: 1.27.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +79/-40
            lib/parallel/version.rb +1/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare json 2.13.2 2.19.5

Compared versions: ["2.13.2", "2.19.5"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.19.5: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.4/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.19.5: 4.0.6
  DIFFERENT version:
    2.13.2: 2.13.2
    2.19.5: 2.19.5
  DIFFERENT files:
    2.13.2->2.19.5:
      * Added:
            ext/json/ext/json.h +116/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +114/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +47/-66
            ext/json/ext/generator/extconf.rb +3/-1
            ext/json/ext/generator/generator.c +393/-563
            ext/json/ext/parser/extconf.rb +6/-1
            ext/json/ext/parser/parser.c +665/-502
            ext/json/ext/simd/simd.h +42/-22
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +58/-3
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +101/-33
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +133/-71
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.19.5:
      * Changed:
            README.md +19/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260515-677-v9y0n0	2026-05-15 02:33:41.842840117 +0000
                +++ /tmp/d20260515-677-ppmui9/parallel-2.1.0/lib/parallel/serializer.rb	2026-05-15 02:33:41.841840119 +0000
                @@ -0,0 +1,52 @@
                +# frozen_string_literal: true
                +require 'openssl'
                +require 'securerandom'
                +
                +module Parallel
                +  # Pluggable wire serializers. Each must respond to `dump(data, io)` /
                +  # `load(io)` (used directly by Worker) and `dump(data)` / `load(string)`
                +  # (used by wrappers like Hmac).
                +  module Serializer
                +    # Raw Marshal. Fast but trusts anything written to the pipe — a same-UID
                +    # attacker that reopens /proc/<pid>/fd/<n> can inject Marshal gadgets (RCE).
                +    Marshal = ::Marshal
                +
                +    # Wraps any inner serializer with a length-prefixed HMAC-SHA256 frame keyed
                +    # on a per-worker secret generated before fork. Forged frames from a
                +    # pipe-injector fail verification.
                +    class Hmac
                +      LENGTH_FORMAT = 'N' # 32-bit big-endian unsigned int
                +      LENGTH_BYTES = 4
                +      MAC_BYTES = 32 # SHA256
                +
                +      def initialize(inner: Marshal, secret: SecureRandom.bytes(32))
                +        @inner = inner
                +        @secret = secret
                +      end
                +
                +      def dump(data, io)
                +        payload = @inner.dump(data)
                +        mac = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        io.write([payload.bytesize].pack(LENGTH_FORMAT), mac, payload)
                +      end
                +
                +      def load(io)
                +        # nil at frame boundary = clean EOF (worker died / pipe closed between messages)
                +        header = io.read(LENGTH_BYTES) || raise(EOFError) # eof stops worker
                +        raise SecurityError, "truncated frame header" if header.bytesize != LENGTH_BYTES
                +
                +        length = header.unpack1(LENGTH_FORMAT)
                +        mac = io.read(MAC_BYTES)
                +        raise SecurityError, "truncated frame mac" if mac.nil? || mac.bytesize != MAC_BYTES
                +
                +        payload = io.read(length)
                +        raise SecurityError, "truncated frame payload" if payload.nil? || payload.bytesize != length
                +
                +        expected = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        raise SecurityError, "HMAC mismatch on worker pipe" unless OpenSSL.fixed_length_secure_compare(mac, expected)
                +
                +        @inner.load(payload)
                +      end
                +    end
                +  end
                +end
      * Changed:
        lib/parallel.rb
                --- /tmp/d20260515-677-ppmui9/parallel-1.27.0/lib/parallel.rb	2026-05-15 02:33:41.840840121 +0000
                +++ /tmp/d20260515-677-ppmui9/parallel-2.1.0/lib/parallel.rb	2026-05-15 02:33:41.841840119 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -17,0 +19,11 @@
                +
                +    # marshal_dump that is used for ruby exceptions
                +    # avoid dumping the cause since nobody needs that and it can include undumpable exceptions
                +    def _dump(_depth)
                +      Marshal.dump(@value)
                +    end
                +
                +    # marshal_load that is used for ruby exceptions
                +    def self._load(data)
                +      new(Marshal.load(data))
                +    end
                @@ -55 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -58,0 +71 @@
                +      @serializer = serializer
                @@ -75 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -81 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -258 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -462,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -464,13 +479,4 @@
                -      ractors = Array.new(options.fetch(:count)) do
                -        Ractor.new do
                -          loop do
                -            got = receive
                -            (klass, method_name), item, index = got
                -            break if index == :break
                -            begin
                -              Ractor.yield [nil, klass.send(method_name, item), item, index]
                -            rescue StandardError => e
                -              Ractor.yield [e, nil, item, index]
                -            end
                -          end
                -        end
                +      ports = {} # port (ruby 4+) or ractor (ruby 3) => ractor
                +      options.fetch(:count).times do
                +        port, ractor = ractor_build(use_port)
                +        ports[port] = ractor
                @@ -480,3 +486,3 @@
                -      ractors.dup.each do |ractor|
                -        if (set = job_factory.next)
                -          item, index = set
                +      ports.dup.each do |port, ractor|
                +        if (job = job_factory.next)
                +          item, index = job
                @@ -485,3 +491,3 @@
                -        else
                -          ractor.send([[nil, nil], nil, :break]) # stop the ractor
                -          ractors.delete ractor
                +        else # not enough work, `receive` would hang
                +          ractor_stop ractor
                +          ports.delete port
                @@ -491,4 +497,5 @@
                -      # replace with new items
                -      while (set = job_factory.next)
                -        item_next, index_next = set
                -        done, (exception, result, item, index) = Ractor.select(*ractors)
                +      # receive result and send new items to done ractors
                +      while (job = job_factory.next)
                +        # receive result
                +        done_port, (exception, result, item_prev, index_prev) = Ractor.select(*ports.keys)
                +        done_ractor = ports[done_port]
                @@ -496 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -499,2 +506 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +        ractor_result item_prev, index_prev, result, results, results_mutex, options
                @@ -501,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -503 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -507,2 +515,2 @@
                -      ractors.each do |ractor|
                -        (new_exception, result, item, index) = ractor.take
                +      ports.each do |port, ractor|
                +        (new_exception, result, item, index) = use_port ? port.receive : ractor.take
                @@ -511,3 +519,2 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                -        ractor.send([[nil, nil], nil, :break]) # stop the ractor
                +        ractor_result item, index, result, results, results_mutex, options
                +        ractor_stop ractor
                @@ -518,0 +526,30 @@
                +    def ractor_build(use_port)
                +      args = use_port ? [Ractor::Port.new] : []
                +      ractor = Ractor.new(*args) do |port|
                +        loop do
                +          (klass, method_name), item, index = receive
                +          break if index == :break
                +          begin
                +            result = [nil, klass.send(method_name, item), item, index]
                +          rescue StandardError => e
                +            result = [e, nil, item, index]
                +          end
                +          if port
                +            port.send result
                +          else
                +            Ractor.yield result
                +          end
                +        end
                +      end
                +      [use_port ? args.first : ractor, ractor]
                +    end
                +
                +    def ractor_result(item, index, result, results, results_mutex, options)
                +      instrument_finish item, index, result, options
                +      results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +    end
                +
                +    def ractor_stop(ractor)
                +      ractor.send([[nil, nil], nil, :break])
                +    end
                +
                @@ -589,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -610 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -613,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -615 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -624 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -629 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260515-677-ppmui9/parallel-1.27.0/lib/parallel/version.rb	2026-05-15 02:33:41.841840119 +0000
                +++ /tmp/d20260515-677-ppmui9/parallel-2.1.0/lib/parallel/version.rb	2026-05-15 02:33:41.841840119 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.27.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260515-674-s61ro3	2026-05-15 02:33:43.788486329 +0000
                +++ /tmp/d20260515-674-pvssi5/parallel-2.1.0/lib/parallel/serializer.rb	2026-05-15 02:33:43.788486329 +0000
                @@ -0,0 +1,52 @@
                +# frozen_string_literal: true
                +require 'openssl'
                +require 'securerandom'
                +
                +module Parallel
                +  # Pluggable wire serializers. Each must respond to `dump(data, io)` /
                +  # `load(io)` (used directly by Worker) and `dump(data)` / `load(string)`
                +  # (used by wrappers like Hmac).
                +  module Serializer
                +    # Raw Marshal. Fast but trusts anything written to the pipe — a same-UID
                +    # attacker that reopens /proc/<pid>/fd/<n> can inject Marshal gadgets (RCE).
                +    Marshal = ::Marshal
                +
                +    # Wraps any inner serializer with a length-prefixed HMAC-SHA256 frame keyed
                +    # on a per-worker secret generated before fork. Forged frames from a
                +    # pipe-injector fail verification.
                +    class Hmac
                +      LENGTH_FORMAT = 'N' # 32-bit big-endian unsigned int
                +      LENGTH_BYTES = 4
                +      MAC_BYTES = 32 # SHA256
                +
                +      def initialize(inner: Marshal, secret: SecureRandom.bytes(32))
                +        @inner = inner
                +        @secret = secret
                +      end
                +
                +      def dump(data, io)
                +        payload = @inner.dump(data)
                +        mac = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        io.write([payload.bytesize].pack(LENGTH_FORMAT), mac, payload)
                +      end
                +
                +      def load(io)
                +        # nil at frame boundary = clean EOF (worker died / pipe closed between messages)
                +        header = io.read(LENGTH_BYTES) || raise(EOFError) # eof stops worker
                +        raise SecurityError, "truncated frame header" if header.bytesize != LENGTH_BYTES
                +
                +        length = header.unpack1(LENGTH_FORMAT)
                +        mac = io.read(MAC_BYTES)
                +        raise SecurityError, "truncated frame mac" if mac.nil? || mac.bytesize != MAC_BYTES
                +
                +        payload = io.read(length)
                +        raise SecurityError, "truncated frame payload" if payload.nil? || payload.bytesize != length
                +
                +        expected = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        raise SecurityError, "HMAC mismatch on worker pipe" unless OpenSSL.fixed_length_secure_compare(mac, expected)
                +
                +        @inner.load(payload)
                +      end
                +    end
                +  end
                +end
      * Changed:
        lib/parallel.rb
                --- /tmp/d20260515-674-pvssi5/parallel-1.27.0/lib/parallel.rb	2026-05-15 02:33:43.787486317 +0000
                +++ /tmp/d20260515-674-pvssi5/parallel-2.1.0/lib/parallel.rb	2026-05-15 02:33:43.787486317 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -17,0 +19,11 @@
                +
                +    # marshal_dump that is used for ruby exceptions
                +    # avoid dumping the cause since nobody needs that and it can include undumpable exceptions
                +    def _dump(_depth)
                +      Marshal.dump(@value)
                +    end
                +
                +    # marshal_load that is used for ruby exceptions
                +    def self._load(data)
                +      new(Marshal.load(data))
                +    end
                @@ -55 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -58,0 +71 @@
                +      @serializer = serializer
                @@ -75 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -81 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -258 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -462,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -464,13 +479,4 @@
                -      ractors = Array.new(options.fetch(:count)) do
                -        Ractor.new do
                -          loop do
                -            got = receive
                -            (klass, method_name), item, index = got
                -            break if index == :break
                -            begin
                -              Ractor.yield [nil, klass.send(method_name, item), item, index]
                -            rescue StandardError => e
                -              Ractor.yield [e, nil, item, index]
                -            end
                -          end
                -        end
                +      ports = {} # port (ruby 4+) or ractor (ruby 3) => ractor
                +      options.fetch(:count).times do
                +        port, ractor = ractor_build(use_port)
                +        ports[port] = ractor
                @@ -480,3 +486,3 @@
                -      ractors.dup.each do |ractor|
                -        if (set = job_factory.next)
                -          item, index = set
                +      ports.dup.each do |port, ractor|
                +        if (job = job_factory.next)
                +          item, index = job
                @@ -485,3 +491,3 @@
                -        else
                -          ractor.send([[nil, nil], nil, :break]) # stop the ractor
                -          ractors.delete ractor
                +        else # not enough work, `receive` would hang
                +          ractor_stop ractor
                +          ports.delete port
                @@ -491,4 +497,5 @@
                -      # replace with new items
                -      while (set = job_factory.next)
                -        item_next, index_next = set
                -        done, (exception, result, item, index) = Ractor.select(*ractors)
                +      # receive result and send new items to done ractors
                +      while (job = job_factory.next)
                +        # receive result
                +        done_port, (exception, result, item_prev, index_prev) = Ractor.select(*ports.keys)
                +        done_ractor = ports[done_port]
                @@ -496 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -499,2 +506 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +        ractor_result item_prev, index_prev, result, results, results_mutex, options
                @@ -501,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -503 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -507,2 +515,2 @@
                -      ractors.each do |ractor|
                -        (new_exception, result, item, index) = ractor.take
                +      ports.each do |port, ractor|
                +        (new_exception, result, item, index) = use_port ? port.receive : ractor.take
                @@ -511,3 +519,2 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                -        ractor.send([[nil, nil], nil, :break]) # stop the ractor
                +        ractor_result item, index, result, results, results_mutex, options
                +        ractor_stop ractor
                @@ -518,0 +526,30 @@
                +    def ractor_build(use_port)
                +      args = use_port ? [Ractor::Port.new] : []
                +      ractor = Ractor.new(*args) do |port|
                +        loop do
                +          (klass, method_name), item, index = receive
                +          break if index == :break
                +          begin
                +            result = [nil, klass.send(method_name, item), item, index]
                +          rescue StandardError => e
                +            result = [e, nil, item, index]
                +          end
                +          if port
                +            port.send result
                +          else
                +            Ractor.yield result
                +          end
                +        end
                +      end
                +      [use_port ? args.first : ractor, ractor]
                +    end
                +
                +    def ractor_result(item, index, result, results, results_mutex, options)
                +      instrument_finish item, index, result, options
                +      results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +    end
                +
                +    def ractor_stop(ractor)
                +      ractor.send([[nil, nil], nil, :break])
                +    end
                +
                @@ -589,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -610 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -613,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -615 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -624 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -629 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260515-674-pvssi5/parallel-1.27.0/lib/parallel/version.rb	2026-05-15 02:33:43.787486317 +0000
                +++ /tmp/d20260515-674-pvssi5/parallel-2.1.0/lib/parallel/version.rb	2026-05-15 02:33:43.788486329 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.27.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260515-730-e4jdz9	2026-05-15 02:33:49.502850998 +0000
                +++ /tmp/d20260515-730-htm8x7/parallel-2.1.0/lib/parallel/serializer.rb	2026-05-15 02:33:49.502850998 +0000
                @@ -0,0 +1,52 @@
                +# frozen_string_literal: true
                +require 'openssl'
                +require 'securerandom'
                +
                +module Parallel
                +  # Pluggable wire serializers. Each must respond to `dump(data, io)` /
                +  # `load(io)` (used directly by Worker) and `dump(data)` / `load(string)`
                +  # (used by wrappers like Hmac).
                +  module Serializer
                +    # Raw Marshal. Fast but trusts anything written to the pipe — a same-UID
                +    # attacker that reopens /proc/<pid>/fd/<n> can inject Marshal gadgets (RCE).
                +    Marshal = ::Marshal
                +
                +    # Wraps any inner serializer with a length-prefixed HMAC-SHA256 frame keyed
                +    # on a per-worker secret generated before fork. Forged frames from a
                +    # pipe-injector fail verification.
                +    class Hmac
                +      LENGTH_FORMAT = 'N' # 32-bit big-endian unsigned int
                +      LENGTH_BYTES = 4
                +      MAC_BYTES = 32 # SHA256
                +
                +      def initialize(inner: Marshal, secret: SecureRandom.bytes(32))
                +        @inner = inner
                +        @secret = secret
                +      end
                +
                +      def dump(data, io)
                +        payload = @inner.dump(data)
                +        mac = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        io.write([payload.bytesize].pack(LENGTH_FORMAT), mac, payload)
                +      end
                +
                +      def load(io)
                +        # nil at frame boundary = clean EOF (worker died / pipe closed between messages)
                +        header = io.read(LENGTH_BYTES) || raise(EOFError) # eof stops worker
                +        raise SecurityError, "truncated frame header" if header.bytesize != LENGTH_BYTES
                +
                +        length = header.unpack1(LENGTH_FORMAT)
                +        mac = io.read(MAC_BYTES)
                +        raise SecurityError, "truncated frame mac" if mac.nil? || mac.bytesize != MAC_BYTES
                +
                +        payload = io.read(length)
                +        raise SecurityError, "truncated frame payload" if payload.nil? || payload.bytesize != length
                +
                +        expected = OpenSSL::HMAC.digest('SHA256', @secret, payload)
                +        raise SecurityError, "HMAC mismatch on worker pipe" unless OpenSSL.fixed_length_secure_compare(mac, expected)
                +
                +        @inner.load(payload)
                +      end
                +    end
                +  end
                +end
      * Changed:
        lib/parallel.rb
                --- /tmp/d20260515-730-htm8x7/parallel-1.27.0/lib/parallel.rb	2026-05-15 02:33:49.501850997 +0000
                +++ /tmp/d20260515-730-htm8x7/parallel-2.1.0/lib/parallel.rb	2026-05-15 02:33:49.502850998 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -17,0 +19,11 @@
                +
                +    # marshal_dump that is used for ruby exceptions
                +    # avoid dumping the cause since nobody needs that and it can include undumpable exceptions
                +    def _dump(_depth)
                +      Marshal.dump(@value)
                +    end
                +
                +    # marshal_load that is used for ruby exceptions
                +    def self._load(data)
                +      new(Marshal.load(data))
                +    end
                @@ -55 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -58,0 +71 @@
                +      @serializer = serializer
                @@ -75 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -81 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -258 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -462,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -464,13 +479,4 @@
                -      ractors = Array.new(options.fetch(:count)) do
                -        Ractor.new do
                -          loop do
                -            got = receive
                -            (klass, method_name), item, index = got
                -            break if index == :break
                -            begin
                -              Ractor.yield [nil, klass.send(method_name, item), item, index]
                -            rescue StandardError => e
                -              Ractor.yield [e, nil, item, index]
                -            end
                -          end
                -        end
                +      ports = {} # port (ruby 4+) or ractor (ruby 3) => ractor
                +      options.fetch(:count).times do
                +        port, ractor = ractor_build(use_port)
                +        ports[port] = ractor
                @@ -480,3 +486,3 @@
                -      ractors.dup.each do |ractor|
                -        if (set = job_factory.next)
                -          item, index = set
                +      ports.dup.each do |port, ractor|
                +        if (job = job_factory.next)
                +          item, index = job
                @@ -485,3 +491,3 @@
                -        else
                -          ractor.send([[nil, nil], nil, :break]) # stop the ractor
                -          ractors.delete ractor
                +        else # not enough work, `receive` would hang
                +          ractor_stop ractor
                +          ports.delete port
                @@ -491,4 +497,5 @@
                -      # replace with new items
                -      while (set = job_factory.next)
                -        item_next, index_next = set
                -        done, (exception, result, item, index) = Ractor.select(*ractors)
                +      # receive result and send new items to done ractors
                +      while (job = job_factory.next)
                +        # receive result
                +        done_port, (exception, result, item_prev, index_prev) = Ractor.select(*ports.keys)
                +        done_ractor = ports[done_port]
                @@ -496 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -499,2 +506 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +        ractor_result item_prev, index_prev, result, results, results_mutex, options
                @@ -501,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -503 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -507,2 +515,2 @@
                -      ractors.each do |ractor|
                -        (new_exception, result, item, index) = ractor.take
                +      ports.each do |port, ractor|
                +        (new_exception, result, item, index) = use_port ? port.receive : ractor.take
                @@ -511,3 +519,2 @@
                -        instrument_finish item, index, result, options
                -        results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                -        ractor.send([[nil, nil], nil, :break]) # stop the ractor
                +        ractor_result item, index, result, results, results_mutex, options
                +        ractor_stop ractor
                @@ -518,0 +526,30 @@
                +    def ractor_build(use_port)
                +      args = use_port ? [Ractor::Port.new] : []
                +      ractor = Ractor.new(*args) do |port|
                +        loop do
                +          (klass, method_name), item, index = receive
                +          break if index == :break
                +          begin
                +            result = [nil, klass.send(method_name, item), item, index]
                +          rescue StandardError => e
                +            result = [e, nil, item, index]
                +          end
                +          if port
                +            port.send result
                +          else
                +            Ractor.yield result
                +          end
                +        end
                +      end
                +      [use_port ? args.first : ractor, ractor]
                +    end
                +
                +    def ractor_result(item, index, result, results, results_mutex, options)
                +      instrument_finish item, index, result, options
                +      results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) }
                +    end
                +
                +    def ractor_stop(ractor)
                +      ractor.send([[nil, nil], nil, :break])
                +    end
                +
                @@ -589,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -610 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -613,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -615 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -624 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -629 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260515-730-htm8x7/parallel-1.27.0/lib/parallel/version.rb	2026-05-15 02:33:49.501850997 +0000
                +++ /tmp/d20260515-730-htm8x7/parallel-2.1.0/lib/parallel/version.rb	2026-05-15 02:33:49.502850998 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.27.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions

Copy link
Copy Markdown
Contributor

gem compare parser 3.3.9.0 3.3.11.1

Compared versions: ["3.3.9.0", "3.3.11.1"]
  DIFFERENT date:
    3.3.9.0: 2025-07-25 00:00:00 UTC
    3.3.11.1: 2026-03-27 00:00:00 UTC
  DIFFERENT metadata:
    3.3.9.0: {"bug_tracker_uri" => "https://github.com/whitequark/parser/issues", "changelog_uri" => "https://github.com/whitequark/parser/blob/v3.3.9.0/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/parser/3.3.9.0", "source_code_uri" => "https://github.com/whitequark/parser/tree/v3.3.9.0"}
    3.3.11.1: {"bug_tracker_uri" => "https://github.com/whitequark/parser/issues", "changelog_uri" => "https://github.com/whitequark/parser/blob/v3.3.11.1/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/parser/3.3.11.1", "source_code_uri" => "https://github.com/whitequark/parser/tree/v3.3.11.1"}
  DIFFERENT version:
    3.3.9.0: 3.3.9.0
    3.3.11.1: 3.3.11.1
  DIFFERENT files:
    3.3.9.0->3.3.11.1:
      * Changed:
            lib/parser/current.rb +2/-2
            lib/parser/meta.rb +1/-1
            lib/parser/version.rb +1/-1
            parser.gemspec +1/-1
  DIFFERENT development dependencies:
    3.3.9.0->3.3.11.1:
      * Updated:
            bundler from: [">= 1.15", "< 3.0.0"] to: [">= 1.15"]

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff json 2.13.2 2.19.5

Diff too large (257522 chars)

@github-actions

Copy link
Copy Markdown
Contributor

gem compare parser 3.3.9.0 3.3.11.1

Compared versions: ["3.3.9.0", "3.3.11.1"]
  DIFFERENT date:
    3.3.9.0: 2025-07-25 00:00:00 UTC
    3.3.11.1: 2026-03-27 00:00:00 UTC
  DIFFERENT metadata:
    3.3.9.0: {"bug_tracker_uri" => "https://github.com/whitequark/parser/issues", "changelog_uri" => "https://github.com/whitequark/parser/blob/v3.3.9.0/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/parser/3.3.9.0", "source_code_uri" => "https://github.com/whitequark/parser/tree/v3.3.9.0"}
    3.3.11.1: {"bug_tracker_uri" => "https://github.com/whitequark/parser/issues", "changelog_uri" => "https://github.com/whitequark/parser/blob/v3.3.11.1/CHANGELOG.md", "documentation_uri" => "https://www.rubydoc.info/gems/parser/3.3.11.1", "source_code_uri" => "https://github.com/whitequark/parser/tree/v3.3.11.1"}
  DIFFERENT version:
    3.3.9.0: 3.3.9.0
    3.3.11.1: 3.3.11.1
  DIFFERENT files:
    3.3.9.0->3.3.11.1:
      * Changed:
            lib/parser/current.rb +2/-2
            lib/parser/meta.rb +1/-1
            lib/parser/version.rb +1/-1
            parser.gemspec +1/-1
  DIFFERENT development dependencies:
    3.3.9.0->3.3.11.1:
      * Updated:
            bundler from: [">= 1.15", "< 3.0.0"] to: [">= 1.15"]

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff parser 3.3.9.0 3.3.11.1

Compared versions: ["3.3.9.0", "3.3.11.1"]
  DIFFERENT files:
    3.3.9.0->3.3.11.1:
      * Changed:
        lib/parser/current.rb
                --- /tmp/d20260515-1060-9z0awy/parser-3.3.9.0/lib/parser/current.rb	2026-05-15 02:34:07.740792372 +0000
                +++ /tmp/d20260515-1060-9z0awy/parser-3.3.11.1/lib/parser/current.rb	2026-05-15 02:34:07.797792278 +0000
                @@ -105 +105 @@
                -    current_version = '3.2.9'
                +    current_version = '3.2.11'
                @@ -114 +114 @@
                -    current_version = '3.3.9'
                +    current_version = '3.3.11'
        lib/parser/meta.rb
                --- /tmp/d20260515-1060-9z0awy/parser-3.3.9.0/lib/parser/meta.rb	2026-05-15 02:34:07.748792359 +0000
                +++ /tmp/d20260515-1060-9z0awy/parser-3.3.11.1/lib/parser/meta.rb	2026-05-15 02:34:07.807792262 +0000
                @@ -10 +10 @@
                -      itarg itblock
                +      itarg itblock blocknilarg
        lib/parser/version.rb
                --- /tmp/d20260515-1060-9z0awy/parser-3.3.9.0/lib/parser/version.rb	2026-05-15 02:34:07.790792290 +0000
                +++ /tmp/d20260515-1060-9z0awy/parser-3.3.11.1/lib/parser/version.rb	2026-05-15 02:34:07.858792178 +0000
                @@ -4 +4 @@
                -  VERSION = '3.3.9.0'
                +  VERSION = '3.3.11.1'
        parser.gemspec
                --- /tmp/d20260515-1060-9z0awy/parser-3.3.9.0/parser.gemspec	2026-05-15 02:34:07.791792288 +0000
                +++ /tmp/d20260515-1060-9z0awy/parser-3.3.11.1/parser.gemspec	2026-05-15 02:34:07.858792178 +0000
                @@ -32 +32 @@
                -  spec.add_development_dependency 'bundler',   '>= 1.15', '< 3.0.0'
                +  spec.add_development_dependency 'bundler',   '>= 1.15'

@github-actions

Copy link
Copy Markdown
Contributor

gem compare parallel 1.27.0 2.1.0

Compared versions: ["1.27.0", "2.1.0"]
  DIFFERENT date:
    1.27.0: 2025-04-14 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.27.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.27.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.27.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki"}
    2.1.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v2.1.0", "wiki_uri" => "https://github.com/grosser/parallel/wiki", "changelog_uri" => "https://github.com/grosser/parallel/blob/v2.1.0/CHANGELOG.md", "rubygems_mfa_required" => "true"}
  DIFFERENT required_ruby_version:
    1.27.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.27.0: 3.6.2
    2.1.0: 4.0.3
  DIFFERENT version:
    1.27.0: 1.27.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.27.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +79/-40
            lib/parallel/version.rb +1/-1

@github-actions

Copy link
Copy Markdown
Contributor

gem compare --diff parser 3.3.9.0 3.3.11.1

Compared versions: ["3.3.9.0", "3.3.11.1"]
  DIFFERENT files:
    3.3.9.0->3.3.11.1:
      * Changed:
        lib/parser/current.rb
                --- /tmp/d20260515-1114-biqdi6/parser-3.3.9.0/lib/parser/current.rb	2026-05-15 02:34:19.027878443 +0000
                +++ /tmp/d20260515-1114-biqdi6/parser-3.3.11.1/lib/parser/current.rb	2026-05-15 02:34:19.098878509 +0000
                @@ -105 +105 @@
                -    current_version = '3.2.9'
                +    current_version = '3.2.11'
                @@ -114 +114 @@
                -    current_version = '3.3.9'
                +    current_version = '3.3.11'
        lib/parser/meta.rb
                --- /tmp/d20260515-1114-biqdi6/parser-3.3.9.0/lib/parser/meta.rb	2026-05-15 02:34:19.038878453 +0000
                +++ /tmp/d20260515-1114-biqdi6/parser-3.3.11.1/lib/parser/meta.rb	2026-05-15 02:34:19.109878520 +0000
                @@ -10 +10 @@
                -      itarg itblock
                +      itarg itblock blocknilarg
        lib/parser/version.rb
                --- /tmp/d20260515-1114-biqdi6/parser-3.3.9.0/lib/parser/version.rb	2026-05-15 02:34:19.090878502 +0000
                +++ /tmp/d20260515-1114-biqdi6/parser-3.3.11.1/lib/parser/version.rb	2026-05-15 02:34:19.158878565 +0000
                @@ -4 +4 @@
                -  VERSION = '3.3.9.0'
                +  VERSION = '3.3.11.1'
        parser.gemspec
                --- /tmp/d20260515-1114-biqdi6/parser-3.3.9.0/parser.gemspec	2026-05-15 02:34:19.090878502 +0000
                +++ /tmp/d20260515-1114-biqdi6/parser-3.3.11.1/parser.gemspec	2026-05-15 02:34:19.158878565 +0000
                @@ -32 +32 @@
                -  spec.add_development_dependency 'bundler',   '>= 1.15', '< 3.0.0'
                +  spec.add_development_dependency 'bundler',   '>= 1.15'

@dependabot dependabot Bot force-pushed the dependabot/bundler/rubocop-1.86.2 branch 25 times, most recently from 27897ae to 5247f5f Compare May 19, 2026 23:03
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.79.2 to 1.86.2.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](rubocop/rubocop@v1.79.2...v1.86.2)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.86.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot force-pushed the dependabot/bundler/rubocop-1.86.2 branch from 5247f5f to 909a290 Compare May 20, 2026 14:38
@dependabot @github

dependabot Bot commented on behalf of github Jun 1, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #994.

@dependabot dependabot Bot closed this Jun 1, 2026
@dependabot dependabot Bot deleted the dependabot/bundler/rubocop-1.86.2 branch June 1, 2026 04:27
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