Skip to content

Bump rubocop from 1.79.2 to 1.87.0#994

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/rubocop-1.87.0
Open

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

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github Jun 1, 2026

Bumps rubocop from 1.79.2 to 1.87.0.

Release notes

Sourced from rubocop's releases.

RuboCop v1.87.0

New features

  • #15167: Add --enable-all-cops and --disable-all-cops command line options that override AllCops/EnabledByDefault and AllCops/DisabledByDefault in configuration files. (@​koic)
  • #15185: Make Layout/EmptyLineAfterGuardClause accept the new # simplecov:disable and # simplecov:enable directive comments. (@​koic)
  • #15173: Add optional Rubydex integration via AllCops/UseProjectIndex to enable cross-file detection in Lint/ConstantReassignment (experimental). (@​koic)

Bug fixes

  • #15168: Fix false positives in Lint/ParenthesesAsGroupedExpression when the first argument is a call-like expression with its own parentheses, such as yield(...). (@​koic)
  • #15188: Fix false positives in Style/YodaCondition when one side is an array or hash literal containing non-literal elements. (@​koic)
  • #15182: Fix incorrect autocorrect for Style/Alias causing a syntax error when the return value of alias_method is used, such as an argument to public, private, protected, or module_function, or the right-hand side of an assignment. (@​koic)
  • #15174: Fix incorrect autocorrect for Style/ClassAndModuleChildren causing a syntax error when the namespace contains a method call (e.g., class self.class::Foo; end). (@​koic)
  • #15180: Fix incorrect autocorrect for Style/FileWrite causing a syntax error when the written heredoc is chained with another method call. (@​koic)
  • #15186: Fix incorrect autocorrect for Style/HashConversion causing a syntax error when Hash[...] is passed an anonymous splat (*). (@​koic)
  • #15192: Fix incorrect autocorrect for Style/StructInheritance causing a syntax error when the inherited Struct.new is called without parentheses. (@​koic)
  • #15170: Fix an infinite loop for Layout/RedundantLineBreak when a single-line block is chained with a safe navigation method call. (@​koic)
  • #15175: Fix Layout/IndentationWidth to indent block bodies relative to the method selector for trailing-dot multi-line method chains when EnforcedStyleAlignWith is relative_to_receiver. (@​ddbrendan)
  • #15135: Fix incorrect autocorrect for Style/RedundantParentheses that swallowed chained method calls into a trailing inline comment on the line above the closing parenthesis. (@​hammadxcm)
  • #15184: Fix various typos and grammar mistakes in documentation and cop descriptions. (@​bbatsov)

Changes

  • #15171: Cache FilePatterns#match? results per path so cops sharing the same Include/Exclude configuration do not each repeat File.fnmatch? work on every file. (@​Darhazer)

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][])

... (truncated)

Changelog

Sourced from rubocop's changelog.

1.87.0 (2026-05-30)

New features

  • #15167: Add --enable-all-cops and --disable-all-cops command line options that override AllCops/EnabledByDefault and AllCops/DisabledByDefault in configuration files. ([@​koic][])
  • #15185: Make Layout/EmptyLineAfterGuardClause accept the new # simplecov:disable and # simplecov:enable directive comments. ([@​koic][])
  • #15173: Add optional Rubydex integration via AllCops/UseProjectIndex to enable cross-file detection in Lint/ConstantReassignment (experimental). ([@​koic][])

Bug fixes

  • #15168: Fix false positives in Lint/ParenthesesAsGroupedExpression when the first argument is a call-like expression with its own parentheses, such as yield(...). ([@​koic][])
  • #15188: Fix false positives in Style/YodaCondition when one side is an array or hash literal containing non-literal elements. ([@​koic][])
  • #15182: Fix incorrect autocorrect for Style/Alias causing a syntax error when the return value of alias_method is used, such as an argument to public, private, protected, or module_function, or the right-hand side of an assignment. ([@​koic][])
  • #15174: Fix incorrect autocorrect for Style/ClassAndModuleChildren causing a syntax error when the namespace contains a method call (e.g., class self.class::Foo; end). ([@​koic][])
  • #15180: Fix incorrect autocorrect for Style/FileWrite causing a syntax error when the written heredoc is chained with another method call. ([@​koic][])
  • #15186: Fix incorrect autocorrect for Style/HashConversion causing a syntax error when Hash[...] is passed an anonymous splat (*). ([@​koic][])
  • #15192: Fix incorrect autocorrect for Style/StructInheritance causing a syntax error when the inherited Struct.new is called without parentheses. ([@​koic][])
  • #15170: Fix an infinite loop for Layout/RedundantLineBreak when a single-line block is chained with a safe navigation method call. ([@​koic][])
  • #15175: Fix Layout/IndentationWidth to indent block bodies relative to the method selector for trailing-dot multi-line method chains when EnforcedStyleAlignWith is relative_to_receiver. ([@​ddbrendan][])
  • #15135: Fix incorrect autocorrect for Style/RedundantParentheses that swallowed chained method calls into a trailing inline comment on the line above the closing parenthesis. ([@​hammadxcm][])
  • #15184: Fix various typos and grammar mistakes in documentation and cop descriptions. ([@​bbatsov][])

Changes

  • #15171: Cache FilePatterns#match? results per path so cops sharing the same Include/Exclude configuration do not each repeat File.fnmatch? work on every file. ([@​Darhazer][])

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][])

... (truncated)

