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
data/lib/rubocop/runner.rb
CHANGED
|
@@ -62,14 +62,21 @@ module RuboCop
|
|
|
62
62
|
@errors = []
|
|
63
63
|
@warnings = []
|
|
64
64
|
@aborting = false
|
|
65
|
+
@inspected_files = []
|
|
66
|
+
@report_queue = {}
|
|
65
67
|
end
|
|
66
68
|
|
|
67
69
|
def run(paths)
|
|
70
|
+
# Compute the cache source checksum once to avoid potential
|
|
71
|
+
# inconsistencies between workers.
|
|
72
|
+
ResultCache.source_checksum
|
|
73
|
+
|
|
68
74
|
target_files = find_target_files(paths)
|
|
75
|
+
@project_index = ProjectIndexLoader.build_index(target_files) if project_index_enabled?
|
|
76
|
+
|
|
69
77
|
if @options[:list_target_files]
|
|
70
78
|
list_files(target_files)
|
|
71
79
|
else
|
|
72
|
-
warm_cache(target_files) if @options[:parallel]
|
|
73
80
|
inspect_files(target_files)
|
|
74
81
|
end
|
|
75
82
|
rescue Interrupt
|
|
@@ -86,21 +93,6 @@ module RuboCop
|
|
|
86
93
|
|
|
87
94
|
private
|
|
88
95
|
|
|
89
|
-
# Warms up the RuboCop cache by forking a suitable number of RuboCop
|
|
90
|
-
# instances that each inspects its allotted group of files.
|
|
91
|
-
def warm_cache(target_files)
|
|
92
|
-
saved_options = @options.dup
|
|
93
|
-
if target_files.length <= 1
|
|
94
|
-
puts 'Skipping parallel inspection: only a single file needs inspection' if @options[:debug]
|
|
95
|
-
return
|
|
96
|
-
end
|
|
97
|
-
puts 'Running parallel inspection' if @options[:debug]
|
|
98
|
-
%i[autocorrect safe_autocorrect].each { |opt| @options[opt] = false }
|
|
99
|
-
Parallel.each(target_files) { |target_file| file_offenses(target_file) }
|
|
100
|
-
ensure
|
|
101
|
-
@options = saved_options
|
|
102
|
-
end
|
|
103
|
-
|
|
104
96
|
def find_target_files(paths)
|
|
105
97
|
target_finder = TargetFinder.new(@config_store, @options)
|
|
106
98
|
mode = if @options[:only_recognized_file_types]
|
|
@@ -112,12 +104,26 @@ module RuboCop
|
|
|
112
104
|
target_files.each(&:freeze).freeze
|
|
113
105
|
end
|
|
114
106
|
|
|
115
|
-
def
|
|
116
|
-
|
|
107
|
+
def project_index_enabled?
|
|
108
|
+
return false unless @config_store.for_pwd.for_all_cops['UseProjectIndex']
|
|
117
109
|
|
|
110
|
+
unless ProjectIndexLoader.available?
|
|
111
|
+
ProjectIndexLoader.warn_unavailable
|
|
112
|
+
return false
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
true
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def inspect_files(files) # rubocop:disable Metrics/AbcSize
|
|
118
119
|
formatter_set.started(files)
|
|
120
|
+
file_iterator(files) do |file|
|
|
121
|
+
offenses = process_file(file)
|
|
122
|
+
succeeded = offenses.none? { |o| considered_failure?(o) && offense_displayed?(o) }
|
|
123
|
+
raise Parallel::Break if @options[:fail_fast] && !succeeded
|
|
119
124
|
|
|
120
|
-
|
|
125
|
+
[offenses, succeeded]
|
|
126
|
+
end
|
|
121
127
|
ensure
|
|
122
128
|
# OPTIMIZE: Calling `ResultCache.cleanup` takes time. This optimization
|
|
123
129
|
# mainly targets editors that integrates RuboCop. When RuboCop is run
|
|
@@ -125,23 +131,88 @@ module RuboCop
|
|
|
125
131
|
if files.size > 1 && cached_run?
|
|
126
132
|
ResultCache.cleanup(@config_store, @options[:debug], @options[:cache_root])
|
|
127
133
|
end
|
|
128
|
-
|
|
129
|
-
formatter_set.finished(inspected_files.freeze)
|
|
134
|
+
formatter_set.finished(@inspected_files.freeze)
|
|
130
135
|
formatter_set.close_output_files
|
|
131
136
|
end
|
|
132
137
|
|
|
133
|
-
def
|
|
134
|
-
|
|
135
|
-
offenses = process_file(file)
|
|
136
|
-
yield file
|
|
138
|
+
def file_iterator(files, &block)
|
|
139
|
+
all_passed = true
|
|
137
140
|
|
|
138
|
-
|
|
139
|
-
|
|
141
|
+
on_start = ->(file, _index) { file_started(file) }
|
|
142
|
+
on_finish = lambda do |file, index, (offenses, passed)|
|
|
143
|
+
all_passed &&= passed
|
|
144
|
+
finished_report(file, index, offenses)
|
|
145
|
+
end
|
|
140
146
|
|
|
141
|
-
|
|
142
|
-
|
|
147
|
+
if run_in_parallel?(files)
|
|
148
|
+
parallel_file_iterator(files, on_start, on_finish, &block)
|
|
149
|
+
else
|
|
150
|
+
serial_file_iterator(files, on_start, on_finish, &block)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
process_remaining_report_queue
|
|
154
|
+
|
|
155
|
+
all_passed
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def finished_report(file, index, offenses)
|
|
159
|
+
@report_queue[index] = [file, offenses]
|
|
160
|
+
@next_index_to_report ||= 0
|
|
161
|
+
while @report_queue.key?(@next_index_to_report)
|
|
162
|
+
process_report_queue_entry(@next_index_to_report)
|
|
163
|
+
@next_index_to_report += 1
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def process_report_queue_entry(index)
|
|
168
|
+
file, offenses = @report_queue.delete(index)
|
|
169
|
+
file_finished(file, offenses)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def process_remaining_report_queue
|
|
173
|
+
@report_queue.keys.sort.each do |index|
|
|
174
|
+
process_report_queue_entry(index)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
143
177
|
|
|
144
|
-
|
|
178
|
+
def run_in_parallel?(files)
|
|
179
|
+
return false if @options[:auto_gen_config]
|
|
180
|
+
return false unless @options[:parallel]
|
|
181
|
+
|
|
182
|
+
if files.size <= 1
|
|
183
|
+
puts 'Skipping parallel inspection: only a single file needs inspection' if @options[:debug]
|
|
184
|
+
return false
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
return false if project_index_disables_parallel?
|
|
188
|
+
|
|
189
|
+
puts 'Running parallel inspection' if @options[:debug]
|
|
190
|
+
|
|
191
|
+
true
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def project_index_disables_parallel?
|
|
195
|
+
return false if @project_index.nil? || !Gem.win_platform?
|
|
196
|
+
|
|
197
|
+
if @options[:debug]
|
|
198
|
+
puts 'Skipping parallel inspection: the project index is enabled and parallel ' \
|
|
199
|
+
'inspection is not yet supported on Windows.'
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
true
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def parallel_file_iterator(files, on_start, on_finish, &block)
|
|
206
|
+
Parallel.each(files, start: on_start, finish: on_finish, &block)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def serial_file_iterator(files, on_start, on_finish, &block)
|
|
210
|
+
files.each_with_index do |file, index|
|
|
211
|
+
on_start.call(file, index)
|
|
212
|
+
result = yield file
|
|
213
|
+
on_finish.call(file, index, result)
|
|
214
|
+
rescue Parallel::Break
|
|
215
|
+
break
|
|
145
216
|
end
|
|
146
217
|
end
|
|
147
218
|
|
|
@@ -150,16 +221,13 @@ module RuboCop
|
|
|
150
221
|
end
|
|
151
222
|
|
|
152
223
|
def process_file(file)
|
|
153
|
-
|
|
154
|
-
offenses = file_offenses(file)
|
|
224
|
+
file_offenses(file)
|
|
155
225
|
rescue InfiniteCorrectionLoop => e
|
|
156
226
|
raise e if @options[:raise_cop_error]
|
|
157
227
|
|
|
158
228
|
errors << e
|
|
159
229
|
warn Rainbow(e.message).red
|
|
160
|
-
|
|
161
|
-
ensure
|
|
162
|
-
file_finished(file, offenses || [])
|
|
230
|
+
e.offenses.compact.sort.freeze
|
|
163
231
|
end
|
|
164
232
|
|
|
165
233
|
def file_offenses(file)
|
|
@@ -190,7 +258,7 @@ module RuboCop
|
|
|
190
258
|
|
|
191
259
|
if real_run_needed
|
|
192
260
|
offenses = yield
|
|
193
|
-
save_in_cache(cache, offenses)
|
|
261
|
+
save_in_cache(cache, offenses) unless Cop::Registry.global.warnings?(file)
|
|
194
262
|
end
|
|
195
263
|
|
|
196
264
|
offenses
|
|
@@ -246,6 +314,7 @@ module RuboCop
|
|
|
246
314
|
end
|
|
247
315
|
|
|
248
316
|
def file_finished(file, offenses)
|
|
317
|
+
@inspected_files << file
|
|
249
318
|
offenses = offenses_to_report(offenses)
|
|
250
319
|
formatter_set.file_finished(file, offenses)
|
|
251
320
|
end
|
|
@@ -254,10 +323,6 @@ module RuboCop
|
|
|
254
323
|
@cached_run ||=
|
|
255
324
|
(@options[:cache] == 'true' ||
|
|
256
325
|
(@options[:cache] != 'false' && @config_store.for_pwd.for_all_cops['UseCache'])) &&
|
|
257
|
-
# When running --auto-gen-config, there's some processing done in the
|
|
258
|
-
# cops related to calculating the Max parameters for Metrics cops. We
|
|
259
|
-
# need to do that processing and cannot use caching.
|
|
260
|
-
!@options[:auto_gen_config] &&
|
|
261
326
|
# We can't cache results from code which is piped in to stdin
|
|
262
327
|
!@options[:stdin]
|
|
263
328
|
end
|
|
@@ -273,7 +338,8 @@ module RuboCop
|
|
|
273
338
|
end
|
|
274
339
|
|
|
275
340
|
def do_inspection_loop(file)
|
|
276
|
-
|
|
341
|
+
# We can reuse the prism result since the source did not change yet.
|
|
342
|
+
processed_source = get_processed_source(file, @prism_result)
|
|
277
343
|
# This variable is 2d array used to track corrected offenses after each
|
|
278
344
|
# inspection iteration. This is used to output meaningful infinite loop
|
|
279
345
|
# error message.
|
|
@@ -295,7 +361,8 @@ module RuboCop
|
|
|
295
361
|
# loop if we find any.
|
|
296
362
|
break unless updated_source_file
|
|
297
363
|
|
|
298
|
-
|
|
364
|
+
# Autocorrect has happened, don't use the prism result since it is stale.
|
|
365
|
+
processed_source = get_processed_source(file, nil)
|
|
299
366
|
end
|
|
300
367
|
|
|
301
368
|
# Return summary of corrected offenses after all iterations
|
|
@@ -344,16 +411,9 @@ module RuboCop
|
|
|
344
411
|
|
|
345
412
|
def inspect_file(processed_source, team = mobilize_team(processed_source))
|
|
346
413
|
extracted_ruby_sources = extract_ruby_sources(processed_source)
|
|
347
|
-
offenses = extracted_ruby_sources
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
offset: extracted_ruby_source[:offset],
|
|
351
|
-
original: processed_source
|
|
352
|
-
)
|
|
353
|
-
@errors.concat(team.errors)
|
|
354
|
-
@warnings.concat(team.warnings)
|
|
355
|
-
report.offenses
|
|
356
|
-
end
|
|
414
|
+
offenses = team.investigate_fragments(extracted_ruby_sources, original: processed_source)
|
|
415
|
+
@errors.concat(team.errors)
|
|
416
|
+
@warnings.concat(team.warnings)
|
|
357
417
|
[offenses, team.updated_source_file?]
|
|
358
418
|
end
|
|
359
419
|
|
|
@@ -373,7 +433,15 @@ module RuboCop
|
|
|
373
433
|
|
|
374
434
|
def mobilize_team(processed_source)
|
|
375
435
|
config = @config_store.for_file(processed_source.path)
|
|
376
|
-
Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
436
|
+
team = Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
437
|
+
|
|
438
|
+
if @project_index
|
|
439
|
+
team.cops.each do |cop|
|
|
440
|
+
cop.project_index = @project_index
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
team
|
|
377
445
|
end
|
|
378
446
|
|
|
379
447
|
def mobilized_cop_classes(config) # rubocop:disable Metrics/AbcSize
|
|
@@ -482,7 +550,7 @@ module RuboCop
|
|
|
482
550
|
end
|
|
483
551
|
|
|
484
552
|
# rubocop:disable Metrics/MethodLength
|
|
485
|
-
def get_processed_source(file)
|
|
553
|
+
def get_processed_source(file, prism_result)
|
|
486
554
|
config = @config_store.for_file(file)
|
|
487
555
|
ruby_version = config.target_ruby_version
|
|
488
556
|
parser_engine = config.parser_engine
|
|
@@ -493,7 +561,7 @@ module RuboCop
|
|
|
493
561
|
ruby_version,
|
|
494
562
|
file,
|
|
495
563
|
parser_engine: parser_engine,
|
|
496
|
-
prism_result:
|
|
564
|
+
prism_result: prism_result
|
|
497
565
|
)
|
|
498
566
|
else
|
|
499
567
|
begin
|
|
@@ -516,8 +584,17 @@ module RuboCop
|
|
|
516
584
|
# level caching in ResultCache.
|
|
517
585
|
def standby_team(config)
|
|
518
586
|
@team_by_config ||= {}.compare_by_identity
|
|
519
|
-
@team_by_config[config] ||=
|
|
520
|
-
Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
587
|
+
@team_by_config[config] ||= begin
|
|
588
|
+
team = Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
589
|
+
|
|
590
|
+
if @project_index
|
|
591
|
+
team.cops.each do |cop|
|
|
592
|
+
cop.project_index = @project_index
|
|
593
|
+
end
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
team
|
|
597
|
+
end
|
|
521
598
|
end
|
|
522
599
|
end
|
|
523
600
|
end
|
data/lib/rubocop/server/cache.rb
CHANGED
|
@@ -73,33 +73,12 @@ module RuboCop
|
|
|
73
73
|
cache_root_dir = if cache_root_path
|
|
74
74
|
File.join(cache_root_path, 'rubocop_cache')
|
|
75
75
|
else
|
|
76
|
-
|
|
76
|
+
CacheConfig.root_dir_from_toplevel_config
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
File.expand_path(File.join(cache_root_dir, 'server'))
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
def cache_root_dir_from_config
|
|
83
|
-
CacheConfig.root_dir do
|
|
84
|
-
# `RuboCop::ConfigStore` has heavy dependencies, this is a lightweight implementation
|
|
85
|
-
# so that only the necessary `CacheRootDirectory` can be obtained.
|
|
86
|
-
config_path = ConfigFinder.find_config_path(Dir.pwd)
|
|
87
|
-
file_contents = File.read(config_path)
|
|
88
|
-
|
|
89
|
-
# Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
|
|
90
|
-
next unless file_contents.include?('CacheRootDirectory')
|
|
91
|
-
|
|
92
|
-
config_yaml = load_erb_templated_yaml(file_contents)
|
|
93
|
-
|
|
94
|
-
# For compatibility with Ruby 3.0 or lower.
|
|
95
|
-
if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
|
|
96
|
-
config_yaml == false ? nil : config_yaml
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
config_yaml&.dig('AllCops', 'CacheRootDirectory')
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
82
|
def port_path
|
|
104
83
|
dir.join('port')
|
|
105
84
|
end
|
|
@@ -135,13 +114,11 @@ module RuboCop
|
|
|
135
114
|
end
|
|
136
115
|
|
|
137
116
|
def acquire_lock
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
lock_file.flock(File::LOCK_UN)
|
|
144
|
-
lock_file.close
|
|
117
|
+
File.open(lock_path, File::CREAT) do |lock_file|
|
|
118
|
+
# flock returns 0 if successful, and false if not.
|
|
119
|
+
flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB)
|
|
120
|
+
yield flock_result != false
|
|
121
|
+
end
|
|
145
122
|
end
|
|
146
123
|
|
|
147
124
|
def write_port_and_token_files(port:, token:)
|
data/lib/rubocop/server/core.rb
CHANGED
|
@@ -45,6 +45,8 @@ module RuboCop
|
|
|
45
45
|
write_port_and_token_files
|
|
46
46
|
|
|
47
47
|
pid = fork do
|
|
48
|
+
# NOTE: As of Ruby 4.0.0, ZJIT is still under development, while YJIT is production-ready,
|
|
49
|
+
# so support for ZJIT is deferred.
|
|
48
50
|
if defined?(RubyVM::YJIT.enable)
|
|
49
51
|
RubyVM::YJIT.enable
|
|
50
52
|
end
|
|
@@ -38,18 +38,16 @@ module RuboCop
|
|
|
38
38
|
# @param base_dir Root directory under which to search for
|
|
39
39
|
# ruby source files
|
|
40
40
|
# @return [Array] Array of filenames
|
|
41
|
-
def target_files_in_dir(base_dir =
|
|
41
|
+
def target_files_in_dir(base_dir = PathUtil.pwd)
|
|
42
42
|
# Support Windows: Backslashes from command-line -> forward slashes
|
|
43
43
|
base_dir = base_dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
|
|
44
44
|
all_files = find_files(base_dir, File::FNM_DOTMATCH)
|
|
45
|
-
# use file.include? for performance optimization
|
|
46
|
-
hidden_files = all_files.select { |file| file.include?(HIDDEN_PATH_SUBSTRING) }.sort
|
|
47
45
|
base_dir_config = @config_store.for(base_dir)
|
|
48
46
|
|
|
49
|
-
target_files = if
|
|
47
|
+
target_files = if hidden_dir?(base_dir)
|
|
50
48
|
all_files.select { |file| ruby_file?(file) }
|
|
51
49
|
else
|
|
52
|
-
all_files.select { |file| to_inspect?(file,
|
|
50
|
+
all_files.select { |file| to_inspect?(file, base_dir, base_dir_config) }
|
|
53
51
|
end
|
|
54
52
|
|
|
55
53
|
target_files.sort_by!(&order)
|
|
@@ -74,18 +72,27 @@ module RuboCop
|
|
|
74
72
|
|
|
75
73
|
private
|
|
76
74
|
|
|
77
|
-
def to_inspect?(file,
|
|
75
|
+
def to_inspect?(file, base_dir, base_dir_config)
|
|
78
76
|
return false if base_dir_config.file_to_exclude?(file)
|
|
79
|
-
return true if !
|
|
80
|
-
file <=> hidden_file
|
|
81
|
-
end && ruby_file?(file)
|
|
77
|
+
return true if !hidden_file_in_dir?(file, base_dir) && ruby_file?(file)
|
|
82
78
|
|
|
83
79
|
base_dir_config.file_to_include?(file)
|
|
84
80
|
end
|
|
85
81
|
|
|
82
|
+
def hidden_dir?(dir)
|
|
83
|
+
basename = File.basename(dir)
|
|
84
|
+
basename.start_with?('.') && basename != '.' && basename != '..'
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def hidden_file_in_dir?(file, base_dir)
|
|
88
|
+
base_dir = "#{base_dir}#{File::SEPARATOR}" unless base_dir.end_with?(File::SEPARATOR)
|
|
89
|
+
relative = file.delete_prefix(base_dir)
|
|
90
|
+
relative.start_with?('.') || relative.include?(HIDDEN_PATH_SUBSTRING)
|
|
91
|
+
end
|
|
92
|
+
|
|
86
93
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
|
87
94
|
# Escape glob characters in base_dir to avoid unwanted behavior.
|
|
88
|
-
base_dir = base_dir.gsub(/[
|
|
95
|
+
base_dir = base_dir.gsub(/[\\{}\[\]*?]/) do |reserved_glob_character|
|
|
89
96
|
"\\#{reserved_glob_character}"
|
|
90
97
|
end
|
|
91
98
|
|
data/lib/rubocop/target_ruby.rb
CHANGED
|
@@ -4,7 +4,9 @@ module RuboCop
|
|
|
4
4
|
# The kind of Ruby that code inspected by RuboCop is written in.
|
|
5
5
|
# @api private
|
|
6
6
|
class TargetRuby
|
|
7
|
-
KNOWN_RUBIES = [
|
|
7
|
+
KNOWN_RUBIES = [
|
|
8
|
+
2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 4.0, 4.1
|
|
9
|
+
].freeze
|
|
8
10
|
DEFAULT_VERSION = 2.7
|
|
9
11
|
|
|
10
12
|
OBSOLETE_RUBIES = {
|
|
@@ -110,8 +112,17 @@ module RuboCop
|
|
|
110
112
|
end
|
|
111
113
|
|
|
112
114
|
def version_from_gemspec_file(file)
|
|
115
|
+
# When using parser_prism, we need to use a Ruby version that Prism supports (3.3+)
|
|
116
|
+
# for parsing the gemspec file. This doesn't affect the detected Ruby version,
|
|
117
|
+
# it's just for the parsing step.
|
|
118
|
+
ruby_version_for_parsing = if @config.parser_engine == :parser_prism
|
|
119
|
+
3.3
|
|
120
|
+
else
|
|
121
|
+
DEFAULT_VERSION
|
|
122
|
+
end
|
|
123
|
+
|
|
113
124
|
processed_source = ProcessedSource.from_file(
|
|
114
|
-
file,
|
|
125
|
+
file, ruby_version_for_parsing, parser_engine: @config.parser_engine
|
|
115
126
|
)
|
|
116
127
|
return unless processed_source.valid_syntax?
|
|
117
128
|
|
|
@@ -149,21 +160,18 @@ module RuboCop
|
|
|
149
160
|
# The target ruby version may be found in a .ruby-version file.
|
|
150
161
|
# @api private
|
|
151
162
|
class RubyVersionFile < Source
|
|
152
|
-
RUBY_VERSION_FILENAME = '.ruby-version'
|
|
153
|
-
RUBY_VERSION_PATTERN = /\A(?:ruby-)?(?<version>\d+\.\d+)/.freeze
|
|
154
|
-
|
|
155
163
|
def name
|
|
156
|
-
"`#{
|
|
164
|
+
"`#{filename}`"
|
|
157
165
|
end
|
|
158
166
|
|
|
159
167
|
private
|
|
160
168
|
|
|
161
169
|
def filename
|
|
162
|
-
|
|
170
|
+
'.ruby-version'
|
|
163
171
|
end
|
|
164
172
|
|
|
165
173
|
def pattern
|
|
166
|
-
|
|
174
|
+
/\A(?:ruby-)?(?<version>\d+\.\d+)/.freeze
|
|
167
175
|
end
|
|
168
176
|
|
|
169
177
|
def find_version
|
|
@@ -182,21 +190,29 @@ module RuboCop
|
|
|
182
190
|
# starting with `ruby`.
|
|
183
191
|
# @api private
|
|
184
192
|
class ToolVersionsFile < RubyVersionFile
|
|
185
|
-
|
|
186
|
-
TOOL_VERSIONS_PATTERN = /^(?:ruby )(?<version>\d+\.\d+)/.freeze
|
|
193
|
+
private
|
|
187
194
|
|
|
188
|
-
def
|
|
189
|
-
|
|
195
|
+
def filename
|
|
196
|
+
'.tool-versions'
|
|
190
197
|
end
|
|
191
198
|
|
|
199
|
+
def pattern
|
|
200
|
+
/^(?:ruby )(?<version>\d+\.\d+)/.freeze
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# The target ruby version may be found in a mise.toml file, in a line
|
|
205
|
+
# starting with `ruby = "`.
|
|
206
|
+
# @api private
|
|
207
|
+
class MiseTomlFile < RubyVersionFile
|
|
192
208
|
private
|
|
193
209
|
|
|
194
210
|
def filename
|
|
195
|
-
|
|
211
|
+
'mise.toml'
|
|
196
212
|
end
|
|
197
213
|
|
|
198
214
|
def pattern
|
|
199
|
-
|
|
215
|
+
/^ruby = "(?<version>\d+\.\d+)/.freeze
|
|
200
216
|
end
|
|
201
217
|
end
|
|
202
218
|
|
|
@@ -264,6 +280,7 @@ module RuboCop
|
|
|
264
280
|
RuboCopConfig,
|
|
265
281
|
GemspecFile,
|
|
266
282
|
RubyVersionFile,
|
|
283
|
+
MiseTomlFile,
|
|
267
284
|
ToolVersionsFile,
|
|
268
285
|
BundlerLockFile,
|
|
269
286
|
Default
|
data/lib/rubocop/version.rb
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
# This module holds the RuboCop version information.
|
|
5
5
|
module Version
|
|
6
|
-
STRING = '1.
|
|
6
|
+
STRING = '1.87.0'
|
|
7
7
|
|
|
8
8
|
MSG = '%<version>s (using %<parser_version>s, ' \
|
|
9
9
|
'rubocop-ast %<rubocop_ast_version>s, ' \
|
|
10
10
|
'analyzing as Ruby %<target_ruby_version>s, ' \
|
|
11
|
-
'running on %<ruby_engine>s %<ruby_version>s)
|
|
11
|
+
'running on %<ruby_engine>s %<ruby_version>s)' \
|
|
12
|
+
'%<rubydex_indicator>s%<server_mode>s [%<ruby_platform>s]'
|
|
12
13
|
|
|
13
14
|
MINIMUM_PARSABLE_PRISM_VERSION = 3.3
|
|
14
15
|
|
|
@@ -31,6 +32,7 @@ module RuboCop
|
|
|
31
32
|
rubocop_ast_version: RuboCop::AST::Version::STRING,
|
|
32
33
|
target_ruby_version: target_ruby_version,
|
|
33
34
|
ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
|
|
35
|
+
rubydex_indicator: rubydex_indicator(env),
|
|
34
36
|
server_mode: server_mode,
|
|
35
37
|
ruby_platform: RUBY_PLATFORM)
|
|
36
38
|
return verbose_version unless env
|
|
@@ -55,7 +57,7 @@ module RuboCop
|
|
|
55
57
|
|
|
56
58
|
# @api private
|
|
57
59
|
def self.parser_version(target_ruby_version)
|
|
58
|
-
config_path = ConfigFinder.find_config_path(
|
|
60
|
+
config_path = ConfigFinder.find_config_path(PathUtil.pwd)
|
|
59
61
|
yaml = Util.silence_warnings do
|
|
60
62
|
ConfigLoader.load_yaml_configuration(config_path)
|
|
61
63
|
end
|
|
@@ -152,6 +154,22 @@ module RuboCop
|
|
|
152
154
|
STRING.match('\d+\.\d+').to_s
|
|
153
155
|
end
|
|
154
156
|
|
|
157
|
+
# @api private
|
|
158
|
+
def self.rubydex_indicator(env)
|
|
159
|
+
env && rubydex_enabled?(env) && ProjectIndexLoader.available? ? ' +Rubydex' : ''
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# @api private
|
|
163
|
+
def self.rubydex_enabled?(env)
|
|
164
|
+
config_for_pwd(env).for_all_cops['UseProjectIndex']
|
|
165
|
+
rescue StandardError
|
|
166
|
+
# Keep `rubocop -V` usable when the config cannot be loaded (broken YAML,
|
|
167
|
+
# missing `inherit_from` target, etc). It is the first command users run to
|
|
168
|
+
# diagnose a broken setup, so the indicator just hides rather than letting
|
|
169
|
+
# the version banner crash.
|
|
170
|
+
false
|
|
171
|
+
end
|
|
172
|
+
|
|
155
173
|
# @api private
|
|
156
174
|
def self.server_mode
|
|
157
175
|
RuboCop.const_defined?(:Server) && Server.running? ? ' +server' : ''
|