rubocop 0.48.1 → 0.49.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -3
- data/config/default.yml +397 -357
- data/config/disabled.yml +29 -29
- data/config/enabled.yml +366 -326
- data/lib/rubocop.rb +85 -70
- data/lib/rubocop/ast/builder.rb +4 -1
- data/lib/rubocop/ast/node.rb +2 -2
- data/lib/rubocop/ast/node/and_node.rb +1 -1
- data/lib/rubocop/ast/node/args_node.rb +24 -0
- data/lib/rubocop/ast/node/block_node.rb +107 -0
- data/lib/rubocop/ast/node/case_node.rb +1 -1
- data/lib/rubocop/ast/node/ensure_node.rb +1 -1
- data/lib/rubocop/ast/node/for_node.rb +1 -1
- data/lib/rubocop/ast/node/if_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +74 -0
- data/lib/rubocop/ast/node/or_node.rb +1 -1
- data/lib/rubocop/ast/node/pair_node.rb +1 -1
- data/lib/rubocop/ast/node/resbody_node.rb +1 -1
- data/lib/rubocop/ast/node/send_node.rb +36 -57
- data/lib/rubocop/ast/node/super_node.rb +42 -0
- data/lib/rubocop/ast/node/until_node.rb +1 -1
- data/lib/rubocop/ast/node/when_node.rb +1 -1
- data/lib/rubocop/ast/node/while_node.rb +1 -1
- data/lib/rubocop/cli.rb +10 -0
- data/lib/rubocop/config.rb +23 -7
- data/lib/rubocop/config_loader.rb +19 -3
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/commissioner.rb +1 -1
- data/lib/rubocop/cop/cop.rb +10 -0
- data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +33 -3
- data/lib/rubocop/cop/{style → layout}/align_array.rb +16 -1
- data/lib/rubocop/cop/{style → layout}/align_hash.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/align_parameters.rb +29 -1
- data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +10 -5
- data/lib/rubocop/cop/{style → layout}/case_indentation.rb +64 -1
- data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +2 -2
- data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/dot_position.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/else_alignment.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_line_after_magic_comment.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +2 -7
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +2 -4
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/end_of_line.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/indent_array.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/indent_hash.rb +2 -2
- data/lib/rubocop/cop/{style → layout}/indent_heredoc.rb +3 -3
- data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/indentation_width.rb +10 -12
- data/lib/rubocop/cop/{style → layout}/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +21 -36
- data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +5 -1
- data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/multiline_method_call_indentation.rb +3 -3
- data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +6 -5
- data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/{style → layout}/space_after_comma.rb +2 -2
- data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_after_not.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +2 -2
- data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +7 -5
- data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_around_operators.rb +6 -2
- data/lib/rubocop/cop/{style → layout}/space_before_block_braces.rb +6 -2
- data/lib/rubocop/cop/{style → layout}/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +4 -2
- data/lib/rubocop/cop/{style → layout}/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_block_braces.rb +3 -4
- data/lib/rubocop/cop/{style → layout}/space_inside_brackets.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +8 -7
- data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/space_inside_string_interpolation.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/tab.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +1 -1
- data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -4
- data/lib/rubocop/cop/lint/debugger.rb +0 -15
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +81 -0
- data/lib/rubocop/cop/lint/script_permission.rb +42 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
- data/lib/rubocop/cop/message_annotator.rb +23 -13
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +10 -11
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +36 -0
- data/lib/rubocop/cop/mixin/hash_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/performance/caller.rb +41 -0
- data/lib/rubocop/cop/performance/compare_with_block.rb +60 -14
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_merge.rb +2 -0
- data/lib/rubocop/cop/rails/action_filter.rb +1 -3
- data/lib/rubocop/cop/rails/application_job.rb +32 -0
- data/lib/rubocop/cop/rails/application_record.rb +32 -0
- data/lib/rubocop/cop/rails/blank.rb +9 -3
- data/lib/rubocop/cop/rails/output_safety.rb +59 -15
- data/lib/rubocop/cop/rails/present.rb +9 -3
- data/lib/rubocop/cop/rails/relative_date_constant.rb +35 -4
- data/lib/rubocop/cop/rails/reversible_migration.rb +82 -18
- data/lib/rubocop/cop/rails/save_bang.rb +7 -2
- data/lib/rubocop/cop/rails/skips_model_validations.rb +7 -0
- data/lib/rubocop/cop/registry.rb +4 -3
- data/lib/rubocop/cop/security/eval.rb +9 -3
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +11 -17
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +1 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
- data/lib/rubocop/cop/style/copyright.rb +2 -2
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -1
- data/lib/rubocop/cop/style/each_with_object.rb +10 -6
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +4 -5
- data/lib/rubocop/cop/style/format_string.rb +49 -0
- data/lib/rubocop/cop/style/format_string_token.rb +141 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -1
- data/lib/rubocop/cop/style/lambda.rb +9 -9
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -3
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -2
- data/lib/rubocop/cop/style/method_name.rb +8 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +41 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +7 -11
- data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
- data/lib/rubocop/cop/style/next.rb +11 -22
- data/lib/rubocop/cop/style/parallel_assignment.rb +10 -19
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/self_assignment.rb +4 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +23 -17
- data/lib/rubocop/cop/style/symbol_array.rb +24 -13
- data/lib/rubocop/cop/style/symbol_proc.rb +4 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +4 -0
- data/lib/rubocop/cop/style/word_array.rb +33 -53
- data/lib/rubocop/cop/style/yoda_condition.rb +78 -0
- data/lib/rubocop/cop/team.rb +1 -14
- data/lib/rubocop/cop/util.rb +16 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -11
- data/lib/rubocop/node_pattern.rb +52 -52
- data/lib/rubocop/options.rb +25 -0
- data/lib/rubocop/path_util.rb +17 -1
- data/lib/rubocop/result_cache.rb +8 -7
- data/lib/rubocop/rspec/expect_offense.rb +167 -0
- data/lib/rubocop/rspec/shared_examples.rb +0 -8
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +12 -2
- data/lib/rubocop/target_finder.rb +5 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +101 -72
@@ -9,32 +9,34 @@ module RuboCop
|
|
9
9
|
# For instance one can configure `reduce`(`inject`) to use |a, e| as
|
10
10
|
# parameters.
|
11
11
|
class SingleLineBlockParams < Cop
|
12
|
+
MSG = 'Name `%s` block params `|%s|`.'.freeze
|
13
|
+
|
12
14
|
def on_block(node)
|
13
|
-
|
14
|
-
|
15
|
+
return unless node.single_line?
|
16
|
+
|
17
|
+
send_node = node.send_node
|
15
18
|
|
16
|
-
|
17
|
-
|
19
|
+
return unless send_node.receiver
|
20
|
+
return unless method_names.include?(send_node.method_name)
|
18
21
|
|
19
|
-
|
20
|
-
return unless receiver
|
21
|
-
return unless method_names.include?(method_name)
|
22
|
+
return unless node.arguments?
|
22
23
|
|
23
|
-
|
24
|
+
arguments = node.arguments.to_a
|
24
25
|
|
25
|
-
return if args.empty?
|
26
26
|
# discard cases with argument destructuring
|
27
|
-
return true unless
|
28
|
-
return if args_match?(method_name,
|
27
|
+
return true unless arguments.all?(&:arg_type?)
|
28
|
+
return if args_match?(send_node.method_name, arguments)
|
29
29
|
|
30
|
-
add_offense(
|
30
|
+
add_offense(node.arguments, :expression)
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def message(
|
36
|
-
|
37
|
-
|
35
|
+
def message(node)
|
36
|
+
method_name = node.parent.send_node.method_name
|
37
|
+
arguments = target_args(method_name).join(', ')
|
38
|
+
|
39
|
+
format(MSG, method_name, arguments)
|
38
40
|
end
|
39
41
|
|
40
42
|
def methods
|
@@ -42,12 +44,16 @@ module RuboCop
|
|
42
44
|
end
|
43
45
|
|
44
46
|
def method_names
|
45
|
-
methods.map { |
|
47
|
+
methods.map { |method| method_name(method).to_sym }
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_name(method)
|
51
|
+
method.keys.first
|
46
52
|
end
|
47
53
|
|
48
54
|
def target_args(method_name)
|
49
55
|
method_name = method_name.to_s
|
50
|
-
method_hash = methods.find { |m| m
|
56
|
+
method_hash = methods.find { |m| method_name(m) == method_name }
|
51
57
|
method_hash[method_name]
|
52
58
|
end
|
53
59
|
|
@@ -10,6 +10,11 @@ module RuboCop
|
|
10
10
|
# projects which do not want to use that syntax, perhaps because they
|
11
11
|
# support a version of Ruby lower than 2.0.
|
12
12
|
#
|
13
|
+
# Configuration option: MinSize
|
14
|
+
# If set, arrays with fewer elements than this value will not trigger the
|
15
|
+
# cop. For example, a `MinSize of `3` will not enforce a style on an array
|
16
|
+
# of 2 or fewer elements.
|
17
|
+
#
|
13
18
|
# @example
|
14
19
|
# EnforcedStyle: percent (default)
|
15
20
|
#
|
@@ -28,8 +33,9 @@ module RuboCop
|
|
28
33
|
# # bad
|
29
34
|
# %i[foo bar baz]
|
30
35
|
class SymbolArray < Cop
|
31
|
-
include
|
36
|
+
include ArrayMinSize
|
32
37
|
include ArraySyntax
|
38
|
+
include ConfigurableEnforcedStyle
|
33
39
|
include PercentLiteral
|
34
40
|
extend TargetRubyVersion
|
35
41
|
|
@@ -38,6 +44,10 @@ module RuboCop
|
|
38
44
|
PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'.freeze
|
39
45
|
ARRAY_MSG = 'Use `[]` for an array of symbols.'.freeze
|
40
46
|
|
47
|
+
class << self
|
48
|
+
attr_accessor :largest_brackets
|
49
|
+
end
|
50
|
+
|
41
51
|
def on_array(node)
|
42
52
|
if bracketed_array_of?(:sym, node)
|
43
53
|
check_bracketed_array(node)
|
@@ -46,18 +56,27 @@ module RuboCop
|
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
59
|
+
def autocorrect(node)
|
60
|
+
if style == :percent
|
61
|
+
correct_percent(node, 'i')
|
62
|
+
else
|
63
|
+
correct_bracketed(node)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
49
67
|
private
|
50
68
|
|
51
69
|
def check_bracketed_array(node)
|
52
|
-
return if comments_in_array?(node)
|
53
|
-
|
70
|
+
return if comments_in_array?(node) ||
|
71
|
+
symbols_contain_spaces?(node) ||
|
72
|
+
below_array_length?(node)
|
54
73
|
|
55
|
-
|
74
|
+
array_style_detected(:brackets, node.values.size)
|
56
75
|
add_offense(node, :expression, PERCENT_MSG) if style == :percent
|
57
76
|
end
|
58
77
|
|
59
78
|
def check_percent_array(node)
|
60
|
-
|
79
|
+
array_style_detected(:percent, node.values.size)
|
61
80
|
add_offense(node, :expression, ARRAY_MSG) if style == :brackets
|
62
81
|
end
|
63
82
|
|
@@ -77,14 +96,6 @@ module RuboCop
|
|
77
96
|
end
|
78
97
|
end
|
79
98
|
|
80
|
-
def autocorrect(node)
|
81
|
-
if style == :percent
|
82
|
-
correct_percent(node, 'i')
|
83
|
-
else
|
84
|
-
correct_bracketed(node)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
99
|
def correct_bracketed(node)
|
89
100
|
syms = node.children.map { |c| to_symbol_literal(c.children[0].to_s) }
|
90
101
|
|
@@ -23,6 +23,10 @@ module RuboCop
|
|
23
23
|
$(send lvar $_))
|
24
24
|
PATTERN
|
25
25
|
|
26
|
+
def self.autocorrect_incompatible_with
|
27
|
+
[Layout::SpaceBeforeBlockBraces]
|
28
|
+
end
|
29
|
+
|
26
30
|
def on_block(node)
|
27
31
|
symbol_proc?(node) do |send_or_super, block_args, block_body, method|
|
28
32
|
block_method_name = resolve_block_method_name(send_or_super)
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# This cop checks for the presence of parentheses around ternary
|
7
7
|
# conditions. It is configurable to enforce inclusion or omission of
|
8
8
|
# parentheses using `EnforcedStyle`. Omission is only enforced when
|
9
|
-
# removing the parentheses won't cause a different
|
9
|
+
# removing the parentheses won't cause a different behavior.
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
#
|
@@ -20,6 +20,10 @@ module RuboCop
|
|
20
20
|
|
21
21
|
MSG = 'Prefer `to_s` over string interpolation.'.freeze
|
22
22
|
|
23
|
+
def self.autocorrect_incompatible_with
|
24
|
+
[Style::LineEndConcatenation]
|
25
|
+
end
|
26
|
+
|
23
27
|
def on_dstr(node)
|
24
28
|
add_offense(node, :expression, MSG) if single_interpolation?(node)
|
25
29
|
end
|
@@ -8,7 +8,31 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# Alternatively, it can check for uses of the %w() syntax, in projects
|
10
10
|
# which do not want to include that syntax.
|
11
|
+
#
|
12
|
+
# Configuration option: MinSize
|
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 array
|
15
|
+
# of 2 or fewer elements.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# EnforcedStyle: percent (default)
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# %w[foo bar baz]
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# ['foo', 'bar', 'baz']
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# EnforcedStyle: brackets
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# ['foo', 'bar', 'baz']
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# %w[foo bar baz]
|
11
34
|
class WordArray < Cop
|
35
|
+
include ArrayMinSize
|
12
36
|
include ArraySyntax
|
13
37
|
include ConfigurableEnforcedStyle
|
14
38
|
include PercentLiteral
|
@@ -23,9 +47,9 @@ module RuboCop
|
|
23
47
|
|
24
48
|
def on_array(node)
|
25
49
|
if bracketed_array_of?(:str, node)
|
26
|
-
|
50
|
+
check_bracketed_array(node)
|
27
51
|
elsif node.percent_literal?(:string)
|
28
|
-
|
52
|
+
check_percent_array(node)
|
29
53
|
end
|
30
54
|
end
|
31
55
|
|
@@ -39,18 +63,17 @@ module RuboCop
|
|
39
63
|
|
40
64
|
private
|
41
65
|
|
42
|
-
def
|
66
|
+
def check_bracketed_array(node)
|
43
67
|
return if complex_content?(node.values) ||
|
44
|
-
comments_in_array?(node)
|
45
|
-
|
68
|
+
comments_in_array?(node) ||
|
69
|
+
below_array_length?(node)
|
46
70
|
|
47
|
-
|
48
|
-
|
49
|
-
add_offense(node, :expression, PERCENT_MSG)
|
71
|
+
array_style_detected(:brackets, node.values.size)
|
72
|
+
add_offense(node, :expression, PERCENT_MSG) if style == :percent
|
50
73
|
end
|
51
74
|
|
52
|
-
def
|
53
|
-
|
75
|
+
def check_percent_array(node)
|
76
|
+
array_style_detected(:percent, node.values.size)
|
54
77
|
add_offense(node, :expression, ARRAY_MSG) if style == :brackets
|
55
78
|
end
|
56
79
|
|
@@ -74,10 +97,6 @@ module RuboCop
|
|
74
97
|
end
|
75
98
|
end
|
76
99
|
|
77
|
-
def min_size
|
78
|
-
cop_config['MinSize']
|
79
|
-
end
|
80
|
-
|
81
100
|
def word_regex
|
82
101
|
Regexp.new(cop_config['WordRegex'])
|
83
102
|
end
|
@@ -89,45 +108,6 @@ module RuboCop
|
|
89
108
|
corrector.replace(node.source_range, "[#{words.join(', ')}]")
|
90
109
|
end
|
91
110
|
end
|
92
|
-
|
93
|
-
def style_detected(style, ary_size)
|
94
|
-
cfg = config_to_allow_offenses
|
95
|
-
return if cfg['Enabled'] == false
|
96
|
-
|
97
|
-
largest_brackets = largest_brackets_size(style, ary_size)
|
98
|
-
smallest_percent = smallest_percent_size(style, ary_size)
|
99
|
-
|
100
|
-
if cfg['EnforcedStyle'] == style.to_s
|
101
|
-
# do nothing
|
102
|
-
elsif cfg['EnforcedStyle'].nil?
|
103
|
-
cfg['EnforcedStyle'] = style.to_s
|
104
|
-
elsif smallest_percent <= largest_brackets
|
105
|
-
self.config_to_allow_offenses = { 'Enabled' => false }
|
106
|
-
else
|
107
|
-
cfg['EnforcedStyle'] = 'percent'
|
108
|
-
cfg['MinSize'] = largest_brackets + 1
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def largest_brackets_size(style, ary_size)
|
113
|
-
self.class.largest_brackets ||= -Float::INFINITY
|
114
|
-
|
115
|
-
if style == :brackets && ary_size > self.class.largest_brackets
|
116
|
-
self.class.largest_brackets = ary_size
|
117
|
-
end
|
118
|
-
|
119
|
-
self.class.largest_brackets
|
120
|
-
end
|
121
|
-
|
122
|
-
def smallest_percent_size(style, ary_size)
|
123
|
-
@smallest_percent ||= Float::INFINITY
|
124
|
-
|
125
|
-
if style == :percent && ary_size < @smallest_percent
|
126
|
-
@smallest_percent = ary_size
|
127
|
-
end
|
128
|
-
|
129
|
-
@smallest_percent
|
130
|
-
end
|
131
111
|
end
|
132
112
|
end
|
133
113
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for Yoda conditions, i.e. comparison operations where
|
7
|
+
# readability is reduced because the operands are not ordered the same
|
8
|
+
# way as they would be ordered in spoken English.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
#
|
12
|
+
# # bad
|
13
|
+
# 99 == foo
|
14
|
+
# "bar" == foo
|
15
|
+
# 42 >= foo
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# foo == 99
|
21
|
+
# foo == "bar"
|
22
|
+
# for <= 42
|
23
|
+
class YodaCondition < Cop
|
24
|
+
MSG = 'Reverse the order of the operands `%s`.'.freeze
|
25
|
+
WHITELIST_TYPES = %i[lvar ivar send const regexp begin].freeze
|
26
|
+
REVERSE_COMPARISON = {
|
27
|
+
'<' => '>',
|
28
|
+
'<=' => '>=',
|
29
|
+
'>' => '<',
|
30
|
+
'>=' => '<='
|
31
|
+
}.freeze
|
32
|
+
|
33
|
+
def on_send(node)
|
34
|
+
return unless yoda_condition?(node)
|
35
|
+
|
36
|
+
register_offense(node)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def yoda_condition?(node)
|
42
|
+
return false unless comparison_operator?(node)
|
43
|
+
|
44
|
+
!WHITELIST_TYPES.include?(node.receiver.type)
|
45
|
+
end
|
46
|
+
|
47
|
+
def comparison_operator?(node)
|
48
|
+
RuboCop::AST::Node::COMPARISON_OPERATORS.include?(node.method_name)
|
49
|
+
end
|
50
|
+
|
51
|
+
def register_offense(node)
|
52
|
+
add_offense(node, :expression, format(MSG, node.source))
|
53
|
+
end
|
54
|
+
|
55
|
+
def autocorrect(node)
|
56
|
+
lambda do |corrector|
|
57
|
+
corrector.replace(actual_code_range(node), corrected_code(node))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def corrected_code(node)
|
62
|
+
first, operator, last = node.children
|
63
|
+
"#{last.source} #{reverse_comparison(operator)} #{first.source}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def actual_code_range(node)
|
67
|
+
range_between(
|
68
|
+
node.loc.expression.begin_pos, node.loc.expression.end_pos
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def reverse_comparison(operator)
|
73
|
+
REVERSE_COMPARISON.fetch(operator.to_s, operator)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/rubocop/cop/team.rb
CHANGED
@@ -4,18 +4,6 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# FIXME
|
6
6
|
class Team
|
7
|
-
# If these cops try to autocorrect the same file at the same time,
|
8
|
-
# bad things are liable to happen
|
9
|
-
INCOMPATIBLE_COPS = {
|
10
|
-
Style::SymbolProc => [Style::SpaceBeforeBlockBraces],
|
11
|
-
Style::SpaceBeforeBlockBraces => [Style::SymbolProc],
|
12
|
-
Style::LineEndConcatenation => [Style::UnneededInterpolation],
|
13
|
-
Style::UnneededInterpolation => [Style::LineEndConcatenation],
|
14
|
-
Style::SelfAssignment => [Style::SpaceAroundOperators],
|
15
|
-
Style::SpaceAroundOperators => [Style::SelfAssignment],
|
16
|
-
Style::BracesAroundHashParameters => [Style::MultilineHashBraceLayout]
|
17
|
-
}.freeze
|
18
|
-
|
19
7
|
DEFAULT_OPTIONS = {
|
20
8
|
auto_correct: false,
|
21
9
|
debug: false
|
@@ -135,8 +123,7 @@ module RuboCop
|
|
135
123
|
next if cop.corrections.empty?
|
136
124
|
next if skip.include?(cop.class)
|
137
125
|
corrector.corrections.concat(cop.corrections)
|
138
|
-
|
139
|
-
skip.merge(incompatible) if incompatible
|
126
|
+
skip.merge(cop.class.autocorrect_incompatible_with)
|
140
127
|
end
|
141
128
|
|
142
129
|
if !corrector.corrections.empty?
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -152,6 +152,22 @@ module RuboCop
|
|
152
152
|
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
153
153
|
end
|
154
154
|
|
155
|
+
def range_by_whole_lines(range, include_final_newline: false)
|
156
|
+
buffer = @processed_source.buffer
|
157
|
+
|
158
|
+
begin_pos = range.begin_pos
|
159
|
+
begin_offset = range.column
|
160
|
+
begin_of_first_line = begin_pos - begin_offset
|
161
|
+
|
162
|
+
last_line = buffer.source_line(range.last_line)
|
163
|
+
end_pos = range.end_pos
|
164
|
+
end_offset = last_line.length - range.last_column
|
165
|
+
end_offset += 1 if include_final_newline
|
166
|
+
end_of_last_line = end_pos + end_offset
|
167
|
+
|
168
|
+
Parser::Source::Range.new(buffer, begin_of_first_line, end_of_last_line)
|
169
|
+
end
|
170
|
+
|
155
171
|
def move_pos(src, pos, step, condition, regexp)
|
156
172
|
offset = step == -1 ? -1 : 0
|
157
173
|
pos += step while condition && src[pos + offset] =~ regexp
|