Commits
  • e5b788d Cut 1.87
  • 65aece8 Update Changelog
  • 810c790 Fix incorrect autocorrect for Style/StructInheritance cop
  • 1ec0554 [Fix #15185] Make Layout/EmptyLineAfterGuardClause accept new SimpleCov dir...
  • 11cd569 Merge pull request #15190 from koic/fix_false_positives_in_style_yoda_condition
  • ceff136 [Fix #15188] Fix false positives for Style/YodaCondition
  • 4a12596 Fix incorrect autocorrect for Style/HashConversion cop
  • 4801e9d Merge pull request #15184 from rubocop/fix-typos-and-grammar-in-docs
  • bfe7dc5 Fix various typos and grammar mistakes in documentation
  • 6988aa4 Merge pull request #15182 from koic/fix_incorrect_autocorrect_for_style_alias...
  • 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 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)

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.79.2 to 1.87.0.
- [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.87.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies ruby Pull requests that update Ruby code labels Jun 1, 2026
2 similar comments
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT require_paths:
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
    2.19.7: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.7", "lib"]
  DIFFERENT rubygems_version:
    2.19.5: 4.0.6
    2.19.7: 4.0.12
  DIFFERENT version:
    2.19.5: 2.19.5
    2.19.7: 2.19.7
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
            CHANGES.md +12/-0
            ext/json/ext/fbuffer/fbuffer.h +10/-1
            ext/json/ext/generator/generator.c +11/-6
            ext/json/ext/parser/parser.c +55/-27
            lib/json/version.rb +1/-1

2 similar comments
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT require_paths:
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
    2.19.7: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.7", "lib"]
  DIFFERENT rubygems_version:
    2.19.5: 4.0.6
    2.19.7: 4.0.12
  DIFFERENT version:
    2.19.5: 2.19.5
    2.19.7: 2.19.7
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
            CHANGES.md +12/-0
            ext/json/ext/fbuffer/fbuffer.h +10/-1
            ext/json/ext/generator/generator.c +11/-6
            ext/json/ext/parser/parser.c +55/-27
            lib/json/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT require_paths:
    2.19.5: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.5", "lib"]
    2.19.7: ["/opt/hostedtoolcache/Ruby/4.0.5/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.19.7", "lib"]
  DIFFERENT rubygems_version:
    2.19.5: 4.0.6
    2.19.7: 4.0.12
  DIFFERENT version:
    2.19.5: 2.19.5
    2.19.7: 2.19.7
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
            CHANGES.md +12/-0
            ext/json/ext/fbuffer/fbuffer.h +10/-1
            ext/json/ext/generator/generator.c +11/-6
            ext/json/ext/parser/parser.c +55/-27
            lib/json/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
        CHANGES.md
                --- /tmp/d20260601-450-v9eom5/json-2.19.5/CHANGES.md	2026-06-01 04:28:33.183001105 +0000
                +++ /tmp/d20260601-450-v9eom5/json-2.19.7/CHANGES.md	2026-06-01 04:28:33.190001283 +0000
                @@ -4,0 +5,12 @@
                +### 2026-05-28 (2.19.7)
                +
                +* Fix some more edge cases with out of range floats.
                +* Ensure the string provided to `JSON.parse` can't be mutated during parsing.
                +* Add missing write barriers in `State#dup`.
                +* Further validate generator `depth` config.
                +
                +### 2026-05-28 (2.19.6)
                +
                +* Cleanly handle overly large `depth` generator argument.
                +* Add missing write barrier in `ParserConfig`.
                +
        ext/json/ext/fbuffer/fbuffer.h
                --- /tmp/d20260601-450-v9eom5/json-2.19.5/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:33.184001131 +0000
                +++ /tmp/d20260601-450-v9eom5/json-2.19.7/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:33.190001283 +0000
                @@ -133,0 +134,9 @@
                +static inline size_t fbuffer_size_mul_or_raise(size_t a, size_t b)
                +{
                +    size_t result = a * b;
                +    if (RB_UNLIKELY(a != 0 && (result / a) != b)) {
                +        rb_raise(rb_eArgError, "Buffer overflow, the resulting document is too large to be generated");
                +    }
                +    return result;
                +}
                +
                @@ -178 +187 @@
                -    fbuffer_inc_capa(fb, repeat * len);
                +    fbuffer_inc_capa(fb, fbuffer_size_mul_or_raise(repeat, len));
        ext/json/ext/generator/generator.c
                --- /tmp/d20260601-450-v9eom5/json-2.19.5/ext/json/ext/generator/generator.c	2026-06-01 04:28:33.184001131 +0000
                +++ /tmp/d20260601-450-v9eom5/json-2.19.7/ext/json/ext/generator/generator.c	2026-06-01 04:28:33.191001309 +0000
                @@ -1370,6 +1370,8 @@
                -    objState->indent = origState->indent;
                -    objState->space = origState->space;
                -    objState->space_before = origState->space_before;
                -    objState->object_nl = origState->object_nl;
                -    objState->array_nl = origState->array_nl;
                -    objState->as_json = origState->as_json;
                +
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->indent);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space_before);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->object_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->array_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->as_json);
                +
                @@ -1591,0 +1594,3 @@
                +    }
                +    if (RB_UNLIKELY(d > INT_MAX)) {
                +        rb_raise(rb_eArgError, "depth is too large (got %ld)", d);
        ext/json/ext/parser/parser.c
                --- /tmp/d20260601-450-v9eom5/json-2.19.5/ext/json/ext/parser/parser.c	2026-06-01 04:28:33.185001156 +0000
                +++ /tmp/d20260601-450-v9eom5/json-2.19.7/ext/json/ext/parser/parser.c	2026-06-01 04:28:33.192001334 +0000
                @@ -1205 +1205,5 @@
                -        exponent = negative_exponent ? -abs_exponent : abs_exponent;
                +        if (RB_UNLIKELY(exponent_digits >= 20 || abs_exponent > (uint64_t)INT64_MAX)) {
                +            exponent = negative_exponent ? INT64_MIN : INT64_MAX;
                +        } else {
                +            exponent = negative_exponent ? -(int64_t)abs_exponent : (int64_t)abs_exponent;
                +        }
                @@ -1460 +1464,6 @@
                -  int encindex = RB_ENCODING_GET(source);
                +    StringValue(source);
                +    int encindex = RB_ENCODING_GET(source);
                +
                +    if (RB_LIKELY(encindex == utf8_encindex)) {
                +        return source;
                +    }
                @@ -1462 +1471,7 @@
                -  if (RB_LIKELY(encindex == utf8_encindex)) {
                +    if (encindex == binary_encindex) {
                +        // For historical reason, we silently reinterpret binary strings as UTF-8
                +        return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                +    }
                +
                +    source = rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +    StringValue(source);
                @@ -1464 +1479 @@
                -  }
                +}
                @@ -1466,4 +1481,4 @@
                - if (encindex == binary_encindex) {
                -    // For historical reason, we silently reinterpret binary strings as UTF-8
                -    return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                -  }
                +struct parser_config_init_args {
                +    JSON_ParserConfig *config;
                +    VALUE self;
                +};
                @@ -1471 +1486,4 @@
                -  return rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +static void parser_config_wb_write(VALUE self, VALUE *dest, VALUE val)
                +{
                +    *dest = val;
                +    if (self) RB_OBJ_WRITTEN(self, Qundef, val);
                @@ -1476 +1494,3 @@
                -    JSON_ParserConfig *config = (JSON_ParserConfig *)data;
                +    struct parser_config_init_args *args = (struct parser_config_init_args *)data;
                +    JSON_ParserConfig *config = args->config;
                +    VALUE self = args->self;
                @@ -1485 +1505 @@
                -    else if (key == sym_on_load)                    { config->on_load_proc = RTEST(val) ? val : Qfalse; }
                +    else if (key == sym_on_load)                    { parser_config_wb_write(self, &config->on_load_proc, RTEST(val) ? val : Qfalse); }
                @@ -1490 +1510 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1493 +1513 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1502 +1522 @@
                -                    config->decimal_class = rb_path_to_class(mod_path);
                +                    parser_config_wb_write(self, &config->decimal_class, rb_path_to_class(mod_path));
                @@ -1510 +1530 @@
                -                    config->decimal_class = rb_mKernel;
                +                    parser_config_wb_write(self, &config->decimal_class, rb_mKernel);
                @@ -1520 +1540 @@
                -static void parser_config_init(JSON_ParserConfig *config, VALUE opts)
                +static void parser_config_init(JSON_ParserConfig *config, VALUE opts, VALUE self)
                @@ -1523,0 +1544,5 @@
                +    struct parser_config_init_args args = {
                +        .config = config,
                +        .self = self,
                +    };
                +
                @@ -1529 +1554 @@
                -            rb_hash_foreach(opts, parser_config_init_i, (VALUE)config);
                +            rb_hash_foreach(opts, parser_config_init_i, (VALUE)&args);
                @@ -1563,3 +1588 @@
                -    parser_config_init(config, opts);
                -
                -    RB_OBJ_WRITTEN(self, Qundef, config->decimal_class);
                +    parser_config_init(config, opts, self);
                @@ -1570 +1593 @@
                -static VALUE cParser_parse(JSON_ParserConfig *config, VALUE Vsource)
                +static VALUE cParser_parse(JSON_ParserConfig *config, VALUE src)
                @@ -1572,2 +1595,8 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                +    VALUE Vsource = convert_encoding(src);
                +
                +    // Ensure the string isn't mutated under us.
                +    // The classic API to use is `rb_str_locktmp`, but then we'd
                +    // need to use `rb_protect` to make sure we always unlock.
                +    if (Vsource == src) {
                +        Vsource = rb_str_new_frozen(Vsource);
                +    }
                @@ -1583,0 +1613 @@
                +
                @@ -1601,0 +1632 @@
                +    RB_GC_GUARD(Vsource);
                @@ -1622,3 +1652,0 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                -
                @@ -1627 +1655 @@
                -    parser_config_init(config, opts);
                +    parser_config_init(config, opts, false);
        lib/json/version.rb
                --- /tmp/d20260601-450-v9eom5/json-2.19.5/lib/json/version.rb	2026-06-01 04:28:33.189001258 +0000
                +++ /tmp/d20260601-450-v9eom5/json-2.19.7/lib/json/version.rb	2026-06-01 04:28:33.196001436 +0000
                @@ -4 +4 @@
                -  VERSION = '2.19.5'
                +  VERSION = '2.19.7'

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
        CHANGES.md
                --- /tmp/d20260601-474-bvpye/json-2.19.5/CHANGES.md	2026-06-01 04:28:42.033947868 +0000
                +++ /tmp/d20260601-474-bvpye/json-2.19.7/CHANGES.md	2026-06-01 04:28:42.039947848 +0000
                @@ -4,0 +5,12 @@
                +### 2026-05-28 (2.19.7)
                +
                +* Fix some more edge cases with out of range floats.
                +* Ensure the string provided to `JSON.parse` can't be mutated during parsing.
                +* Add missing write barriers in `State#dup`.
                +* Further validate generator `depth` config.
                +
                +### 2026-05-28 (2.19.6)
                +
                +* Cleanly handle overly large `depth` generator argument.
                +* Add missing write barrier in `ParserConfig`.
                +
        ext/json/ext/fbuffer/fbuffer.h
                --- /tmp/d20260601-474-bvpye/json-2.19.5/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:42.034947865 +0000
                +++ /tmp/d20260601-474-bvpye/json-2.19.7/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:42.040947845 +0000
                @@ -133,0 +134,9 @@
                +static inline size_t fbuffer_size_mul_or_raise(size_t a, size_t b)
                +{
                +    size_t result = a * b;
                +    if (RB_UNLIKELY(a != 0 && (result / a) != b)) {
                +        rb_raise(rb_eArgError, "Buffer overflow, the resulting document is too large to be generated");
                +    }
                +    return result;
                +}
                +
                @@ -178 +187 @@
                -    fbuffer_inc_capa(fb, repeat * len);
                +    fbuffer_inc_capa(fb, fbuffer_size_mul_or_raise(repeat, len));
        ext/json/ext/generator/generator.c
                --- /tmp/d20260601-474-bvpye/json-2.19.5/ext/json/ext/generator/generator.c	2026-06-01 04:28:42.034947865 +0000
                +++ /tmp/d20260601-474-bvpye/json-2.19.7/ext/json/ext/generator/generator.c	2026-06-01 04:28:42.040947845 +0000
                @@ -1370,6 +1370,8 @@
                -    objState->indent = origState->indent;
                -    objState->space = origState->space;
                -    objState->space_before = origState->space_before;
                -    objState->object_nl = origState->object_nl;
                -    objState->array_nl = origState->array_nl;
                -    objState->as_json = origState->as_json;
                +
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->indent);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space_before);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->object_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->array_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->as_json);
                +
                @@ -1591,0 +1594,3 @@
                +    }
                +    if (RB_UNLIKELY(d > INT_MAX)) {
                +        rb_raise(rb_eArgError, "depth is too large (got %ld)", d);
        ext/json/ext/parser/parser.c
                --- /tmp/d20260601-474-bvpye/json-2.19.5/ext/json/ext/parser/parser.c	2026-06-01 04:28:42.035947861 +0000
                +++ /tmp/d20260601-474-bvpye/json-2.19.7/ext/json/ext/parser/parser.c	2026-06-01 04:28:42.041947842 +0000
                @@ -1205 +1205,5 @@
                -        exponent = negative_exponent ? -abs_exponent : abs_exponent;
                +        if (RB_UNLIKELY(exponent_digits >= 20 || abs_exponent > (uint64_t)INT64_MAX)) {
                +            exponent = negative_exponent ? INT64_MIN : INT64_MAX;
                +        } else {
                +            exponent = negative_exponent ? -(int64_t)abs_exponent : (int64_t)abs_exponent;
                +        }
                @@ -1460 +1464,6 @@
                -  int encindex = RB_ENCODING_GET(source);
                +    StringValue(source);
                +    int encindex = RB_ENCODING_GET(source);
                +
                +    if (RB_LIKELY(encindex == utf8_encindex)) {
                +        return source;
                +    }
                @@ -1462 +1471,7 @@
                -  if (RB_LIKELY(encindex == utf8_encindex)) {
                +    if (encindex == binary_encindex) {
                +        // For historical reason, we silently reinterpret binary strings as UTF-8
                +        return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                +    }
                +
                +    source = rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +    StringValue(source);
                @@ -1464 +1479 @@
                -  }
                +}
                @@ -1466,4 +1481,4 @@
                - if (encindex == binary_encindex) {
                -    // For historical reason, we silently reinterpret binary strings as UTF-8
                -    return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                -  }
                +struct parser_config_init_args {
                +    JSON_ParserConfig *config;
                +    VALUE self;
                +};
                @@ -1471 +1486,4 @@
                -  return rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +static void parser_config_wb_write(VALUE self, VALUE *dest, VALUE val)
                +{
                +    *dest = val;
                +    if (self) RB_OBJ_WRITTEN(self, Qundef, val);
                @@ -1476 +1494,3 @@
                -    JSON_ParserConfig *config = (JSON_ParserConfig *)data;
                +    struct parser_config_init_args *args = (struct parser_config_init_args *)data;
                +    JSON_ParserConfig *config = args->config;
                +    VALUE self = args->self;
                @@ -1485 +1505 @@
                -    else if (key == sym_on_load)                    { config->on_load_proc = RTEST(val) ? val : Qfalse; }
                +    else if (key == sym_on_load)                    { parser_config_wb_write(self, &config->on_load_proc, RTEST(val) ? val : Qfalse); }
                @@ -1490 +1510 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1493 +1513 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1502 +1522 @@
                -                    config->decimal_class = rb_path_to_class(mod_path);
                +                    parser_config_wb_write(self, &config->decimal_class, rb_path_to_class(mod_path));
                @@ -1510 +1530 @@
                -                    config->decimal_class = rb_mKernel;
                +                    parser_config_wb_write(self, &config->decimal_class, rb_mKernel);
                @@ -1520 +1540 @@
                -static void parser_config_init(JSON_ParserConfig *config, VALUE opts)
                +static void parser_config_init(JSON_ParserConfig *config, VALUE opts, VALUE self)
                @@ -1523,0 +1544,5 @@
                +    struct parser_config_init_args args = {
                +        .config = config,
                +        .self = self,
                +    };
                +
                @@ -1529 +1554 @@
                -            rb_hash_foreach(opts, parser_config_init_i, (VALUE)config);
                +            rb_hash_foreach(opts, parser_config_init_i, (VALUE)&args);
                @@ -1563,3 +1588 @@
                -    parser_config_init(config, opts);
                -
                -    RB_OBJ_WRITTEN(self, Qundef, config->decimal_class);
                +    parser_config_init(config, opts, self);
                @@ -1570 +1593 @@
                -static VALUE cParser_parse(JSON_ParserConfig *config, VALUE Vsource)
                +static VALUE cParser_parse(JSON_ParserConfig *config, VALUE src)
                @@ -1572,2 +1595,8 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                +    VALUE Vsource = convert_encoding(src);
                +
                +    // Ensure the string isn't mutated under us.
                +    // The classic API to use is `rb_str_locktmp`, but then we'd
                +    // need to use `rb_protect` to make sure we always unlock.
                +    if (Vsource == src) {
                +        Vsource = rb_str_new_frozen(Vsource);
                +    }
                @@ -1583,0 +1613 @@
                +
                @@ -1601,0 +1632 @@
                +    RB_GC_GUARD(Vsource);
                @@ -1622,3 +1652,0 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                -
                @@ -1627 +1655 @@
                -    parser_config_init(config, opts);
                +    parser_config_init(config, opts, false);
        lib/json/version.rb
                --- /tmp/d20260601-474-bvpye/json-2.19.5/lib/json/version.rb	2026-06-01 04:28:42.039947848 +0000
                +++ /tmp/d20260601-474-bvpye/json-2.19.7/lib/json/version.rb	2026-06-01 04:28:42.045947828 +0000
                @@ -4 +4 @@
                -  VERSION = '2.19.5'
                +  VERSION = '2.19.7'

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT date:
    1.28.0: 2026-04-02 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.28.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.28.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.28.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.28.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.28.0: 3.4.10
    2.1.0: 4.0.3
  DIFFERENT version:
    1.28.0: 1.28.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +68/-40
            lib/parallel/version.rb +1/-1

1 similar comment
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT date:
    1.28.0: 2026-04-02 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.28.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.28.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.28.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.28.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.28.0: 3.4.10
    2.1.0: 4.0.3
  DIFFERENT version:
    1.28.0: 1.28.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +68/-40
            lib/parallel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff json 2.19.5 2.19.7

Compared versions: ["2.19.5", "2.19.7"]
  DIFFERENT files:
    2.19.5->2.19.7:
      * Changed:
        CHANGES.md
                --- /tmp/d20260601-490-nczlz/json-2.19.5/CHANGES.md	2026-06-01 04:28:58.996216357 +0000
                +++ /tmp/d20260601-490-nczlz/json-2.19.7/CHANGES.md	2026-06-01 04:28:59.002216371 +0000
                @@ -4,0 +5,12 @@
                +### 2026-05-28 (2.19.7)
                +
                +* Fix some more edge cases with out of range floats.
                +* Ensure the string provided to `JSON.parse` can't be mutated during parsing.
                +* Add missing write barriers in `State#dup`.
                +* Further validate generator `depth` config.
                +
                +### 2026-05-28 (2.19.6)
                +
                +* Cleanly handle overly large `depth` generator argument.
                +* Add missing write barrier in `ParserConfig`.
                +
        ext/json/ext/fbuffer/fbuffer.h
                --- /tmp/d20260601-490-nczlz/json-2.19.5/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:58.997216360 +0000
                +++ /tmp/d20260601-490-nczlz/json-2.19.7/ext/json/ext/fbuffer/fbuffer.h	2026-06-01 04:28:59.003216374 +0000
                @@ -133,0 +134,9 @@
                +static inline size_t fbuffer_size_mul_or_raise(size_t a, size_t b)
                +{
                +    size_t result = a * b;
                +    if (RB_UNLIKELY(a != 0 && (result / a) != b)) {
                +        rb_raise(rb_eArgError, "Buffer overflow, the resulting document is too large to be generated");
                +    }
                +    return result;
                +}
                +
                @@ -178 +187 @@
                -    fbuffer_inc_capa(fb, repeat * len);
                +    fbuffer_inc_capa(fb, fbuffer_size_mul_or_raise(repeat, len));
        ext/json/ext/generator/generator.c
                --- /tmp/d20260601-490-nczlz/json-2.19.5/ext/json/ext/generator/generator.c	2026-06-01 04:28:58.997216360 +0000
                +++ /tmp/d20260601-490-nczlz/json-2.19.7/ext/json/ext/generator/generator.c	2026-06-01 04:28:59.004216376 +0000
                @@ -1370,6 +1370,8 @@
                -    objState->indent = origState->indent;
                -    objState->space = origState->space;
                -    objState->space_before = origState->space_before;
                -    objState->object_nl = origState->object_nl;
                -    objState->array_nl = origState->array_nl;
                -    objState->as_json = origState->as_json;
                +
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->indent);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->space_before);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->object_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->array_nl);
                +    RB_OBJ_WRITTEN(obj, Qundef, objState->as_json);
                +
                @@ -1591,0 +1594,3 @@
                +    }
                +    if (RB_UNLIKELY(d > INT_MAX)) {
                +        rb_raise(rb_eArgError, "depth is too large (got %ld)", d);
        ext/json/ext/parser/parser.c
                --- /tmp/d20260601-490-nczlz/json-2.19.5/ext/json/ext/parser/parser.c	2026-06-01 04:28:58.998216362 +0000
                +++ /tmp/d20260601-490-nczlz/json-2.19.7/ext/json/ext/parser/parser.c	2026-06-01 04:28:59.004216376 +0000
                @@ -1205 +1205,5 @@
                -        exponent = negative_exponent ? -abs_exponent : abs_exponent;
                +        if (RB_UNLIKELY(exponent_digits >= 20 || abs_exponent > (uint64_t)INT64_MAX)) {
                +            exponent = negative_exponent ? INT64_MIN : INT64_MAX;
                +        } else {
                +            exponent = negative_exponent ? -(int64_t)abs_exponent : (int64_t)abs_exponent;
                +        }
                @@ -1460 +1464,6 @@
                -  int encindex = RB_ENCODING_GET(source);
                +    StringValue(source);
                +    int encindex = RB_ENCODING_GET(source);
                +
                +    if (RB_LIKELY(encindex == utf8_encindex)) {
                +        return source;
                +    }
                @@ -1462 +1471,7 @@
                -  if (RB_LIKELY(encindex == utf8_encindex)) {
                +    if (encindex == binary_encindex) {
                +        // For historical reason, we silently reinterpret binary strings as UTF-8
                +        return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                +    }
                +
                +    source = rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +    StringValue(source);
                @@ -1464 +1479 @@
                -  }
                +}
                @@ -1466,4 +1481,4 @@
                - if (encindex == binary_encindex) {
                -    // For historical reason, we silently reinterpret binary strings as UTF-8
                -    return rb_enc_associate_index(rb_str_dup(source), utf8_encindex);
                -  }
                +struct parser_config_init_args {
                +    JSON_ParserConfig *config;
                +    VALUE self;
                +};
                @@ -1471 +1486,4 @@
                -  return rb_funcall(source, i_encode, 1, Encoding_UTF_8);
                +static void parser_config_wb_write(VALUE self, VALUE *dest, VALUE val)
                +{
                +    *dest = val;
                +    if (self) RB_OBJ_WRITTEN(self, Qundef, val);
                @@ -1476 +1494,3 @@
                -    JSON_ParserConfig *config = (JSON_ParserConfig *)data;
                +    struct parser_config_init_args *args = (struct parser_config_init_args *)data;
                +    JSON_ParserConfig *config = args->config;
                +    VALUE self = args->self;
                @@ -1485 +1505 @@
                -    else if (key == sym_on_load)                    { config->on_load_proc = RTEST(val) ? val : Qfalse; }
                +    else if (key == sym_on_load)                    { parser_config_wb_write(self, &config->on_load_proc, RTEST(val) ? val : Qfalse); }
                @@ -1490 +1510 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1493 +1513 @@
                -                config->decimal_class = val;
                +                parser_config_wb_write(self, &config->decimal_class, val);
                @@ -1502 +1522 @@
                -                    config->decimal_class = rb_path_to_class(mod_path);
                +                    parser_config_wb_write(self, &config->decimal_class, rb_path_to_class(mod_path));
                @@ -1510 +1530 @@
                -                    config->decimal_class = rb_mKernel;
                +                    parser_config_wb_write(self, &config->decimal_class, rb_mKernel);
                @@ -1520 +1540 @@
                -static void parser_config_init(JSON_ParserConfig *config, VALUE opts)
                +static void parser_config_init(JSON_ParserConfig *config, VALUE opts, VALUE self)
                @@ -1523,0 +1544,5 @@
                +    struct parser_config_init_args args = {
                +        .config = config,
                +        .self = self,
                +    };
                +
                @@ -1529 +1554 @@
                -            rb_hash_foreach(opts, parser_config_init_i, (VALUE)config);
                +            rb_hash_foreach(opts, parser_config_init_i, (VALUE)&args);
                @@ -1563,3 +1588 @@
                -    parser_config_init(config, opts);
                -
                -    RB_OBJ_WRITTEN(self, Qundef, config->decimal_class);
                +    parser_config_init(config, opts, self);
                @@ -1570 +1593 @@
                -static VALUE cParser_parse(JSON_ParserConfig *config, VALUE Vsource)
                +static VALUE cParser_parse(JSON_ParserConfig *config, VALUE src)
                @@ -1572,2 +1595,8 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                +    VALUE Vsource = convert_encoding(src);
                +
                +    // Ensure the string isn't mutated under us.
                +    // The classic API to use is `rb_str_locktmp`, but then we'd
                +    // need to use `rb_protect` to make sure we always unlock.
                +    if (Vsource == src) {
                +        Vsource = rb_str_new_frozen(Vsource);
                +    }
                @@ -1583,0 +1613 @@
                +
                @@ -1601,0 +1632 @@
                +    RB_GC_GUARD(Vsource);
                @@ -1622,3 +1652,0 @@
                -    Vsource = convert_encoding(StringValue(Vsource));
                -    StringValue(Vsource);
                -
                @@ -1627 +1655 @@
                -    parser_config_init(config, opts);
                +    parser_config_init(config, opts, false);
        lib/json/version.rb
                --- /tmp/d20260601-490-nczlz/json-2.19.5/lib/json/version.rb	2026-06-01 04:28:59.002216371 +0000
                +++ /tmp/d20260601-490-nczlz/json-2.19.7/lib/json/version.rb	2026-06-01 04:28:59.008216386 +0000
                @@ -4 +4 @@
                -  VERSION = '2.19.5'
                +  VERSION = '2.19.7'

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260601-677-6o6j6g	2026-06-01 04:29:00.477623961 +0000
                +++ /tmp/d20260601-677-p7zxi6/parallel-2.1.0/lib/parallel/serializer.rb	2026-06-01 04:29:00.476623938 +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/d20260601-677-p7zxi6/parallel-1.28.0/lib/parallel.rb	2026-06-01 04:29:00.475623916 +0000
                +++ /tmp/d20260601-677-p7zxi6/parallel-2.1.0/lib/parallel.rb	2026-06-01 04:29:00.476623938 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -66 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -69,0 +71 @@
                +      @serializer = serializer
                @@ -86 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -92 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -269 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -473,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -475,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
                @@ -491,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
                @@ -496,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
                @@ -502,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]
                @@ -507 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -510,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
                @@ -512,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -514 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -518,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
                @@ -522,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
                @@ -529,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
                +
                @@ -600,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -621 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -624,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -626 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -635 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -640 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260601-677-p7zxi6/parallel-1.28.0/lib/parallel/version.rb	2026-06-01 04:29:00.476623938 +0000
                +++ /tmp/d20260601-677-p7zxi6/parallel-2.1.0/lib/parallel/version.rb	2026-06-01 04:29:00.476623938 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.28.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260601-695-s1zw61	2026-06-01 04:29:07.048887316 +0000
                +++ /tmp/d20260601-695-r4vjjs/parallel-2.1.0/lib/parallel/serializer.rb	2026-06-01 04:29:07.047887314 +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/d20260601-695-r4vjjs/parallel-1.28.0/lib/parallel.rb	2026-06-01 04:29:07.047887314 +0000
                +++ /tmp/d20260601-695-r4vjjs/parallel-2.1.0/lib/parallel.rb	2026-06-01 04:29:07.047887314 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -66 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -69,0 +71 @@
                +      @serializer = serializer
                @@ -86 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -92 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -269 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -473,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -475,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
                @@ -491,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
                @@ -496,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
                @@ -502,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]
                @@ -507 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -510,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
                @@ -512,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -514 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -518,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
                @@ -522,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
                @@ -529,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
                +
                @@ -600,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -621 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -624,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -626 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -635 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -640 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260601-695-r4vjjs/parallel-1.28.0/lib/parallel/version.rb	2026-06-01 04:29:07.047887314 +0000
                +++ /tmp/d20260601-695-r4vjjs/parallel-2.1.0/lib/parallel/version.rb	2026-06-01 04:29:07.047887314 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.28.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT date:
    1.28.0: 2026-04-02 00:00:00 UTC
    2.1.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.28.0: {"bug_tracker_uri" => "https://github.com/grosser/parallel/issues", "documentation_uri" => "https://github.com/grosser/parallel/blob/v1.28.0/Readme.md", "source_code_uri" => "https://github.com/grosser/parallel/tree/v1.28.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.28.0: >= 2.7
    2.1.0: >= 3.3
  DIFFERENT rubygems_version:
    1.28.0: 3.4.10
    2.1.0: 4.0.3
  DIFFERENT version:
    1.28.0: 1.28.0
    2.1.0: 2.1.0
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
            lib/parallel/serializer.rb +52/-0
      * Changed:
            lib/parallel.rb +68/-40
            lib/parallel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff parallel 1.28.0 2.1.0

Compared versions: ["1.28.0", "2.1.0"]
  DIFFERENT files:
    1.28.0->2.1.0:
      * Added:
        lib/parallel/serializer.rb
                --- /tmp/20260601-711-wmkxuh	2026-06-01 04:29:24.983276744 +0000
                +++ /tmp/d20260601-711-mtl60/parallel-2.1.0/lib/parallel/serializer.rb	2026-06-01 04:29:24.982276742 +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/d20260601-711-mtl60/parallel-1.28.0/lib/parallel.rb	2026-06-01 04:29:24.982276742 +0000
                +++ /tmp/d20260601-711-mtl60/parallel-2.1.0/lib/parallel.rb	2026-06-01 04:29:24.982276742 +0000
                @@ -3,0 +4 @@
                +require 'parallel/serializer'
                @@ -66 +67 @@
                -    def initialize(read, write, pid)
                +    def initialize(read, write, pid, serializer)
                @@ -69,0 +71 @@
                +      @serializer = serializer
                @@ -86 +88 @@
                -        Marshal.dump(data, write)
                +        @serializer.dump(data, write)
                @@ -92 +94 @@
                -        Marshal.load(read)
                +        @serializer.load(read)
                @@ -269 +271 @@
                -      elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes]
                +      elsif RUBY_PLATFORM.include?('java') && !options[:in_processes]
                @@ -473,0 +476,2 @@
                +      use_port = defined?(Ractor::Port)
                +
                @@ -475,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
                @@ -491,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
                @@ -496,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
                @@ -502,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]
                @@ -507 +503 @@
                -          ractors.delete done
                +          ports.delete done_port
                @@ -510,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
                @@ -512,0 +508,2 @@
                +        # send new
                +        item_next, index_next = job
                @@ -514 +511 @@
                -        done.send([callback, item_next, index_next])
                +        done_ractor.send([callback, item_next, index_next])
                @@ -518,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
                @@ -522,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
                @@ -529,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
                +
                @@ -600,0 +627 @@
                +      options[:serializer] ||= Serializer::Marshal
                @@ -621 +648 @@
                -      Worker.new(parent_read, parent_write, pid)
                +      Worker.new(parent_read, parent_write, pid, options[:serializer])
                @@ -624,0 +652 @@
                +      serializer = options.fetch(:serializer)
                @@ -626 +654 @@
                -        data = Marshal.load(read)
                +        data = serializer.load(read)
                @@ -635 +663 @@
                -          rescue Exception # # rubocop:disable Lint/RescueException
                +          rescue Exception # rubocop:disable Lint/RescueException
                @@ -640 +668 @@
                -          Marshal.dump(result, write)
                +          serializer.dump(result, write)
        lib/parallel/version.rb
                --- /tmp/d20260601-711-mtl60/parallel-1.28.0/lib/parallel/version.rb	2026-06-01 04:29:24.982276742 +0000
                +++ /tmp/d20260601-711-mtl60/parallel-2.1.0/lib/parallel/version.rb	2026-06-01 04:29:24.982276742 +0000
                @@ -3 +3 @@
                -  VERSION = Version = '1.28.0' # rubocop:disable Naming/ConstantName
                +  VERSION = Version = '2.1.0' # rubocop:disable Naming/ConstantName

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare rubocop 1.79.2 1.87.0

