rubocop 1.71.1 → 1.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +883 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +7 -2
- data/lib/rubocop/changed_files.rb +112 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/execute_runner.rb +52 -1
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +58 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +92 -48
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +72 -49
- data/lib/rubocop/config_loader_resolver.rb +94 -28
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +8 -0
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +64 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +35 -14
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +93 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +79 -10
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +14 -15
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +59 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +163 -35
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +56 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -13
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +157 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +2 -3
- data/lib/rubocop/cop/layout/line_length.rb +160 -23
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +245 -40
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +89 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +14 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +42 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +137 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -19
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +185 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +149 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +56 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +60 -21
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +27 -9
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +44 -16
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +29 -26
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +62 -6
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +47 -11
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +80 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +52 -9
- data/lib/rubocop/cop/registry.rb +233 -64
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +47 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +49 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +7 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +6 -8
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +135 -21
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +8 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +54 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +122 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +12 -8
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +191 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +25 -17
- data/lib/rubocop/cop/style/for.rb +9 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +32 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +7 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +25 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +71 -46
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +12 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +31 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +34 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -18
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +111 -12
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +9 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +41 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +5 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +22 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +63 -5
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +11 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +164 -82
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +8 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +11 -6
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +31 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +4 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -9
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +2 -3
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +163 -45
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +28 -10
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +3 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +11 -6
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +181 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +23 -8
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +31 -18
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +129 -21
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +14 -12
- data/lib/rubocop/result_cache.rb +90 -52
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +294 -100
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +30 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +116 -19
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
data/lib/rubocop/options.rb
CHANGED
|
@@ -16,7 +16,9 @@ module RuboCop
|
|
|
16
16
|
'root of the project. RuboCop will use this path to determine which ' \
|
|
17
17
|
'cops are enabled (via eg. Include/Exclude), and so that certain cops ' \
|
|
18
18
|
'like Naming/FileName can be checked.'
|
|
19
|
-
EXITING_OPTIONS = %i[
|
|
19
|
+
EXITING_OPTIONS = %i[
|
|
20
|
+
version verbose_version show_cops list_enabled_cops_for show_docs_url lsp mcp
|
|
21
|
+
].freeze
|
|
20
22
|
DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
|
|
21
23
|
|
|
22
24
|
def initialize
|
|
@@ -31,6 +33,8 @@ module RuboCop
|
|
|
31
33
|
|
|
32
34
|
define_options.parse!(args)
|
|
33
35
|
|
|
36
|
+
imply_autocorrect_for_diff
|
|
37
|
+
|
|
34
38
|
@validator.validate_compatibility
|
|
35
39
|
|
|
36
40
|
if @options[:stdin]
|
|
@@ -49,7 +53,16 @@ module RuboCop
|
|
|
49
53
|
|
|
50
54
|
private
|
|
51
55
|
|
|
52
|
-
#
|
|
56
|
+
# `--diff` is a dry run of autocorrection, so it turns autocorrection on
|
|
57
|
+
# unless the user already picked a mode with `-a`, `-A` or `-x`.
|
|
58
|
+
def imply_autocorrect_for_diff
|
|
59
|
+
return unless @options[:diff] && !@options[:autocorrect]
|
|
60
|
+
|
|
61
|
+
@options[:safe_autocorrect] = true
|
|
62
|
+
@options[:autocorrect] = true
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
53
66
|
def define_options
|
|
54
67
|
OptionParser.new do |opts|
|
|
55
68
|
opts.banner = rainbow.wrap('Usage: rubocop [options] [file1, file2, ...]').bright
|
|
@@ -57,6 +70,7 @@ module RuboCop
|
|
|
57
70
|
add_check_options(opts)
|
|
58
71
|
add_cache_options(opts)
|
|
59
72
|
add_lsp_option(opts)
|
|
73
|
+
add_mcp_option(opts)
|
|
60
74
|
add_server_options(opts)
|
|
61
75
|
add_output_options(opts)
|
|
62
76
|
add_autocorrection_options(opts)
|
|
@@ -68,7 +82,6 @@ module RuboCop
|
|
|
68
82
|
add_profile_options(opts) if RUBY_ENGINE == 'ruby' && !Platform.windows?
|
|
69
83
|
end
|
|
70
84
|
end
|
|
71
|
-
# rubocop:enable Metrics/AbcSize
|
|
72
85
|
|
|
73
86
|
def add_check_options(opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
74
87
|
section(opts, 'Basic Options') do # rubocop:disable Metrics/BlockLength
|
|
@@ -88,12 +101,19 @@ module RuboCop
|
|
|
88
101
|
option(opts, '-F', '--fail-fast')
|
|
89
102
|
option(opts, '--disable-pending-cops')
|
|
90
103
|
option(opts, '--enable-pending-cops')
|
|
104
|
+
option(opts, '--disable-all-cops')
|
|
105
|
+
option(opts, '--enable-all-cops')
|
|
106
|
+
option(opts, '--[no-]preview')
|
|
91
107
|
option(opts, '--ignore-disable-comments')
|
|
92
108
|
option(opts, '--force-exclusion')
|
|
93
109
|
option(opts, '--only-recognized-file-types')
|
|
94
110
|
option(opts, '--ignore-parent-exclusion')
|
|
95
111
|
option(opts, '--ignore-unrecognized-cops')
|
|
96
112
|
option(opts, '--force-default-config')
|
|
113
|
+
option(opts, '--changed [REVISION]') do |revision|
|
|
114
|
+
@options[:changed] = revision || ChangedFiles::DEFAULT_REVISION
|
|
115
|
+
@validator.validate_changed_revision(revision)
|
|
116
|
+
end
|
|
97
117
|
option(opts, '-s', '--stdin FILE')
|
|
98
118
|
option(opts, '--editor-mode')
|
|
99
119
|
option(opts, '-P', '--[no-]parallel')
|
|
@@ -127,10 +147,11 @@ module RuboCop
|
|
|
127
147
|
option(opts, '--display-only-fail-level-offenses')
|
|
128
148
|
option(opts, '--display-only-correctable')
|
|
129
149
|
option(opts, '--display-only-safe-correctable')
|
|
150
|
+
option(opts, '--display-suppressed')
|
|
130
151
|
end
|
|
131
152
|
end
|
|
132
153
|
|
|
133
|
-
# rubocop:todo Naming/InclusiveLanguage
|
|
154
|
+
# rubocop:todo Naming/InclusiveLanguage -- `--auto-correct` is the deprecated flag name
|
|
134
155
|
# the autocorrect command-line arguments map to the autocorrect @options values like so:
|
|
135
156
|
# :fix_layout :autocorrect :safe_autocorrect :autocorrect_all
|
|
136
157
|
# -x, --fix-layout true true - -
|
|
@@ -156,6 +177,8 @@ module RuboCop
|
|
|
156
177
|
end
|
|
157
178
|
|
|
158
179
|
option(opts, '--disable-uncorrectable')
|
|
180
|
+
|
|
181
|
+
option(opts, '--diff')
|
|
159
182
|
end
|
|
160
183
|
end
|
|
161
184
|
# rubocop:enable Naming/InclusiveLanguage
|
|
@@ -168,6 +191,8 @@ module RuboCop
|
|
|
168
191
|
@options.replace(ConfigRegeneration.new.options.merge(@options))
|
|
169
192
|
end
|
|
170
193
|
|
|
194
|
+
option(opts, '--report-unused-todo-entries')
|
|
195
|
+
|
|
171
196
|
option(opts, '--exclude-limit COUNT') { @validator.validate_exclude_limit_option }
|
|
172
197
|
option(opts, '--no-exclude-limit')
|
|
173
198
|
|
|
@@ -215,6 +240,12 @@ module RuboCop
|
|
|
215
240
|
end
|
|
216
241
|
end
|
|
217
242
|
|
|
243
|
+
def add_mcp_option(opts)
|
|
244
|
+
section(opts, 'MCP Option') do
|
|
245
|
+
option(opts, '--mcp')
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
218
249
|
def add_server_options(opts)
|
|
219
250
|
section(opts, 'Server Options') do
|
|
220
251
|
option(opts, '--[no-]server')
|
|
@@ -229,6 +260,7 @@ module RuboCop
|
|
|
229
260
|
def add_additional_modes(opts)
|
|
230
261
|
section(opts, 'Additional Modes') do
|
|
231
262
|
option(opts, '-L', '--list-target-files')
|
|
263
|
+
option(opts, '--list-enabled-cops-for PATH')
|
|
232
264
|
option(opts, '--show-cops [COP1,COP2,...]') do |list|
|
|
233
265
|
@options[:show_cops] = list.nil? ? [] : list.split(',')
|
|
234
266
|
end
|
|
@@ -243,6 +275,7 @@ module RuboCop
|
|
|
243
275
|
option(opts, '--init')
|
|
244
276
|
option(opts, '-c', '--config FILE')
|
|
245
277
|
option(opts, '-d', '--debug')
|
|
278
|
+
option(opts, '--plugin FILE') { |f| plugin_feature(f) }
|
|
246
279
|
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
|
247
280
|
option(opts, '--[no-]color')
|
|
248
281
|
option(opts, '-v', '--version')
|
|
@@ -299,11 +332,25 @@ module RuboCop
|
|
|
299
332
|
long_opt[2..].sub('[no-]', '').sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
|
|
300
333
|
end
|
|
301
334
|
|
|
302
|
-
def
|
|
303
|
-
# If any features were added on the CLI from `--
|
|
335
|
+
def plugin_feature(file)
|
|
336
|
+
# If any features were added on the CLI from `--plugin`,
|
|
304
337
|
# add them to the config.
|
|
305
|
-
|
|
306
|
-
|
|
338
|
+
ConfigLoaderResolver.new.resolve_plugins(Config.new, file)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def require_feature(file)
|
|
342
|
+
if Plugin.plugin_capable?(file)
|
|
343
|
+
# NOTE: Compatibility for before plugins style.
|
|
344
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
345
|
+
#{file} gem supports plugin, use `--plugin` instead of `--require`.
|
|
346
|
+
MESSAGE
|
|
347
|
+
plugin_feature(file)
|
|
348
|
+
else
|
|
349
|
+
# If any features were added on the CLI from `--require`,
|
|
350
|
+
# add them to the config.
|
|
351
|
+
require file
|
|
352
|
+
ConfigLoader.add_loaded_features(file)
|
|
353
|
+
end
|
|
307
354
|
end
|
|
308
355
|
end
|
|
309
356
|
|
|
@@ -355,7 +402,7 @@ module RuboCop
|
|
|
355
402
|
%i[only except].each { |opt| OptionsValidator.validate_cop_list(@options[opt]) }
|
|
356
403
|
end
|
|
357
404
|
|
|
358
|
-
# rubocop:disable Metrics/AbcSize
|
|
405
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
359
406
|
def validate_compatibility # rubocop:disable Metrics/MethodLength
|
|
360
407
|
if only_includes_redundant_disable?
|
|
361
408
|
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot be used with --only.'
|
|
@@ -371,13 +418,15 @@ module RuboCop
|
|
|
371
418
|
validate_display_only_failed_and_display_only_correctable
|
|
372
419
|
validate_display_only_correctable_and_autocorrect
|
|
373
420
|
validate_lsp_and_editor_mode
|
|
421
|
+
validate_diff
|
|
422
|
+
validate_changed_and_stdin
|
|
423
|
+
validate_enable_all_cops_and_disable_all_cops
|
|
374
424
|
disable_parallel_when_invalid_option_combo
|
|
375
425
|
|
|
376
426
|
return if incompatible_options.size <= 1
|
|
377
427
|
|
|
378
428
|
raise OptionArgumentError, "Incompatible cli options: #{incompatible_options.inspect}"
|
|
379
429
|
end
|
|
380
|
-
# rubocop:enable Metrics/AbcSize
|
|
381
430
|
|
|
382
431
|
def validate_auto_gen_config
|
|
383
432
|
return if @options.key?(:auto_gen_config)
|
|
@@ -397,7 +446,7 @@ module RuboCop
|
|
|
397
446
|
return if @options[:format] == 'junit'
|
|
398
447
|
|
|
399
448
|
raise OptionArgumentError,
|
|
400
|
-
|
|
449
|
+
'--display-only-failed can only be used together with --format junit.'
|
|
401
450
|
end
|
|
402
451
|
|
|
403
452
|
def validate_display_only_correctable_and_autocorrect
|
|
@@ -415,14 +464,34 @@ module RuboCop
|
|
|
415
464
|
!@options.key?(:display_only_safe_correctable)
|
|
416
465
|
|
|
417
466
|
raise OptionArgumentError,
|
|
418
|
-
|
|
467
|
+
'--display-only-failed cannot be used together with other display options.'
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
# `--diff` promises not to write anything, and `--auto-gen-config` exists to
|
|
471
|
+
# write a file.
|
|
472
|
+
def validate_diff
|
|
473
|
+
return unless @options.key?(:diff) && @options.key?(:auto_gen_config)
|
|
474
|
+
|
|
475
|
+
raise OptionArgumentError, '--diff cannot be used with --auto-gen-config.'
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
def validate_changed_and_stdin
|
|
479
|
+
return unless @options.key?(:changed) && @options.key?(:stdin)
|
|
480
|
+
|
|
481
|
+
raise OptionArgumentError, '--changed cannot be used with --stdin.'
|
|
419
482
|
end
|
|
420
483
|
|
|
421
484
|
def validate_lsp_and_editor_mode
|
|
422
485
|
return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
|
|
423
486
|
|
|
487
|
+
raise OptionArgumentError, 'Do not specify `--editor-mode` as it is redundant in `--lsp`.'
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def validate_enable_all_cops_and_disable_all_cops
|
|
491
|
+
return if !@options.key?(:enable_all_cops) || !@options.key?(:disable_all_cops)
|
|
492
|
+
|
|
424
493
|
raise OptionArgumentError,
|
|
425
|
-
|
|
494
|
+
'--enable-all-cops cannot be used together with --disable-all-cops.'
|
|
426
495
|
end
|
|
427
496
|
|
|
428
497
|
def validate_autocorrect
|
|
@@ -436,7 +505,7 @@ module RuboCop
|
|
|
436
505
|
return unless @options.key?(:disable_uncorrectable)
|
|
437
506
|
|
|
438
507
|
raise OptionArgumentError,
|
|
439
|
-
|
|
508
|
+
'--disable-uncorrectable can only be used together with --autocorrect.'
|
|
440
509
|
end
|
|
441
510
|
|
|
442
511
|
def disable_parallel_when_invalid_option_combo
|
|
@@ -453,8 +522,7 @@ module RuboCop
|
|
|
453
522
|
end
|
|
454
523
|
|
|
455
524
|
def invalid_arguments_for_parallel
|
|
456
|
-
[('
|
|
457
|
-
('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
525
|
+
[('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
458
526
|
('--profile' if @options[:profile]),
|
|
459
527
|
('--memory' if @options[:memory]),
|
|
460
528
|
('--cache false' if @options > { cache: 'false' })].compact
|
|
@@ -477,6 +545,17 @@ module RuboCop
|
|
|
477
545
|
@incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
|
|
478
546
|
end
|
|
479
547
|
|
|
548
|
+
# OptionParser hands `--changed lib/` the path as the revision, which is a
|
|
549
|
+
# natural thing to type, so point at the fix rather than at git's error.
|
|
550
|
+
def validate_changed_revision(revision)
|
|
551
|
+
return unless revision && File.exist?(revision)
|
|
552
|
+
|
|
553
|
+
raise OptionArgumentError,
|
|
554
|
+
"--changed takes a git revision, but `#{revision}` is a path. Write the revision " \
|
|
555
|
+
"as `--changed=#{revision}` if that is really what you meant, or drop it to " \
|
|
556
|
+
'compare against HEAD.'
|
|
557
|
+
end
|
|
558
|
+
|
|
480
559
|
def validate_exclude_limit_option
|
|
481
560
|
return if /^\d+$/.match?(@options[:exclude_limit])
|
|
482
561
|
|
|
@@ -494,7 +573,7 @@ module RuboCop
|
|
|
494
573
|
|
|
495
574
|
# This module contains help texts for command line options.
|
|
496
575
|
# @api private
|
|
497
|
-
# rubocop:disable Metrics/ModuleLength
|
|
576
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
498
577
|
module OptionsHelp
|
|
499
578
|
MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
|
|
500
579
|
FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
|
|
@@ -504,6 +583,7 @@ module RuboCop
|
|
|
504
583
|
only_guide_cops: ['Run only cops for rules that link to a',
|
|
505
584
|
'style guide.'],
|
|
506
585
|
except: 'Exclude the given cop(s).',
|
|
586
|
+
plugin: 'Load a RuboCop plugin.',
|
|
507
587
|
require: 'Require Ruby file.',
|
|
508
588
|
config: 'Specify configuration file.',
|
|
509
589
|
auto_gen_config: ['Generate a configuration file acting as a',
|
|
@@ -511,6 +591,8 @@ module RuboCop
|
|
|
511
591
|
regenerate_todo: ['Regenerate the TODO configuration file using',
|
|
512
592
|
'the last configuration. If there is no existing',
|
|
513
593
|
'TODO file, acts like --auto-gen-config.'],
|
|
594
|
+
report_unused_todo_entries: ['Also report TODO configuration file entries that',
|
|
595
|
+
'are no longer needed, and fail if any are found.'],
|
|
514
596
|
offense_counts: ['Include offense counts in configuration',
|
|
515
597
|
'file generated by --auto-gen-config.',
|
|
516
598
|
'Default is true.'],
|
|
@@ -535,6 +617,10 @@ module RuboCop
|
|
|
535
617
|
disable_uncorrectable: ['Used with --autocorrect to annotate any',
|
|
536
618
|
'offenses that do not support autocorrect',
|
|
537
619
|
'with `rubocop:todo` comments.'],
|
|
620
|
+
diff: ['Print a unified diff of what autocorrection',
|
|
621
|
+
'would change, without writing any files.',
|
|
622
|
+
'Turns on safe autocorrection unless a mode',
|
|
623
|
+
'was already given with -a, -A or -x.'],
|
|
538
624
|
no_exclude_limit: ['Do not set the limit for how many files to exclude.'],
|
|
539
625
|
force_exclusion: ['Any files excluded by `Exclude` in configuration',
|
|
540
626
|
'files will be excluded, even if given explicitly',
|
|
@@ -542,11 +628,15 @@ module RuboCop
|
|
|
542
628
|
only_recognized_file_types: ['Inspect files given on the command line only if',
|
|
543
629
|
'they are listed in `AllCops/Include` parameters',
|
|
544
630
|
'of user configuration or default configuration.'],
|
|
545
|
-
ignore_disable_comments: ['
|
|
546
|
-
'
|
|
631
|
+
ignore_disable_comments: ['Report offenses even if they have been manually disabled',
|
|
632
|
+
'with a `rubocop:disable` or `rubocop:todo` directive.'],
|
|
547
633
|
ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
|
|
548
634
|
'parent folders.'],
|
|
549
635
|
ignore_unrecognized_cops: ['Ignore unrecognized cops or departments in the config.'],
|
|
636
|
+
changed: ['Inspect only the files that differ from a git',
|
|
637
|
+
'revision, defaulting to HEAD. Untracked files',
|
|
638
|
+
'count as changed. Pass a revision with',
|
|
639
|
+
'`--changed=REVISION`.'],
|
|
550
640
|
force_default_config: ['Use default configuration even if configuration',
|
|
551
641
|
'files are present in the directory tree.'],
|
|
552
642
|
format: ['Choose an output formatter. This option',
|
|
@@ -561,6 +651,7 @@ module RuboCop
|
|
|
561
651
|
'specified --format, or the default format',
|
|
562
652
|
'if no format is specified.'],
|
|
563
653
|
fail_level: ['Minimum severity for exit with error code.',
|
|
654
|
+
'Overrides `AllCops: FailLevel` in the configuration.',
|
|
564
655
|
' [A] autocorrect',
|
|
565
656
|
' [I] info',
|
|
566
657
|
' [R] refactor',
|
|
@@ -577,7 +668,9 @@ module RuboCop
|
|
|
577
668
|
display_only_correctable: ['Only output correctable offense messages.'],
|
|
578
669
|
display_only_safe_correctable: ['Only output safe-correctable offense messages',
|
|
579
670
|
'when combined with --display-only-correctable.'],
|
|
580
|
-
|
|
671
|
+
display_suppressed: ['Also output offenses suppressed by directive',
|
|
672
|
+
'comments. They do not affect the exit code.'],
|
|
673
|
+
show_cops: ['Show the given cops, or all cops by',
|
|
581
674
|
'default, and their configurations for the',
|
|
582
675
|
'current directory.',
|
|
583
676
|
'You can use `*` as a wildcard.'],
|
|
@@ -597,8 +690,20 @@ module RuboCop
|
|
|
597
690
|
display_cop_names: ['Display cop names in offense messages.',
|
|
598
691
|
'Default is true.'],
|
|
599
692
|
disable_pending_cops: 'Run without pending cops.',
|
|
693
|
+
disable_all_cops: ['Run with all cops disabled by default,',
|
|
694
|
+
'except `Lint/Syntax`. Overrides',
|
|
695
|
+
'`AllCops/EnabledByDefault` and',
|
|
696
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
600
697
|
display_style_guide: 'Display style guide URLs in offense messages.',
|
|
601
698
|
enable_pending_cops: 'Run with pending cops.',
|
|
699
|
+
preview: ['Opt in to unstable behavior: cops that are',
|
|
700
|
+
'`Enabled: preview`, and changes to existing',
|
|
701
|
+
'cops that are not the default yet.',
|
|
702
|
+
'Overrides `AllCops: Preview`.'],
|
|
703
|
+
enable_all_cops: ['Run with all cops enabled, including those',
|
|
704
|
+
'disabled by default. Overrides',
|
|
705
|
+
'`AllCops/EnabledByDefault` and',
|
|
706
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
602
707
|
extra_details: 'Display extra details in offense messages.',
|
|
603
708
|
lint: 'Run only lint cops.',
|
|
604
709
|
safe: 'Run only safe cops.',
|
|
@@ -606,6 +711,8 @@ module RuboCop
|
|
|
606
711
|
'autocorrected source. This is especially useful',
|
|
607
712
|
'when combined with --autocorrect and --stdin.'],
|
|
608
713
|
list_target_files: 'List all files RuboCop will inspect.',
|
|
714
|
+
list_enabled_cops_for: ['List which cops will inspect a given file or',
|
|
715
|
+
'directory.'],
|
|
609
716
|
autocorrect: 'Autocorrect offenses (only when it\'s safe).',
|
|
610
717
|
auto_correct: '(same, deprecated)',
|
|
611
718
|
safe_auto_correct: '(same, deprecated)',
|
|
@@ -636,6 +743,8 @@ module RuboCop
|
|
|
636
743
|
server_status: 'Show server status.',
|
|
637
744
|
no_detach: 'Run the server process in the foreground.',
|
|
638
745
|
lsp: 'Start a language server listening on STDIN.',
|
|
746
|
+
mcp: ['Start an MCP (Model Context Protocol) server that',
|
|
747
|
+
'communicates over stdio.'],
|
|
639
748
|
raise_cop_error: ['Raise cop-related errors with cause and location.',
|
|
640
749
|
'This is used to prevent cops from failing silently.',
|
|
641
750
|
'Default is false.'],
|
|
@@ -643,5 +752,4 @@ module RuboCop
|
|
|
643
752
|
memory: 'Profile rubocop memory usage.'
|
|
644
753
|
}.freeze
|
|
645
754
|
end
|
|
646
|
-
# rubocop:enable Metrics/ModuleLength
|
|
647
755
|
end
|
data/lib/rubocop/path_util.rb
CHANGED
|
@@ -10,7 +10,19 @@ module RuboCop
|
|
|
10
10
|
|
|
11
11
|
module_function
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
# Returns the current working directory, cached for the duration of a run.
|
|
14
|
+
# Dir.pwd is a syscall; caching it avoids repeated overhead since RuboCop
|
|
15
|
+
# never changes the working directory during a run.
|
|
16
|
+
def pwd
|
|
17
|
+
@pwd ||= Dir.pwd
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Reset the cached pwd. Only needed in tests that use Dir.chdir.
|
|
21
|
+
def reset_pwd
|
|
22
|
+
@pwd = nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def relative_path(path, base_dir = PathUtil.pwd)
|
|
14
26
|
PathUtil.relative_paths_cache[base_dir][path] ||=
|
|
15
27
|
# Optimization for the common case where path begins with the base
|
|
16
28
|
# dir. Just cut off the first part.
|
|
@@ -28,7 +40,11 @@ module RuboCop
|
|
|
28
40
|
end
|
|
29
41
|
end
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
def remote_file?(uri)
|
|
44
|
+
uri.start_with?('http://', 'https://')
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
SMART_PATH_CACHE = {} # rubocop:disable Style/MutableConstant -- a cache, written to at runtime
|
|
32
48
|
private_constant :SMART_PATH_CACHE
|
|
33
49
|
|
|
34
50
|
def smart_path(path)
|
|
@@ -37,7 +53,7 @@ module RuboCop
|
|
|
37
53
|
path.uri.to_s
|
|
38
54
|
else
|
|
39
55
|
# Ideally, we calculate this relative to the project root.
|
|
40
|
-
base_dir =
|
|
56
|
+
base_dir = PathUtil.pwd
|
|
41
57
|
|
|
42
58
|
if path.start_with? base_dir
|
|
43
59
|
relative_path(path, base_dir)
|
|
@@ -47,7 +63,7 @@ module RuboCop
|
|
|
47
63
|
end
|
|
48
64
|
end
|
|
49
65
|
|
|
50
|
-
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
66
|
+
# rubocop:disable-next Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
51
67
|
def match_path?(pattern, path)
|
|
52
68
|
case pattern
|
|
53
69
|
when String
|
|
@@ -73,7 +89,6 @@ module RuboCop
|
|
|
73
89
|
end
|
|
74
90
|
end
|
|
75
91
|
end
|
|
76
|
-
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
77
92
|
|
|
78
93
|
# Returns true for an absolute Unix or Windows path.
|
|
79
94
|
def absolute?(path)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
# Reports information about pending cops that are not explicitly configured.
|
|
5
|
+
#
|
|
6
|
+
# This class is responsible for displaying warnings when new cops have been added to RuboCop
|
|
7
|
+
# but have not yet been enabled or disabled in the user's configuration.
|
|
8
|
+
# It provides a centralized way to determine whether such warnings should be shown,
|
|
9
|
+
# based on global flags or configuration settings.
|
|
10
|
+
class PendingCopsReporter
|
|
11
|
+
class << self
|
|
12
|
+
PENDING_BANNER = <<~BANNER
|
|
13
|
+
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
|
14
|
+
|
|
15
|
+
Please also note that you can opt-in to new cops by default by adding this to your config:
|
|
16
|
+
AllCops:
|
|
17
|
+
NewCops: enable
|
|
18
|
+
BANNER
|
|
19
|
+
|
|
20
|
+
attr_accessor :disable_pending_cops, :enable_pending_cops
|
|
21
|
+
|
|
22
|
+
def warn_if_needed(config)
|
|
23
|
+
return if disable_pending_cops || enable_pending_cops
|
|
24
|
+
|
|
25
|
+
pending_cops = pending_cops_only_qualified(config.pending_cops)
|
|
26
|
+
warn_on_pending_cops(pending_cops) unless pending_cops.empty?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def pending_cops_only_qualified(pending_cops)
|
|
32
|
+
pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def warn_on_pending_cops(pending_cops)
|
|
36
|
+
warn Rainbow(PENDING_BANNER).yellow
|
|
37
|
+
|
|
38
|
+
pending_cops.each { |cop| warn_pending_cop cop }
|
|
39
|
+
|
|
40
|
+
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def warn_pending_cop(cop)
|
|
44
|
+
version = cop.metadata['VersionAdded'] || 'N/A'
|
|
45
|
+
|
|
46
|
+
warn Rainbow("#{cop.name}: # new in #{version}").yellow
|
|
47
|
+
warn Rainbow(' Enabled: true').yellow
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lint_roller/context'
|
|
4
|
+
require_relative 'not_supported_error'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
module Plugin
|
|
8
|
+
# A class for integrating plugin configurations into RuboCop.
|
|
9
|
+
# Handles configuration merging, validation, and compatibility for plugins.
|
|
10
|
+
# @api private
|
|
11
|
+
class ConfigurationIntegrator
|
|
12
|
+
class << self
|
|
13
|
+
def integrate_plugins_into_rubocop_config(rubocop_config, plugins)
|
|
14
|
+
default_config = ConfigLoader.default_configuration
|
|
15
|
+
runner_context = create_context(rubocop_config)
|
|
16
|
+
|
|
17
|
+
validate_plugins!(plugins, runner_context)
|
|
18
|
+
|
|
19
|
+
plugin_config = combine_rubocop_configs(default_config, runner_context, plugins).to_h
|
|
20
|
+
|
|
21
|
+
merge_plugin_config_into_all_cops!(default_config, plugin_config)
|
|
22
|
+
merge_plugin_config_into_default_config!(default_config, plugin_config)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def create_context(rubocop_config)
|
|
28
|
+
LintRoller::Context.new(
|
|
29
|
+
runner: :rubocop,
|
|
30
|
+
runner_version: Version.version,
|
|
31
|
+
engine: :rubocop,
|
|
32
|
+
engine_version: Version.version,
|
|
33
|
+
target_ruby_version: rubocop_config.target_ruby_version
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def validate_plugins!(plugins, runner_context)
|
|
38
|
+
unsupported_plugins = plugins.reject { |plugin| plugin.supported?(runner_context) }
|
|
39
|
+
return if unsupported_plugins.none?
|
|
40
|
+
|
|
41
|
+
raise Plugin::NotSupportedError, unsupported_plugins
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def combine_rubocop_configs(default_config, runner_context, plugins)
|
|
45
|
+
fake_out_rubocop_default_configuration(default_config) do |fake_config|
|
|
46
|
+
all_cop_keys_configured_by_plugins = []
|
|
47
|
+
|
|
48
|
+
plugins.reduce(fake_config) do |combined_config, plugin|
|
|
49
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, combined_config)
|
|
50
|
+
|
|
51
|
+
print 'Plugin ' if ConfigLoader.debug
|
|
52
|
+
|
|
53
|
+
plugin_config, plugin_config_path = load_plugin_rubocop_config(plugin, runner_context)
|
|
54
|
+
|
|
55
|
+
plugin_config['AllCops'], all_cop_keys_configured_by_plugins = merge_all_cop_settings(
|
|
56
|
+
combined_config['AllCops'], plugin_config['AllCops'],
|
|
57
|
+
all_cop_keys_configured_by_plugins
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
plugin_config.make_excludes_absolute
|
|
61
|
+
|
|
62
|
+
# `unset_nil: false` keeps `AllCops` keys declared with a nil value by a plugin
|
|
63
|
+
# (e.g. `TargetRailsVersion: ~` of rubocop-rails); `merge_all_cop_settings` above
|
|
64
|
+
# carries such keys into each subsequent plugin's config, where `unset_nil: true`
|
|
65
|
+
# would delete them from the combined configuration.
|
|
66
|
+
ConfigLoader.merge_with_default(plugin_config, plugin_config_path, unset_nil: false)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def merge_plugin_config_into_all_cops!(rubocop_config, plugin_config)
|
|
72
|
+
rubocop_config['AllCops'].merge!(plugin_config['AllCops'])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def merge_plugin_config_into_default_config!(default_config, plugin_config)
|
|
76
|
+
plugin_config.each do |key, value|
|
|
77
|
+
default_config[key] = if default_config[key].is_a?(Hash)
|
|
78
|
+
resolver.merge(default_config[key], value)
|
|
79
|
+
else
|
|
80
|
+
value
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def fake_out_rubocop_default_configuration(default_config)
|
|
86
|
+
orig_default_config = ConfigLoader.instance_variable_get(:@default_configuration)
|
|
87
|
+
|
|
88
|
+
result = yield default_config
|
|
89
|
+
|
|
90
|
+
ConfigLoader.instance_variable_set(:@default_configuration, orig_default_config)
|
|
91
|
+
|
|
92
|
+
result
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
96
|
+
def load_plugin_rubocop_config(plugin, runner_context)
|
|
97
|
+
rules = plugin.rules(runner_context)
|
|
98
|
+
|
|
99
|
+
case rules.type
|
|
100
|
+
when :path
|
|
101
|
+
[ConfigLoader.load_file(rules.value, check: false), rules.value]
|
|
102
|
+
when :object
|
|
103
|
+
path = plugin.method(:rules).source_location[0]
|
|
104
|
+
[Config.create(rules.value, path, check: true), path]
|
|
105
|
+
when :error
|
|
106
|
+
plugin_name = plugin.about&.name || plugin.inspect
|
|
107
|
+
error_message = rules.value.respond_to?(:message) ? rules.value.message : rules.value
|
|
108
|
+
|
|
109
|
+
raise "Plugin `#{plugin_name}' failed to load with error: #{error_message}"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# This is how we ensure "first-in wins": plugins can override AllCops settings that are
|
|
114
|
+
# set by RuboCop's default configuration, but once a plugin sets an AllCop setting, they
|
|
115
|
+
# have exclusive first-in-wins rights to that setting.
|
|
116
|
+
#
|
|
117
|
+
# The one exception to this are array fields, because we don't want to
|
|
118
|
+
# overwrite the AllCops defaults but rather munge the arrays (`existing |
|
|
119
|
+
# new`) to allow plugins to add to the array, for example Include and
|
|
120
|
+
# Exclude paths and patterns.
|
|
121
|
+
def merge_all_cop_settings(existing_all_cops, new_all_cops, already_configured_keys)
|
|
122
|
+
return [existing_all_cops, already_configured_keys] unless new_all_cops.is_a?(Hash)
|
|
123
|
+
|
|
124
|
+
combined_all_cops = existing_all_cops.dup
|
|
125
|
+
combined_configured_keys = already_configured_keys.dup
|
|
126
|
+
|
|
127
|
+
new_all_cops.each do |key, value|
|
|
128
|
+
if combined_all_cops[key].is_a?(Array) && value.is_a?(Array)
|
|
129
|
+
combined_all_cops[key] |= value
|
|
130
|
+
combined_configured_keys |= [key]
|
|
131
|
+
elsif !combined_configured_keys.include?(key)
|
|
132
|
+
combined_all_cops[key] = value
|
|
133
|
+
combined_configured_keys << key
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
[combined_all_cops, combined_configured_keys]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def resolver
|
|
141
|
+
@resolver ||= ConfigLoaderResolver.new
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Plugin
|
|
5
|
+
# An exception raised when a plugin fails to load.
|
|
6
|
+
# @api private
|
|
7
|
+
class LoadError < Error
|
|
8
|
+
def initialize(plugin_name)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@plugin_name = plugin_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def message
|
|
15
|
+
<<~MESSAGE
|
|
16
|
+
Failed to load plugin `#{@plugin_name}` because the corresponding plugin class could not be determined for instantiation.
|
|
17
|
+
Try upgrading it first (e.g., `bundle update #{@plugin_name}`).
|
|
18
|
+
If `#{@plugin_name}` is not yet a plugin, use `require: #{@plugin_name}` instead of `plugins: #{@plugin_name}` in your configuration.
|
|
19
|
+
|
|
20
|
+
For further assistance, check with the developer regarding the following points:
|
|
21
|
+
https://docs.rubocop.org/rubocop/plugin_migration_guide.html
|
|
22
|
+
MESSAGE
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|