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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# This code is based on https://github.com/standardrb/standard.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2023 Test Double, Inc.
|
|
7
|
+
#
|
|
8
|
+
# The MIT License (MIT)
|
|
9
|
+
#
|
|
10
|
+
# https://github.com/standardrb/standard/blob/main/LICENSE.txt
|
|
11
|
+
#
|
|
12
|
+
module RuboCop
|
|
13
|
+
module Lsp
|
|
14
|
+
# Originally lifted from:
|
|
15
|
+
# https://github.com/Shopify/ruby-lsp/blob/8d4c17efce4e8ecc8e7c557ab2981db6b22c0b6d/lib/ruby_lsp/requests/support/rubocop_runner.rb#L20
|
|
16
|
+
# @api private
|
|
17
|
+
class StdinRunner < RuboCop::Runner
|
|
18
|
+
class ConfigurationError < StandardError; end
|
|
19
|
+
|
|
20
|
+
attr_reader :offenses, :config_for_working_directory
|
|
21
|
+
|
|
22
|
+
DEFAULT_RUBOCOP_OPTIONS = {
|
|
23
|
+
stderr: true,
|
|
24
|
+
force_exclusion: true,
|
|
25
|
+
formatters: ['RuboCop::Formatter::BaseFormatter'],
|
|
26
|
+
raise_cop_error: true,
|
|
27
|
+
todo_file: nil,
|
|
28
|
+
todo_ignore_files: []
|
|
29
|
+
}.freeze
|
|
30
|
+
|
|
31
|
+
def initialize(config_store)
|
|
32
|
+
@options = {}
|
|
33
|
+
|
|
34
|
+
@offenses = []
|
|
35
|
+
@warnings = []
|
|
36
|
+
@errors = []
|
|
37
|
+
|
|
38
|
+
@config_for_working_directory = config_store.for_pwd
|
|
39
|
+
|
|
40
|
+
super(@options, config_store)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def run(path, contents, options, prism_result: nil)
|
|
44
|
+
@options = options.merge(DEFAULT_RUBOCOP_OPTIONS)
|
|
45
|
+
@options[:stdin] = contents
|
|
46
|
+
|
|
47
|
+
@prism_result = prism_result
|
|
48
|
+
|
|
49
|
+
@offenses = []
|
|
50
|
+
@warnings = []
|
|
51
|
+
@errors = []
|
|
52
|
+
|
|
53
|
+
super([path])
|
|
54
|
+
|
|
55
|
+
raise Interrupt if aborting?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def formatted_source
|
|
59
|
+
@options[:stdin]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def file_finished(_file, offenses)
|
|
65
|
+
@offenses = offenses
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/rubocop/lsp.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
# The RuboCop's built-in LSP module.
|
|
5
|
+
module LSP
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
# Returns true when LSP is enabled, false when disabled.
|
|
9
|
+
#
|
|
10
|
+
# @return [Boolean]
|
|
11
|
+
def enabled?
|
|
12
|
+
@enabled ||= false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Enable LSP.
|
|
16
|
+
#
|
|
17
|
+
# @return [void]
|
|
18
|
+
def enable
|
|
19
|
+
@enabled = true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Disable LSP.
|
|
23
|
+
#
|
|
24
|
+
# @return [void]
|
|
25
|
+
def disable(&block)
|
|
26
|
+
if block
|
|
27
|
+
original = @enabled
|
|
28
|
+
@enabled = false
|
|
29
|
+
yield
|
|
30
|
+
@enabled = original
|
|
31
|
+
else
|
|
32
|
+
@enabled = false
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -80,13 +80,13 @@ module RuboCop
|
|
|
80
80
|
|
|
81
81
|
# Expose the `frozen_string_literal` value coerced to a boolean if possible.
|
|
82
82
|
#
|
|
83
|
-
# @return [Boolean] if value is `true` or `false`
|
|
83
|
+
# @return [Boolean] if value is `true` or `false` in any case
|
|
84
84
|
# @return [nil] if frozen_string_literal comment isn't found
|
|
85
85
|
# @return [String] if comment is found but isn't true or false
|
|
86
86
|
def frozen_string_literal
|
|
87
87
|
return unless (setting = extract_frozen_string_literal)
|
|
88
88
|
|
|
89
|
-
case setting
|
|
89
|
+
case setting.downcase
|
|
90
90
|
when 'true' then true
|
|
91
91
|
when 'false' then false
|
|
92
92
|
else
|
|
@@ -193,6 +193,10 @@ module RuboCop
|
|
|
193
193
|
SEPARATOR = ';'
|
|
194
194
|
OPERATOR = ':'
|
|
195
195
|
|
|
196
|
+
def new_frozen_string_literal(value)
|
|
197
|
+
"# -*- frozen_string_literal: #{value} -*-"
|
|
198
|
+
end
|
|
199
|
+
|
|
196
200
|
private
|
|
197
201
|
|
|
198
202
|
def extract_frozen_string_literal
|
|
@@ -268,13 +272,17 @@ module RuboCop
|
|
|
268
272
|
|
|
269
273
|
# Rewrite the comment without a given token type
|
|
270
274
|
def without(type)
|
|
271
|
-
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/)
|
|
275
|
+
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/io)
|
|
272
276
|
''
|
|
273
277
|
else
|
|
274
278
|
@comment
|
|
275
279
|
end
|
|
276
280
|
end
|
|
277
281
|
|
|
282
|
+
def new_frozen_string_literal(value)
|
|
283
|
+
"# frozen_string_literal: #{value}"
|
|
284
|
+
end
|
|
285
|
+
|
|
278
286
|
private
|
|
279
287
|
|
|
280
288
|
# Extract `frozen_string_literal`.
|
|
@@ -283,7 +291,7 @@ module RuboCop
|
|
|
283
291
|
# is the only text in the comment.
|
|
284
292
|
#
|
|
285
293
|
# Case-insensitive and dashes/underscores are acceptable.
|
|
286
|
-
# @see https://github.com/ruby/ruby/blob/
|
|
294
|
+
# @see https://github.com/ruby/ruby/blob/78b95b49f8/parse.y#L7134-L7138
|
|
287
295
|
def extract_frozen_string_literal
|
|
288
296
|
extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*#{TOKEN}\s*\z/io)
|
|
289
297
|
end
|
data/lib/rubocop/options.rb
CHANGED
|
@@ -95,6 +95,7 @@ module RuboCop
|
|
|
95
95
|
option(opts, '--ignore-unrecognized-cops')
|
|
96
96
|
option(opts, '--force-default-config')
|
|
97
97
|
option(opts, '-s', '--stdin FILE')
|
|
98
|
+
option(opts, '--editor-mode')
|
|
98
99
|
option(opts, '-P', '--[no-]parallel')
|
|
99
100
|
option(opts, '--raise-cop-error')
|
|
100
101
|
add_severity_option(opts)
|
|
@@ -242,6 +243,7 @@ module RuboCop
|
|
|
242
243
|
option(opts, '--init')
|
|
243
244
|
option(opts, '-c', '--config FILE')
|
|
244
245
|
option(opts, '-d', '--debug')
|
|
246
|
+
option(opts, '--plugin FILE') { |f| plugin_feature(f) }
|
|
245
247
|
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
|
246
248
|
option(opts, '--[no-]color')
|
|
247
249
|
option(opts, '-v', '--version')
|
|
@@ -298,11 +300,25 @@ module RuboCop
|
|
|
298
300
|
long_opt[2..].sub('[no-]', '').sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
|
|
299
301
|
end
|
|
300
302
|
|
|
301
|
-
def
|
|
302
|
-
# If any features were added on the CLI from `--
|
|
303
|
+
def plugin_feature(file)
|
|
304
|
+
# If any features were added on the CLI from `--plugin`,
|
|
303
305
|
# add them to the config.
|
|
304
|
-
|
|
305
|
-
|
|
306
|
+
ConfigLoaderResolver.new.resolve_plugins(Config.new, file)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def require_feature(file)
|
|
310
|
+
if Plugin.plugin_capable?(file)
|
|
311
|
+
# NOTE: Compatibility for before plugins style.
|
|
312
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
313
|
+
#{file} gem supports plugin, use `--plugin` instead of `--require`.
|
|
314
|
+
MESSAGE
|
|
315
|
+
plugin_feature(file)
|
|
316
|
+
else
|
|
317
|
+
# If any features were added on the CLI from `--require`,
|
|
318
|
+
# add them to the config.
|
|
319
|
+
require file
|
|
320
|
+
ConfigLoader.add_loaded_features(file)
|
|
321
|
+
end
|
|
306
322
|
end
|
|
307
323
|
end
|
|
308
324
|
|
|
@@ -364,15 +380,12 @@ module RuboCop
|
|
|
364
380
|
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
|
365
381
|
end
|
|
366
382
|
|
|
367
|
-
if display_only_fail_level_offenses_with_autocorrect?
|
|
368
|
-
raise OptionArgumentError, '--autocorrect cannot be used with ' \
|
|
369
|
-
'--display-only-fail-level-offenses.'
|
|
370
|
-
end
|
|
371
383
|
validate_auto_gen_config
|
|
372
384
|
validate_autocorrect
|
|
373
385
|
validate_display_only_failed
|
|
374
386
|
validate_display_only_failed_and_display_only_correctable
|
|
375
387
|
validate_display_only_correctable_and_autocorrect
|
|
388
|
+
validate_lsp_and_editor_mode
|
|
376
389
|
disable_parallel_when_invalid_option_combo
|
|
377
390
|
|
|
378
391
|
return if incompatible_options.size <= 1
|
|
@@ -399,7 +412,7 @@ module RuboCop
|
|
|
399
412
|
return if @options[:format] == 'junit'
|
|
400
413
|
|
|
401
414
|
raise OptionArgumentError,
|
|
402
|
-
|
|
415
|
+
'--display-only-failed can only be used together with --format junit.'
|
|
403
416
|
end
|
|
404
417
|
|
|
405
418
|
def validate_display_only_correctable_and_autocorrect
|
|
@@ -417,7 +430,13 @@ module RuboCop
|
|
|
417
430
|
!@options.key?(:display_only_safe_correctable)
|
|
418
431
|
|
|
419
432
|
raise OptionArgumentError,
|
|
420
|
-
|
|
433
|
+
'--display-only-failed cannot be used together with other display options.'
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
def validate_lsp_and_editor_mode
|
|
437
|
+
return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
|
|
438
|
+
|
|
439
|
+
raise OptionArgumentError, 'Do not specify `--editor-mode` as it is redundant in `--lsp`.'
|
|
421
440
|
end
|
|
422
441
|
|
|
423
442
|
def validate_autocorrect
|
|
@@ -431,7 +450,7 @@ module RuboCop
|
|
|
431
450
|
return unless @options.key?(:disable_uncorrectable)
|
|
432
451
|
|
|
433
452
|
raise OptionArgumentError,
|
|
434
|
-
|
|
453
|
+
'--disable-uncorrectable can only be used together with --autocorrect.'
|
|
435
454
|
end
|
|
436
455
|
|
|
437
456
|
def disable_parallel_when_invalid_option_combo
|
|
@@ -460,10 +479,6 @@ module RuboCop
|
|
|
460
479
|
(@options[:only] & %w[Lint/RedundantCopDisableDirective RedundantCopDisableDirective]).any?
|
|
461
480
|
end
|
|
462
481
|
|
|
463
|
-
def display_only_fail_level_offenses_with_autocorrect?
|
|
464
|
-
@options.key?(:display_only_fail_level_offenses) && @options.key?(:autocorrect)
|
|
465
|
-
end
|
|
466
|
-
|
|
467
482
|
def except_syntax?
|
|
468
483
|
@options.key?(:except) && (@options[:except] & %w[Lint/Syntax Syntax]).any?
|
|
469
484
|
end
|
|
@@ -503,6 +518,7 @@ module RuboCop
|
|
|
503
518
|
only_guide_cops: ['Run only cops for rules that link to a',
|
|
504
519
|
'style guide.'],
|
|
505
520
|
except: 'Exclude the given cop(s).',
|
|
521
|
+
plugin: 'Load a RuboCop plugin.',
|
|
506
522
|
require: 'Require Ruby file.',
|
|
507
523
|
config: 'Specify configuration file.',
|
|
508
524
|
auto_gen_config: ['Generate a configuration file acting as a',
|
|
@@ -541,8 +557,8 @@ module RuboCop
|
|
|
541
557
|
only_recognized_file_types: ['Inspect files given on the command line only if',
|
|
542
558
|
'they are listed in `AllCops/Include` parameters',
|
|
543
559
|
'of user configuration or default configuration.'],
|
|
544
|
-
ignore_disable_comments: ['
|
|
545
|
-
'
|
|
560
|
+
ignore_disable_comments: ['Report offenses even if they have been manually disabled',
|
|
561
|
+
'with a `rubocop:disable` or `rubocop:todo` directive.'],
|
|
546
562
|
ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
|
|
547
563
|
'parent folders.'],
|
|
548
564
|
ignore_unrecognized_cops: ['Ignore unrecognized cops or departments in the config.'],
|
|
@@ -572,13 +588,14 @@ module RuboCop
|
|
|
572
588
|
'cops. Only valid for --format junit.'],
|
|
573
589
|
display_only_fail_level_offenses:
|
|
574
590
|
['Only output offense messages at',
|
|
575
|
-
'the specified --fail-level or above'],
|
|
591
|
+
'the specified --fail-level or above.'],
|
|
576
592
|
display_only_correctable: ['Only output correctable offense messages.'],
|
|
577
593
|
display_only_safe_correctable: ['Only output safe-correctable offense messages',
|
|
578
594
|
'when combined with --display-only-correctable.'],
|
|
579
595
|
show_cops: ['Shows the given cops, or all cops by',
|
|
580
596
|
'default, and their configurations for the',
|
|
581
|
-
'current directory.'
|
|
597
|
+
'current directory.',
|
|
598
|
+
'You can use `*` as a wildcard.'],
|
|
582
599
|
show_docs_url: ['Display url to documentation for the given',
|
|
583
600
|
'cops, or base url by default.'],
|
|
584
601
|
fail_fast: ['Inspect files in order of modification',
|
|
@@ -614,9 +631,13 @@ module RuboCop
|
|
|
614
631
|
version: 'Display version.',
|
|
615
632
|
verbose_version: 'Display verbose version.',
|
|
616
633
|
parallel: ['Use available CPUs to execute inspection in',
|
|
617
|
-
'parallel. Default is true.'
|
|
634
|
+
'parallel. Default is true.',
|
|
635
|
+
'You can specify the number of parallel processes using',
|
|
636
|
+
'the $PARALLEL_PROCESSOR_COUNT environment variable.'],
|
|
618
637
|
stdin: ['Pipe source from STDIN, using FILE in offense',
|
|
619
638
|
'reports. This is useful for editor integration.'],
|
|
639
|
+
editor_mode: ['Optimize real-time feedback in editors,',
|
|
640
|
+
'adjusting behaviors for editing experience.'],
|
|
620
641
|
init: 'Generate a .rubocop.yml file in the current directory.',
|
|
621
642
|
server: ['If a server process has not been started yet, start',
|
|
622
643
|
'the server process and execute inspection with server.',
|
|
@@ -633,8 +654,8 @@ module RuboCop
|
|
|
633
654
|
raise_cop_error: ['Raise cop-related errors with cause and location.',
|
|
634
655
|
'This is used to prevent cops from failing silently.',
|
|
635
656
|
'Default is false.'],
|
|
636
|
-
profile: 'Profile rubocop',
|
|
637
|
-
memory: 'Profile rubocop memory usage'
|
|
657
|
+
profile: 'Profile rubocop.',
|
|
658
|
+
memory: 'Profile rubocop memory usage.'
|
|
638
659
|
}.freeze
|
|
639
660
|
end
|
|
640
661
|
# rubocop:enable Metrics/ModuleLength
|
data/lib/rubocop/path_util.rb
CHANGED
|
@@ -28,23 +28,30 @@ module RuboCop
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
def remote_file?(uri)
|
|
32
|
+
uri.start_with?('http://', 'https://')
|
|
33
|
+
end
|
|
34
|
+
|
|
31
35
|
SMART_PATH_CACHE = {} # rubocop:disable Style/MutableConstant
|
|
32
36
|
private_constant :SMART_PATH_CACHE
|
|
33
37
|
|
|
34
38
|
def smart_path(path)
|
|
35
|
-
SMART_PATH_CACHE[path] ||=
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if path.start_with? base_dir
|
|
40
|
-
relative_path(path, base_dir)
|
|
39
|
+
SMART_PATH_CACHE[path] ||=
|
|
40
|
+
if path.is_a?(RemoteConfig)
|
|
41
|
+
path.uri.to_s
|
|
41
42
|
else
|
|
42
|
-
|
|
43
|
+
# Ideally, we calculate this relative to the project root.
|
|
44
|
+
base_dir = Dir.pwd
|
|
45
|
+
|
|
46
|
+
if path.start_with? base_dir
|
|
47
|
+
relative_path(path, base_dir)
|
|
48
|
+
else
|
|
49
|
+
path
|
|
50
|
+
end
|
|
43
51
|
end
|
|
44
|
-
end
|
|
45
52
|
end
|
|
46
53
|
|
|
47
|
-
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
54
|
+
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
48
55
|
def match_path?(pattern, path)
|
|
49
56
|
case pattern
|
|
50
57
|
when String
|
|
@@ -52,6 +59,10 @@ module RuboCop
|
|
|
52
59
|
if pattern == path
|
|
53
60
|
true
|
|
54
61
|
elsif glob?(pattern)
|
|
62
|
+
# File name matching doesn't really work with relative patterns that start with "..". We
|
|
63
|
+
# get around that problem by converting the pattern to an absolute path.
|
|
64
|
+
pattern = File.expand_path(pattern) if pattern.start_with?('..')
|
|
65
|
+
|
|
55
66
|
File.fnmatch?(pattern, path, File::FNM_PATHNAME | File::FNM_EXTGLOB)
|
|
56
67
|
end
|
|
57
68
|
|
|
@@ -66,7 +77,7 @@ module RuboCop
|
|
|
66
77
|
end
|
|
67
78
|
end
|
|
68
79
|
end
|
|
69
|
-
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
80
|
+
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
70
81
|
|
|
71
82
|
# Returns true for an absolute Unix or Windows path.
|
|
72
83
|
def absolute?(path)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
# Reports information about pending cops that are not explicitly configured.
|
|
5
|
+
#
|
|
6
|
+
# This class is responsible for displaying warnings when new cops have been added to RuboCop
|
|
7
|
+
# but have not yet been enabled or disabled in the user's configuration.
|
|
8
|
+
# It provides a centralized way to determine whether such warnings should be shown,
|
|
9
|
+
# based on global flags or configuration settings.
|
|
10
|
+
class PendingCopsReporter
|
|
11
|
+
class << self
|
|
12
|
+
PENDING_BANNER = <<~BANNER
|
|
13
|
+
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
|
14
|
+
|
|
15
|
+
Please also note that you can opt-in to new cops by default by adding this to your config:
|
|
16
|
+
AllCops:
|
|
17
|
+
NewCops: enable
|
|
18
|
+
BANNER
|
|
19
|
+
|
|
20
|
+
attr_accessor :disable_pending_cops, :enable_pending_cops
|
|
21
|
+
|
|
22
|
+
def warn_if_needed(config)
|
|
23
|
+
return if possible_new_cops?(config)
|
|
24
|
+
|
|
25
|
+
pending_cops = pending_cops_only_qualified(config.pending_cops)
|
|
26
|
+
warn_on_pending_cops(pending_cops) unless pending_cops.empty?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def pending_cops_only_qualified(pending_cops)
|
|
32
|
+
pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def possible_new_cops?(config)
|
|
36
|
+
disable_pending_cops || enable_pending_cops ||
|
|
37
|
+
config.disabled_new_cops? || config.enabled_new_cops?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def warn_on_pending_cops(pending_cops)
|
|
41
|
+
warn Rainbow(PENDING_BANNER).yellow
|
|
42
|
+
|
|
43
|
+
pending_cops.each { |cop| warn_pending_cop cop }
|
|
44
|
+
|
|
45
|
+
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def warn_pending_cop(cop)
|
|
49
|
+
version = cop.metadata['VersionAdded'] || 'N/A'
|
|
50
|
+
|
|
51
|
+
warn Rainbow("#{cop.name}: # new in #{version}").yellow
|
|
52
|
+
warn Rainbow(' Enabled: true').yellow
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lint_roller/context'
|
|
4
|
+
require_relative 'not_supported_error'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
module Plugin
|
|
8
|
+
# A class for integrating plugin configurations into RuboCop.
|
|
9
|
+
# Handles configuration merging, validation, and compatibility for plugins.
|
|
10
|
+
# @api private
|
|
11
|
+
class ConfigurationIntegrator
|
|
12
|
+
class << self
|
|
13
|
+
def integrate_plugins_into_rubocop_config(rubocop_config, plugins)
|
|
14
|
+
default_config = ConfigLoader.default_configuration
|
|
15
|
+
runner_context = create_context(rubocop_config)
|
|
16
|
+
|
|
17
|
+
validate_plugins!(plugins, runner_context)
|
|
18
|
+
|
|
19
|
+
plugin_config = combine_rubocop_configs(default_config, runner_context, plugins).to_h
|
|
20
|
+
|
|
21
|
+
merge_plugin_config_into_all_cops!(default_config, plugin_config)
|
|
22
|
+
merge_plugin_config_into_default_config!(default_config, plugin_config)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def create_context(rubocop_config)
|
|
28
|
+
LintRoller::Context.new(
|
|
29
|
+
runner: :rubocop,
|
|
30
|
+
runner_version: Version.version,
|
|
31
|
+
engine: :rubocop,
|
|
32
|
+
engine_version: Version.version,
|
|
33
|
+
target_ruby_version: rubocop_config.target_ruby_version
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def validate_plugins!(plugins, runner_context)
|
|
38
|
+
unsupported_plugins = plugins.reject { |plugin| plugin.supported?(runner_context) }
|
|
39
|
+
return if unsupported_plugins.none?
|
|
40
|
+
|
|
41
|
+
raise Plugin::NotSupportedError, unsupported_plugins
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def combine_rubocop_configs(default_config, runner_context, plugins)
|
|
45
|
+
fake_out_rubocop_default_configuration(default_config) do |fake_config|
|
|
46
|
+
all_cop_keys_configured_by_plugins = []
|
|
47
|
+
|
|
48
|
+
plugins.reduce(fake_config) do |combined_config, plugin|
|
|
49
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, combined_config)
|
|
50
|
+
|
|
51
|
+
print 'Plugin ' if ConfigLoader.debug
|
|
52
|
+
|
|
53
|
+
plugin_config, plugin_config_path = load_plugin_rubocop_config(plugin, runner_context)
|
|
54
|
+
|
|
55
|
+
plugin_config['AllCops'], all_cop_keys_configured_by_plugins = merge_all_cop_settings(
|
|
56
|
+
combined_config['AllCops'], plugin_config['AllCops'],
|
|
57
|
+
all_cop_keys_configured_by_plugins
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
plugin_config.make_excludes_absolute
|
|
61
|
+
|
|
62
|
+
ConfigLoader.merge_with_default(plugin_config, plugin_config_path)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def merge_plugin_config_into_all_cops!(rubocop_config, plugin_config)
|
|
68
|
+
rubocop_config['AllCops'].merge!(plugin_config['AllCops'])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def merge_plugin_config_into_default_config!(default_config, plugin_config)
|
|
72
|
+
plugin_config.each do |key, value|
|
|
73
|
+
default_config[key] = if default_config[key].is_a?(Hash)
|
|
74
|
+
resolver.merge(default_config[key], value)
|
|
75
|
+
else
|
|
76
|
+
value
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def fake_out_rubocop_default_configuration(default_config)
|
|
82
|
+
orig_default_config = ConfigLoader.instance_variable_get(:@default_configuration)
|
|
83
|
+
|
|
84
|
+
result = yield default_config
|
|
85
|
+
|
|
86
|
+
ConfigLoader.instance_variable_set(:@default_configuration, orig_default_config)
|
|
87
|
+
|
|
88
|
+
result
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# rubocop:disable Metrics/AbcSize
|
|
92
|
+
def load_plugin_rubocop_config(plugin, runner_context)
|
|
93
|
+
rules = plugin.rules(runner_context)
|
|
94
|
+
|
|
95
|
+
case rules.type
|
|
96
|
+
when :path
|
|
97
|
+
[ConfigLoader.load_file(rules.value, check: false), rules.value]
|
|
98
|
+
when :object
|
|
99
|
+
path = plugin.method(:rules).source_location[0]
|
|
100
|
+
[Config.create(rules.value, path, check: true), path]
|
|
101
|
+
when :error
|
|
102
|
+
plugin_name = plugin.about&.name || plugin.inspect
|
|
103
|
+
error_message = rules.value.respond_to?(:message) ? rules.value.message : rules.value
|
|
104
|
+
|
|
105
|
+
raise "Plugin `#{plugin_name}' failed to load with error: #{error_message}"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
# rubocop:enable Metrics/AbcSize
|
|
109
|
+
|
|
110
|
+
# This is how we ensure "first-in wins": plugins can override AllCops settings that are
|
|
111
|
+
# set by RuboCop's default configuration, but once a plugin sets an AllCop setting, they
|
|
112
|
+
# have exclusive first-in-wins rights to that setting.
|
|
113
|
+
#
|
|
114
|
+
# The one exception to this are array fields, because we don't want to
|
|
115
|
+
# overwrite the AllCops defaults but rather munge the arrays (`existing |
|
|
116
|
+
# new`) to allow plugins to add to the array, for example Include and
|
|
117
|
+
# Exclude paths and patterns.
|
|
118
|
+
def merge_all_cop_settings(existing_all_cops, new_all_cops, already_configured_keys)
|
|
119
|
+
return [existing_all_cops, already_configured_keys] unless new_all_cops.is_a?(Hash)
|
|
120
|
+
|
|
121
|
+
combined_all_cops = existing_all_cops.dup
|
|
122
|
+
combined_configured_keys = already_configured_keys.dup
|
|
123
|
+
|
|
124
|
+
new_all_cops.each do |key, value|
|
|
125
|
+
if combined_all_cops[key].is_a?(Array) && value.is_a?(Array)
|
|
126
|
+
combined_all_cops[key] |= value
|
|
127
|
+
combined_configured_keys |= [key]
|
|
128
|
+
elsif !combined_configured_keys.include?(key)
|
|
129
|
+
combined_all_cops[key] = value
|
|
130
|
+
combined_configured_keys << key
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
[combined_all_cops, combined_configured_keys]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def resolver
|
|
138
|
+
@resolver ||= ConfigLoaderResolver.new
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Plugin
|
|
5
|
+
# An exception raised when a plugin fails to load.
|
|
6
|
+
# @api private
|
|
7
|
+
class LoadError < Error
|
|
8
|
+
def initialize(plugin_name)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@plugin_name = plugin_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def message
|
|
15
|
+
<<~MESSAGE
|
|
16
|
+
Failed to load plugin `#{@plugin_name}` because the corresponding plugin class could not be determined for instantiation.
|
|
17
|
+
Try upgrading it first (e.g., `bundle update #{@plugin_name}`).
|
|
18
|
+
If `#{@plugin_name}` is not yet a plugin, use `require: #{@plugin_name}` instead of `plugins: #{@plugin_name}` in your configuration.
|
|
19
|
+
|
|
20
|
+
For further assistance, check with the developer regarding the following points:
|
|
21
|
+
https://docs.rubocop.org/rubocop/plugin_migration_guide.html
|
|
22
|
+
MESSAGE
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|