rubocop 1.57.1 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +4 -5
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +136 -19
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +22 -8
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli.rb +10 -1
- data/lib/rubocop/config.rb +36 -12
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +1 -2
- data/lib/rubocop/config_loader_resolver.rb +9 -3
- data/lib/rubocop/config_obsoletion.rb +11 -8
- data/lib/rubocop/config_validator.rb +14 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +6 -1
- data/lib/rubocop/cop/base.rb +63 -16
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_version.rb +3 -5
- data/lib/rubocop/cop/cop.rb +20 -2
- 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/documentation.rb +16 -6
- 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/deprecated_attribute_assignment.rb +2 -2
- 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/example_description.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- 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.rb +2 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- 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/empty_comment.rb +3 -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/end_alignment.rb +15 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -7
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -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 +16 -3
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -20
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- 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/assignment_in_condition.rb +6 -6
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +29 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +2 -2
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -17
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +14 -7
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +54 -6
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -4
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +7 -2
- 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/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +3 -2
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +53 -12
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/class_length.rb +6 -1
- 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/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +16 -12
- 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/hash_shorthand_syntax.rb +23 -13
- 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/preceding_following_alignment.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/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +34 -7
- data/lib/rubocop/cop/naming/constant_name.rb +1 -2
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +1 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
- 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 +52 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +1 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +155 -21
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/case_like_if.rb +5 -5
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +21 -11
- data/lib/rubocop/cop/style/combinable_loops.rb +13 -7
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +7 -8
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- 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 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +6 -15
- data/lib/rubocop/cop/style/exact_regexp_match.rb +4 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +105 -11
- data/lib/rubocop/cop/style/hash_except.rb +10 -6
- data/lib/rubocop/cop/style/hash_syntax.rb +24 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +14 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +44 -2
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +175 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +18 -8
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- 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/next.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 +10 -2
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +27 -3
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +5 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -10
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +19 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +50 -19
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +7 -1
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_sort.rb +9 -8
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -6
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +8 -0
- 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/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +75 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/zero_length_predicate.rb +28 -24
- data/lib/rubocop/cop/team.rb +13 -0
- data/lib/rubocop/cop/util.rb +7 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +16 -4
- data/lib/rubocop/directive_comment.rb +10 -8
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +37 -14
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- 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 +56 -7
- data/lib/rubocop/lsp/logger.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +12 -15
- data/lib/rubocop/lsp/runtime.rb +1 -1
- data/lib/rubocop/lsp/server.rb +7 -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 +14 -11
- data/lib/rubocop/path_util.rb +6 -2
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/result_cache.rb +0 -1
- data/lib/rubocop/rspec/cop_helper.rb +8 -2
- data/lib/rubocop/rspec/expect_offense.rb +16 -8
- data/lib/rubocop/rspec/shared_contexts.rb +73 -16
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +14 -3
- data/lib/rubocop/server/cache.rb +11 -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 +4 -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 +82 -80
- data/lib/rubocop/version.rb +19 -4
- data/lib/rubocop.rb +8 -0
- metadata +27 -29
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -37,6 +37,42 @@ module RuboCop
|
|
|
37
37
|
# # ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
38
38
|
# ----
|
|
39
39
|
#
|
|
40
|
+
# It is also unsafe because `Symbol#to_proc` does not work with
|
|
41
|
+
# `protected` methods which would otherwise be accessible.
|
|
42
|
+
#
|
|
43
|
+
# For example:
|
|
44
|
+
#
|
|
45
|
+
# [source,ruby]
|
|
46
|
+
# ----
|
|
47
|
+
# class Box
|
|
48
|
+
# def initialize
|
|
49
|
+
# @secret = rand
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# def normal_matches?(*others)
|
|
53
|
+
# others.map { |other| other.secret }.any?(secret)
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# def symbol_to_proc_matches?(*others)
|
|
57
|
+
# others.map(&:secret).any?(secret)
|
|
58
|
+
# end
|
|
59
|
+
#
|
|
60
|
+
# protected
|
|
61
|
+
#
|
|
62
|
+
# attr_reader :secret
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# boxes = [Box.new, Box.new]
|
|
66
|
+
# Box.new.normal_matches?(*boxes)
|
|
67
|
+
# # => false
|
|
68
|
+
# boxes.first.normal_matches?(*boxes)
|
|
69
|
+
# # => true
|
|
70
|
+
# Box.new.symbol_to_proc_matches?(*boxes)
|
|
71
|
+
# # => NoMethodError: protected method `secret' called for #<Box...>
|
|
72
|
+
# boxes.first.symbol_to_proc_matches?(*boxes)
|
|
73
|
+
# # => NoMethodError: protected method `secret' called for #<Box...>
|
|
74
|
+
# ----
|
|
75
|
+
#
|
|
40
76
|
# @example
|
|
41
77
|
# # bad
|
|
42
78
|
# something.map { |s| s.upcase }
|
|
@@ -84,6 +120,23 @@ module RuboCop
|
|
|
84
120
|
# # good
|
|
85
121
|
# something.map { |s| s.upcase }
|
|
86
122
|
#
|
|
123
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
|
|
124
|
+
# # bad
|
|
125
|
+
# ->(x) { x.foo }
|
|
126
|
+
# proc { |x| x.foo }
|
|
127
|
+
# Proc.new { |x| x.foo }
|
|
128
|
+
#
|
|
129
|
+
# # good
|
|
130
|
+
# lambda(&:foo)
|
|
131
|
+
# proc(&:foo)
|
|
132
|
+
# Proc.new(&:foo)
|
|
133
|
+
#
|
|
134
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: true
|
|
135
|
+
# # good
|
|
136
|
+
# ->(x) { x.foo }
|
|
137
|
+
# proc { |x| x.foo }
|
|
138
|
+
# Proc.new { |x| x.foo }
|
|
139
|
+
#
|
|
87
140
|
class SymbolProc < Base
|
|
88
141
|
include CommentsHelp
|
|
89
142
|
include RangeHelp
|
|
@@ -93,6 +146,7 @@ module RuboCop
|
|
|
93
146
|
|
|
94
147
|
MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` instead of a block.'
|
|
95
148
|
SUPER_TYPES = %i[super zsuper].freeze
|
|
149
|
+
LAMBDA_OR_PROC = %i[lambda proc].freeze
|
|
96
150
|
|
|
97
151
|
# @!method proc_node?(node)
|
|
98
152
|
def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
|
|
@@ -115,13 +169,12 @@ module RuboCop
|
|
|
115
169
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
116
170
|
def on_block(node)
|
|
117
171
|
symbol_proc?(node) do |dispatch_node, arguments_node, method_name|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
172
|
+
if active_support_extensions_enabled?
|
|
173
|
+
return if proc_node?(dispatch_node)
|
|
174
|
+
return if LAMBDA_OR_PROC.include?(dispatch_node.method_name)
|
|
175
|
+
end
|
|
122
176
|
return if unsafe_hash_usage?(dispatch_node)
|
|
123
177
|
return if unsafe_array_usage?(dispatch_node)
|
|
124
|
-
return if %i[lambda proc].include?(dispatch_node.method_name)
|
|
125
178
|
return if allowed_method_name?(dispatch_node.method_name)
|
|
126
179
|
return if allow_if_method_has_argument?(node.send_node)
|
|
127
180
|
return if node.block_type? && destructuring_block_argument?(arguments_node)
|
|
@@ -170,6 +223,15 @@ module RuboCop
|
|
|
170
223
|
end
|
|
171
224
|
|
|
172
225
|
def autocorrect_without_args(corrector, node)
|
|
226
|
+
if node.send_node.lambda_literal?
|
|
227
|
+
if node.send_node.loc.selector.source == '->'
|
|
228
|
+
corrector.replace(node, "lambda(&:#{node.body.method_name})")
|
|
229
|
+
return
|
|
230
|
+
else
|
|
231
|
+
autocorrect_lambda_block(corrector, node)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
173
235
|
corrector.replace(block_range_with_space(node), "(&:#{node.body.method_name})")
|
|
174
236
|
end
|
|
175
237
|
|
|
@@ -182,6 +244,14 @@ module RuboCop
|
|
|
182
244
|
corrector.remove(block_range_with_space(node))
|
|
183
245
|
end
|
|
184
246
|
|
|
247
|
+
def autocorrect_lambda_block(corrector, node)
|
|
248
|
+
send_node_loc = node.send_node.loc
|
|
249
|
+
corrector.replace(send_node_loc.selector, 'lambda')
|
|
250
|
+
|
|
251
|
+
range = range_between(send_node_loc.selector.end_pos, node.loc.begin.end_pos - 2)
|
|
252
|
+
corrector.remove(range)
|
|
253
|
+
end
|
|
254
|
+
|
|
185
255
|
def block_range_with_space(node)
|
|
186
256
|
block_range = range_between(begin_pos_for_replacement(node), node.loc.end.end_pos)
|
|
187
257
|
range_with_surrounding_space(block_range, side: :left)
|
|
@@ -23,38 +23,35 @@ module RuboCop
|
|
|
23
23
|
|
|
24
24
|
minimum_target_ruby_version 2.4
|
|
25
25
|
|
|
26
|
-
MSG = 'Use
|
|
27
|
-
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
|
26
|
+
MSG = 'Use `unpack1(%<format>s)` instead of `%<current>s`.'
|
|
28
27
|
RESTRICT_ON_SEND = %i[first [] slice at].freeze
|
|
29
28
|
|
|
30
29
|
# @!method unpack_and_first_element?(node)
|
|
31
30
|
def_node_matcher :unpack_and_first_element?, <<~PATTERN
|
|
32
31
|
{
|
|
33
|
-
(
|
|
34
|
-
(
|
|
32
|
+
(call $(call (...) :unpack $(...)) :first)
|
|
33
|
+
(call $(call (...) :unpack $(...)) {:[] :slice :at} (int 0))
|
|
35
34
|
}
|
|
36
35
|
PATTERN
|
|
37
36
|
|
|
38
37
|
def on_send(node)
|
|
39
38
|
unpack_and_first_element?(node) do |unpack_call, unpack_arg|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
corrector.remove(first_element_range(node, unpack_call))
|
|
39
|
+
first_element_range = first_element_range(node, unpack_call)
|
|
40
|
+
offense_range = unpack_call.loc.selector.join(node.source_range.end)
|
|
41
|
+
message = format(MSG, format: unpack_arg.source, current: offense_range.source)
|
|
42
|
+
|
|
43
|
+
add_offense(offense_range, message: message) do |corrector|
|
|
44
|
+
corrector.remove(first_element_range)
|
|
47
45
|
corrector.replace(unpack_call.loc.selector, 'unpack1')
|
|
48
46
|
end
|
|
49
47
|
end
|
|
50
48
|
end
|
|
49
|
+
alias on_csend on_send
|
|
51
50
|
|
|
52
51
|
private
|
|
53
52
|
|
|
54
53
|
def first_element_range(node, unpack_call)
|
|
55
|
-
|
|
56
|
-
unpack_call.source_range.end_pos,
|
|
57
|
-
node.source_range.end_pos)
|
|
54
|
+
unpack_call.source_range.end.join(node.source_range.end)
|
|
58
55
|
end
|
|
59
56
|
end
|
|
60
57
|
end
|
|
@@ -47,15 +47,16 @@ module RuboCop
|
|
|
47
47
|
check_zero_length_comparison(node)
|
|
48
48
|
check_nonzero_length_comparison(node)
|
|
49
49
|
end
|
|
50
|
+
alias on_csend on_send
|
|
50
51
|
|
|
51
52
|
private
|
|
52
53
|
|
|
53
54
|
def check_zero_length_predicate(node)
|
|
54
|
-
return unless
|
|
55
|
+
return unless zero_length_predicate?(node.parent)
|
|
55
56
|
return if non_polymorphic_collection?(node.parent)
|
|
56
57
|
|
|
57
58
|
offense = node.loc.selector.join(node.parent.source_range.end)
|
|
58
|
-
message = format(ZERO_MSG, current:
|
|
59
|
+
message = format(ZERO_MSG, current: offense.source)
|
|
59
60
|
|
|
60
61
|
add_offense(offense, message: message) do |corrector|
|
|
61
62
|
corrector.replace(offense, 'empty?')
|
|
@@ -92,44 +93,47 @@ module RuboCop
|
|
|
92
93
|
end
|
|
93
94
|
end
|
|
94
95
|
|
|
95
|
-
# @!method zero_length_predicate(node)
|
|
96
|
-
def_node_matcher :zero_length_predicate
|
|
97
|
-
(
|
|
96
|
+
# @!method zero_length_predicate?(node)
|
|
97
|
+
def_node_matcher :zero_length_predicate?, <<~PATTERN
|
|
98
|
+
(call (call (...) {:length :size}) :zero?)
|
|
98
99
|
PATTERN
|
|
99
100
|
|
|
100
101
|
# @!method zero_length_comparison(node)
|
|
101
102
|
def_node_matcher :zero_length_comparison, <<~PATTERN
|
|
102
|
-
{(
|
|
103
|
-
(
|
|
104
|
-
(
|
|
105
|
-
(
|
|
103
|
+
{(call (call (...) ${:length :size}) $:== (int $0))
|
|
104
|
+
(call (int $0) $:== (call (...) ${:length :size}))
|
|
105
|
+
(call (call (...) ${:length :size}) $:< (int $1))
|
|
106
|
+
(call (int $1) $:> (call (...) ${:length :size}))}
|
|
106
107
|
PATTERN
|
|
107
108
|
|
|
108
109
|
# @!method nonzero_length_comparison(node)
|
|
109
110
|
def_node_matcher :nonzero_length_comparison, <<~PATTERN
|
|
110
|
-
{(
|
|
111
|
-
(
|
|
111
|
+
{(call (call (...) ${:length :size}) ${:> :!=} (int $0))
|
|
112
|
+
(call (int $0) ${:< :!=} (call (...) ${:length :size}))}
|
|
112
113
|
PATTERN
|
|
113
114
|
|
|
114
115
|
def replacement(node)
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
length_node = zero_length_node(node)
|
|
117
|
+
if length_node&.receiver
|
|
118
|
+
return "#{length_node.receiver.source}#{length_node.loc.dot.source}empty?"
|
|
119
|
+
end
|
|
117
120
|
|
|
118
|
-
|
|
121
|
+
other_length_node = other_length_node(node)
|
|
122
|
+
"!#{other_length_node.receiver.source}#{other_length_node.loc.dot.source}empty?"
|
|
119
123
|
end
|
|
120
124
|
|
|
121
|
-
# @!method
|
|
122
|
-
def_node_matcher :
|
|
123
|
-
{(send (
|
|
124
|
-
(send (int 0) :== (
|
|
125
|
-
(send (
|
|
126
|
-
(send (int 1) :> (
|
|
125
|
+
# @!method zero_length_node(node)
|
|
126
|
+
def_node_matcher :zero_length_node, <<~PATTERN
|
|
127
|
+
{(send $(call _ _) :== (int 0))
|
|
128
|
+
(send (int 0) :== $(call _ _))
|
|
129
|
+
(send $(call _ _) :< (int 1))
|
|
130
|
+
(send (int 1) :> $(call _ _))}
|
|
127
131
|
PATTERN
|
|
128
132
|
|
|
129
|
-
# @!method
|
|
130
|
-
def_node_matcher :
|
|
131
|
-
{(
|
|
132
|
-
(
|
|
133
|
+
# @!method other_length_node(node)
|
|
134
|
+
def_node_matcher :other_length_node, <<~PATTERN
|
|
135
|
+
{(call $(call _ _) _ _)
|
|
136
|
+
(call _ _ $(call _ _))}
|
|
133
137
|
PATTERN
|
|
134
138
|
|
|
135
139
|
# Some collection like objects in the Ruby standard library
|
data/lib/rubocop/cop/team.rb
CHANGED
|
@@ -74,6 +74,10 @@ module RuboCop
|
|
|
74
74
|
# @deprecated. Use investigate
|
|
75
75
|
# @return Array<offenses>
|
|
76
76
|
def inspect_file(processed_source)
|
|
77
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
78
|
+
`inspect_file` is deprecated. Use `investigate` instead.
|
|
79
|
+
WARNING
|
|
80
|
+
|
|
77
81
|
investigate(processed_source).offenses
|
|
78
82
|
end
|
|
79
83
|
|
|
@@ -108,6 +112,10 @@ module RuboCop
|
|
|
108
112
|
|
|
109
113
|
# @deprecated
|
|
110
114
|
def forces
|
|
115
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
116
|
+
`forces` is deprecated.
|
|
117
|
+
WARNING
|
|
118
|
+
|
|
111
119
|
@forces ||= self.class.forces_for(cops)
|
|
112
120
|
end
|
|
113
121
|
|
|
@@ -174,6 +182,9 @@ module RuboCop
|
|
|
174
182
|
end
|
|
175
183
|
|
|
176
184
|
def support_target_rails_version?(cop)
|
|
185
|
+
# In this case, the rails version was already checked by `#excluded_file?`
|
|
186
|
+
return true if defined?(RuboCop::Rails::TargetRailsVersion::USES_REQUIRES_GEM_API)
|
|
187
|
+
|
|
177
188
|
return true unless cop.class.respond_to?(:support_target_rails_version?)
|
|
178
189
|
|
|
179
190
|
cop.class.support_target_rails_version?(cop.target_rails_version)
|
|
@@ -237,6 +248,8 @@ module RuboCop
|
|
|
237
248
|
|
|
238
249
|
if cause.is_a?(Warning)
|
|
239
250
|
handle_warning(cause, location)
|
|
251
|
+
elsif cause.is_a?(Force::HookError)
|
|
252
|
+
handle_error(cause.cause, location, cause.joining_cop)
|
|
240
253
|
else
|
|
241
254
|
handle_error(cause, location, error.cop)
|
|
242
255
|
end
|
data/lib/rubocop/cop/util.rb
CHANGED
|
@@ -20,6 +20,10 @@ module RuboCop
|
|
|
20
20
|
|
|
21
21
|
# @deprecated Use `ProcessedSource#line_with_comment?`, `contains_comment?` or similar
|
|
22
22
|
def comment_lines?(node)
|
|
23
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
24
|
+
`comment_lines?` is deprecated. Use `ProcessedSource#line_with_comment?`, `contains_comment?` or similar instead.
|
|
25
|
+
WARNING
|
|
26
|
+
|
|
23
27
|
processed_source[line_range(node)].any? { |line| comment_line?(line) }
|
|
24
28
|
end
|
|
25
29
|
|
|
@@ -173,7 +177,9 @@ module RuboCop
|
|
|
173
177
|
def same_line?(node1, node2)
|
|
174
178
|
line1 = line(node1)
|
|
175
179
|
line2 = line(node2)
|
|
176
|
-
|
|
180
|
+
return false unless line1 && line2
|
|
181
|
+
|
|
182
|
+
line1 == line2
|
|
177
183
|
end
|
|
178
184
|
|
|
179
185
|
def indent(node, offset: 0)
|
|
@@ -97,7 +97,9 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
97
97
|
'Version Changed'
|
|
98
98
|
]
|
|
99
99
|
autocorrect = if cop.support_autocorrect?
|
|
100
|
-
|
|
100
|
+
context = cop.new.always_autocorrect? ? 'Always' : 'Command-line only'
|
|
101
|
+
|
|
102
|
+
"#{context}#{' (Unsafe)' unless cop.new(config).safe_autocorrect?}"
|
|
101
103
|
else
|
|
102
104
|
'No'
|
|
103
105
|
end
|
|
@@ -251,9 +253,18 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
251
253
|
"\ninclude::../partials/#{filename}[]\n"
|
|
252
254
|
end
|
|
253
255
|
|
|
256
|
+
# rubocop:disable Metrics/MethodLength
|
|
254
257
|
def print_cops_of_department(department)
|
|
255
258
|
selected_cops = cops_of_department(department)
|
|
256
|
-
content =
|
|
259
|
+
content = +<<~HEADER
|
|
260
|
+
////
|
|
261
|
+
Do NOT edit this file by hand directly, as it is automatically generated.
|
|
262
|
+
|
|
263
|
+
Please make any necessary changes to the cop documentation within the source files themselves.
|
|
264
|
+
////
|
|
265
|
+
|
|
266
|
+
= #{department}
|
|
267
|
+
HEADER
|
|
257
268
|
selected_cops.each { |cop| content << print_cop_with_doc(cop) }
|
|
258
269
|
content << footer_for_department(department)
|
|
259
270
|
file_name = "#{docs_path}/#{department_to_basename(department)}.adoc"
|
|
@@ -262,11 +273,12 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
262
273
|
file.write("#{content.strip}\n")
|
|
263
274
|
end
|
|
264
275
|
end
|
|
276
|
+
# rubocop:enable Metrics/MethodLength
|
|
265
277
|
|
|
266
278
|
def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
267
279
|
cop_config = config.for_cop(cop)
|
|
268
280
|
non_display_keys = %w[
|
|
269
|
-
Description Enabled StyleGuide Reference Safe SafeAutoCorrect VersionAdded
|
|
281
|
+
AutoCorrect Description Enabled StyleGuide Reference Safe SafeAutoCorrect VersionAdded
|
|
270
282
|
VersionChanged
|
|
271
283
|
]
|
|
272
284
|
pars = cop_config.reject { |k| non_display_keys.include? k }
|
|
@@ -294,7 +306,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
294
306
|
filename = "#{department_to_basename(department)}.adoc"
|
|
295
307
|
content = +"=== Department xref:#{filename}[#{type_title}]\n\n"
|
|
296
308
|
cops_of_department(department).each do |cop|
|
|
297
|
-
anchor = cop.cop_name.
|
|
309
|
+
anchor = cop.cop_name.delete('/').downcase
|
|
298
310
|
content << "* xref:#{filename}##{anchor}[#{cop.cop_name}]\n"
|
|
299
311
|
end
|
|
300
312
|
|
|
@@ -6,9 +6,11 @@ module RuboCop
|
|
|
6
6
|
# cops it contains.
|
|
7
7
|
class DirectiveComment
|
|
8
8
|
# @api private
|
|
9
|
-
|
|
9
|
+
LINT_DEPARTMENT = 'Lint'
|
|
10
10
|
# @api private
|
|
11
|
-
|
|
11
|
+
LINT_REDUNDANT_DIRECTIVE_COP = "#{LINT_DEPARTMENT}/RedundantCopDisableDirective"
|
|
12
|
+
# @api private
|
|
13
|
+
LINT_SYNTAX_COP = "#{LINT_DEPARTMENT}/Syntax"
|
|
12
14
|
# @api private
|
|
13
15
|
COP_NAME_PATTERN = '([A-Z]\w+/)*(?:[A-Z]\w+)'
|
|
14
16
|
# @api private
|
|
@@ -118,9 +120,10 @@ module RuboCop
|
|
|
118
120
|
end
|
|
119
121
|
|
|
120
122
|
def parsed_cop_names
|
|
121
|
-
splitted_cops_string.map do |name|
|
|
123
|
+
cops = splitted_cops_string.map do |name|
|
|
122
124
|
department?(name) ? cop_names_for_department(name) : name
|
|
123
125
|
end.flatten
|
|
126
|
+
cops - [LINT_SYNTAX_COP]
|
|
124
127
|
end
|
|
125
128
|
|
|
126
129
|
def department?(name)
|
|
@@ -128,17 +131,16 @@ module RuboCop
|
|
|
128
131
|
end
|
|
129
132
|
|
|
130
133
|
def all_cop_names
|
|
131
|
-
|
|
134
|
+
exclude_lint_department_cops(cop_registry.names)
|
|
132
135
|
end
|
|
133
136
|
|
|
134
137
|
def cop_names_for_department(department)
|
|
135
138
|
names = cop_registry.names_for_department(department)
|
|
136
|
-
|
|
137
|
-
has_redundant_directive_cop ? exclude_redundant_directive_cop(names) : names
|
|
139
|
+
department == LINT_DEPARTMENT ? exclude_lint_department_cops(names) : names
|
|
138
140
|
end
|
|
139
141
|
|
|
140
|
-
def
|
|
141
|
-
cops - [
|
|
142
|
+
def exclude_lint_department_cops(cops)
|
|
143
|
+
cops - [LINT_REDUNDANT_DIRECTIVE_COP, LINT_SYNTAX_COP]
|
|
142
144
|
end
|
|
143
145
|
end
|
|
144
146
|
end
|
|
@@ -54,10 +54,7 @@ module RuboCop
|
|
|
54
54
|
return enum_for(__method__, named: named) unless block_given?
|
|
55
55
|
|
|
56
56
|
parsed_tree&.traverse do |event, exp, _index|
|
|
57
|
-
yield(exp) if event
|
|
58
|
-
named == exp.respond_to?(:name) &&
|
|
59
|
-
exp.respond_to?(:capturing?) &&
|
|
60
|
-
exp.capturing?
|
|
57
|
+
yield(exp) if named_capturing?(exp, event, named)
|
|
61
58
|
end
|
|
62
59
|
|
|
63
60
|
self
|
|
@@ -65,6 +62,14 @@ module RuboCop
|
|
|
65
62
|
|
|
66
63
|
private
|
|
67
64
|
|
|
65
|
+
def named_capturing?(exp, event, named)
|
|
66
|
+
event == :enter &&
|
|
67
|
+
named == exp.respond_to?(:name) &&
|
|
68
|
+
!exp.text.start_with?('(?<=') &&
|
|
69
|
+
exp.respond_to?(:capturing?) &&
|
|
70
|
+
exp.capturing?
|
|
71
|
+
end
|
|
72
|
+
|
|
68
73
|
def with_interpolations_blanked
|
|
69
74
|
# Ignore the trailing regopt node
|
|
70
75
|
children[0...-1].map do |child|
|
|
@@ -22,26 +22,9 @@ module RuboCop
|
|
|
22
22
|
module Base
|
|
23
23
|
attr_accessor :origin
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
|
|
29
|
-
end
|
|
30
|
-
# Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
|
|
31
|
-
# It's for compatibility with regexp_parser 1.8 and will never be maintained.
|
|
32
|
-
else
|
|
33
|
-
attr_accessor :source
|
|
34
|
-
|
|
35
|
-
def start_index
|
|
36
|
-
# ts is a byte index; convert it to a character index
|
|
37
|
-
@start_index ||= source.byteslice(0, ts).length
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Shortcut to `loc.expression`
|
|
41
|
-
def expression
|
|
42
|
-
end_pos = start_index + full_length
|
|
43
|
-
@expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
|
|
44
|
-
end
|
|
25
|
+
# Shortcut to `loc.expression`
|
|
26
|
+
def expression
|
|
27
|
+
@expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
|
|
45
28
|
end
|
|
46
29
|
|
|
47
30
|
# @returns a location map like `parser` does, with:
|
|
@@ -69,8 +52,8 @@ module RuboCop
|
|
|
69
52
|
|
|
70
53
|
body = expression.adjust(end_pos: -q.text.length)
|
|
71
54
|
q.origin = origin
|
|
72
|
-
q.source = source if q.respond_to?(:source=) # for regexp_parser 1.8
|
|
73
55
|
q_loc = q.expression
|
|
56
|
+
|
|
74
57
|
{ body: body, quantifier: q_loc }
|
|
75
58
|
end
|
|
76
59
|
end
|
|
@@ -24,14 +24,10 @@ module RuboCop
|
|
|
24
24
|
message: message(offense)
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
return unless valid_line?(offense)
|
|
27
|
+
return unless valid_line?(offense)
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
rescue IndexError
|
|
33
|
-
# range is not on a valid line; perhaps the source file is empty
|
|
34
|
-
end
|
|
29
|
+
report_line(offense.location)
|
|
30
|
+
report_highlighted_area(offense.highlighted_area)
|
|
35
31
|
end
|
|
36
32
|
|
|
37
33
|
def valid_line?(offense)
|
|
@@ -30,7 +30,8 @@ module RuboCop
|
|
|
30
30
|
@files_with_offenses ||= {}
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def file_started(_file,
|
|
33
|
+
def file_started(_file, options)
|
|
34
|
+
@config_for_pwd = options[:config_store].for_pwd
|
|
34
35
|
@exclude_limit_option = @options[:exclude_limit]
|
|
35
36
|
@exclude_limit = Integer(@exclude_limit_option ||
|
|
36
37
|
RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS)
|
|
@@ -115,16 +116,24 @@ module RuboCop
|
|
|
115
116
|
def set_max(cfg, cop_name)
|
|
116
117
|
return unless cfg[:exclude_limit]
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
# files are not excluded one by one.
|
|
120
|
-
if !@options[:auto_gen_only_exclude] || @files_with_offenses[cop_name].size > @exclude_limit
|
|
121
|
-
cfg.merge!(cfg[:exclude_limit])
|
|
122
|
-
end
|
|
119
|
+
cfg.merge!(cfg[:exclude_limit]) if should_set_max?(cop_name)
|
|
123
120
|
|
|
124
121
|
# Remove already used exclude_limit.
|
|
125
122
|
cfg.reject! { |key| key == :exclude_limit }
|
|
126
123
|
end
|
|
127
124
|
|
|
125
|
+
def should_set_max?(cop_name)
|
|
126
|
+
max_set_in_user_config =
|
|
127
|
+
@config_for_pwd.for_cop(cop_name)['Max'] != default_config(cop_name)['Max']
|
|
128
|
+
|
|
129
|
+
max_allowed = !max_set_in_user_config && !no_exclude_limit?
|
|
130
|
+
return false unless max_allowed
|
|
131
|
+
|
|
132
|
+
# In case auto_gen_only_exclude is set, only modify the maximum if the files are not
|
|
133
|
+
# excluded one by one.
|
|
134
|
+
!@options[:auto_gen_only_exclude] || @files_with_offenses[cop_name].size > @exclude_limit
|
|
135
|
+
end
|
|
136
|
+
|
|
128
137
|
def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
|
|
129
138
|
output_buffer.puts "# Offense count: #{offense_count}" if show_offense_counts?
|
|
130
139
|
|
|
@@ -192,8 +201,8 @@ module RuboCop
|
|
|
192
201
|
# 'Enabled' option will be put into file only if exclude
|
|
193
202
|
# limit is exceeded.
|
|
194
203
|
rejected_keys = ['Enabled']
|
|
195
|
-
rejected_keys <<
|
|
196
|
-
cfg.reject { |key|
|
|
204
|
+
rejected_keys << /\AEnforcedStyle\w*/ unless auto_gen_enforced_style?
|
|
205
|
+
cfg.reject { |key| include_or_match?(rejected_keys, key) }
|
|
197
206
|
end
|
|
198
207
|
|
|
199
208
|
def output_offending_files(output_buffer, cfg, cop_name)
|
|
@@ -262,6 +271,12 @@ module RuboCop
|
|
|
262
271
|
def no_exclude_limit?
|
|
263
272
|
@options[:no_exclude_limit] == false
|
|
264
273
|
end
|
|
274
|
+
|
|
275
|
+
# Returns true if the given arr include the given elm or if any of the
|
|
276
|
+
# given arr is a regexp that matches the given elm.
|
|
277
|
+
def include_or_match?(arr, elm)
|
|
278
|
+
arr.include?(elm) || arr.any? { |x| x.is_a?(Regexp) && x.match?(elm) }
|
|
279
|
+
end
|
|
265
280
|
end
|
|
266
281
|
end
|
|
267
282
|
end
|
|
@@ -27,6 +27,7 @@ module RuboCop
|
|
|
27
27
|
'[t]ap' => 'TapFormatter',
|
|
28
28
|
'[w]orst' => 'WorstOffendersFormatter'
|
|
29
29
|
}.freeze
|
|
30
|
+
BUILTIN_FORMATTER_NAMES = BUILTIN_FORMATTERS_FOR_KEYS.keys.map { |key| key.delete('[]') }
|
|
30
31
|
|
|
31
32
|
FORMATTER_APIS = %i[started finished].freeze
|
|
32
33
|
|
|
@@ -88,7 +89,12 @@ module RuboCop
|
|
|
88
89
|
/^\[#{specified_key}\]/.match?(key) || specified_key == key.delete('[]')
|
|
89
90
|
end
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
if matching_keys.empty?
|
|
93
|
+
similar_name = NameSimilarity.find_similar_name(specified_key, BUILTIN_FORMATTER_NAMES)
|
|
94
|
+
suggestion = %( Did you mean? "#{similar_name}") if similar_name
|
|
95
|
+
|
|
96
|
+
raise Rainbow(%(Formatter "#{specified_key}" not found.#{suggestion})).red
|
|
97
|
+
end
|
|
92
98
|
|
|
93
99
|
raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
|
|
94
100
|
|