Compared versions: ["1.79.2", "1.87.0"]
  DIFFERENT date:
    1.79.2: 2025-08-05 00:00:00 UTC
    1.87.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.79.2: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.79.2", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.79/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
    1.87.0: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.87.0", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.87/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    1.79.2: 3.6.2
    1.87.0: 3.6.9
  DIFFERENT version:
    1.79.2: 1.79.2
    1.87.0: 1.87.0
  DIFFERENT files:
    1.79.2->1.87.0:
      * Added:
            lib/rubocop/cli/command/list_enabled_cops_for.rb +40/-0
            lib/rubocop/cli/command/mcp.rb +19/-0
            lib/rubocop/cop/correctors.rb +28/-0
            lib/rubocop/cop/internal_affairs/itblock_handler.rb +69/-0
            lib/rubocop/cop/lint/data_define_override.rb +63/-0
            lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113/-0
            lib/rubocop/cop/mixin.rb +86/-0
            lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63/-0
            lib/rubocop/cop/mixin/project_index_help.rb +48/-0
            lib/rubocop/cop/style/array_intersect_with_single_element.rb +47/-0
            lib/rubocop/cop/style/empty_class_definition.rb +119/-0
            lib/rubocop/cop/style/file_open.rb +84/-0
            lib/rubocop/cop/style/hash_lookup_method.rb +106/-0
            lib/rubocop/cop/style/map_join.rb +123/-0
            lib/rubocop/cop/style/module_member_existence_check.rb +110/-0
            lib/rubocop/cop/style/negative_array_index.rb +220/-0
            lib/rubocop/cop/style/one_class_per_file.rb +115/-0
            lib/rubocop/cop/style/partition_instead_of_double_select.rb +270/-0
            lib/rubocop/cop/style/predicate_with_kind.rb +84/-0
            lib/rubocop/cop/style/reduce_to_hash.rb +200/-0
            lib/rubocop/cop/style/redundant_min_max_by.rb +93/-0
            lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114/-0
            lib/rubocop/cop/style/reverse_find.rb +51/-0
            lib/rubocop/cop/style/select_by_kind.rb +158/-0
            lib/rubocop/cop/style/select_by_range.rb +197/-0
            lib/rubocop/cop/style/tally_method.rb +181/-0
            lib/rubocop/lsp/disable_comment_edits.rb +135/-0
            lib/rubocop/mcp/server.rb +200/-0
            lib/rubocop/project_index_loader.rb +66/-0
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
            config/default.yml +185/-20
            config/obsoletion.yml +9/-0
            exe/rubocop +1/-8
            lib/rubocop.rb +28/-96
            lib/rubocop/cache_config.rb +29/-0
            lib/rubocop/cli.rb +35/-9
            lib/rubocop/cli/command/auto_generate_config.rb +30/-4
            lib/rubocop/cli/command/lsp.rb +1/-1
            lib/rubocop/cli/command/show_cops.rb +2/-2
            lib/rubocop/cli/command/show_docs_url.rb +4/-8
            lib/rubocop/cli/command/suggest_extensions.rb +1/-1
            lib/rubocop/comment_config.rb +59/-17
            lib/rubocop/config.rb +14/-10
            lib/rubocop/config_finder.rb +1/-1
            lib/rubocop/config_loader.rb +37/-23
            lib/rubocop/config_loader_resolver.rb +20/-10
            lib/rubocop/config_obsoletion/extracted_cop.rb +4/-2
            lib/rubocop/config_store.rb +7/-2
            lib/rubocop/config_validator.rb +1/-1
            lib/rubocop/cop/autocorrect_logic.rb +10/-5
            lib/rubocop/cop/base.rb +8/-2
            lib/rubocop/cop/bundler/gem_version.rb +28/-28
            lib/rubocop/cop/bundler/ordered_gems.rb +1/-2
            lib/rubocop/cop/correctors/alignment_corrector.rb +26/-7
            lib/rubocop/cop/correctors/condition_corrector.rb +1/-1
            lib/rubocop/cop/correctors/for_to_each_corrector.rb +7/-2
            lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1/-5
            lib/rubocop/cop/correctors/parentheses_corrector.rb +33/-2
            lib/rubocop/cop/correctors/percent_literal_corrector.rb +2/-2
            lib/rubocop/cop/documentation.rb +2/-3
            lib/rubocop/cop/exclude_limit.rb +31/-5
            lib/rubocop/cop/gemspec/duplicated_assignment.rb +2/-2
            lib/rubocop/cop/gemspec/ordered_dependencies.rb +1/-2
            lib/rubocop/cop/gemspec/require_mfa.rb +5/-5
            lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12/-7
            lib/rubocop/cop/internal_affairs.rb +1/-0
            lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8/-8
            lib/rubocop/cop/internal_affairs/location_exists.rb +28/-2
            lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1/-0
            lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9/-9
            lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3/-1
            lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1/-1
            lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1/-1
            lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4/-4
            lib/rubocop/cop/layout/argument_alignment.rb +2/-2
            lib/rubocop/cop/layout/array_alignment.rb +1/-1
            lib/rubocop/cop/layout/begin_end_alignment.rb +1/-1
            lib/rubocop/cop/layout/case_indentation.rb +3/-1
            lib/rubocop/cop/layout/class_structure.rb +14/-7
            lib/rubocop/cop/layout/dot_position.rb +2/-2
            lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26/-7
            lib/rubocop/cop/layout/empty_line_between_defs.rb +31/-13
            lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2/-2
            lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1/-0
            lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12/-2
            lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16/-2
            lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16/-2
            lib/rubocop/cop/layout/end_alignment.rb +10/-3
            lib/rubocop/cop/layout/first_argument_indentation.rb +34/-1
            lib/rubocop/cop/layout/first_array_element_line_break.rb +26/-0
            lib/rubocop/cop/layout/first_hash_element_indentation.rb +7/-1
            lib/rubocop/cop/layout/first_hash_element_line_break.rb +28/-28
            lib/rubocop/cop/layout/hash_alignment.rb +3/-6
            lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2/-2
            lib/rubocop/cop/layout/heredoc_indentation.rb +33/-3
            lib/rubocop/cop/layout/indentation_style.rb +1/-1
            lib/rubocop/cop/layout/indentation_width.rb +123/-7
            lib/rubocop/cop/layout/line_continuation_spacing.rb +1/-1
            lib/rubocop/cop/layout/line_length.rb +26/-9
            lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57/-57
            lib/rubocop/cop/layout/multiline_assignment_layout.rb +9/-2
            lib/rubocop/cop/layout/multiline_block_layout.rb +2/-0
            lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56/-56
            lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1/-1
            lib/rubocop/cop/layout/multiline_method_call_indentation.rb +229/-39
            lib/rubocop/cop/layout/multiline_operation_indentation.rb +8/-4
            lib/rubocop/cop/layout/parameter_alignment.rb +1/-1
            lib/rubocop/cop/layout/redundant_line_break.rb +3/-1
            lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13/-3
            lib/rubocop/cop/layout/space_after_comma.rb +2/-10
            lib/rubocop/cop/layout/space_after_semicolon.rb +1/-1
            lib/rubocop/cop/layout/space_around_block_parameters.rb +1/-1
            lib/rubocop/cop/layout/space_around_keyword.rb +4/-2
            lib/rubocop/cop/layout/space_before_brackets.rb +1/-1
            lib/rubocop/cop/layout/space_in_lambda_literal.rb +9/-8
            lib/rubocop/cop/layout/trailing_whitespace.rb +1/-1
            lib/rubocop/cop/lint/ambiguous_block_association.rb +1/-1
            lib/rubocop/cop/lint/circular_argument_reference.rb +47/-3
            lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4/-3
            lib/rubocop/cop/lint/constant_reassignment.rb +93/-11
            lib/rubocop/cop/lint/constant_resolution.rb +6/-6
            lib/rubocop/cop/lint/cop_directive_syntax.rb +14/-8
            lib/rubocop/cop/lint/debugger.rb +0/-2
            lib/rubocop/cop/lint/deprecated_constants.rb +1/-1
            lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4/-1
            lib/rubocop/cop/lint/duplicate_match_pattern.rb +4/-4
            lib/rubocop/cop/lint/duplicate_methods.rb +111/-12
            lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5/-42
            lib/rubocop/cop/lint/else_layout.rb +19/-0
            lib/rubocop/cop/lint/empty_block.rb +1/-1
            lib/rubocop/cop/lint/empty_conditional_body.rb +6/-1
            lib/rubocop/cop/lint/empty_in_pattern.rb +8/-1
            lib/rubocop/cop/lint/empty_interpolation.rb +11/-0
            lib/rubocop/cop/lint/empty_when.rb +8/-1
            lib/rubocop/cop/lint/erb_new_arguments.rb +1/-1
            lib/rubocop/cop/lint/float_comparison.rb +1/-1
            lib/rubocop/cop/lint/interpolation_check.rb +7/-2
            lib/rubocop/cop/lint/literal_as_condition.rb +5/-1
            lib/rubocop/cop/lint/literal_in_interpolation.rb +1/-1
            lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18/-9
            lib/rubocop/cop/lint/multiple_comparison.rb +2/-2
            lib/rubocop/cop/lint/next_without_accumulator.rb +2/-0
            lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +4/-0
            lib/rubocop/cop/lint/non_deterministic_require_order.rb +4/-2
            lib/rubocop/cop/lint/number_conversion.rb +6/-6
            lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1/-1
            lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2/-12
            lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23/-9
            lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2/-11
            lib/rubocop/cop/lint/redundant_require_statement.rb +4/-2
            lib/rubocop/cop/lint/redundant_safe_navigation.rb +23/-6
            lib/rubocop/cop/lint/redundant_splat_expansion.rb +8/-2
            lib/rubocop/cop/lint/redundant_type_conversion.rb +3/-3
            lib/rubocop/cop/lint/require_relative_self_path.rb +3/-1
            lib/rubocop/cop/lint/rescue_exception.rb +1/-4
            lib/rubocop/cop/lint/safe_navigation_chain.rb +17/-0
            lib/rubocop/cop/lint/safe_navigation_consistency.rb +7/-1
            lib/rubocop/cop/lint/self_assignment.rb +15/-6
            lib/rubocop/cop/lint/shadowed_argument.rb +7/-7
            lib/rubocop/cop/lint/shadowed_exception.rb +1/-1
            lib/rubocop/cop/lint/struct_new_override.rb +17/-1
            lib/rubocop/cop/lint/syntax.rb +25/-1
            lib/rubocop/cop/lint/to_json.rb +12/-16
            lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1/-0
            lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1/-1
            lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1/-0
            lib/rubocop/cop/lint/unreachable_code.rb +7/-5
            lib/rubocop/cop/lint/unused_method_argument.rb +10/-0
            lib/rubocop/cop/lint/uri_escape_unescape.rb +2/-0
            lib/rubocop/cop/lint/useless_assignment.rb +48/-25
            lib/rubocop/cop/lint/useless_constant_scoping.rb +4/-4
            lib/rubocop/cop/lint/useless_default_value_argument.rb +2/-0
            lib/rubocop/cop/lint/useless_or.rb +15/-2
            lib/rubocop/cop/lint/useless_ruby2_keywords.rb +1/-1
            lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +37/-11
            lib/rubocop/cop/lint/void.rb +39/-12
            lib/rubocop/cop/message_annotator.rb +1/-1
            lib/rubocop/cop/metrics/block_length.rb +1/-1
            lib/rubocop/cop/metrics/block_nesting.rb +23/-0
            lib/rubocop/cop/metrics/method_length.rb +1/-1
            lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4/-3
            lib/rubocop/cop/metrics/utils/iterating_block.rb +1/-1
            lib/rubocop/cop/migration/department_name.rb +12/-1
            lib/rubocop/cop/mixin/check_line_breakable.rb +2/-2
            lib/rubocop/cop/mixin/check_single_line_suitability.rb +4/-6
            lib/rubocop/cop/mixin/code_length.rb +1/-1
            lib/rubocop/cop/mixin/configurable_max.rb +6/-5
            lib/rubocop/cop/mixin/end_keyword_alignment.rb +1/-7
            lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5/-5
            lib/rubocop/cop/mixin/hash_transform_method.rb +10/-60
            lib/rubocop/cop/mixin/line_length_help.rb +21/-2
            lib/rubocop/cop/mixin/method_complexity.rb +1/-1
            lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1/-1
            lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1/-1
            lib/rubocop/cop/mixin/space_after_punctuation.rb +5/-4
            lib/rubocop/cop/mixin/statement_modifier.rb +0/-6
            lib/rubocop/cop/mixin/trailing_comma.rb +8/-5
            lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/block_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1/-1
            lib/rubocop/cop/naming/method_name.rb +5/-3
            lib/rubocop/cop/naming/predicate_method.rb +32/-8
            lib/rubocop/cop/naming/predicate_prefix.rb +12/-12
            lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1/-1
            lib/rubocop/cop/offense.rb +17/-1
            lib/rubocop/cop/registry.rb +62/-38
            lib/rubocop/cop/security/eval.rb +15/-2
            lib/rubocop/cop/security/io_methods.rb +1/-1
            lib/rubocop/cop/security/json_load.rb +33/-11
            lib/rubocop/cop/style/access_modifier_declarations.rb +15/-4
            lib/rubocop/cop/style/accessor_grouping.rb +4/-2
            lib/rubocop/cop/style/alias.rb +14/-2
            lib/rubocop/cop/style/and_or.rb +1/-0
            lib/rubocop/cop/style/arguments_forwarding.rb +24/-6
            lib/rubocop/cop/style/array_intersect.rb +46/-12
            lib/rubocop/cop/style/array_join.rb +4/-2
            lib/rubocop/cop/style/ascii_comments.rb +6/-3
            lib/rubocop/cop/style/attr.rb +5/-2
            lib/rubocop/cop/style/bare_percent_literals.rb +4/-3
            lib/rubocop/cop/style/begin_block.rb +3/-1
            lib/rubocop/cop/style/bitwise_predicate.rb +8/-1
            lib/rubocop/cop/style/block_delimiters.rb +27/-34
            lib/rubocop/cop/style/case_equality.rb +15/-13
            lib/rubocop/cop/style/character_literal.rb +2/-2
            lib/rubocop/cop/style/class_and_module_children.rb +19/-2
            lib/rubocop/cop/style/collection_compact.rb +36/-16
            lib/rubocop/cop/style/colon_method_call.rb +3/-1
            lib/rubocop/cop/style/concat_array_literals.rb +2/-0
            lib/rubocop/cop/style/conditional_assignment.rb +8/-18
            lib/rubocop/cop/style/constant_visibility.rb +17/-12
            lib/rubocop/cop/style/copyright.rb +22/-11
            lib/rubocop/cop/style/date_time.rb +2/-2
            lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1/-1
            lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6/-1
            lib/rubocop/cop/style/documentation.rb +6/-6
            lib/rubocop/cop/style/documentation_method.rb +7/-7
            lib/rubocop/cop/style/double_negation.rb +1/-1
            lib/rubocop/cop/style/each_for_simple_loop.rb +1/-1
            lib/rubocop/cop/style/each_with_object.rb +2/-0
            lib/rubocop/cop/style/empty_block_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_lambda_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_method.rb +0/-6
            lib/rubocop/cop/style/encoding.rb +7/-1
            lib/rubocop/cop/style/end_block.rb +3/-1
            lib/rubocop/cop/style/endless_method.rb +23/-5
            lib/rubocop/cop/style/explicit_block_argument.rb +1/-1
            lib/rubocop/cop/style/file_write.rb +18/-16
            lib/rubocop/cop/style/float_division.rb +15/-1
            lib/rubocop/cop/style/for.rb +3/-0
            lib/rubocop/cop/style/format_string.rb +4/-3
            lib/rubocop/cop/style/format_string_token.rb +49/-5
            lib/rubocop/cop/style/global_vars.rb +5/-2
            lib/rubocop/cop/style/guard_clause.rb +27/-22
            lib/rubocop/cop/style/hash_as_last_array_item.rb +27/-9
            lib/rubocop/cop/style/hash_conversion.rb +1/-1
            lib/rubocop/cop/style/hash_syntax.rb +1/-1
            lib/rubocop/cop/style/hash_transform_keys.rb +17/-7
            lib/rubocop/cop/style/hash_transform_values.rb +17/-7
            lib/rubocop/cop/style/if_inside_else.rb +16/-7
            lib/rubocop/cop/style/if_unless_modifier.rb +57/-17
            lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12/-12
            lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4/-1
            lib/rubocop/cop/style/if_with_semicolon.rb +7/-5
            lib/rubocop/cop/style/infinite_loop.rb +1/-1
            lib/rubocop/cop/style/inline_comment.rb +4/-1
            lib/rubocop/cop/style/ip_addresses.rb +1/-2
            lib/rubocop/cop/style/lambda_call.rb +8/-8
            lib/rubocop/cop/style/magic_comment_format.rb +3/-3
            lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17/-4
            lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15/-2
            lib/rubocop/cop/style/method_def_parentheses.rb +2/-4
            lib/rubocop/cop/style/min_max_comparison.rb +1/-1
            lib/rubocop/cop/style/multiline_if_then.rb +4/-4
            lib/rubocop/cop/style/multiline_method_signature.rb +2/-4
            lib/rubocop/cop/style/mutable_constant.rb +1/-1
            lib/rubocop/cop/style/nil_comparison.rb +11/-10
            lib/rubocop/cop/style/nil_lambda.rb +1/-1
            lib/rubocop/cop/style/non_nil_check.rb +5/-11
            lib/rubocop/cop/style/not.rb +2/-0
            lib/rubocop/cop/style/numeric_literals.rb +3/-2
            lib/rubocop/cop/style/one_line_conditional.rb +21/-12
            lib/rubocop/cop/style/operator_method_call.rb +11/-2
            lib/rubocop/cop/style/parallel_assignment.rb +6/-2
            lib/rubocop/cop/style/percent_literal_delimiters.rb +2/-0
            lib/rubocop/cop/style/preferred_hash_methods.rb +12/-12
            lib/rubocop/cop/style/proc.rb +3/-2
            lib/rubocop/cop/style/raise_args.rb +1/-1
            lib/rubocop/cop/style/redundant_argument.rb +2/-0
            lib/rubocop/cop/style/redundant_array_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_begin.rb +37/-3
            lib/rubocop/cop/style/redundant_condition.rb +6/-3
            lib/rubocop/cop/style/redundant_constant_base.rb +5/-5
            lib/rubocop/cop/style/redundant_each.rb +3/-3
            lib/rubocop/cop/style/redundant_exception.rb +1/-1
            lib/rubocop/cop/style/redundant_fetch_block.rb +1/-1
            lib/rubocop/cop/style/redundant_format.rb +26/-5
            lib/rubocop/cop/style/redundant_interpolation.rb +11/-2
            lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +27/-11
            lib/rubocop/cop/style/redundant_line_continuation.rb +16/-0
            lib/rubocop/cop/style/redundant_parentheses.rb +36/-30
            lib/rubocop/cop/style/redundant_percent_q.rb +5/-3
            lib/rubocop/cop/style/redundant_regexp_argument.rb +9/-0
            lib/rubocop/cop/style/redundant_regexp_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_regexp_escape.rb +8/-0
            lib/rubocop/cop/style/redundant_return.rb +3/-1
            lib/rubocop/cop/style/redundant_self.rb +2/-2
            lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0/-5
            lib/rubocop/cop/style/redundant_sort.rb +7/-7
            lib/rubocop/cop/style/regexp_literal.rb +31/-2
            lib/rubocop/cop/style/rescue_modifier.rb +3/-3
            lib/rubocop/cop/style/safe_navigation.rb +25/-8
            lib/rubocop/cop/style/select_by_regexp.rb +51/-21
            lib/rubocop/cop/style/self_assignment.rb +1/-1
            lib/rubocop/cop/style/semicolon.rb +25/-7
            lib/rubocop/cop/style/single_line_block_params.rb +2/-2
            lib/rubocop/cop/style/single_line_do_end_block.rb +1/-1
            lib/rubocop/cop/style/single_line_methods.rb +3/-1
            lib/rubocop/cop/style/sole_nested_conditional.rb +12/-3
            lib/rubocop/cop/style/special_global_vars.rb +6/-1
            lib/rubocop/cop/style/string_concatenation.rb +17/-13
            lib/rubocop/cop/style/struct_inheritance.rb +13/-0
            lib/rubocop/cop/style/super_arguments.rb +2/-2
            lib/rubocop/cop/style/symbol_array.rb +1/-1
            lib/rubocop/cop/style/symbol_proc.rb +7/-6
            lib/rubocop/cop/style/top_level_method_definition.rb +2/-2
            lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45/-0
            lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1/-1
            lib/rubocop/cop/style/trailing_method_end_statement.rb +1/-0
            lib/rubocop/cop/style/trailing_underscore_variable.rb +11/-11
            lib/rubocop/cop/style/unless_else.rb +10/-9
            lib/rubocop/cop/style/unless_logical_operators.rb +3/-3
            lib/rubocop/cop/style/while_until_modifier.rb +16/-0
            lib/rubocop/cop/style/yoda_condition.rb +1/-1
            lib/rubocop/cop/style/yoda_expression.rb +1/-1
            lib/rubocop/cop/team.rb +87/-36
            lib/rubocop/cop/util.rb +2/-3
            lib/rubocop/cop/utils/format_string.rb +10/-0
            lib/rubocop/cop/variable_force.rb +9/-7
            lib/rubocop/cop/variable_force/branch.rb +30/-6
            lib/rubocop/cop/variable_force/variable.rb +1/-1
            lib/rubocop/cops_documentation_generator.rb +4/-4
            lib/rubocop/directive_comment.rb +48/-4
            lib/rubocop/file_patterns.rb +9/-1
            lib/rubocop/formatter.rb +22/-21
            lib/rubocop/formatter/clang_style_formatter.rb +5/-2
            lib/rubocop/formatter/disabled_config_formatter.rb +24/-7
            lib/rubocop/formatter/formatter_set.rb +2/-2
            lib/rubocop/formatter/junit_formatter.rb +1/-1
            lib/rubocop/formatter/simple_text_formatter.rb +0/-2
            lib/rubocop/formatter/tap_formatter.rb +5/-2
            lib/rubocop/formatter/worst_offenders_formatter.rb +1/-1
            lib/rubocop/lsp/diagnostic.rb +18/-33
            lib/rubocop/lsp/routes.rb +42/-6
            lib/rubocop/lsp/runtime.rb +13/-4
            lib/rubocop/lsp/stdin_runner.rb +8/-17
            lib/rubocop/magic_comment.rb +20/-0
            lib/rubocop/options.rb +35/-4
            lib/rubocop/path_util.rb +14/-2
            lib/rubocop/plugin/loader.rb +1/-1
            lib/rubocop/rake_task.rb +1/-1
            lib/rubocop/remote_config.rb +10/-8
            lib/rubocop/result_cache.rb +61/-38
            lib/rubocop/rspec/cop_helper.rb +8/-0
            lib/rubocop/rspec/shared_contexts.rb +39/-5
            lib/rubocop/rspec/support.rb +2/-1
            lib/rubocop/runner.rb +134/-57
            lib/rubocop/server/cache.rb +6/-29
            lib/rubocop/server/core.rb +2/-0
            lib/rubocop/target_finder.rb +17/-10
            lib/rubocop/target_ruby.rb +31/-14
            lib/rubocop/version.rb +21/-3
            lib/ruby_lsp/rubocop/addon.rb +23/-8
            lib/ruby_lsp/rubocop/runtime_adapter.rb +49/-15
  DIFFERENT extra_rdoc_files:
    1.79.2->1.87.0:
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
  DIFFERENT runtime dependencies:
    1.79.2->1.87.0:
      * Updated:
            parallel from: ["~> 1.10"] to: [">= 1.10"]
            rubocop-ast from: [">= 1.46.0", "< 2.0"] to: [">= 1.49.0", "< 2.0"]

