rubocop 1.67.0 → 1.82.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 +23 -19
- data/config/default.yml +403 -75
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +12 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- 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/cli.rb +21 -5
- data/lib/rubocop/comment_config.rb +64 -19
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +58 -49
- data/lib/rubocop/config_loader_resolver.rb +43 -16
- 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_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -28
- data/lib/rubocop/cop/base.rb +7 -1
- 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/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +9 -19
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +10 -5
- 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 +142 -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 +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 +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- 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 +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- 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/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/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 +6 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +5 -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 +10 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -4
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +20 -8
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- 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 +163 -11
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -7
- 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 +3 -11
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
- data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- 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 +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +51 -4
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -5
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- 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/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- 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/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -7
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +6 -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 +3 -3
- 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 +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -8
- 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/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +47 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- 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 +88 -0
- 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 +54 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +47 -17
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -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 +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- 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 +5 -2
- 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/abc_size_calculator.rb +5 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- 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_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +47 -0
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- 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 +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
- 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 +48 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +3 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +8 -10
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- 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 -4
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -8
- 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 +28 -9
- 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 +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- 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/json_load.rb +33 -11
- 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 +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- 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 +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_equality.rb +11 -13
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +53 -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 +115 -0
- 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 +20 -3
- 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 +50 -42
- data/lib/rubocop/cop/style/constant_visibility.rb +19 -23
- 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 +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- 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 +0 -6
- 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 +17 -4
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +1 -1
- 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/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -14
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- 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 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +39 -12
- 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 +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- 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_arguments_merging.rb +67 -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 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +11 -3
- 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 +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +12 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +35 -4
- 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 +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/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/module_member_existence_check.rb +74 -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_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +3 -13
- 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_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +16 -8
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +43 -40
- 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 +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +5 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- 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 +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -10
- 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 +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +24 -8
- 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 +15 -4
- 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 +75 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +68 -21
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +15 -15
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- 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 +1 -1
- data/lib/rubocop/cop/util.rb +14 -8
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +88 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +21 -6
- 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 +185 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +37 -24
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +31 -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 +5 -2
- data/lib/rubocop/remote_config.rb +7 -8
- data/lib/rubocop/result_cache.rb +61 -48
- 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 +35 -18
- 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 +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +45 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +92 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -22,37 +22,40 @@ module RuboCop
|
|
|
22
22
|
class << self
|
|
23
23
|
include FileFinder
|
|
24
24
|
|
|
25
|
-
PENDING_BANNER = <<~BANNER
|
|
26
|
-
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
|
27
|
-
|
|
28
|
-
Please also note that you can opt-in to new cops by default by adding this to your config:
|
|
29
|
-
AllCops:
|
|
30
|
-
NewCops: enable
|
|
31
|
-
BANNER
|
|
32
|
-
|
|
33
25
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
|
34
|
-
:ignore_unrecognized_cops
|
|
26
|
+
:ignore_unrecognized_cops, :cache_root
|
|
35
27
|
attr_writer :default_configuration
|
|
36
|
-
attr_reader :loaded_features
|
|
28
|
+
attr_reader :loaded_plugins, :loaded_features
|
|
37
29
|
|
|
38
30
|
alias debug? debug
|
|
39
31
|
alias ignore_parent_exclusion? ignore_parent_exclusion
|
|
40
32
|
|
|
41
33
|
def clear_options
|
|
42
34
|
@debug = nil
|
|
35
|
+
@loaded_plugins = Set.new
|
|
43
36
|
@loaded_features = Set.new
|
|
37
|
+
@disable_pending_cops = nil
|
|
38
|
+
@enable_pending_cops = nil
|
|
39
|
+
@ignore_parent_exclusion = nil
|
|
40
|
+
@ignore_unrecognized_cops = nil
|
|
41
|
+
@cache_root = nil
|
|
44
42
|
FileFinder.root_level = nil
|
|
45
43
|
end
|
|
46
44
|
|
|
45
|
+
# rubocop:disable Metrics/AbcSize
|
|
47
46
|
def load_file(file, check: true)
|
|
48
47
|
path = file_path(file)
|
|
49
48
|
|
|
50
49
|
hash = load_yaml_configuration(path)
|
|
51
50
|
|
|
51
|
+
rubocop_config = Config.create(hash, path, check: false)
|
|
52
|
+
plugins = hash.delete('plugins')
|
|
53
|
+
loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
|
|
54
|
+
add_loaded_plugins(loaded_plugins)
|
|
55
|
+
|
|
52
56
|
loaded_features = resolver.resolve_requires(path, hash)
|
|
53
57
|
add_loaded_features(loaded_features)
|
|
54
58
|
|
|
55
|
-
resolver.override_department_setting_for_cops({}, hash)
|
|
56
59
|
resolver.resolve_inheritance_from_gems(hash)
|
|
57
60
|
resolver.resolve_inheritance(path, hash, file, debug?)
|
|
58
61
|
hash.delete('inherit_from')
|
|
@@ -63,6 +66,7 @@ module RuboCop
|
|
|
63
66
|
|
|
64
67
|
Config.create(hash, path, check: check)
|
|
65
68
|
end
|
|
69
|
+
# rubocop:enable Metrics/AbcSize
|
|
66
70
|
|
|
67
71
|
def load_yaml_configuration(absolute_path)
|
|
68
72
|
file_contents = read_file(absolute_path)
|
|
@@ -72,7 +76,9 @@ module RuboCop
|
|
|
72
76
|
|
|
73
77
|
puts "configuration from #{absolute_path}" if debug?
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
unless hash.is_a?(Hash)
|
|
80
|
+
raise(ValidationError, "Malformed configuration in #{absolute_path}")
|
|
81
|
+
end
|
|
76
82
|
|
|
77
83
|
hash
|
|
78
84
|
end
|
|
@@ -80,8 +86,12 @@ module RuboCop
|
|
|
80
86
|
def add_missing_namespaces(path, hash)
|
|
81
87
|
# Using `hash.each_key` will cause the
|
|
82
88
|
# `can't add a new key into hash during iteration` error
|
|
89
|
+
obsoletion = ConfigObsoletion.new(hash)
|
|
90
|
+
|
|
83
91
|
hash_keys = hash.keys
|
|
84
92
|
hash_keys.each do |key|
|
|
93
|
+
next if obsoletion.deprecated_cop_name?(key)
|
|
94
|
+
|
|
85
95
|
q = Cop::Registry.qualified_cop_name(key, path)
|
|
86
96
|
next if q == key
|
|
87
97
|
|
|
@@ -117,21 +127,7 @@ module RuboCop
|
|
|
117
127
|
add_excludes_from_files(config, config_file)
|
|
118
128
|
end
|
|
119
129
|
|
|
120
|
-
merge_with_default(config, config_file)
|
|
121
|
-
unless possible_new_cops?(merged_config)
|
|
122
|
-
pending_cops = pending_cops_only_qualified(merged_config.pending_cops)
|
|
123
|
-
warn_on_pending_cops(pending_cops) unless pending_cops.empty?
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def pending_cops_only_qualified(pending_cops)
|
|
129
|
-
pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def possible_new_cops?(config)
|
|
133
|
-
disable_pending_cops || enable_pending_cops ||
|
|
134
|
-
config.disabled_new_cops? || config.enabled_new_cops?
|
|
130
|
+
merge_with_default(config, config_file)
|
|
135
131
|
end
|
|
136
132
|
|
|
137
133
|
def add_excludes_from_files(config, config_file)
|
|
@@ -151,14 +147,35 @@ module RuboCop
|
|
|
151
147
|
end
|
|
152
148
|
end
|
|
153
149
|
|
|
154
|
-
#
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
150
|
+
# This API is primarily intended for testing and documenting plugins.
|
|
151
|
+
# When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
|
|
152
|
+
# so this API is usually not needed. It is intended to be used only when implementing tests
|
|
153
|
+
# that do not use `rubocop/rspec/support`.
|
|
154
|
+
# rubocop:disable Metrics/MethodLength
|
|
155
|
+
def inject_defaults!(config_yml_path)
|
|
156
|
+
if Pathname(config_yml_path).directory?
|
|
157
|
+
# TODO: Since the warning noise is expected to be high until some time after the release,
|
|
158
|
+
# warnings will only be issued when `RUBYOPT=-w` is specified.
|
|
159
|
+
# To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
|
|
160
|
+
# Eventually, `project_root` will no longer be accepted.
|
|
161
|
+
if $VERBOSE
|
|
162
|
+
warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
|
|
163
|
+
Use config YAML file path instead of project root directory.
|
|
164
|
+
e.g., `path/to/config/default.yml`
|
|
165
|
+
MESSAGE
|
|
166
|
+
end
|
|
167
|
+
# NOTE: For compatibility.
|
|
168
|
+
project_root = config_yml_path
|
|
169
|
+
path = File.join(project_root, 'config', 'default.yml')
|
|
170
|
+
config = load_file(path)
|
|
171
|
+
else
|
|
172
|
+
hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
|
|
173
|
+
config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
@default_configuration = ConfigLoader.merge_with_default(config, path)
|
|
161
177
|
end
|
|
178
|
+
# rubocop:enable Metrics/MethodLength
|
|
162
179
|
|
|
163
180
|
# Returns the path RuboCop inferred as the root of the project. No file
|
|
164
181
|
# searches will go past this directory.
|
|
@@ -172,26 +189,18 @@ module RuboCop
|
|
|
172
189
|
ConfigFinder.project_root
|
|
173
190
|
end
|
|
174
191
|
|
|
175
|
-
def warn_on_pending_cops(pending_cops)
|
|
176
|
-
warn Rainbow(PENDING_BANNER).yellow
|
|
177
|
-
|
|
178
|
-
pending_cops.each { |cop| warn_pending_cop cop }
|
|
179
|
-
|
|
180
|
-
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def warn_pending_cop(cop)
|
|
184
|
-
version = cop.metadata['VersionAdded'] || 'N/A'
|
|
185
|
-
|
|
186
|
-
warn Rainbow("#{cop.name}: # new in #{version}").yellow
|
|
187
|
-
warn Rainbow(' Enabled: true').yellow
|
|
188
|
-
end
|
|
189
|
-
|
|
190
192
|
# Merges the given configuration with the default one.
|
|
191
193
|
def merge_with_default(config, config_file, unset_nil: true)
|
|
192
194
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
|
193
195
|
end
|
|
194
196
|
|
|
197
|
+
# @api private
|
|
198
|
+
# Used to add plugins that were required inside a config or from
|
|
199
|
+
# the CLI using `--plugin`.
|
|
200
|
+
def add_loaded_plugins(loaded_plugins)
|
|
201
|
+
@loaded_plugins.merge(Array(loaded_plugins))
|
|
202
|
+
end
|
|
203
|
+
|
|
195
204
|
# @api private
|
|
196
205
|
# Used to add features that were required inside a config or from
|
|
197
206
|
# the CLI using `--require`.
|
|
@@ -2,16 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
require 'pathname'
|
|
4
4
|
require 'yaml'
|
|
5
|
+
require_relative 'plugin'
|
|
5
6
|
|
|
6
7
|
module RuboCop
|
|
7
8
|
# A help class for ConfigLoader that handles configuration resolution.
|
|
8
9
|
# @api private
|
|
9
10
|
class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
|
|
11
|
+
def resolve_plugins(rubocop_config, plugins)
|
|
12
|
+
plugins = Array(plugins) - ConfigLoader.loaded_plugins.map { |plugin| plugin.about.name }
|
|
13
|
+
return if plugins.empty?
|
|
14
|
+
|
|
15
|
+
Plugin.integrate_plugins(rubocop_config, plugins)
|
|
16
|
+
end
|
|
17
|
+
|
|
10
18
|
def resolve_requires(path, hash)
|
|
11
19
|
config_dir = File.dirname(path)
|
|
12
20
|
hash.delete('require').tap do |loaded_features|
|
|
13
21
|
Array(loaded_features).each do |feature|
|
|
14
|
-
|
|
22
|
+
if Plugin.plugin_capable?(feature)
|
|
23
|
+
# NOTE: Compatibility for before plugins style.
|
|
24
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
25
|
+
#{feature} extension supports plugin, specify `plugins: #{feature}` instead of `require: #{feature}` in #{path}.
|
|
26
|
+
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
|
|
27
|
+
MESSAGE
|
|
28
|
+
rubocop_config = Config.create(hash, path, check: false)
|
|
29
|
+
|
|
30
|
+
resolve_plugins(rubocop_config, feature)
|
|
31
|
+
else
|
|
32
|
+
FeatureLoader.load(config_directory_path: config_dir, feature: feature)
|
|
33
|
+
end
|
|
15
34
|
end
|
|
16
35
|
end
|
|
17
36
|
end
|
|
@@ -105,7 +124,7 @@ module RuboCop
|
|
|
105
124
|
elsif merge_hashes?(base_hash, derived_hash, key)
|
|
106
125
|
result[key] = merge(base_hash[key], derived_hash[key], **opts)
|
|
107
126
|
elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
|
|
108
|
-
result[key] = base_hash[key] | derived_hash[key]
|
|
127
|
+
result[key] = Array(base_hash[key]) | Array(derived_hash[key])
|
|
109
128
|
elsif opts[:debug]
|
|
110
129
|
warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
|
111
130
|
end
|
|
@@ -157,20 +176,27 @@ module RuboCop
|
|
|
157
176
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
|
158
177
|
return false if inherited_file.start_with?('..') # Legitimate override
|
|
159
178
|
return false if base_hash[key] == derived_hash[key] # Same value
|
|
160
|
-
return false if remote_file?(inherited_file) # Can't change
|
|
179
|
+
return false if PathUtil.remote_file?(inherited_file) # Can't change
|
|
161
180
|
|
|
162
181
|
Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
|
|
163
182
|
end
|
|
164
183
|
|
|
165
184
|
def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
|
185
|
+
# If the file being considered is remote, don't bother checking for duplicates
|
|
186
|
+
return if remote_config?(opts[:file])
|
|
187
|
+
|
|
166
188
|
return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
|
|
167
189
|
|
|
168
190
|
inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
|
|
169
191
|
return if base_hash[key].is_a?(Array) && inherit_mode&.include?(key)
|
|
170
192
|
|
|
171
|
-
puts
|
|
172
|
-
|
|
173
|
-
|
|
193
|
+
puts duplicate_setting_warning(opts, key)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def duplicate_setting_warning(opts, key)
|
|
197
|
+
"#{PathUtil.smart_path(opts[:file])}: " \
|
|
198
|
+
"#{opts[:cop_name]}:#{key} overrides " \
|
|
199
|
+
"the same parameter in #{opts[:inherited_file]}"
|
|
174
200
|
end
|
|
175
201
|
|
|
176
202
|
def determine_inherit_mode(hash, key)
|
|
@@ -180,7 +206,7 @@ module RuboCop
|
|
|
180
206
|
end
|
|
181
207
|
|
|
182
208
|
def should_union?(derived_hash, base_hash, root_mode, key)
|
|
183
|
-
return false unless base_hash[key].is_a?(Array)
|
|
209
|
+
return false unless base_hash[key].is_a?(Array) || derived_hash[key].is_a?(Array)
|
|
184
210
|
|
|
185
211
|
derived_mode = derived_hash['inherit_mode']
|
|
186
212
|
return false if should_override?(derived_mode, key)
|
|
@@ -218,9 +244,9 @@ module RuboCop
|
|
|
218
244
|
end
|
|
219
245
|
|
|
220
246
|
def inherited_file(path, inherit_from, file)
|
|
221
|
-
if remote_file?(inherit_from)
|
|
247
|
+
if PathUtil.remote_file?(inherit_from)
|
|
222
248
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
|
223
|
-
RemoteConfig.new(inherit_from,
|
|
249
|
+
RemoteConfig.new(inherit_from, ConfigLoader.cache_root)
|
|
224
250
|
elsif Pathname.new(inherit_from).absolute?
|
|
225
251
|
# An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`.
|
|
226
252
|
# The path may come from `inherit_gem` option, where a gem name is expanded
|
|
@@ -230,7 +256,7 @@ module RuboCop
|
|
|
230
256
|
elsif file.is_a?(RemoteConfig)
|
|
231
257
|
# A path relative to a URL, e.g. `inherit_from: configs/default.yml`
|
|
232
258
|
# in a config included with `inherit_from: http://example.com/rubocop.yml`
|
|
233
|
-
file.inherit_from_remote(inherit_from
|
|
259
|
+
file.inherit_from_remote(inherit_from)
|
|
234
260
|
else
|
|
235
261
|
# A local relative path, e.g. `inherit_from: default.yml`
|
|
236
262
|
print 'Inheriting ' if ConfigLoader.debug?
|
|
@@ -238,8 +264,8 @@ module RuboCop
|
|
|
238
264
|
end
|
|
239
265
|
end
|
|
240
266
|
|
|
241
|
-
def
|
|
242
|
-
|
|
267
|
+
def remote_config?(file)
|
|
268
|
+
file.is_a?(RemoteConfig)
|
|
243
269
|
end
|
|
244
270
|
|
|
245
271
|
def handle_disabled_by_default(config, new_default_configuration)
|
|
@@ -269,10 +295,11 @@ module RuboCop
|
|
|
269
295
|
begin
|
|
270
296
|
gem = Bundler.load.specs[gem_name].first
|
|
271
297
|
gem_path = gem.full_gem_path if gem
|
|
272
|
-
rescue
|
|
273
|
-
#
|
|
274
|
-
|
|
275
|
-
# The Gemfile exists but contains an uninstalled git source
|
|
298
|
+
rescue StandardError
|
|
299
|
+
# The Gemfile has a problem, which could be one of:
|
|
300
|
+
# - No Gemfile found. Bundler may be loaded manually
|
|
301
|
+
# - The Gemfile exists but contains an uninstalled git source
|
|
302
|
+
# - The Gemfile exists but cannot be loaded for some other reason
|
|
276
303
|
end
|
|
277
304
|
end
|
|
278
305
|
|
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def violated?
|
|
18
|
-
return false if
|
|
18
|
+
return false if plugin_loaded?
|
|
19
19
|
|
|
20
20
|
affected_cops.any?
|
|
21
21
|
end
|
|
@@ -38,8 +38,9 @@ module RuboCop
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
def
|
|
42
|
-
|
|
41
|
+
def plugin_loaded?
|
|
42
|
+
# Plugins loaded via `require` are included in `loaded_features`.
|
|
43
|
+
config.loaded_plugins.include?(gem) || config.loaded_features.include?(gem)
|
|
43
44
|
end
|
|
44
45
|
end
|
|
45
46
|
end
|
|
@@ -6,17 +6,28 @@ module RuboCop
|
|
|
6
6
|
# a cop or moving it to a new department.
|
|
7
7
|
# @api private
|
|
8
8
|
class RenamedCop < CopRule
|
|
9
|
-
attr_reader :new_name
|
|
9
|
+
attr_reader :new_name, :metadata
|
|
10
10
|
|
|
11
|
-
def initialize(config, old_name,
|
|
11
|
+
def initialize(config, old_name, name_or_hash)
|
|
12
12
|
super(config, old_name)
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
if name_or_hash.is_a?(Hash)
|
|
15
|
+
@metadata = name_or_hash
|
|
16
|
+
@new_name = name_or_hash['new_name']
|
|
17
|
+
else
|
|
18
|
+
@metadata = {}
|
|
19
|
+
@new_name = name_or_hash
|
|
20
|
+
end
|
|
14
21
|
end
|
|
15
22
|
|
|
16
23
|
def rule_message
|
|
17
24
|
"The `#{old_name}` cop has been #{verb} to `#{new_name}`."
|
|
18
25
|
end
|
|
19
26
|
|
|
27
|
+
def warning?
|
|
28
|
+
severity == 'warning'
|
|
29
|
+
end
|
|
30
|
+
|
|
20
31
|
private
|
|
21
32
|
|
|
22
33
|
def moved?
|
|
@@ -29,6 +40,10 @@ module RuboCop
|
|
|
29
40
|
def verb
|
|
30
41
|
moved? ? 'moved' : 'renamed'
|
|
31
42
|
end
|
|
43
|
+
|
|
44
|
+
def severity
|
|
45
|
+
metadata['severity']
|
|
46
|
+
end
|
|
32
47
|
end
|
|
33
48
|
end
|
|
34
49
|
end
|
|
@@ -23,9 +23,40 @@ module RuboCop
|
|
|
23
23
|
class << self
|
|
24
24
|
attr_accessor :files
|
|
25
25
|
|
|
26
|
+
def global
|
|
27
|
+
@global ||= new(Config.new)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def reset!
|
|
31
|
+
@global = nil
|
|
32
|
+
@deprecated_names = {}
|
|
33
|
+
LOAD_RULES_CACHE[rules_cache_key] = nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def rules_cache_key
|
|
37
|
+
files.hash
|
|
38
|
+
end
|
|
39
|
+
|
|
26
40
|
def legacy_cop_names
|
|
27
41
|
# Used by DepartmentName#qualified_legacy_cop_name
|
|
28
|
-
|
|
42
|
+
global.legacy_cop_names
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def deprecated_cop_name?(name)
|
|
46
|
+
global.deprecated_cop_name?(name)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def deprecated_names_for(cop)
|
|
50
|
+
@deprecated_names ||= {}
|
|
51
|
+
return @deprecated_names[cop] if @deprecated_names.key?(cop)
|
|
52
|
+
|
|
53
|
+
@deprecated_names[cop] = global.rules.filter_map do |rule|
|
|
54
|
+
next unless rule.cop_rule?
|
|
55
|
+
next unless rule.respond_to?(:new_name)
|
|
56
|
+
next unless rule.new_name == cop
|
|
57
|
+
|
|
58
|
+
rule.old_name
|
|
59
|
+
end
|
|
29
60
|
end
|
|
30
61
|
end
|
|
31
62
|
|
|
@@ -45,12 +76,21 @@ module RuboCop
|
|
|
45
76
|
raise ValidationError, messages.join("\n")
|
|
46
77
|
end
|
|
47
78
|
|
|
79
|
+
def legacy_cop_names
|
|
80
|
+
# Used by DepartmentName#qualified_legacy_cop_name
|
|
81
|
+
cop_rules.map(&:old_name)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def deprecated_cop_name?(name)
|
|
85
|
+
legacy_cop_names.include?(name)
|
|
86
|
+
end
|
|
87
|
+
|
|
48
88
|
private
|
|
49
89
|
|
|
50
90
|
# Default rules for obsoletions are in config/obsoletion.yml
|
|
51
91
|
# Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
|
|
52
92
|
def load_rules # rubocop:disable Metrics/AbcSize
|
|
53
|
-
rules = LOAD_RULES_CACHE[self.class.
|
|
93
|
+
rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
|
|
54
94
|
self.class.files.each_with_object({}) do |filename, hash|
|
|
55
95
|
hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
|
|
56
96
|
case first
|
|
@@ -107,5 +147,9 @@ module RuboCop
|
|
|
107
147
|
rule.message
|
|
108
148
|
end
|
|
109
149
|
end
|
|
150
|
+
|
|
151
|
+
def cop_rules
|
|
152
|
+
rules.select(&:cop_rule?)
|
|
153
|
+
end
|
|
110
154
|
end
|
|
111
155
|
end
|
data/lib/rubocop/config_store.rb
CHANGED
|
@@ -25,6 +25,11 @@ module RuboCop
|
|
|
25
25
|
@validated = true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def apply_options!(options)
|
|
29
|
+
self.options_config = options[:config] if options[:config]
|
|
30
|
+
force_default_config! if options[:force_default_config]
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def options_config=(options_config)
|
|
29
34
|
loaded_config = ConfigLoader.load_file(options_config)
|
|
30
35
|
@options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
|
|
@@ -3,21 +3,22 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
# Handles validation of configuration, for example cop names, parameter
|
|
5
5
|
# names, and Ruby versions.
|
|
6
|
+
# rubocop:disable Metrics/ClassLength
|
|
6
7
|
class ConfigValidator
|
|
7
8
|
extend SimpleForwardable
|
|
8
9
|
|
|
9
10
|
# @api private
|
|
10
11
|
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
|
11
|
-
Enabled].freeze
|
|
12
|
+
Enabled Reference References].freeze
|
|
12
13
|
# @api private
|
|
13
14
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
|
14
15
|
VersionAdded VersionChanged VersionRemoved
|
|
15
|
-
Reference Safe SafeAutoCorrect].freeze
|
|
16
|
+
Reference References Safe SafeAutoCorrect].freeze
|
|
16
17
|
# @api private
|
|
17
18
|
NEW_COPS_VALUES = %w[pending disable enable].freeze
|
|
18
19
|
|
|
19
20
|
# @api private
|
|
20
|
-
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
|
|
21
|
+
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
|
|
21
22
|
CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
|
|
22
23
|
CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
|
|
23
24
|
private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
|
|
@@ -41,8 +42,9 @@ module RuboCop
|
|
|
41
42
|
ConfigLoader.default_configuration.key?(key)
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
validate_parameter_shape(valid_cop_names)
|
|
45
46
|
|
|
47
|
+
check_obsoletions
|
|
46
48
|
alert_about_unrecognized_cops(invalid_cop_names)
|
|
47
49
|
validate_new_cops_parameter
|
|
48
50
|
validate_parameter_names(valid_cop_names)
|
|
@@ -64,12 +66,6 @@ module RuboCop
|
|
|
64
66
|
target_ruby.version
|
|
65
67
|
end
|
|
66
68
|
|
|
67
|
-
def validate_section_presence(name)
|
|
68
|
-
return unless @config.key?(name) && @config[name].nil?
|
|
69
|
-
|
|
70
|
-
raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
69
|
private
|
|
74
70
|
|
|
75
71
|
attr_reader :target_ruby
|
|
@@ -122,6 +118,7 @@ module RuboCop
|
|
|
122
118
|
invalid_cop_names.each do |name|
|
|
123
119
|
# There could be a custom cop with this name. If so, don't warn
|
|
124
120
|
next if Cop::Registry.global.contains_cop_matching?([name])
|
|
121
|
+
next if ConfigObsoletion.deprecated_cop_name?(name)
|
|
125
122
|
|
|
126
123
|
# Special case for inherit_mode, which is a directive that we keep in
|
|
127
124
|
# the configuration (even though it's not a cop), because it's easier
|
|
@@ -177,9 +174,22 @@ module RuboCop
|
|
|
177
174
|
raise ValidationError, message
|
|
178
175
|
end
|
|
179
176
|
|
|
177
|
+
def validate_parameter_shape(valid_cop_names)
|
|
178
|
+
valid_cop_names.each do |name|
|
|
179
|
+
if @config[name].nil?
|
|
180
|
+
raise ValidationError, "empty section #{name.inspect} found in #{smart_loaded_path}"
|
|
181
|
+
elsif !@config[name].is_a?(Hash)
|
|
182
|
+
raise ValidationError, <<~MESSAGE
|
|
183
|
+
The configuration for #{name.inspect} in #{smart_loaded_path} is not a Hash.
|
|
184
|
+
|
|
185
|
+
Found: #{@config[name].inspect}
|
|
186
|
+
MESSAGE
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
180
191
|
def validate_parameter_names(valid_cop_names)
|
|
181
192
|
valid_cop_names.each do |name|
|
|
182
|
-
validate_section_presence(name)
|
|
183
193
|
each_invalid_parameter(name) do |param, supported_params|
|
|
184
194
|
warn Rainbow(<<~MESSAGE).yellow
|
|
185
195
|
Warning: #{name} does not support #{param} parameter.
|
|
@@ -250,8 +260,7 @@ module RuboCop
|
|
|
250
260
|
end
|
|
251
261
|
end
|
|
252
262
|
|
|
253
|
-
# rubocop:disable Metrics/
|
|
254
|
-
def check_cop_config_value(hash, parent = nil)
|
|
263
|
+
def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
255
264
|
hash.each do |key, value|
|
|
256
265
|
check_cop_config_value(value, key) if value.is_a?(Hash)
|
|
257
266
|
|
|
@@ -261,6 +270,8 @@ module RuboCop
|
|
|
261
270
|
supposed_values = 'a boolean'
|
|
262
271
|
elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
|
|
263
272
|
supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
|
|
273
|
+
elsif key == 'References'
|
|
274
|
+
supposed_values = 'an array of strings'
|
|
264
275
|
else
|
|
265
276
|
next
|
|
266
277
|
end
|
|
@@ -268,7 +279,6 @@ module RuboCop
|
|
|
268
279
|
raise ValidationError, param_error_message(parent, key, value, supposed_values)
|
|
269
280
|
end
|
|
270
281
|
end
|
|
271
|
-
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
|
272
282
|
|
|
273
283
|
# FIXME: Handling colors in exception messages like this is ugly.
|
|
274
284
|
def param_error_message(parent, key, value, supposed_values)
|
|
@@ -277,4 +287,5 @@ module RuboCop
|
|
|
277
287
|
"is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
|
|
278
288
|
end
|
|
279
289
|
end
|
|
290
|
+
# rubocop:enable Metrics/ClassLength
|
|
280
291
|
end
|