rubocop 1.52.1 → 1.79.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +596 -91
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +13 -3
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +28 -15
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +26 -3
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +52 -20
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -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_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -25
- data/lib/rubocop/cop/base.rb +80 -19
- 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 +3 -3
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- 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 +5 -7
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -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/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -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 +127 -33
- 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 +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -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_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 +2 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- 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 +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +51 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +2 -6
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +33 -13
- 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_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +14 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- 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 +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
- data/lib/rubocop/cop/layout/leading_comment_space.rb +84 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +8 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +168 -28
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- 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 +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
- 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 +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +40 -44
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -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 +10 -2
- 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 +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +83 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- 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_inside_array_literal_brackets.rb +18 -3
- 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_range_literal.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 +5 -3
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- 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 +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +45 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -12
- 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 +2 -5
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -20
- 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 +0 -2
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- 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_interpolation.rb +3 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -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/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +50 -13
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +33 -7
- data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- 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 +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -12
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +178 -10
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -7
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -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 +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +51 -20
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -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 +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +88 -27
- 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 +8 -6
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +16 -7
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- 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 +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +24 -15
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- 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 -1
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -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 +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
- 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 +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- 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/statement_modifier.rb +11 -5
- 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 +22 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +16 -17
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +306 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +11 -9
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +472 -63
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +94 -44
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +56 -24
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +8 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- 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/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +25 -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/concat_array_literals.rb +3 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +53 -38
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +4 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +18 -5
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -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 +2 -5
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +4 -2
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- 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 +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +46 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -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_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +57 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
- 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/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +49 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- 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 +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +5 -4
- data/lib/rubocop/cop/style/lambda_call.rb +14 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -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 +59 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- 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_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- 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 +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- 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 +2 -0
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +32 -8
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- 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/redundant_argument.rb +35 -4
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +89 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +73 -20
- data/lib/rubocop/cop/style/redundant_parentheses.rb +155 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +10 -25
- data/lib/rubocop/cop/style/redundant_return.rb +16 -5
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +11 -10
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +5 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +145 -61
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +10 -5
- 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 +3 -4
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -88
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- 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 +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -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 +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -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 +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- 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 +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -6
- data/lib/rubocop/cop/style/yoda_expression.rb +10 -8
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +20 -7
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +40 -19
- data/lib/rubocop/cops_documentation_generator.rb +133 -56
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +7 -21
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +71 -24
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +227 -0
- data/lib/rubocop/lsp/runtime.rb +69 -0
- data/lib/rubocop/lsp/server.rb +70 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +24 -14
- data/lib/rubocop/options.rb +54 -23
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -30
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +114 -21
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -10
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +4 -4
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +102 -77
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +69 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +136 -42
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- 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
@@ -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
|
@@ -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,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'erb'
|
4
|
-
require 'pathname'
|
5
4
|
require 'yaml'
|
6
5
|
require_relative 'config_finder'
|
7
6
|
|
@@ -23,37 +22,39 @@ module RuboCop
|
|
23
22
|
class << self
|
24
23
|
include FileFinder
|
25
24
|
|
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
25
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
35
26
|
:ignore_unrecognized_cops
|
36
27
|
attr_writer :default_configuration
|
37
|
-
attr_reader :loaded_features
|
28
|
+
attr_reader :loaded_plugins, :loaded_features
|
38
29
|
|
39
30
|
alias debug? debug
|
40
31
|
alias ignore_parent_exclusion? ignore_parent_exclusion
|
41
32
|
|
42
33
|
def clear_options
|
43
34
|
@debug = nil
|
35
|
+
@loaded_plugins = Set.new
|
44
36
|
@loaded_features = Set.new
|
37
|
+
@disable_pending_cops = nil
|
38
|
+
@enable_pending_cops = nil
|
39
|
+
@ignore_parent_exclusion = nil
|
40
|
+
@ignore_unrecognized_cops = nil
|
45
41
|
FileFinder.root_level = nil
|
46
42
|
end
|
47
43
|
|
44
|
+
# rubocop:disable Metrics/AbcSize
|
48
45
|
def load_file(file, check: true)
|
49
46
|
path = file_path(file)
|
50
47
|
|
51
48
|
hash = load_yaml_configuration(path)
|
52
49
|
|
50
|
+
rubocop_config = Config.create(hash, path, check: false)
|
51
|
+
plugins = hash.delete('plugins')
|
52
|
+
loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
|
53
|
+
add_loaded_plugins(loaded_plugins)
|
54
|
+
|
53
55
|
loaded_features = resolver.resolve_requires(path, hash)
|
54
56
|
add_loaded_features(loaded_features)
|
55
57
|
|
56
|
-
resolver.override_department_setting_for_cops({}, hash)
|
57
58
|
resolver.resolve_inheritance_from_gems(hash)
|
58
59
|
resolver.resolve_inheritance(path, hash, file, debug?)
|
59
60
|
hash.delete('inherit_from')
|
@@ -64,12 +65,13 @@ module RuboCop
|
|
64
65
|
|
65
66
|
Config.create(hash, path, check: check)
|
66
67
|
end
|
68
|
+
# rubocop:enable Metrics/AbcSize
|
67
69
|
|
68
70
|
def load_yaml_configuration(absolute_path)
|
69
71
|
file_contents = read_file(absolute_path)
|
70
72
|
yaml_code = Dir.chdir(File.dirname(absolute_path)) { ERB.new(file_contents).result }
|
71
|
-
check_duplication(yaml_code, absolute_path)
|
72
|
-
hash =
|
73
|
+
yaml_tree = check_duplication(yaml_code, absolute_path)
|
74
|
+
hash = yaml_tree_to_hash(yaml_tree) || {}
|
73
75
|
|
74
76
|
puts "configuration from #{absolute_path}" if debug?
|
75
77
|
|
@@ -81,8 +83,12 @@ module RuboCop
|
|
81
83
|
def add_missing_namespaces(path, hash)
|
82
84
|
# Using `hash.each_key` will cause the
|
83
85
|
# `can't add a new key into hash during iteration` error
|
86
|
+
obsoletion = ConfigObsoletion.new(hash)
|
87
|
+
|
84
88
|
hash_keys = hash.keys
|
85
89
|
hash_keys.each do |key|
|
90
|
+
next if obsoletion.deprecated_cop_name?(key)
|
91
|
+
|
86
92
|
q = Cop::Registry.qualified_cop_name(key, path)
|
87
93
|
next if q == key
|
88
94
|
|
@@ -118,21 +124,7 @@ module RuboCop
|
|
118
124
|
add_excludes_from_files(config, config_file)
|
119
125
|
end
|
120
126
|
|
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?
|
127
|
+
merge_with_default(config, config_file)
|
136
128
|
end
|
137
129
|
|
138
130
|
def add_excludes_from_files(config, config_file)
|
@@ -152,20 +144,41 @@ module RuboCop
|
|
152
144
|
end
|
153
145
|
end
|
154
146
|
|
155
|
-
#
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
147
|
+
# This API is primarily intended for testing and documenting plugins.
|
148
|
+
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
149
|
+
# so this API is usually not needed. It is intended to be used only when implementing tests
|
150
|
+
# that do not use `rubocop/rspec/support`.
|
151
|
+
# rubocop:disable Metrics/MethodLength
|
152
|
+
def inject_defaults!(config_yml_path)
|
153
|
+
if Pathname(config_yml_path).directory?
|
154
|
+
# TODO: Since the warning noise is expected to be high until some time after the release,
|
155
|
+
# warnings will only be issued when `RUBYOPT=-w` is specified.
|
156
|
+
# To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
|
157
|
+
# Eventually, `project_root` will no longer be accepted.
|
158
|
+
if $VERBOSE
|
159
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
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)
|
171
|
+
end
|
172
|
+
|
173
|
+
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
162
174
|
end
|
175
|
+
# rubocop:enable Metrics/MethodLength
|
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,26 +186,18 @@ module RuboCop
|
|
173
186
|
ConfigFinder.project_root
|
174
187
|
end
|
175
188
|
|
176
|
-
def warn_on_pending_cops(pending_cops)
|
177
|
-
warn Rainbow(PENDING_BANNER).yellow
|
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
|
182
|
-
end
|
183
|
-
|
184
|
-
def warn_pending_cop(cop)
|
185
|
-
version = cop.metadata['VersionAdded'] || 'N/A'
|
186
|
-
|
187
|
-
warn Rainbow("#{cop.name}: # new in #{version}").yellow
|
188
|
-
warn Rainbow(' Enabled: true').yellow
|
189
|
-
end
|
190
|
-
|
191
189
|
# Merges the given configuration with the default one.
|
192
190
|
def merge_with_default(config, config_file, unset_nil: true)
|
193
191
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
194
192
|
end
|
195
193
|
|
194
|
+
# @api private
|
195
|
+
# Used to add plugins that were required inside a config or from
|
196
|
+
# the CLI using `--plugin`.
|
197
|
+
def add_loaded_plugins(loaded_plugins)
|
198
|
+
@loaded_plugins.merge(Array(loaded_plugins))
|
199
|
+
end
|
200
|
+
|
196
201
|
# @api private
|
197
202
|
# Used to add features that were required inside a config or from
|
198
203
|
# the CLI using `--require`.
|
@@ -236,8 +241,8 @@ module RuboCop
|
|
236
241
|
raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}"
|
237
242
|
end
|
238
243
|
|
239
|
-
def
|
240
|
-
|
244
|
+
def yaml_tree_to_hash(yaml_tree)
|
245
|
+
yaml_tree_to_hash!(yaml_tree)
|
241
246
|
rescue ::StandardError
|
242
247
|
if defined?(::SafeYAML)
|
243
248
|
raise 'SafeYAML is unmaintained, no longer needed and should be removed'
|
@@ -246,10 +251,16 @@ module RuboCop
|
|
246
251
|
raise
|
247
252
|
end
|
248
253
|
|
249
|
-
def
|
250
|
-
|
251
|
-
|
252
|
-
|
254
|
+
def yaml_tree_to_hash!(yaml_tree)
|
255
|
+
return nil unless yaml_tree
|
256
|
+
|
257
|
+
# Optimization: Because we checked for duplicate keys, we already have the
|
258
|
+
# yaml tree and don't need to parse it again.
|
259
|
+
# Also see https://github.com/ruby/psych/blob/v5.1.2/lib/psych.rb#L322-L336
|
260
|
+
class_loader = YAML::ClassLoader::Restricted.new(%w[Regexp Symbol], [])
|
261
|
+
scanner = YAML::ScalarScanner.new(class_loader)
|
262
|
+
visitor = YAML::Visitors::ToRuby.new(scanner, class_loader)
|
263
|
+
visitor.accept(yaml_tree)
|
253
264
|
end
|
254
265
|
end
|
255
266
|
|
@@ -2,16 +2,35 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'yaml'
|
5
|
+
require_relative 'plugin'
|
5
6
|
|
6
7
|
module RuboCop
|
7
8
|
# A help class for ConfigLoader that handles configuration resolution.
|
8
9
|
# @api private
|
9
|
-
class ConfigLoaderResolver
|
10
|
+
class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
|
11
|
+
def resolve_plugins(rubocop_config, plugins)
|
12
|
+
plugins = Array(plugins) - ConfigLoader.loaded_plugins.map { |plugin| plugin.about.name }
|
13
|
+
return if plugins.empty?
|
14
|
+
|
15
|
+
Plugin.integrate_plugins(rubocop_config, plugins)
|
16
|
+
end
|
17
|
+
|
10
18
|
def resolve_requires(path, hash)
|
11
19
|
config_dir = File.dirname(path)
|
12
20
|
hash.delete('require').tap do |loaded_features|
|
13
21
|
Array(loaded_features).each do |feature|
|
14
|
-
|
22
|
+
if Plugin.plugin_capable?(feature)
|
23
|
+
# NOTE: Compatibility for before plugins style.
|
24
|
+
warn Rainbow(<<~MESSAGE).yellow
|
25
|
+
#{feature} extension supports plugin, specify `plugins: #{feature}` instead of `require: #{feature}` in #{path}.
|
26
|
+
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
|
27
|
+
MESSAGE
|
28
|
+
rubocop_config = Config.create(hash, path, check: false)
|
29
|
+
|
30
|
+
resolve_plugins(rubocop_config, feature)
|
31
|
+
else
|
32
|
+
FeatureLoader.load(config_directory_path: config_dir, feature: feature)
|
33
|
+
end
|
15
34
|
end
|
16
35
|
end
|
17
36
|
end
|
@@ -33,7 +52,7 @@ module RuboCop
|
|
33
52
|
inherit_mode: determine_inherit_mode(hash, k))
|
34
53
|
end
|
35
54
|
hash[k] = v
|
36
|
-
fix_include_paths(base_config.loaded_path, hash, k, v) if v.key?('Include')
|
55
|
+
fix_include_paths(base_config.loaded_path, hash, path, k, v) if v.key?('Include')
|
37
56
|
end
|
38
57
|
end
|
39
58
|
end
|
@@ -42,12 +61,13 @@ module RuboCop
|
|
42
61
|
# base configuration are relative to the directory where the base configuration file is. For the
|
43
62
|
# derived configuration, we need to make those paths relative to where the derived configuration
|
44
63
|
# file is.
|
45
|
-
def fix_include_paths(base_config_path, hash, key, value)
|
64
|
+
def fix_include_paths(base_config_path, hash, path, key, value)
|
46
65
|
return unless File.basename(base_config_path).start_with?('.rubocop')
|
47
66
|
|
48
67
|
base_dir = File.dirname(base_config_path)
|
68
|
+
derived_dir = File.dirname(path)
|
49
69
|
hash[key]['Include'] = value['Include'].map do |include_path|
|
50
|
-
PathUtil.relative_path(File.join(base_dir, include_path),
|
70
|
+
PathUtil.relative_path(File.join(base_dir, include_path), derived_dir)
|
51
71
|
end
|
52
72
|
end
|
53
73
|
|
@@ -104,7 +124,7 @@ module RuboCop
|
|
104
124
|
elsif merge_hashes?(base_hash, derived_hash, key)
|
105
125
|
result[key] = merge(base_hash[key], derived_hash[key], **opts)
|
106
126
|
elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
|
107
|
-
result[key] = base_hash[key] | derived_hash[key]
|
127
|
+
result[key] = Array(base_hash[key]) | Array(derived_hash[key])
|
108
128
|
elsif opts[:debug]
|
109
129
|
warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
110
130
|
end
|
@@ -156,20 +176,27 @@ module RuboCop
|
|
156
176
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
157
177
|
return false if inherited_file.start_with?('..') # Legitimate override
|
158
178
|
return false if base_hash[key] == derived_hash[key] # Same value
|
159
|
-
return false if remote_file?(inherited_file) # Can't change
|
179
|
+
return false if PathUtil.remote_file?(inherited_file) # Can't change
|
160
180
|
|
161
181
|
Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
|
162
182
|
end
|
163
183
|
|
164
184
|
def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
185
|
+
# If the file being considered is remote, don't bother checking for duplicates
|
186
|
+
return if remote_config?(opts[:file])
|
187
|
+
|
165
188
|
return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
|
166
189
|
|
167
190
|
inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
|
168
|
-
return if base_hash[key].is_a?(Array) && inherit_mode
|
191
|
+
return if base_hash[key].is_a?(Array) && inherit_mode&.include?(key)
|
192
|
+
|
193
|
+
puts duplicate_setting_warning(opts, key)
|
194
|
+
end
|
169
195
|
|
170
|
-
|
171
|
-
|
172
|
-
|
196
|
+
def duplicate_setting_warning(opts, key)
|
197
|
+
"#{PathUtil.smart_path(opts[:file])}: " \
|
198
|
+
"#{opts[:cop_name]}:#{key} overrides " \
|
199
|
+
"the same parameter in #{opts[:inherited_file]}"
|
173
200
|
end
|
174
201
|
|
175
202
|
def determine_inherit_mode(hash, key)
|
@@ -179,7 +206,7 @@ module RuboCop
|
|
179
206
|
end
|
180
207
|
|
181
208
|
def should_union?(derived_hash, base_hash, root_mode, key)
|
182
|
-
return false unless base_hash[key].is_a?(Array)
|
209
|
+
return false unless base_hash[key].is_a?(Array) || derived_hash[key].is_a?(Array)
|
183
210
|
|
184
211
|
derived_mode = derived_hash['inherit_mode']
|
185
212
|
return false if should_override?(derived_mode, key)
|
@@ -193,11 +220,11 @@ module RuboCop
|
|
193
220
|
end
|
194
221
|
|
195
222
|
def should_merge?(mode, key)
|
196
|
-
mode && mode['merge']
|
223
|
+
mode && mode['merge']&.include?(key)
|
197
224
|
end
|
198
225
|
|
199
226
|
def should_override?(mode, key)
|
200
|
-
mode && mode['override']
|
227
|
+
mode && mode['override']&.include?(key)
|
201
228
|
end
|
202
229
|
|
203
230
|
def merge_hashes?(base_hash, derived_hash, key)
|
@@ -217,7 +244,7 @@ module RuboCop
|
|
217
244
|
end
|
218
245
|
|
219
246
|
def inherited_file(path, inherit_from, file)
|
220
|
-
if remote_file?(inherit_from)
|
247
|
+
if PathUtil.remote_file?(inherit_from)
|
221
248
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
222
249
|
RemoteConfig.new(inherit_from, File.dirname(path))
|
223
250
|
elsif Pathname.new(inherit_from).absolute?
|
@@ -237,9 +264,8 @@ module RuboCop
|
|
237
264
|
end
|
238
265
|
end
|
239
266
|
|
240
|
-
def
|
241
|
-
|
242
|
-
/\A#{regex}\z/.match?(uri)
|
267
|
+
def remote_config?(file)
|
268
|
+
file.is_a?(RemoteConfig)
|
243
269
|
end
|
244
270
|
|
245
271
|
def handle_disabled_by_default(config, new_default_configuration)
|
@@ -266,8 +292,14 @@ module RuboCop
|
|
266
292
|
|
267
293
|
def gem_config_path(gem_name, relative_config_path)
|
268
294
|
if defined?(Bundler)
|
269
|
-
|
270
|
-
|
295
|
+
begin
|
296
|
+
gem = Bundler.load.specs[gem_name].first
|
297
|
+
gem_path = gem.full_gem_path if gem
|
298
|
+
rescue Bundler::GemfileNotFound
|
299
|
+
# No Gemfile found. Bundler may be loaded manually
|
300
|
+
rescue Bundler::GitError
|
301
|
+
# The Gemfile exists but contains an uninstalled git source
|
302
|
+
end
|
271
303
|
end
|
272
304
|
|
273
305
|
gem_path ||= Gem::Specification.find_by_name(gem_name).gem_dir
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def violated?
|
18
|
-
return false if
|
18
|
+
return false if plugin_loaded?
|
19
19
|
|
20
20
|
affected_cops.any?
|
21
21
|
end
|
@@ -38,8 +38,9 @@ module RuboCop
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
42
|
-
|
41
|
+
def plugin_loaded?
|
42
|
+
# Plugins loaded via `require` are included in `loaded_features`.
|
43
|
+
config.loaded_plugins.include?(gem) || config.loaded_features.include?(gem)
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def violated?
|
22
|
-
config[cop]&.key?(parameter)
|
22
|
+
applies_to_current_ruby_version? && config[cop]&.key?(parameter)
|
23
23
|
end
|
24
24
|
|
25
25
|
def warning?
|
@@ -28,6 +28,14 @@ module RuboCop
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
+
def applies_to_current_ruby_version?
|
32
|
+
minimum_ruby_version = metadata['minimum_ruby_version']
|
33
|
+
|
34
|
+
return true unless minimum_ruby_version
|
35
|
+
|
36
|
+
config.target_ruby_version >= minimum_ruby_version
|
37
|
+
end
|
38
|
+
|
31
39
|
def alternative
|
32
40
|
metadata['alternative']
|
33
41
|
end
|
@@ -6,17 +6,28 @@ module RuboCop
|
|
6
6
|
# a cop or moving it to a new department.
|
7
7
|
# @api private
|
8
8
|
class RenamedCop < CopRule
|
9
|
-
attr_reader :new_name
|
9
|
+
attr_reader :new_name, :metadata
|
10
10
|
|
11
|
-
def initialize(config, old_name,
|
11
|
+
def initialize(config, old_name, name_or_hash)
|
12
12
|
super(config, old_name)
|
13
|
-
|
13
|
+
|
14
|
+
if name_or_hash.is_a?(Hash)
|
15
|
+
@metadata = name_or_hash
|
16
|
+
@new_name = name_or_hash['new_name']
|
17
|
+
else
|
18
|
+
@metadata = {}
|
19
|
+
@new_name = name_or_hash
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def rule_message
|
17
24
|
"The `#{old_name}` cop has been #{verb} to `#{new_name}`."
|
18
25
|
end
|
19
26
|
|
27
|
+
def warning?
|
28
|
+
severity == 'warning'
|
29
|
+
end
|
30
|
+
|
20
31
|
private
|
21
32
|
|
22
33
|
def moved?
|
@@ -29,6 +40,10 @@ module RuboCop
|
|
29
40
|
def verb
|
30
41
|
moved? ? 'moved' : 'renamed'
|
31
42
|
end
|
43
|
+
|
44
|
+
def severity
|
45
|
+
metadata['severity']
|
46
|
+
end
|
32
47
|
end
|
33
48
|
end
|
34
49
|
end
|
@@ -15,15 +15,48 @@ module RuboCop
|
|
15
15
|
'changed_parameters' => ChangedParameter,
|
16
16
|
'changed_enforced_styles' => ChangedEnforcedStyles
|
17
17
|
}.freeze
|
18
|
+
LOAD_RULES_CACHE = {} # rubocop:disable Style/MutableConstant
|
19
|
+
private_constant :LOAD_RULES_CACHE
|
18
20
|
|
19
21
|
attr_reader :rules, :warnings
|
20
22
|
|
21
23
|
class << self
|
22
24
|
attr_accessor :files
|
23
25
|
|
26
|
+
def global
|
27
|
+
@global ||= new(Config.new)
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset!
|
31
|
+
@global = nil
|
32
|
+
@deprecated_names = {}
|
33
|
+
LOAD_RULES_CACHE[rules_cache_key] = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def rules_cache_key
|
37
|
+
files.hash
|
38
|
+
end
|
39
|
+
|
24
40
|
def legacy_cop_names
|
25
41
|
# Used by DepartmentName#qualified_legacy_cop_name
|
26
|
-
|
42
|
+
global.legacy_cop_names
|
43
|
+
end
|
44
|
+
|
45
|
+
def deprecated_cop_name?(name)
|
46
|
+
global.deprecated_cop_name?(name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def deprecated_names_for(cop)
|
50
|
+
@deprecated_names ||= {}
|
51
|
+
return @deprecated_names[cop] if @deprecated_names.key?(cop)
|
52
|
+
|
53
|
+
@deprecated_names[cop] = global.rules.filter_map do |rule|
|
54
|
+
next unless rule.cop_rule?
|
55
|
+
next unless rule.respond_to?(:new_name)
|
56
|
+
next unless rule.new_name == cop
|
57
|
+
|
58
|
+
rule.old_name
|
59
|
+
end
|
27
60
|
end
|
28
61
|
end
|
29
62
|
|
@@ -43,21 +76,31 @@ module RuboCop
|
|
43
76
|
raise ValidationError, messages.join("\n")
|
44
77
|
end
|
45
78
|
|
79
|
+
def legacy_cop_names
|
80
|
+
# Used by DepartmentName#qualified_legacy_cop_name
|
81
|
+
cop_rules.map(&:old_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
def deprecated_cop_name?(name)
|
85
|
+
legacy_cop_names.include?(name)
|
86
|
+
end
|
87
|
+
|
46
88
|
private
|
47
89
|
|
48
90
|
# Default rules for obsoletions are in config/obsoletion.yml
|
49
91
|
# Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
|
50
92
|
def load_rules # rubocop:disable Metrics/AbcSize
|
51
|
-
rules = self.class.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
93
|
+
rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
|
94
|
+
self.class.files.each_with_object({}) do |filename, hash|
|
95
|
+
hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
|
96
|
+
case first
|
97
|
+
when Hash
|
98
|
+
first.merge(second)
|
99
|
+
when Array
|
100
|
+
first.concat(second)
|
101
|
+
end
|
58
102
|
end
|
59
103
|
end
|
60
|
-
end
|
61
104
|
|
62
105
|
cop_rules = rules.slice(*COP_RULE_CLASSES.keys)
|
63
106
|
parameter_rules = rules.slice(*PARAMETER_RULE_CLASSES.keys)
|
@@ -104,5 +147,9 @@ module RuboCop
|
|
104
147
|
rule.message
|
105
148
|
end
|
106
149
|
end
|
150
|
+
|
151
|
+
def cop_rules
|
152
|
+
rules.select(&:cop_rule?)
|
153
|
+
end
|
107
154
|
end
|
108
155
|
end
|