1 similar comment
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare rubocop 1.79.2 1.87.0

Compared versions: ["1.79.2", "1.87.0"]
  DIFFERENT date:
    1.79.2: 2025-08-05 00:00:00 UTC
    1.87.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.79.2: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.79.2", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.79/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
    1.87.0: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.87.0", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.87/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    1.79.2: 3.6.2
    1.87.0: 3.6.9
  DIFFERENT version:
    1.79.2: 1.79.2
    1.87.0: 1.87.0
  DIFFERENT files:
    1.79.2->1.87.0:
      * Added:
            lib/rubocop/cli/command/list_enabled_cops_for.rb +40/-0
            lib/rubocop/cli/command/mcp.rb +19/-0
            lib/rubocop/cop/correctors.rb +28/-0
            lib/rubocop/cop/internal_affairs/itblock_handler.rb +69/-0
            lib/rubocop/cop/lint/data_define_override.rb +63/-0
            lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113/-0
            lib/rubocop/cop/mixin.rb +86/-0
            lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63/-0
            lib/rubocop/cop/mixin/project_index_help.rb +48/-0
            lib/rubocop/cop/style/array_intersect_with_single_element.rb +47/-0
            lib/rubocop/cop/style/empty_class_definition.rb +119/-0
            lib/rubocop/cop/style/file_open.rb +84/-0
            lib/rubocop/cop/style/hash_lookup_method.rb +106/-0
            lib/rubocop/cop/style/map_join.rb +123/-0
            lib/rubocop/cop/style/module_member_existence_check.rb +110/-0
            lib/rubocop/cop/style/negative_array_index.rb +220/-0
            lib/rubocop/cop/style/one_class_per_file.rb +115/-0
            lib/rubocop/cop/style/partition_instead_of_double_select.rb +270/-0
            lib/rubocop/cop/style/predicate_with_kind.rb +84/-0
            lib/rubocop/cop/style/reduce_to_hash.rb +200/-0
            lib/rubocop/cop/style/redundant_min_max_by.rb +93/-0
            lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114/-0
            lib/rubocop/cop/style/reverse_find.rb +51/-0
            lib/rubocop/cop/style/select_by_kind.rb +158/-0
            lib/rubocop/cop/style/select_by_range.rb +197/-0
            lib/rubocop/cop/style/tally_method.rb +181/-0
            lib/rubocop/lsp/disable_comment_edits.rb +135/-0
            lib/rubocop/mcp/server.rb +200/-0
            lib/rubocop/project_index_loader.rb +66/-0
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
            config/default.yml +185/-20
            config/obsoletion.yml +9/-0
            exe/rubocop +1/-8
            lib/rubocop.rb +28/-96
            lib/rubocop/cache_config.rb +29/-0
            lib/rubocop/cli.rb +35/-9
            lib/rubocop/cli/command/auto_generate_config.rb +30/-4
            lib/rubocop/cli/command/lsp.rb +1/-1
            lib/rubocop/cli/command/show_cops.rb +2/-2
            lib/rubocop/cli/command/show_docs_url.rb +4/-8
            lib/rubocop/cli/command/suggest_extensions.rb +1/-1
            lib/rubocop/comment_config.rb +59/-17
            lib/rubocop/config.rb +14/-10
            lib/rubocop/config_finder.rb +1/-1
            lib/rubocop/config_loader.rb +37/-23
            lib/rubocop/config_loader_resolver.rb +20/-10
            lib/rubocop/config_obsoletion/extracted_cop.rb +4/-2
            lib/rubocop/config_store.rb +7/-2
            lib/rubocop/config_validator.rb +1/-1
            lib/rubocop/cop/autocorrect_logic.rb +10/-5
            lib/rubocop/cop/base.rb +8/-2
            lib/rubocop/cop/bundler/gem_version.rb +28/-28
            lib/rubocop/cop/bundler/ordered_gems.rb +1/-2
            lib/rubocop/cop/correctors/alignment_corrector.rb +26/-7
            lib/rubocop/cop/correctors/condition_corrector.rb +1/-1
            lib/rubocop/cop/correctors/for_to_each_corrector.rb +7/-2
            lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1/-5
            lib/rubocop/cop/correctors/parentheses_corrector.rb +33/-2
            lib/rubocop/cop/correctors/percent_literal_corrector.rb +2/-2
            lib/rubocop/cop/documentation.rb +2/-3
            lib/rubocop/cop/exclude_limit.rb +31/-5
            lib/rubocop/cop/gemspec/duplicated_assignment.rb +2/-2
            lib/rubocop/cop/gemspec/ordered_dependencies.rb +1/-2
            lib/rubocop/cop/gemspec/require_mfa.rb +5/-5
            lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12/-7
            lib/rubocop/cop/internal_affairs.rb +1/-0
            lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8/-8
            lib/rubocop/cop/internal_affairs/location_exists.rb +28/-2
            lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1/-0
            lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9/-9
            lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3/-1
            lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1/-1
            lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1/-1
            lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4/-4
            lib/rubocop/cop/layout/argument_alignment.rb +2/-2
            lib/rubocop/cop/layout/array_alignment.rb +1/-1
            lib/rubocop/cop/layout/begin_end_alignment.rb +1/-1
            lib/rubocop/cop/layout/case_indentation.rb +3/-1
            lib/rubocop/cop/layout/class_structure.rb +14/-7
            lib/rubocop/cop/layout/dot_position.rb +2/-2
            lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26/-7
            lib/rubocop/cop/layout/empty_line_between_defs.rb +31/-13
            lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2/-2
            lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1/-0
            lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12/-2
            lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16/-2
            lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16/-2
            lib/rubocop/cop/layout/end_alignment.rb +10/-3
            lib/rubocop/cop/layout/first_argument_indentation.rb +34/-1
            lib/rubocop/cop/layout/first_array_element_line_break.rb +26/-0
            lib/rubocop/cop/layout/first_hash_element_indentation.rb +7/-1
            lib/rubocop/cop/layout/first_hash_element_line_break.rb +28/-28
            lib/rubocop/cop/layout/hash_alignment.rb +3/-6
            lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2/-2
            lib/rubocop/cop/layout/heredoc_indentation.rb +33/-3
            lib/rubocop/cop/layout/indentation_style.rb +1/-1
            lib/rubocop/cop/layout/indentation_width.rb +123/-7
            lib/rubocop/cop/layout/line_continuation_spacing.rb +1/-1
            lib/rubocop/cop/layout/line_length.rb +26/-9
            lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57/-57
            lib/rubocop/cop/layout/multiline_assignment_layout.rb +9/-2
            lib/rubocop/cop/layout/multiline_block_layout.rb +2/-0
            lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56/-56
            lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1/-1
            lib/rubocop/cop/layout/multiline_method_call_indentation.rb +229/-39
            lib/rubocop/cop/layout/multiline_operation_indentation.rb +8/-4
            lib/rubocop/cop/layout/parameter_alignment.rb +1/-1
            lib/rubocop/cop/layout/redundant_line_break.rb +3/-1
            lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13/-3
            lib/rubocop/cop/layout/space_after_comma.rb +2/-10
            lib/rubocop/cop/layout/space_after_semicolon.rb +1/-1
            lib/rubocop/cop/layout/space_around_block_parameters.rb +1/-1
            lib/rubocop/cop/layout/space_around_keyword.rb +4/-2
            lib/rubocop/cop/layout/space_before_brackets.rb +1/-1
            lib/rubocop/cop/layout/space_in_lambda_literal.rb +9/-8
            lib/rubocop/cop/layout/trailing_whitespace.rb +1/-1
            lib/rubocop/cop/lint/ambiguous_block_association.rb +1/-1
            lib/rubocop/cop/lint/circular_argument_reference.rb +47/-3
            lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4/-3
            lib/rubocop/cop/lint/constant_reassignment.rb +93/-11
            lib/rubocop/cop/lint/constant_resolution.rb +6/-6
            lib/rubocop/cop/lint/cop_directive_syntax.rb +14/-8
            lib/rubocop/cop/lint/debugger.rb +0/-2
            lib/rubocop/cop/lint/deprecated_constants.rb +1/-1
            lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4/-1
            lib/rubocop/cop/lint/duplicate_match_pattern.rb +4/-4
            lib/rubocop/cop/lint/duplicate_methods.rb +111/-12
            lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5/-42
            lib/rubocop/cop/lint/else_layout.rb +19/-0
            lib/rubocop/cop/lint/empty_block.rb +1/-1
            lib/rubocop/cop/lint/empty_conditional_body.rb +6/-1
            lib/rubocop/cop/lint/empty_in_pattern.rb +8/-1
            lib/rubocop/cop/lint/empty_interpolation.rb +11/-0
            lib/rubocop/cop/lint/empty_when.rb +8/-1
            lib/rubocop/cop/lint/erb_new_arguments.rb +1/-1
            lib/rubocop/cop/lint/float_comparison.rb +1/-1
            lib/rubocop/cop/lint/interpolation_check.rb +7/-2
            lib/rubocop/cop/lint/literal_as_condition.rb +5/-1
            lib/rubocop/cop/lint/literal_in_interpolation.rb +1/-1
            lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18/-9
            lib/rubocop/cop/lint/multiple_comparison.rb +2/-2
            lib/rubocop/cop/lint/next_without_accumulator.rb +2/-0
            lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +4/-0
            lib/rubocop/cop/lint/non_deterministic_require_order.rb +4/-2
            lib/rubocop/cop/lint/number_conversion.rb +6/-6
            lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1/-1
            lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2/-12
            lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23/-9
            lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2/-11
            lib/rubocop/cop/lint/redundant_require_statement.rb +4/-2
            lib/rubocop/cop/lint/redundant_safe_navigation.rb +23/-6
            lib/rubocop/cop/lint/redundant_splat_expansion.rb +8/-2
            lib/rubocop/cop/lint/redundant_type_conversion.rb +3/-3
            lib/rubocop/cop/lint/require_relative_self_path.rb +3/-1
            lib/rubocop/cop/lint/rescue_exception.rb +1/-4
            lib/rubocop/cop/lint/safe_navigation_chain.rb +17/-0
            lib/rubocop/cop/lint/safe_navigation_consistency.rb +7/-1
            lib/rubocop/cop/lint/self_assignment.rb +15/-6
            lib/rubocop/cop/lint/shadowed_argument.rb +7/-7
            lib/rubocop/cop/lint/shadowed_exception.rb +1/-1
            lib/rubocop/cop/lint/struct_new_override.rb +17/-1
            lib/rubocop/cop/lint/syntax.rb +25/-1
            lib/rubocop/cop/lint/to_json.rb +12/-16
            lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1/-0
            lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1/-1
            lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1/-0
            lib/rubocop/cop/lint/unreachable_code.rb +7/-5
            lib/rubocop/cop/lint/unused_method_argument.rb +10/-0
            lib/rubocop/cop/lint/uri_escape_unescape.rb +2/-0
            lib/rubocop/cop/lint/useless_assignment.rb +48/-25
            lib/rubocop/cop/lint/useless_constant_scoping.rb +4/-4
            lib/rubocop/cop/lint/useless_default_value_argument.rb +2/-0
            lib/rubocop/cop/lint/useless_or.rb +15/-2
            lib/rubocop/cop/lint/useless_ruby2_keywords.rb +1/-1
            lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +37/-11
            lib/rubocop/cop/lint/void.rb +39/-12
            lib/rubocop/cop/message_annotator.rb +1/-1
            lib/rubocop/cop/metrics/block_length.rb +1/-1
            lib/rubocop/cop/metrics/block_nesting.rb +23/-0
            lib/rubocop/cop/metrics/method_length.rb +1/-1
            lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4/-3
            lib/rubocop/cop/metrics/utils/iterating_block.rb +1/-1
            lib/rubocop/cop/migration/department_name.rb +12/-1
            lib/rubocop/cop/mixin/check_line_breakable.rb +2/-2
            lib/rubocop/cop/mixin/check_single_line_suitability.rb +4/-6
            lib/rubocop/cop/mixin/code_length.rb +1/-1
            lib/rubocop/cop/mixin/configurable_max.rb +6/-5
            lib/rubocop/cop/mixin/end_keyword_alignment.rb +1/-7
            lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5/-5
            lib/rubocop/cop/mixin/hash_transform_method.rb +10/-60
            lib/rubocop/cop/mixin/line_length_help.rb +21/-2
            lib/rubocop/cop/mixin/method_complexity.rb +1/-1
            lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1/-1
            lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1/-1
            lib/rubocop/cop/mixin/space_after_punctuation.rb +5/-4
            lib/rubocop/cop/mixin/statement_modifier.rb +0/-6
            lib/rubocop/cop/mixin/trailing_comma.rb +8/-5
            lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/block_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1/-1
            lib/rubocop/cop/naming/method_name.rb +5/-3
            lib/rubocop/cop/naming/predicate_method.rb +32/-8
            lib/rubocop/cop/naming/predicate_prefix.rb +12/-12
            lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1/-1
            lib/rubocop/cop/offense.rb +17/-1
            lib/rubocop/cop/registry.rb +62/-38
            lib/rubocop/cop/security/eval.rb +15/-2
            lib/rubocop/cop/security/io_methods.rb +1/-1
            lib/rubocop/cop/security/json_load.rb +33/-11
            lib/rubocop/cop/style/access_modifier_declarations.rb +15/-4
            lib/rubocop/cop/style/accessor_grouping.rb +4/-2
            lib/rubocop/cop/style/alias.rb +14/-2
            lib/rubocop/cop/style/and_or.rb +1/-0
            lib/rubocop/cop/style/arguments_forwarding.rb +24/-6
            lib/rubocop/cop/style/array_intersect.rb +46/-12
            lib/rubocop/cop/style/array_join.rb +4/-2
            lib/rubocop/cop/style/ascii_comments.rb +6/-3
            lib/rubocop/cop/style/attr.rb +5/-2
            lib/rubocop/cop/style/bare_percent_literals.rb +4/-3
            lib/rubocop/cop/style/begin_block.rb +3/-1
            lib/rubocop/cop/style/bitwise_predicate.rb +8/-1
            lib/rubocop/cop/style/block_delimiters.rb +27/-34
            lib/rubocop/cop/style/case_equality.rb +15/-13
            lib/rubocop/cop/style/character_literal.rb +2/-2
            lib/rubocop/cop/style/class_and_module_children.rb +19/-2
            lib/rubocop/cop/style/collection_compact.rb +36/-16
            lib/rubocop/cop/style/colon_method_call.rb +3/-1
            lib/rubocop/cop/style/concat_array_literals.rb +2/-0
            lib/rubocop/cop/style/conditional_assignment.rb +8/-18
            lib/rubocop/cop/style/constant_visibility.rb +17/-12
            lib/rubocop/cop/style/copyright.rb +22/-11
            lib/rubocop/cop/style/date_time.rb +2/-2
            lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1/-1
            lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6/-1
            lib/rubocop/cop/style/documentation.rb +6/-6
            lib/rubocop/cop/style/documentation_method.rb +7/-7
            lib/rubocop/cop/style/double_negation.rb +1/-1
            lib/rubocop/cop/style/each_for_simple_loop.rb +1/-1
            lib/rubocop/cop/style/each_with_object.rb +2/-0
            lib/rubocop/cop/style/empty_block_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_lambda_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_method.rb +0/-6
            lib/rubocop/cop/style/encoding.rb +7/-1
            lib/rubocop/cop/style/end_block.rb +3/-1
            lib/rubocop/cop/style/endless_method.rb +23/-5
            lib/rubocop/cop/style/explicit_block_argument.rb +1/-1
            lib/rubocop/cop/style/file_write.rb +18/-16
            lib/rubocop/cop/style/float_division.rb +15/-1
            lib/rubocop/cop/style/for.rb +3/-0
            lib/rubocop/cop/style/format_string.rb +4/-3
            lib/rubocop/cop/style/format_string_token.rb +49/-5
            lib/rubocop/cop/style/global_vars.rb +5/-2
            lib/rubocop/cop/style/guard_clause.rb +27/-22
            lib/rubocop/cop/style/hash_as_last_array_item.rb +27/-9
            lib/rubocop/cop/style/hash_conversion.rb +1/-1
            lib/rubocop/cop/style/hash_syntax.rb +1/-1
            lib/rubocop/cop/style/hash_transform_keys.rb +17/-7
            lib/rubocop/cop/style/hash_transform_values.rb +17/-7
            lib/rubocop/cop/style/if_inside_else.rb +16/-7
            lib/rubocop/cop/style/if_unless_modifier.rb +57/-17
            lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12/-12
            lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4/-1
            lib/rubocop/cop/style/if_with_semicolon.rb +7/-5
            lib/rubocop/cop/style/infinite_loop.rb +1/-1
            lib/rubocop/cop/style/inline_comment.rb +4/-1
            lib/rubocop/cop/style/ip_addresses.rb +1/-2
            lib/rubocop/cop/style/lambda_call.rb +8/-8
            lib/rubocop/cop/style/magic_comment_format.rb +3/-3
            lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17/-4
            lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15/-2
            lib/rubocop/cop/style/method_def_parentheses.rb +2/-4
            lib/rubocop/cop/style/min_max_comparison.rb +1/-1
            lib/rubocop/cop/style/multiline_if_then.rb +4/-4
            lib/rubocop/cop/style/multiline_method_signature.rb +2/-4
            lib/rubocop/cop/style/mutable_constant.rb +1/-1
            lib/rubocop/cop/style/nil_comparison.rb +11/-10
            lib/rubocop/cop/style/nil_lambda.rb +1/-1
            lib/rubocop/cop/style/non_nil_check.rb +5/-11
            lib/rubocop/cop/style/not.rb +2/-0
            lib/rubocop/cop/style/numeric_literals.rb +3/-2
            lib/rubocop/cop/style/one_line_conditional.rb +21/-12
            lib/rubocop/cop/style/operator_method_call.rb +11/-2
            lib/rubocop/cop/style/parallel_assignment.rb +6/-2
            lib/rubocop/cop/style/percent_literal_delimiters.rb +2/-0
            lib/rubocop/cop/style/preferred_hash_methods.rb +12/-12
            lib/rubocop/cop/style/proc.rb +3/-2
            lib/rubocop/cop/style/raise_args.rb +1/-1
            lib/rubocop/cop/style/redundant_argument.rb +2/-0
            lib/rubocop/cop/style/redundant_array_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_begin.rb +37/-3
            lib/rubocop/cop/style/redundant_condition.rb +6/-3
            lib/rubocop/cop/style/redundant_constant_base.rb +5/-5
            lib/rubocop/cop/style/redundant_each.rb +3/-3
            lib/rubocop/cop/style/redundant_exception.rb +1/-1
            lib/rubocop/cop/style/redundant_fetch_block.rb +1/-1
            lib/rubocop/cop/style/redundant_format.rb +26/-5
            lib/rubocop/cop/style/redundant_interpolation.rb +11/-2
            lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +27/-11
            lib/rubocop/cop/style/redundant_line_continuation.rb +16/-0
            lib/rubocop/cop/style/redundant_parentheses.rb +36/-30
            lib/rubocop/cop/style/redundant_percent_q.rb +5/-3
            lib/rubocop/cop/style/redundant_regexp_argument.rb +9/-0
            lib/rubocop/cop/style/redundant_regexp_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_regexp_escape.rb +8/-0
            lib/rubocop/cop/style/redundant_return.rb +3/-1
            lib/rubocop/cop/style/redundant_self.rb +2/-2
            lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0/-5
            lib/rubocop/cop/style/redundant_sort.rb +7/-7
            lib/rubocop/cop/style/regexp_literal.rb +31/-2
            lib/rubocop/cop/style/rescue_modifier.rb +3/-3
            lib/rubocop/cop/style/safe_navigation.rb +25/-8
            lib/rubocop/cop/style/select_by_regexp.rb +51/-21
            lib/rubocop/cop/style/self_assignment.rb +1/-1
            lib/rubocop/cop/style/semicolon.rb +25/-7
            lib/rubocop/cop/style/single_line_block_params.rb +2/-2
            lib/rubocop/cop/style/single_line_do_end_block.rb +1/-1
            lib/rubocop/cop/style/single_line_methods.rb +3/-1
            lib/rubocop/cop/style/sole_nested_conditional.rb +12/-3
            lib/rubocop/cop/style/special_global_vars.rb +6/-1
            lib/rubocop/cop/style/string_concatenation.rb +17/-13
            lib/rubocop/cop/style/struct_inheritance.rb +13/-0
            lib/rubocop/cop/style/super_arguments.rb +2/-2
            lib/rubocop/cop/style/symbol_array.rb +1/-1
            lib/rubocop/cop/style/symbol_proc.rb +7/-6
            lib/rubocop/cop/style/top_level_method_definition.rb +2/-2
            lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45/-0
            lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1/-1
            lib/rubocop/cop/style/trailing_method_end_statement.rb +1/-0
            lib/rubocop/cop/style/trailing_underscore_variable.rb +11/-11
            lib/rubocop/cop/style/unless_else.rb +10/-9
            lib/rubocop/cop/style/unless_logical_operators.rb +3/-3
            lib/rubocop/cop/style/while_until_modifier.rb +16/-0
            lib/rubocop/cop/style/yoda_condition.rb +1/-1
            lib/rubocop/cop/style/yoda_expression.rb +1/-1
            lib/rubocop/cop/team.rb +87/-36
            lib/rubocop/cop/util.rb +2/-3
            lib/rubocop/cop/utils/format_string.rb +10/-0
            lib/rubocop/cop/variable_force.rb +9/-7
            lib/rubocop/cop/variable_force/branch.rb +30/-6
            lib/rubocop/cop/variable_force/variable.rb +1/-1
            lib/rubocop/cops_documentation_generator.rb +4/-4
            lib/rubocop/directive_comment.rb +48/-4
            lib/rubocop/file_patterns.rb +9/-1
            lib/rubocop/formatter.rb +22/-21
            lib/rubocop/formatter/clang_style_formatter.rb +5/-2
            lib/rubocop/formatter/disabled_config_formatter.rb +24/-7
            lib/rubocop/formatter/formatter_set.rb +2/-2
            lib/rubocop/formatter/junit_formatter.rb +1/-1
            lib/rubocop/formatter/simple_text_formatter.rb +0/-2
            lib/rubocop/formatter/tap_formatter.rb +5/-2
            lib/rubocop/formatter/worst_offenders_formatter.rb +1/-1
            lib/rubocop/lsp/diagnostic.rb +18/-33
            lib/rubocop/lsp/routes.rb +42/-6
            lib/rubocop/lsp/runtime.rb +13/-4
            lib/rubocop/lsp/stdin_runner.rb +8/-17
            lib/rubocop/magic_comment.rb +20/-0
            lib/rubocop/options.rb +35/-4
            lib/rubocop/path_util.rb +14/-2
            lib/rubocop/plugin/loader.rb +1/-1
            lib/rubocop/rake_task.rb +1/-1
            lib/rubocop/remote_config.rb +10/-8
            lib/rubocop/result_cache.rb +61/-38
            lib/rubocop/rspec/cop_helper.rb +8/-0
            lib/rubocop/rspec/shared_contexts.rb +39/-5
            lib/rubocop/rspec/support.rb +2/-1
            lib/rubocop/runner.rb +134/-57
            lib/rubocop/server/cache.rb +6/-29
            lib/rubocop/server/core.rb +2/-0
            lib/rubocop/target_finder.rb +17/-10
            lib/rubocop/target_ruby.rb +31/-14
            lib/rubocop/version.rb +21/-3
            lib/ruby_lsp/rubocop/addon.rb +23/-8
            lib/ruby_lsp/rubocop/runtime_adapter.rb +49/-15
  DIFFERENT extra_rdoc_files:
    1.79.2->1.87.0:
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
  DIFFERENT runtime dependencies:
    1.79.2->1.87.0:
      * Updated:
            parallel from: ["~> 1.10"] to: [">= 1.10"]
            rubocop-ast from: [">= 1.46.0", "< 2.0"] to: [">= 1.49.0", "< 2.0"]

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff rubocop 1.79.2 1.87.0

