rubocop 1.79.2 → 1.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +185 -20
- data/config/obsoletion.yml +9 -0
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -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 +1 -1
- data/lib/rubocop/cli.rb +35 -9
- data/lib/rubocop/comment_config.rb +59 -17
- data/lib/rubocop/config.rb +14 -10
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +37 -23
- data/lib/rubocop/config_loader_resolver.rb +20 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +10 -5
- data/lib/rubocop/cop/base.rb +8 -2
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -2
- 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/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +33 -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/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +5 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- 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 +9 -9
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- 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 +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/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +14 -7
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +31 -13
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -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 +34 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- 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 +123 -7
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +26 -9
- 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 +2 -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 +229 -39
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +8 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +3 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13 -3
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +4 -2
- 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/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -3
- 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 +14 -8
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +0 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -12
- 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 +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -9
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +4 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -6
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +23 -6
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +3 -3
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +15 -6
- 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/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_json.rb +12 -16
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -0
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +7 -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_assignment.rb +48 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +1 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +37 -11
- data/lib/rubocop/cop/lint/void.rb +39 -12
- data/lib/rubocop/cop/message_annotator.rb +1 -1
- 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/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +4 -6
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5 -5
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
- data/lib/rubocop/cop/mixin/line_length_help.rb +21 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +0 -6
- data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -5
- 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_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +5 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +32 -8
- data/lib/rubocop/cop/naming/predicate_prefix.rb +12 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +62 -38
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +15 -4
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +14 -2
- data/lib/rubocop/cop/style/and_or.rb +1 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
- data/lib/rubocop/cop/style/array_intersect.rb +46 -12
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -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 +27 -34
- data/lib/rubocop/cop/style/case_equality.rb +15 -13
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +19 -2
- data/lib/rubocop/cop/style/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -18
- data/lib/rubocop/cop/style/constant_visibility.rb +17 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- 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 +8 -8
- data/lib/rubocop/cop/style/double_negation.rb +1 -1
- 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_class_definition.rb +119 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- 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 +23 -5
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +18 -16
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +3 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -3
- data/lib/rubocop/cop/style/format_string_token.rb +49 -5
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +27 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_lookup_method.rb +106 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- 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/if_inside_else.rb +16 -7
- data/lib/rubocop/cop/style/if_unless_modifier.rb +57 -17
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -12
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +4 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/lambda_call.rb +8 -8
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- 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 +17 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/min_max_comparison.rb +1 -1
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -4
- data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -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/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +6 -2
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
- 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 +1 -1
- 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_begin.rb +37 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +6 -3
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +26 -5
- data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +16 -0
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -30
- 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 +8 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- 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_struct_keyword_init.rb +114 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +31 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -3
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +25 -8
- 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 +51 -21
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +25 -7
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +12 -3
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +17 -13
- data/lib/rubocop/cop/style/struct_inheritance.rb +13 -0
- data/lib/rubocop/cop/style/super_arguments.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +7 -6
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
- 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 +11 -11
- 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_modifier.rb +16 -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/team.rb +87 -36
- data/lib/rubocop/cop/util.rb +2 -3
- data/lib/rubocop/cop/utils/format_string.rb +10 -0
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +9 -7
- data/lib/rubocop/cops_documentation_generator.rb +4 -4
- data/lib/rubocop/directive_comment.rb +48 -4
- 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 +24 -7
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/junit_formatter.rb +1 -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 +18 -33
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +43 -7
- data/lib/rubocop/lsp/runtime.rb +13 -4
- data/lib/rubocop/lsp/stdin_runner.rb +8 -17
- data/lib/rubocop/magic_comment.rb +20 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +35 -4
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/plugin/loader.rb +1 -1
- data/lib/rubocop/project_index_loader.rb +66 -0
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +61 -38
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/shared_contexts.rb +39 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +134 -57
- data/lib/rubocop/server/cache.rb +6 -29
- data/lib/rubocop/server/core.rb +2 -0
- data/lib/rubocop/target_finder.rb +17 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +21 -3
- data/lib/rubocop.rb +28 -96
- data/lib/ruby_lsp/rubocop/addon.rb +23 -8
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
- metadata +38 -9
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CLI
|
|
5
|
+
module Command
|
|
6
|
+
# Lists the cops that will inspect the given file or directory.
|
|
7
|
+
# @api private
|
|
8
|
+
class ListEnabledCopsFor < Base
|
|
9
|
+
self.command_name = :list_enabled_cops_for
|
|
10
|
+
|
|
11
|
+
def initialize(env)
|
|
12
|
+
super
|
|
13
|
+
|
|
14
|
+
# Load the configs so the require()s are done for custom cops
|
|
15
|
+
@config = @config_store.for(@options[:list_enabled_cops_for])
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def run
|
|
19
|
+
print_available_cops
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def print_available_cops
|
|
25
|
+
registry = Cop::Registry.global
|
|
26
|
+
|
|
27
|
+
registry.departments.sort.each do |department|
|
|
28
|
+
puts cops_of_department(registry, department).sort
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def cops_of_department(registry, department)
|
|
33
|
+
registry.with_department(department)
|
|
34
|
+
.map(&:cop_name)
|
|
35
|
+
.select { |cop_name| @config.cop_enabled?(cop_name) }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
self.command_name = :lsp
|
|
10
10
|
|
|
11
11
|
def run
|
|
12
|
-
# Load on demand, `
|
|
12
|
+
# Load on demand, `language-server-protocol` is heavy to require.
|
|
13
13
|
require_relative '../../lsp/server'
|
|
14
14
|
RuboCop::LSP::Server.new(@config_store).start
|
|
15
15
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CLI
|
|
5
|
+
module Command
|
|
6
|
+
# Start Model Context Protocol of RuboCop.
|
|
7
|
+
# @api private
|
|
8
|
+
class MCP < Base
|
|
9
|
+
self.command_name = :mcp
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
require_relative '../../mcp/server'
|
|
13
|
+
|
|
14
|
+
RuboCop::MCP::Server.new(@config_store).start
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
|
25
25
|
super
|
|
26
26
|
|
|
27
27
|
# Load the configs so the require()s are done for custom cops
|
|
28
|
-
@config = @config_store.for(
|
|
28
|
+
@config = @config_store.for(PathUtil.pwd)
|
|
29
29
|
|
|
30
30
|
@cop_matchers = @options[:show_cops].map do |pattern|
|
|
31
31
|
if pattern.include?('*')
|
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
|
46
46
|
registry = Cop::Registry.global
|
|
47
47
|
show_all = @cop_matchers.empty?
|
|
48
48
|
|
|
49
|
-
puts "# Available cops (#{registry.length}) + config for #{
|
|
49
|
+
puts "# Available cops (#{registry.length}) + config for #{PathUtil.pwd}: " if show_all
|
|
50
50
|
|
|
51
51
|
registry.departments.sort!.each do |department|
|
|
52
52
|
print_cops_of_department(registry, department, show_all)
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
|
12
12
|
def initialize(env)
|
|
13
13
|
super
|
|
14
14
|
|
|
15
|
-
@config = @config_store.for(
|
|
15
|
+
@config = @config_store.for(PathUtil.pwd)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def run
|
|
@@ -25,10 +25,10 @@ module RuboCop
|
|
|
25
25
|
puts Cop::Documentation.default_base_url if cops_array.empty?
|
|
26
26
|
|
|
27
27
|
cops_array.each do |cop_name|
|
|
28
|
-
cop =
|
|
29
|
-
next
|
|
28
|
+
cop = Cop::Registry.global.find_by_cop_name(cop_name)
|
|
29
|
+
next unless cop
|
|
30
30
|
|
|
31
|
-
url = Cop::Documentation.url_for(cop
|
|
31
|
+
url = Cop::Documentation.url_for(cop, @config)
|
|
32
32
|
puts url if url
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -38,10 +38,6 @@ module RuboCop
|
|
|
38
38
|
def cops_array
|
|
39
39
|
@cops_array ||= @options[:show_docs_url]
|
|
40
40
|
end
|
|
41
|
-
|
|
42
|
-
def registry_hash
|
|
43
|
-
@registry_hash ||= Cop::Registry.global.to_h
|
|
44
|
-
end
|
|
45
41
|
end
|
|
46
42
|
end
|
|
47
43
|
end
|
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
|
60
60
|
def print_opt_out_instruction
|
|
61
61
|
puts
|
|
62
62
|
puts 'You can opt out of this message by adding the following to your config ' \
|
|
63
|
-
'(see https://docs.rubocop.org/rubocop/
|
|
63
|
+
'(see https://docs.rubocop.org/rubocop/plugins.html#plugin-suggestions ' \
|
|
64
64
|
'for more options):'
|
|
65
65
|
puts ' AllCops:'
|
|
66
66
|
puts ' SuggestExtensions: false'
|
data/lib/rubocop/cli.rb
CHANGED
|
@@ -13,7 +13,7 @@ module RuboCop
|
|
|
13
13
|
DEFAULT_PARALLEL_OPTIONS = %i[
|
|
14
14
|
color config debug display_style_guide display_time display_only_fail_level_offenses
|
|
15
15
|
display_only_failed editor_mode except extra_details fail_level fix_layout format formatters
|
|
16
|
-
ignore_disable_comments lint only only_guide_cops require safe
|
|
16
|
+
ignore_disable_comments lint only only_guide_cops out require safe
|
|
17
17
|
autocorrect safe_autocorrect autocorrect_all
|
|
18
18
|
].freeze
|
|
19
19
|
|
|
@@ -37,6 +37,8 @@ module RuboCop
|
|
|
37
37
|
#
|
|
38
38
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
39
39
|
def run(args = ARGV)
|
|
40
|
+
time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
41
|
+
|
|
40
42
|
@options, paths = Options.new.parse(args)
|
|
41
43
|
@env = Environment.new(@options, @config_store, paths)
|
|
42
44
|
|
|
@@ -64,7 +66,7 @@ module RuboCop
|
|
|
64
66
|
STATUS_INTERRUPTED
|
|
65
67
|
rescue Finished
|
|
66
68
|
STATUS_SUCCESS
|
|
67
|
-
rescue OptionParser::
|
|
69
|
+
rescue OptionParser::ParseError => e
|
|
68
70
|
warn e.message
|
|
69
71
|
warn 'For usage information, use --help'
|
|
70
72
|
STATUS_ERROR
|
|
@@ -72,6 +74,11 @@ module RuboCop
|
|
|
72
74
|
warn e.message
|
|
73
75
|
warn e.backtrace
|
|
74
76
|
STATUS_ERROR
|
|
77
|
+
ensure
|
|
78
|
+
elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
|
|
79
|
+
if @options[:debug] || @options[:display_time]
|
|
80
|
+
puts "Finished in #{elapsed_time.round(5)} seconds"
|
|
81
|
+
end
|
|
75
82
|
end
|
|
76
83
|
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
77
84
|
|
|
@@ -159,8 +166,11 @@ module RuboCop
|
|
|
159
166
|
set_options_to_pending_cops_reporter
|
|
160
167
|
handle_editor_mode
|
|
161
168
|
|
|
162
|
-
@config_store.
|
|
163
|
-
|
|
169
|
+
@config_store.apply_options!(@options)
|
|
170
|
+
# Set cache root after apply_options! to ensure force_default_config is applied first.
|
|
171
|
+
early_cache_root = ConfigLoader.cache_root(@options[:cache_root])
|
|
172
|
+
ConfigLoader.cache_root = ResultCache.cache_root(@config_store, @options[:cache_root])
|
|
173
|
+
warn_if_cache_root_changed(early_cache_root, ConfigLoader.cache_root)
|
|
164
174
|
|
|
165
175
|
handle_exiting_options
|
|
166
176
|
|
|
@@ -179,6 +189,8 @@ module RuboCop
|
|
|
179
189
|
ConfigLoader.enable_pending_cops = @options[:enable_pending_cops]
|
|
180
190
|
ConfigLoader.ignore_parent_exclusion = @options[:ignore_parent_exclusion]
|
|
181
191
|
ConfigLoader.ignore_unrecognized_cops = @options[:ignore_unrecognized_cops]
|
|
192
|
+
ConfigLoader.enabled_by_default = @options[:enable_all_cops]
|
|
193
|
+
ConfigLoader.disabled_by_default = @options[:disable_all_cops]
|
|
182
194
|
end
|
|
183
195
|
|
|
184
196
|
def set_options_to_pending_cops_reporter
|
|
@@ -190,17 +202,15 @@ module RuboCop
|
|
|
190
202
|
RuboCop::LSP.enable if @options[:editor_mode]
|
|
191
203
|
end
|
|
192
204
|
|
|
193
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
194
205
|
def handle_exiting_options
|
|
195
206
|
return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
|
|
196
207
|
|
|
197
208
|
run_command(:version) if @options[:version] || @options[:verbose_version]
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
209
|
+
%i[show_cops list_enabled_cops_for show_docs_url lsp mcp].each do |name|
|
|
210
|
+
run_command(name) if @options[name]
|
|
211
|
+
end
|
|
201
212
|
raise Finished
|
|
202
213
|
end
|
|
203
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
204
214
|
|
|
205
215
|
def apply_default_formatter
|
|
206
216
|
# This must be done after the options have already been processed,
|
|
@@ -219,5 +229,21 @@ module RuboCop
|
|
|
219
229
|
def report_pending_cops
|
|
220
230
|
PendingCopsReporter.warn_if_needed(@config_store.for_pwd)
|
|
221
231
|
end
|
|
232
|
+
|
|
233
|
+
def warn_if_cache_root_changed(early, desired)
|
|
234
|
+
return if early == desired
|
|
235
|
+
# Normalize paths to avoid false positives from symlink resolution differences
|
|
236
|
+
if File.exist?(early) && File.exist?(desired) &&
|
|
237
|
+
File.realpath(early) == File.realpath(desired)
|
|
238
|
+
return
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
warn Rainbow(
|
|
242
|
+
"Warning: Remote configuration cache files were stored in `#{early}` " \
|
|
243
|
+
"because a desired cache root (`#{desired}`) was not set at the top level. " \
|
|
244
|
+
'Consider setting `AllCops: CacheRootDirectory` in your toplevel configuration file, ' \
|
|
245
|
+
'using the `RUBOCOP_CACHE_ROOT` environment variable, or using CLI options.'
|
|
246
|
+
).yellow
|
|
247
|
+
end
|
|
222
248
|
end
|
|
223
249
|
end
|
|
@@ -34,6 +34,7 @@ module RuboCop
|
|
|
34
34
|
def initialize(processed_source)
|
|
35
35
|
@processed_source = processed_source
|
|
36
36
|
@no_directives = !processed_source.raw_source.include?('rubocop')
|
|
37
|
+
@stack = []
|
|
37
38
|
end
|
|
38
39
|
|
|
39
40
|
def cop_enabled_at_line?(cop, line_number)
|
|
@@ -69,6 +70,7 @@ module RuboCop
|
|
|
69
70
|
def extra_enabled_comments_with_names(extras:, names:)
|
|
70
71
|
each_directive do |directive|
|
|
71
72
|
next unless comment_only_line?(directive.line_number)
|
|
73
|
+
next if directive.push? || directive.pop?
|
|
72
74
|
|
|
73
75
|
if directive.enabled_all?
|
|
74
76
|
handle_enable_all(directive, names, extras)
|
|
@@ -93,16 +95,25 @@ module RuboCop
|
|
|
93
95
|
end
|
|
94
96
|
end
|
|
95
97
|
|
|
96
|
-
|
|
98
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
99
|
+
def analyze
|
|
97
100
|
return {} if @no_directives
|
|
98
101
|
|
|
99
102
|
analyses = Hash.new { |hash, key| hash[key] = CopAnalysis.new([], nil) }
|
|
100
103
|
inject_disabled_cops_directives(analyses)
|
|
101
104
|
|
|
102
105
|
each_directive do |directive|
|
|
103
|
-
directive.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
if directive.push?
|
|
107
|
+
restore_point = analyses.transform_values(&:dup)
|
|
108
|
+
@stack.push(restore_point)
|
|
109
|
+
apply_push(analyses, resolve_push_cops(directive), directive.line_number)
|
|
110
|
+
elsif directive.pop?
|
|
111
|
+
pop_state(analyses, directive.line_number) if @stack.any?
|
|
112
|
+
else
|
|
113
|
+
directive.cop_names.each do |cop_name|
|
|
114
|
+
cop_name = qualified_cop_name(cop_name)
|
|
115
|
+
analyses[cop_name] = analyze_cop(analyses[cop_name], directive)
|
|
116
|
+
end
|
|
106
117
|
end
|
|
107
118
|
end
|
|
108
119
|
|
|
@@ -111,6 +122,45 @@ module RuboCop
|
|
|
111
122
|
hash[cop_name] = cop_line_ranges(analysis)
|
|
112
123
|
end
|
|
113
124
|
end
|
|
125
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
126
|
+
|
|
127
|
+
def resolve_push_cops(directive)
|
|
128
|
+
directive.push_args.transform_values do |names|
|
|
129
|
+
names.flat_map { |name| expand_cop_name(name) }
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def expand_cop_name(name)
|
|
134
|
+
registry = Cop::Registry.global
|
|
135
|
+
cops = registry.department?(name) ? registry.names_for_department(name) : [name]
|
|
136
|
+
cops.map { |c| qualified_cop_name(c) }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def apply_push(analyses, resolved_cops, line)
|
|
140
|
+
resolved_cops.each do |op, cops|
|
|
141
|
+
cops.each { |cop| apply_cop_op(analyses, op, cop, line) }
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def apply_cop_op(analyses, operation, cop, line)
|
|
146
|
+
analysis = analyses[cop]
|
|
147
|
+
if operation == '-' && !analysis.start_line_number
|
|
148
|
+
analyses[cop] = CopAnalysis.new(analysis.line_ranges, line)
|
|
149
|
+
elsif operation == '+' && analysis.start_line_number
|
|
150
|
+
analyses[cop] =
|
|
151
|
+
CopAnalysis.new(analysis.line_ranges + [analysis.start_line_number..line], nil)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def pop_state(analyses, line)
|
|
156
|
+
restore_point = @stack.pop
|
|
157
|
+
(restore_point.keys | analyses.keys).each do |cop|
|
|
158
|
+
current = analyses[cop]
|
|
159
|
+
new_range = current.start_line_number ? [current.start_line_number..(line - 1)] : []
|
|
160
|
+
new_start = restore_point[cop]&.start_line_number ? line : nil
|
|
161
|
+
analyses[cop] = CopAnalysis.new(current.line_ranges + new_range, new_start)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
114
164
|
|
|
115
165
|
def inject_disabled_cops_directives(analyses)
|
|
116
166
|
registry.disabled(config).each do |cop|
|
|
@@ -136,29 +186,21 @@ module RuboCop
|
|
|
136
186
|
return analysis unless directive.disabled?
|
|
137
187
|
|
|
138
188
|
line = directive.line_number
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
CopAnalysis.new(analysis.line_ranges + [(line..line)], start_line)
|
|
189
|
+
CopAnalysis.new(analysis.line_ranges + [(line..line)], analysis.start_line_number)
|
|
142
190
|
end
|
|
143
191
|
|
|
144
192
|
def analyze_disabled(analysis, directive)
|
|
145
193
|
line = directive.line_number
|
|
146
194
|
start_line = analysis.start_line_number
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
# range before we start a new range.
|
|
150
|
-
return CopAnalysis.new(analysis.line_ranges + [start_line..line], line) if start_line
|
|
151
|
-
|
|
152
|
-
CopAnalysis.new(analysis.line_ranges, line)
|
|
195
|
+
new_ranges = start_line ? analysis.line_ranges + [start_line..line] : analysis.line_ranges
|
|
196
|
+
CopAnalysis.new(new_ranges, line)
|
|
153
197
|
end
|
|
154
198
|
|
|
155
199
|
def analyze_rest(analysis, directive)
|
|
156
200
|
line = directive.line_number
|
|
157
201
|
start_line = analysis.start_line_number
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
CopAnalysis.new(analysis.line_ranges, nil)
|
|
202
|
+
new_ranges = start_line ? analysis.line_ranges + [start_line..line] : analysis.line_ranges
|
|
203
|
+
CopAnalysis.new(new_ranges, nil)
|
|
162
204
|
end
|
|
163
205
|
|
|
164
206
|
def cop_line_ranges(analysis)
|
data/lib/rubocop/config.rb
CHANGED
|
@@ -217,6 +217,9 @@ module RuboCop
|
|
|
217
217
|
for_all_cops['StringLiteralsFrozenByDefault']
|
|
218
218
|
end
|
|
219
219
|
|
|
220
|
+
# Returns true if the file matches any include pattern. If a block is given, the block is called
|
|
221
|
+
# to determine if the pattern is relevant (true returned by the block) or should be skipped
|
|
222
|
+
# (false returned).
|
|
220
223
|
def file_to_include?(file)
|
|
221
224
|
relative_file_path = path_relative_to_config(file)
|
|
222
225
|
|
|
@@ -228,11 +231,9 @@ module RuboCop
|
|
|
228
231
|
absolute_file_path = File.expand_path(file)
|
|
229
232
|
|
|
230
233
|
patterns_to_include.any? do |pattern|
|
|
231
|
-
if block_given?
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
match_path?(pattern, relative_file_path) || match_path?(pattern, absolute_file_path)
|
|
235
|
-
end
|
|
234
|
+
next if block_given? && !yield(pattern)
|
|
235
|
+
|
|
236
|
+
match_relative_or_absolute_path?(pattern, relative_file_path, absolute_file_path)
|
|
236
237
|
end
|
|
237
238
|
end
|
|
238
239
|
|
|
@@ -242,10 +243,7 @@ module RuboCop
|
|
|
242
243
|
# `bundler-console` conveys `Bundler::Console`).
|
|
243
244
|
return true if File.extname(file) == '.gemspec'
|
|
244
245
|
|
|
245
|
-
file_to_include?(file)
|
|
246
|
-
/[A-Z]/.match?(pattern.to_s) &&
|
|
247
|
-
(match_path?(pattern, relative_path) || match_path?(pattern, absolute_path))
|
|
248
|
-
end
|
|
246
|
+
file_to_include?(file) { |pattern| /[A-Z]/.match?(pattern.to_s) }
|
|
249
247
|
end
|
|
250
248
|
|
|
251
249
|
# Returns true if there's a chance that an Include pattern matches hidden
|
|
@@ -286,7 +284,7 @@ module RuboCop
|
|
|
286
284
|
loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
|
|
287
285
|
File.expand_path(File.dirname(loaded_path))
|
|
288
286
|
else
|
|
289
|
-
|
|
287
|
+
PathUtil.pwd
|
|
290
288
|
end
|
|
291
289
|
end
|
|
292
290
|
|
|
@@ -345,6 +343,12 @@ module RuboCop
|
|
|
345
343
|
|
|
346
344
|
private
|
|
347
345
|
|
|
346
|
+
def match_relative_or_absolute_path?(pattern, relative_file_path, absolute_file_path)
|
|
347
|
+
should_use_absolute_path = absolute?(pattern.to_s) || pattern.to_s.start_with?('..') ||
|
|
348
|
+
relative_file_path.start_with?('..')
|
|
349
|
+
match_path?(pattern, should_use_absolute_path ? absolute_file_path : relative_file_path)
|
|
350
|
+
end
|
|
351
|
+
|
|
348
352
|
# @return [Float, nil] The Rails version as a `major.minor` Float.
|
|
349
353
|
def target_rails_version_from_bundler_lock_file
|
|
350
354
|
@target_rails_version_from_bundler_lock_file ||= read_rails_version_from_bundler_lock_file
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'erb'
|
|
4
4
|
require 'yaml'
|
|
5
|
+
require_relative 'cache_config'
|
|
5
6
|
require_relative 'config_finder'
|
|
6
7
|
|
|
7
8
|
module RuboCop
|
|
@@ -23,21 +24,28 @@ module RuboCop
|
|
|
23
24
|
include FileFinder
|
|
24
25
|
|
|
25
26
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
|
26
|
-
:ignore_unrecognized_cops
|
|
27
|
-
attr_writer :default_configuration
|
|
27
|
+
:enabled_by_default, :disabled_by_default, :ignore_unrecognized_cops
|
|
28
|
+
attr_writer :default_configuration, :cache_root
|
|
28
29
|
attr_reader :loaded_plugins, :loaded_features
|
|
29
30
|
|
|
30
31
|
alias debug? debug
|
|
31
32
|
alias ignore_parent_exclusion? ignore_parent_exclusion
|
|
32
33
|
|
|
34
|
+
def cache_root(cache_root_override = nil)
|
|
35
|
+
@cache_root ||= CacheConfig.root_dir_from_toplevel_config(cache_root_override)
|
|
36
|
+
end
|
|
37
|
+
|
|
33
38
|
def clear_options
|
|
34
39
|
@debug = nil
|
|
35
40
|
@loaded_plugins = Set.new
|
|
36
41
|
@loaded_features = Set.new
|
|
37
42
|
@disable_pending_cops = nil
|
|
38
43
|
@enable_pending_cops = nil
|
|
44
|
+
@enabled_by_default = nil
|
|
45
|
+
@disabled_by_default = nil
|
|
39
46
|
@ignore_parent_exclusion = nil
|
|
40
47
|
@ignore_unrecognized_cops = nil
|
|
48
|
+
@cache_root = nil
|
|
41
49
|
FileFinder.root_level = nil
|
|
42
50
|
end
|
|
43
51
|
|
|
@@ -75,7 +83,9 @@ module RuboCop
|
|
|
75
83
|
|
|
76
84
|
puts "configuration from #{absolute_path}" if debug?
|
|
77
85
|
|
|
78
|
-
|
|
86
|
+
unless hash.is_a?(Hash)
|
|
87
|
+
raise(ValidationError, "Malformed configuration in #{absolute_path}")
|
|
88
|
+
end
|
|
79
89
|
|
|
80
90
|
hash
|
|
81
91
|
end
|
|
@@ -113,7 +123,7 @@ module RuboCop
|
|
|
113
123
|
end
|
|
114
124
|
|
|
115
125
|
def configuration_from_file(config_file, check: true)
|
|
116
|
-
return default_configuration if config_file == DEFAULT_FILE
|
|
126
|
+
return apply_default_overrides(default_configuration) if config_file == DEFAULT_FILE
|
|
117
127
|
|
|
118
128
|
config = load_file(config_file, check: check)
|
|
119
129
|
config.validate_after_resolution if check
|
|
@@ -148,31 +158,22 @@ module RuboCop
|
|
|
148
158
|
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
|
149
159
|
# so this API is usually not needed. It is intended to be used only when implementing tests
|
|
150
160
|
# that do not use `rubocop/rspec/support`.
|
|
151
|
-
# rubocop:disable Metrics/MethodLength
|
|
152
161
|
def inject_defaults!(config_yml_path)
|
|
153
162
|
if Pathname(config_yml_path).directory?
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
Use config YAML file path instead of project root directory.
|
|
161
|
-
e.g., `path/to/config/default.yml`
|
|
162
|
-
MESSAGE
|
|
163
|
-
end
|
|
164
|
-
# NOTE: For compatibility.
|
|
165
|
-
project_root = config_yml_path
|
|
166
|
-
path = File.join(project_root, 'config', 'default.yml')
|
|
167
|
-
config = load_file(path)
|
|
168
|
-
else
|
|
169
|
-
hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
|
|
170
|
-
config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
|
|
163
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
|
164
|
+
Use config YAML file path instead of project root directory.
|
|
165
|
+
e.g., `path/to/config/default.yml`
|
|
166
|
+
MESSAGE
|
|
167
|
+
raise ArgumentError,
|
|
168
|
+
'Passing a project root directory to `inject_defaults!` is no longer supported.'
|
|
171
169
|
end
|
|
172
170
|
|
|
171
|
+
path = config_yml_path.to_s
|
|
172
|
+
hash = ConfigLoader.load_yaml_configuration(path)
|
|
173
|
+
config = Config.new(hash, path).tap(&:make_excludes_absolute)
|
|
174
|
+
|
|
173
175
|
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
|
174
176
|
end
|
|
175
|
-
# rubocop:enable Metrics/MethodLength
|
|
176
177
|
|
|
177
178
|
# Returns the path RuboCop inferred as the root of the project. No file
|
|
178
179
|
# searches will go past this directory.
|
|
@@ -191,6 +192,19 @@ module RuboCop
|
|
|
191
192
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
|
192
193
|
end
|
|
193
194
|
|
|
195
|
+
# Applies CLI overrides for `AllCops/EnabledByDefault` and
|
|
196
|
+
# `AllCops/DisabledByDefault` to the given configuration. Used when the
|
|
197
|
+
# configuration would otherwise be returned without going through
|
|
198
|
+
# `merge_with_default` (e.g. there is no user-supplied `.rubocop.yml`).
|
|
199
|
+
def apply_default_overrides(config)
|
|
200
|
+
return config if @enabled_by_default.nil? && @disabled_by_default.nil?
|
|
201
|
+
|
|
202
|
+
hash = config.transform_values do |params|
|
|
203
|
+
params.is_a?(Hash) ? params.merge('Enabled' => !@disabled_by_default) : params
|
|
204
|
+
end
|
|
205
|
+
Config.new(hash, config.loaded_path)
|
|
206
|
+
end
|
|
207
|
+
|
|
194
208
|
# @api private
|
|
195
209
|
# Used to add plugins that were required inside a config or from
|
|
196
210
|
# the CLI using `--plugin`.
|
|
@@ -45,6 +45,7 @@ module RuboCop
|
|
|
45
45
|
base_config.each do |k, v|
|
|
46
46
|
next unless v.is_a?(Hash)
|
|
47
47
|
|
|
48
|
+
only_base_has_include = v.key?('Include') && !hash.dig(k, 'Include')
|
|
48
49
|
if hash.key?(k)
|
|
49
50
|
v = merge(v, hash[k],
|
|
50
51
|
cop_name: k, file: file, debug: debug,
|
|
@@ -52,7 +53,7 @@ module RuboCop
|
|
|
52
53
|
inherit_mode: determine_inherit_mode(hash, k))
|
|
53
54
|
end
|
|
54
55
|
hash[k] = v
|
|
55
|
-
fix_include_paths(base_config.loaded_path, hash, path, k, v) if
|
|
56
|
+
fix_include_paths(base_config.loaded_path, hash, path, k, v) if only_base_has_include
|
|
56
57
|
end
|
|
57
58
|
end
|
|
58
59
|
end
|
|
@@ -91,11 +92,11 @@ module RuboCop
|
|
|
91
92
|
# only cops from user configuration are enabled. If
|
|
92
93
|
# AllCops:EnabledByDefault is true, it changes the Enabled params so that
|
|
93
94
|
# only cops explicitly disabled in user configuration are disabled.
|
|
95
|
+
# When the `--disable-all-cops` or `--enable-all-cops` CLI option is given,
|
|
96
|
+
# it takes precedence over the configuration values.
|
|
94
97
|
def merge_with_default(config, config_file, unset_nil:)
|
|
95
98
|
default_configuration = ConfigLoader.default_configuration
|
|
96
|
-
|
|
97
|
-
disabled_by_default = config.for_all_cops['DisabledByDefault']
|
|
98
|
-
enabled_by_default = config.for_all_cops['EnabledByDefault']
|
|
99
|
+
disabled_by_default, enabled_by_default = resolve_default_overrides(config)
|
|
99
100
|
|
|
100
101
|
if disabled_by_default || enabled_by_default
|
|
101
102
|
default_configuration = transform(default_configuration) do |params|
|
|
@@ -168,6 +169,14 @@ module RuboCop
|
|
|
168
169
|
|
|
169
170
|
private
|
|
170
171
|
|
|
172
|
+
def resolve_default_overrides(config)
|
|
173
|
+
if ConfigLoader.disabled_by_default || ConfigLoader.enabled_by_default
|
|
174
|
+
[ConfigLoader.disabled_by_default, ConfigLoader.enabled_by_default]
|
|
175
|
+
else
|
|
176
|
+
[config.for_all_cops['DisabledByDefault'], config.for_all_cops['EnabledByDefault']]
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
171
180
|
def disabled?(hash, department)
|
|
172
181
|
hash[department].is_a?(Hash) && hash[department]['Enabled'] == false
|
|
173
182
|
end
|
|
@@ -246,7 +255,7 @@ module RuboCop
|
|
|
246
255
|
def inherited_file(path, inherit_from, file)
|
|
247
256
|
if PathUtil.remote_file?(inherit_from)
|
|
248
257
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
|
249
|
-
RemoteConfig.new(inherit_from,
|
|
258
|
+
RemoteConfig.new(inherit_from, ConfigLoader.cache_root)
|
|
250
259
|
elsif Pathname.new(inherit_from).absolute?
|
|
251
260
|
# An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`.
|
|
252
261
|
# The path may come from `inherit_gem` option, where a gem name is expanded
|
|
@@ -256,7 +265,7 @@ module RuboCop
|
|
|
256
265
|
elsif file.is_a?(RemoteConfig)
|
|
257
266
|
# A path relative to a URL, e.g. `inherit_from: configs/default.yml`
|
|
258
267
|
# in a config included with `inherit_from: http://example.com/rubocop.yml`
|
|
259
|
-
file.inherit_from_remote(inherit_from
|
|
268
|
+
file.inherit_from_remote(inherit_from)
|
|
260
269
|
else
|
|
261
270
|
# A local relative path, e.g. `inherit_from: default.yml`
|
|
262
271
|
print 'Inheriting ' if ConfigLoader.debug?
|
|
@@ -295,10 +304,11 @@ module RuboCop
|
|
|
295
304
|
begin
|
|
296
305
|
gem = Bundler.load.specs[gem_name].first
|
|
297
306
|
gem_path = gem.full_gem_path if gem
|
|
298
|
-
rescue
|
|
299
|
-
#
|
|
300
|
-
|
|
301
|
-
# The Gemfile exists but contains an uninstalled git source
|
|
307
|
+
rescue StandardError
|
|
308
|
+
# The Gemfile has a problem, which could be one of:
|
|
309
|
+
# - No Gemfile found. Bundler may be loaded manually
|
|
310
|
+
# - The Gemfile exists but contains an uninstalled git source
|
|
311
|
+
# - The Gemfile exists but cannot be loaded for some other reason
|
|
302
312
|
end
|
|
303
313
|
end
|
|
304
314
|
|
|
@@ -39,8 +39,10 @@ module RuboCop
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def plugin_loaded?
|
|
42
|
-
# Plugins loaded via `
|
|
43
|
-
|
|
42
|
+
# Plugins loaded via `plugins` are Plugin objects with an `about.name` attribute.
|
|
43
|
+
# Plugins loaded via `require` are included in `loaded_features` as strings.
|
|
44
|
+
config.loaded_plugins.any? { |plugin| plugin.about.name == gem } ||
|
|
45
|
+
config.loaded_features.include?(gem)
|
|
44
46
|
end
|
|
45
47
|
end
|
|
46
48
|
end
|
data/lib/rubocop/config_store.rb
CHANGED
|
@@ -25,13 +25,18 @@ module RuboCop
|
|
|
25
25
|
@validated = true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def apply_options!(options)
|
|
29
|
+
self.options_config = options[:config] if options[:config]
|
|
30
|
+
force_default_config! if options[:force_default_config]
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def options_config=(options_config)
|
|
29
34
|
loaded_config = ConfigLoader.load_file(options_config)
|
|
30
35
|
@options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
def force_default_config!
|
|
34
|
-
@options_config = ConfigLoader.default_configuration
|
|
39
|
+
@options_config = ConfigLoader.apply_default_overrides(ConfigLoader.default_configuration)
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
def unvalidated
|
|
@@ -44,7 +49,7 @@ module RuboCop
|
|
|
44
49
|
end
|
|
45
50
|
|
|
46
51
|
def for_pwd
|
|
47
|
-
for_dir(
|
|
52
|
+
for_dir(PathUtil.pwd)
|
|
48
53
|
end
|
|
49
54
|
|
|
50
55
|
# If type (file/dir) is known beforehand,
|