rubocop 1.81.7 → 1.92.1
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 +2 -2
- data/config/default.yml +626 -111
- data/config/obsoletion.yml +39 -1
- data/exe/rubocop +1 -1
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- 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 +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +41 -14
- 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 +97 -44
- data/lib/rubocop/config.rb +100 -15
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +49 -27
- data/lib/rubocop/config_loader_resolver.rb +95 -20
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_store.rb +2 -2
- data/lib/rubocop/config_validator.rb +69 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +24 -6
- data/lib/rubocop/cop/badge.rb +10 -2
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -10
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +87 -9
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +70 -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 +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +14 -4
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -8
- data/lib/rubocop/cop/gemspec/require_mfa.rb +9 -6
- 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_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 +28 -2
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +12 -16
- 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_type_group.rb +0 -7
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
- 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 +84 -4
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +156 -41
- 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 +4 -0
- data/lib/rubocop/cop/layout/dot_position.rb +26 -16
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -14
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +25 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +15 -2
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +21 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +81 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +16 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +158 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +265 -29
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +268 -38
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +102 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +19 -5
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +14 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +44 -34
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
- 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.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- 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 +165 -15
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- 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 +405 -28
- 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 +9 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -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 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
- 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 +36 -9
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +46 -18
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +10 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -4
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +37 -14
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -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 +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +24 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
- 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 +33 -2
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -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_in_number_conversion.rb +13 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +72 -4
- 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 +54 -11
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +15 -9
- 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/useless_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +61 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +40 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +10 -10
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +10 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +94 -14
- data/lib/rubocop/cop/lint/void.rb +59 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -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 +1 -1
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- 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 +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +47 -25
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +12 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
- 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/empty_lines_around_body.rb +12 -1
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +58 -12
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +37 -10
- data/lib/rubocop/cop/mixin/hash_subset.rb +9 -2
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +14 -60
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +28 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +1 -2
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +4 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +4 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -5
- data/lib/rubocop/cop/naming/method_name.rb +6 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +13 -2
- data/lib/rubocop/cop/naming/predicate_prefix.rb +30 -17
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +232 -66
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +16 -4
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- 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 +55 -8
- data/lib/rubocop/cop/style/accessor_grouping.rb +16 -5
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +8 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +61 -17
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +28 -5
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -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 +8 -6
- 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 -6
- data/lib/rubocop/cop/style/block_delimiters.rb +74 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +11 -10
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +151 -35
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_querying.rb +79 -46
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +91 -9
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +34 -18
- data/lib/rubocop/cop/style/constant_visibility.rb +13 -7
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +18 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- 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 +184 -20
- 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 +11 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- 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 +8 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +74 -22
- 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 +100 -21
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- 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 +28 -14
- data/lib/rubocop/cop/style/for.rb +60 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +50 -7
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +57 -40
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +39 -11
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +19 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +38 -10
- data/lib/rubocop/cop/style/if_inside_else.rb +36 -8
- data/lib/rubocop/cop/style/if_unless_modifier.rb +80 -76
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +17 -14
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +25 -5
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +10 -4
- data/lib/rubocop/cop/style/lambda.rb +45 -2
- data/lib/rubocop/cop/style/lambda_call.rb +24 -8
- 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 +2 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +102 -20
- 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 +42 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +4 -1
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
- 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_if_modifier.rb +45 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +24 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +50 -12
- 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 +12 -3
- 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 +22 -6
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +18 -6
- 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 +26 -7
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- 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 +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +20 -10
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -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_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -7
- data/lib/rubocop/cop/style/redundant_condition.rb +41 -23
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +13 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +21 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -2
- 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 +43 -7
- data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +82 -115
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -4
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +11 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
- 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 +106 -28
- data/lib/rubocop/cop/style/require_order.rb +25 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -14
- data/lib/rubocop/cop/style/return_nil.rb +17 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +18 -9
- data/lib/rubocop/cop/style/sample.rb +19 -13
- 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 +52 -23
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +39 -13
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +19 -7
- data/lib/rubocop/cop/style/single_line_methods.rb +24 -5
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +25 -7
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +31 -5
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +25 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +36 -1
- data/lib/rubocop/cop/style/super_arguments.rb +6 -4
- data/lib/rubocop/cop/style/symbol_proc.rb +32 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- 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 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- 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 +171 -48
- data/lib/rubocop/cop/util.rb +5 -8
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +33 -9
- data/lib/rubocop/cops_documentation_generator.rb +27 -9
- data/lib/rubocop/directive_comment.rb +116 -7
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -10
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +2 -4
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/offense_count_formatter.rb +4 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -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 +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -42
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +130 -83
- data/lib/rubocop/lsp/runtime.rb +64 -15
- data/lib/rubocop/lsp/server.rb +6 -2
- data/lib/rubocop/lsp/stdin_runner.rb +35 -2
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +47 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +141 -13
- data/lib/rubocop/path_util.rb +16 -5
- data/lib/rubocop/pending_cops_reporter.rb +1 -6
- data/lib/rubocop/plugin/configuration_integrator.rb +13 -3
- data/lib/rubocop/plugin/loader.rb +2 -2
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +2 -3
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +102 -59
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/expect_offense.rb +2 -4
- data/lib/rubocop/rspec/shared_contexts.rb +53 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +362 -106
- data/lib/rubocop/server/cache.rb +21 -40
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +18 -8
- data/lib/rubocop/target_ruby.rb +42 -22
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +23 -7
- data/lib/rubocop.rb +34 -701
- data/lib/ruby_lsp/rubocop/addon.rb +1 -2
- metadata +80 -14
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
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 explain lsp mcp
|
|
21
|
+
].freeze
|
|
20
22
|
DEFAULT_MAXIMUM_EXCLUSION_ITEMS = 15
|
|
21
23
|
|
|
22
24
|
def initialize
|
|
@@ -31,6 +33,9 @@ module RuboCop
|
|
|
31
33
|
|
|
32
34
|
define_options.parse!(args)
|
|
33
35
|
|
|
36
|
+
return_path_given_to_changed(args)
|
|
37
|
+
imply_autocorrect_for_diff
|
|
38
|
+
|
|
34
39
|
@validator.validate_compatibility
|
|
35
40
|
|
|
36
41
|
if @options[:stdin]
|
|
@@ -49,7 +54,22 @@ module RuboCop
|
|
|
49
54
|
|
|
50
55
|
private
|
|
51
56
|
|
|
52
|
-
#
|
|
57
|
+
# `--changed lib` hands the path to `--changed` as its optional argument,
|
|
58
|
+
# so it goes back among the paths to inspect.
|
|
59
|
+
def return_path_given_to_changed(args)
|
|
60
|
+
args.unshift(@path_given_to_changed) if @path_given_to_changed
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# `--diff` is a dry run of autocorrection, so it turns autocorrection on
|
|
64
|
+
# unless the user already picked a mode with `-a`, `-A` or `-x`.
|
|
65
|
+
def imply_autocorrect_for_diff
|
|
66
|
+
return unless @options[:diff] && !@options[:autocorrect]
|
|
67
|
+
|
|
68
|
+
@options[:safe_autocorrect] = true
|
|
69
|
+
@options[:autocorrect] = true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
53
73
|
def define_options
|
|
54
74
|
OptionParser.new do |opts|
|
|
55
75
|
opts.banner = rainbow.wrap('Usage: rubocop [options] [file1, file2, ...]').bright
|
|
@@ -57,6 +77,7 @@ module RuboCop
|
|
|
57
77
|
add_check_options(opts)
|
|
58
78
|
add_cache_options(opts)
|
|
59
79
|
add_lsp_option(opts)
|
|
80
|
+
add_mcp_option(opts)
|
|
60
81
|
add_server_options(opts)
|
|
61
82
|
add_output_options(opts)
|
|
62
83
|
add_autocorrection_options(opts)
|
|
@@ -68,7 +89,6 @@ module RuboCop
|
|
|
68
89
|
add_profile_options(opts) if RUBY_ENGINE == 'ruby' && !Platform.windows?
|
|
69
90
|
end
|
|
70
91
|
end
|
|
71
|
-
# rubocop:enable Metrics/AbcSize
|
|
72
92
|
|
|
73
93
|
def add_check_options(opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
74
94
|
section(opts, 'Basic Options') do # rubocop:disable Metrics/BlockLength
|
|
@@ -88,12 +108,22 @@ module RuboCop
|
|
|
88
108
|
option(opts, '-F', '--fail-fast')
|
|
89
109
|
option(opts, '--disable-pending-cops')
|
|
90
110
|
option(opts, '--enable-pending-cops')
|
|
111
|
+
option(opts, '--disable-all-cops')
|
|
112
|
+
option(opts, '--enable-all-cops')
|
|
113
|
+
option(opts, '--[no-]preview')
|
|
91
114
|
option(opts, '--ignore-disable-comments')
|
|
92
115
|
option(opts, '--force-exclusion')
|
|
93
116
|
option(opts, '--only-recognized-file-types')
|
|
94
117
|
option(opts, '--ignore-parent-exclusion')
|
|
95
118
|
option(opts, '--ignore-unrecognized-cops')
|
|
96
119
|
option(opts, '--force-default-config')
|
|
120
|
+
option(opts, '--changed [REVISION]') do |revision|
|
|
121
|
+
if @validator.path_given_to_changed?(revision)
|
|
122
|
+
@path_given_to_changed = revision
|
|
123
|
+
revision = nil
|
|
124
|
+
end
|
|
125
|
+
@options[:changed] = revision || ChangedFiles::DEFAULT_REVISION
|
|
126
|
+
end
|
|
97
127
|
option(opts, '-s', '--stdin FILE')
|
|
98
128
|
option(opts, '--editor-mode')
|
|
99
129
|
option(opts, '-P', '--[no-]parallel')
|
|
@@ -127,10 +157,14 @@ module RuboCop
|
|
|
127
157
|
option(opts, '--display-only-fail-level-offenses')
|
|
128
158
|
option(opts, '--display-only-correctable')
|
|
129
159
|
option(opts, '--display-only-safe-correctable')
|
|
160
|
+
option(opts, '--display-suppressed')
|
|
161
|
+
option(opts, '--max-offenses-per-cop COUNT') do
|
|
162
|
+
@validator.validate_max_offenses_per_cop_option
|
|
163
|
+
end
|
|
130
164
|
end
|
|
131
165
|
end
|
|
132
166
|
|
|
133
|
-
# rubocop:todo Naming/InclusiveLanguage
|
|
167
|
+
# rubocop:todo Naming/InclusiveLanguage -- `--auto-correct` is the deprecated flag name
|
|
134
168
|
# the autocorrect command-line arguments map to the autocorrect @options values like so:
|
|
135
169
|
# :fix_layout :autocorrect :safe_autocorrect :autocorrect_all
|
|
136
170
|
# -x, --fix-layout true true - -
|
|
@@ -156,6 +190,8 @@ module RuboCop
|
|
|
156
190
|
end
|
|
157
191
|
|
|
158
192
|
option(opts, '--disable-uncorrectable')
|
|
193
|
+
|
|
194
|
+
option(opts, '--diff')
|
|
159
195
|
end
|
|
160
196
|
end
|
|
161
197
|
# rubocop:enable Naming/InclusiveLanguage
|
|
@@ -168,6 +204,8 @@ module RuboCop
|
|
|
168
204
|
@options.replace(ConfigRegeneration.new.options.merge(@options))
|
|
169
205
|
end
|
|
170
206
|
|
|
207
|
+
option(opts, '--report-unused-todo-entries')
|
|
208
|
+
|
|
171
209
|
option(opts, '--exclude-limit COUNT') { @validator.validate_exclude_limit_option }
|
|
172
210
|
option(opts, '--no-exclude-limit')
|
|
173
211
|
|
|
@@ -215,6 +253,12 @@ module RuboCop
|
|
|
215
253
|
end
|
|
216
254
|
end
|
|
217
255
|
|
|
256
|
+
def add_mcp_option(opts)
|
|
257
|
+
section(opts, 'MCP Option') do
|
|
258
|
+
option(opts, '--mcp')
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
218
262
|
def add_server_options(opts)
|
|
219
263
|
section(opts, 'Server Options') do
|
|
220
264
|
option(opts, '--[no-]server')
|
|
@@ -229,12 +273,16 @@ module RuboCop
|
|
|
229
273
|
def add_additional_modes(opts)
|
|
230
274
|
section(opts, 'Additional Modes') do
|
|
231
275
|
option(opts, '-L', '--list-target-files')
|
|
276
|
+
option(opts, '--list-enabled-cops-for PATH')
|
|
232
277
|
option(opts, '--show-cops [COP1,COP2,...]') do |list|
|
|
233
278
|
@options[:show_cops] = list.nil? ? [] : list.split(',')
|
|
234
279
|
end
|
|
235
280
|
option(opts, '--show-docs-url [COP1,COP2,...]') do |list|
|
|
236
281
|
@options[:show_docs_url] = list.nil? ? [] : list.split(',')
|
|
237
282
|
end
|
|
283
|
+
option(opts, '--explain COP1,COP2,...') do |list|
|
|
284
|
+
@options[:explain] = list.split(',')
|
|
285
|
+
end
|
|
238
286
|
end
|
|
239
287
|
end
|
|
240
288
|
|
|
@@ -370,7 +418,7 @@ module RuboCop
|
|
|
370
418
|
%i[only except].each { |opt| OptionsValidator.validate_cop_list(@options[opt]) }
|
|
371
419
|
end
|
|
372
420
|
|
|
373
|
-
# rubocop:disable Metrics/AbcSize
|
|
421
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
374
422
|
def validate_compatibility # rubocop:disable Metrics/MethodLength
|
|
375
423
|
if only_includes_redundant_disable?
|
|
376
424
|
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot be used with --only.'
|
|
@@ -386,13 +434,15 @@ module RuboCop
|
|
|
386
434
|
validate_display_only_failed_and_display_only_correctable
|
|
387
435
|
validate_display_only_correctable_and_autocorrect
|
|
388
436
|
validate_lsp_and_editor_mode
|
|
437
|
+
validate_diff
|
|
438
|
+
validate_changed_and_stdin
|
|
439
|
+
validate_enable_all_cops_and_disable_all_cops
|
|
389
440
|
disable_parallel_when_invalid_option_combo
|
|
390
441
|
|
|
391
442
|
return if incompatible_options.size <= 1
|
|
392
443
|
|
|
393
444
|
raise OptionArgumentError, "Incompatible cli options: #{incompatible_options.inspect}"
|
|
394
445
|
end
|
|
395
|
-
# rubocop:enable Metrics/AbcSize
|
|
396
446
|
|
|
397
447
|
def validate_auto_gen_config
|
|
398
448
|
return if @options.key?(:auto_gen_config)
|
|
@@ -433,12 +483,33 @@ module RuboCop
|
|
|
433
483
|
'--display-only-failed cannot be used together with other display options.'
|
|
434
484
|
end
|
|
435
485
|
|
|
486
|
+
# `--diff` promises not to write anything, and `--auto-gen-config` exists to
|
|
487
|
+
# write a file.
|
|
488
|
+
def validate_diff
|
|
489
|
+
return unless @options.key?(:diff) && @options.key?(:auto_gen_config)
|
|
490
|
+
|
|
491
|
+
raise OptionArgumentError, '--diff cannot be used with --auto-gen-config.'
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def validate_changed_and_stdin
|
|
495
|
+
return unless @options.key?(:changed) && @options.key?(:stdin)
|
|
496
|
+
|
|
497
|
+
raise OptionArgumentError, '--changed cannot be used with --stdin.'
|
|
498
|
+
end
|
|
499
|
+
|
|
436
500
|
def validate_lsp_and_editor_mode
|
|
437
501
|
return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
|
|
438
502
|
|
|
439
503
|
raise OptionArgumentError, 'Do not specify `--editor-mode` as it is redundant in `--lsp`.'
|
|
440
504
|
end
|
|
441
505
|
|
|
506
|
+
def validate_enable_all_cops_and_disable_all_cops
|
|
507
|
+
return if !@options.key?(:enable_all_cops) || !@options.key?(:disable_all_cops)
|
|
508
|
+
|
|
509
|
+
raise OptionArgumentError,
|
|
510
|
+
'--enable-all-cops cannot be used together with --disable-all-cops.'
|
|
511
|
+
end
|
|
512
|
+
|
|
442
513
|
def validate_autocorrect
|
|
443
514
|
if @options.key?(:safe_autocorrect) && @options.key?(:autocorrect_all)
|
|
444
515
|
message = Rainbow(<<~MESSAGE).red
|
|
@@ -454,7 +525,7 @@ module RuboCop
|
|
|
454
525
|
end
|
|
455
526
|
|
|
456
527
|
def disable_parallel_when_invalid_option_combo
|
|
457
|
-
return unless @options
|
|
528
|
+
return unless @options[:parallel]
|
|
458
529
|
|
|
459
530
|
invalid_flags = invalid_arguments_for_parallel
|
|
460
531
|
|
|
@@ -462,13 +533,14 @@ module RuboCop
|
|
|
462
533
|
|
|
463
534
|
@options.delete(:parallel)
|
|
464
535
|
|
|
465
|
-
|
|
536
|
+
# On stderr, so that it can't end up in the middle of a formatter's
|
|
537
|
+
# output, such as `--format json`.
|
|
538
|
+
warn '-P/--parallel is being ignored because ' \
|
|
466
539
|
"it is not compatible with #{invalid_flags.join(', ')}."
|
|
467
540
|
end
|
|
468
541
|
|
|
469
542
|
def invalid_arguments_for_parallel
|
|
470
|
-
[('
|
|
471
|
-
('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
543
|
+
[('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
472
544
|
('--profile' if @options[:profile]),
|
|
473
545
|
('--memory' if @options[:memory]),
|
|
474
546
|
('--cache false' if @options > { cache: 'false' })].compact
|
|
@@ -491,6 +563,25 @@ module RuboCop
|
|
|
491
563
|
@incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
|
|
492
564
|
end
|
|
493
565
|
|
|
566
|
+
# OptionParser hands `--changed lib/` the path as the revision, which is a
|
|
567
|
+
# natural thing to type, so an argument that names an existing path is
|
|
568
|
+
# taken as one. When it also names a revision there is no telling which
|
|
569
|
+
# was meant, and git itself refuses such an argument as ambiguous.
|
|
570
|
+
def path_given_to_changed?(revision)
|
|
571
|
+
return false unless revision && File.exist?(revision)
|
|
572
|
+
return true unless ChangedFiles.revision?(revision)
|
|
573
|
+
|
|
574
|
+
raise OptionArgumentError,
|
|
575
|
+
"--changed got `#{revision}`, which is both a path and a git revision. Write " \
|
|
576
|
+
"`./#{revision}` for the path, or `--changed=#{revision}^0` for the revision."
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
def validate_max_offenses_per_cop_option
|
|
580
|
+
return if /^[1-9]\d*$/.match?(@options[:max_offenses_per_cop])
|
|
581
|
+
|
|
582
|
+
raise OptionParser::InvalidArgument, '--max-offenses-per-cop must be a positive integer'
|
|
583
|
+
end
|
|
584
|
+
|
|
494
585
|
def validate_exclude_limit_option
|
|
495
586
|
return if /^\d+$/.match?(@options[:exclude_limit])
|
|
496
587
|
|
|
@@ -508,7 +599,7 @@ module RuboCop
|
|
|
508
599
|
|
|
509
600
|
# This module contains help texts for command line options.
|
|
510
601
|
# @api private
|
|
511
|
-
# rubocop:disable Metrics/ModuleLength
|
|
602
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
512
603
|
module OptionsHelp
|
|
513
604
|
MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
|
|
514
605
|
FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
|
|
@@ -526,6 +617,8 @@ module RuboCop
|
|
|
526
617
|
regenerate_todo: ['Regenerate the TODO configuration file using',
|
|
527
618
|
'the last configuration. If there is no existing',
|
|
528
619
|
'TODO file, acts like --auto-gen-config.'],
|
|
620
|
+
report_unused_todo_entries: ['Also report TODO configuration file entries that',
|
|
621
|
+
'are no longer needed, and fail if any are found.'],
|
|
529
622
|
offense_counts: ['Include offense counts in configuration',
|
|
530
623
|
'file generated by --auto-gen-config.',
|
|
531
624
|
'Default is true.'],
|
|
@@ -544,12 +637,21 @@ module RuboCop
|
|
|
544
637
|
'when running --auto-gen-config, except if the',
|
|
545
638
|
'number of files with offenses is bigger than',
|
|
546
639
|
'exclude-limit. Default is false.'],
|
|
640
|
+
max_offenses_per_cop: ['Report at most COUNT offenses per cop across the',
|
|
641
|
+
'whole run, so a single noisy cop cannot bury the',
|
|
642
|
+
'rest. Offenses beyond the limit are not reported',
|
|
643
|
+
'and do not count towards the totals, the same way',
|
|
644
|
+
'the other display filters work.'],
|
|
547
645
|
exclude_limit: ['Set the limit for how many files to explicitly exclude.',
|
|
548
646
|
'If there are more files than the limit, the cop will',
|
|
549
647
|
"be disabled instead. Default is #{MAX_EXCL}."],
|
|
550
648
|
disable_uncorrectable: ['Used with --autocorrect to annotate any',
|
|
551
649
|
'offenses that do not support autocorrect',
|
|
552
650
|
'with `rubocop:todo` comments.'],
|
|
651
|
+
diff: ['Print a unified diff of what autocorrection',
|
|
652
|
+
'would change, without writing any files.',
|
|
653
|
+
'Turns on safe autocorrection unless a mode',
|
|
654
|
+
'was already given with -a, -A or -x.'],
|
|
553
655
|
no_exclude_limit: ['Do not set the limit for how many files to exclude.'],
|
|
554
656
|
force_exclusion: ['Any files excluded by `Exclude` in configuration',
|
|
555
657
|
'files will be excluded, even if given explicitly',
|
|
@@ -562,6 +664,10 @@ module RuboCop
|
|
|
562
664
|
ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
|
|
563
665
|
'parent folders.'],
|
|
564
666
|
ignore_unrecognized_cops: ['Ignore unrecognized cops or departments in the config.'],
|
|
667
|
+
changed: ['Inspect only the files that differ from a git',
|
|
668
|
+
'revision, defaulting to HEAD. Untracked files',
|
|
669
|
+
'count as changed. Pass a revision with',
|
|
670
|
+
'`--changed=REVISION`.'],
|
|
565
671
|
force_default_config: ['Use default configuration even if configuration',
|
|
566
672
|
'files are present in the directory tree.'],
|
|
567
673
|
format: ['Choose an output formatter. This option',
|
|
@@ -576,6 +682,7 @@ module RuboCop
|
|
|
576
682
|
'specified --format, or the default format',
|
|
577
683
|
'if no format is specified.'],
|
|
578
684
|
fail_level: ['Minimum severity for exit with error code.',
|
|
685
|
+
'Overrides `AllCops: FailLevel` in the configuration.',
|
|
579
686
|
' [A] autocorrect',
|
|
580
687
|
' [I] info',
|
|
581
688
|
' [R] refactor',
|
|
@@ -592,10 +699,16 @@ module RuboCop
|
|
|
592
699
|
display_only_correctable: ['Only output correctable offense messages.'],
|
|
593
700
|
display_only_safe_correctable: ['Only output safe-correctable offense messages',
|
|
594
701
|
'when combined with --display-only-correctable.'],
|
|
595
|
-
|
|
702
|
+
display_suppressed: ['Also output offenses suppressed by directive',
|
|
703
|
+
'comments. They do not affect the exit code.'],
|
|
704
|
+
show_cops: ['Show the given cops, or all cops by',
|
|
596
705
|
'default, and their configurations for the',
|
|
597
706
|
'current directory.',
|
|
598
707
|
'You can use `*` as a wildcard.'],
|
|
708
|
+
explain: ['Explain what the given cops do: their',
|
|
709
|
+
'description, configuration, whether they',
|
|
710
|
+
'correct, and the examples from their own',
|
|
711
|
+
'documentation.'],
|
|
599
712
|
show_docs_url: ['Display url to documentation for the given',
|
|
600
713
|
'cops, or base url by default.'],
|
|
601
714
|
fail_fast: ['Inspect files in order of modification',
|
|
@@ -612,8 +725,20 @@ module RuboCop
|
|
|
612
725
|
display_cop_names: ['Display cop names in offense messages.',
|
|
613
726
|
'Default is true.'],
|
|
614
727
|
disable_pending_cops: 'Run without pending cops.',
|
|
728
|
+
disable_all_cops: ['Run with all cops disabled by default,',
|
|
729
|
+
'except `Lint/Syntax`. Overrides',
|
|
730
|
+
'`AllCops/EnabledByDefault` and',
|
|
731
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
615
732
|
display_style_guide: 'Display style guide URLs in offense messages.',
|
|
616
733
|
enable_pending_cops: 'Run with pending cops.',
|
|
734
|
+
preview: ['Opt in to unstable behavior: cops that are',
|
|
735
|
+
'`Enabled: preview`, and changes to existing',
|
|
736
|
+
'cops that are not the default yet.',
|
|
737
|
+
'Overrides `AllCops: Preview`.'],
|
|
738
|
+
enable_all_cops: ['Run with all cops enabled, including those',
|
|
739
|
+
'disabled by default. Overrides',
|
|
740
|
+
'`AllCops/EnabledByDefault` and',
|
|
741
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
617
742
|
extra_details: 'Display extra details in offense messages.',
|
|
618
743
|
lint: 'Run only lint cops.',
|
|
619
744
|
safe: 'Run only safe cops.',
|
|
@@ -621,6 +746,8 @@ module RuboCop
|
|
|
621
746
|
'autocorrected source. This is especially useful',
|
|
622
747
|
'when combined with --autocorrect and --stdin.'],
|
|
623
748
|
list_target_files: 'List all files RuboCop will inspect.',
|
|
749
|
+
list_enabled_cops_for: ['List which cops will inspect a given file or',
|
|
750
|
+
'directory.'],
|
|
624
751
|
autocorrect: 'Autocorrect offenses (only when it\'s safe).',
|
|
625
752
|
auto_correct: '(same, deprecated)',
|
|
626
753
|
safe_auto_correct: '(same, deprecated)',
|
|
@@ -651,6 +778,8 @@ module RuboCop
|
|
|
651
778
|
server_status: 'Show server status.',
|
|
652
779
|
no_detach: 'Run the server process in the foreground.',
|
|
653
780
|
lsp: 'Start a language server listening on STDIN.',
|
|
781
|
+
mcp: ['Start an MCP (Model Context Protocol) server that',
|
|
782
|
+
'communicates over stdio.'],
|
|
654
783
|
raise_cop_error: ['Raise cop-related errors with cause and location.',
|
|
655
784
|
'This is used to prevent cops from failing silently.',
|
|
656
785
|
'Default is false.'],
|
|
@@ -658,5 +787,4 @@ module RuboCop
|
|
|
658
787
|
memory: 'Profile rubocop memory usage.'
|
|
659
788
|
}.freeze
|
|
660
789
|
end
|
|
661
|
-
# rubocop:enable Metrics/ModuleLength
|
|
662
790
|
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.
|
|
@@ -32,7 +44,7 @@ module RuboCop
|
|
|
32
44
|
uri.start_with?('http://', 'https://')
|
|
33
45
|
end
|
|
34
46
|
|
|
35
|
-
SMART_PATH_CACHE = {} # rubocop:disable Style/MutableConstant
|
|
47
|
+
SMART_PATH_CACHE = {} # rubocop:disable Style/MutableConstant -- a cache, written to at runtime
|
|
36
48
|
private_constant :SMART_PATH_CACHE
|
|
37
49
|
|
|
38
50
|
def smart_path(path)
|
|
@@ -41,7 +53,7 @@ module RuboCop
|
|
|
41
53
|
path.uri.to_s
|
|
42
54
|
else
|
|
43
55
|
# Ideally, we calculate this relative to the project root.
|
|
44
|
-
base_dir =
|
|
56
|
+
base_dir = PathUtil.pwd
|
|
45
57
|
|
|
46
58
|
if path.start_with? base_dir
|
|
47
59
|
relative_path(path, base_dir)
|
|
@@ -51,7 +63,7 @@ module RuboCop
|
|
|
51
63
|
end
|
|
52
64
|
end
|
|
53
65
|
|
|
54
|
-
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
66
|
+
# rubocop:disable-next Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
55
67
|
def match_path?(pattern, path)
|
|
56
68
|
case pattern
|
|
57
69
|
when String
|
|
@@ -77,7 +89,6 @@ module RuboCop
|
|
|
77
89
|
end
|
|
78
90
|
end
|
|
79
91
|
end
|
|
80
|
-
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
81
92
|
|
|
82
93
|
# Returns true for an absolute Unix or Windows path.
|
|
83
94
|
def absolute?(path)
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
|
20
20
|
attr_accessor :disable_pending_cops, :enable_pending_cops
|
|
21
21
|
|
|
22
22
|
def warn_if_needed(config)
|
|
23
|
-
return if
|
|
23
|
+
return if disable_pending_cops || enable_pending_cops
|
|
24
24
|
|
|
25
25
|
pending_cops = pending_cops_only_qualified(config.pending_cops)
|
|
26
26
|
warn_on_pending_cops(pending_cops) unless pending_cops.empty?
|
|
@@ -32,11 +32,6 @@ module RuboCop
|
|
|
32
32
|
pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def possible_new_cops?(config)
|
|
36
|
-
disable_pending_cops || enable_pending_cops ||
|
|
37
|
-
config.disabled_new_cops? || config.enabled_new_cops?
|
|
38
|
-
end
|
|
39
|
-
|
|
40
35
|
def warn_on_pending_cops(pending_cops)
|
|
41
36
|
warn Rainbow(PENDING_BANNER).yellow
|
|
42
37
|
|
|
@@ -59,11 +59,22 @@ module RuboCop
|
|
|
59
59
|
|
|
60
60
|
plugin_config.make_excludes_absolute
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
merge_plugin_config_with_default(plugin_config, plugin_config_path)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
+
# `unset_nil: false` keeps `AllCops` keys declared with a nil value by a plugin
|
|
68
|
+
# (e.g. `TargetRailsVersion: ~` of rubocop-rails); `merge_all_cop_settings` carries
|
|
69
|
+
# such keys into each subsequent plugin's config, where `unset_nil: true` would
|
|
70
|
+
# delete them from the combined configuration. Preview is left to be applied when
|
|
71
|
+
# a project configuration is resolved against the defaults.
|
|
72
|
+
def merge_plugin_config_with_default(plugin_config, plugin_config_path)
|
|
73
|
+
ConfigLoader.merge_with_default(
|
|
74
|
+
plugin_config, plugin_config_path, unset_nil: false, resolve_preview: false
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
|
|
67
78
|
def merge_plugin_config_into_all_cops!(rubocop_config, plugin_config)
|
|
68
79
|
rubocop_config['AllCops'].merge!(plugin_config['AllCops'])
|
|
69
80
|
end
|
|
@@ -88,7 +99,7 @@ module RuboCop
|
|
|
88
99
|
result
|
|
89
100
|
end
|
|
90
101
|
|
|
91
|
-
# rubocop:disable Metrics/AbcSize
|
|
102
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
92
103
|
def load_plugin_rubocop_config(plugin, runner_context)
|
|
93
104
|
rules = plugin.rules(runner_context)
|
|
94
105
|
|
|
@@ -105,7 +116,6 @@ module RuboCop
|
|
|
105
116
|
raise "Plugin `#{plugin_name}' failed to load with error: #{error_message}"
|
|
106
117
|
end
|
|
107
118
|
end
|
|
108
|
-
# rubocop:enable Metrics/AbcSize
|
|
109
119
|
|
|
110
120
|
# This is how we ensure "first-in wins": plugins can override AllCops settings that are
|
|
111
121
|
# set by RuboCop's default configuration, but once a plugin sets an AllCop setting, they
|
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
|
8
8
|
# A class for loading and resolving plugins.
|
|
9
9
|
# @api private
|
|
10
10
|
class Loader
|
|
11
|
-
# rubocop:disable Layout/LineLength
|
|
11
|
+
# rubocop:disable Layout/LineLength -- the comment on each key does not wrap
|
|
12
12
|
DEFAULT_PLUGIN_CONFIG = {
|
|
13
13
|
'enabled' => true,
|
|
14
14
|
'require_path' => nil, # If not set, will be set to the plugin name
|
|
@@ -84,7 +84,7 @@ module RuboCop
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def require_plugin(require_path)
|
|
87
|
-
FeatureLoader.load(config_directory_path:
|
|
87
|
+
FeatureLoader.load(config_directory_path: PathUtil.pwd, feature: require_path)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def constantize_plugin_from_gemspec_metadata(plugin_name)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
# Defensive loader for the optional `rubydex` gem.
|
|
5
|
+
#
|
|
6
|
+
# When `AllCops/UseProjectIndex` is enabled in the user's configuration, RuboCop builds
|
|
7
|
+
# a project-wide index using `Rubydex::Graph` and exposes it to cops that opt in.
|
|
8
|
+
# The gem is intentionally not a runtime dependency; if it is not installed,
|
|
9
|
+
# or if the running Ruby is older than what `rubydex` supports, RuboCop falls back to
|
|
10
|
+
# its standard file-local behavior.
|
|
11
|
+
module ProjectIndexLoader
|
|
12
|
+
MINIMUM_RUBY_VERSION = '3.2'
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# Returns whether the `rubydex` gem can be loaded. The result is memoized
|
|
17
|
+
# for the lifetime of the process.
|
|
18
|
+
def available?
|
|
19
|
+
return @available if defined?(@available)
|
|
20
|
+
|
|
21
|
+
@available = supported_ruby? && try_require
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def supported_ruby?
|
|
25
|
+
RUBY_VERSION >= MINIMUM_RUBY_VERSION
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def warn_unavailable
|
|
29
|
+
return if @warned
|
|
30
|
+
|
|
31
|
+
@warned = true
|
|
32
|
+
|
|
33
|
+
if supported_ruby?
|
|
34
|
+
warn Rainbow(<<~MSG).yellow
|
|
35
|
+
`AllCops/UseProjectIndex` is enabled but the `rubydex` gem is not installed.
|
|
36
|
+
Analyses that use the project index will be skipped. Add `gem 'rubydex'` to your Gemfile.
|
|
37
|
+
MSG
|
|
38
|
+
else
|
|
39
|
+
warn Rainbow(<<~MSG).yellow
|
|
40
|
+
`AllCops/UseProjectIndex` is enabled but `rubydex` requires Ruby #{MINIMUM_RUBY_VERSION} or later (current: #{RUBY_VERSION}).
|
|
41
|
+
Analyses that use the project index will be skipped.
|
|
42
|
+
MSG
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def try_require
|
|
47
|
+
require 'rubydex'
|
|
48
|
+
true
|
|
49
|
+
rescue LoadError
|
|
50
|
+
false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Builds and resolves a `Rubydex::Graph` for the given file paths. Returns the resolved graph,
|
|
54
|
+
# or `nil` if the build fails. This is the only place in RuboCop that depends on the concrete
|
|
55
|
+
# `Rubydex::Graph` API, so callers (e.g. `Runner`) do not need to know which Rubydex classes
|
|
56
|
+
# or methods are involved.
|
|
57
|
+
def build_index(paths)
|
|
58
|
+
graph = Rubydex::Graph.new
|
|
59
|
+
graph.index_all(paths.map(&:to_s))
|
|
60
|
+
graph.resolve
|
|
61
|
+
graph
|
|
62
|
+
rescue StandardError => e
|
|
63
|
+
warn Rainbow("rubydex index build failed: #{e.message}. Continuing without it.").yellow
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# The Ruby source files of every gem in the project's bundle, for
|
|
67
|
+
# `AllCops/ProjectIndexIncludesGems`. Returns an empty array when RuboCop
|
|
68
|
+
# does not run inside Bundler, so the option silently degrades to
|
|
69
|
+
# project-only indexing.
|
|
70
|
+
def bundled_gem_source_files
|
|
71
|
+
return [] unless defined?(Bundler) && Bundler::SharedHelpers.in_bundle?
|
|
72
|
+
|
|
73
|
+
Bundler.load.specs.flat_map do |spec|
|
|
74
|
+
Dir.glob(File.join(spec.full_gem_path, 'lib', '**', '*.rb'))
|
|
75
|
+
end
|
|
76
|
+
rescue StandardError => e
|
|
77
|
+
message = "rubydex bundle indexing failed: #{e.message}. Indexing the project only."
|
|
78
|
+
warn Rainbow(message).yellow
|
|
79
|
+
[]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
data/lib/rubocop/rake_task.rb
CHANGED
|
@@ -74,8 +74,8 @@ module RuboCop
|
|
|
74
74
|
|
|
75
75
|
def setup_subtasks(name, *args, &task_block) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
76
76
|
namespace(name) do
|
|
77
|
-
# rubocop:todo Naming/InclusiveLanguage
|
|
78
|
-
task(:auto_correct, *args) do
|
|
77
|
+
# rubocop:todo-next Naming/InclusiveLanguage -- the deprecated flag spelling is the subject here
|
|
78
|
+
task(:auto_correct, *args) do |_, task_args|
|
|
79
79
|
require 'rainbow'
|
|
80
80
|
warn Rainbow(
|
|
81
81
|
'rubocop:auto_correct task is deprecated; ' \
|
|
@@ -86,7 +86,6 @@ module RuboCop
|
|
|
86
86
|
perform('--autocorrect')
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
|
-
# rubocop:enable Naming/InclusiveLanguage
|
|
90
89
|
|
|
91
90
|
desc "Autocorrect RuboCop offenses (only when it's safe)."
|
|
92
91
|
task(:autocorrect, *args) do |_, task_args|
|