Diff too large (724764 chars)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT date:
    3.1.4: 2025-01-13 00:00:00 UTC
    3.2.0: 2025-09-09 00:00:00 UTC
  DIFFERENT description:
    3.1.4: [Unicode 16.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
    3.2.0: [Unicode 17.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
  DIFFERENT version:
    3.1.4: 3.1.4
    3.2.0: 3.2.0
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
            CHANGELOG.md +8/-0
            README.md +5/-5
            lib/unicode/display_width/constants.rb +2/-2
            lib/unicode/display_width/emoji_support.rb +5/-2
  DIFFERENT extra_rdoc_files:
    3.1.4->3.2.0:
      * Changed:
            README.md +5/-5
            CHANGELOG.md +8/-0
  DIFFERENT runtime dependencies:
    3.1.4->3.2.0:
      * Updated:
            unicode-emoji from: ["~> 4.0", ">= 4.0.4"] to: ["~> 4.1"]

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff rubocop 1.79.2 1.87.0

Diff too large (724763 chars)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare rubocop 1.79.2 1.87.0

Compared versions: ["1.79.2", "1.87.0"]
  DIFFERENT date:
    1.79.2: 2025-08-05 00:00:00 UTC
    1.87.0: 1980-01-02 00:00:00 UTC
  DIFFERENT metadata:
    1.79.2: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.79.2", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.79/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
    1.87.0: {"homepage_uri" => "https://rubocop.org/", "changelog_uri" => "https://github.com/rubocop/rubocop/releases/tag/v1.87.0", "source_code_uri" => "https://github.com/rubocop/rubocop/", "documentation_uri" => "https://docs.rubocop.org/rubocop/1.87/", "bug_tracker_uri" => "https://github.com/rubocop/rubocop/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    1.79.2: 3.6.2
    1.87.0: 3.6.9
  DIFFERENT version:
    1.79.2: 1.79.2
    1.87.0: 1.87.0
  DIFFERENT files:
    1.79.2->1.87.0:
      * Added:
            lib/rubocop/cli/command/list_enabled_cops_for.rb +40/-0
            lib/rubocop/cli/command/mcp.rb +19/-0
            lib/rubocop/cop/correctors.rb +28/-0
            lib/rubocop/cop/internal_affairs/itblock_handler.rb +69/-0
            lib/rubocop/cop/lint/data_define_override.rb +63/-0
            lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113/-0
            lib/rubocop/cop/mixin.rb +86/-0
            lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63/-0
            lib/rubocop/cop/mixin/project_index_help.rb +48/-0
            lib/rubocop/cop/style/array_intersect_with_single_element.rb +47/-0
            lib/rubocop/cop/style/empty_class_definition.rb +119/-0
            lib/rubocop/cop/style/file_open.rb +84/-0
            lib/rubocop/cop/style/hash_lookup_method.rb +106/-0
            lib/rubocop/cop/style/map_join.rb +123/-0
            lib/rubocop/cop/style/module_member_existence_check.rb +110/-0
            lib/rubocop/cop/style/negative_array_index.rb +220/-0
            lib/rubocop/cop/style/one_class_per_file.rb +115/-0
            lib/rubocop/cop/style/partition_instead_of_double_select.rb +270/-0
            lib/rubocop/cop/style/predicate_with_kind.rb +84/-0
            lib/rubocop/cop/style/reduce_to_hash.rb +200/-0
            lib/rubocop/cop/style/redundant_min_max_by.rb +93/-0
            lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114/-0
            lib/rubocop/cop/style/reverse_find.rb +51/-0
            lib/rubocop/cop/style/select_by_kind.rb +158/-0
            lib/rubocop/cop/style/select_by_range.rb +197/-0
            lib/rubocop/cop/style/tally_method.rb +181/-0
            lib/rubocop/lsp/disable_comment_edits.rb +135/-0
            lib/rubocop/mcp/server.rb +200/-0
            lib/rubocop/project_index_loader.rb +66/-0
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
            config/default.yml +185/-20
            config/obsoletion.yml +9/-0
            exe/rubocop +1/-8
            lib/rubocop.rb +28/-96
            lib/rubocop/cache_config.rb +29/-0
            lib/rubocop/cli.rb +35/-9
            lib/rubocop/cli/command/auto_generate_config.rb +30/-4
            lib/rubocop/cli/command/lsp.rb +1/-1
            lib/rubocop/cli/command/show_cops.rb +2/-2
            lib/rubocop/cli/command/show_docs_url.rb +4/-8
            lib/rubocop/cli/command/suggest_extensions.rb +1/-1
            lib/rubocop/comment_config.rb +59/-17
            lib/rubocop/config.rb +14/-10
            lib/rubocop/config_finder.rb +1/-1
            lib/rubocop/config_loader.rb +37/-23
            lib/rubocop/config_loader_resolver.rb +20/-10
            lib/rubocop/config_obsoletion/extracted_cop.rb +4/-2
            lib/rubocop/config_store.rb +7/-2
            lib/rubocop/config_validator.rb +1/-1
            lib/rubocop/cop/autocorrect_logic.rb +10/-5
            lib/rubocop/cop/base.rb +8/-2
            lib/rubocop/cop/bundler/gem_version.rb +28/-28
            lib/rubocop/cop/bundler/ordered_gems.rb +1/-2
            lib/rubocop/cop/correctors/alignment_corrector.rb +26/-7
            lib/rubocop/cop/correctors/condition_corrector.rb +1/-1
            lib/rubocop/cop/correctors/for_to_each_corrector.rb +7/-2
            lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1/-5
            lib/rubocop/cop/correctors/parentheses_corrector.rb +33/-2
            lib/rubocop/cop/correctors/percent_literal_corrector.rb +2/-2
            lib/rubocop/cop/documentation.rb +2/-3
            lib/rubocop/cop/exclude_limit.rb +31/-5
            lib/rubocop/cop/gemspec/duplicated_assignment.rb +2/-2
            lib/rubocop/cop/gemspec/ordered_dependencies.rb +1/-2
            lib/rubocop/cop/gemspec/require_mfa.rb +5/-5
            lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12/-7
            lib/rubocop/cop/internal_affairs.rb +1/-0
            lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8/-8
            lib/rubocop/cop/internal_affairs/location_exists.rb +28/-2
            lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1/-0
            lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9/-9
            lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3/-1
            lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1/-1
            lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1/-1
            lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4/-4
            lib/rubocop/cop/layout/argument_alignment.rb +2/-2
            lib/rubocop/cop/layout/array_alignment.rb +1/-1
            lib/rubocop/cop/layout/begin_end_alignment.rb +1/-1
            lib/rubocop/cop/layout/case_indentation.rb +3/-1
            lib/rubocop/cop/layout/class_structure.rb +14/-7
            lib/rubocop/cop/layout/dot_position.rb +2/-2
            lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26/-7
            lib/rubocop/cop/layout/empty_line_between_defs.rb +31/-13
            lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2/-2
            lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1/-0
            lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12/-2
            lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16/-2
            lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16/-2
            lib/rubocop/cop/layout/end_alignment.rb +10/-3
            lib/rubocop/cop/layout/first_argument_indentation.rb +34/-1
            lib/rubocop/cop/layout/first_array_element_line_break.rb +26/-0
            lib/rubocop/cop/layout/first_hash_element_indentation.rb +7/-1
            lib/rubocop/cop/layout/first_hash_element_line_break.rb +28/-28
            lib/rubocop/cop/layout/hash_alignment.rb +3/-6
            lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2/-2
            lib/rubocop/cop/layout/heredoc_indentation.rb +33/-3
            lib/rubocop/cop/layout/indentation_style.rb +1/-1
            lib/rubocop/cop/layout/indentation_width.rb +123/-7
            lib/rubocop/cop/layout/line_continuation_spacing.rb +1/-1
            lib/rubocop/cop/layout/line_length.rb +26/-9
            lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57/-57
            lib/rubocop/cop/layout/multiline_assignment_layout.rb +9/-2
            lib/rubocop/cop/layout/multiline_block_layout.rb +2/-0
            lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56/-56
            lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1/-1
            lib/rubocop/cop/layout/multiline_method_call_indentation.rb +229/-39
            lib/rubocop/cop/layout/multiline_operation_indentation.rb +8/-4
            lib/rubocop/cop/layout/parameter_alignment.rb +1/-1
            lib/rubocop/cop/layout/redundant_line_break.rb +3/-1
            lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13/-3
            lib/rubocop/cop/layout/space_after_comma.rb +2/-10
            lib/rubocop/cop/layout/space_after_semicolon.rb +1/-1
            lib/rubocop/cop/layout/space_around_block_parameters.rb +1/-1
            lib/rubocop/cop/layout/space_around_keyword.rb +4/-2
            lib/rubocop/cop/layout/space_before_brackets.rb +1/-1
            lib/rubocop/cop/layout/space_in_lambda_literal.rb +9/-8
            lib/rubocop/cop/layout/trailing_whitespace.rb +1/-1
            lib/rubocop/cop/lint/ambiguous_block_association.rb +1/-1
            lib/rubocop/cop/lint/circular_argument_reference.rb +47/-3
            lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4/-3
            lib/rubocop/cop/lint/constant_reassignment.rb +93/-11
            lib/rubocop/cop/lint/constant_resolution.rb +6/-6
            lib/rubocop/cop/lint/cop_directive_syntax.rb +14/-8
            lib/rubocop/cop/lint/debugger.rb +0/-2
            lib/rubocop/cop/lint/deprecated_constants.rb +1/-1
            lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4/-1
            lib/rubocop/cop/lint/duplicate_match_pattern.rb +4/-4
            lib/rubocop/cop/lint/duplicate_methods.rb +111/-12
            lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5/-42
            lib/rubocop/cop/lint/else_layout.rb +19/-0
            lib/rubocop/cop/lint/empty_block.rb +1/-1
            lib/rubocop/cop/lint/empty_conditional_body.rb +6/-1
            lib/rubocop/cop/lint/empty_in_pattern.rb +8/-1
            lib/rubocop/cop/lint/empty_interpolation.rb +11/-0
            lib/rubocop/cop/lint/empty_when.rb +8/-1
            lib/rubocop/cop/lint/erb_new_arguments.rb +1/-1
            lib/rubocop/cop/lint/float_comparison.rb +1/-1
            lib/rubocop/cop/lint/interpolation_check.rb +7/-2
            lib/rubocop/cop/lint/literal_as_condition.rb +5/-1
            lib/rubocop/cop/lint/literal_in_interpolation.rb +1/-1
            lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18/-9
            lib/rubocop/cop/lint/multiple_comparison.rb +2/-2
            lib/rubocop/cop/lint/next_without_accumulator.rb +2/-0
            lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +4/-0
            lib/rubocop/cop/lint/non_deterministic_require_order.rb +4/-2
            lib/rubocop/cop/lint/number_conversion.rb +6/-6
            lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1/-1
            lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2/-12
            lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23/-9
            lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2/-11
            lib/rubocop/cop/lint/redundant_require_statement.rb +4/-2
            lib/rubocop/cop/lint/redundant_safe_navigation.rb +23/-6
            lib/rubocop/cop/lint/redundant_splat_expansion.rb +8/-2
            lib/rubocop/cop/lint/redundant_type_conversion.rb +3/-3
            lib/rubocop/cop/lint/require_relative_self_path.rb +3/-1
            lib/rubocop/cop/lint/rescue_exception.rb +1/-4
            lib/rubocop/cop/lint/safe_navigation_chain.rb +17/-0
            lib/rubocop/cop/lint/safe_navigation_consistency.rb +7/-1
            lib/rubocop/cop/lint/self_assignment.rb +15/-6
            lib/rubocop/cop/lint/shadowed_argument.rb +7/-7
            lib/rubocop/cop/lint/shadowed_exception.rb +1/-1
            lib/rubocop/cop/lint/struct_new_override.rb +17/-1
            lib/rubocop/cop/lint/syntax.rb +25/-1
            lib/rubocop/cop/lint/to_json.rb +12/-16
            lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1/-0
            lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1/-1
            lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1/-0
            lib/rubocop/cop/lint/unreachable_code.rb +7/-5
            lib/rubocop/cop/lint/unused_method_argument.rb +10/-0
            lib/rubocop/cop/lint/uri_escape_unescape.rb +2/-0
            lib/rubocop/cop/lint/useless_assignment.rb +48/-25
            lib/rubocop/cop/lint/useless_constant_scoping.rb +4/-4
            lib/rubocop/cop/lint/useless_default_value_argument.rb +2/-0
            lib/rubocop/cop/lint/useless_or.rb +15/-2
            lib/rubocop/cop/lint/useless_ruby2_keywords.rb +1/-1
            lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +37/-11
            lib/rubocop/cop/lint/void.rb +39/-12
            lib/rubocop/cop/message_annotator.rb +1/-1
            lib/rubocop/cop/metrics/block_length.rb +1/-1
            lib/rubocop/cop/metrics/block_nesting.rb +23/-0
            lib/rubocop/cop/metrics/method_length.rb +1/-1
            lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4/-3
            lib/rubocop/cop/metrics/utils/iterating_block.rb +1/-1
            lib/rubocop/cop/migration/department_name.rb +12/-1
            lib/rubocop/cop/mixin/check_line_breakable.rb +2/-2
            lib/rubocop/cop/mixin/check_single_line_suitability.rb +4/-6
            lib/rubocop/cop/mixin/code_length.rb +1/-1
            lib/rubocop/cop/mixin/configurable_max.rb +6/-5
            lib/rubocop/cop/mixin/end_keyword_alignment.rb +1/-7
            lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5/-5
            lib/rubocop/cop/mixin/hash_transform_method.rb +10/-60
            lib/rubocop/cop/mixin/line_length_help.rb +21/-2
            lib/rubocop/cop/mixin/method_complexity.rb +1/-1
            lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1/-1
            lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1/-1
            lib/rubocop/cop/mixin/space_after_punctuation.rb +5/-4
            lib/rubocop/cop/mixin/statement_modifier.rb +0/-6
            lib/rubocop/cop/mixin/trailing_comma.rb +8/-5
            lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/block_parameter_name.rb +1/-1
            lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1/-1
            lib/rubocop/cop/naming/method_name.rb +5/-3
            lib/rubocop/cop/naming/predicate_method.rb +32/-8
            lib/rubocop/cop/naming/predicate_prefix.rb +12/-12
            lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1/-1
            lib/rubocop/cop/offense.rb +17/-1
            lib/rubocop/cop/registry.rb +62/-38
            lib/rubocop/cop/security/eval.rb +15/-2
            lib/rubocop/cop/security/io_methods.rb +1/-1
            lib/rubocop/cop/security/json_load.rb +33/-11
            lib/rubocop/cop/style/access_modifier_declarations.rb +15/-4
            lib/rubocop/cop/style/accessor_grouping.rb +4/-2
            lib/rubocop/cop/style/alias.rb +14/-2
            lib/rubocop/cop/style/and_or.rb +1/-0
            lib/rubocop/cop/style/arguments_forwarding.rb +24/-6
            lib/rubocop/cop/style/array_intersect.rb +46/-12
            lib/rubocop/cop/style/array_join.rb +4/-2
            lib/rubocop/cop/style/ascii_comments.rb +6/-3
            lib/rubocop/cop/style/attr.rb +5/-2
            lib/rubocop/cop/style/bare_percent_literals.rb +4/-3
            lib/rubocop/cop/style/begin_block.rb +3/-1
            lib/rubocop/cop/style/bitwise_predicate.rb +8/-1
            lib/rubocop/cop/style/block_delimiters.rb +27/-34
            lib/rubocop/cop/style/case_equality.rb +15/-13
            lib/rubocop/cop/style/character_literal.rb +2/-2
            lib/rubocop/cop/style/class_and_module_children.rb +19/-2
            lib/rubocop/cop/style/collection_compact.rb +36/-16
            lib/rubocop/cop/style/colon_method_call.rb +3/-1
            lib/rubocop/cop/style/concat_array_literals.rb +2/-0
            lib/rubocop/cop/style/conditional_assignment.rb +8/-18
            lib/rubocop/cop/style/constant_visibility.rb +17/-12
            lib/rubocop/cop/style/copyright.rb +22/-11
            lib/rubocop/cop/style/date_time.rb +2/-2
            lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1/-1
            lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6/-1
            lib/rubocop/cop/style/documentation.rb +6/-6
            lib/rubocop/cop/style/documentation_method.rb +7/-7
            lib/rubocop/cop/style/double_negation.rb +1/-1
            lib/rubocop/cop/style/each_for_simple_loop.rb +1/-1
            lib/rubocop/cop/style/each_with_object.rb +2/-0
            lib/rubocop/cop/style/empty_block_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_lambda_parameter.rb +1/-1
            lib/rubocop/cop/style/empty_method.rb +0/-6
            lib/rubocop/cop/style/encoding.rb +7/-1
            lib/rubocop/cop/style/end_block.rb +3/-1
            lib/rubocop/cop/style/endless_method.rb +23/-5
            lib/rubocop/cop/style/explicit_block_argument.rb +1/-1
            lib/rubocop/cop/style/file_write.rb +18/-16
            lib/rubocop/cop/style/float_division.rb +15/-1
            lib/rubocop/cop/style/for.rb +3/-0
            lib/rubocop/cop/style/format_string.rb +4/-3
            lib/rubocop/cop/style/format_string_token.rb +49/-5
            lib/rubocop/cop/style/global_vars.rb +5/-2
            lib/rubocop/cop/style/guard_clause.rb +27/-22
            lib/rubocop/cop/style/hash_as_last_array_item.rb +27/-9
            lib/rubocop/cop/style/hash_conversion.rb +1/-1
            lib/rubocop/cop/style/hash_syntax.rb +1/-1
            lib/rubocop/cop/style/hash_transform_keys.rb +17/-7
            lib/rubocop/cop/style/hash_transform_values.rb +17/-7
            lib/rubocop/cop/style/if_inside_else.rb +16/-7
            lib/rubocop/cop/style/if_unless_modifier.rb +57/-17
            lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12/-12
            lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4/-1
            lib/rubocop/cop/style/if_with_semicolon.rb +7/-5
            lib/rubocop/cop/style/infinite_loop.rb +1/-1
            lib/rubocop/cop/style/inline_comment.rb +4/-1
            lib/rubocop/cop/style/ip_addresses.rb +1/-2
            lib/rubocop/cop/style/lambda_call.rb +8/-8
            lib/rubocop/cop/style/magic_comment_format.rb +3/-3
            lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17/-4
            lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15/-2
            lib/rubocop/cop/style/method_def_parentheses.rb +2/-4
            lib/rubocop/cop/style/min_max_comparison.rb +1/-1
            lib/rubocop/cop/style/multiline_if_then.rb +4/-4
            lib/rubocop/cop/style/multiline_method_signature.rb +2/-4
            lib/rubocop/cop/style/mutable_constant.rb +1/-1
            lib/rubocop/cop/style/nil_comparison.rb +11/-10
            lib/rubocop/cop/style/nil_lambda.rb +1/-1
            lib/rubocop/cop/style/non_nil_check.rb +5/-11
            lib/rubocop/cop/style/not.rb +2/-0
            lib/rubocop/cop/style/numeric_literals.rb +3/-2
            lib/rubocop/cop/style/one_line_conditional.rb +21/-12
            lib/rubocop/cop/style/operator_method_call.rb +11/-2
            lib/rubocop/cop/style/parallel_assignment.rb +6/-2
            lib/rubocop/cop/style/percent_literal_delimiters.rb +2/-0
            lib/rubocop/cop/style/preferred_hash_methods.rb +12/-12
            lib/rubocop/cop/style/proc.rb +3/-2
            lib/rubocop/cop/style/raise_args.rb +1/-1
            lib/rubocop/cop/style/redundant_argument.rb +2/-0
            lib/rubocop/cop/style/redundant_array_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_begin.rb +37/-3
            lib/rubocop/cop/style/redundant_condition.rb +6/-3
            lib/rubocop/cop/style/redundant_constant_base.rb +5/-5
            lib/rubocop/cop/style/redundant_each.rb +3/-3
            lib/rubocop/cop/style/redundant_exception.rb +1/-1
            lib/rubocop/cop/style/redundant_fetch_block.rb +1/-1
            lib/rubocop/cop/style/redundant_format.rb +26/-5
            lib/rubocop/cop/style/redundant_interpolation.rb +11/-2
            lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +27/-11
            lib/rubocop/cop/style/redundant_line_continuation.rb +16/-0
            lib/rubocop/cop/style/redundant_parentheses.rb +36/-30
            lib/rubocop/cop/style/redundant_percent_q.rb +5/-3
            lib/rubocop/cop/style/redundant_regexp_argument.rb +9/-0
            lib/rubocop/cop/style/redundant_regexp_constructor.rb +2/-2
            lib/rubocop/cop/style/redundant_regexp_escape.rb +8/-0
            lib/rubocop/cop/style/redundant_return.rb +3/-1
            lib/rubocop/cop/style/redundant_self.rb +2/-2
            lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0/-5
            lib/rubocop/cop/style/redundant_sort.rb +7/-7
            lib/rubocop/cop/style/regexp_literal.rb +31/-2
            lib/rubocop/cop/style/rescue_modifier.rb +3/-3
            lib/rubocop/cop/style/safe_navigation.rb +25/-8
            lib/rubocop/cop/style/select_by_regexp.rb +51/-21
            lib/rubocop/cop/style/self_assignment.rb +1/-1
            lib/rubocop/cop/style/semicolon.rb +25/-7
            lib/rubocop/cop/style/single_line_block_params.rb +2/-2
            lib/rubocop/cop/style/single_line_do_end_block.rb +1/-1
            lib/rubocop/cop/style/single_line_methods.rb +3/-1
            lib/rubocop/cop/style/sole_nested_conditional.rb +12/-3
            lib/rubocop/cop/style/special_global_vars.rb +6/-1
            lib/rubocop/cop/style/string_concatenation.rb +17/-13
            lib/rubocop/cop/style/struct_inheritance.rb +13/-0
            lib/rubocop/cop/style/super_arguments.rb +2/-2
            lib/rubocop/cop/style/symbol_array.rb +1/-1
            lib/rubocop/cop/style/symbol_proc.rb +7/-6
            lib/rubocop/cop/style/top_level_method_definition.rb +2/-2
            lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45/-0
            lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1/-1
            lib/rubocop/cop/style/trailing_method_end_statement.rb +1/-0
            lib/rubocop/cop/style/trailing_underscore_variable.rb +11/-11
            lib/rubocop/cop/style/unless_else.rb +10/-9
            lib/rubocop/cop/style/unless_logical_operators.rb +3/-3
            lib/rubocop/cop/style/while_until_modifier.rb +16/-0
            lib/rubocop/cop/style/yoda_condition.rb +1/-1
            lib/rubocop/cop/style/yoda_expression.rb +1/-1
            lib/rubocop/cop/team.rb +87/-36
            lib/rubocop/cop/util.rb +2/-3
            lib/rubocop/cop/utils/format_string.rb +10/-0
            lib/rubocop/cop/variable_force.rb +9/-7
            lib/rubocop/cop/variable_force/branch.rb +30/-6
            lib/rubocop/cop/variable_force/variable.rb +1/-1
            lib/rubocop/cops_documentation_generator.rb +4/-4
            lib/rubocop/directive_comment.rb +48/-4
            lib/rubocop/file_patterns.rb +9/-1
            lib/rubocop/formatter.rb +22/-21
            lib/rubocop/formatter/clang_style_formatter.rb +5/-2
            lib/rubocop/formatter/disabled_config_formatter.rb +24/-7
            lib/rubocop/formatter/formatter_set.rb +2/-2
            lib/rubocop/formatter/junit_formatter.rb +1/-1
            lib/rubocop/formatter/simple_text_formatter.rb +0/-2
            lib/rubocop/formatter/tap_formatter.rb +5/-2
            lib/rubocop/formatter/worst_offenders_formatter.rb +1/-1
            lib/rubocop/lsp/diagnostic.rb +18/-33
            lib/rubocop/lsp/routes.rb +42/-6
            lib/rubocop/lsp/runtime.rb +13/-4
            lib/rubocop/lsp/stdin_runner.rb +8/-17
            lib/rubocop/magic_comment.rb +20/-0
            lib/rubocop/options.rb +35/-4
            lib/rubocop/path_util.rb +14/-2
            lib/rubocop/plugin/loader.rb +1/-1
            lib/rubocop/rake_task.rb +1/-1
            lib/rubocop/remote_config.rb +10/-8
            lib/rubocop/result_cache.rb +61/-38
            lib/rubocop/rspec/cop_helper.rb +8/-0
            lib/rubocop/rspec/shared_contexts.rb +39/-5
            lib/rubocop/rspec/support.rb +2/-1
            lib/rubocop/runner.rb +134/-57
            lib/rubocop/server/cache.rb +6/-29
            lib/rubocop/server/core.rb +2/-0
            lib/rubocop/target_finder.rb +17/-10
            lib/rubocop/target_ruby.rb +31/-14
            lib/rubocop/version.rb +21/-3
            lib/ruby_lsp/rubocop/addon.rb +23/-8
            lib/ruby_lsp/rubocop/runtime_adapter.rb +49/-15
  DIFFERENT extra_rdoc_files:
    1.79.2->1.87.0:
      * Changed:
            LICENSE.txt +1/-1
            README.md +2/-2
  DIFFERENT runtime dependencies:
    1.79.2->1.87.0:
      * Updated:
            parallel from: ["~> 1.10"] to: [">= 1.10"]
            rubocop-ast from: [">= 1.46.0", "< 2.0"] to: [">= 1.49.0", "< 2.0"]

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT date:
    3.1.4: 2025-01-13 00:00:00 UTC
    3.2.0: 2025-09-09 00:00:00 UTC
  DIFFERENT description:
    3.1.4: [Unicode 16.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
    3.2.0: [Unicode 17.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
  DIFFERENT version:
    3.1.4: 3.1.4
    3.2.0: 3.2.0
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
            CHANGELOG.md +8/-0
            README.md +5/-5
            lib/unicode/display_width/constants.rb +2/-2
            lib/unicode/display_width/emoji_support.rb +5/-2
  DIFFERENT extra_rdoc_files:
    3.1.4->3.2.0:
      * Changed:
            README.md +5/-5
            CHANGELOG.md +8/-0
  DIFFERENT runtime dependencies:
    3.1.4->3.2.0:
      * Updated:
            unicode-emoji from: ["~> 4.0", ">= 4.0.4"] to: ["~> 4.1"]

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
        CHANGELOG.md
                --- /tmp/d20260601-8300-sagswq/unicode-display_width-3.1.4/CHANGELOG.md	2026-06-01 04:30:10.793852829 +0000
                +++ /tmp/d20260601-8300-sagswq/unicode-display_width-3.2.0/CHANGELOG.md	2026-06-01 04:30:10.794852828 +0000
                @@ -2,0 +3,8 @@
                +## 3.2.0
                +
                +- Unicode 17.0
                +
                +## 3.1.5
                +
                +- Cache Emoji support level for performance reasons #30, patch by @Earlopain:
                +
        README.md
                --- /tmp/d20260601-8300-sagswq/unicode-display_width-3.1.4/README.md	2026-06-01 04:30:10.793852829 +0000
                +++ /tmp/d20260601-8300-sagswq/unicode-display_width-3.2.0/README.md	2026-06-01 04:30:10.794852828 +0000
                @@ -3 +3 @@
                -Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth()](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                +Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                @@ -5 +5 @@
                -Unicode version: **16.0.0** (September 2024)
                +Unicode version: **17.0.0** (September 2025)
                @@ -111,2 +111,2 @@
                -Single Emoji character with Skin Tone Modifier            | 2
                -Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is configured to `:rgi` / `:rgi_at`
                +Single Emoji character with Skin Tone Modifier            | 2 unless Emoji mode is `:none` or `vs16`
                +Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is `:rgi` / `:rgi_at`
                @@ -191 +191 @@
                -- Copyright (c) 2011, 2015-2024 Jan Lelis, https://janlelis.com, released under the MIT
                +- Copyright (c) 2011, 2015-2025 Jan Lelis, https://janlelis.com, released under the MIT
        data/display_width.marshal.gz
                Binary files /tmp/d20260601-8300-sagswq/unicode-display_width-3.1.4/data/display_width.marshal.gz and /tmp/d20260601-8300-sagswq/unicode-display_width-3.2.0/data/display_width.marshal.gz differ
        lib/unicode/display_width/constants.rb
                --- /tmp/d20260601-8300-sagswq/unicode-display_width-3.1.4/lib/unicode/display_width/constants.rb	2026-06-01 04:30:10.793852829 +0000
                +++ /tmp/d20260601-8300-sagswq/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb	2026-06-01 04:30:10.795852827 +0000
                @@ -5,2 +5,2 @@
                -    VERSION = "3.1.4"
                -    UNICODE_VERSION = "16.0.0"
                +    VERSION = "3.2.0"
                +    UNICODE_VERSION = "17.0.0"
        lib/unicode/display_width/emoji_support.rb
                --- /tmp/d20260601-8300-sagswq/unicode-display_width-3.1.4/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:10.793852829 +0000
                +++ /tmp/d20260601-8300-sagswq/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:10.796852826 +0000
                @@ -1,2 +1 @@
                -# require "rbconfig"
                -# RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ # windows
                +# frozen_string_literal: true
                @@ -15,0 +15,4 @@
                +        @recommended ||= _recommended
                +      end
                +
                +      def self._recommended

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff rubocop 1.79.2 1.87.0

Diff too large (724765 chars)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
        CHANGELOG.md
                --- /tmp/d20260601-8322-dvwiis/unicode-display_width-3.1.4/CHANGELOG.md	2026-06-01 04:30:22.510413235 +0000
                +++ /tmp/d20260601-8322-dvwiis/unicode-display_width-3.2.0/CHANGELOG.md	2026-06-01 04:30:22.513413242 +0000
                @@ -2,0 +3,8 @@
                +## 3.2.0
                +
                +- Unicode 17.0
                +
                +## 3.1.5
                +
                +- Cache Emoji support level for performance reasons #30, patch by @Earlopain:
                +
        README.md
                --- /tmp/d20260601-8322-dvwiis/unicode-display_width-3.1.4/README.md	2026-06-01 04:30:22.511413237 +0000
                +++ /tmp/d20260601-8322-dvwiis/unicode-display_width-3.2.0/README.md	2026-06-01 04:30:22.514413245 +0000
                @@ -3 +3 @@
                -Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth()](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                +Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                @@ -5 +5 @@
                -Unicode version: **16.0.0** (September 2024)
                +Unicode version: **17.0.0** (September 2025)
                @@ -111,2 +111,2 @@
                -Single Emoji character with Skin Tone Modifier            | 2
                -Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is configured to `:rgi` / `:rgi_at`
                +Single Emoji character with Skin Tone Modifier            | 2 unless Emoji mode is `:none` or `vs16`
                +Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is `:rgi` / `:rgi_at`
                @@ -191 +191 @@
                -- Copyright (c) 2011, 2015-2024 Jan Lelis, https://janlelis.com, released under the MIT
                +- Copyright (c) 2011, 2015-2025 Jan Lelis, https://janlelis.com, released under the MIT
        data/display_width.marshal.gz
                Binary files /tmp/d20260601-8322-dvwiis/unicode-display_width-3.1.4/data/display_width.marshal.gz and /tmp/d20260601-8322-dvwiis/unicode-display_width-3.2.0/data/display_width.marshal.gz differ
        lib/unicode/display_width/constants.rb
                --- /tmp/d20260601-8322-dvwiis/unicode-display_width-3.1.4/lib/unicode/display_width/constants.rb	2026-06-01 04:30:22.512413240 +0000
                +++ /tmp/d20260601-8322-dvwiis/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb	2026-06-01 04:30:22.515413247 +0000
                @@ -5,2 +5,2 @@
                -    VERSION = "3.1.4"
                -    UNICODE_VERSION = "16.0.0"
                +    VERSION = "3.2.0"
                +    UNICODE_VERSION = "17.0.0"
        lib/unicode/display_width/emoji_support.rb
                --- /tmp/d20260601-8322-dvwiis/unicode-display_width-3.1.4/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:22.512413240 +0000
                +++ /tmp/d20260601-8322-dvwiis/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:22.516413250 +0000
                @@ -1,2 +1 @@
                -# require "rbconfig"
                -# RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ # windows
                +# frozen_string_literal: true
                @@ -15,0 +15,4 @@
                +        @recommended ||= _recommended
                +      end
                +
                +      def self._recommended

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT date:
    3.1.4: 2025-01-13 00:00:00 UTC
    3.2.0: 2025-09-09 00:00:00 UTC
  DIFFERENT description:
    3.1.4: [Unicode 16.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
    3.2.0: [Unicode 17.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, Emoji specification, and other data.
  DIFFERENT version:
    3.1.4: 3.1.4
    3.2.0: 3.2.0
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
            CHANGELOG.md +8/-0
            README.md +5/-5
            lib/unicode/display_width/constants.rb +2/-2
            lib/unicode/display_width/emoji_support.rb +5/-2
  DIFFERENT extra_rdoc_files:
    3.1.4->3.2.0:
      * Changed:
            README.md +5/-5
            CHANGELOG.md +8/-0
  DIFFERENT runtime dependencies:
    3.1.4->3.2.0:
      * Updated:
            unicode-emoji from: ["~> 4.0", ">= 4.0.4"] to: ["~> 4.1"]

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-emoji 4.0.4 4.2.0

Compared versions: ["4.0.4", "4.2.0"]
  DIFFERENT date:
    4.0.4: 2024-11-19 00:00:00 UTC
    4.2.0: 2025-12-17 00:00:00 UTC
  DIFFERENT description:
    4.0.4: [Emoji 16.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
    4.2.0: [Emoji 17.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
  DIFFERENT required_ruby_version:
    4.0.4: >= 2.5, < 4.0
    4.2.0: >= 2.5
  DIFFERENT version:
    4.0.4: 4.0.4
    4.2.0: 4.2.0
  DIFFERENT files:
    4.0.4->4.2.0:
      * Changed:
            CHANGELOG.md +11/-0
            Gemfile +2/-0
            Gemfile.lock +5/-1
            README.md +4/-4
            Rakefile +1/-1
            lib/unicode/emoji/constants.rb +4/-3
            lib/unicode/emoji/generated/regex.rb +1/-1
            lib/unicode/emoji/generated/regex_basic.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_picto.rb +1/-1
            lib/unicode/emoji/generated/regex_picto_no_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_possible.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_presentation.rb +1/-1
            lib/unicode/emoji/generated/regex_text.rb +1/-1
            lib/unicode/emoji/generated/regex_valid.rb +1/-1
            lib/unicode/emoji/generated/regex_valid_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed_include_text.rb +1/-1
            lib/unicode/emoji/generated_native/regex.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_text.rb +1/-1
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
            unicode-emoji.gemspec +1/-1
  DIFFERENT test_files:
    4.0.4->4.2.0:
      * Changed:
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
  DIFFERENT Gemfile dependencies
    4.0.4->4.2.0:
      * Added:
            mutex_m [">= 0"] (runtime)
            ostruct [">= 0"] (runtime)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-display_width 3.1.4 3.2.0

Compared versions: ["3.1.4", "3.2.0"]
  DIFFERENT files:
    3.1.4->3.2.0:
      * Changed:
        CHANGELOG.md
                --- /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.1.4/CHANGELOG.md	2026-06-01 04:30:47.110010005 +0000
                +++ /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.2.0/CHANGELOG.md	2026-06-01 04:30:47.115010117 +0000
                @@ -2,0 +3,8 @@
                +## 3.2.0
                +
                +- Unicode 17.0
                +
                +## 3.1.5
                +
                +- Cache Emoji support level for performance reasons #30, patch by @Earlopain:
                +
        README.md
                --- /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.1.4/README.md	2026-06-01 04:30:47.111010028 +0000
                +++ /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.2.0/README.md	2026-06-01 04:30:47.115010117 +0000
                @@ -3 +3 @@
                -Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth()](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                +Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals.
                @@ -5 +5 @@
                -Unicode version: **16.0.0** (September 2024)
                +Unicode version: **17.0.0** (September 2025)
                @@ -111,2 +111,2 @@
                -Single Emoji character with Skin Tone Modifier            | 2
                -Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is configured to `:rgi` / `:rgi_at`
                +Single Emoji character with Skin Tone Modifier            | 2 unless Emoji mode is `:none` or `vs16`
                +Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is `:rgi` / `:rgi_at`
                @@ -191 +191 @@
                -- Copyright (c) 2011, 2015-2024 Jan Lelis, https://janlelis.com, released under the MIT
                +- Copyright (c) 2011, 2015-2025 Jan Lelis, https://janlelis.com, released under the MIT
        data/display_width.marshal.gz
                Binary files /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.1.4/data/display_width.marshal.gz and /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.2.0/data/display_width.marshal.gz differ
        lib/unicode/display_width/constants.rb
                --- /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.1.4/lib/unicode/display_width/constants.rb	2026-06-01 04:30:47.113010072 +0000
                +++ /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb	2026-06-01 04:30:47.116010140 +0000
                @@ -5,2 +5,2 @@
                -    VERSION = "3.1.4"
                -    UNICODE_VERSION = "16.0.0"
                +    VERSION = "3.2.0"
                +    UNICODE_VERSION = "17.0.0"
        lib/unicode/display_width/emoji_support.rb
                --- /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.1.4/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:47.113010072 +0000
                +++ /tmp/d20260601-8327-1hfwo8/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb	2026-06-01 04:30:47.116010140 +0000
                @@ -1,2 +1 @@
                -# require "rbconfig"
                -# RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ # windows
                +# frozen_string_literal: true
                @@ -15,0 +15,4 @@
                +        @recommended ||= _recommended
                +      end
                +
                +      def self._recommended

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-emoji 4.0.4 4.2.0

Compared versions: ["4.0.4", "4.2.0"]
  DIFFERENT date:
    4.0.4: 2024-11-19 00:00:00 UTC
    4.2.0: 2025-12-17 00:00:00 UTC
  DIFFERENT description:
    4.0.4: [Emoji 16.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
    4.2.0: [Emoji 17.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
  DIFFERENT required_ruby_version:
    4.0.4: >= 2.5, < 4.0
    4.2.0: >= 2.5
  DIFFERENT version:
    4.0.4: 4.0.4
    4.2.0: 4.2.0
  DIFFERENT files:
    4.0.4->4.2.0:
      * Changed:
            CHANGELOG.md +11/-0
            Gemfile +2/-0
            Gemfile.lock +5/-1
            README.md +4/-4
            Rakefile +1/-1
            lib/unicode/emoji/constants.rb +4/-3
            lib/unicode/emoji/generated/regex.rb +1/-1
            lib/unicode/emoji/generated/regex_basic.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_picto.rb +1/-1
            lib/unicode/emoji/generated/regex_picto_no_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_possible.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_presentation.rb +1/-1
            lib/unicode/emoji/generated/regex_text.rb +1/-1
            lib/unicode/emoji/generated/regex_valid.rb +1/-1
            lib/unicode/emoji/generated/regex_valid_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed_include_text.rb +1/-1
            lib/unicode/emoji/generated_native/regex.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_text.rb +1/-1
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
            unicode-emoji.gemspec +1/-1
  DIFFERENT test_files:
    4.0.4->4.2.0:
      * Changed:
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
  DIFFERENT Gemfile dependencies
    4.0.4->4.2.0:
      * Added:
            mutex_m [">= 0"] (runtime)
            ostruct [">= 0"] (runtime)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-emoji 4.0.4 4.2.0

Diff too large (918698 chars)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare unicode-emoji 4.0.4 4.2.0

Compared versions: ["4.0.4", "4.2.0"]
  DIFFERENT date:
    4.0.4: 2024-11-19 00:00:00 UTC
    4.2.0: 2025-12-17 00:00:00 UTC
  DIFFERENT description:
    4.0.4: [Emoji 16.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
    4.2.0: [Emoji 17.0] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji.
  DIFFERENT required_ruby_version:
    4.0.4: >= 2.5, < 4.0
    4.2.0: >= 2.5
  DIFFERENT version:
    4.0.4: 4.0.4
    4.2.0: 4.2.0
  DIFFERENT files:
    4.0.4->4.2.0:
      * Changed:
            CHANGELOG.md +11/-0
            Gemfile +2/-0
            Gemfile.lock +5/-1
            README.md +4/-4
            Rakefile +1/-1
            lib/unicode/emoji/constants.rb +4/-3
            lib/unicode/emoji/generated/regex.rb +1/-1
            lib/unicode/emoji/generated/regex_basic.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated/regex_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_picto.rb +1/-1
            lib/unicode/emoji/generated/regex_picto_no_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_possible.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_emoji.rb +1/-1
            lib/unicode/emoji/generated/regex_prop_presentation.rb +1/-1
            lib/unicode/emoji/generated/regex_text.rb +1/-1
            lib/unicode/emoji/generated/regex_valid.rb +1/-1
            lib/unicode/emoji/generated/regex_valid_include_text.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed.rb +1/-1
            lib/unicode/emoji/generated/regex_well_formed_include_text.rb +1/-1
            lib/unicode/emoji/generated_native/regex.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb +1/-1
            lib/unicode/emoji/generated_native/regex_include_text.rb +1/-1
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
            unicode-emoji.gemspec +1/-1
  DIFFERENT test_files:
    4.0.4->4.2.0:
      * Changed:
            spec/emoji_test_txt_spec.rb +2/-2
            spec/unicode_emoji_spec.rb +7/-2
  DIFFERENT Gemfile dependencies
    4.0.4->4.2.0:
      * Added:
            mutex_m [">= 0"] (runtime)
            ostruct [">= 0"] (runtime)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-emoji 4.0.4 4.2.0

Diff too large (918698 chars)

1 similar comment
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

gem compare --diff unicode-emoji 4.0.4 4.2.0

Diff too large (918698 chars)

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