rubocop 1.69.0 → 1.79.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +290 -65
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli.rb +13 -2
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +53 -47
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +46 -2
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +44 -39
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- 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 +1 -0
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +4 -2
- 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_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +44 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- 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_line_after_guard_clause.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +35 -4
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- 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_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- 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 +35 -9
- 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 +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -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 +7 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +15 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -38
- 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 +12 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -3
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -3
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +37 -12
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -2
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +19 -31
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- 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 +101 -2
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +25 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- 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_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +14 -11
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- 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 +1 -2
- 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 +22 -22
- 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 +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.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 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +306 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +4 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +66 -15
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +81 -40
- data/lib/rubocop/cop/style/block_delimiters.rb +27 -24
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +23 -7
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -7
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +4 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- 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 +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- 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 +20 -4
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -0
- 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 +3 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -8
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- 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 +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -12
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- 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_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +27 -19
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +33 -25
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +14 -12
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +39 -22
- data/lib/rubocop/cop/style/redundant_parentheses.rb +85 -17
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self.rb +10 -6
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +46 -16
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -101
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
- 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/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +10 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +23 -8
- data/lib/rubocop/cops_documentation_generator.rb +32 -16
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +10 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +4 -1
- data/lib/rubocop/result_cache.rb +26 -24
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +51 -13
- 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 +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +27 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +72 -19
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -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()
|
@@ -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 = []
|
data/lib/rubocop/result_cache.rb
CHANGED
@@ -25,16 +25,16 @@ module RuboCop
|
|
25
25
|
# cleaning should be done relatively seldom, since there is a slight risk
|
26
26
|
# that some other RuboCop process was just about to read the file, when
|
27
27
|
# there's parallel execution and the cache is shared.
|
28
|
-
def self.cleanup(config_store, verbose,
|
28
|
+
def self.cleanup(config_store, verbose, cache_root_override = nil)
|
29
29
|
return if inhibit_cleanup # OPTIMIZE: For faster testing
|
30
30
|
|
31
|
-
|
32
|
-
return unless File.exist?(
|
31
|
+
rubocop_cache_dir = cache_root(config_store, cache_root_override)
|
32
|
+
return unless File.exist?(rubocop_cache_dir)
|
33
33
|
|
34
|
-
files, dirs = Find.find(
|
34
|
+
files, dirs = Find.find(rubocop_cache_dir).partition { |path| File.file?(path) }
|
35
35
|
return unless requires_file_removal?(files.length, config_store)
|
36
36
|
|
37
|
-
remove_oldest_files(files, dirs,
|
37
|
+
remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
38
38
|
end
|
39
39
|
|
40
40
|
class << self
|
@@ -49,11 +49,11 @@ module RuboCop
|
|
49
49
|
file_count > 1 && file_count > config_store.for_pwd.for_all_cops['MaxFilesInCache']
|
50
50
|
end
|
51
51
|
|
52
|
-
def remove_oldest_files(files, dirs,
|
52
|
+
def remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
53
53
|
# Add 1 to half the number of files, so that we remove the file if
|
54
54
|
# there's only 1 left.
|
55
55
|
remove_count = (files.length / 2) + 1
|
56
|
-
puts "Removing the #{remove_count} oldest files from #{
|
56
|
+
puts "Removing the #{remove_count} oldest files from #{rubocop_cache_dir}" if verbose
|
57
57
|
sorted = files.sort_by { |path| File.mtime(path) }
|
58
58
|
remove_files(sorted, dirs, remove_count)
|
59
59
|
rescue Errno::ENOENT
|
@@ -72,9 +72,9 @@ module RuboCop
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
def self.cache_root(config_store)
|
75
|
+
def self.cache_root(config_store, cache_root_override = nil)
|
76
76
|
CacheConfig.root_dir do
|
77
|
-
config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
77
|
+
cache_root_override || config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -84,12 +84,12 @@ module RuboCop
|
|
84
84
|
|
85
85
|
attr_reader :path
|
86
86
|
|
87
|
-
def initialize(file, team, options, config_store,
|
88
|
-
|
89
|
-
|
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)
|
90
90
|
@allow_symlinks_in_cache_location =
|
91
91
|
ResultCache.allow_symlinks_in_cache_location?(config_store)
|
92
|
-
@path = File.join(
|
92
|
+
@path = File.join(rubocop_cache_dir,
|
93
93
|
rubocop_checksum,
|
94
94
|
context_checksum(team, options),
|
95
95
|
file_checksum(file, config_store))
|
@@ -198,20 +198,22 @@ module RuboCop
|
|
198
198
|
end
|
199
199
|
|
200
200
|
def rubocop_extra_features
|
201
|
-
|
202
|
-
|
201
|
+
@rubocop_extra_features ||= begin
|
202
|
+
lib_root = File.join(File.dirname(__FILE__), '..')
|
203
|
+
exe_root = File.join(lib_root, '..', 'exe')
|
203
204
|
|
204
|
-
|
205
|
-
|
206
|
-
|
205
|
+
# Make sure to use an absolute path to prevent errors on Windows
|
206
|
+
# when traversing the relative paths with symlinks.
|
207
|
+
exe_root = File.absolute_path(exe_root)
|
207
208
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
209
|
+
# These are all the files we have `require`d plus everything in the
|
210
|
+
# exe directory. A change to any of them could affect the cop output
|
211
|
+
# so we include them in the cache hash.
|
212
|
+
source_files = $LOADED_FEATURES + Find.find(exe_root).to_a
|
213
|
+
source_files -= ResultCache.rubocop_required_features # Rely on gem versions
|
213
214
|
|
214
|
-
|
215
|
+
source_files
|
216
|
+
end
|
215
217
|
end
|
216
218
|
|
217
219
|
# Return a hash of the options given at invocation, minus the ones that have
|
@@ -10,9 +10,21 @@ module CopHelper
|
|
10
10
|
# The minimum version Prism can parse is 3.3.
|
11
11
|
ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : RuboCop::TargetRuby::DEFAULT_VERSION
|
12
12
|
end
|
13
|
-
let(:parser_engine)
|
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
|
14
17
|
let(:rails_version) { false }
|
15
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
|
+
|
16
28
|
def inspect_source(source, file = nil)
|
17
29
|
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
18
30
|
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
@@ -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)
|
@@ -190,7 +196,10 @@ module RuboCop
|
|
190
196
|
def expect_no_offenses(source, file = nil)
|
191
197
|
offenses = inspect_source(source, file)
|
192
198
|
|
193
|
-
|
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, [])
|
194
203
|
actual_annotations = expected_annotations.with_offense_annotations(offenses)
|
195
204
|
expect(actual_annotations.to_s).to eq(source)
|
196
205
|
end
|
@@ -221,7 +230,8 @@ module RuboCop
|
|
221
230
|
|
222
231
|
# Parsed representation of code annotated with the `^^^ Message` style
|
223
232
|
class AnnotatedSource
|
224
|
-
|
233
|
+
# Ignore escaped carets, don't treat as annotations
|
234
|
+
ANNOTATION_PATTERN = /\A\s*((?<!\\)\^+|\^{}) ?/.freeze
|
225
235
|
ABBREV = "[...]\n"
|
226
236
|
|
227
237
|
# @param annotated_source [String] string passed to the matchers
|
@@ -80,6 +80,21 @@ RSpec.shared_context 'maintain registry' do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
RSpec.shared_context 'maintain default configuration' do
|
84
|
+
around(:each) do |example|
|
85
|
+
# Make a copy of the current configuration that will not change when source hash changes
|
86
|
+
default_configuration = RuboCop::ConfigLoader.default_configuration
|
87
|
+
config = RuboCop::Config.create(
|
88
|
+
default_configuration.to_h.clone,
|
89
|
+
default_configuration.loaded_path
|
90
|
+
)
|
91
|
+
|
92
|
+
example.run
|
93
|
+
|
94
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
83
98
|
# This context assumes nothing and defines `cop`, among others.
|
84
99
|
RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
85
100
|
### Meant to be overridden at will
|
@@ -98,6 +113,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
98
113
|
|
99
114
|
let(:cop_options) { {} }
|
100
115
|
|
116
|
+
let(:gem_versions) { {} }
|
117
|
+
|
101
118
|
### Utilities
|
102
119
|
|
103
120
|
def source_range(range, buffer: source_buffer)
|
@@ -138,7 +155,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
138
155
|
|
139
156
|
allow(config).to receive(:gem_versions_in_target).and_return(
|
140
157
|
{
|
141
|
-
'railties' => rails_version_in_gemfile
|
158
|
+
'railties' => rails_version_in_gemfile,
|
159
|
+
**gem_versions.transform_values { |value| Gem::Version.new(value) }
|
142
160
|
}
|
143
161
|
)
|
144
162
|
|
@@ -160,6 +178,21 @@ RSpec.shared_context 'mock console output' do
|
|
160
178
|
end
|
161
179
|
end
|
162
180
|
|
181
|
+
RSpec.shared_context 'mock obsoletion' do
|
182
|
+
include_context 'mock console output'
|
183
|
+
|
184
|
+
let(:obsoletion_configuration_path) { 'obsoletions.yml' }
|
185
|
+
|
186
|
+
before do
|
187
|
+
RuboCop::ConfigObsoletion.reset!
|
188
|
+
allow(RuboCop::ConfigObsoletion).to receive(:files).and_return([obsoletion_configuration_path])
|
189
|
+
end
|
190
|
+
|
191
|
+
after do
|
192
|
+
RuboCop::ConfigObsoletion.reset!
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
163
196
|
RSpec.shared_context 'lsp' do
|
164
197
|
before do
|
165
198
|
RuboCop::LSP.enable
|
@@ -232,3 +265,7 @@ end
|
|
232
265
|
RSpec.shared_context 'ruby 3.4' do
|
233
266
|
let(:ruby_version) { 3.4 }
|
234
267
|
end
|
268
|
+
|
269
|
+
RSpec.shared_context 'ruby 3.5' do
|
270
|
+
let(:ruby_version) { 3.5 }
|
271
|
+
end
|
@@ -4,18 +4,19 @@
|
|
4
4
|
|
5
5
|
require_relative 'cop_helper'
|
6
6
|
require_relative 'expect_offense'
|
7
|
-
require_relative 'host_environment_simulation_helper'
|
8
7
|
require_relative 'parallel_formatter'
|
9
8
|
require_relative 'shared_contexts'
|
10
9
|
|
11
10
|
RSpec.configure do |config|
|
12
11
|
config.include CopHelper
|
13
|
-
config.include
|
12
|
+
config.include RuboCop::RSpec::ExpectOffense
|
14
13
|
config.include_context 'config', :config
|
15
14
|
config.include_context 'isolated environment', :isolated_environment
|
16
15
|
config.include_context 'isolated bundler', :isolated_bundler
|
17
16
|
config.include_context 'lsp', :lsp
|
18
17
|
config.include_context 'maintain registry', :restore_registry
|
18
|
+
config.include_context 'maintain default configuration', :restore_configuration
|
19
|
+
config.include_context 'mock obsoletion', :mock_obsoletion
|
19
20
|
config.include_context 'ruby 2.0', :ruby20
|
20
21
|
config.include_context 'ruby 2.1', :ruby21
|
21
22
|
config.include_context 'ruby 2.2', :ruby22
|
@@ -29,4 +30,5 @@ RSpec.configure do |config|
|
|
29
30
|
config.include_context 'ruby 3.2', :ruby32
|
30
31
|
config.include_context 'ruby 3.3', :ruby33
|
31
32
|
config.include_context 'ruby 3.4', :ruby34
|
33
|
+
config.include_context 'ruby 3.5', :ruby35
|
32
34
|
end
|
data/lib/rubocop/runner.rb
CHANGED
@@ -20,11 +20,7 @@ module RuboCop
|
|
20
20
|
message = 'Infinite loop detected'
|
21
21
|
message += " in #{path}" if path
|
22
22
|
message += " and caused by #{root_cause}" if root_cause
|
23
|
-
message
|
24
|
-
hint = 'Hint: Please update to the latest RuboCop version if not already in use, ' \
|
25
|
-
"and report a bug if the issue still occurs on this version.\n" \
|
26
|
-
'Please check the latest version at https://rubygems.org/gems/rubocop.'
|
27
|
-
super(Rainbow(message).red + Rainbow(hint).yellow)
|
23
|
+
super(message)
|
28
24
|
end
|
29
25
|
end
|
30
26
|
|
@@ -157,8 +153,11 @@ module RuboCop
|
|
157
153
|
file_started(file)
|
158
154
|
offenses = file_offenses(file)
|
159
155
|
rescue InfiniteCorrectionLoop => e
|
156
|
+
raise e if @options[:raise_cop_error]
|
157
|
+
|
158
|
+
errors << e
|
159
|
+
warn Rainbow(e.message).red
|
160
160
|
offenses = e.offenses.compact.sort.freeze
|
161
|
-
raise
|
162
161
|
ensure
|
163
162
|
file_finished(file, offenses || [])
|
164
163
|
end
|
@@ -490,7 +489,11 @@ module RuboCop
|
|
490
489
|
|
491
490
|
processed_source = if @options[:stdin]
|
492
491
|
ProcessedSource.new(
|
493
|
-
@options[:stdin],
|
492
|
+
@options[:stdin],
|
493
|
+
ruby_version,
|
494
|
+
file,
|
495
|
+
parser_engine: parser_engine,
|
496
|
+
prism_result: @prism_result
|
494
497
|
)
|
495
498
|
else
|
496
499
|
begin
|
data/lib/rubocop/server/cache.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'digest'
|
4
4
|
require 'pathname'
|
5
|
+
require 'yaml'
|
5
6
|
require_relative '../cache_config'
|
6
7
|
require_relative '../config_finder'
|
8
|
+
require_relative '../path_util'
|
7
9
|
|
8
10
|
#
|
9
11
|
# This code is based on https://github.com/fohte/rubocop-daemon.
|
@@ -44,15 +46,20 @@ module RuboCop
|
|
44
46
|
end
|
45
47
|
|
46
48
|
# rubocop:disable Metrics/AbcSize
|
47
|
-
def restart_key
|
49
|
+
def restart_key(args_config_file_path: nil)
|
48
50
|
lockfile_path = LOCKFILE_NAMES.map do |lockfile_name|
|
49
51
|
Pathname(project_dir).join(lockfile_name)
|
50
52
|
end.find(&:exist?)
|
51
53
|
version_data = lockfile_path&.read || RuboCop::Version::STRING
|
52
|
-
config_data = Pathname(
|
53
|
-
|
54
|
+
config_data = Pathname(
|
55
|
+
args_config_file_path || ConfigFinder.find_config_path(Dir.pwd)
|
56
|
+
).read
|
57
|
+
yaml = load_erb_templated_yaml(config_data)
|
54
58
|
|
55
|
-
|
59
|
+
inherit_from_data = inherit_from_data(yaml)
|
60
|
+
require_data = require_data(yaml)
|
61
|
+
|
62
|
+
Digest::SHA1.hexdigest(version_data + config_data + inherit_from_data + require_data)
|
56
63
|
end
|
57
64
|
# rubocop:enable Metrics/AbcSize
|
58
65
|
|
@@ -72,7 +79,6 @@ module RuboCop
|
|
72
79
|
File.expand_path(File.join(cache_root_dir, 'server'))
|
73
80
|
end
|
74
81
|
|
75
|
-
# rubocop:disable Metrics/MethodLength
|
76
82
|
def cache_root_dir_from_config
|
77
83
|
CacheConfig.root_dir do
|
78
84
|
# `RuboCop::ConfigStore` has heavy dependencies, this is a lightweight implementation
|
@@ -83,13 +89,7 @@ module RuboCop
|
|
83
89
|
# Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
|
84
90
|
next unless file_contents.include?('CacheRootDirectory')
|
85
91
|
|
86
|
-
|
87
|
-
yaml_code = ERB.new(file_contents).result
|
88
|
-
|
89
|
-
require 'yaml'
|
90
|
-
config_yaml = YAML.safe_load(
|
91
|
-
yaml_code, permitted_classes: [Regexp, Symbol], aliases: true
|
92
|
-
)
|
92
|
+
config_yaml = load_erb_templated_yaml(file_contents)
|
93
93
|
|
94
94
|
# For compatibility with Ruby 3.0 or lower.
|
95
95
|
if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
|
@@ -99,7 +99,6 @@ module RuboCop
|
|
99
99
|
config_yaml&.dig('AllCops', 'CacheRootDirectory')
|
100
100
|
end
|
101
101
|
end
|
102
|
-
# rubocop:enable Metrics/MethodLength
|
103
102
|
|
104
103
|
def port_path
|
105
104
|
dir.join('port')
|
@@ -164,6 +163,45 @@ module RuboCop
|
|
164
163
|
def write_version_file(version)
|
165
164
|
version_path.write(version)
|
166
165
|
end
|
166
|
+
|
167
|
+
def inherit_from_data(yaml)
|
168
|
+
return '' unless (inherit_from_paths = yaml['inherit_from'])
|
169
|
+
|
170
|
+
Array(inherit_from_paths).map do |path|
|
171
|
+
next if PathUtil.remote_file?(path)
|
172
|
+
|
173
|
+
path = Pathname(path)
|
174
|
+
|
175
|
+
path.exist? ? path.read : ''
|
176
|
+
end.join
|
177
|
+
end
|
178
|
+
|
179
|
+
def require_data(yaml)
|
180
|
+
return '' unless (require_paths = yaml['require'])
|
181
|
+
|
182
|
+
Array(require_paths).map do |path|
|
183
|
+
# NOTE: This targets only relative or absolute path specifications.
|
184
|
+
# For example, specifications like `require: rubocop-performance`,
|
185
|
+
# which can be loaded from `$LOAD_PATH`, are ignored.
|
186
|
+
next unless path.start_with?('.', '/')
|
187
|
+
|
188
|
+
# NOTE: `.so` files are not typically specified, so only `.rb` files are targeted.
|
189
|
+
path = "#{path}.rb" unless path.end_with?('.rb')
|
190
|
+
path = Pathname(path)
|
191
|
+
|
192
|
+
path.exist? ? path.read : ''
|
193
|
+
end.join
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
|
198
|
+
def load_erb_templated_yaml(content)
|
199
|
+
require 'erb'
|
200
|
+
yaml_code = ERB.new(content).result
|
201
|
+
|
202
|
+
require 'yaml'
|
203
|
+
YAML.safe_load(yaml_code, permitted_classes: [Regexp, Symbol], aliases: true)
|
204
|
+
end
|
167
205
|
end
|
168
206
|
end
|
169
207
|
end
|
data/lib/rubocop/server/cli.rb
CHANGED
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
end
|
87
87
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
88
88
|
|
89
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
89
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
90
90
|
def run_command(server_command, detach:)
|
91
91
|
case server_command
|
92
92
|
when '--server'
|
@@ -107,7 +107,7 @@ module RuboCop
|
|
107
107
|
Server::ClientCommand::Status.new.run
|
108
108
|
end
|
109
109
|
end
|
110
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
110
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
111
111
|
|
112
112
|
def fetch_cache_root_path_from(arguments)
|
113
113
|
cache_root = arguments.detect { |argument| argument.start_with?('--cache-root') }
|
@@ -38,6 +38,16 @@ module RuboCop
|
|
38
38
|
warn 'RuboCop server is not running.' unless running
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
def args_config_file_path
|
44
|
+
first_args_config_key_index = ARGV.index { |value| ['-c', '--config'].include?(value) }
|
45
|
+
|
46
|
+
return if first_args_config_key_index.nil?
|
47
|
+
|
48
|
+
ARGV[first_args_config_key_index + 1]
|
49
|
+
end
|
50
|
+
end
|
41
51
|
end
|
42
52
|
end
|
43
53
|
end
|