rubocop 1.71.1 → 1.88.2
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 +513 -149
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +38 -4
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- 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 +48 -11
- data/lib/rubocop/comment_config.rb +60 -18
- data/lib/rubocop/config.rb +53 -16
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +65 -49
- data/lib/rubocop/config_loader_resolver.rb +44 -19
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +27 -14
- data/lib/rubocop/cop/base.rb +38 -12
- 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/commissioner.rb +13 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- 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/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 +13 -13
- 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 -1
- 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 +1 -1
- 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 +2 -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 +60 -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 +56 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +9 -2
- 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 +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +28 -9
- 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 +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +35 -2
- 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/hash_alignment.rb +5 -8
- 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 +152 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +62 -15
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -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 +236 -41
- 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 +12 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -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 +1 -1
- 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 +18 -3
- 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 +12 -3
- 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/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +13 -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 +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -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/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +219 -32
- 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/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- 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/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 +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/parentheses_as_grouped_expression.rb +3 -13
- 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 +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- 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 +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -11
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +268 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -1
- 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 +22 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- 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/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +123 -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 +36 -3
- 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 +17 -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/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +55 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +11 -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 +147 -0
- data/lib/rubocop/cop/lint/void.rb +50 -21
- 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 +38 -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/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- 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/check_line_breakable.rb +4 -4
- 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 +1 -1
- 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/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 +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +27 -4
- 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/line_length_help.rb +45 -10
- 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/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -7
- 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 +25 -6
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- 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 +11 -2
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +66 -39
- 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/style/access_modifier_declarations.rb +45 -12
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -8
- 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 +46 -31
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +117 -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 +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +42 -34
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +67 -12
- 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 +6 -0
- 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 +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +33 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/data_inheritance.rb +11 -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/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +12 -8
- 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 +12 -2
- 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 +0 -6
- 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 +181 -18
- 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 +4 -2
- 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 +15 -1
- data/lib/rubocop/cop/style/for.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +85 -14
- 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 +29 -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 +3 -2
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -1
- 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 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +83 -16
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +16 -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 +8 -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 +3 -3
- 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 +12 -3
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
- 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 +33 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -5
- 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 +10 -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 +4 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +13 -16
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- 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 +21 -12
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -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 +57 -25
- 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_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +61 -1
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- 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_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +312 -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 +28 -7
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +111 -37
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- 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_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +6 -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 +67 -20
- 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 +53 -20
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -12
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +21 -6
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +77 -101
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +24 -2
- data/lib/rubocop/cop/style/super_arguments.rb +3 -4
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +10 -7
- 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/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 +1 -1
- 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/team.rb +105 -40
- data/lib/rubocop/cop/util.rb +4 -5
- 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 +10 -3
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +80 -3
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- 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 +38 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +22 -37
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +47 -11
- data/lib/rubocop/lsp/runtime.rb +19 -8
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +11 -18
- data/lib/rubocop/magic_comment.rb +28 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +60 -14
- data/lib/rubocop/path_util.rb +18 -2
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -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 +66 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +72 -47
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +71 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +188 -65
- data/lib/rubocop/server/cache.rb +56 -41
- data/lib/rubocop/server/cli.rb +2 -2
- 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/target_finder.rb +21 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +50 -10
- data/lib/rubocop.rb +47 -96
- data/lib/ruby_lsp/rubocop/addon.rb +29 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +86 -16
- 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
|
|
@@ -57,6 +59,7 @@ module RuboCop
|
|
|
57
59
|
add_check_options(opts)
|
|
58
60
|
add_cache_options(opts)
|
|
59
61
|
add_lsp_option(opts)
|
|
62
|
+
add_mcp_option(opts)
|
|
60
63
|
add_server_options(opts)
|
|
61
64
|
add_output_options(opts)
|
|
62
65
|
add_autocorrection_options(opts)
|
|
@@ -88,6 +91,8 @@ module RuboCop
|
|
|
88
91
|
option(opts, '-F', '--fail-fast')
|
|
89
92
|
option(opts, '--disable-pending-cops')
|
|
90
93
|
option(opts, '--enable-pending-cops')
|
|
94
|
+
option(opts, '--disable-all-cops')
|
|
95
|
+
option(opts, '--enable-all-cops')
|
|
91
96
|
option(opts, '--ignore-disable-comments')
|
|
92
97
|
option(opts, '--force-exclusion')
|
|
93
98
|
option(opts, '--only-recognized-file-types')
|
|
@@ -215,6 +220,12 @@ module RuboCop
|
|
|
215
220
|
end
|
|
216
221
|
end
|
|
217
222
|
|
|
223
|
+
def add_mcp_option(opts)
|
|
224
|
+
section(opts, 'MCP Option') do
|
|
225
|
+
option(opts, '--mcp')
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
218
229
|
def add_server_options(opts)
|
|
219
230
|
section(opts, 'Server Options') do
|
|
220
231
|
option(opts, '--[no-]server')
|
|
@@ -229,6 +240,7 @@ module RuboCop
|
|
|
229
240
|
def add_additional_modes(opts)
|
|
230
241
|
section(opts, 'Additional Modes') do
|
|
231
242
|
option(opts, '-L', '--list-target-files')
|
|
243
|
+
option(opts, '--list-enabled-cops-for PATH')
|
|
232
244
|
option(opts, '--show-cops [COP1,COP2,...]') do |list|
|
|
233
245
|
@options[:show_cops] = list.nil? ? [] : list.split(',')
|
|
234
246
|
end
|
|
@@ -243,6 +255,7 @@ module RuboCop
|
|
|
243
255
|
option(opts, '--init')
|
|
244
256
|
option(opts, '-c', '--config FILE')
|
|
245
257
|
option(opts, '-d', '--debug')
|
|
258
|
+
option(opts, '--plugin FILE') { |f| plugin_feature(f) }
|
|
246
259
|
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
|
247
260
|
option(opts, '--[no-]color')
|
|
248
261
|
option(opts, '-v', '--version')
|
|
@@ -299,11 +312,25 @@ module RuboCop
|
|
|
299
312
|
long_opt[2..].sub('[no-]', '').sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
|
|
300
313
|
end
|
|
301
314
|
|
|
302
|
-
def
|
|
303
|
-
# If any features were added on the CLI from `--
|
|
315
|
+
def plugin_feature(file)
|
|
316
|
+
# If any features were added on the CLI from `--plugin`,
|
|
304
317
|
# add them to the config.
|
|
305
|
-
|
|
306
|
-
|
|
318
|
+
ConfigLoaderResolver.new.resolve_plugins(Config.new, file)
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def require_feature(file)
|
|
322
|
+
if Plugin.plugin_capable?(file)
|
|
323
|
+
# NOTE: Compatibility for before plugins style.
|
|
324
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
325
|
+
#{file} gem supports plugin, use `--plugin` instead of `--require`.
|
|
326
|
+
MESSAGE
|
|
327
|
+
plugin_feature(file)
|
|
328
|
+
else
|
|
329
|
+
# If any features were added on the CLI from `--require`,
|
|
330
|
+
# add them to the config.
|
|
331
|
+
require file
|
|
332
|
+
ConfigLoader.add_loaded_features(file)
|
|
333
|
+
end
|
|
307
334
|
end
|
|
308
335
|
end
|
|
309
336
|
|
|
@@ -371,6 +398,7 @@ module RuboCop
|
|
|
371
398
|
validate_display_only_failed_and_display_only_correctable
|
|
372
399
|
validate_display_only_correctable_and_autocorrect
|
|
373
400
|
validate_lsp_and_editor_mode
|
|
401
|
+
validate_enable_all_cops_and_disable_all_cops
|
|
374
402
|
disable_parallel_when_invalid_option_combo
|
|
375
403
|
|
|
376
404
|
return if incompatible_options.size <= 1
|
|
@@ -397,7 +425,7 @@ module RuboCop
|
|
|
397
425
|
return if @options[:format] == 'junit'
|
|
398
426
|
|
|
399
427
|
raise OptionArgumentError,
|
|
400
|
-
|
|
428
|
+
'--display-only-failed can only be used together with --format junit.'
|
|
401
429
|
end
|
|
402
430
|
|
|
403
431
|
def validate_display_only_correctable_and_autocorrect
|
|
@@ -415,14 +443,20 @@ module RuboCop
|
|
|
415
443
|
!@options.key?(:display_only_safe_correctable)
|
|
416
444
|
|
|
417
445
|
raise OptionArgumentError,
|
|
418
|
-
|
|
446
|
+
'--display-only-failed cannot be used together with other display options.'
|
|
419
447
|
end
|
|
420
448
|
|
|
421
449
|
def validate_lsp_and_editor_mode
|
|
422
450
|
return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
|
|
423
451
|
|
|
452
|
+
raise OptionArgumentError, 'Do not specify `--editor-mode` as it is redundant in `--lsp`.'
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
def validate_enable_all_cops_and_disable_all_cops
|
|
456
|
+
return if !@options.key?(:enable_all_cops) || !@options.key?(:disable_all_cops)
|
|
457
|
+
|
|
424
458
|
raise OptionArgumentError,
|
|
425
|
-
|
|
459
|
+
'--enable-all-cops cannot be used together with --disable-all-cops.'
|
|
426
460
|
end
|
|
427
461
|
|
|
428
462
|
def validate_autocorrect
|
|
@@ -436,7 +470,7 @@ module RuboCop
|
|
|
436
470
|
return unless @options.key?(:disable_uncorrectable)
|
|
437
471
|
|
|
438
472
|
raise OptionArgumentError,
|
|
439
|
-
|
|
473
|
+
'--disable-uncorrectable can only be used together with --autocorrect.'
|
|
440
474
|
end
|
|
441
475
|
|
|
442
476
|
def disable_parallel_when_invalid_option_combo
|
|
@@ -453,8 +487,7 @@ module RuboCop
|
|
|
453
487
|
end
|
|
454
488
|
|
|
455
489
|
def invalid_arguments_for_parallel
|
|
456
|
-
[('
|
|
457
|
-
('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
490
|
+
[('-F/--fail-fast' if @options.key?(:fail_fast)),
|
|
458
491
|
('--profile' if @options[:profile]),
|
|
459
492
|
('--memory' if @options[:memory]),
|
|
460
493
|
('--cache false' if @options > { cache: 'false' })].compact
|
|
@@ -504,6 +537,7 @@ module RuboCop
|
|
|
504
537
|
only_guide_cops: ['Run only cops for rules that link to a',
|
|
505
538
|
'style guide.'],
|
|
506
539
|
except: 'Exclude the given cop(s).',
|
|
540
|
+
plugin: 'Load a RuboCop plugin.',
|
|
507
541
|
require: 'Require Ruby file.',
|
|
508
542
|
config: 'Specify configuration file.',
|
|
509
543
|
auto_gen_config: ['Generate a configuration file acting as a',
|
|
@@ -542,8 +576,8 @@ module RuboCop
|
|
|
542
576
|
only_recognized_file_types: ['Inspect files given on the command line only if',
|
|
543
577
|
'they are listed in `AllCops/Include` parameters',
|
|
544
578
|
'of user configuration or default configuration.'],
|
|
545
|
-
ignore_disable_comments: ['
|
|
546
|
-
'
|
|
579
|
+
ignore_disable_comments: ['Report offenses even if they have been manually disabled',
|
|
580
|
+
'with a `rubocop:disable` or `rubocop:todo` directive.'],
|
|
547
581
|
ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
|
|
548
582
|
'parent folders.'],
|
|
549
583
|
ignore_unrecognized_cops: ['Ignore unrecognized cops or departments in the config.'],
|
|
@@ -577,7 +611,7 @@ module RuboCop
|
|
|
577
611
|
display_only_correctable: ['Only output correctable offense messages.'],
|
|
578
612
|
display_only_safe_correctable: ['Only output safe-correctable offense messages',
|
|
579
613
|
'when combined with --display-only-correctable.'],
|
|
580
|
-
show_cops: ['
|
|
614
|
+
show_cops: ['Show the given cops, or all cops by',
|
|
581
615
|
'default, and their configurations for the',
|
|
582
616
|
'current directory.',
|
|
583
617
|
'You can use `*` as a wildcard.'],
|
|
@@ -597,8 +631,16 @@ module RuboCop
|
|
|
597
631
|
display_cop_names: ['Display cop names in offense messages.',
|
|
598
632
|
'Default is true.'],
|
|
599
633
|
disable_pending_cops: 'Run without pending cops.',
|
|
634
|
+
disable_all_cops: ['Run with all cops disabled by default,',
|
|
635
|
+
'except `Lint/Syntax`. Overrides',
|
|
636
|
+
'`AllCops/EnabledByDefault` and',
|
|
637
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
600
638
|
display_style_guide: 'Display style guide URLs in offense messages.',
|
|
601
639
|
enable_pending_cops: 'Run with pending cops.',
|
|
640
|
+
enable_all_cops: ['Run with all cops enabled, including those',
|
|
641
|
+
'disabled by default. Overrides',
|
|
642
|
+
'`AllCops/EnabledByDefault` and',
|
|
643
|
+
'`AllCops/DisabledByDefault` in config files.'],
|
|
602
644
|
extra_details: 'Display extra details in offense messages.',
|
|
603
645
|
lint: 'Run only lint cops.',
|
|
604
646
|
safe: 'Run only safe cops.',
|
|
@@ -606,6 +648,8 @@ module RuboCop
|
|
|
606
648
|
'autocorrected source. This is especially useful',
|
|
607
649
|
'when combined with --autocorrect and --stdin.'],
|
|
608
650
|
list_target_files: 'List all files RuboCop will inspect.',
|
|
651
|
+
list_enabled_cops_for: ['List which cops will inspect a given file or',
|
|
652
|
+
'directory.'],
|
|
609
653
|
autocorrect: 'Autocorrect offenses (only when it\'s safe).',
|
|
610
654
|
auto_correct: '(same, deprecated)',
|
|
611
655
|
safe_auto_correct: '(same, deprecated)',
|
|
@@ -636,6 +680,8 @@ module RuboCop
|
|
|
636
680
|
server_status: 'Show server status.',
|
|
637
681
|
no_detach: 'Run the server process in the foreground.',
|
|
638
682
|
lsp: 'Start a language server listening on STDIN.',
|
|
683
|
+
mcp: ['Start an MCP (Model Context Protocol) server that',
|
|
684
|
+
'communicates over stdio.'],
|
|
639
685
|
raise_cop_error: ['Raise cop-related errors with cause and location.',
|
|
640
686
|
'This is used to prevent cops from failing silently.',
|
|
641
687
|
'Default is false.'],
|
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,6 +40,10 @@ module RuboCop
|
|
|
28
40
|
end
|
|
29
41
|
end
|
|
30
42
|
|
|
43
|
+
def remote_file?(uri)
|
|
44
|
+
uri.start_with?('http://', 'https://')
|
|
45
|
+
end
|
|
46
|
+
|
|
31
47
|
SMART_PATH_CACHE = {} # rubocop:disable Style/MutableConstant
|
|
32
48
|
private_constant :SMART_PATH_CACHE
|
|
33
49
|
|
|
@@ -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)
|
|
@@ -0,0 +1,56 @@
|
|
|
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 possible_new_cops?(config)
|
|
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 possible_new_cops?(config)
|
|
36
|
+
disable_pending_cops || enable_pending_cops ||
|
|
37
|
+
config.disabled_new_cops? || config.enabled_new_cops?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def warn_on_pending_cops(pending_cops)
|
|
41
|
+
warn Rainbow(PENDING_BANNER).yellow
|
|
42
|
+
|
|
43
|
+
pending_cops.each { |cop| warn_pending_cop cop }
|
|
44
|
+
|
|
45
|
+
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def warn_pending_cop(cop)
|
|
49
|
+
version = cop.metadata['VersionAdded'] || 'N/A'
|
|
50
|
+
|
|
51
|
+
warn Rainbow("#{cop.name}: # new in #{version}").yellow
|
|
52
|
+
warn Rainbow(' Enabled: true').yellow
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
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
|
+
ConfigLoader.merge_with_default(plugin_config, plugin_config_path)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def merge_plugin_config_into_all_cops!(rubocop_config, plugin_config)
|
|
68
|
+
rubocop_config['AllCops'].merge!(plugin_config['AllCops'])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def merge_plugin_config_into_default_config!(default_config, plugin_config)
|
|
72
|
+
plugin_config.each do |key, value|
|
|
73
|
+
default_config[key] = if default_config[key].is_a?(Hash)
|
|
74
|
+
resolver.merge(default_config[key], value)
|
|
75
|
+
else
|
|
76
|
+
value
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def fake_out_rubocop_default_configuration(default_config)
|
|
82
|
+
orig_default_config = ConfigLoader.instance_variable_get(:@default_configuration)
|
|
83
|
+
|
|
84
|
+
result = yield default_config
|
|
85
|
+
|
|
86
|
+
ConfigLoader.instance_variable_set(:@default_configuration, orig_default_config)
|
|
87
|
+
|
|
88
|
+
result
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# rubocop:disable Metrics/AbcSize
|
|
92
|
+
def load_plugin_rubocop_config(plugin, runner_context)
|
|
93
|
+
rules = plugin.rules(runner_context)
|
|
94
|
+
|
|
95
|
+
case rules.type
|
|
96
|
+
when :path
|
|
97
|
+
[ConfigLoader.load_file(rules.value, check: false), rules.value]
|
|
98
|
+
when :object
|
|
99
|
+
path = plugin.method(:rules).source_location[0]
|
|
100
|
+
[Config.create(rules.value, path, check: true), path]
|
|
101
|
+
when :error
|
|
102
|
+
plugin_name = plugin.about&.name || plugin.inspect
|
|
103
|
+
error_message = rules.value.respond_to?(:message) ? rules.value.message : rules.value
|
|
104
|
+
|
|
105
|
+
raise "Plugin `#{plugin_name}' failed to load with error: #{error_message}"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
# rubocop:enable Metrics/AbcSize
|
|
109
|
+
|
|
110
|
+
# This is how we ensure "first-in wins": plugins can override AllCops settings that are
|
|
111
|
+
# set by RuboCop's default configuration, but once a plugin sets an AllCop setting, they
|
|
112
|
+
# have exclusive first-in-wins rights to that setting.
|
|
113
|
+
#
|
|
114
|
+
# The one exception to this are array fields, because we don't want to
|
|
115
|
+
# overwrite the AllCops defaults but rather munge the arrays (`existing |
|
|
116
|
+
# new`) to allow plugins to add to the array, for example Include and
|
|
117
|
+
# Exclude paths and patterns.
|
|
118
|
+
def merge_all_cop_settings(existing_all_cops, new_all_cops, already_configured_keys)
|
|
119
|
+
return [existing_all_cops, already_configured_keys] unless new_all_cops.is_a?(Hash)
|
|
120
|
+
|
|
121
|
+
combined_all_cops = existing_all_cops.dup
|
|
122
|
+
combined_configured_keys = already_configured_keys.dup
|
|
123
|
+
|
|
124
|
+
new_all_cops.each do |key, value|
|
|
125
|
+
if combined_all_cops[key].is_a?(Array) && value.is_a?(Array)
|
|
126
|
+
combined_all_cops[key] |= value
|
|
127
|
+
combined_configured_keys |= [key]
|
|
128
|
+
elsif !combined_configured_keys.include?(key)
|
|
129
|
+
combined_all_cops[key] = value
|
|
130
|
+
combined_configured_keys << key
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
[combined_all_cops, combined_configured_keys]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def resolver
|
|
138
|
+
@resolver ||= ConfigLoaderResolver.new
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
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
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../feature_loader'
|
|
4
|
+
require_relative 'load_error'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
module Plugin
|
|
8
|
+
# A class for loading and resolving plugins.
|
|
9
|
+
# @api private
|
|
10
|
+
class Loader
|
|
11
|
+
# rubocop:disable Layout/LineLength
|
|
12
|
+
DEFAULT_PLUGIN_CONFIG = {
|
|
13
|
+
'enabled' => true,
|
|
14
|
+
'require_path' => nil, # If not set, will be set to the plugin name
|
|
15
|
+
'plugin_class_name' => nil # If not set, looks for gemspec `spec.metadata["default_lint_roller_plugin"]`
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
# rubocop:enable Layout/LineLength
|
|
19
|
+
class << self
|
|
20
|
+
def load(plugins)
|
|
21
|
+
normalized_plugin_configs = normalize(plugins)
|
|
22
|
+
normalized_plugin_configs.filter_map do |plugin_name, plugin_config|
|
|
23
|
+
next unless plugin_config['enabled']
|
|
24
|
+
|
|
25
|
+
plugin_class = constantize_plugin_from(plugin_name, plugin_config)
|
|
26
|
+
|
|
27
|
+
plugin_class.new(plugin_config)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
|
34
|
+
def normalize(plugin_configs)
|
|
35
|
+
plugin_configs.to_h do |plugin_config|
|
|
36
|
+
if plugin_config == Plugin::OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
37
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
38
|
+
Specify `rubocop-internal_affairs` instead of `rubocop/cop/internal_affairs` in your configuration.
|
|
39
|
+
MESSAGE
|
|
40
|
+
plugin_config = Plugin::INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if plugin_config.is_a?(Hash)
|
|
44
|
+
plugin_name = plugin_config.keys.first
|
|
45
|
+
|
|
46
|
+
[
|
|
47
|
+
plugin_name, DEFAULT_PLUGIN_CONFIG.merge(
|
|
48
|
+
{ 'require_path' => plugin_name }, plugin_config.values.first
|
|
49
|
+
)
|
|
50
|
+
]
|
|
51
|
+
# NOTE: Compatibility is maintained when `require: rubocop/cop/internal_affairs` remains
|
|
52
|
+
# specified in `.rubocop.yml`.
|
|
53
|
+
elsif (builtin_plugin_config = Plugin::BUILTIN_INTERNAL_PLUGINS[plugin_config])
|
|
54
|
+
[plugin_config, builtin_plugin_config]
|
|
55
|
+
else
|
|
56
|
+
[plugin_config, DEFAULT_PLUGIN_CONFIG.merge('require_path' => plugin_config)]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def constantize_plugin_from(plugin_name, plugin_config)
|
|
62
|
+
if plugin_name.is_a?(String) || plugin_name.is_a?(Symbol)
|
|
63
|
+
constantize(plugin_name, plugin_config)
|
|
64
|
+
else
|
|
65
|
+
plugin_name
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# rubocop:enable Metrics/MethodLength
|
|
70
|
+
def constantize(plugin_name, plugin_config)
|
|
71
|
+
require_plugin(plugin_config['require_path'])
|
|
72
|
+
|
|
73
|
+
if (constant_name = plugin_config['plugin_class_name'])
|
|
74
|
+
begin
|
|
75
|
+
Kernel.const_get(constant_name)
|
|
76
|
+
rescue StandardError
|
|
77
|
+
raise <<~MESSAGE
|
|
78
|
+
Failed while configuring plugin `#{plugin_name}': no constant with name `#{constant_name}' was found.
|
|
79
|
+
MESSAGE
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
constantize_plugin_from_gemspec_metadata(plugin_name)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def require_plugin(require_path)
|
|
87
|
+
FeatureLoader.load(config_directory_path: PathUtil.pwd, feature: require_path)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def constantize_plugin_from_gemspec_metadata(plugin_name)
|
|
91
|
+
plugin_class_name = Gem.loaded_specs[plugin_name].metadata['default_lint_roller_plugin']
|
|
92
|
+
|
|
93
|
+
Kernel.const_get(plugin_class_name)
|
|
94
|
+
rescue LoadError, StandardError
|
|
95
|
+
raise Plugin::LoadError, plugin_name
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Plugin
|
|
5
|
+
# An exception raised when a plugin is not supported by the RuboCop engine.
|
|
6
|
+
# @api private
|
|
7
|
+
class NotSupportedError < Error
|
|
8
|
+
def initialize(unsupported_plugins)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@unsupported_plugins = unsupported_plugins
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def message
|
|
15
|
+
if @unsupported_plugins.one?
|
|
16
|
+
about = @unsupported_plugins.first.about
|
|
17
|
+
|
|
18
|
+
"#{about.name} #{about.version} is not a plugin supported by RuboCop engine."
|
|
19
|
+
else
|
|
20
|
+
unsupported_plugin_names = @unsupported_plugins.map do |plugin|
|
|
21
|
+
"#{plugin.about.name} #{plugin.about.version}"
|
|
22
|
+
end.join(', ')
|
|
23
|
+
|
|
24
|
+
"#{unsupported_plugin_names} are not plugins supported by RuboCop engine."
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'plugin/configuration_integrator'
|
|
4
|
+
require_relative 'plugin/loader'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
# Provides a plugin for RuboCop extensions that conform to lint_roller.
|
|
8
|
+
# https://github.com/standardrb/lint_roller
|
|
9
|
+
# @api private
|
|
10
|
+
module Plugin
|
|
11
|
+
BUILTIN_INTERNAL_PLUGINS = {
|
|
12
|
+
'rubocop-internal_affairs' => {
|
|
13
|
+
'enabled' => true,
|
|
14
|
+
'require_path' => 'rubocop/cop/internal_affairs/plugin',
|
|
15
|
+
'plugin_class_name' => 'RuboCop::InternalAffairs::Plugin'
|
|
16
|
+
}
|
|
17
|
+
}.freeze
|
|
18
|
+
INTERNAL_AFFAIRS_PLUGIN_NAME = Plugin::BUILTIN_INTERNAL_PLUGINS.keys.first
|
|
19
|
+
OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME = 'rubocop/cop/internal_affairs'
|
|
20
|
+
|
|
21
|
+
class << self
|
|
22
|
+
def plugin_capable?(feature_name)
|
|
23
|
+
return true if BUILTIN_INTERNAL_PLUGINS.key?(feature_name)
|
|
24
|
+
return true if feature_name == OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
25
|
+
|
|
26
|
+
begin
|
|
27
|
+
# When not using Bundler. Makes the spec available but does not require it.
|
|
28
|
+
gem feature_name
|
|
29
|
+
rescue Gem::LoadError
|
|
30
|
+
# The user requested a gem that they do not have installed
|
|
31
|
+
end
|
|
32
|
+
return false unless (spec = Gem.loaded_specs[feature_name])
|
|
33
|
+
|
|
34
|
+
!!spec.metadata['default_lint_roller_plugin']
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def integrate_plugins(rubocop_config, plugins)
|
|
38
|
+
plugins = Plugin::Loader.load(plugins)
|
|
39
|
+
|
|
40
|
+
ConfigurationIntegrator.integrate_plugins_into_rubocop_config(rubocop_config, plugins)
|
|
41
|
+
|
|
42
|
+
plugins
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|