rubocop 0.78.0 → 0.82.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 -4
- data/config/default.yml +158 -48
- data/lib/rubocop.rb +19 -4
- data/lib/rubocop/ast/builder.rb +45 -42
- data/lib/rubocop/ast/node.rb +12 -19
- data/lib/rubocop/ast/node/array_node.rb +13 -0
- data/lib/rubocop/ast/node/block_node.rb +5 -1
- data/lib/rubocop/ast/node/case_match_node.rb +56 -0
- data/lib/rubocop/ast/node/def_node.rb +11 -0
- data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
- data/lib/rubocop/ast/node/regexp_node.rb +2 -4
- data/lib/rubocop/ast/traversal.rb +29 -10
- data/lib/rubocop/cli.rb +10 -4
- data/lib/rubocop/cli/command/show_cops.rb +11 -4
- data/lib/rubocop/comment_config.rb +6 -1
- data/lib/rubocop/config.rb +36 -10
- data/lib/rubocop/config_loader.rb +42 -33
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_obsoletion.rb +4 -1
- data/lib/rubocop/config_validator.rb +66 -92
- data/lib/rubocop/cop/autocorrect_logic.rb +6 -3
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +48 -24
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator.rb +3 -4
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
- data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -4
- 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/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
- data/lib/rubocop/cop/layout/line_length.rb +32 -3
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -6
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/loop.rb +6 -4
- data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +12 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -22
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -0
- data/lib/rubocop/cop/migration/department_name.rb +47 -6
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +171 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -10
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +30 -0
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +15 -3
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +5 -6
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
- data/lib/rubocop/cop/style/case_equality.rb +24 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/documentation.rb +43 -5
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/end_block.rb +6 -0
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
- data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
- data/lib/rubocop/cop/style/lambda.rb +3 -2
- data/lib/rubocop/cop/style/lambda_call.rb +2 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +58 -12
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
- data/lib/rubocop/cop/style/or_assignment.rb +4 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +5 -7
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +0 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +4 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +74 -0
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/node_pattern.rb +96 -10
- data/lib/rubocop/options.rb +7 -1
- data/lib/rubocop/processed_source.rb +1 -4
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +5 -4
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/target_ruby.rb +151 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +39 -12
- data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
@@ -5,11 +5,12 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Access modifiers should be declared to apply to a group of methods
|
7
7
|
# or inline before each method, depending on configuration.
|
8
|
+
# EnforcedStyle config covers only method definitions.
|
9
|
+
# Applications of visibility methods to symbols can be controlled
|
10
|
+
# using AllowModifiersOnSymbols config.
|
8
11
|
#
|
9
12
|
# @example EnforcedStyle: group (default)
|
10
|
-
#
|
11
13
|
# # bad
|
12
|
-
#
|
13
14
|
# class Foo
|
14
15
|
#
|
15
16
|
# private def bar; end
|
@@ -18,7 +19,6 @@ module RuboCop
|
|
18
19
|
# end
|
19
20
|
#
|
20
21
|
# # good
|
21
|
-
#
|
22
22
|
# class Foo
|
23
23
|
#
|
24
24
|
# private
|
@@ -27,10 +27,9 @@ module RuboCop
|
|
27
27
|
# def baz; end
|
28
28
|
#
|
29
29
|
# end
|
30
|
-
# @example EnforcedStyle: inline
|
31
30
|
#
|
31
|
+
# @example EnforcedStyle: inline
|
32
32
|
# # bad
|
33
|
-
#
|
34
33
|
# class Foo
|
35
34
|
#
|
36
35
|
# private
|
@@ -41,13 +40,28 @@ module RuboCop
|
|
41
40
|
# end
|
42
41
|
#
|
43
42
|
# # good
|
44
|
-
#
|
45
43
|
# class Foo
|
46
44
|
#
|
47
45
|
# private def bar; end
|
48
46
|
# private def baz; end
|
49
47
|
#
|
50
48
|
# end
|
49
|
+
#
|
50
|
+
# @example AllowModifiersOnSymbols: true
|
51
|
+
# # good
|
52
|
+
# class Foo
|
53
|
+
#
|
54
|
+
# private :bar, :baz
|
55
|
+
#
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# @example AllowModifiersOnSymbols: false
|
59
|
+
# # bad
|
60
|
+
# class Foo
|
61
|
+
#
|
62
|
+
# private :bar, :baz
|
63
|
+
#
|
64
|
+
# end
|
51
65
|
class AccessModifierDeclarations < Cop
|
52
66
|
include ConfigurableEnforcedStyle
|
53
67
|
|
@@ -61,9 +75,15 @@ module RuboCop
|
|
61
75
|
'inlined in method definitions.'
|
62
76
|
].join(' ')
|
63
77
|
|
78
|
+
def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
|
79
|
+
(send nil? {:private :protected :public} (sym _))
|
80
|
+
PATTERN
|
81
|
+
|
64
82
|
def on_send(node)
|
65
83
|
return unless node.access_modifier?
|
66
84
|
return if node.parent.pair_type?
|
85
|
+
return if cop_config['AllowModifiersOnSymbols'] &&
|
86
|
+
access_modifier_with_symbol?(node)
|
67
87
|
|
68
88
|
if offense?(node)
|
69
89
|
add_offense(node, location: :selector) do
|
@@ -115,7 +115,7 @@ module RuboCop
|
|
115
115
|
lambda do |corrector|
|
116
116
|
new, old = *send_node.arguments
|
117
117
|
replacement = "alias #{identifier(new)} #{identifier(old)}"
|
118
|
-
corrector.replace(send_node
|
118
|
+
corrector.replace(send_node, replacement)
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
@@ -125,15 +125,15 @@ module RuboCop
|
|
125
125
|
'alias_method ' \
|
126
126
|
":#{identifier(node.new_identifier)}, " \
|
127
127
|
":#{identifier(node.old_identifier)}"
|
128
|
-
corrector.replace(node
|
128
|
+
corrector.replace(node, replacement)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
def correct_alias_with_symbol_args(node)
|
133
133
|
lambda do |corrector|
|
134
|
-
corrector.replace(node.new_identifier
|
134
|
+
corrector.replace(node.new_identifier,
|
135
135
|
node.new_identifier.source[1..-1])
|
136
|
-
corrector.replace(node.old_identifier
|
136
|
+
corrector.replace(node.old_identifier,
|
137
137
|
node.old_identifier.source[1..-1])
|
138
138
|
end
|
139
139
|
end
|
@@ -97,12 +97,12 @@ module RuboCop
|
|
97
97
|
return unless correctable_send?(node)
|
98
98
|
|
99
99
|
corrector.replace(whitespace_before_arg(node), '(')
|
100
|
-
corrector.insert_after(node.last_argument
|
100
|
+
corrector.insert_after(node.last_argument, ')')
|
101
101
|
end
|
102
102
|
|
103
103
|
def correct_setter(node, corrector)
|
104
|
-
corrector.insert_before(node.receiver
|
105
|
-
corrector.insert_after(node.last_argument
|
104
|
+
corrector.insert_before(node.receiver, '(')
|
105
|
+
corrector.insert_after(node.last_argument, ')')
|
106
106
|
end
|
107
107
|
|
108
108
|
# ! is a special case:
|
@@ -124,8 +124,7 @@ module RuboCop
|
|
124
124
|
def correct_other(node, corrector)
|
125
125
|
return if node.source_range.begin.is?('(')
|
126
126
|
|
127
|
-
corrector.
|
128
|
-
corrector.insert_after(node.source_range, ')')
|
127
|
+
corrector.wrap(node, '(', ')')
|
129
128
|
end
|
130
129
|
|
131
130
|
def correctable_send?(node)
|
@@ -137,7 +136,7 @@ module RuboCop
|
|
137
136
|
end_paren = begin_paren
|
138
137
|
# Increment position of parenthesis, unless message is a predicate
|
139
138
|
# method followed by a non-whitespace char (e.g. is_a?String).
|
140
|
-
end_paren += 1 unless node.source
|
139
|
+
end_paren += 1 unless /\?\S/.match?(node.source)
|
141
140
|
range_between(begin_paren, end_paren)
|
142
141
|
end
|
143
142
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
3
4
|
module RuboCop
|
4
5
|
module Cop
|
5
6
|
module Style
|
@@ -106,12 +107,41 @@ module RuboCop
|
|
106
107
|
# word.flip.flop
|
107
108
|
# }
|
108
109
|
#
|
110
|
+
# @example BracesRequiredMethods: ['sig']
|
111
|
+
#
|
112
|
+
# # Methods listed in the BracesRequiredMethods list, such as 'sig'
|
113
|
+
# # in this example, will require `{...}` braces. This option takes
|
114
|
+
# # precedence over all other configurations except IgnoredMethods.
|
115
|
+
#
|
116
|
+
# # bad
|
117
|
+
# sig do
|
118
|
+
# params(
|
119
|
+
# foo: string,
|
120
|
+
# ).void
|
121
|
+
# end
|
122
|
+
# def bar(foo)
|
123
|
+
# puts foo
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# # good
|
127
|
+
# sig {
|
128
|
+
# params(
|
129
|
+
# foo: string,
|
130
|
+
# ).void
|
131
|
+
# }
|
132
|
+
# def bar(foo)
|
133
|
+
# puts foo
|
134
|
+
# end
|
135
|
+
#
|
109
136
|
class BlockDelimiters < Cop
|
110
137
|
include ConfigurableEnforcedStyle
|
111
138
|
include IgnoredMethods
|
112
139
|
|
113
140
|
ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
|
114
141
|
|
142
|
+
BRACES_REQUIRED_MESSAGE = 'Brace delimiters `{...}` required for ' \
|
143
|
+
"'%<method_name>s' method."
|
144
|
+
|
115
145
|
def on_send(node)
|
116
146
|
return unless node.arguments?
|
117
147
|
return if node.parenthesized?
|
@@ -175,7 +205,15 @@ module RuboCop
|
|
175
205
|
end
|
176
206
|
end
|
177
207
|
|
208
|
+
def braces_required_message(node)
|
209
|
+
format(BRACES_REQUIRED_MESSAGE, method_name: node.method_name.to_s)
|
210
|
+
end
|
211
|
+
|
178
212
|
def message(node)
|
213
|
+
if braces_required_method?(node.method_name)
|
214
|
+
return braces_required_message(node)
|
215
|
+
end
|
216
|
+
|
179
217
|
case style
|
180
218
|
when :line_count_based then line_count_based_message(node)
|
181
219
|
when :semantic then semantic_message(node)
|
@@ -238,7 +276,9 @@ module RuboCop
|
|
238
276
|
# rubocop:enable Metrics/CyclomaticComplexity
|
239
277
|
|
240
278
|
def proper_block_style?(node)
|
241
|
-
|
279
|
+
if special_method?(node.method_name)
|
280
|
+
return special_method_proper_block_style?(node)
|
281
|
+
end
|
242
282
|
|
243
283
|
case style
|
244
284
|
when :line_count_based then line_count_based_block_style?(node)
|
@@ -248,6 +288,24 @@ module RuboCop
|
|
248
288
|
end
|
249
289
|
end
|
250
290
|
|
291
|
+
def special_method?(method_name)
|
292
|
+
ignored_method?(method_name) || braces_required_method?(method_name)
|
293
|
+
end
|
294
|
+
|
295
|
+
def special_method_proper_block_style?(node)
|
296
|
+
method_name = node.method_name
|
297
|
+
return true if ignored_method?(method_name)
|
298
|
+
return node.braces? if braces_required_method?(method_name)
|
299
|
+
end
|
300
|
+
|
301
|
+
def braces_required_method?(method_name)
|
302
|
+
braces_required_methods.include?(method_name.to_s)
|
303
|
+
end
|
304
|
+
|
305
|
+
def braces_required_methods
|
306
|
+
cop_config.fetch('BracesRequiredMethods', [])
|
307
|
+
end
|
308
|
+
|
251
309
|
def line_count_based_block_style?(node)
|
252
310
|
node.multiline? ^ node.braces?
|
253
311
|
end
|
@@ -329,3 +387,4 @@ module RuboCop
|
|
329
387
|
end
|
330
388
|
end
|
331
389
|
end
|
390
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -16,14 +16,37 @@ module RuboCop
|
|
16
16
|
# (1..100).include?(7)
|
17
17
|
# some_string =~ /something/
|
18
18
|
#
|
19
|
+
# @example AllowOnConstant
|
20
|
+
# # Style/CaseEquality:
|
21
|
+
# # AllowOnConstant: true
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# (1..100) === 7
|
25
|
+
# /something/ === some_string
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# Array === something
|
29
|
+
# (1..100).include?(7)
|
30
|
+
# some_string =~ /something/
|
31
|
+
#
|
19
32
|
class CaseEquality < Cop
|
20
33
|
MSG = 'Avoid the use of the case equality operator `===`.'
|
21
34
|
|
22
|
-
def_node_matcher :case_equality?, '(send
|
35
|
+
def_node_matcher :case_equality?, '(send #const? :=== _)'
|
23
36
|
|
24
37
|
def on_send(node)
|
25
38
|
case_equality?(node) { add_offense(node, location: :selector) }
|
26
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def const?(node)
|
44
|
+
if cop_config.fetch('AllowOnConstant', false)
|
45
|
+
!node.const_type?
|
46
|
+
else
|
47
|
+
true
|
48
|
+
end
|
49
|
+
end
|
27
50
|
end
|
28
51
|
end
|
29
52
|
end
|
@@ -33,9 +33,9 @@ module RuboCop
|
|
33
33
|
# special character like \n
|
34
34
|
# or ' which needs to use "" or be escaped.
|
35
35
|
if string.length == 2 || string == "'"
|
36
|
-
corrector.replace(node
|
36
|
+
corrector.replace(node, %("#{string}"))
|
37
37
|
elsif string.length == 1 # normal character
|
38
|
-
corrector.replace(node
|
38
|
+
corrector.replace(node, "'#{string}'")
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -27,6 +27,7 @@ module RuboCop
|
|
27
27
|
# items.inject
|
28
28
|
# items.detect
|
29
29
|
# items.find_all
|
30
|
+
# items.member?
|
30
31
|
#
|
31
32
|
# # good
|
32
33
|
# items.map
|
@@ -34,6 +35,7 @@ module RuboCop
|
|
34
35
|
# items.reduce
|
35
36
|
# items.find
|
36
37
|
# items.select
|
38
|
+
# items.include?
|
37
39
|
#
|
38
40
|
class CollectionMethods < Cop
|
39
41
|
include MethodPreference
|
@@ -458,7 +458,7 @@ module RuboCop
|
|
458
458
|
def correct_if_branches(corrector, cop, node)
|
459
459
|
if_branch, elsif_branches, else_branch = extract_tail_branches(node)
|
460
460
|
|
461
|
-
corrector.insert_before(node
|
461
|
+
corrector.insert_before(node, lhs(if_branch))
|
462
462
|
replace_branch_assignment(corrector, if_branch)
|
463
463
|
correct_branches(corrector, elsif_branches)
|
464
464
|
replace_branch_assignment(corrector, else_branch)
|
@@ -475,13 +475,13 @@ module RuboCop
|
|
475
475
|
source
|
476
476
|
end
|
477
477
|
|
478
|
-
corrector.replace(branch
|
478
|
+
corrector.replace(branch, replacement)
|
479
479
|
end
|
480
480
|
|
481
481
|
def correct_branches(corrector, branches)
|
482
482
|
branches.each do |branch|
|
483
483
|
*_, assignment = *branch
|
484
|
-
corrector.replace(branch
|
484
|
+
corrector.replace(branch, assignment.source)
|
485
485
|
end
|
486
486
|
end
|
487
487
|
end
|
@@ -494,7 +494,7 @@ module RuboCop
|
|
494
494
|
|
495
495
|
def correct(node)
|
496
496
|
lambda do |corrector|
|
497
|
-
corrector.replace(node
|
497
|
+
corrector.replace(node, correction(node))
|
498
498
|
end
|
499
499
|
end
|
500
500
|
|
@@ -547,7 +547,7 @@ module RuboCop
|
|
547
547
|
end
|
548
548
|
|
549
549
|
def move_branch_inside_condition(corrector, branch, assignment)
|
550
|
-
corrector.insert_before(branch
|
550
|
+
corrector.insert_before(branch, assignment.source)
|
551
551
|
end
|
552
552
|
end
|
553
553
|
end
|
@@ -589,7 +589,7 @@ module RuboCop
|
|
589
589
|
def move_branch_inside_condition(corrector, branch, condition,
|
590
590
|
assignment, column)
|
591
591
|
branch_assignment = tail(branch)
|
592
|
-
corrector.insert_before(branch_assignment
|
592
|
+
corrector.insert_before(branch_assignment,
|
593
593
|
assignment.source)
|
594
594
|
|
595
595
|
remove_whitespace_in_branches(corrector, branch, condition, column)
|
@@ -611,7 +611,7 @@ module RuboCop
|
|
611
611
|
when_branches, else_branch = extract_tail_branches(node)
|
612
612
|
|
613
613
|
lambda do |corrector|
|
614
|
-
corrector.insert_before(node
|
614
|
+
corrector.insert_before(node, lhs(else_branch))
|
615
615
|
correct_branches(corrector, when_branches)
|
616
616
|
replace_branch_assignment(corrector, else_branch)
|
617
617
|
|
@@ -652,7 +652,7 @@ module RuboCop
|
|
652
652
|
def move_branch_inside_condition(corrector, branch, condition,
|
653
653
|
assignment, column)
|
654
654
|
branch_assignment = tail(branch)
|
655
|
-
corrector.insert_before(branch_assignment
|
655
|
+
corrector.insert_before(branch_assignment,
|
656
656
|
assignment.source)
|
657
657
|
|
658
658
|
remove_whitespace_in_branches(corrector, branch, condition, column)
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
|
56
56
|
|
57
57
|
regex = Regexp.new(notice)
|
58
|
-
return if autocorrect_notice
|
58
|
+
return if autocorrect_notice&.match?(regex)
|
59
59
|
|
60
60
|
raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
|
61
61
|
"match Notice /#{notice}/"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Lint/RedundantCopDisableDirective
|
4
|
+
|
5
|
+
module RuboCop
|
6
|
+
module Cop
|
7
|
+
module Style
|
8
|
+
# Detects comments to enable/disable RuboCop.
|
9
|
+
# This is useful if want to make sure that every RuboCop error gets fixed
|
10
|
+
# and not quickly disabled with a comment.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# # rubocop:disable Metrics/AbcSize
|
15
|
+
# def f
|
16
|
+
# end
|
17
|
+
# # rubocop:enable Metrics/AbcSize
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# def fixed_method_name_and_no_rubocop_comments
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
class DisableCopsWithinSourceCodeDirective < Cop
|
24
|
+
# rubocop:enable Lint/RedundantCopDisableDirective
|
25
|
+
MSG = 'Comment to disable/enable RuboCop.'
|
26
|
+
|
27
|
+
def investigate(processed_source)
|
28
|
+
processed_source.comments.each do |comment|
|
29
|
+
next unless rubocop_directive_comment?(comment)
|
30
|
+
|
31
|
+
add_offense(comment)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def autocorrect(comment)
|
36
|
+
lambda do |corrector|
|
37
|
+
corrector.replace(comment, '')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def rubocop_directive_comment?(comment)
|
44
|
+
comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|