rubocop 1.79.2 → 1.88.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 +259 -90
- data/config/obsoletion.yml +30 -1
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +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 +25 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -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/redundant_let_rubocop_config_new.rb +5 -3
- 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/block_alignment.rb +41 -4
- 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_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -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 -3
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- 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 +4 -4
- 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/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- data/lib/rubocop/cop/lint/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 +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +3 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +36 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +18 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -7
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +12 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +28 -1
- data/lib/rubocop/cop/lint/to_json.rb +12 -16
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +4 -2
- 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 +53 -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 +8 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +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/collection_literal_length.rb +1 -1
- 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 +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +50 -12
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +39 -32
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- 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/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +5 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +14 -19
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +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/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +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_slice.rb +16 -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 +58 -18
- 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 +106 -12
- 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 +14 -3
- 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 +27 -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 +41 -8
- 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_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/team.rb +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 +38 -14
- 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 +8 -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
|
@@ -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,
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
|
|
10
10
|
# @api private
|
|
11
11
|
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
|
12
|
-
Enabled Reference References].freeze
|
|
12
|
+
Enabled Reference References Safe SafeAutoCorrect].freeze
|
|
13
13
|
# @api private
|
|
14
14
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
|
15
15
|
VersionAdded VersionChanged VersionRemoved
|
|
@@ -35,8 +35,8 @@ module RuboCop
|
|
|
35
35
|
# `false` is the same as `disabled` for backward compatibility.
|
|
36
36
|
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
37
37
|
|
|
38
|
-
# When LSP is enabled, it is considered as editing
|
|
39
|
-
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
38
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
39
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
40
40
|
return false if contextual_autocorrect? && LSP.enabled?
|
|
41
41
|
|
|
42
42
|
# :safe_autocorrect is a derived option based on several command-line
|
|
@@ -50,7 +50,8 @@ module RuboCop
|
|
|
50
50
|
|
|
51
51
|
def disable_offense(offense_range)
|
|
52
52
|
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
|
53
|
-
|
|
53
|
+
offense_range.overlaps?(range) &&
|
|
54
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
if unbreakable_range
|
|
@@ -90,11 +91,13 @@ module RuboCop
|
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
def line_with_eol_comment_too_long?(range)
|
|
94
|
+
return false unless max_line_length
|
|
95
|
+
|
|
93
96
|
(range.source_line + eol_comment).length > max_line_length
|
|
94
97
|
end
|
|
95
98
|
|
|
96
99
|
def surrounding_heredoc?(node)
|
|
97
|
-
node.
|
|
100
|
+
node.any_str_type? && node.heredoc?
|
|
98
101
|
end
|
|
99
102
|
|
|
100
103
|
def heredoc_range(node)
|
|
@@ -106,7 +109,7 @@ module RuboCop
|
|
|
106
109
|
end
|
|
107
110
|
|
|
108
111
|
def string_continuation?(node)
|
|
109
|
-
node.
|
|
112
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
110
113
|
end
|
|
111
114
|
|
|
112
115
|
def multiline_string?(node)
|
|
@@ -133,6 +136,8 @@ module RuboCop
|
|
|
133
136
|
end
|
|
134
137
|
|
|
135
138
|
def max_line_length
|
|
139
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
|
140
|
+
|
|
136
141
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
|
137
142
|
end
|
|
138
143
|
|
data/lib/rubocop/cop/base.rb
CHANGED
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
include AutocorrectLogic
|
|
42
42
|
|
|
43
43
|
attr_reader :config, :processed_source
|
|
44
|
+
attr_accessor :project_index
|
|
44
45
|
|
|
45
46
|
# Reports of an investigation.
|
|
46
47
|
# Immutable
|
|
@@ -306,7 +307,9 @@ module RuboCop
|
|
|
306
307
|
def ready
|
|
307
308
|
return self if self.class.support_multiple_source?
|
|
308
309
|
|
|
309
|
-
self.class.new(@config, @options)
|
|
310
|
+
self.class.new(@config, @options).tap do |fresh|
|
|
311
|
+
fresh.project_index = @project_index
|
|
312
|
+
end
|
|
310
313
|
end
|
|
311
314
|
|
|
312
315
|
### Reserved for Cop::Cop
|
|
@@ -416,7 +419,10 @@ module RuboCop
|
|
|
416
419
|
### Actually private methods
|
|
417
420
|
|
|
418
421
|
def reset_investigation
|
|
419
|
-
@currently_disabled_lines =
|
|
422
|
+
@currently_disabled_lines = nil
|
|
423
|
+
@current_offenses = nil
|
|
424
|
+
@processed_source = nil
|
|
425
|
+
@current_corrector = nil
|
|
420
426
|
end
|
|
421
427
|
|
|
422
428
|
# @return [Symbol, Corrector] offense status
|
|
@@ -492,8 +498,23 @@ module RuboCop
|
|
|
492
498
|
patterns = cop_config[parameter]
|
|
493
499
|
return default_result unless patterns
|
|
494
500
|
|
|
495
|
-
|
|
496
|
-
|
|
501
|
+
file_patterns = FilePatterns.from(patterns)
|
|
502
|
+
relative_file_path = config.path_relative_to_config(file)
|
|
503
|
+
return true if file_patterns.match?(relative_file_path)
|
|
504
|
+
|
|
505
|
+
if parameter == 'Include' && !relative_file_path.start_with?('..')
|
|
506
|
+
matches_absolute_include_pattern?(patterns, file)
|
|
507
|
+
else
|
|
508
|
+
file_patterns.match?(file)
|
|
509
|
+
end
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
def matches_absolute_include_pattern?(patterns, file)
|
|
513
|
+
absolute_file_path = absolute?(file) ? file : File.expand_path(file)
|
|
514
|
+
patterns.any? do |pattern|
|
|
515
|
+
(absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
|
|
516
|
+
match_path?(pattern, absolute_file_path)
|
|
517
|
+
end
|
|
497
518
|
end
|
|
498
519
|
|
|
499
520
|
def enabled_line?(line_number)
|
|
@@ -128,8 +128,8 @@ module RuboCop
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def ignored_gem?(node)
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
allowed_gems = Array(cop_config['AllowedGems'])
|
|
132
|
+
allowed_gems.include?(node.first_argument.value)
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def checked_options_present?(node)
|
|
@@ -7,48 +7,48 @@ module RuboCop
|
|
|
7
7
|
# ref, or tag) are either required or forbidden.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: required (default)
|
|
10
|
-
#
|
|
11
|
-
#
|
|
10
|
+
# # bad
|
|
11
|
+
# gem 'rubocop'
|
|
12
12
|
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
13
|
+
# # good
|
|
14
|
+
# gem 'rubocop', '~> 1.12'
|
|
15
15
|
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
16
|
+
# # good
|
|
17
|
+
# gem 'rubocop', '>= 1.10.0'
|
|
18
18
|
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
19
|
+
# # good
|
|
20
|
+
# gem 'rubocop', '>= 1.5.0', '< 1.10.0'
|
|
21
21
|
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
22
|
+
# # good
|
|
23
|
+
# gem 'rubocop', branch: 'feature-branch'
|
|
24
24
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
25
|
+
# # good
|
|
26
|
+
# gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
|
|
27
27
|
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
28
|
+
# # good
|
|
29
|
+
# gem 'rubocop', tag: 'v1.17.0'
|
|
30
30
|
#
|
|
31
31
|
# @example EnforcedStyle: forbidden
|
|
32
|
-
#
|
|
33
|
-
#
|
|
32
|
+
# # good
|
|
33
|
+
# gem 'rubocop'
|
|
34
34
|
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
35
|
+
# # bad
|
|
36
|
+
# gem 'rubocop', '~> 1.12'
|
|
37
37
|
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
38
|
+
# # bad
|
|
39
|
+
# gem 'rubocop', '>= 1.10.0'
|
|
40
40
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
41
|
+
# # bad
|
|
42
|
+
# gem 'rubocop', '>= 1.5.0', '< 1.10.0'
|
|
43
43
|
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
44
|
+
# # bad
|
|
45
|
+
# gem 'rubocop', branch: 'feature-branch'
|
|
46
46
|
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
47
|
+
# # bad
|
|
48
|
+
# gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
|
|
49
49
|
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
50
|
+
# # bad
|
|
51
|
+
# gem 'rubocop', tag: 'v1.17.0'
|
|
52
52
|
#
|
|
53
53
|
class GemVersion < Base
|
|
54
54
|
include ConfigurableEnforcedStyle
|
|
@@ -43,8 +43,7 @@ module RuboCop
|
|
|
43
43
|
def on_new_investigation
|
|
44
44
|
return if processed_source.blank?
|
|
45
45
|
|
|
46
|
-
gem_declarations(processed_source.ast)
|
|
47
|
-
.each_cons(2) do |previous, current|
|
|
46
|
+
gem_declarations(processed_source.ast).each_cons(2) do |previous, current|
|
|
48
47
|
next unless consecutive_lines?(previous, current)
|
|
49
48
|
next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
|
|
50
49
|
|
|
@@ -16,6 +16,9 @@ module RuboCop
|
|
|
16
16
|
return unless node
|
|
17
17
|
|
|
18
18
|
@processed_source = processed_source
|
|
19
|
+
# Disable autocorrection for tabs as it requires special handling
|
|
20
|
+
return if using_tabs?
|
|
21
|
+
|
|
19
22
|
expr = node.respond_to?(:loc) ? node.source_range : node
|
|
20
23
|
return if block_comment_within?(expr)
|
|
21
24
|
|
|
@@ -29,10 +32,14 @@ module RuboCop
|
|
|
29
32
|
def align_end(corrector, processed_source, node, align_to)
|
|
30
33
|
@processed_source = processed_source
|
|
31
34
|
whitespace = whitespace_range(node)
|
|
32
|
-
return false unless whitespace.source.strip.empty?
|
|
33
|
-
|
|
34
35
|
column = alignment_column(align_to)
|
|
35
|
-
|
|
36
|
+
indentation = indentation_string(column)
|
|
37
|
+
|
|
38
|
+
if whitespace.source.strip.empty?
|
|
39
|
+
corrector.replace(whitespace, indentation)
|
|
40
|
+
else
|
|
41
|
+
corrector.insert_after(whitespace, "\n#{indentation}")
|
|
42
|
+
end
|
|
36
43
|
end
|
|
37
44
|
|
|
38
45
|
private
|
|
@@ -54,7 +61,7 @@ module RuboCop
|
|
|
54
61
|
def inside_string_ranges(node)
|
|
55
62
|
return [] unless node.is_a?(Parser::AST::Node)
|
|
56
63
|
|
|
57
|
-
node.each_node(:
|
|
64
|
+
node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
|
|
58
65
|
end
|
|
59
66
|
|
|
60
67
|
def inside_string_range(node)
|
|
@@ -73,9 +80,7 @@ module RuboCop
|
|
|
73
80
|
# nil.
|
|
74
81
|
# - The source map of `__FILE__` responds to neither :begin nor :end.
|
|
75
82
|
def delimited_string_literal?(node)
|
|
76
|
-
loc
|
|
77
|
-
|
|
78
|
-
loc.respond_to?(:begin) && loc.begin && loc.respond_to?(:end) && loc.end
|
|
83
|
+
node.loc?(:begin) && node.loc?(:end)
|
|
79
84
|
end
|
|
80
85
|
|
|
81
86
|
def block_comment_within?(expr)
|
|
@@ -119,6 +124,20 @@ module RuboCop
|
|
|
119
124
|
align_to.column
|
|
120
125
|
end
|
|
121
126
|
end
|
|
127
|
+
|
|
128
|
+
def indentation_string(column)
|
|
129
|
+
if using_tabs?
|
|
130
|
+
"\t" * column
|
|
131
|
+
else
|
|
132
|
+
' ' * column
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def using_tabs?
|
|
137
|
+
config = processed_source.config
|
|
138
|
+
indentation_style = config.for_cop('Layout/IndentationStyle')['EnforcedStyle']
|
|
139
|
+
indentation_style == 'tabs'
|
|
140
|
+
end
|
|
122
141
|
end
|
|
123
142
|
end
|
|
124
143
|
end
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
class ForToEachCorrector
|
|
7
7
|
extend NodePattern::Macros
|
|
8
8
|
|
|
9
|
-
CORRECTION = '%<collection>s
|
|
9
|
+
CORRECTION = '%<collection>s%<dot>seach do |%<argument>s|'
|
|
10
10
|
|
|
11
11
|
def initialize(for_node)
|
|
12
12
|
@for_node = for_node
|
|
@@ -25,7 +25,12 @@ module RuboCop
|
|
|
25
25
|
attr_reader :for_node, :variable_node, :collection_node
|
|
26
26
|
|
|
27
27
|
def correction
|
|
28
|
-
format(
|
|
28
|
+
format(
|
|
29
|
+
CORRECTION,
|
|
30
|
+
collection: collection_source,
|
|
31
|
+
dot: collection_node.csend_type? ? '&.' : '.',
|
|
32
|
+
argument: variable_node.source
|
|
33
|
+
)
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
def collection_source
|
|
@@ -59,11 +59,7 @@ module RuboCop
|
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def content_if_comment_present(corrector, node)
|
|
62
|
-
|
|
63
|
-
children(node).last.source_range,
|
|
64
|
-
side: :right
|
|
65
|
-
).end.resize(1)
|
|
66
|
-
if range.source == '#'
|
|
62
|
+
if processed_source.comment_at_line(children(node).last.last_line)
|
|
67
63
|
select_content_to_be_inserted_after_last_element(corrector, node)
|
|
68
64
|
else
|
|
69
65
|
node.loc.end.source
|
|
@@ -13,8 +13,7 @@ module RuboCop
|
|
|
13
13
|
buffer = node.source_range.source_buffer
|
|
14
14
|
corrector.remove(range_with_surrounding_space(range: node.loc.begin, buffer: buffer,
|
|
15
15
|
side: :right, whitespace: true))
|
|
16
|
-
corrector
|
|
17
|
-
side: :left))
|
|
16
|
+
remove_close_paren(corrector, node, buffer)
|
|
18
17
|
handle_orphaned_comma(corrector, node)
|
|
19
18
|
|
|
20
19
|
return unless ternary_condition?(node) && next_char_is_question_mark?(node)
|
|
@@ -24,6 +23,38 @@ module RuboCop
|
|
|
24
23
|
|
|
25
24
|
private
|
|
26
25
|
|
|
26
|
+
# When the line above `)` ends with a comment and a chained call follows `)`,
|
|
27
|
+
# crossing the newline would pull the chain into the comment. Preserve the newline.
|
|
28
|
+
def remove_close_paren(corrector, node, buffer)
|
|
29
|
+
newlines = !comment_above_close_paren_swallows_chain?(node, buffer)
|
|
30
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.end, buffer: buffer,
|
|
31
|
+
side: :left, newlines: newlines))
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def comment_above_close_paren_swallows_chain?(node, buffer)
|
|
35
|
+
last_child = node.children.last
|
|
36
|
+
return false unless last_child
|
|
37
|
+
|
|
38
|
+
body_end = last_child.source_range.end_pos
|
|
39
|
+
close_paren_begin = node.loc.end.begin_pos
|
|
40
|
+
return false if body_end >= close_paren_begin
|
|
41
|
+
|
|
42
|
+
source_between = buffer.source[body_end...close_paren_begin]
|
|
43
|
+
return false unless source_between.match?(/#[^\n]*\n/)
|
|
44
|
+
|
|
45
|
+
chained_after_close_paren?(node)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def chained_after_close_paren?(node)
|
|
49
|
+
close_paren = node.loc.end
|
|
50
|
+
line_text = close_paren.source_line
|
|
51
|
+
after_paren = line_text[(close_paren.column + 1)..]
|
|
52
|
+
return false if after_paren.nil?
|
|
53
|
+
|
|
54
|
+
trimmed = after_paren.lstrip
|
|
55
|
+
!trimmed.empty? && !trimmed.start_with?('#')
|
|
56
|
+
end
|
|
57
|
+
|
|
27
58
|
def ternary_condition?(node)
|
|
28
59
|
node.parent&.if_type? && node.parent.ternary?
|
|
29
60
|
end
|
|
@@ -97,8 +97,8 @@ module RuboCop
|
|
|
97
97
|
if delimiters.first != delimiters.last
|
|
98
98
|
# With different delimiters (eg. `[]`, `()`), if there are the same
|
|
99
99
|
# number of each, escaping is not necessary
|
|
100
|
-
delimiter_counts = delimiters.
|
|
101
|
-
|
|
100
|
+
delimiter_counts = delimiters.to_h do |delimiter|
|
|
101
|
+
[delimiter, content.count(delimiter)]
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
return content if delimiter_counts[delimiters.first] == delimiter_counts[delimiters.last]
|