rubocop 1.53.0 → 1.90.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 +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +949 -185
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +43 -4
- data/exe/rubocop +2 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +28 -7
- data/lib/rubocop/cli/command/auto_generate_config.rb +63 -18
- data/lib/rubocop/cli/command/execute_runner.rb +35 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +26 -4
- data/lib/rubocop/cli/command/show_docs_url.rb +5 -9
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +60 -16
- data/lib/rubocop/comment_config/directive_range.rb +32 -0
- data/lib/rubocop/comment_config/disable_next.rb +97 -0
- data/lib/rubocop/comment_config.rb +123 -49
- data/lib/rubocop/config.rb +180 -35
- data/lib/rubocop/config_finder.rb +15 -5
- data/lib/rubocop/config_loader.rb +83 -59
- data/lib/rubocop/config_loader_resolver.rb +65 -25
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +76 -21
- data/lib/rubocop/cop/autocorrect_logic.rb +70 -25
- data/lib/rubocop/cop/badge.rb +8 -0
- data/lib/rubocop/cop/base.rb +151 -30
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +6 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +32 -33
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +11 -4
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +80 -22
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +5 -9
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +14 -5
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +37 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +31 -5
- data/lib/rubocop/cop/exclude_limit.rb +32 -6
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +51 -19
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +11 -4
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +15 -10
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +10 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +7 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +132 -39
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +130 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -9
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +10 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -11
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +89 -17
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/class_structure.rb +171 -43
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -3
- data/lib/rubocop/cop/layout/condition_position.rb +13 -7
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +3 -7
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +11 -11
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +66 -15
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +75 -10
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +71 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +24 -6
- data/lib/rubocop/cop/layout/extra_spacing.rb +110 -14
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +59 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +20 -11
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -22
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +26 -26
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -12
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +6 -5
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +38 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +168 -22
- data/lib/rubocop/cop/layout/leading_comment_space.rb +111 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +9 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +271 -37
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +3 -2
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +252 -32
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +117 -42
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +17 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -4
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +94 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +8 -41
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +48 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +73 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +8 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +89 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +20 -10
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +49 -17
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +227 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +166 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +53 -9
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
- data/lib/rubocop/cop/lint/duplicate_methods.rb +504 -49
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +19 -2
- data/lib/rubocop/cop/lint/empty_block.rb +5 -5
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +33 -57
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +9 -4
- data/lib/rubocop/cop/lint/ensure_return.rb +20 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +28 -25
- data/lib/rubocop/cop/lint/float_comparison.rb +59 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +22 -12
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -9
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +30 -6
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +133 -12
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +95 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +61 -30
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +33 -3
- data/lib/rubocop/cop/lint/mixed_case_range.rb +16 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +8 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +22 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +10 -10
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +28 -15
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +104 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +18 -6
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +9 -24
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +126 -30
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +57 -21
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +206 -15
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +20 -10
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +10 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +9 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -8
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +6 -12
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +55 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +113 -41
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +7 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +103 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +40 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +78 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +29 -13
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +26 -4
- data/lib/rubocop/cop/lint/syntax.rb +35 -5
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +77 -9
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +114 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +68 -15
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +28 -2
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +37 -12
- data/lib/rubocop/cop/lint/useless_assignment.rb +92 -34
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +3 -4
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +14 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +17 -29
- data/lib/rubocop/cop/lint/useless_times.rb +24 -3
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +127 -29
- data/lib/rubocop/cop/lint.rb +178 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +9 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +43 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +8 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +17 -8
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +12 -6
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +20 -4
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +46 -18
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +47 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +22 -14
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +11 -6
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +32 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +33 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +49 -40
- data/lib/rubocop/cop/mixin/hash_subset.rb +210 -0
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +61 -14
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -12
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +120 -39
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -6
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +57 -15
- data/lib/rubocop/cop/mixin/string_help.rb +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +27 -10
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +35 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +9 -10
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +21 -7
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -19
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +232 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +23 -17
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +5 -4
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +56 -14
- data/lib/rubocop/cop/registry.rb +225 -64
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +184 -33
- data/lib/rubocop/cop/style/accessor_grouping.rb +56 -11
- data/lib/rubocop/cop/style/alias.rb +26 -12
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +3 -2
- data/lib/rubocop/cop/style/arguments_forwarding.rb +487 -63
- data/lib/rubocop/cop/style/array_first_last.rb +90 -0
- data/lib/rubocop/cop/style/array_intersect.rb +148 -41
- 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/auto_resource_cleanup.rb +21 -14
- 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/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +106 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +89 -53
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +16 -21
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +139 -22
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +29 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +53 -23
- data/lib/rubocop/cop/style/collection_methods.rb +4 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +29 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +11 -5
- data/lib/rubocop/cop/style/conditional_assignment.rb +85 -56
- data/lib/rubocop/cop/style/constant_visibility.rb +21 -23
- data/lib/rubocop/cop/style/copyright.rb +49 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +12 -1
- data/lib/rubocop/cop/style/date_time.rb +8 -7
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -7
- data/lib/rubocop/cop/style/dig_chain.rb +94 -0
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +171 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +77 -13
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +76 -29
- data/lib/rubocop/cop/style/documentation_method.rb +24 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +12 -16
- data/lib/rubocop/cop/style/each_with_object.rb +5 -4
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +16 -2
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +5 -14
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +43 -25
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +164 -24
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +13 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +35 -8
- data/lib/rubocop/cop/style/file_null.rb +91 -0
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +23 -21
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +7 -2
- data/lib/rubocop/cop/style/format_string.rb +47 -13
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +6 -5
- data/lib/rubocop/cop/style/guard_clause.rb +67 -21
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +38 -13
- data/lib/rubocop/cop/style/hash_each_methods.rb +109 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +96 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +62 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -22
- data/lib/rubocop/cop/style/if_unless_modifier.rb +72 -47
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +12 -9
- data/lib/rubocop/cop/style/if_with_semicolon.rb +75 -11
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +71 -9
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +71 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +16 -5
- data/lib/rubocop/cop/style/lambda_call.rb +33 -11
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +93 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +28 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +77 -28
- 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 +38 -9
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +37 -15
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +8 -6
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +75 -12
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +9 -3
- data/lib/rubocop/cop/style/multiline_method_signature.rb +18 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +6 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +63 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +117 -19
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +6 -5
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +12 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +3 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +13 -5
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +50 -16
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +40 -8
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +69 -48
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +5 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +5 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +37 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +21 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +53 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +98 -25
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +31 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +88 -5
- data/lib/rubocop/cop/style/redundant_each.rb +11 -9
- data/lib/rubocop/cop/style/redundant_exception.rb +39 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +5 -13
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +10 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +62 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +92 -72
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +203 -84
- data/lib/rubocop/cop/style/redundant_percent_q.rb +6 -4
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +33 -4
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -24
- data/lib/rubocop/cop/style/redundant_return.rb +20 -8
- data/lib/rubocop/cop/style/redundant_self.rb +43 -22
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +19 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +17 -16
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +4 -5
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +20 -7
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +67 -11
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +176 -66
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +14 -10
- 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 +62 -26
- data/lib/rubocop/cop/style/self_assignment.rb +13 -19
- data/lib/rubocop/cop/style/semicolon.rb +53 -17
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +3 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +90 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +16 -12
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +103 -91
- data/lib/rubocop/cop/style/special_global_vars.rb +8 -4
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +34 -17
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +25 -3
- data/lib/rubocop/cop/style/super_arguments.rb +220 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +86 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +37 -5
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +21 -22
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +7 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -7
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +38 -27
- data/lib/rubocop/cop/style.rb +312 -0
- data/lib/rubocop/cop/team.rb +188 -46
- data/lib/rubocop/cop/util.rb +23 -13
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- data/lib/rubocop/cop/variable_force/branch.rb +31 -7
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +32 -10
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +137 -63
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +135 -19
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +8 -9
- data/lib/rubocop/formatter/disabled_config_formatter.rb +62 -22
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +10 -4
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -17
- data/lib/rubocop/formatter/json_formatter.rb +11 -7
- data/lib/rubocop/formatter/junit_formatter.rb +94 -30
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +14 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +11 -10
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lockfile.rb +76 -7
- data/lib/rubocop/lsp/diagnostic.rb +170 -0
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +163 -56
- data/lib/rubocop/lsp/runtime.rb +47 -44
- data/lib/rubocop/lsp/server.rb +18 -6
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +96 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +44 -14
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +88 -32
- data/lib/rubocop/path_util.rb +33 -11
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +7 -5
- data/lib/rubocop/remote_config.rb +15 -9
- data/lib/rubocop/result_cache.rb +85 -61
- data/lib/rubocop/rspec/cop_helper.rb +28 -2
- data/lib/rubocop/rspec/expect_offense.rb +29 -12
- data/lib/rubocop/rspec/shared_contexts.rb +165 -24
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +273 -99
- data/lib/rubocop/server/cache.rb +76 -42
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +4 -4
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +13 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +111 -86
- data/lib/rubocop/target_ruby.rb +131 -89
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/version.rb +84 -10
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +33 -648
- data/lib/ruby_lsp/rubocop/addon.rb +89 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +169 -50
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -100
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
data/lib/rubocop/config.rb
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'pathname'
|
|
4
|
-
|
|
5
3
|
# FIXME: Moving Rails department code to RuboCop Rails will remove
|
|
6
4
|
# the following rubocop:disable comment.
|
|
7
|
-
# rubocop:disable Metrics/ClassLength
|
|
5
|
+
# rubocop:disable-next Metrics/ClassLength
|
|
8
6
|
module RuboCop
|
|
9
7
|
# This class represents the configuration of the RuboCop application
|
|
10
8
|
# and all its cops. A Config is associated with a YAML configuration
|
|
@@ -14,10 +12,11 @@ module RuboCop
|
|
|
14
12
|
class Config
|
|
15
13
|
include PathUtil
|
|
16
14
|
include FileFinder
|
|
17
|
-
extend
|
|
15
|
+
extend SimpleForwardable
|
|
18
16
|
|
|
19
17
|
CopConfig = Struct.new(:name, :metadata)
|
|
20
18
|
|
|
19
|
+
EMPTY_CONFIG = {}.freeze
|
|
21
20
|
DEFAULT_RAILS_VERSION = 5.0
|
|
22
21
|
attr_reader :loaded_path
|
|
23
22
|
|
|
@@ -28,14 +27,43 @@ module RuboCop
|
|
|
28
27
|
config
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
# rubocop:disable Metrics/AbcSize
|
|
30
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
|
|
32
31
|
def initialize(hash = RuboCop::ConfigLoader.default_configuration, loaded_path = nil)
|
|
33
32
|
@loaded_path = loaded_path
|
|
34
33
|
@for_cop = Hash.new do |h, cop|
|
|
35
34
|
cop_name = cop.respond_to?(:cop_name) ? cop.cop_name : cop
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
|
|
36
|
+
if ConfigObsoletion.deprecated_cop_name?(cop)
|
|
37
|
+
# Since a deprecated cop will no longer have a qualified name (as the badge is no
|
|
38
|
+
# longer valid), and since we do not want to automatically enable the cop, we just
|
|
39
|
+
# set the configuration to an empty hash if it is unset.
|
|
40
|
+
# This is necessary to allow a renamed cop have its old configuration merged in
|
|
41
|
+
# before being used (which is necessary to allow it to be disabled via config).
|
|
42
|
+
cop_options = self[cop_name].dup || {}
|
|
43
|
+
else
|
|
44
|
+
qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path, warn: false)
|
|
45
|
+
cop_options = self[qualified_cop_name].dup || {}
|
|
46
|
+
cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
|
|
47
|
+
|
|
48
|
+
# If the cop has deprecated names (ie. it has been renamed), it is possible that
|
|
49
|
+
# users will still have old configuration for the cop's old name. In this case,
|
|
50
|
+
# if `ConfigObsoletion` is configured to warn rather than error (and therefore
|
|
51
|
+
# RuboCop runs), we want to respect the old configuration, so merge it in.
|
|
52
|
+
#
|
|
53
|
+
# NOTE: If there is configuration for both the cop and a deprecated names, the old
|
|
54
|
+
# configuration will be merged on top of the new configuration!
|
|
55
|
+
ConfigObsoletion.deprecated_names_for(cop).each do |deprecated_cop_name|
|
|
56
|
+
deprecated_config = @for_cop[deprecated_cop_name]
|
|
57
|
+
next if deprecated_config.empty?
|
|
58
|
+
|
|
59
|
+
warn Rainbow(<<~WARNING).yellow
|
|
60
|
+
Warning: Using `#{deprecated_cop_name}` configuration in #{loaded_path} for `#{cop}`.
|
|
61
|
+
WARNING
|
|
62
|
+
|
|
63
|
+
cop_options.merge!(@for_cop[deprecated_cop_name])
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
39
67
|
h[cop] = h[cop_name] = cop_options
|
|
40
68
|
end
|
|
41
69
|
@hash = hash
|
|
@@ -44,7 +72,10 @@ module RuboCop
|
|
|
44
72
|
@badge_config_cache = {}.compare_by_identity
|
|
45
73
|
@clusivity_config_exists_cache = {}
|
|
46
74
|
end
|
|
47
|
-
|
|
75
|
+
|
|
76
|
+
def loaded_plugins
|
|
77
|
+
@loaded_plugins ||= ConfigLoader.loaded_plugins
|
|
78
|
+
end
|
|
48
79
|
|
|
49
80
|
def loaded_features
|
|
50
81
|
@loaded_features ||= ConfigLoader.loaded_features
|
|
@@ -82,10 +113,7 @@ module RuboCop
|
|
|
82
113
|
|
|
83
114
|
def make_excludes_absolute
|
|
84
115
|
each_key do |key|
|
|
85
|
-
|
|
86
|
-
next unless self[key]['Exclude']
|
|
87
|
-
|
|
88
|
-
self[key]['Exclude'].map! do |exclude_elem|
|
|
116
|
+
dig(key, 'Exclude')&.map! do |exclude_elem|
|
|
89
117
|
if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
|
|
90
118
|
File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem))
|
|
91
119
|
else
|
|
@@ -125,6 +153,13 @@ module RuboCop
|
|
|
125
153
|
@for_cop[cop]
|
|
126
154
|
end
|
|
127
155
|
|
|
156
|
+
# @return [Config, Hash] for the given cop / cop name.
|
|
157
|
+
# If the given cop is enabled, returns its configuration hash.
|
|
158
|
+
# Otherwise, returns an empty hash.
|
|
159
|
+
def for_enabled_cop(cop)
|
|
160
|
+
cop_enabled?(cop) ? for_cop(cop) : EMPTY_CONFIG
|
|
161
|
+
end
|
|
162
|
+
|
|
128
163
|
# @return [Config] for the given cop merged with that of its department (if any)
|
|
129
164
|
# Note: the 'Enabled' attribute is same as that returned by `for_cop`
|
|
130
165
|
def for_badge(badge)
|
|
@@ -132,7 +167,11 @@ module RuboCop
|
|
|
132
167
|
department_config = self[badge.department_name]
|
|
133
168
|
cop_config = for_cop(badge.to_s)
|
|
134
169
|
if department_config
|
|
135
|
-
department_config.merge(cop_config)
|
|
170
|
+
merged_config = department_config.merge(cop_config)
|
|
171
|
+
if department_config['Exclude'] && cop_config['Exclude']
|
|
172
|
+
merged_config['Exclude'] = department_config['Exclude'] | cop_config['Exclude']
|
|
173
|
+
end
|
|
174
|
+
merged_config
|
|
136
175
|
else
|
|
137
176
|
cop_config
|
|
138
177
|
end
|
|
@@ -161,6 +200,10 @@ module RuboCop
|
|
|
161
200
|
@for_all_cops ||= self['AllCops'] || {}
|
|
162
201
|
end
|
|
163
202
|
|
|
203
|
+
def cop_enabled?(name)
|
|
204
|
+
!!for_cop(name)['Enabled']
|
|
205
|
+
end
|
|
206
|
+
|
|
164
207
|
def disabled_new_cops?
|
|
165
208
|
for_all_cops['NewCops'] == 'disable'
|
|
166
209
|
end
|
|
@@ -169,10 +212,31 @@ module RuboCop
|
|
|
169
212
|
for_all_cops['NewCops'] == 'enable'
|
|
170
213
|
end
|
|
171
214
|
|
|
215
|
+
# Whether the given pending cop should be enabled, based on the `NewCops` setting of
|
|
216
|
+
# its department (if any) or of `AllCops`. A department may set `NewCops` to `enable`,
|
|
217
|
+
# `disable`, `pending`, or a version, in which case pending cops added in that version
|
|
218
|
+
# or earlier are enabled.
|
|
219
|
+
def enabled_new_cop?(qualified_cop_name)
|
|
220
|
+
setting = new_cops_setting_for(qualified_cop_name)
|
|
221
|
+
|
|
222
|
+
case setting.to_s
|
|
223
|
+
when 'enable' then true
|
|
224
|
+
when '', 'pending', 'disable' then false
|
|
225
|
+
else new_cops_version_covers?(setting, qualified_cop_name)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
172
229
|
def active_support_extensions_enabled?
|
|
173
230
|
for_all_cops['ActiveSupportExtensionsEnabled']
|
|
174
231
|
end
|
|
175
232
|
|
|
233
|
+
def string_literals_frozen_by_default?
|
|
234
|
+
for_all_cops['StringLiteralsFrozenByDefault']
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Returns true if the file matches any include pattern. If a block is given, the block is called
|
|
238
|
+
# to determine if the pattern is relevant (true returned by the block) or should be skipped
|
|
239
|
+
# (false returned).
|
|
176
240
|
def file_to_include?(file)
|
|
177
241
|
relative_file_path = path_relative_to_config(file)
|
|
178
242
|
|
|
@@ -184,11 +248,9 @@ module RuboCop
|
|
|
184
248
|
absolute_file_path = File.expand_path(file)
|
|
185
249
|
|
|
186
250
|
patterns_to_include.any? do |pattern|
|
|
187
|
-
if block_given?
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
match_path?(pattern, relative_file_path) || match_path?(pattern, absolute_file_path)
|
|
191
|
-
end
|
|
251
|
+
next if block_given? && !yield(pattern)
|
|
252
|
+
|
|
253
|
+
match_relative_or_absolute_path?(pattern, relative_file_path, absolute_file_path)
|
|
192
254
|
end
|
|
193
255
|
end
|
|
194
256
|
|
|
@@ -198,10 +260,7 @@ module RuboCop
|
|
|
198
260
|
# `bundler-console` conveys `Bundler::Console`).
|
|
199
261
|
return true if File.extname(file) == '.gemspec'
|
|
200
262
|
|
|
201
|
-
file_to_include?(file)
|
|
202
|
-
/[A-Z]/.match?(pattern.to_s) &&
|
|
203
|
-
(match_path?(pattern, relative_path) || match_path?(pattern, absolute_path))
|
|
204
|
-
end
|
|
263
|
+
file_to_include?(file) { |pattern| /[A-Z]/.match?(pattern.to_s) }
|
|
205
264
|
end
|
|
206
265
|
|
|
207
266
|
# Returns true if there's a chance that an Include pattern matches hidden
|
|
@@ -242,10 +301,14 @@ module RuboCop
|
|
|
242
301
|
loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
|
|
243
302
|
File.expand_path(File.dirname(loaded_path))
|
|
244
303
|
else
|
|
245
|
-
|
|
304
|
+
PathUtil.pwd
|
|
246
305
|
end
|
|
247
306
|
end
|
|
248
307
|
|
|
308
|
+
def parser_engine
|
|
309
|
+
@parser_engine ||= for_all_cops.fetch('ParserEngine', :default).to_sym
|
|
310
|
+
end
|
|
311
|
+
|
|
249
312
|
def target_rails_version
|
|
250
313
|
@target_rails_version ||=
|
|
251
314
|
if for_all_cops['TargetRailsVersion']
|
|
@@ -261,6 +324,7 @@ module RuboCop
|
|
|
261
324
|
PathUtil.smart_path(@loaded_path)
|
|
262
325
|
end
|
|
263
326
|
|
|
327
|
+
# @return [String, nil]
|
|
264
328
|
def bundler_lock_file_path
|
|
265
329
|
return nil unless loaded_path
|
|
266
330
|
|
|
@@ -279,32 +343,76 @@ module RuboCop
|
|
|
279
343
|
|
|
280
344
|
cop_metadata = self[qualified_cop_name]
|
|
281
345
|
next unless cop_metadata['Enabled'] == 'pending'
|
|
346
|
+
next if new_cops_covered?(qualified_cop_name)
|
|
282
347
|
|
|
283
348
|
pending_cops << CopConfig.new(qualified_cop_name, cop_metadata)
|
|
284
349
|
end
|
|
285
350
|
end
|
|
286
351
|
|
|
352
|
+
# Returns target's locked gem versions (i.e. from Gemfile.lock or gems.locked)
|
|
353
|
+
# @returns [Hash{String => Gem::Version}] The locked gem versions, keyed by the gems' names.
|
|
354
|
+
def gem_versions_in_target
|
|
355
|
+
@gem_versions_in_target ||= read_gem_versions_from_target_lockfile
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
# Returns the names of the target's gems that are sourced from a local path
|
|
359
|
+
# (i.e. `path:` dependencies and the project's own gem when the `Gemfile`
|
|
360
|
+
# uses `gemspec`), whose code therefore lives in the project itself.
|
|
361
|
+
# @returns [Array<String>, nil] The gem names, or nil without a lockfile.
|
|
362
|
+
def path_sourced_gems_in_target
|
|
363
|
+
@path_sourced_gems_in_target ||= read_path_sourced_gems_from_target_lockfile
|
|
364
|
+
end
|
|
365
|
+
|
|
287
366
|
def inspect # :nodoc:
|
|
288
367
|
"#<#{self.class.name}:#{object_id} @loaded_path=#{loaded_path}>"
|
|
289
368
|
end
|
|
290
369
|
|
|
291
370
|
private
|
|
292
371
|
|
|
372
|
+
def match_relative_or_absolute_path?(pattern, relative_file_path, absolute_file_path)
|
|
373
|
+
should_use_absolute_path = absolute?(pattern.to_s) || pattern.to_s.start_with?('..') ||
|
|
374
|
+
relative_file_path.start_with?('..')
|
|
375
|
+
match_path?(pattern, should_use_absolute_path ? absolute_file_path : relative_file_path)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# @return [Float, nil] The Rails version as a `major.minor` Float.
|
|
293
379
|
def target_rails_version_from_bundler_lock_file
|
|
294
380
|
@target_rails_version_from_bundler_lock_file ||= read_rails_version_from_bundler_lock_file
|
|
295
381
|
end
|
|
296
382
|
|
|
383
|
+
# @return [Float, nil] The Rails version as a `major.minor` Float.
|
|
297
384
|
def read_rails_version_from_bundler_lock_file
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
385
|
+
return nil unless gem_versions_in_target
|
|
386
|
+
|
|
387
|
+
# Look for `railties` instead of `rails`, to support apps that only use a subset of `rails`
|
|
388
|
+
# See https://github.com/rubocop/rubocop/pull/11289
|
|
389
|
+
rails_version_in_target = gem_versions_in_target['railties']
|
|
390
|
+
return nil unless rails_version_in_target
|
|
391
|
+
|
|
392
|
+
gem_version_to_major_minor_float(rails_version_in_target)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# @param [Gem::Version] gem_version an object like `Gem::Version.new("7.1.2.3")`
|
|
396
|
+
# @return [Float] The major and minor version, like `7.1`
|
|
397
|
+
def gem_version_to_major_minor_float(gem_version)
|
|
398
|
+
segments = gem_version.segments
|
|
399
|
+
Float("#{segments[0]}.#{segments[1]}")
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
# @returns [Hash{String => Gem::Version}] The locked gem versions, keyed by the gems' names.
|
|
403
|
+
def read_gem_versions_from_target_lockfile
|
|
404
|
+
lockfile_path = bundler_lock_file_path
|
|
405
|
+
return nil unless lockfile_path
|
|
406
|
+
|
|
407
|
+
Lockfile.new(lockfile_path).gem_versions
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# @returns [Array<String>, nil] The names of the gems sourced from a local path.
|
|
411
|
+
def read_path_sourced_gems_from_target_lockfile
|
|
412
|
+
lockfile_path = bundler_lock_file_path
|
|
413
|
+
return nil unless lockfile_path
|
|
414
|
+
|
|
415
|
+
Lockfile.new(lockfile_path).path_sourced_gem_names
|
|
308
416
|
end
|
|
309
417
|
|
|
310
418
|
def enable_cop?(qualified_cop_name, cop_options)
|
|
@@ -325,6 +433,43 @@ module RuboCop
|
|
|
325
433
|
|
|
326
434
|
self[cop_department.join('/')]
|
|
327
435
|
end
|
|
436
|
+
|
|
437
|
+
# The effective `NewCops` setting for the given cop: the department-level
|
|
438
|
+
# setting if present, otherwise the `AllCops` setting.
|
|
439
|
+
def new_cops_setting_for(qualified_cop_name)
|
|
440
|
+
department = department_of(qualified_cop_name)
|
|
441
|
+
setting = department['NewCops'] if department
|
|
442
|
+
|
|
443
|
+
setting || for_all_cops['NewCops']
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
# Whether the cop's pending status is resolved by a `NewCops` setting,
|
|
447
|
+
# so that it should not appear in the pending cops warning.
|
|
448
|
+
# Unlike `enabled_new_cop?`, `disable` counts as covered.
|
|
449
|
+
def new_cops_covered?(qualified_cop_name)
|
|
450
|
+
setting = new_cops_setting_for(qualified_cop_name)
|
|
451
|
+
|
|
452
|
+
case setting.to_s
|
|
453
|
+
when 'enable', 'disable' then true
|
|
454
|
+
when '', 'pending' then false
|
|
455
|
+
else new_cops_version_covers?(setting, qualified_cop_name)
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
def new_cops_version_covers?(new_cops_version, qualified_cop_name)
|
|
460
|
+
cop_metadata = self[qualified_cop_name]
|
|
461
|
+
version_added = comparable_version(cop_metadata['VersionAdded']) if cop_metadata
|
|
462
|
+
pinned_version = comparable_version(new_cops_version)
|
|
463
|
+
return false if version_added.nil? || pinned_version.nil?
|
|
464
|
+
|
|
465
|
+
version_added <= pinned_version
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
# Returns a `Gem::Version` for values like `'1.19'` or `1.19`, and `nil`
|
|
469
|
+
# for non-version values like `'N/A'` or `'<<next>>'`.
|
|
470
|
+
def comparable_version(value)
|
|
471
|
+
value = value.to_s
|
|
472
|
+
Gem::Version.new(value) if value.match?(/\A\d/) && Gem::Version.correct?(value)
|
|
473
|
+
end
|
|
328
474
|
end
|
|
329
475
|
end
|
|
330
|
-
# rubocop:enable Metrics/ClassLength
|
|
@@ -17,8 +17,8 @@ module RuboCop
|
|
|
17
17
|
attr_writer :project_root
|
|
18
18
|
|
|
19
19
|
def find_config_path(target_dir)
|
|
20
|
-
find_project_dotfile(target_dir) ||
|
|
21
|
-
DEFAULT_FILE
|
|
20
|
+
find_project_dotfile(target_dir) || find_project_root_dot_config ||
|
|
21
|
+
find_user_dotfile || find_user_xdg_config || DEFAULT_FILE
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
# Returns the path RuboCop inferred as the root of the project. No file
|
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
|
30
30
|
private
|
|
31
31
|
|
|
32
32
|
def find_project_root
|
|
33
|
-
pwd =
|
|
33
|
+
pwd = PathUtil.pwd
|
|
34
34
|
gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd)
|
|
35
35
|
return unless gems_file
|
|
36
36
|
|
|
@@ -41,19 +41,29 @@ module RuboCop
|
|
|
41
41
|
find_file_upwards(DOTFILE, target_dir, project_root)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
def find_project_root_dot_config
|
|
45
|
+
return unless project_root
|
|
46
|
+
|
|
47
|
+
dotfile = File.join(project_root, '.config', DOTFILE)
|
|
48
|
+
return dotfile if File.exist?(dotfile)
|
|
49
|
+
|
|
50
|
+
xdg_config = File.join(project_root, '.config', 'rubocop', XDG_CONFIG)
|
|
51
|
+
xdg_config if File.exist?(xdg_config)
|
|
52
|
+
end
|
|
53
|
+
|
|
44
54
|
def find_user_dotfile
|
|
45
55
|
return unless ENV.key?('HOME')
|
|
46
56
|
|
|
47
57
|
file = File.join(Dir.home, DOTFILE)
|
|
48
58
|
|
|
49
|
-
|
|
59
|
+
file if File.exist?(file)
|
|
50
60
|
end
|
|
51
61
|
|
|
52
62
|
def find_user_xdg_config
|
|
53
63
|
xdg_config_home = expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config'))
|
|
54
64
|
xdg_config = File.join(xdg_config_home, 'rubocop', XDG_CONFIG)
|
|
55
65
|
|
|
56
|
-
|
|
66
|
+
xdg_config if File.exist?(xdg_config)
|
|
57
67
|
end
|
|
58
68
|
|
|
59
69
|
def expand_path(path)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'erb'
|
|
4
|
-
require 'pathname'
|
|
5
4
|
require 'yaml'
|
|
5
|
+
require_relative 'cache_config'
|
|
6
6
|
require_relative 'config_finder'
|
|
7
7
|
|
|
8
8
|
module RuboCop
|
|
@@ -23,37 +23,46 @@ module RuboCop
|
|
|
23
23
|
class << self
|
|
24
24
|
include FileFinder
|
|
25
25
|
|
|
26
|
-
PENDING_BANNER = <<~BANNER
|
|
27
|
-
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
|
28
|
-
|
|
29
|
-
Please also note that you can opt-in to new cops by default by adding this to your config:
|
|
30
|
-
AllCops:
|
|
31
|
-
NewCops: enable
|
|
32
|
-
BANNER
|
|
33
|
-
|
|
34
26
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
|
35
|
-
:ignore_unrecognized_cops
|
|
36
|
-
attr_writer :default_configuration
|
|
37
|
-
attr_reader :loaded_features
|
|
27
|
+
:enabled_by_default, :disabled_by_default, :ignore_unrecognized_cops
|
|
28
|
+
attr_writer :default_configuration, :cache_root
|
|
29
|
+
attr_reader :loaded_plugins, :loaded_features
|
|
38
30
|
|
|
39
31
|
alias debug? debug
|
|
40
32
|
alias ignore_parent_exclusion? ignore_parent_exclusion
|
|
41
33
|
|
|
34
|
+
def cache_root(cache_root_override = nil)
|
|
35
|
+
@cache_root ||= CacheConfig.root_dir_from_toplevel_config(cache_root_override)
|
|
36
|
+
end
|
|
37
|
+
|
|
42
38
|
def clear_options
|
|
43
39
|
@debug = nil
|
|
40
|
+
@loaded_plugins = Set.new
|
|
44
41
|
@loaded_features = Set.new
|
|
42
|
+
@disable_pending_cops = nil
|
|
43
|
+
@enable_pending_cops = nil
|
|
44
|
+
@enabled_by_default = nil
|
|
45
|
+
@disabled_by_default = nil
|
|
46
|
+
@ignore_parent_exclusion = nil
|
|
47
|
+
@ignore_unrecognized_cops = nil
|
|
48
|
+
@cache_root = nil
|
|
45
49
|
FileFinder.root_level = nil
|
|
46
50
|
end
|
|
47
51
|
|
|
52
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
48
53
|
def load_file(file, check: true)
|
|
49
54
|
path = file_path(file)
|
|
50
55
|
|
|
51
56
|
hash = load_yaml_configuration(path)
|
|
52
57
|
|
|
58
|
+
rubocop_config = Config.create(hash, path, check: false)
|
|
59
|
+
plugins = hash.delete('plugins')
|
|
60
|
+
loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
|
|
61
|
+
add_loaded_plugins(loaded_plugins)
|
|
62
|
+
|
|
53
63
|
loaded_features = resolver.resolve_requires(path, hash)
|
|
54
64
|
add_loaded_features(loaded_features)
|
|
55
65
|
|
|
56
|
-
resolver.override_department_setting_for_cops({}, hash)
|
|
57
66
|
resolver.resolve_inheritance_from_gems(hash)
|
|
58
67
|
resolver.resolve_inheritance(path, hash, file, debug?)
|
|
59
68
|
hash.delete('inherit_from')
|
|
@@ -68,12 +77,14 @@ module RuboCop
|
|
|
68
77
|
def load_yaml_configuration(absolute_path)
|
|
69
78
|
file_contents = read_file(absolute_path)
|
|
70
79
|
yaml_code = Dir.chdir(File.dirname(absolute_path)) { ERB.new(file_contents).result }
|
|
71
|
-
check_duplication(yaml_code, absolute_path)
|
|
72
|
-
hash =
|
|
80
|
+
yaml_tree = check_duplication(yaml_code, absolute_path)
|
|
81
|
+
hash = yaml_tree_to_hash(yaml_tree) || {}
|
|
73
82
|
|
|
74
83
|
puts "configuration from #{absolute_path}" if debug?
|
|
75
84
|
|
|
76
|
-
|
|
85
|
+
unless hash.is_a?(Hash)
|
|
86
|
+
raise(ValidationError, "Malformed configuration in #{absolute_path}")
|
|
87
|
+
end
|
|
77
88
|
|
|
78
89
|
hash
|
|
79
90
|
end
|
|
@@ -81,8 +92,12 @@ module RuboCop
|
|
|
81
92
|
def add_missing_namespaces(path, hash)
|
|
82
93
|
# Using `hash.each_key` will cause the
|
|
83
94
|
# `can't add a new key into hash during iteration` error
|
|
95
|
+
obsoletion = ConfigObsoletion.new(hash)
|
|
96
|
+
|
|
84
97
|
hash_keys = hash.keys
|
|
85
98
|
hash_keys.each do |key|
|
|
99
|
+
next if obsoletion.deprecated_cop_name?(key)
|
|
100
|
+
|
|
86
101
|
q = Cop::Registry.qualified_cop_name(key, path)
|
|
87
102
|
next if q == key
|
|
88
103
|
|
|
@@ -107,7 +122,7 @@ module RuboCop
|
|
|
107
122
|
end
|
|
108
123
|
|
|
109
124
|
def configuration_from_file(config_file, check: true)
|
|
110
|
-
return default_configuration if config_file == DEFAULT_FILE
|
|
125
|
+
return apply_default_overrides(default_configuration) if config_file == DEFAULT_FILE
|
|
111
126
|
|
|
112
127
|
config = load_file(config_file, check: check)
|
|
113
128
|
config.validate_after_resolution if check
|
|
@@ -118,21 +133,7 @@ module RuboCop
|
|
|
118
133
|
add_excludes_from_files(config, config_file)
|
|
119
134
|
end
|
|
120
135
|
|
|
121
|
-
merge_with_default(config, config_file)
|
|
122
|
-
unless possible_new_cops?(merged_config)
|
|
123
|
-
pending_cops = pending_cops_only_qualified(merged_config.pending_cops)
|
|
124
|
-
warn_on_pending_cops(pending_cops) unless pending_cops.empty?
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def pending_cops_only_qualified(pending_cops)
|
|
130
|
-
pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def possible_new_cops?(config)
|
|
134
|
-
disable_pending_cops || enable_pending_cops ||
|
|
135
|
-
config.disabled_new_cops? || config.enabled_new_cops?
|
|
136
|
+
merge_with_default(config, config_file)
|
|
136
137
|
end
|
|
137
138
|
|
|
138
139
|
def add_excludes_from_files(config, config_file)
|
|
@@ -152,20 +153,32 @@ module RuboCop
|
|
|
152
153
|
end
|
|
153
154
|
end
|
|
154
155
|
|
|
155
|
-
#
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
156
|
+
# This API is primarily intended for testing and documenting plugins.
|
|
157
|
+
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
|
158
|
+
# so this API is usually not needed. It is intended to be used only when implementing tests
|
|
159
|
+
# that do not use `rubocop/rspec/support`.
|
|
160
|
+
def inject_defaults!(config_yml_path)
|
|
161
|
+
if Pathname(config_yml_path).directory?
|
|
162
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
|
163
|
+
Use config YAML file path instead of project root directory.
|
|
164
|
+
e.g., `path/to/config/default.yml`
|
|
165
|
+
MESSAGE
|
|
166
|
+
raise ArgumentError,
|
|
167
|
+
'Passing a project root directory to `inject_defaults!` is no longer supported.'
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
path = config_yml_path.to_s
|
|
171
|
+
hash = ConfigLoader.load_yaml_configuration(path)
|
|
172
|
+
config = Config.new(hash, path).tap(&:make_excludes_absolute)
|
|
173
|
+
|
|
174
|
+
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
|
162
175
|
end
|
|
163
176
|
|
|
164
177
|
# Returns the path RuboCop inferred as the root of the project. No file
|
|
165
178
|
# searches will go past this directory.
|
|
166
179
|
# @deprecated Use `RuboCop::ConfigFinder.project_root` instead.
|
|
167
180
|
def project_root
|
|
168
|
-
warn Rainbow(<<~WARNING).yellow
|
|
181
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
169
182
|
`RuboCop::ConfigLoader.project_root` is deprecated and will be removed in RuboCop 2.0. \
|
|
170
183
|
Use `RuboCop::ConfigFinder.project_root` instead.
|
|
171
184
|
WARNING
|
|
@@ -173,24 +186,29 @@ module RuboCop
|
|
|
173
186
|
ConfigFinder.project_root
|
|
174
187
|
end
|
|
175
188
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
pending_cops.each { |cop| warn_pending_cop cop }
|
|
180
|
-
|
|
181
|
-
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
|
189
|
+
# Merges the given configuration with the default one.
|
|
190
|
+
def merge_with_default(config, config_file, unset_nil: true)
|
|
191
|
+
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
|
182
192
|
end
|
|
183
193
|
|
|
184
|
-
|
|
185
|
-
|
|
194
|
+
# Applies CLI overrides for `AllCops/EnabledByDefault` and
|
|
195
|
+
# `AllCops/DisabledByDefault` to the given configuration. Used when the
|
|
196
|
+
# configuration would otherwise be returned without going through
|
|
197
|
+
# `merge_with_default` (e.g. there is no user-supplied `.rubocop.yml`).
|
|
198
|
+
def apply_default_overrides(config)
|
|
199
|
+
return config if @enabled_by_default.nil? && @disabled_by_default.nil?
|
|
186
200
|
|
|
187
|
-
|
|
188
|
-
|
|
201
|
+
hash = config.transform_values do |params|
|
|
202
|
+
params.is_a?(Hash) ? params.merge('Enabled' => !@disabled_by_default) : params
|
|
203
|
+
end
|
|
204
|
+
Config.new(hash, config.loaded_path)
|
|
189
205
|
end
|
|
190
206
|
|
|
191
|
-
#
|
|
192
|
-
|
|
193
|
-
|
|
207
|
+
# @api private
|
|
208
|
+
# Used to add plugins that were required inside a config or from
|
|
209
|
+
# the CLI using `--plugin`.
|
|
210
|
+
def add_loaded_plugins(loaded_plugins)
|
|
211
|
+
@loaded_plugins.merge(Array(loaded_plugins))
|
|
194
212
|
end
|
|
195
213
|
|
|
196
214
|
# @api private
|
|
@@ -236,8 +254,8 @@ module RuboCop
|
|
|
236
254
|
raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}"
|
|
237
255
|
end
|
|
238
256
|
|
|
239
|
-
def
|
|
240
|
-
|
|
257
|
+
def yaml_tree_to_hash(yaml_tree)
|
|
258
|
+
yaml_tree_to_hash!(yaml_tree)
|
|
241
259
|
rescue ::StandardError
|
|
242
260
|
if defined?(::SafeYAML)
|
|
243
261
|
raise 'SafeYAML is unmaintained, no longer needed and should be removed'
|
|
@@ -246,10 +264,16 @@ module RuboCop
|
|
|
246
264
|
raise
|
|
247
265
|
end
|
|
248
266
|
|
|
249
|
-
def
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
267
|
+
def yaml_tree_to_hash!(yaml_tree)
|
|
268
|
+
return nil unless yaml_tree
|
|
269
|
+
|
|
270
|
+
# Optimization: Because we checked for duplicate keys, we already have the
|
|
271
|
+
# yaml tree and don't need to parse it again.
|
|
272
|
+
# Also see https://github.com/ruby/psych/blob/v5.1.2/lib/psych.rb#L322-L336
|
|
273
|
+
class_loader = YAML::ClassLoader::Restricted.new(%w[Regexp Symbol], [])
|
|
274
|
+
scanner = YAML::ScalarScanner.new(class_loader)
|
|
275
|
+
visitor = YAML::Visitors::ToRuby.new(scanner, class_loader)
|
|
276
|
+
visitor.accept(yaml_tree)
|
|
253
277
|
end
|
|
254
278
|
end
|
|
255
279
|
|