rubocop 1.66.0 → 1.72.1
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 +2 -2
- data/config/default.yml +160 -14
- data/config/internal_affairs.yml +11 -0
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +6 -10
- data/lib/rubocop/config.rb +21 -20
- data/lib/rubocop/config_loader.rb +62 -16
- data/lib/rubocop/config_loader_resolver.rb +36 -11
- data/lib/rubocop/config_validator.rb +25 -18
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- data/lib/rubocop/cop/base.rb +13 -3
- 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/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +1 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/cop.rb +8 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -2
- 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 +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +6 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- 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 +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- 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 +3 -8
- 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_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +11 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +71 -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 +119 -4
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- 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 +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- 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 +6 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- 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 +4 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- 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/ensure_return.rb +1 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +20 -9
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +11 -5
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +8 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
- 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/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -8
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -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 +2 -2
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- 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 +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +74 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -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 +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +8 -11
- 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 +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +8 -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/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -10
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +3 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +0 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +12 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/predicate_name.rb +45 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +3 -4
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +96 -28
- data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
- 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 +78 -22
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +49 -19
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_compact.rb +10 -10
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +9 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +17 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +26 -26
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- 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 +5 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -14
- data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +16 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +9 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +8 -5
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +28 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -8
- data/lib/rubocop/cop/style/map_into_array.rb +61 -12
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +32 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +29 -4
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -7
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
- 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/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- 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_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +39 -24
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- 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_format.rb +222 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -17
- data/lib/rubocop/cop/style/redundant_parentheses.rb +38 -24
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -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_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +8 -15
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/require_order.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -4
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +105 -51
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +10 -7
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +2 -2
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
- 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 +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- 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 +8 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +7 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +18 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +100 -51
- data/lib/rubocop/directive_comment.rb +44 -10
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -48
- data/lib/rubocop/lsp/server.rb +0 -3
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/plugin/configuration_integrator.rb +141 -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 +39 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +7 -0
- data/lib/rubocop/rspec/expect_offense.rb +7 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -1
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/runner.rb +22 -12
- data/lib/rubocop/server/cache.rb +39 -1
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/core.rb +1 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +28 -13
- data/lib/rubocop/version.rb +42 -6
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +29 -0
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +75 -19
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -4,6 +4,8 @@ module RuboCop
|
|
4
4
|
# This class parses the special `rubocop:disable` comments in a source
|
5
5
|
# and provides a way to check if each cop is enabled at arbitrary line.
|
6
6
|
class CommentConfig
|
7
|
+
extend SimpleForwardable
|
8
|
+
|
7
9
|
CONFIG_DISABLED_LINE_RANGE_MIN = -Float::INFINITY
|
8
10
|
|
9
11
|
# This class provides an API compatible with RuboCop::DirectiveComment
|
@@ -27,19 +29,13 @@ module RuboCop
|
|
27
29
|
|
28
30
|
attr_reader :processed_source
|
29
31
|
|
32
|
+
def_delegators :@processed_source, :config, :registry
|
33
|
+
|
30
34
|
def initialize(processed_source)
|
31
35
|
@processed_source = processed_source
|
32
36
|
@no_directives = !processed_source.raw_source.include?('rubocop')
|
33
37
|
end
|
34
38
|
|
35
|
-
def config
|
36
|
-
@processed_source.config
|
37
|
-
end
|
38
|
-
|
39
|
-
def registry
|
40
|
-
@processed_source.registry
|
41
|
-
end
|
42
|
-
|
43
39
|
def cop_enabled_at_line?(cop, line_number)
|
44
40
|
cop = cop.cop_name if cop.respond_to?(:cop_name)
|
45
41
|
disabled_line_ranges = cop_disabled_line_ranges[cop]
|
@@ -91,7 +87,7 @@ module RuboCop
|
|
91
87
|
next unless directive.enabled?
|
92
88
|
next if directive.all_cops?
|
93
89
|
|
94
|
-
cops.merge(directive.
|
90
|
+
cops.merge(directive.raw_cop_names)
|
95
91
|
end
|
96
92
|
cops
|
97
93
|
end
|
@@ -209,7 +205,7 @@ module RuboCop
|
|
209
205
|
directive.cop_names.each do |name|
|
210
206
|
if directive.disabled?
|
211
207
|
names[name] += 1
|
212
|
-
elsif
|
208
|
+
elsif names[name].positive?
|
213
209
|
names[name] -= 1
|
214
210
|
else
|
215
211
|
extras[directive.comment] << name
|
data/lib/rubocop/config.rb
CHANGED
@@ -12,9 +12,11 @@ module RuboCop
|
|
12
12
|
class Config
|
13
13
|
include PathUtil
|
14
14
|
include FileFinder
|
15
|
+
extend SimpleForwardable
|
15
16
|
|
16
17
|
CopConfig = Struct.new(:name, :metadata)
|
17
18
|
|
19
|
+
EMPTY_CONFIG = {}.freeze
|
18
20
|
DEFAULT_RAILS_VERSION = 5.0
|
19
21
|
attr_reader :loaded_path
|
20
22
|
|
@@ -43,6 +45,10 @@ module RuboCop
|
|
43
45
|
end
|
44
46
|
# rubocop:enable Metrics/AbcSize
|
45
47
|
|
48
|
+
def loaded_plugins
|
49
|
+
@loaded_plugins ||= ConfigLoader.loaded_plugins
|
50
|
+
end
|
51
|
+
|
46
52
|
def loaded_features
|
47
53
|
@loaded_features ||= ConfigLoader.loaded_features
|
48
54
|
end
|
@@ -59,22 +65,9 @@ module RuboCop
|
|
59
65
|
self
|
60
66
|
end
|
61
67
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
def #{method}(...) # def key?(...)
|
66
|
-
@hash.#{method}(...) # @hash.key?(...)
|
67
|
-
end # end
|
68
|
-
RUBY
|
69
|
-
end
|
70
|
-
|
71
|
-
def validate(...)
|
72
|
-
@validator.validate(...)
|
73
|
-
end
|
74
|
-
|
75
|
-
def target_ruby_version
|
76
|
-
@validator.target_ruby_version
|
77
|
-
end
|
68
|
+
def_delegators :@hash, :[], :[]=, :delete, :dig, :each, :key?, :keys, :each_key,
|
69
|
+
:fetch, :map, :merge, :replace, :to_h, :to_hash, :transform_values
|
70
|
+
def_delegators :@validator, :validate, :target_ruby_version
|
78
71
|
|
79
72
|
def to_s
|
80
73
|
@to_s ||= @hash.to_s
|
@@ -92,10 +85,7 @@ module RuboCop
|
|
92
85
|
|
93
86
|
def make_excludes_absolute
|
94
87
|
each_key do |key|
|
95
|
-
|
96
|
-
next unless self[key]['Exclude']
|
97
|
-
|
98
|
-
self[key]['Exclude'].map! do |exclude_elem|
|
88
|
+
dig(key, 'Exclude')&.map! do |exclude_elem|
|
99
89
|
if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
|
100
90
|
File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem))
|
101
91
|
else
|
@@ -135,6 +125,13 @@ module RuboCop
|
|
135
125
|
@for_cop[cop]
|
136
126
|
end
|
137
127
|
|
128
|
+
# @return [Config, Hash] for the given cop / cop name.
|
129
|
+
# If the given cop is enabled, returns its configuration hash.
|
130
|
+
# Otherwise, returns an empty hash.
|
131
|
+
def for_enabled_cop(cop)
|
132
|
+
cop_enabled?(cop) ? for_cop(cop) : EMPTY_CONFIG
|
133
|
+
end
|
134
|
+
|
138
135
|
# @return [Config] for the given cop merged with that of its department (if any)
|
139
136
|
# Note: the 'Enabled' attribute is same as that returned by `for_cop`
|
140
137
|
def for_badge(badge)
|
@@ -171,6 +168,10 @@ module RuboCop
|
|
171
168
|
@for_all_cops ||= self['AllCops'] || {}
|
172
169
|
end
|
173
170
|
|
171
|
+
def cop_enabled?(name)
|
172
|
+
!!for_cop(name)['Enabled']
|
173
|
+
end
|
174
|
+
|
174
175
|
def disabled_new_cops?
|
175
176
|
for_all_cops['NewCops'] == 'disable'
|
176
177
|
end
|
@@ -33,22 +33,33 @@ module RuboCop
|
|
33
33
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
34
34
|
:ignore_unrecognized_cops
|
35
35
|
attr_writer :default_configuration
|
36
|
-
attr_reader :loaded_features
|
36
|
+
attr_reader :loaded_plugins, :loaded_features
|
37
37
|
|
38
38
|
alias debug? debug
|
39
39
|
alias ignore_parent_exclusion? ignore_parent_exclusion
|
40
40
|
|
41
41
|
def clear_options
|
42
42
|
@debug = nil
|
43
|
+
@loaded_plugins = Set.new
|
43
44
|
@loaded_features = Set.new
|
45
|
+
@disable_pending_cops = nil
|
46
|
+
@enable_pending_cops = nil
|
47
|
+
@ignore_parent_exclusion = nil
|
48
|
+
@ignore_unrecognized_cops = nil
|
44
49
|
FileFinder.root_level = nil
|
45
50
|
end
|
46
51
|
|
52
|
+
# rubocop:disable Metrics/AbcSize
|
47
53
|
def load_file(file, check: true)
|
48
54
|
path = file_path(file)
|
49
55
|
|
50
56
|
hash = load_yaml_configuration(path)
|
51
57
|
|
58
|
+
rubocop_config = Config.create(hash, path, check: false)
|
59
|
+
plugins = hash.delete('plugins')
|
60
|
+
loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
|
61
|
+
add_loaded_plugins(loaded_plugins)
|
62
|
+
|
52
63
|
loaded_features = resolver.resolve_requires(path, hash)
|
53
64
|
add_loaded_features(loaded_features)
|
54
65
|
|
@@ -63,12 +74,13 @@ module RuboCop
|
|
63
74
|
|
64
75
|
Config.create(hash, path, check: check)
|
65
76
|
end
|
77
|
+
# rubocop:enable Metrics/AbcSize
|
66
78
|
|
67
79
|
def load_yaml_configuration(absolute_path)
|
68
80
|
file_contents = read_file(absolute_path)
|
69
81
|
yaml_code = Dir.chdir(File.dirname(absolute_path)) { ERB.new(file_contents).result }
|
70
|
-
check_duplication(yaml_code, absolute_path)
|
71
|
-
hash =
|
82
|
+
yaml_tree = check_duplication(yaml_code, absolute_path)
|
83
|
+
hash = yaml_tree_to_hash(yaml_tree) || {}
|
72
84
|
|
73
85
|
puts "configuration from #{absolute_path}" if debug?
|
74
86
|
|
@@ -151,14 +163,35 @@ module RuboCop
|
|
151
163
|
end
|
152
164
|
end
|
153
165
|
|
154
|
-
#
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
166
|
+
# This API is primarily intended for testing and documenting plugins.
|
167
|
+
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
168
|
+
# so this API is usually not needed. It is intended to be used only when implementing tests
|
169
|
+
# that do not use `rubocop/rspec/support`.
|
170
|
+
# rubocop:disable Metrics/MethodLength
|
171
|
+
def inject_defaults!(config_yml_path)
|
172
|
+
if Pathname(config_yml_path).directory?
|
173
|
+
# TODO: Since the warning noise is expected to be high until some time after the release,
|
174
|
+
# warnings will only be issued when `RUBYOPT=-w` is specified.
|
175
|
+
# To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
|
176
|
+
# Eventually, `project_root` will no longer be accepted.
|
177
|
+
if $VERBOSE
|
178
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
179
|
+
Use config YAML file path instead of project root directory.
|
180
|
+
e.g., `path/to/config/default.yml`
|
181
|
+
MESSAGE
|
182
|
+
end
|
183
|
+
# NOTE: For compatibility.
|
184
|
+
project_root = config_yml_path
|
185
|
+
path = File.join(project_root, 'config', 'default.yml')
|
186
|
+
config = load_file(path)
|
187
|
+
else
|
188
|
+
hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
|
189
|
+
config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
|
190
|
+
end
|
191
|
+
|
192
|
+
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
161
193
|
end
|
194
|
+
# rubocop:enable Metrics/MethodLength
|
162
195
|
|
163
196
|
# Returns the path RuboCop inferred as the root of the project. No file
|
164
197
|
# searches will go past this directory.
|
@@ -192,6 +225,13 @@ module RuboCop
|
|
192
225
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
193
226
|
end
|
194
227
|
|
228
|
+
# @api private
|
229
|
+
# Used to add plugins that were required inside a config or from
|
230
|
+
# the CLI using `--plugin`.
|
231
|
+
def add_loaded_plugins(loaded_plugins)
|
232
|
+
@loaded_plugins.merge(Array(loaded_plugins))
|
233
|
+
end
|
234
|
+
|
195
235
|
# @api private
|
196
236
|
# Used to add features that were required inside a config or from
|
197
237
|
# the CLI using `--require`.
|
@@ -235,8 +275,8 @@ module RuboCop
|
|
235
275
|
raise ConfigNotFoundError, "Configuration file not found: #{absolute_path}"
|
236
276
|
end
|
237
277
|
|
238
|
-
def
|
239
|
-
|
278
|
+
def yaml_tree_to_hash(yaml_tree)
|
279
|
+
yaml_tree_to_hash!(yaml_tree)
|
240
280
|
rescue ::StandardError
|
241
281
|
if defined?(::SafeYAML)
|
242
282
|
raise 'SafeYAML is unmaintained, no longer needed and should be removed'
|
@@ -245,10 +285,16 @@ module RuboCop
|
|
245
285
|
raise
|
246
286
|
end
|
247
287
|
|
248
|
-
def
|
249
|
-
|
250
|
-
|
251
|
-
|
288
|
+
def yaml_tree_to_hash!(yaml_tree)
|
289
|
+
return nil unless yaml_tree
|
290
|
+
|
291
|
+
# Optimization: Because we checked for duplicate keys, we already have the
|
292
|
+
# yaml tree and don't need to parse it again.
|
293
|
+
# Also see https://github.com/ruby/psych/blob/v5.1.2/lib/psych.rb#L322-L336
|
294
|
+
class_loader = YAML::ClassLoader::Restricted.new(%w[Regexp Symbol], [])
|
295
|
+
scanner = YAML::ScalarScanner.new(class_loader)
|
296
|
+
visitor = YAML::Visitors::ToRuby.new(scanner, class_loader)
|
297
|
+
visitor.accept(yaml_tree)
|
252
298
|
end
|
253
299
|
end
|
254
300
|
|
@@ -2,16 +2,34 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'yaml'
|
5
|
+
require_relative 'plugin'
|
5
6
|
|
6
7
|
module RuboCop
|
7
8
|
# A help class for ConfigLoader that handles configuration resolution.
|
8
9
|
# @api private
|
9
10
|
class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
|
11
|
+
def resolve_plugins(rubocop_config, plugins)
|
12
|
+
return if (plugins = Array(plugins)).empty?
|
13
|
+
|
14
|
+
Plugin.integrate_plugins(rubocop_config, plugins)
|
15
|
+
end
|
16
|
+
|
10
17
|
def resolve_requires(path, hash)
|
11
18
|
config_dir = File.dirname(path)
|
12
19
|
hash.delete('require').tap do |loaded_features|
|
13
20
|
Array(loaded_features).each do |feature|
|
14
|
-
|
21
|
+
if Plugin.plugin_capable?(feature)
|
22
|
+
# NOTE: Compatibility for before plugins style.
|
23
|
+
warn Rainbow(<<~MESSAGE).yellow
|
24
|
+
#{feature} extension supports plugin, specify `plugins: #{feature}` instead of `require: #{feature}` in #{path}.
|
25
|
+
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
|
26
|
+
MESSAGE
|
27
|
+
rubocop_config = Config.create(hash, path, check: false)
|
28
|
+
|
29
|
+
resolve_plugins(rubocop_config, feature)
|
30
|
+
else
|
31
|
+
FeatureLoader.load(config_directory_path: config_dir, feature: feature)
|
32
|
+
end
|
15
33
|
end
|
16
34
|
end
|
17
35
|
end
|
@@ -157,20 +175,27 @@ module RuboCop
|
|
157
175
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
158
176
|
return false if inherited_file.start_with?('..') # Legitimate override
|
159
177
|
return false if base_hash[key] == derived_hash[key] # Same value
|
160
|
-
return false if remote_file?(inherited_file) # Can't change
|
178
|
+
return false if PathUtil.remote_file?(inherited_file) # Can't change
|
161
179
|
|
162
180
|
Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
|
163
181
|
end
|
164
182
|
|
165
183
|
def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
184
|
+
# If the file being considered is remote, don't bother checking for duplicates
|
185
|
+
return if remote_config?(opts[:file])
|
186
|
+
|
166
187
|
return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
|
167
188
|
|
168
189
|
inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
|
169
|
-
return if base_hash[key].is_a?(Array) && inherit_mode
|
190
|
+
return if base_hash[key].is_a?(Array) && inherit_mode&.include?(key)
|
191
|
+
|
192
|
+
puts duplicate_setting_warning(opts, key)
|
193
|
+
end
|
170
194
|
|
171
|
-
|
172
|
-
|
173
|
-
|
195
|
+
def duplicate_setting_warning(opts, key)
|
196
|
+
"#{PathUtil.smart_path(opts[:file])}: " \
|
197
|
+
"#{opts[:cop_name]}:#{key} overrides " \
|
198
|
+
"the same parameter in #{opts[:inherited_file]}"
|
174
199
|
end
|
175
200
|
|
176
201
|
def determine_inherit_mode(hash, key)
|
@@ -194,11 +219,11 @@ module RuboCop
|
|
194
219
|
end
|
195
220
|
|
196
221
|
def should_merge?(mode, key)
|
197
|
-
mode && mode['merge']
|
222
|
+
mode && mode['merge']&.include?(key)
|
198
223
|
end
|
199
224
|
|
200
225
|
def should_override?(mode, key)
|
201
|
-
mode && mode['override']
|
226
|
+
mode && mode['override']&.include?(key)
|
202
227
|
end
|
203
228
|
|
204
229
|
def merge_hashes?(base_hash, derived_hash, key)
|
@@ -218,7 +243,7 @@ module RuboCop
|
|
218
243
|
end
|
219
244
|
|
220
245
|
def inherited_file(path, inherit_from, file)
|
221
|
-
if remote_file?(inherit_from)
|
246
|
+
if PathUtil.remote_file?(inherit_from)
|
222
247
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
223
248
|
RemoteConfig.new(inherit_from, File.dirname(path))
|
224
249
|
elsif Pathname.new(inherit_from).absolute?
|
@@ -238,8 +263,8 @@ module RuboCop
|
|
238
263
|
end
|
239
264
|
end
|
240
265
|
|
241
|
-
def
|
242
|
-
|
266
|
+
def remote_config?(file)
|
267
|
+
file.is_a?(RemoteConfig)
|
243
268
|
end
|
244
269
|
|
245
270
|
def handle_disabled_by_default(config, new_default_configuration)
|
@@ -3,9 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
# Handles validation of configuration, for example cop names, parameter
|
5
5
|
# names, and Ruby versions.
|
6
|
-
|
6
|
+
# rubocop:disable Metrics/ClassLength
|
7
|
+
class ConfigValidator
|
8
|
+
extend SimpleForwardable
|
9
|
+
|
7
10
|
# @api private
|
8
|
-
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
11
|
+
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
12
|
+
Enabled].freeze
|
9
13
|
# @api private
|
10
14
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
11
15
|
VersionAdded VersionChanged VersionRemoved
|
@@ -19,20 +23,14 @@ module RuboCop
|
|
19
23
|
CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
|
20
24
|
private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
|
21
25
|
|
26
|
+
def_delegators :@config, :smart_loaded_path, :for_all_cops
|
27
|
+
|
22
28
|
def initialize(config)
|
23
29
|
@config = config
|
24
30
|
@config_obsoletion = ConfigObsoletion.new(config)
|
25
31
|
@target_ruby = TargetRuby.new(config)
|
26
32
|
end
|
27
33
|
|
28
|
-
def smart_loaded_path
|
29
|
-
@config.smart_loaded_path
|
30
|
-
end
|
31
|
-
|
32
|
-
def for_all_cops
|
33
|
-
@config.for_all_cops
|
34
|
-
end
|
35
|
-
|
36
34
|
def validate
|
37
35
|
check_cop_config_value(@config)
|
38
36
|
reject_conflicting_safe_settings
|
@@ -44,8 +42,9 @@ module RuboCop
|
|
44
42
|
ConfigLoader.default_configuration.key?(key)
|
45
43
|
end
|
46
44
|
|
47
|
-
|
45
|
+
validate_parameter_shape(valid_cop_names)
|
48
46
|
|
47
|
+
check_obsoletions
|
49
48
|
alert_about_unrecognized_cops(invalid_cop_names)
|
50
49
|
validate_new_cops_parameter
|
51
50
|
validate_parameter_names(valid_cop_names)
|
@@ -67,12 +66,6 @@ module RuboCop
|
|
67
66
|
target_ruby.version
|
68
67
|
end
|
69
68
|
|
70
|
-
def validate_section_presence(name)
|
71
|
-
return unless @config.key?(name) && @config[name].nil?
|
72
|
-
|
73
|
-
raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
|
74
|
-
end
|
75
|
-
|
76
69
|
private
|
77
70
|
|
78
71
|
attr_reader :target_ruby
|
@@ -180,9 +173,22 @@ module RuboCop
|
|
180
173
|
raise ValidationError, message
|
181
174
|
end
|
182
175
|
|
176
|
+
def validate_parameter_shape(valid_cop_names)
|
177
|
+
valid_cop_names.each do |name|
|
178
|
+
if @config[name].nil?
|
179
|
+
raise ValidationError, "empty section #{name.inspect} found in #{smart_loaded_path}"
|
180
|
+
elsif !@config[name].is_a?(Hash)
|
181
|
+
raise ValidationError, <<~MESSAGE
|
182
|
+
The configuration for #{name.inspect} in #{smart_loaded_path} is not a Hash.
|
183
|
+
|
184
|
+
Found: #{@config[name].inspect}
|
185
|
+
MESSAGE
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
183
190
|
def validate_parameter_names(valid_cop_names)
|
184
191
|
valid_cop_names.each do |name|
|
185
|
-
validate_section_presence(name)
|
186
192
|
each_invalid_parameter(name) do |param, supported_params|
|
187
193
|
warn Rainbow(<<~MESSAGE).yellow
|
188
194
|
Warning: #{name} does not support #{param} parameter.
|
@@ -280,4 +286,5 @@ module RuboCop
|
|
280
286
|
"is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
|
281
287
|
end
|
282
288
|
end
|
289
|
+
# rubocop:enable Metrics/ClassLength
|
283
290
|
end
|
@@ -49,15 +49,31 @@ module RuboCop
|
|
49
49
|
private
|
50
50
|
|
51
51
|
def disable_offense(offense_range)
|
52
|
-
|
52
|
+
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
53
|
+
range_overlaps_offense?(offense_range, range)
|
54
|
+
end
|
53
55
|
|
54
|
-
if
|
55
|
-
disable_offense_before_and_after(range_by_lines(
|
56
|
+
if unbreakable_range
|
57
|
+
disable_offense_before_and_after(range_by_lines(unbreakable_range))
|
56
58
|
else
|
57
59
|
disable_offense_with_eol_or_surround_comment(offense_range)
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
63
|
+
def multiline_ranges(offense_range)
|
64
|
+
return if offense_range.empty?
|
65
|
+
|
66
|
+
processed_source.ast.each_node.filter_map do |node|
|
67
|
+
if surrounding_heredoc?(node)
|
68
|
+
heredoc_range(node)
|
69
|
+
elsif string_continuation?(node)
|
70
|
+
range_by_lines(node.source_range)
|
71
|
+
elsif surrounding_percent_array?(node) || multiline_string?(node)
|
72
|
+
node.source_range
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
61
77
|
def disable_offense_with_eol_or_surround_comment(range)
|
62
78
|
eol_comment = " # rubocop:todo #{cop_name}"
|
63
79
|
needed_line_length = (range.source_line + eol_comment).length
|
@@ -69,27 +85,28 @@ module RuboCop
|
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
88
|
+
def range_overlaps_offense?(offense_range, range)
|
89
|
+
offense_range.begin_pos > range.begin_pos && range.overlaps?(offense_range)
|
90
|
+
end
|
91
|
+
|
92
|
+
def surrounding_heredoc?(node)
|
93
|
+
node.type?(:str, :dstr, :xstr) && node.heredoc?
|
94
|
+
end
|
75
95
|
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
heredoc_nodes.map { |node| node.source_range.join(node.loc.heredoc_end) }
|
80
|
-
.find { |range| range.contains?(offense_range) }
|
96
|
+
def heredoc_range(node)
|
97
|
+
node.source_range.join(node.loc.heredoc_end)
|
81
98
|
end
|
82
99
|
|
83
|
-
def surrounding_percent_array(
|
84
|
-
|
100
|
+
def surrounding_percent_array?(node)
|
101
|
+
node.array_type? && node.percent_literal?
|
102
|
+
end
|
85
103
|
|
86
|
-
|
87
|
-
|
88
|
-
|
104
|
+
def string_continuation?(node)
|
105
|
+
node.type?(:str, :dstr, :xstr) && node.source.match?(/\\\s*$/)
|
106
|
+
end
|
89
107
|
|
90
|
-
|
91
|
-
|
92
|
-
end
|
108
|
+
def multiline_string?(node)
|
109
|
+
node.dstr_type? && node.multiline?
|
93
110
|
end
|
94
111
|
|
95
112
|
def range_of_first_line(range)
|
data/lib/rubocop/cop/base.rb
CHANGED
@@ -60,7 +60,7 @@ module RuboCop
|
|
60
60
|
[]
|
61
61
|
end
|
62
62
|
|
63
|
-
# Returns
|
63
|
+
# Returns a url to view this cops documentation online.
|
64
64
|
# Requires 'DocumentationBaseURL' to be set for your department.
|
65
65
|
# Will follow the convention of RuboCops own documentation structure,
|
66
66
|
# overwrite this method to accommodate your custom layout.
|
@@ -261,6 +261,12 @@ module RuboCop
|
|
261
261
|
@config.target_ruby_version
|
262
262
|
end
|
263
263
|
|
264
|
+
# Returns a gems locked versions (i.e. from Gemfile.lock or gems.locked)
|
265
|
+
# @returns [Gem::Version | nil] The locked gem version, or nil if the gem is not present.
|
266
|
+
def target_gem_version(gem_name)
|
267
|
+
@config.gem_versions_in_target && @config.gem_versions_in_target[gem_name]
|
268
|
+
end
|
269
|
+
|
264
270
|
def parser_engine
|
265
271
|
@config.parser_engine
|
266
272
|
end
|
@@ -322,8 +328,12 @@ module RuboCop
|
|
322
328
|
# @api private
|
323
329
|
def self.callbacks_needed
|
324
330
|
@callbacks_needed ||= public_instance_methods.select do |m|
|
325
|
-
|
326
|
-
|
331
|
+
# OPTIMIZE: Check method existence first to make fewer `start_with?` calls.
|
332
|
+
# At the time of writing this comment, this excludes 98 of ~104 methods.
|
333
|
+
# `start_with?` with two string arguments instead of a regex is faster
|
334
|
+
# in this specific case as well.
|
335
|
+
!Base.method_defined?(m) && # exclude standard "callbacks" like 'on_begin_investigation'
|
336
|
+
m.start_with?('on_', 'after_')
|
327
337
|
end
|
328
338
|
end
|
329
339
|
# rubocop:enable Layout/ClassStructure
|
@@ -66,14 +66,14 @@ module RuboCop
|
|
66
66
|
|
67
67
|
def conditional_declaration?(nodes)
|
68
68
|
parent = nodes[0].each_ancestor.find { |ancestor| !ancestor.begin_type? }
|
69
|
-
return false unless parent&.
|
69
|
+
return false unless parent&.type?(:if, :when)
|
70
70
|
|
71
71
|
root_conditional_node = parent.if_type? ? parent : parent.parent
|
72
72
|
nodes.all? { |node| within_conditional?(node, root_conditional_node) }
|
73
73
|
end
|
74
74
|
|
75
75
|
def within_conditional?(node, conditional_node)
|
76
|
-
conditional_node.branches.any? do |branch|
|
76
|
+
conditional_node.branches.compact.any? do |branch|
|
77
77
|
branch == node || branch.child_nodes.include?(node)
|
78
78
|
end
|
79
79
|
end
|
@@ -27,7 +27,6 @@ module RuboCop
|
|
27
27
|
# Project contains gems.rb and gems.locked files
|
28
28
|
class GemFilename < Base
|
29
29
|
include ConfigurableEnforcedStyle
|
30
|
-
include RangeHelp
|
31
30
|
|
32
31
|
MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required ' \
|
33
32
|
'(file path: %<file_path>s).'
|
@@ -56,6 +56,7 @@ module RuboCop
|
|
56
56
|
|
57
57
|
REQUIRED_MSG = 'Gem version specification is required.'
|
58
58
|
FORBIDDEN_MSG = 'Gem version specification is forbidden.'
|
59
|
+
RESTRICT_ON_SEND = %i[gem].freeze
|
59
60
|
VERSION_SPECIFICATION_REGEX = /^\s*[~<>=]*\s*[0-9.]+/.freeze
|
60
61
|
|
61
62
|
# @!method includes_version_specification?(node)
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -22,6 +22,14 @@ module RuboCop
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.inherited(_subclass)
|
26
|
+
super
|
27
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
28
|
+
Inheriting from `RuboCop::Cop::Cop` is deprecated. Use `RuboCop::Cop::Base` instead.
|
29
|
+
For more information, see https://docs.rubocop.org/rubocop/v1_upgrade_notes.html.
|
30
|
+
WARNING
|
31
|
+
end
|
32
|
+
|
25
33
|
def self.support_autocorrect?
|
26
34
|
method_defined?(:autocorrect)
|
27
35
|
end
|