rubocop 1.11.0 → 1.12.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 +2 -2
- data/config/default.yml +16 -1
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
- data/lib/rubocop/comment_config.rb +43 -94
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/argument_alignment.rb +6 -5
- data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
- data/lib/rubocop/cop/layout/assignment_indentation.rb +6 -3
- data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +14 -15
- data/lib/rubocop/cop/layout/comment_indentation.rb +16 -16
- data/lib/rubocop/cop/layout/else_alignment.rb +9 -6
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +9 -6
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -15
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
- data/lib/rubocop/cop/layout/indentation_style.rb +27 -30
- data/lib/rubocop/cop/layout/indentation_width.rb +19 -9
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +7 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +89 -2
- data/lib/rubocop/cop/mixin/alignment.rb +10 -3
- data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +11 -6
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +4 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
- data/lib/rubocop/cop/registry.rb +9 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +62 -0
- data/lib/rubocop/cop/style/case_like_if.rb +15 -4
- data/lib/rubocop/cop/style/class_equality_comparison.rb +2 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +25 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +16 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +40 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -2
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +15 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +26 -3
- data/lib/rubocop/cop/style/redundant_return.rb +4 -0
- data/lib/rubocop/cop/style/redundant_self.rb +7 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +17 -14
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +16 -0
- data/lib/rubocop/cop/style/string_chars.rb +38 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +2 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +5 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +8 -2
- data/lib/rubocop/directive_comment.rb +64 -9
- data/lib/rubocop/ext/regexp_parser.rb +3 -6
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +5 -3
@@ -43,6 +43,7 @@ module RuboCop
|
|
43
43
|
return if node.ternary? || node.else? || node.elsif?
|
44
44
|
|
45
45
|
if_branch = node.if_branch
|
46
|
+
return if use_variable_assignment_in_condition?(node.condition, if_branch)
|
46
47
|
return unless offending_branch?(if_branch)
|
47
48
|
|
48
49
|
message = format(MSG, conditional_type: node.keyword)
|
@@ -53,6 +54,21 @@ module RuboCop
|
|
53
54
|
|
54
55
|
private
|
55
56
|
|
57
|
+
def use_variable_assignment_in_condition?(condition, if_branch)
|
58
|
+
assigned_variables = assigned_variables(condition)
|
59
|
+
|
60
|
+
assigned_variables && if_branch&.if_type? &&
|
61
|
+
assigned_variables.include?(if_branch.condition.source)
|
62
|
+
end
|
63
|
+
|
64
|
+
def assigned_variables(condition)
|
65
|
+
assigned_variables = condition.assignment? ? [condition.children.first.to_s] : []
|
66
|
+
|
67
|
+
assigned_variables + condition.descendants.select(&:assignment?).map do |node|
|
68
|
+
node.children.first.to_s
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
56
72
|
def offending_branch?(branch)
|
57
73
|
return false unless branch
|
58
74
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for uses of `String#split` with empty string or regexp literal argument.
|
7
|
+
#
|
8
|
+
# This cop is marked as unsafe. But probably it's quite unlikely that some other class would
|
9
|
+
# define a `split` method that takes exactly the same arguments.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # bad
|
13
|
+
# string.split(//)
|
14
|
+
# string.split('')
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# string.chars
|
18
|
+
#
|
19
|
+
class StringChars < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
22
|
+
MSG = 'Use `chars` instead of `%<current>s`.'
|
23
|
+
RESTRICT_ON_SEND = %i[split].freeze
|
24
|
+
BAD_ARGUMENTS = %w[// '' ""].freeze
|
25
|
+
|
26
|
+
def on_send(node)
|
27
|
+
return unless node.arguments.one? && BAD_ARGUMENTS.include?(node.first_argument.source)
|
28
|
+
|
29
|
+
range = node.loc.selector.begin.join(node.loc.end)
|
30
|
+
|
31
|
+
add_offense(range, message: format(MSG, current: range.source)) do |corrector|
|
32
|
+
corrector.replace(range, 'chars')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -48,6 +48,8 @@ module RuboCop
|
|
48
48
|
def correct_parent(parent, corrector)
|
49
49
|
if parent.block_type?
|
50
50
|
corrector.remove(range_with_surrounding_space(range: parent.loc.end, newlines: false))
|
51
|
+
elsif (class_node = parent.parent).body.nil?
|
52
|
+
corrector.remove(range_by_whole_lines(class_node.loc.end, include_final_newline: true))
|
51
53
|
else
|
52
54
|
corrector.insert_after(parent.loc.expression, ' do')
|
53
55
|
end
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for trailing code after the method definition.
|
7
7
|
#
|
8
|
+
# NOTE: It always accepts endless method definitions that are basically on the same line.
|
9
|
+
#
|
8
10
|
# @example
|
9
11
|
# # bad
|
10
12
|
# def some_method; do_stuff
|
@@ -24,6 +26,8 @@ module RuboCop
|
|
24
26
|
# b[c: x]
|
25
27
|
# end
|
26
28
|
#
|
29
|
+
# def endless_method = do_stuff
|
30
|
+
#
|
27
31
|
class TrailingBodyOnMethodDefinition < Base
|
28
32
|
include Alignment
|
29
33
|
include TrailingBody
|
@@ -34,7 +38,7 @@ module RuboCop
|
|
34
38
|
|
35
39
|
def on_def(node)
|
36
40
|
return unless trailing_body?(node)
|
37
|
-
return if node.endless?
|
41
|
+
return if node.endless?
|
38
42
|
|
39
43
|
add_offense(first_part_of(node.body)) do |corrector|
|
40
44
|
LineBreakCorrector.correct_trailing_body(
|
@@ -87,11 +87,17 @@ module RuboCop
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def mixed_precedence_and?(node)
|
90
|
-
|
90
|
+
and_sources = node.condition.each_descendant(:and).map(&:operator)
|
91
|
+
and_sources << node.condition.operator if node.condition.and_type?
|
92
|
+
|
93
|
+
!(and_sources.all? { |s| s == '&&' } || and_sources.all? { |s| s == 'and' })
|
91
94
|
end
|
92
95
|
|
93
96
|
def mixed_precedence_or?(node)
|
94
|
-
|
97
|
+
or_sources = node.condition.each_descendant(:or).map(&:operator)
|
98
|
+
or_sources << node.condition.operator if node.condition.or_type?
|
99
|
+
|
100
|
+
!(or_sources.all? { |s| s == '||' } || or_sources.all? { |s| s == 'or' })
|
95
101
|
end
|
96
102
|
end
|
97
103
|
end
|
@@ -5,28 +5,83 @@ module RuboCop
|
|
5
5
|
# special `rubocop:disable` and `rubocop:enable` comment and exposes what
|
6
6
|
# cops it contains.
|
7
7
|
class DirectiveComment
|
8
|
-
|
8
|
+
# @api private
|
9
|
+
REDUNDANT_COP = 'Lint/RedundantCopDisableDirective'
|
10
|
+
# @api private
|
11
|
+
COP_NAME_PATTERN = '([A-Z]\w+/)*(?:[A-Z]\w+)'
|
12
|
+
# @api private
|
13
|
+
COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
|
14
|
+
# @api private
|
15
|
+
COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
|
16
|
+
# @api private
|
17
|
+
DIRECTIVE_COMMENT_REGEXP = Regexp.new(
|
18
|
+
"# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
|
19
|
+
.gsub(' ', '\s*')
|
20
|
+
)
|
21
|
+
|
22
|
+
def self.before_comment(line)
|
23
|
+
line.split(DIRECTIVE_COMMENT_REGEXP).first
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :comment, :mode, :cops
|
9
27
|
|
10
28
|
def initialize(comment)
|
11
29
|
@comment = comment
|
30
|
+
@mode, @cops = match_captures
|
12
31
|
end
|
13
32
|
|
14
|
-
#
|
15
|
-
def
|
16
|
-
|
17
|
-
return unless match
|
18
|
-
|
19
|
-
cops_string = match.captures[1]
|
20
|
-
cops_string.split(/,\s*/).uniq.sort
|
33
|
+
# Checks if this directive relates to single line
|
34
|
+
def single_line?
|
35
|
+
!self.class.before_comment(comment.text).empty?
|
21
36
|
end
|
22
37
|
|
23
38
|
# Checks if this directive contains all the given cop names
|
24
39
|
def match?(cop_names)
|
25
|
-
|
40
|
+
parsed_cop_names.uniq.sort == cop_names.uniq.sort
|
26
41
|
end
|
27
42
|
|
28
43
|
def range
|
29
44
|
comment.location.expression
|
30
45
|
end
|
46
|
+
|
47
|
+
# Returns match captures to directive comment pattern
|
48
|
+
def match_captures
|
49
|
+
@match_captures ||= comment.text.match(DIRECTIVE_COMMENT_REGEXP)&.captures
|
50
|
+
end
|
51
|
+
|
52
|
+
# Checks if this directive disables cops
|
53
|
+
def disabled?
|
54
|
+
%w[disable todo].include?(mode)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Checks if this directive enables all cops
|
58
|
+
def enabled_all?
|
59
|
+
!disabled? && all_cops?
|
60
|
+
end
|
61
|
+
|
62
|
+
# Checks if all cops specified in this directive
|
63
|
+
def all_cops?
|
64
|
+
cops == 'all'
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns array of specified in this directive cop names
|
68
|
+
def cop_names
|
69
|
+
@cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns line number for directive
|
73
|
+
def line_number
|
74
|
+
comment.loc.expression.line
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def parsed_cop_names
|
80
|
+
(cops || '').split(/,\s*/)
|
81
|
+
end
|
82
|
+
|
83
|
+
def all_cop_names
|
84
|
+
Cop::Registry.global.names - [REDUNDANT_COP]
|
85
|
+
end
|
31
86
|
end
|
32
87
|
end
|
@@ -39,9 +39,8 @@ module RuboCop
|
|
39
39
|
|
40
40
|
# Shortcut to `loc.expression`
|
41
41
|
def expression
|
42
|
-
|
43
|
-
|
44
|
-
end
|
42
|
+
end_pos = start_index + full_length
|
43
|
+
@expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -60,9 +59,7 @@ module RuboCop
|
|
60
59
|
#
|
61
60
|
# Please open issue if you need other locations
|
62
61
|
def loc
|
63
|
-
@loc ||=
|
64
|
-
Map.new(expression, **build_location)
|
65
|
-
end
|
62
|
+
@loc ||= Map.new(expression, **build_location)
|
66
63
|
end
|
67
64
|
|
68
65
|
private
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def valid_shareable_constant_value?
|
50
|
-
%w[none literal experimental_everything experimental_copy].include?(
|
50
|
+
%w[none literal experimental_everything experimental_copy].include?(shareable_constant_value)
|
51
51
|
end
|
52
52
|
|
53
53
|
# Was a magic comment for the frozen string literal found?
|
@@ -96,6 +96,7 @@ module RuboCop
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
99
|
+
base_dir = base_dir.gsub('/{}/', '/\{}/')
|
99
100
|
dirs = Dir.glob(File.join(base_dir.gsub('/**/', '/\**/'), '*/'), flags)
|
100
101
|
.reject do |dir|
|
101
102
|
dir.end_with?('/./', '/../') || File.fnmatch?(exclude_pattern, dir, flags)
|
data/lib/rubocop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-03-
|
13
|
+
date: 2021-03-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parallel
|
@@ -601,6 +601,7 @@ files:
|
|
601
601
|
- lib/rubocop/cop/style/bare_percent_literals.rb
|
602
602
|
- lib/rubocop/cop/style/begin_block.rb
|
603
603
|
- lib/rubocop/cop/style/bisected_attr_accessor.rb
|
604
|
+
- lib/rubocop/cop/style/bisected_attr_accessor/macro.rb
|
604
605
|
- lib/rubocop/cop/style/block_comments.rb
|
605
606
|
- lib/rubocop/cop/style/block_delimiters.rb
|
606
607
|
- lib/rubocop/cop/style/case_equality.rb
|
@@ -768,6 +769,7 @@ files:
|
|
768
769
|
- lib/rubocop/cop/style/stabby_lambda_parentheses.rb
|
769
770
|
- lib/rubocop/cop/style/static_class.rb
|
770
771
|
- lib/rubocop/cop/style/stderr_puts.rb
|
772
|
+
- lib/rubocop/cop/style/string_chars.rb
|
771
773
|
- lib/rubocop/cop/style/string_concatenation.rb
|
772
774
|
- lib/rubocop/cop/style/string_hash_keys.rb
|
773
775
|
- lib/rubocop/cop/style/string_literals.rb
|
@@ -870,7 +872,7 @@ metadata:
|
|
870
872
|
homepage_uri: https://rubocop.org/
|
871
873
|
changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
|
872
874
|
source_code_uri: https://github.com/rubocop/rubocop/
|
873
|
-
documentation_uri: https://docs.rubocop.org/rubocop/1.
|
875
|
+
documentation_uri: https://docs.rubocop.org/rubocop/1.12/
|
874
876
|
bug_tracker_uri: https://github.com/rubocop/rubocop/issues
|
875
877
|
post_install_message:
|
876
878
|
rdoc_options: []
|