rubocop 1.57.1 → 1.81.6
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- 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 +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- 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 +3 -5
- 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 +1 -1
- 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.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 +13 -8
- 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 +3 -4
- 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 +124 -30
- 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 +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_message_argument.rb +6 -21
- 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 +0 -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 +45 -10
- 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 +1 -1
- 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 +4 -4
- 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 +36 -21
- 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 +12 -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 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- 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 +4 -4
- 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 +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -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 +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.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 +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- 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_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- 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 +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -8
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- 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 +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- 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 +0 -2
- 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 +14 -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/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 +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- 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 +12 -3
- 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 +9 -5
- 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 +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- 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 +2 -9
- 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 +20 -9
- 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 +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- 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_escape_unescape.rb +2 -0
- 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 +21 -16
- 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 +92 -18
- 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 +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- 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 +15 -6
- 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 +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- 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 +23 -14
- 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 -7
- 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/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 +7 -9
- 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 +68 -30
- 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 +2 -2
- 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 +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -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/json_load.rb +33 -11
- 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 +2 -1
- 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 +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- 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 +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- 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 +1 -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 +2 -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 +22 -8
- 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 +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- 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/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- 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_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 +163 -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 +19 -6
- 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 +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- 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 +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -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 +37 -7
- 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 +60 -6
- 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 +48 -6
- 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 +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- 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 +52 -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/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 +5 -3
- 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 +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- 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 +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- 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/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 +29 -3
- 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 +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- 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 +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -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 +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- 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 +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -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 +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- 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 +30 -7
- 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 +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- 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 +72 -87
- 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 +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- 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 +1 -1
- 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 +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 +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/unless_else.rb +10 -9
- 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/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- 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 +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- 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 +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- 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 +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- 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 +70 -23
- 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 +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- 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 -34
- 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 +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- 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 +3 -3
- 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/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- 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,7 +1,5 @@
|
|
|
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
5
|
# rubocop:disable Metrics/ClassLength
|
|
@@ -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 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,11 @@ module RuboCop
|
|
|
44
72
|
@badge_config_cache = {}.compare_by_identity
|
|
45
73
|
@clusivity_config_exists_cache = {}
|
|
46
74
|
end
|
|
47
|
-
# rubocop:enable Metrics/AbcSize
|
|
75
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
76
|
+
|
|
77
|
+
def loaded_plugins
|
|
78
|
+
@loaded_plugins ||= ConfigLoader.loaded_plugins
|
|
79
|
+
end
|
|
48
80
|
|
|
49
81
|
def loaded_features
|
|
50
82
|
@loaded_features ||= ConfigLoader.loaded_features
|
|
@@ -82,10 +114,7 @@ module RuboCop
|
|
|
82
114
|
|
|
83
115
|
def make_excludes_absolute
|
|
84
116
|
each_key do |key|
|
|
85
|
-
|
|
86
|
-
next unless self[key]['Exclude']
|
|
87
|
-
|
|
88
|
-
self[key]['Exclude'].map! do |exclude_elem|
|
|
117
|
+
dig(key, 'Exclude')&.map! do |exclude_elem|
|
|
89
118
|
if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
|
|
90
119
|
File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem))
|
|
91
120
|
else
|
|
@@ -125,6 +154,13 @@ module RuboCop
|
|
|
125
154
|
@for_cop[cop]
|
|
126
155
|
end
|
|
127
156
|
|
|
157
|
+
# @return [Config, Hash] for the given cop / cop name.
|
|
158
|
+
# If the given cop is enabled, returns its configuration hash.
|
|
159
|
+
# Otherwise, returns an empty hash.
|
|
160
|
+
def for_enabled_cop(cop)
|
|
161
|
+
cop_enabled?(cop) ? for_cop(cop) : EMPTY_CONFIG
|
|
162
|
+
end
|
|
163
|
+
|
|
128
164
|
# @return [Config] for the given cop merged with that of its department (if any)
|
|
129
165
|
# Note: the 'Enabled' attribute is same as that returned by `for_cop`
|
|
130
166
|
def for_badge(badge)
|
|
@@ -161,6 +197,10 @@ module RuboCop
|
|
|
161
197
|
@for_all_cops ||= self['AllCops'] || {}
|
|
162
198
|
end
|
|
163
199
|
|
|
200
|
+
def cop_enabled?(name)
|
|
201
|
+
!!for_cop(name)['Enabled']
|
|
202
|
+
end
|
|
203
|
+
|
|
164
204
|
def disabled_new_cops?
|
|
165
205
|
for_all_cops['NewCops'] == 'disable'
|
|
166
206
|
end
|
|
@@ -173,6 +213,10 @@ module RuboCop
|
|
|
173
213
|
for_all_cops['ActiveSupportExtensionsEnabled']
|
|
174
214
|
end
|
|
175
215
|
|
|
216
|
+
def string_literals_frozen_by_default?
|
|
217
|
+
for_all_cops['StringLiteralsFrozenByDefault']
|
|
218
|
+
end
|
|
219
|
+
|
|
176
220
|
def file_to_include?(file)
|
|
177
221
|
relative_file_path = path_relative_to_config(file)
|
|
178
222
|
|
|
@@ -246,6 +290,10 @@ module RuboCop
|
|
|
246
290
|
end
|
|
247
291
|
end
|
|
248
292
|
|
|
293
|
+
def parser_engine
|
|
294
|
+
@parser_engine ||= for_all_cops.fetch('ParserEngine', :default).to_sym
|
|
295
|
+
end
|
|
296
|
+
|
|
249
297
|
def target_rails_version
|
|
250
298
|
@target_rails_version ||=
|
|
251
299
|
if for_all_cops['TargetRailsVersion']
|
|
@@ -261,6 +309,7 @@ module RuboCop
|
|
|
261
309
|
PathUtil.smart_path(@loaded_path)
|
|
262
310
|
end
|
|
263
311
|
|
|
312
|
+
# @return [String, nil]
|
|
264
313
|
def bundler_lock_file_path
|
|
265
314
|
return nil unless loaded_path
|
|
266
315
|
|
|
@@ -284,27 +333,48 @@ module RuboCop
|
|
|
284
333
|
end
|
|
285
334
|
end
|
|
286
335
|
|
|
336
|
+
# Returns target's locked gem versions (i.e. from Gemfile.lock or gems.locked)
|
|
337
|
+
# @returns [Hash{String => Gem::Version}] The locked gem versions, keyed by the gems' names.
|
|
338
|
+
def gem_versions_in_target
|
|
339
|
+
@gem_versions_in_target ||= read_gem_versions_from_target_lockfile
|
|
340
|
+
end
|
|
341
|
+
|
|
287
342
|
def inspect # :nodoc:
|
|
288
343
|
"#<#{self.class.name}:#{object_id} @loaded_path=#{loaded_path}>"
|
|
289
344
|
end
|
|
290
345
|
|
|
291
346
|
private
|
|
292
347
|
|
|
348
|
+
# @return [Float, nil] The Rails version as a `major.minor` Float.
|
|
293
349
|
def target_rails_version_from_bundler_lock_file
|
|
294
350
|
@target_rails_version_from_bundler_lock_file ||= read_rails_version_from_bundler_lock_file
|
|
295
351
|
end
|
|
296
352
|
|
|
353
|
+
# @return [Float, nil] The Rails version as a `major.minor` Float.
|
|
297
354
|
def read_rails_version_from_bundler_lock_file
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
355
|
+
return nil unless gem_versions_in_target
|
|
356
|
+
|
|
357
|
+
# Look for `railties` instead of `rails`, to support apps that only use a subset of `rails`
|
|
358
|
+
# See https://github.com/rubocop/rubocop/pull/11289
|
|
359
|
+
rails_version_in_target = gem_versions_in_target['railties']
|
|
360
|
+
return nil unless rails_version_in_target
|
|
361
|
+
|
|
362
|
+
gem_version_to_major_minor_float(rails_version_in_target)
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
# @param [Gem::Version] gem_version an object like `Gem::Version.new("7.1.2.3")`
|
|
366
|
+
# @return [Float] The major and minor version, like `7.1`
|
|
367
|
+
def gem_version_to_major_minor_float(gem_version)
|
|
368
|
+
segments = gem_version.segments
|
|
369
|
+
Float("#{segments[0]}.#{segments[1]}")
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# @returns [Hash{String => Gem::Version}] The locked gem versions, keyed by the gems' names.
|
|
373
|
+
def read_gem_versions_from_target_lockfile
|
|
374
|
+
lockfile_path = bundler_lock_file_path
|
|
375
|
+
return nil unless lockfile_path
|
|
376
|
+
|
|
377
|
+
Lockfile.new(lockfile_path).gem_versions
|
|
308
378
|
end
|
|
309
379
|
|
|
310
380
|
def enable_cop?(qualified_cop_name, cop_options)
|
|
@@ -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,6 +41,16 @@ 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
|
|
|
@@ -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,16 +65,19 @@ 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
|
|
|
76
|
-
|
|
78
|
+
unless hash.is_a?(Hash)
|
|
79
|
+
raise(ValidationError, "Malformed configuration in #{absolute_path}")
|
|
80
|
+
end
|
|
77
81
|
|
|
78
82
|
hash
|
|
79
83
|
end
|
|
@@ -81,8 +85,12 @@ module RuboCop
|
|
|
81
85
|
def add_missing_namespaces(path, hash)
|
|
82
86
|
# Using `hash.each_key` will cause the
|
|
83
87
|
# `can't add a new key into hash during iteration` error
|
|
88
|
+
obsoletion = ConfigObsoletion.new(hash)
|
|
89
|
+
|
|
84
90
|
hash_keys = hash.keys
|
|
85
91
|
hash_keys.each do |key|
|
|
92
|
+
next if obsoletion.deprecated_cop_name?(key)
|
|
93
|
+
|
|
86
94
|
q = Cop::Registry.qualified_cop_name(key, path)
|
|
87
95
|
next if q == key
|
|
88
96
|
|
|
@@ -118,21 +126,7 @@ module RuboCop
|
|
|
118
126
|
add_excludes_from_files(config, config_file)
|
|
119
127
|
end
|
|
120
128
|
|
|
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?
|
|
129
|
+
merge_with_default(config, config_file)
|
|
136
130
|
end
|
|
137
131
|
|
|
138
132
|
def add_excludes_from_files(config, config_file)
|
|
@@ -152,20 +146,41 @@ module RuboCop
|
|
|
152
146
|
end
|
|
153
147
|
end
|
|
154
148
|
|
|
155
|
-
#
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
149
|
+
# This API is primarily intended for testing and documenting plugins.
|
|
150
|
+
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
|
151
|
+
# so this API is usually not needed. It is intended to be used only when implementing tests
|
|
152
|
+
# that do not use `rubocop/rspec/support`.
|
|
153
|
+
# rubocop:disable Metrics/MethodLength
|
|
154
|
+
def inject_defaults!(config_yml_path)
|
|
155
|
+
if Pathname(config_yml_path).directory?
|
|
156
|
+
# TODO: Since the warning noise is expected to be high until some time after the release,
|
|
157
|
+
# warnings will only be issued when `RUBYOPT=-w` is specified.
|
|
158
|
+
# To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
|
|
159
|
+
# Eventually, `project_root` will no longer be accepted.
|
|
160
|
+
if $VERBOSE
|
|
161
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
|
162
|
+
Use config YAML file path instead of project root directory.
|
|
163
|
+
e.g., `path/to/config/default.yml`
|
|
164
|
+
MESSAGE
|
|
165
|
+
end
|
|
166
|
+
# NOTE: For compatibility.
|
|
167
|
+
project_root = config_yml_path
|
|
168
|
+
path = File.join(project_root, 'config', 'default.yml')
|
|
169
|
+
config = load_file(path)
|
|
170
|
+
else
|
|
171
|
+
hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
|
|
172
|
+
config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
|
162
176
|
end
|
|
177
|
+
# rubocop:enable Metrics/MethodLength
|
|
163
178
|
|
|
164
179
|
# Returns the path RuboCop inferred as the root of the project. No file
|
|
165
180
|
# searches will go past this directory.
|
|
166
181
|
# @deprecated Use `RuboCop::ConfigFinder.project_root` instead.
|
|
167
182
|
def project_root
|
|
168
|
-
warn Rainbow(<<~WARNING).yellow
|
|
183
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
169
184
|
`RuboCop::ConfigLoader.project_root` is deprecated and will be removed in RuboCop 2.0. \
|
|
170
185
|
Use `RuboCop::ConfigFinder.project_root` instead.
|
|
171
186
|
WARNING
|
|
@@ -173,26 +188,18 @@ module RuboCop
|
|
|
173
188
|
ConfigFinder.project_root
|
|
174
189
|
end
|
|
175
190
|
|
|
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
191
|
# Merges the given configuration with the default one.
|
|
192
192
|
def merge_with_default(config, config_file, unset_nil: true)
|
|
193
193
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
|
194
194
|
end
|
|
195
195
|
|
|
196
|
+
# @api private
|
|
197
|
+
# Used to add plugins that were required inside a config or from
|
|
198
|
+
# the CLI using `--plugin`.
|
|
199
|
+
def add_loaded_plugins(loaded_plugins)
|
|
200
|
+
@loaded_plugins.merge(Array(loaded_plugins))
|
|
201
|
+
end
|
|
202
|
+
|
|
196
203
|
# @api private
|
|
197
204
|
# Used to add features that were required inside a config or from
|
|
198
205
|
# the CLI using `--require`.
|
|
@@ -236,8 +243,8 @@ module RuboCop
|
|
|
236
243
|
raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}"
|
|
237
244
|
end
|
|
238
245
|
|
|
239
|
-
def
|
|
240
|
-
|
|
246
|
+
def yaml_tree_to_hash(yaml_tree)
|
|
247
|
+
yaml_tree_to_hash!(yaml_tree)
|
|
241
248
|
rescue ::StandardError
|
|
242
249
|
if defined?(::SafeYAML)
|
|
243
250
|
raise 'SafeYAML is unmaintained, no longer needed and should be removed'
|
|
@@ -246,10 +253,16 @@ module RuboCop
|
|
|
246
253
|
raise
|
|
247
254
|
end
|
|
248
255
|
|
|
249
|
-
def
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
256
|
+
def yaml_tree_to_hash!(yaml_tree)
|
|
257
|
+
return nil unless yaml_tree
|
|
258
|
+
|
|
259
|
+
# Optimization: Because we checked for duplicate keys, we already have the
|
|
260
|
+
# yaml tree and don't need to parse it again.
|
|
261
|
+
# Also see https://github.com/ruby/psych/blob/v5.1.2/lib/psych.rb#L322-L336
|
|
262
|
+
class_loader = YAML::ClassLoader::Restricted.new(%w[Regexp Symbol], [])
|
|
263
|
+
scanner = YAML::ScalarScanner.new(class_loader)
|
|
264
|
+
visitor = YAML::Visitors::ToRuby.new(scanner, class_loader)
|
|
265
|
+
visitor.accept(yaml_tree)
|
|
253
266
|
end
|
|
254
267
|
end
|
|
255
268
|
|
|
@@ -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
|
|
@@ -105,7 +124,7 @@ module RuboCop
|
|
|
105
124
|
elsif merge_hashes?(base_hash, derived_hash, key)
|
|
106
125
|
result[key] = merge(base_hash[key], derived_hash[key], **opts)
|
|
107
126
|
elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
|
|
108
|
-
result[key] = base_hash[key] | derived_hash[key]
|
|
127
|
+
result[key] = Array(base_hash[key]) | Array(derived_hash[key])
|
|
109
128
|
elsif opts[:debug]
|
|
110
129
|
warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
|
111
130
|
end
|
|
@@ -157,20 +176,27 @@ module RuboCop
|
|
|
157
176
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
|
158
177
|
return false if inherited_file.start_with?('..') # Legitimate override
|
|
159
178
|
return false if base_hash[key] == derived_hash[key] # Same value
|
|
160
|
-
return false if remote_file?(inherited_file) # Can't change
|
|
179
|
+
return false if PathUtil.remote_file?(inherited_file) # Can't change
|
|
161
180
|
|
|
162
181
|
Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
|
|
163
182
|
end
|
|
164
183
|
|
|
165
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
|
+
|
|
166
188
|
return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
|
|
167
189
|
|
|
168
190
|
inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
|
|
169
|
-
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
|
|
170
195
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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]}"
|
|
174
200
|
end
|
|
175
201
|
|
|
176
202
|
def determine_inherit_mode(hash, key)
|
|
@@ -180,7 +206,7 @@ module RuboCop
|
|
|
180
206
|
end
|
|
181
207
|
|
|
182
208
|
def should_union?(derived_hash, base_hash, root_mode, key)
|
|
183
|
-
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)
|
|
184
210
|
|
|
185
211
|
derived_mode = derived_hash['inherit_mode']
|
|
186
212
|
return false if should_override?(derived_mode, key)
|
|
@@ -194,11 +220,11 @@ module RuboCop
|
|
|
194
220
|
end
|
|
195
221
|
|
|
196
222
|
def should_merge?(mode, key)
|
|
197
|
-
mode && mode['merge']
|
|
223
|
+
mode && mode['merge']&.include?(key)
|
|
198
224
|
end
|
|
199
225
|
|
|
200
226
|
def should_override?(mode, key)
|
|
201
|
-
mode && mode['override']
|
|
227
|
+
mode && mode['override']&.include?(key)
|
|
202
228
|
end
|
|
203
229
|
|
|
204
230
|
def merge_hashes?(base_hash, derived_hash, key)
|
|
@@ -218,7 +244,7 @@ module RuboCop
|
|
|
218
244
|
end
|
|
219
245
|
|
|
220
246
|
def inherited_file(path, inherit_from, file)
|
|
221
|
-
if remote_file?(inherit_from)
|
|
247
|
+
if PathUtil.remote_file?(inherit_from)
|
|
222
248
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
|
223
249
|
RemoteConfig.new(inherit_from, File.dirname(path))
|
|
224
250
|
elsif Pathname.new(inherit_from).absolute?
|
|
@@ -238,9 +264,8 @@ module RuboCop
|
|
|
238
264
|
end
|
|
239
265
|
end
|
|
240
266
|
|
|
241
|
-
def
|
|
242
|
-
|
|
243
|
-
/\A#{regex}\z/.match?(uri)
|
|
267
|
+
def remote_config?(file)
|
|
268
|
+
file.is_a?(RemoteConfig)
|
|
244
269
|
end
|
|
245
270
|
|
|
246
271
|
def handle_disabled_by_default(config, new_default_configuration)
|
|
@@ -267,8 +292,14 @@ module RuboCop
|
|
|
267
292
|
|
|
268
293
|
def gem_config_path(gem_name, relative_config_path)
|
|
269
294
|
if defined?(Bundler)
|
|
270
|
-
|
|
271
|
-
|
|
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
|
|
272
303
|
end
|
|
273
304
|
|
|
274
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
|
|
@@ -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
|