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
@@ -11,8 +11,8 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# Configuration option: MinSize
|
13
13
|
# If set, arrays with fewer elements than this value will not trigger the
|
14
|
-
# cop. For example, a `MinSize of `3` will not enforce a style on an
|
15
|
-
# of 2 or fewer elements.
|
14
|
+
# cop. For example, a `MinSize` of `3` will not enforce a style on an
|
15
|
+
# array of 2 or fewer elements.
|
16
16
|
#
|
17
17
|
# @example EnforcedStyle: percent (default)
|
18
18
|
# # good
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
end
|
82
82
|
|
83
83
|
lambda do |corrector|
|
84
|
-
corrector.replace(node
|
84
|
+
corrector.replace(node, "[#{syms.join(', ')}]")
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -16,14 +16,14 @@ module RuboCop
|
|
16
16
|
MSG = 'Do not use strings for word-like symbol literals.'
|
17
17
|
|
18
18
|
def on_sym(node)
|
19
|
-
return unless
|
19
|
+
return unless /\A:["'][A-Za-z_]\w*["']\z/.match?(node.source)
|
20
20
|
|
21
21
|
add_offense(node)
|
22
22
|
end
|
23
23
|
|
24
24
|
def autocorrect(node)
|
25
25
|
lambda do |corrector|
|
26
|
-
corrector.replace(node
|
26
|
+
corrector.replace(node, node.source.delete(%q('")))
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -162,7 +162,7 @@ module RuboCop
|
|
162
162
|
# `RedundantParentheses` cop is enabled, it will cause an infinite loop
|
163
163
|
# as they compete to add and remove the parentheses respectively.
|
164
164
|
def infinite_loop?
|
165
|
-
require_parentheses? &&
|
165
|
+
(require_parentheses? || require_parentheses_when_complex?) &&
|
166
166
|
redundant_parentheses_enabled?
|
167
167
|
end
|
168
168
|
|
@@ -207,8 +207,7 @@ module RuboCop
|
|
207
207
|
|
208
208
|
def correct_unparenthesized(condition)
|
209
209
|
lambda do |corrector|
|
210
|
-
corrector.
|
211
|
-
corrector.insert_after(condition.source_range, ')')
|
210
|
+
corrector.wrap(condition, '(', ')')
|
212
211
|
end
|
213
212
|
end
|
214
213
|
|
@@ -4,6 +4,14 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# This cop checks for trailing comma in argument lists.
|
7
|
+
# The supported styles are:
|
8
|
+
#
|
9
|
+
# - `consistent_comma`: Requires a comma after the last argument,
|
10
|
+
# for all parenthesized method calls with arguments.
|
11
|
+
# - `comma`: Requires a comma after the last argument, but only for
|
12
|
+
# parenthesized method calls where each argument is on its own line.
|
13
|
+
# - `no_comma`: Requires that there is no comma after the last
|
14
|
+
# argument.
|
7
15
|
#
|
8
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
9
17
|
# # bad
|
@@ -20,6 +28,11 @@ module RuboCop
|
|
20
28
|
#
|
21
29
|
# # good
|
22
30
|
# method(
|
31
|
+
# 1, 2, 3,
|
32
|
+
# )
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# method(
|
23
36
|
# 1,
|
24
37
|
# 2,
|
25
38
|
# )
|
@@ -31,6 +44,28 @@ module RuboCop
|
|
31
44
|
# # good
|
32
45
|
# method(1, 2)
|
33
46
|
#
|
47
|
+
# # bad
|
48
|
+
# method(
|
49
|
+
# 1, 2,
|
50
|
+
# 3,
|
51
|
+
# )
|
52
|
+
#
|
53
|
+
# # good
|
54
|
+
# method(
|
55
|
+
# 1, 2,
|
56
|
+
# 3
|
57
|
+
# )
|
58
|
+
#
|
59
|
+
# # bad
|
60
|
+
# method(
|
61
|
+
# 1, 2, 3,
|
62
|
+
# )
|
63
|
+
#
|
64
|
+
# # good
|
65
|
+
# method(
|
66
|
+
# 1, 2, 3
|
67
|
+
# )
|
68
|
+
#
|
34
69
|
# # good
|
35
70
|
# method(
|
36
71
|
# 1,
|
@@ -68,28 +103,6 @@ module RuboCop
|
|
68
103
|
def self.autocorrect_incompatible_with
|
69
104
|
[Layout::HeredocArgumentClosingParenthesis]
|
70
105
|
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def avoid_autocorrect?(args)
|
75
|
-
args.last.hash_type? && args.last.braces? &&
|
76
|
-
braces_will_be_removed?(args)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns true if running with --auto-correct would remove the braces
|
80
|
-
# of the last argument.
|
81
|
-
def braces_will_be_removed?(args)
|
82
|
-
brace_config = config.for_cop('Style/BracesAroundHashParameters')
|
83
|
-
return false unless brace_config.fetch('Enabled')
|
84
|
-
return false if brace_config['AutoCorrect'] == false
|
85
|
-
|
86
|
-
brace_style = brace_config['EnforcedStyle']
|
87
|
-
return true if brace_style == 'no_braces'
|
88
|
-
|
89
|
-
return false unless brace_style == 'context_dependent'
|
90
|
-
|
91
|
-
args.one? || !args[-2].hash_type?
|
92
|
-
end
|
93
106
|
end
|
94
107
|
end
|
95
108
|
end
|
@@ -4,12 +4,23 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# This cop checks for trailing comma in array literals.
|
7
|
+
# The configuration options are:
|
8
|
+
#
|
9
|
+
# - `consistent_comma`: Requires a comma after the
|
10
|
+
# last item of all non-empty, multiline array literals.
|
11
|
+
# - `comma`: Requires a comma after last item in an array,
|
12
|
+
# but only when each item is on its own line.
|
13
|
+
# - `no_comma`: Does not requires a comma after the
|
14
|
+
# last item in an array
|
7
15
|
#
|
8
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
9
17
|
# # bad
|
10
18
|
# a = [1, 2,]
|
11
19
|
#
|
12
20
|
# # good
|
21
|
+
# a = [1, 2]
|
22
|
+
#
|
23
|
+
# # good
|
13
24
|
# a = [
|
14
25
|
# 1, 2,
|
15
26
|
# 3,
|
@@ -17,6 +28,11 @@ module RuboCop
|
|
17
28
|
#
|
18
29
|
# # good
|
19
30
|
# a = [
|
31
|
+
# 1, 2, 3,
|
32
|
+
# ]
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# a = [
|
20
36
|
# 1,
|
21
37
|
# 2,
|
22
38
|
# ]
|
@@ -26,6 +42,31 @@ module RuboCop
|
|
26
42
|
# a = [1, 2,]
|
27
43
|
#
|
28
44
|
# # good
|
45
|
+
# a = [1, 2]
|
46
|
+
#
|
47
|
+
# # bad
|
48
|
+
# a = [
|
49
|
+
# 1, 2,
|
50
|
+
# 3,
|
51
|
+
# ]
|
52
|
+
#
|
53
|
+
# # good
|
54
|
+
# a = [
|
55
|
+
# 1, 2,
|
56
|
+
# 3
|
57
|
+
# ]
|
58
|
+
#
|
59
|
+
# # bad
|
60
|
+
# a = [
|
61
|
+
# 1, 2, 3,
|
62
|
+
# ]
|
63
|
+
#
|
64
|
+
# # good
|
65
|
+
# a = [
|
66
|
+
# 1, 2, 3
|
67
|
+
# ]
|
68
|
+
#
|
69
|
+
# # good
|
29
70
|
# a = [
|
30
71
|
# 1,
|
31
72
|
# 2,
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks whether trailing commas in block arguments are
|
7
|
+
# required. Blocks with only one argument and a trailing comma require
|
8
|
+
# that comma to be present. Blocks with more than one argument never
|
9
|
+
# require a trailing comma.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # bad
|
13
|
+
# add { |foo, bar,| foo + bar }
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# add { |foo, bar| foo + bar }
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# add { |foo,| foo }
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# add { foo }
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# add do |foo, bar,|
|
26
|
+
# foo + bar
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# add do |foo, bar|
|
31
|
+
# foo + bar
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# add do |foo,|
|
36
|
+
# foo
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# # good
|
40
|
+
# add do
|
41
|
+
# foo + bar
|
42
|
+
# end
|
43
|
+
class TrailingCommaInBlockArgs < Cop
|
44
|
+
MSG = 'Useless trailing comma present in block arguments.'
|
45
|
+
|
46
|
+
def on_block(node)
|
47
|
+
# lambda literal (`->`) never has block arguments.
|
48
|
+
return if node.send_node.lambda_literal?
|
49
|
+
|
50
|
+
return unless useless_trailing_comma?(node)
|
51
|
+
|
52
|
+
add_offense(node, location: last_comma(node).pos)
|
53
|
+
end
|
54
|
+
|
55
|
+
def autocorrect(node)
|
56
|
+
->(corrector) { corrector.replace(last_comma(node).pos, '') }
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def useless_trailing_comma?(node)
|
62
|
+
arg_count(node) > 1 && trailing_comma?(node)
|
63
|
+
end
|
64
|
+
|
65
|
+
def arg_count(node)
|
66
|
+
node.arguments.each_descendant(:arg, :optarg, :kwoptarg).to_a.size
|
67
|
+
end
|
68
|
+
|
69
|
+
def trailing_comma?(node)
|
70
|
+
argument_tokens(node).last.comma?
|
71
|
+
end
|
72
|
+
|
73
|
+
def last_comma(node)
|
74
|
+
argument_tokens(node).last
|
75
|
+
end
|
76
|
+
|
77
|
+
def argument_tokens(node)
|
78
|
+
pipes = tokens(node).select { |token| token.type == :tPIPE }
|
79
|
+
begin_pos, end_pos = pipes.map do |pipe|
|
80
|
+
tokens(node).index(pipe)
|
81
|
+
end
|
82
|
+
|
83
|
+
tokens(node)[begin_pos + 1..end_pos - 1]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -4,12 +4,24 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# This cop checks for trailing comma in hash literals.
|
7
|
+
# The configuration options are:
|
8
|
+
#
|
9
|
+
# - `consistent_comma`: Requires a comma after the
|
10
|
+
# last item of all non-empty, multiline hash literals.
|
11
|
+
# - `comma`: Requires a comma after the last item in a hash,
|
12
|
+
# but only when each item is on its own line.
|
13
|
+
# - `no_comma`: Does not requires a comma after the
|
14
|
+
# last item in a hash
|
7
15
|
#
|
8
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
|
+
#
|
9
18
|
# # bad
|
10
19
|
# a = { foo: 1, bar: 2, }
|
11
20
|
#
|
12
21
|
# # good
|
22
|
+
# a = { foo: 1, bar: 2 }
|
23
|
+
#
|
24
|
+
# # good
|
13
25
|
# a = {
|
14
26
|
# foo: 1, bar: 2,
|
15
27
|
# qux: 3,
|
@@ -17,21 +29,53 @@ module RuboCop
|
|
17
29
|
#
|
18
30
|
# # good
|
19
31
|
# a = {
|
32
|
+
# foo: 1, bar: 2, qux: 3,
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# # good
|
36
|
+
# a = {
|
20
37
|
# foo: 1,
|
21
38
|
# bar: 2,
|
22
39
|
# }
|
23
40
|
#
|
24
41
|
# @example EnforcedStyleForMultiline: comma
|
42
|
+
#
|
25
43
|
# # bad
|
26
44
|
# a = { foo: 1, bar: 2, }
|
27
45
|
#
|
28
46
|
# # good
|
47
|
+
# a = { foo: 1, bar: 2 }
|
48
|
+
#
|
49
|
+
# # bad
|
50
|
+
# a = {
|
51
|
+
# foo: 1, bar: 2,
|
52
|
+
# qux: 3,
|
53
|
+
# }
|
54
|
+
#
|
55
|
+
# # good
|
56
|
+
# a = {
|
57
|
+
# foo: 1, bar: 2,
|
58
|
+
# qux: 3
|
59
|
+
# }
|
60
|
+
#
|
61
|
+
# # bad
|
62
|
+
# a = {
|
63
|
+
# foo: 1, bar: 2, qux: 3,
|
64
|
+
# }
|
65
|
+
#
|
66
|
+
# # good
|
67
|
+
# a = {
|
68
|
+
# foo: 1, bar: 2, qux: 3
|
69
|
+
# }
|
70
|
+
#
|
71
|
+
# # good
|
29
72
|
# a = {
|
30
73
|
# foo: 1,
|
31
74
|
# bar: 2,
|
32
75
|
# }
|
33
76
|
#
|
34
77
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
78
|
+
#
|
35
79
|
# # bad
|
36
80
|
# a = { foo: 1, bar: 2, }
|
37
81
|
#
|
@@ -18,10 +18,6 @@ module RuboCop
|
|
18
18
|
# 'foo'.unpack1('h*')
|
19
19
|
#
|
20
20
|
class UnpackFirst < Cop
|
21
|
-
extend TargetRubyVersion
|
22
|
-
|
23
|
-
minimum_target_ruby_version 2.4
|
24
|
-
|
25
21
|
MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
|
26
22
|
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
27
23
|
|
@@ -67,9 +67,16 @@ module RuboCop
|
|
67
67
|
|
68
68
|
NONCOMMUTATIVE_OPERATORS = %i[===].freeze
|
69
69
|
|
70
|
+
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
71
|
+
|
72
|
+
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
73
|
+
(send #source_file_path_constant? {:== :!=} (gvar #program_name?))
|
74
|
+
PATTERN
|
75
|
+
|
70
76
|
def on_send(node)
|
71
77
|
return unless yoda_compatible_condition?(node)
|
72
|
-
return if equality_only? && non_equality_operator?(node)
|
78
|
+
return if equality_only? && non_equality_operator?(node) ||
|
79
|
+
file_constant_equal_program_name?(node)
|
73
80
|
|
74
81
|
valid_yoda?(node) || add_offense(node)
|
75
82
|
end
|
@@ -135,6 +142,14 @@ module RuboCop
|
|
135
142
|
def noncommutative_operator?(node)
|
136
143
|
NONCOMMUTATIVE_OPERATORS.include?(node.method_name)
|
137
144
|
end
|
145
|
+
|
146
|
+
def source_file_path_constant?(node)
|
147
|
+
node.source == '__FILE__'
|
148
|
+
end
|
149
|
+
|
150
|
+
def program_name?(name)
|
151
|
+
PROGRAM_NAMES.include?(name)
|
152
|
+
end
|
138
153
|
end
|
139
154
|
end
|
140
155
|
end
|