rubocop 1.44.1 → 1.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +95 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +660 -117
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +13 -3
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +33 -13
- data/lib/rubocop/cli/command/execute_runner.rb +11 -6
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +80 -11
- data/lib/rubocop/comment_config.rb +21 -2
- data/lib/rubocop/config.rb +99 -25
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +58 -11
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +69 -21
- data/lib/rubocop/cop/base.rb +112 -29
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +55 -9
- data/lib/rubocop/cop/corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -15
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -15
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +12 -2
- 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 +6 -8
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +4 -5
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -17
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +38 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +129 -35
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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/processed_source_buffer_name.rb +42 -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_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -22
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +75 -0
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -5
- data/lib/rubocop/cop/internal_affairs.rb +12 -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 +2 -2
- 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 +8 -21
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +59 -28
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +2 -6
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -14
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +39 -7
- 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_exception_handling_keywords.rb +14 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -5
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +14 -14
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +8 -20
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +50 -52
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +13 -6
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +7 -4
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +85 -3
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +29 -14
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +19 -9
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +168 -28
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +20 -12
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +7 -30
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +43 -48
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -10
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +75 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +28 -13
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -7
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +49 -30
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -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 +2 -5
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +112 -34
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +48 -23
- 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 +1 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +31 -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 +4 -6
- 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 +27 -27
- 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 +5 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -16
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +24 -13
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- 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/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +114 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +96 -17
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +63 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +11 -18
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +3 -4
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +3 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +11 -14
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -5
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -5
- 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_disable_directive.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +9 -7
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -13
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +79 -10
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +36 -20
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +6 -3
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +3 -2
- 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/rescue_exception.rb +1 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -10
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -13
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/syntax.rb +14 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +17 -7
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- 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 +17 -11
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +46 -17
- data/lib/rubocop/cop/lint/useless_assignment.rb +104 -15
- 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 +11 -3
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +78 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +7 -3
- 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 +3 -3
- data/lib/rubocop/cop/lint/void.rb +140 -19
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +9 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -16
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +83 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +16 -7
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +40 -13
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +3 -3
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +10 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -3
- 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 +26 -11
- 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/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +16 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +62 -43
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- data/lib/rubocop/cop/mixin/range_help.rb +16 -10
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +13 -7
- data/lib/rubocop/cop/mixin/string_help.rb +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +24 -8
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +8 -10
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +33 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +38 -24
- data/lib/rubocop/cop/naming/method_name.rb +146 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +303 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +26 -17
- data/lib/rubocop/cop/naming/variable_name.rb +56 -7
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +12 -7
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +177 -30
- data/lib/rubocop/cop/style/accessor_grouping.rb +69 -21
- data/lib/rubocop/cop/style/alias.rb +11 -9
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +478 -62
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +54 -34
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -19
- data/lib/rubocop/cop/style/case_like_if.rb +34 -20
- data/lib/rubocop/cop/style/class_and_module_children.rb +55 -14
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +59 -41
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +35 -12
- data/lib/rubocop/cop/style/collection_methods.rb +4 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +44 -8
- data/lib/rubocop/cop/style/command_literal.rb +2 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +32 -6
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +13 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -42
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +37 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +82 -0
- 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/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +54 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
- data/lib/rubocop/cop/style/documentation.rb +36 -30
- data/lib/rubocop/cop/style/documentation_method.rb +30 -4
- data/lib/rubocop/cop/style/double_negation.rb +6 -6
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +4 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +27 -35
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- 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 +5 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +5 -8
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +3 -6
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +4 -2
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -4
- 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 +48 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +111 -34
- data/lib/rubocop/cop/style/hash_except.rb +38 -135
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +38 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +57 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +140 -17
- 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 +10 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +21 -17
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +58 -12
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +5 -4
- data/lib/rubocop/cop/style/lambda_call.rb +14 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +31 -7
- data/lib/rubocop/cop/style/map_to_set.rb +6 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +62 -31
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +65 -42
- 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.rb +3 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/mixin_grouping.rb +5 -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 +17 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +66 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +18 -11
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +33 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +38 -40
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -4
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +35 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +114 -27
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +91 -7
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -16
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +236 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +140 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -9
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -28
- data/lib/rubocop/cop/style/redundant_return.rb +16 -5
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +14 -13
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +8 -7
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -3
- data/lib/rubocop/cop/style/require_order.rb +13 -9
- data/lib/rubocop/cop/style/rescue_modifier.rb +19 -7
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +145 -63
- 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 +33 -16
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +22 -6
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +3 -4
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +10 -8
- data/lib/rubocop/cop/style/slicing_with_range.rb +106 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +50 -90
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +10 -3
- data/lib/rubocop/cop/style/super_arguments.rb +221 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +5 -5
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- 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/word_array.rb +18 -6
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +25 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +20 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +41 -29
- data/lib/rubocop/cop/team.rb +58 -26
- data/lib/rubocop/cop/util.rb +33 -11
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +66 -6
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +18 -5
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +19 -12
- data/lib/rubocop/cops_documentation_generator.rb +138 -55
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +57 -21
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +7 -21
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +74 -24
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +227 -0
- data/lib/rubocop/lsp/runtime.rb +69 -0
- data/lib/rubocop/lsp/server.rb +70 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +24 -14
- data/lib/rubocop/options.rb +78 -23
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +20 -23
- data/lib/rubocop/rspec/cop_helper.rb +21 -3
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +118 -21
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +80 -17
- data/lib/rubocop/server/cache.rb +66 -8
- data/lib/rubocop/server/cli.rb +39 -20
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +6 -5
- data/lib/rubocop/server/client_command/start.rb +17 -2
- data/lib/rubocop/server/core.rb +29 -9
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +105 -79
- data/lib/rubocop/version.rb +74 -12
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +81 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +152 -63
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -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
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../feature_loader'
|
4
|
+
require_relative 'load_error'
|
5
|
+
|
6
|
+
module RuboCop
|
7
|
+
module Plugin
|
8
|
+
# A class for loading and resolving plugins.
|
9
|
+
# @api private
|
10
|
+
class Loader
|
11
|
+
# rubocop:disable Layout/LineLength
|
12
|
+
DEFAULT_PLUGIN_CONFIG = {
|
13
|
+
'enabled' => true,
|
14
|
+
'require_path' => nil, # If not set, will be set to the plugin name
|
15
|
+
'plugin_class_name' => nil # If not set, looks for gemspec `spec.metadata["default_lint_roller_plugin"]`
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
# rubocop:enable Layout/LineLength
|
19
|
+
class << self
|
20
|
+
def load(plugins)
|
21
|
+
normalized_plugin_configs = normalize(plugins)
|
22
|
+
normalized_plugin_configs.filter_map do |plugin_name, plugin_config|
|
23
|
+
next unless plugin_config['enabled']
|
24
|
+
|
25
|
+
plugin_class = constantize_plugin_from(plugin_name, plugin_config)
|
26
|
+
|
27
|
+
plugin_class.new(plugin_config)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
34
|
+
def normalize(plugin_configs)
|
35
|
+
plugin_configs.to_h do |plugin_config|
|
36
|
+
if plugin_config == Plugin::OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
37
|
+
warn Rainbow(<<~MESSAGE).yellow
|
38
|
+
Specify `rubocop-internal_affairs` instead of `rubocop/cop/internal_affairs` in your configuration.
|
39
|
+
MESSAGE
|
40
|
+
plugin_config = Plugin::INTERNAL_AFFAIRS_PLUGIN_NAME
|
41
|
+
end
|
42
|
+
|
43
|
+
if plugin_config.is_a?(Hash)
|
44
|
+
plugin_name = plugin_config.keys.first
|
45
|
+
|
46
|
+
[
|
47
|
+
plugin_name, DEFAULT_PLUGIN_CONFIG.merge(
|
48
|
+
{ 'require_path' => plugin_name }, plugin_config.values.first
|
49
|
+
)
|
50
|
+
]
|
51
|
+
# NOTE: Compatibility is maintained when `require: rubocop/cop/internal_affairs` remains
|
52
|
+
# specified in `.rubocop.yml`.
|
53
|
+
elsif (builtin_plugin_config = Plugin::BUILTIN_INTERNAL_PLUGINS[plugin_config])
|
54
|
+
[plugin_config, builtin_plugin_config]
|
55
|
+
else
|
56
|
+
[plugin_config, DEFAULT_PLUGIN_CONFIG.merge('require_path' => plugin_config)]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def constantize_plugin_from(plugin_name, plugin_config)
|
62
|
+
if plugin_name.is_a?(String) || plugin_name.is_a?(Symbol)
|
63
|
+
constantize(plugin_name, plugin_config)
|
64
|
+
else
|
65
|
+
plugin_name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# rubocop:enable Metrics/MethodLength
|
70
|
+
def constantize(plugin_name, plugin_config)
|
71
|
+
require_plugin(plugin_config['require_path'])
|
72
|
+
|
73
|
+
if (constant_name = plugin_config['plugin_class_name'])
|
74
|
+
begin
|
75
|
+
Kernel.const_get(constant_name)
|
76
|
+
rescue StandardError
|
77
|
+
raise <<~MESSAGE
|
78
|
+
Failed while configuring plugin `#{plugin_name}': no constant with name `#{constant_name}' was found.
|
79
|
+
MESSAGE
|
80
|
+
end
|
81
|
+
else
|
82
|
+
constantize_plugin_from_gemspec_metadata(plugin_name)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def require_plugin(require_path)
|
87
|
+
FeatureLoader.load(config_directory_path: Dir.pwd, feature: require_path)
|
88
|
+
end
|
89
|
+
|
90
|
+
def constantize_plugin_from_gemspec_metadata(plugin_name)
|
91
|
+
plugin_class_name = Gem.loaded_specs[plugin_name].metadata['default_lint_roller_plugin']
|
92
|
+
|
93
|
+
Kernel.const_get(plugin_class_name)
|
94
|
+
rescue LoadError, StandardError
|
95
|
+
raise Plugin::LoadError, plugin_name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Plugin
|
5
|
+
# An exception raised when a plugin is not supported by the RuboCop engine.
|
6
|
+
# @api private
|
7
|
+
class NotSupportedError < Error
|
8
|
+
def initialize(unsupported_plugins)
|
9
|
+
super
|
10
|
+
|
11
|
+
@unsupported_plugins = unsupported_plugins
|
12
|
+
end
|
13
|
+
|
14
|
+
def message
|
15
|
+
if @unsupported_plugins.one?
|
16
|
+
about = @unsupported_plugins.first.about
|
17
|
+
|
18
|
+
"#{about.name} #{about.version} is not a plugin supported by RuboCop engine."
|
19
|
+
else
|
20
|
+
unsupported_plugin_names = @unsupported_plugins.map do |plugin|
|
21
|
+
"#{plugin.about.name} #{plugin.about.version}"
|
22
|
+
end.join(', ')
|
23
|
+
|
24
|
+
"#{unsupported_plugin_names} are not plugins supported by RuboCop engine."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'plugin/configuration_integrator'
|
4
|
+
require_relative 'plugin/loader'
|
5
|
+
|
6
|
+
module RuboCop
|
7
|
+
# Provides a plugin for RuboCop extensions that conform to lint_roller.
|
8
|
+
# https://github.com/standardrb/lint_roller
|
9
|
+
# @api private
|
10
|
+
module Plugin
|
11
|
+
BUILTIN_INTERNAL_PLUGINS = {
|
12
|
+
'rubocop-internal_affairs' => {
|
13
|
+
'enabled' => true,
|
14
|
+
'require_path' => 'rubocop/cop/internal_affairs/plugin',
|
15
|
+
'plugin_class_name' => 'RuboCop::InternalAffairs::Plugin'
|
16
|
+
}
|
17
|
+
}.freeze
|
18
|
+
INTERNAL_AFFAIRS_PLUGIN_NAME = Plugin::BUILTIN_INTERNAL_PLUGINS.keys.first
|
19
|
+
OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME = 'rubocop/cop/internal_affairs'
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def plugin_capable?(feature_name)
|
23
|
+
return true if BUILTIN_INTERNAL_PLUGINS.key?(feature_name)
|
24
|
+
return true if feature_name == OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
25
|
+
|
26
|
+
begin
|
27
|
+
# When not using Bundler. Makes the spec available but does not require it.
|
28
|
+
gem feature_name
|
29
|
+
rescue Gem::LoadError
|
30
|
+
# The user requested a gem that they do not have installed
|
31
|
+
end
|
32
|
+
return false unless (spec = Gem.loaded_specs[feature_name])
|
33
|
+
|
34
|
+
!!spec.metadata['default_lint_roller_plugin']
|
35
|
+
end
|
36
|
+
|
37
|
+
def integrate_plugins(rubocop_config, plugins)
|
38
|
+
plugins = Plugin::Loader.load(plugins)
|
39
|
+
|
40
|
+
ConfigurationIntegrator.integrate_plugins_into_rubocop_config(rubocop_config, plugins)
|
41
|
+
|
42
|
+
plugins
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/rubocop/rake_task.rb
CHANGED
@@ -12,7 +12,8 @@ module RuboCop
|
|
12
12
|
# Use global Rake namespace here to avoid namespace issues with custom
|
13
13
|
# rubocop-rake tasks
|
14
14
|
class RakeTask < ::Rake::TaskLib
|
15
|
-
attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :
|
15
|
+
attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :plugins, :requires,
|
16
|
+
:options
|
16
17
|
|
17
18
|
def initialize(name = :rubocop, *args, &task_block)
|
18
19
|
super()
|
@@ -44,7 +45,7 @@ module RuboCop
|
|
44
45
|
def run_cli(verbose, options)
|
45
46
|
# We lazy-load RuboCop so that the task doesn't dramatically impact the
|
46
47
|
# load time of your Rakefile.
|
47
|
-
|
48
|
+
require_relative '../rubocop'
|
48
49
|
|
49
50
|
cli = CLI.new
|
50
51
|
puts 'Running RuboCop...' if verbose
|
@@ -54,6 +55,7 @@ module RuboCop
|
|
54
55
|
|
55
56
|
def full_options
|
56
57
|
formatters.map { |f| ['--format', f] }.flatten
|
58
|
+
.concat(plugins.map { |plugin| ['--plugin', plugin] }.flatten)
|
57
59
|
.concat(requires.map { |r| ['--require', r] }.flatten)
|
58
60
|
.concat(options.flatten)
|
59
61
|
.concat(patterns)
|
@@ -64,6 +66,7 @@ module RuboCop
|
|
64
66
|
@verbose = true
|
65
67
|
@fail_on_error = true
|
66
68
|
@patterns = []
|
69
|
+
@plugins = []
|
67
70
|
@requires = []
|
68
71
|
@options = []
|
69
72
|
@formatters = []
|
@@ -12,7 +12,11 @@ module RuboCop
|
|
12
12
|
CACHE_LIFETIME = 24 * 60 * 60
|
13
13
|
|
14
14
|
def initialize(url, base_dir)
|
15
|
-
|
15
|
+
begin
|
16
|
+
@uri = URI.parse(url)
|
17
|
+
rescue URI::InvalidURIError
|
18
|
+
raise ConfigNotFoundError, "Failed to resolve configuration: '#{url}' is not a valid URI"
|
19
|
+
end
|
16
20
|
@base_dir = base_dir
|
17
21
|
end
|
18
22
|
|
data/lib/rubocop/result_cache.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'digest/sha1'
|
4
|
-
require 'etc'
|
5
4
|
require 'find'
|
6
5
|
require 'zlib'
|
7
6
|
require_relative 'cache_config'
|
@@ -26,16 +25,16 @@ module RuboCop
|
|
26
25
|
# cleaning should be done relatively seldom, since there is a slight risk
|
27
26
|
# that some other RuboCop process was just about to read the file, when
|
28
27
|
# there's parallel execution and the cache is shared.
|
29
|
-
def self.cleanup(config_store, verbose,
|
28
|
+
def self.cleanup(config_store, verbose, cache_root_override = nil)
|
30
29
|
return if inhibit_cleanup # OPTIMIZE: For faster testing
|
31
30
|
|
32
|
-
|
33
|
-
return unless File.exist?(
|
31
|
+
rubocop_cache_dir = cache_root(config_store, cache_root_override)
|
32
|
+
return unless File.exist?(rubocop_cache_dir)
|
34
33
|
|
35
|
-
files, dirs = Find.find(
|
34
|
+
files, dirs = Find.find(rubocop_cache_dir).partition { |path| File.file?(path) }
|
36
35
|
return unless requires_file_removal?(files.length, config_store)
|
37
36
|
|
38
|
-
remove_oldest_files(files, dirs,
|
37
|
+
remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
39
38
|
end
|
40
39
|
|
41
40
|
class << self
|
@@ -50,11 +49,11 @@ module RuboCop
|
|
50
49
|
file_count > 1 && file_count > config_store.for_pwd.for_all_cops['MaxFilesInCache']
|
51
50
|
end
|
52
51
|
|
53
|
-
def remove_oldest_files(files, dirs,
|
52
|
+
def remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
54
53
|
# Add 1 to half the number of files, so that we remove the file if
|
55
54
|
# there's only 1 left.
|
56
55
|
remove_count = (files.length / 2) + 1
|
57
|
-
puts "Removing the #{remove_count} oldest files from #{
|
56
|
+
puts "Removing the #{remove_count} oldest files from #{rubocop_cache_dir}" if verbose
|
58
57
|
sorted = files.sort_by { |path| File.mtime(path) }
|
59
58
|
remove_files(sorted, dirs, remove_count)
|
60
59
|
rescue Errno::ENOENT
|
@@ -73,9 +72,9 @@ module RuboCop
|
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
76
|
-
def self.cache_root(config_store)
|
75
|
+
def self.cache_root(config_store, cache_root_override = nil)
|
77
76
|
CacheConfig.root_dir do
|
78
|
-
config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
77
|
+
cache_root_override || config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
@@ -83,14 +82,14 @@ module RuboCop
|
|
83
82
|
config_store.for_pwd.for_all_cops['AllowSymlinksInCacheRootDirectory']
|
84
83
|
end
|
85
84
|
|
86
|
-
|
85
|
+
attr_reader :path
|
87
86
|
|
88
|
-
def initialize(file, team, options, config_store,
|
89
|
-
|
90
|
-
|
87
|
+
def initialize(file, team, options, config_store, cache_root_override = nil)
|
88
|
+
cache_root_override ||= options[:cache_root] if options[:cache_root]
|
89
|
+
rubocop_cache_dir = ResultCache.cache_root(config_store, cache_root_override)
|
91
90
|
@allow_symlinks_in_cache_location =
|
92
91
|
ResultCache.allow_symlinks_in_cache_location?(config_store)
|
93
|
-
@path = File.join(
|
92
|
+
@path = File.join(rubocop_cache_dir,
|
94
93
|
rubocop_checksum,
|
95
94
|
context_checksum(team, options),
|
96
95
|
file_checksum(file, config_store))
|
@@ -202,6 +201,10 @@ module RuboCop
|
|
202
201
|
lib_root = File.join(File.dirname(__FILE__), '..')
|
203
202
|
exe_root = File.join(lib_root, '..', 'exe')
|
204
203
|
|
204
|
+
# Make sure to use an absolute path to prevent errors on Windows
|
205
|
+
# when traversing the relative paths with symlinks.
|
206
|
+
exe_root = File.absolute_path(exe_root)
|
207
|
+
|
205
208
|
# These are all the files we have `require`d plus everything in the
|
206
209
|
# exe directory. A change to any of them could affect the cop output
|
207
210
|
# so we include them in the cache hash.
|
@@ -219,19 +222,13 @@ module RuboCop
|
|
219
222
|
options.to_s.gsub(/[^a-z]+/i, '_')
|
220
223
|
end
|
221
224
|
|
222
|
-
# The external dependency checksums are cached per RuboCop team so that
|
223
|
-
# the checksums don't need to be recomputed for each file.
|
224
|
-
def team_checksum(team)
|
225
|
-
@checksum_by_team ||= {}.compare_by_identity
|
226
|
-
@checksum_by_team[team] ||= team.external_dependency_checksum
|
227
|
-
end
|
228
|
-
|
229
225
|
# We combine team and options into a single "context" checksum to avoid
|
230
226
|
# making file names that are too long for some filesystems to handle.
|
231
227
|
# This context is for anything that's not (1) the RuboCop executable
|
232
228
|
# checksum or (2) the inspected file checksum.
|
233
229
|
def context_checksum(team, options)
|
234
|
-
|
230
|
+
keys = [team.external_dependency_checksum, relevant_options_digest(options)]
|
231
|
+
Digest::SHA1.hexdigest(keys.join)
|
235
232
|
end
|
236
233
|
end
|
237
234
|
end
|
@@ -6,9 +6,25 @@ require 'tempfile'
|
|
6
6
|
module CopHelper
|
7
7
|
extend RSpec::SharedContext
|
8
8
|
|
9
|
-
let(:ruby_version)
|
9
|
+
let(:ruby_version) do
|
10
|
+
# The minimum version Prism can parse is 3.3.
|
11
|
+
ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : RuboCop::TargetRuby::DEFAULT_VERSION
|
12
|
+
end
|
13
|
+
let(:parser_engine) do
|
14
|
+
# The maximum version Parser can correctly parse is 3.3.
|
15
|
+
ruby_version >= 3.4 ? :parser_prism : ENV.fetch('PARSER_ENGINE', :parser_whitequark).to_sym
|
16
|
+
end
|
10
17
|
let(:rails_version) { false }
|
11
18
|
|
19
|
+
before(:all) do
|
20
|
+
next if ENV['RUBOCOP_CORE_DEVELOPMENT']
|
21
|
+
|
22
|
+
plugins = Gem.loaded_specs.filter_map do |feature_name, feature_specification|
|
23
|
+
feature_name if feature_specification.metadata['default_lint_roller_plugin']
|
24
|
+
end
|
25
|
+
RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, plugins)
|
26
|
+
end
|
27
|
+
|
12
28
|
def inspect_source(source, file = nil)
|
13
29
|
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
14
30
|
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
@@ -28,7 +44,9 @@ module CopHelper
|
|
28
44
|
file = file.path
|
29
45
|
end
|
30
46
|
|
31
|
-
processed_source = RuboCop::ProcessedSource.new(
|
47
|
+
processed_source = RuboCop::ProcessedSource.new(
|
48
|
+
source, ruby_version, file, parser_engine: parser_engine
|
49
|
+
)
|
32
50
|
processed_source.config = configuration
|
33
51
|
processed_source.registry = registry
|
34
52
|
processed_source
|
@@ -69,7 +87,7 @@ module CopHelper
|
|
69
87
|
end
|
70
88
|
|
71
89
|
def _investigate(cop, processed_source)
|
72
|
-
team = RuboCop::Cop::Team.new([cop],
|
90
|
+
team = RuboCop::Cop::Team.new([cop], configuration, raise_error: true)
|
73
91
|
report = team.investigate(processed_source)
|
74
92
|
@last_corrector = report.correctors.first || RuboCop::Cop::Corrector.new(processed_source)
|
75
93
|
report.offenses.reject(&:disabled?)
|
@@ -72,9 +72,15 @@ module RuboCop
|
|
72
72
|
#
|
73
73
|
# expect_no_corrections
|
74
74
|
#
|
75
|
-
# If your code has variables of different lengths, you can use
|
76
|
-
#
|
77
|
-
#
|
75
|
+
# If your code has variables of different lengths, you can use the
|
76
|
+
# following markers to format your template by passing the variables as a
|
77
|
+
# keyword arguments:
|
78
|
+
#
|
79
|
+
# - `%{foo}`: Interpolates `foo`
|
80
|
+
# - `^{foo}`: Inserts `'^' * foo.size` for dynamic offense range length
|
81
|
+
# - `_{foo}`: Inserts `' ' * foo.size` for dynamic offense range indentation
|
82
|
+
#
|
83
|
+
# You can also abbreviate offense messages with `[...]`.
|
78
84
|
#
|
79
85
|
# %w[raise fail].each do |keyword|
|
80
86
|
# expect_offense(<<~RUBY, keyword: keyword)
|
@@ -111,6 +117,7 @@ module RuboCop
|
|
111
117
|
source
|
112
118
|
end
|
113
119
|
|
120
|
+
# rubocop:disable Metrics/AbcSize
|
114
121
|
def expect_offense(source, file = nil, severity: nil, chomp: false, **replacements)
|
115
122
|
expected_annotations = parse_annotations(source, **replacements)
|
116
123
|
source = expected_annotations.plain_source
|
@@ -123,10 +130,17 @@ module RuboCop
|
|
123
130
|
expect(actual_annotations).to eq(expected_annotations), ''
|
124
131
|
expect(@offenses.map(&:severity).uniq).to eq([severity]) if severity
|
125
132
|
|
133
|
+
# Validate that all offenses have a range that formatters can display
|
134
|
+
expect do
|
135
|
+
@offenses.each { |offense| offense.location.source_line }
|
136
|
+
end.not_to raise_error, 'One of the offenses has a misconstructed range, for ' \
|
137
|
+
'example if the offense is on line 1 and the source is empty'
|
138
|
+
|
126
139
|
@offenses
|
127
140
|
end
|
141
|
+
# rubocop:enable Metrics/AbcSize
|
128
142
|
|
129
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
143
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
130
144
|
def expect_correction(correction, loop: true, source: nil)
|
131
145
|
if source
|
132
146
|
expected_annotations = parse_annotations(source, raise_error: false)
|
@@ -148,7 +162,6 @@ module RuboCop
|
|
148
162
|
|
149
163
|
break corrected_source unless loop
|
150
164
|
break corrected_source if @last_corrector.empty?
|
151
|
-
break corrected_source if corrected_source == @processed_source.buffer.source
|
152
165
|
|
153
166
|
if iteration > RuboCop::Runner::MAX_ITERATIONS
|
154
167
|
raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [@offenses])
|
@@ -162,26 +175,31 @@ module RuboCop
|
|
162
175
|
raise 'Expected correction but no corrections were made' if new_source == source
|
163
176
|
|
164
177
|
expect(new_source).to eq(correction)
|
178
|
+
expect(@processed_source).to be_valid_syntax, 'Expected correction to be valid syntax'
|
165
179
|
end
|
166
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
180
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
167
181
|
|
168
182
|
def expect_no_corrections
|
169
183
|
raise '`expect_no_corrections` must follow `expect_offense`' unless @processed_source
|
170
184
|
|
171
185
|
return if @last_corrector.empty?
|
172
186
|
|
173
|
-
#
|
174
|
-
# we need to run the actual corrections
|
175
|
-
|
187
|
+
# This is just here for a pretty diff if the source actually got changed
|
176
188
|
new_source = @last_corrector.rewrite
|
177
|
-
|
178
189
|
expect(new_source).to eq(@processed_source.buffer.source)
|
190
|
+
|
191
|
+
# There is an infinite loop if a corrector is present that did not make
|
192
|
+
# any changes. It will cause the same offense/correction on the next loop.
|
193
|
+
raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [@offenses])
|
179
194
|
end
|
180
195
|
|
181
196
|
def expect_no_offenses(source, file = nil)
|
182
197
|
offenses = inspect_source(source, file)
|
183
198
|
|
184
|
-
|
199
|
+
# Since source given `expect_no_offenses` does not have annotations, we do not need to parse
|
200
|
+
# for them, and can just build an `AnnotatedSource` object from the source lines.
|
201
|
+
# This also prevents treating source lines that begin with a caret as an annotation.
|
202
|
+
expected_annotations = AnnotatedSource.new(source.each_line.to_a, [])
|
185
203
|
actual_annotations = expected_annotations.with_offense_annotations(offenses)
|
186
204
|
expect(actual_annotations.to_s).to eq(source)
|
187
205
|
end
|
@@ -212,7 +230,8 @@ module RuboCop
|
|
212
230
|
|
213
231
|
# Parsed representation of code annotated with the `^^^ Message` style
|
214
232
|
class AnnotatedSource
|
215
|
-
|
233
|
+
# Ignore escaped carets, don't treat as annotations
|
234
|
+
ANNOTATION_PATTERN = /\A\s*((?<!\\)\^+|\^{}) ?/.freeze
|
216
235
|
ABBREV = "[...]\n"
|
217
236
|
|
218
237
|
# @param annotated_source [String] string passed to the matchers
|