rubocop 1.59.0 → 1.68.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +69 -70
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +165 -24
- data/config/internal_affairs.yml +11 -0
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +18 -10
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +10 -1
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +41 -13
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +15 -10
- data/lib/rubocop/config_loader_resolver.rb +13 -8
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_validator.rb +17 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +28 -3
- data/lib/rubocop/cop/base.rb +73 -18
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +5 -13
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- 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/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +123 -29
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +8 -1
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +11 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +17 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +30 -12
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +8 -3
- data/lib/rubocop/cop/layout/end_alignment.rb +8 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -4
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +5 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +56 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +20 -20
- data/lib/rubocop/cop/layout/redundant_line_break.rb +14 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -3
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +0 -13
- data/lib/rubocop/cop/lint/debugger.rb +27 -6
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +0 -10
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -10
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +74 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -8
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -11
- data/lib/rubocop/cop/lint/empty_interpolation.rb +0 -4
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -9
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +21 -14
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +0 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +0 -10
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +0 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +5 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +13 -6
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -6
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +0 -4
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +0 -5
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +7 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -6
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +3 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +14 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +0 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
- data/lib/rubocop/cop/lint/return_in_void_context.rb +0 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +9 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +107 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +6 -10
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -7
- data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +19 -16
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +0 -4
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +77 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +0 -4
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +41 -9
- data/lib/rubocop/cop/metrics/block_length.rb +6 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/class_length.rb +6 -5
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -1
- data/lib/rubocop/cop/metrics/method_length.rb +6 -5
- data/lib/rubocop/cop/metrics/module_length.rb +6 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -5
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +10 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +22 -10
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +9 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +7 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +5 -0
- data/lib/rubocop/cop/naming/block_forwarding.rb +33 -6
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +55 -29
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -1
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +1 -1
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +62 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +141 -24
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +31 -3
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +19 -10
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +7 -8
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/def_with_parentheses.rb +0 -2
- data/lib/rubocop/cop/style/documentation.rb +24 -24
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -8
- data/lib/rubocop/cop/style/empty_else.rb +6 -5
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +31 -22
- data/lib/rubocop/cop/style/endless_method.rb +1 -14
- data/lib/rubocop/cop/style/eval_with_location.rb +16 -24
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +2 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +7 -1
- data/lib/rubocop/cop/style/guard_clause.rb +17 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +35 -8
- data/lib/rubocop/cop/style/hash_except.rb +8 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +26 -4
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +49 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +8 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +46 -4
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +81 -50
- data/lib/rubocop/cop/style/map_into_array.rb +233 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +10 -6
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +29 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/missing_else.rb +0 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +28 -47
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/one_line_conditional.rb +6 -2
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +8 -9
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -3
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +25 -2
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +4 -4
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +5 -4
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +40 -7
- data/lib/rubocop/cop/style/redundant_parentheses.rb +27 -13
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -24
- data/lib/rubocop/cop/style/redundant_return.rb +6 -0
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +13 -1
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +106 -52
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +1 -3
- data/lib/rubocop/cop/style/select_by_regexp.rb +9 -6
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +104 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +21 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +75 -5
- 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/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +27 -3
- data/lib/rubocop/cop/util.rb +8 -2
- data/lib/rubocop/cop/utils/regexp_ranges.rb +1 -1
- 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 +5 -1
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/cop/variable_force.rb +13 -1
- data/lib/rubocop/cops_documentation_generator.rb +96 -43
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +10 -8
- data/lib/rubocop/ext/regexp_node.rb +18 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +24 -9
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +32 -10
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/logger.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +12 -15
- data/lib/rubocop/lsp/runtime.rb +3 -1
- data/lib/rubocop/lsp/server.rb +6 -2
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/options.rb +17 -12
- data/lib/rubocop/path_util.rb +6 -2
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +2 -8
- data/lib/rubocop/rspec/cop_helper.rb +8 -2
- data/lib/rubocop/rspec/expect_offense.rb +17 -8
- data/lib/rubocop/rspec/shared_contexts.rb +75 -18
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +31 -9
- data/lib/rubocop/server/cache.rb +16 -2
- data/lib/rubocop/server/client_command/exec.rb +2 -3
- data/lib/rubocop/server/client_command/start.rb +1 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +84 -78
- data/lib/rubocop/target_ruby.rb +87 -81
- data/lib/rubocop/version.rb +45 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +21 -1
- metadata +33 -35
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -4,11 +4,15 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Handles `Max` configuration parameters, especially setting them to an
|
6
6
|
# appropriate value with --auto-gen-config.
|
7
|
-
# @deprecated Use `exclude_limit ParameterName
|
7
|
+
# @deprecated Use `exclude_limit <ParameterName>` instead.
|
8
8
|
module ConfigurableMax
|
9
9
|
private
|
10
10
|
|
11
11
|
def max=(value)
|
12
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
13
|
+
`max=` is deprecated. Use `exclude_limit <ParameterName>` instead.
|
14
|
+
WARNING
|
15
|
+
|
12
16
|
cfg = config_to_allow_offenses
|
13
17
|
cfg[:exclude_limit] ||= {}
|
14
18
|
current_max = cfg[:exclude_limit][max_parameter_name]
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for rewriting endless methods to normal method definitions
|
6
|
+
module EndlessMethodRewriter
|
7
|
+
def correct_to_multiline(corrector, node)
|
8
|
+
replacement = <<~RUBY.strip
|
9
|
+
def #{node.method_name}#{arguments(node)}
|
10
|
+
#{node.body.source}
|
11
|
+
end
|
12
|
+
RUBY
|
13
|
+
|
14
|
+
corrector.replace(node, replacement)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def arguments(node, missing = '')
|
20
|
+
node.arguments.any? ? node.arguments.source : missing
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
|
21
21
|
def frozen_string_literal?(node)
|
22
22
|
frozen_string = if target_ruby_version >= 3.0
|
23
|
-
uninterpolated_string?(node) ||
|
23
|
+
uninterpolated_string?(node) || uninterpolated_heredoc?(node)
|
24
24
|
else
|
25
25
|
FROZEN_STRING_LITERAL_TYPES_RUBY27.include?(node.type)
|
26
26
|
end
|
@@ -29,32 +29,44 @@ module RuboCop
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def uninterpolated_string?(node)
|
32
|
-
node.str_type? || (
|
32
|
+
node.str_type? || (
|
33
|
+
node.dstr_type? && node.each_descendant(:begin, :ivar, :cvar, :gvar).none?
|
34
|
+
)
|
33
35
|
end
|
34
36
|
|
35
|
-
def
|
37
|
+
def uninterpolated_heredoc?(node)
|
36
38
|
return false unless node.dstr_type? && node.heredoc?
|
37
39
|
|
38
40
|
node.children.all?(&:str_type?)
|
39
41
|
end
|
42
|
+
alias frozen_heredoc? uninterpolated_heredoc?
|
40
43
|
|
41
44
|
def frozen_string_literals_enabled?
|
42
45
|
ruby_version = processed_source.ruby_version
|
43
46
|
return false unless ruby_version
|
44
47
|
|
48
|
+
# Check if a magic string literal comment specifies what to do
|
49
|
+
magic_comments = leading_comment_lines.filter_map { |line| MagicComment.parse(line) }
|
50
|
+
if (literal_magic_comment = magic_comments.find(&:frozen_string_literal_specified?))
|
51
|
+
return literal_magic_comment.frozen_string_literal?
|
52
|
+
end
|
53
|
+
|
45
54
|
# TODO: Ruby officially abandon making frozen string literals default
|
46
55
|
# for Ruby 3.0.
|
47
56
|
# https://bugs.ruby-lang.org/issues/11473#note-53
|
48
|
-
# Whether frozen string literals will be the default after Ruby
|
49
|
-
# or not is still unclear as of
|
57
|
+
# Whether frozen string literals will be the default after Ruby 4.0
|
58
|
+
# or not is still unclear as of July 2024.
|
50
59
|
# It may be necessary to add this code in the future.
|
51
60
|
#
|
52
|
-
# return
|
61
|
+
# return ruby_version >= 4.0 if string_literals_frozen_by_default?.nil?
|
53
62
|
#
|
54
|
-
# And the above `ruby_version >=
|
55
|
-
# Ruby
|
56
|
-
# See https://bugs.ruby-lang.org/issues/
|
57
|
-
|
63
|
+
# And the above `ruby_version >= 4.0` is undecided whether it will be
|
64
|
+
# Ruby 4.0 or others.
|
65
|
+
# See https://bugs.ruby-lang.org/issues/20205 for details.
|
66
|
+
# For now, offer a configuration value to override behavior is using RUBYOPT.
|
67
|
+
return false if string_literals_frozen_by_default?.nil?
|
68
|
+
|
69
|
+
string_literals_frozen_by_default?
|
58
70
|
end
|
59
71
|
|
60
72
|
def frozen_string_literals_disabled?
|
@@ -67,13 +67,14 @@ module RuboCop
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def ignore_mixed_hash_shorthand_syntax?(hash_node)
|
70
|
-
target_ruby_version <= 3.0 ||
|
70
|
+
target_ruby_version <= 3.0 ||
|
71
|
+
!%w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
|
71
72
|
!hash_node.hash_type?
|
72
73
|
end
|
73
74
|
|
74
75
|
def ignore_hash_shorthand_syntax?(pair_node)
|
75
76
|
target_ruby_version <= 3.0 || enforced_shorthand_syntax == 'either' ||
|
76
|
-
enforced_shorthand_syntax
|
77
|
+
%w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
|
77
78
|
!pair_node.parent.hash_type?
|
78
79
|
end
|
79
80
|
|
@@ -172,6 +173,11 @@ module RuboCop
|
|
172
173
|
hash_value_type_breakdown[:value_needed]&.any?
|
173
174
|
end
|
174
175
|
|
176
|
+
def ignore_explicit_omissible_hash_shorthand_syntax?(hash_value_type_breakdown)
|
177
|
+
hash_value_type_breakdown.keys == [:value_omittable] &&
|
178
|
+
enforced_shorthand_syntax == 'either_consistent'
|
179
|
+
end
|
180
|
+
|
175
181
|
def each_omitted_value_pair(hash_value_type_breakdown, &block)
|
176
182
|
hash_value_type_breakdown[:value_omitted]&.each(&block)
|
177
183
|
end
|
@@ -198,6 +204,7 @@ module RuboCop
|
|
198
204
|
|
199
205
|
def no_mixed_shorthand_syntax_check(hash_value_type_breakdown)
|
200
206
|
return if hash_with_values_that_cant_be_omitted?(hash_value_type_breakdown)
|
207
|
+
return if ignore_explicit_omissible_hash_shorthand_syntax?(hash_value_type_breakdown)
|
201
208
|
|
202
209
|
each_omittable_value_pair(hash_value_type_breakdown) do |pair_node|
|
203
210
|
hash_key_source = pair_node.key.source
|
@@ -91,8 +91,13 @@ module RuboCop
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def uri_regexp
|
94
|
-
@uri_regexp ||=
|
95
|
-
|
94
|
+
@uri_regexp ||= begin
|
95
|
+
# Ruby 3.4 changes the default parser to RFC3986 which warns on make_regexp.
|
96
|
+
# Additionally, the RFC2396_PARSER alias is only available on 3.4 for now.
|
97
|
+
# Extra info at https://github.com/ruby/uri/issues/118
|
98
|
+
parser = defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::DEFAULT_PARSER
|
99
|
+
parser.make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
|
100
|
+
end
|
96
101
|
end
|
97
102
|
|
98
103
|
def valid_uri?(uri_ish_string)
|
@@ -49,13 +49,13 @@ module RuboCop
|
|
49
49
|
|
50
50
|
return unless complexity > max
|
51
51
|
|
52
|
-
msg = format(
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
msg = format(
|
53
|
+
self.class::MSG,
|
54
|
+
method: method_name, complexity: complexity, abc_vector: abc_vector, max: max
|
55
|
+
)
|
56
|
+
location = location(node)
|
57
57
|
|
58
|
-
add_offense(
|
58
|
+
add_offense(location, message: msg) { self.max = complexity.ceil }
|
59
59
|
end
|
60
60
|
|
61
61
|
def complexity(body)
|
@@ -69,6 +69,15 @@ module RuboCop
|
|
69
69
|
end
|
70
70
|
score
|
71
71
|
end
|
72
|
+
|
73
|
+
def location(node)
|
74
|
+
if LSP.enabled?
|
75
|
+
end_range = node.loc.respond_to?(:name) ? node.loc.name : node.loc.begin
|
76
|
+
node.source_range.begin.join(end_range)
|
77
|
+
else
|
78
|
+
node.source_range
|
79
|
+
end
|
80
|
+
end
|
72
81
|
end
|
73
82
|
end
|
74
83
|
end
|
@@ -189,7 +189,7 @@ module RuboCop
|
|
189
189
|
case node.type
|
190
190
|
when :casgn then _scope, _lhs, rhs = *node
|
191
191
|
when :op_asgn then _lhs, _op, rhs = *node
|
192
|
-
when :send
|
192
|
+
when :send, :csend then rhs = node.last_argument
|
193
193
|
else _lhs, rhs = *node
|
194
194
|
end
|
195
195
|
rhs
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
parent = node.parent
|
16
16
|
|
17
17
|
parent&.send_type? && parent.arguments.include?(node) &&
|
18
|
-
!parent.parenthesized? && parent
|
18
|
+
!parent.parenthesized? && parent.block_literal?
|
19
19
|
end
|
20
20
|
|
21
21
|
# Override to determine values that are invalid in a percent array
|
@@ -18,6 +18,10 @@ module RuboCop
|
|
18
18
|
|
19
19
|
# @deprecated Use ResbodyNode#exceptions instead
|
20
20
|
def rescued_exceptions(resbody)
|
21
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
22
|
+
`rescued_exceptions` is deprecated. Use `ResbodyNode#exceptions` instead.
|
23
|
+
WARNING
|
24
|
+
|
21
25
|
rescue_group, = *resbody
|
22
26
|
if rescue_group
|
23
27
|
rescue_group.values
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
def_node_matcher :empty_condition?, '(begin)'
|
15
15
|
|
16
16
|
# @!method setter_method?(node)
|
17
|
-
def_node_matcher :setter_method?, '[(
|
17
|
+
def_node_matcher :setter_method?, '[(call ...) setter_method?]'
|
18
18
|
|
19
19
|
# @!method safe_assignment?(node)
|
20
20
|
def_node_matcher :safe_assignment?, '(begin {equals_asgn? #setter_method?})'
|
@@ -5,7 +5,6 @@ module RuboCop
|
|
5
5
|
# Common functionality for modifier cops.
|
6
6
|
module StatementModifier
|
7
7
|
include LineLengthHelp
|
8
|
-
include RangeHelp
|
9
8
|
|
10
9
|
private
|
11
10
|
|
@@ -65,7 +64,9 @@ module RuboCop
|
|
65
64
|
end
|
66
65
|
|
67
66
|
def method_source(if_body)
|
68
|
-
|
67
|
+
end_range = if_body.implicit_call? ? if_body.loc.dot.end : if_body.loc.selector
|
68
|
+
|
69
|
+
if_body.source_range.begin.join(end_range).source
|
69
70
|
end
|
70
71
|
|
71
72
|
def first_line_comment(node)
|
@@ -16,6 +16,18 @@ module RuboCop
|
|
16
16
|
!/" | \\[^'\\] | \#[@{$]/x.match?(src)
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
def preferred_string_literal
|
21
|
+
enforce_double_quotes? ? '""' : "''"
|
22
|
+
end
|
23
|
+
|
24
|
+
def enforce_double_quotes?
|
25
|
+
string_literals_config['EnforcedStyle'] == 'double_quotes'
|
26
|
+
end
|
27
|
+
|
28
|
+
def string_literals_config
|
29
|
+
config.for_cop('Style/StringLiterals')
|
30
|
+
end
|
19
31
|
end
|
20
32
|
end
|
21
33
|
end
|
@@ -40,6 +40,7 @@ module RuboCop
|
|
40
40
|
MSG_WRITER = 'Do not prefix writer method names with `set_`.'
|
41
41
|
|
42
42
|
def on_def(node)
|
43
|
+
return unless proper_attribute_name?(node)
|
43
44
|
return unless bad_reader_name?(node) || bad_writer_name?(node)
|
44
45
|
|
45
46
|
message = message(node)
|
@@ -58,6 +59,10 @@ module RuboCop
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
62
|
+
def proper_attribute_name?(node)
|
63
|
+
!node.method_name.to_s.end_with?('!', '?', '=')
|
64
|
+
end
|
65
|
+
|
61
66
|
def bad_reader_name?(node)
|
62
67
|
node.method_name.to_s.start_with?('get_') && !node.arguments?
|
63
68
|
end
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
MSG = 'Use %<style>s block forwarding.'
|
49
49
|
|
50
50
|
def self.autocorrect_incompatible_with
|
51
|
-
[Lint::AmbiguousOperator, Style::ArgumentsForwarding]
|
51
|
+
[Lint::AmbiguousOperator, Style::ArgumentsForwarding, Style::ExplicitBlockArgument]
|
52
52
|
end
|
53
53
|
|
54
54
|
def on_def(node)
|
@@ -57,14 +57,18 @@ module RuboCop
|
|
57
57
|
last_argument = node.last_argument
|
58
58
|
return if expected_block_forwarding_style?(node, last_argument)
|
59
59
|
|
60
|
-
|
60
|
+
forwarded_args = node.each_descendant(:block_pass).with_object([]) do |block_pass, result|
|
61
|
+
return nil if invalidates_syntax?(block_pass)
|
62
|
+
next unless block_argument_name_matched?(block_pass, last_argument)
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
last_argument.source != block_pass_node.source
|
64
|
+
result << block_pass
|
65
|
+
end
|
65
66
|
|
66
|
-
|
67
|
+
forwarded_args.each do |forwarded_arg|
|
68
|
+
register_offense(forwarded_arg, node)
|
67
69
|
end
|
70
|
+
|
71
|
+
register_offense(last_argument, node)
|
68
72
|
end
|
69
73
|
alias on_defs on_def
|
70
74
|
|
@@ -80,6 +84,29 @@ module RuboCop
|
|
80
84
|
end
|
81
85
|
end
|
82
86
|
|
87
|
+
def block_argument_name_matched?(block_pass_node, last_argument)
|
88
|
+
return false if block_pass_node.children.first&.sym_type?
|
89
|
+
|
90
|
+
last_argument.source == block_pass_node.source
|
91
|
+
end
|
92
|
+
|
93
|
+
# Prevents the following syntax error:
|
94
|
+
#
|
95
|
+
# # foo.rb
|
96
|
+
# def foo(&)
|
97
|
+
# block_method do
|
98
|
+
# bar(&)
|
99
|
+
# end
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# $ ruby -vc foo.rb
|
103
|
+
# ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
|
104
|
+
# foo.rb: foo.rb:4: anonymous block parameter is also used within block (SyntaxError)
|
105
|
+
#
|
106
|
+
def invalidates_syntax?(block_pass_node)
|
107
|
+
block_pass_node.each_ancestor(:block, :numblock).any?
|
108
|
+
end
|
109
|
+
|
83
110
|
def use_kwarg_in_method_definition?(node)
|
84
111
|
node.arguments.each_descendant(:kwarg, :kwoptarg).any?
|
85
112
|
end
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
file_path = processed_source.file_path
|
58
58
|
return if config.file_to_exclude?(file_path) || config.allowed_camel_case_file?(file_path)
|
59
59
|
|
60
|
-
for_bad_filename(file_path)
|
60
|
+
for_bad_filename(file_path)
|
61
61
|
end
|
62
62
|
|
63
63
|
private
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
71
71
|
msg = other_message(basename) unless bad_filename_allowed?
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
add_global_offense(msg) if msg
|
75
75
|
end
|
76
76
|
|
77
77
|
def perform_class_and_module_naming_checks(file_path, basename)
|
@@ -116,9 +116,9 @@ module RuboCop
|
|
116
116
|
add_offense(range, message: create_message(word)) do |corrector|
|
117
117
|
suggestions = find_flagged_term(word)['Suggestions']
|
118
118
|
|
119
|
-
|
120
|
-
|
121
|
-
|
119
|
+
if (preferred_term = preferred_sole_term(suggestions))
|
120
|
+
corrector.replace(range, preferred_term)
|
121
|
+
end
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
@@ -157,6 +157,15 @@ module RuboCop
|
|
157
157
|
set_regexes(flagged_term_strings, allowed_strings)
|
158
158
|
end
|
159
159
|
|
160
|
+
def preferred_sole_term(suggestions)
|
161
|
+
case suggestions
|
162
|
+
when Array
|
163
|
+
suggestions.one? && preferred_sole_term(suggestions.first)
|
164
|
+
when String
|
165
|
+
suggestions
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
160
169
|
def extract_regexp(term, term_definition)
|
161
170
|
return term_definition['Regex'] if term_definition['Regex']
|
162
171
|
return /(?:\b|(?<=[\W_]))#{term}(?:\b|(?=[\W_]))/ if term_definition['WholeWord']
|
@@ -207,8 +216,7 @@ module RuboCop
|
|
207
216
|
message = create_multiple_word_message_for_file(words)
|
208
217
|
end
|
209
218
|
|
210
|
-
|
211
|
-
add_offense(range, message: message)
|
219
|
+
add_global_offense(message)
|
212
220
|
end
|
213
221
|
|
214
222
|
def create_single_word_message_for_file(word)
|
@@ -3,59 +3,75 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Naming
|
6
|
-
# Checks that predicate
|
6
|
+
# Checks that predicate method names end with a question mark and
|
7
7
|
# do not start with a forbidden prefix.
|
8
8
|
#
|
9
|
-
# A method is determined to be a predicate method if its name starts
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# Any method name that starts with one of these prefixes is required by
|
13
|
-
# the cop to end with a `?`. Other methods can be allowed by adding to
|
14
|
-
# the `AllowedMethods` configuration.
|
9
|
+
# A method is determined to be a predicate method if its name starts with
|
10
|
+
# one of the prefixes listed in the `NamePrefix` configuration. The list
|
11
|
+
# defaults to `is_`, `has_`, and `have_` but may be overridden.
|
15
12
|
#
|
16
|
-
#
|
13
|
+
# Predicate methods must end with a question mark.
|
17
14
|
#
|
18
|
-
#
|
19
|
-
#
|
15
|
+
# When `ForbiddenPrefixes` is also set (as it is by default), predicate
|
16
|
+
# methods which begin with a forbidden prefix are not allowed, even if
|
17
|
+
# they end with a `?`. These methods should be changed to remove the
|
18
|
+
# prefix.
|
20
19
|
#
|
21
|
-
#
|
22
|
-
# will register an offense only due to the lack of question mark (and will be
|
23
|
-
# autocorrected to `is_foo?`). If `ForbiddenPrefixes` contains `is_`,
|
24
|
-
# `is_foo` will register an offense both because the ? is missing and because of
|
25
|
-
# the `is_` prefix, and will be corrected to `foo?`.
|
26
|
-
#
|
27
|
-
# NOTE: `ForbiddenPrefixes` is only applied to prefixes in `NamePrefix`;
|
28
|
-
# a prefix in the former but not the latter will not be considered by
|
29
|
-
# this cop.
|
30
|
-
#
|
31
|
-
# @example
|
20
|
+
# @example NamePrefix: ['is_', 'has_', 'have_'] (default)
|
32
21
|
# # bad
|
33
22
|
# def is_even(value)
|
34
23
|
# end
|
35
24
|
#
|
36
|
-
#
|
25
|
+
# # When ForbiddenPrefixes: ['is_', 'has_', 'have_'] (default)
|
26
|
+
# # good
|
27
|
+
# def even?(value)
|
37
28
|
# end
|
38
29
|
#
|
30
|
+
# # When ForbiddenPrefixes: []
|
39
31
|
# # good
|
40
|
-
# def
|
32
|
+
# def is_even?(value)
|
41
33
|
# end
|
42
34
|
#
|
35
|
+
# @example NamePrefix: ['seems_to_be_']
|
43
36
|
# # bad
|
44
|
-
# def
|
37
|
+
# def seems_to_be_even(value)
|
45
38
|
# end
|
46
39
|
#
|
47
|
-
#
|
40
|
+
# # When ForbiddenPrefixes: ['seems_to_be_']
|
41
|
+
# # good
|
42
|
+
# def even?(value)
|
48
43
|
# end
|
49
44
|
#
|
45
|
+
# # When ForbiddenPrefixes: []
|
50
46
|
# # good
|
51
|
-
# def value
|
47
|
+
# def seems_to_be_even?(value)
|
52
48
|
# end
|
53
49
|
#
|
54
50
|
# @example AllowedMethods: ['is_a?'] (default)
|
51
|
+
# # Despite starting with the `is_` prefix, this method is allowed
|
55
52
|
# # good
|
56
53
|
# def is_a?(value)
|
57
54
|
# end
|
58
55
|
#
|
56
|
+
# @example AllowedMethods: ['is_even?']
|
57
|
+
# # good
|
58
|
+
# def is_even?(value)
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# @example MethodDefinitionMacros: ['define_method', 'define_singleton_method'] (default)
|
62
|
+
# # bad
|
63
|
+
# define_method(:is_even) { |value| }
|
64
|
+
#
|
65
|
+
# # good
|
66
|
+
# define_method(:even?) { |value| }
|
67
|
+
#
|
68
|
+
# @example MethodDefinitionMacros: ['def_node_matcher']
|
69
|
+
# # bad
|
70
|
+
# def_node_matcher(:is_even) { |value| }
|
71
|
+
#
|
72
|
+
# # good
|
73
|
+
# def_node_matcher(:even?) { |value| }
|
74
|
+
#
|
59
75
|
class PredicateName < Base
|
60
76
|
include AllowedMethods
|
61
77
|
|
@@ -72,7 +88,7 @@ module RuboCop
|
|
72
88
|
next if allowed_method_name?(method_name.to_s, prefix)
|
73
89
|
|
74
90
|
add_offense(
|
75
|
-
node.first_argument
|
91
|
+
node.first_argument,
|
76
92
|
message: message(method_name, expected_name(method_name.to_s, prefix))
|
77
93
|
)
|
78
94
|
end
|
@@ -93,13 +109,23 @@ module RuboCop
|
|
93
109
|
end
|
94
110
|
alias on_defs on_def
|
95
111
|
|
112
|
+
def validate_config
|
113
|
+
forbidden_prefixes.each do |forbidden_prefix|
|
114
|
+
next if predicate_prefixes.include?(forbidden_prefix)
|
115
|
+
|
116
|
+
raise ValidationError, <<~MSG.chomp
|
117
|
+
The `Naming/PredicateName` cop is misconfigured. Prefix #{forbidden_prefix} must be included in NamePrefix because it is included in ForbiddenPrefixes.
|
118
|
+
MSG
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
96
122
|
private
|
97
123
|
|
98
124
|
def allowed_method_name?(method_name, prefix)
|
99
125
|
!(method_name.start_with?(prefix) && # cheap check to avoid allocating Regexp
|
100
126
|
method_name.match?(/^#{prefix}[^0-9]/)) ||
|
101
127
|
method_name == expected_name(method_name, prefix) ||
|
102
|
-
method_name.end_with?('=') ||
|
128
|
+
method_name.end_with?('=') ||
|
103
129
|
allowed_method?(method_name)
|
104
130
|
end
|
105
131
|
|
@@ -109,7 +135,7 @@ module RuboCop
|
|
109
135
|
else
|
110
136
|
method_name.dup
|
111
137
|
end
|
112
|
-
new_name << '?' unless method_name.end_with?('?')
|
138
|
+
new_name << '?' unless method_name.end_with?('?')
|
113
139
|
new_name
|
114
140
|
end
|
115
141
|
|
@@ -113,13 +113,21 @@ module RuboCop
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
116
117
|
def correct_node(corrector, node, offending_name, preferred_name)
|
117
118
|
return unless node
|
118
119
|
|
119
120
|
node.each_node(:lvar, :lvasgn, :masgn) do |child_node|
|
120
121
|
next unless variable_name_matches?(child_node, offending_name)
|
121
122
|
|
122
|
-
|
123
|
+
if child_node.lvar_type?
|
124
|
+
parent_node = child_node.parent
|
125
|
+
if parent_node.respond_to?(:value_omission?) && parent_node.value_omission?
|
126
|
+
corrector.insert_after(parent_node.loc.operator, " #{preferred_name}")
|
127
|
+
else
|
128
|
+
corrector.replace(child_node, preferred_name)
|
129
|
+
end
|
130
|
+
end
|
123
131
|
|
124
132
|
if child_node.masgn_type? || child_node.lvasgn_type?
|
125
133
|
correct_reassignment(corrector, child_node, offending_name, preferred_name)
|
@@ -127,6 +135,7 @@ module RuboCop
|
|
127
135
|
end
|
128
136
|
end
|
129
137
|
end
|
138
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
130
139
|
|
131
140
|
# If the exception variable is reassigned, that assignment needs to be corrected.
|
132
141
|
# Further `lvar` nodes will not be corrected though since they now refer to a
|
data/lib/rubocop/cop/offense.rb
CHANGED
@@ -43,11 +43,10 @@ module RuboCop
|
|
43
43
|
# @!attribute [r] cop_name
|
44
44
|
#
|
45
45
|
# @return [String]
|
46
|
-
#
|
47
|
-
# i.e. type of the violation.
|
46
|
+
# the cop name as a String for which this offense is for.
|
48
47
|
#
|
49
48
|
# @example
|
50
|
-
# 'LineLength'
|
49
|
+
# 'Layout/LineLength'
|
51
50
|
attr_reader :cop_name
|
52
51
|
|
53
52
|
# @api private
|
@@ -97,8 +96,8 @@ module RuboCop
|
|
97
96
|
# @!attribute [r] correctable?
|
98
97
|
#
|
99
98
|
# @return [Boolean]
|
100
|
-
# whether this offense can be automatically corrected via
|
101
|
-
#
|
99
|
+
# whether this offense can be automatically corrected via autocorrect.
|
100
|
+
# This includes todo comments, for example when requested with `--disable-uncorrectable`.
|
102
101
|
def correctable?
|
103
102
|
@status != :unsupported
|
104
103
|
end
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -300,7 +300,7 @@ module RuboCop
|
|
300
300
|
unless given_badge.match?(real_badge)
|
301
301
|
path = PathUtil.smart_path(source_path)
|
302
302
|
warn "#{path}: #{given_badge} has the wrong namespace - " \
|
303
|
-
"
|
303
|
+
"replace it with #{given_badge.with_department(real_badge.department)}"
|
304
304
|
end
|
305
305
|
|
306
306
|
real_badge.to_s
|
@@ -30,8 +30,8 @@ module RuboCop
|
|
30
30
|
class CompoundHash < Base
|
31
31
|
COMBINATOR_IN_HASH_MSG = 'Use `[...].hash` instead of combining hash values manually.'
|
32
32
|
MONUPLE_HASH_MSG =
|
33
|
-
'Delegate hash directly without wrapping in an array when only using a single value'
|
34
|
-
REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant'
|
33
|
+
'Delegate hash directly without wrapping in an array when only using a single value.'
|
34
|
+
REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant.'
|
35
35
|
|
36
36
|
# @!method hash_method_definition?(node)
|
37
37
|
def_node_matcher :hash_method_definition?, <<~PATTERN
|