rubocop 1.18.4 → 1.19.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +22 -5
  4. data/lib/rubocop.rb +4 -0
  5. data/lib/rubocop/cli.rb +18 -0
  6. data/lib/rubocop/config_loader_resolver.rb +21 -6
  7. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  8. data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
  9. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  10. data/lib/rubocop/cop/internal_affairs.rb +2 -0
  11. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
  12. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
  13. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
  14. data/lib/rubocop/cop/layout/end_alignment.rb +2 -1
  15. data/lib/rubocop/cop/layout/hash_alignment.rb +7 -3
  16. data/lib/rubocop/cop/layout/heredoc_indentation.rb +0 -7
  17. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  18. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +33 -14
  19. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +21 -9
  20. data/lib/rubocop/cop/layout/space_around_operators.rb +8 -1
  21. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  22. data/lib/rubocop/cop/layout/space_inside_parens.rb +5 -5
  23. data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
  24. data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
  25. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
  26. data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
  27. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  28. data/lib/rubocop/cop/mixin/heredoc.rb +7 -0
  29. data/lib/rubocop/cop/mixin/percent_array.rb +10 -7
  30. data/lib/rubocop/cop/mixin/require_library.rb +59 -0
  31. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  32. data/lib/rubocop/cop/naming/inclusive_language.rb +18 -1
  33. data/lib/rubocop/cop/style/block_delimiters.rb +16 -0
  34. data/lib/rubocop/cop/style/commented_keyword.rb +2 -1
  35. data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
  36. data/lib/rubocop/cop/style/explicit_block_argument.rb +32 -7
  37. data/lib/rubocop/cop/style/hash_transform_keys.rb +0 -3
  38. data/lib/rubocop/cop/style/identical_conditional_branches.rb +30 -5
  39. data/lib/rubocop/cop/style/method_def_parentheses.rb +10 -1
  40. data/lib/rubocop/cop/style/missing_else.rb +7 -0
  41. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +88 -0
  42. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  43. data/lib/rubocop/cop/style/semicolon.rb +32 -24
  44. data/lib/rubocop/cop/style/single_line_block_params.rb +3 -1
  45. data/lib/rubocop/cop/style/special_global_vars.rb +21 -0
  46. data/lib/rubocop/cop/style/word_array.rb +20 -2
  47. data/lib/rubocop/cop/util.rb +7 -2
  48. data/lib/rubocop/options.rb +1 -1
  49. data/lib/rubocop/version.rb +1 -1
  50. metadata +11 -5
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where conditional branch makes redundant self-assignment.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # foo = condition ? bar : foo
12
+ #
13
+ # # good
14
+ # foo = bar if condition
15
+ #
16
+ # # bad
17
+ # foo = condition ? foo : bar
18
+ #
19
+ # # good
20
+ # foo = bar unless condition
21
+ #
22
+ class RedundantSelfAssignmentBranch < Base
23
+ include RangeHelp
24
+ extend AutoCorrector
25
+
26
+ MSG = 'Remove the self-assignment branch.'
27
+
28
+ # @!method bad_method?(node)
29
+ def_node_matcher :bad_method?, <<~PATTERN
30
+ (send nil? :bad_method ...)
31
+ PATTERN
32
+
33
+ def on_lvasgn(node)
34
+ variable, expression = *node
35
+ return unless expression&.if_type?
36
+ return unless expression.ternary? || expression.else?
37
+
38
+ if_branch = expression.if_branch
39
+ else_branch = expression.else_branch
40
+
41
+ if self_assign?(variable, if_branch)
42
+ register_offense(expression, if_branch, else_branch, 'unless')
43
+ elsif self_assign?(variable, else_branch)
44
+ register_offense(expression, else_branch, if_branch, 'if')
45
+ end
46
+ end
47
+
48
+ alias on_ivasgn on_lvasgn
49
+ alias on_cvasgn on_lvasgn
50
+ alias on_gvasgn on_lvasgn
51
+
52
+ private
53
+
54
+ def self_assign?(variable, branch)
55
+ variable.to_s == branch&.source
56
+ end
57
+
58
+ def register_offense(if_node, offense_branch, opposite_branch, keyword)
59
+ add_offense(offense_branch) do |corrector|
60
+ if if_node.ternary?
61
+ replacement = "#{opposite_branch.source} #{keyword} #{if_node.condition.source}"
62
+ corrector.replace(if_node, replacement)
63
+ else
64
+ if_node_loc = if_node.loc
65
+
66
+ range = range_by_whole_lines(offense_branch.source_range, include_final_newline: true)
67
+ corrector.remove(range)
68
+ range = range_by_whole_lines(if_node_loc.else, include_final_newline: true)
69
+ corrector.remove(range)
70
+
71
+ autocorrect_if_condition(corrector, if_node, if_node_loc, keyword)
72
+ end
73
+ end
74
+ end
75
+
76
+ def autocorrect_if_condition(corrector, if_node, if_node_loc, keyword)
77
+ else_branch = if_node.else_branch
78
+
79
+ if else_branch.respond_to?(:elsif?) && else_branch.elsif?
80
+ corrector.replace(if_node.condition, else_branch.condition.source)
81
+ else
82
+ corrector.replace(if_node_loc.keyword, keyword)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -60,8 +60,8 @@ module RuboCop
60
60
  # @!method redundant_sort?(node)
61
61
  def_node_matcher :redundant_sort?, <<~MATCHER
62
62
  {
63
- (send $(send _ $:sort ...) ${:last :first})
64
- (send $(send _ $:sort ...) ${:[] :at :slice} {(int 0) (int -1)})
63
+ (send $(send _ $:sort) ${:last :first})
64
+ (send $(send _ $:sort) ${:[] :at :slice} {(int 0) (int -1)})
65
65
 
66
66
  (send $(send _ $:sort_by _) ${:last :first})
67
67
  (send $(send _ $:sort_by _) ${:[] :at :slice} {(int 0) (int -1)})
@@ -32,38 +32,29 @@ module RuboCop
32
32
 
33
33
  MSG = 'Do not use semicolons to terminate expressions.'
34
34
 
35
+ def self.autocorrect_incompatible_with
36
+ [Style::SingleLineMethods]
37
+ end
38
+
35
39
  def on_new_investigation
36
40
  return if processed_source.blank?
37
41
 
38
- @processed_source = processed_source
39
-
40
42
  check_for_line_terminator_or_opener
41
43
  end
42
44
 
43
- def on_begin(node) # rubocop:todo Metrics/CyclomaticComplexity
45
+ def on_begin(node)
44
46
  return if cop_config['AllowAsExpressionSeparator']
45
47
 
46
48
  exprs = node.children
47
49
 
48
50
  return if exprs.size < 2
49
51
 
50
- # create a map matching lines to the number of expressions on them
51
- exprs_lines = exprs.map(&:first_line)
52
- lines = exprs_lines.group_by(&:itself)
53
-
54
- lines.each do |line, expr_on_line|
52
+ expressions_per_line(exprs).each do |line, expr_on_line|
55
53
  # Every line with more than one expression on it is a
56
54
  # potential offense
57
55
  next unless expr_on_line.size > 1
58
56
 
59
- # TODO: Find the correct position of the semicolon. We don't know
60
- # if the first semicolon on the line is a separator of
61
- # expressions. It's just a guess.
62
- column = @processed_source[line - 1].index(';')
63
-
64
- next unless column
65
-
66
- convention_on(line, column, false)
57
+ find_semicolon_positions(line) { |pos| register_semicolon(line, pos, true) }
67
58
  end
68
59
  end
69
60
 
@@ -71,9 +62,9 @@ module RuboCop
71
62
 
72
63
  def check_for_line_terminator_or_opener
73
64
  # Make the obvious check first
74
- return unless @processed_source.raw_source.include?(';')
65
+ return unless processed_source.raw_source.include?(';')
75
66
 
76
- each_semicolon { |line, column| convention_on(line, column, true) }
67
+ each_semicolon { |line, column| register_semicolon(line, column, false) }
77
68
  end
78
69
 
79
70
  def each_semicolon
@@ -84,15 +75,32 @@ module RuboCop
84
75
  end
85
76
 
86
77
  def tokens_for_lines
87
- @processed_source.tokens.group_by(&:line)
78
+ processed_source.tokens.group_by(&:line)
88
79
  end
89
80
 
90
- def convention_on(line, column, autocorrect)
91
- range = source_range(@processed_source.buffer, line, column)
92
- # Don't attempt to autocorrect if semicolon is separating statements
93
- # on the same line
81
+ def register_semicolon(line, column, after_expression)
82
+ range = source_range(processed_source.buffer, line, column)
83
+
94
84
  add_offense(range) do |corrector|
95
- corrector.remove(range) if autocorrect
85
+ if after_expression
86
+ corrector.replace(range, "\n")
87
+ else
88
+ corrector.remove(range)
89
+ end
90
+ end
91
+ end
92
+
93
+ def expressions_per_line(exprs)
94
+ # create a map matching lines to the number of expressions on them
95
+ exprs_lines = exprs.map(&:first_line)
96
+ exprs_lines.group_by(&:itself)
97
+ end
98
+
99
+ def find_semicolon_positions(line)
100
+ # Scan for all the semicolons on the line
101
+ semicolons = processed_source[line - 1].enum_for(:scan, ';')
102
+ semicolons.each do
103
+ yield Regexp.last_match.begin(0)
96
104
  end
97
105
  end
98
106
  end
@@ -109,7 +109,9 @@ module RuboCop
109
109
  # we remove any leading underscores before comparing.
110
110
  actual_args_no_underscores = actual_args.map { |arg| arg.to_s.sub(/^_+/, '') }
111
111
 
112
- actual_args_no_underscores == target_args(method_name)
112
+ # Allow the arguments if the names match but not all are given
113
+ expected_args = target_args(method_name).first(actual_args_no_underscores.size)
114
+ actual_args_no_underscores == expected_args
113
115
  end
114
116
  end
115
117
  end
@@ -5,9 +5,14 @@ module RuboCop
5
5
  module Style
6
6
  #
7
7
  # This cop looks for uses of Perl-style global variables.
8
+ # Correcting to global variables in the 'English' library
9
+ # will add a require statement to the top of the file if
10
+ # enabled by RequireEnglish config.
8
11
  #
9
12
  # @example EnforcedStyle: use_english_names (default)
10
13
  # # good
14
+ # require 'English' # or this could be in another file.
15
+ #
11
16
  # puts $LOAD_PATH
12
17
  # puts $LOADED_FEATURES
13
18
  # puts $PROGRAM_NAME
@@ -50,6 +55,8 @@ module RuboCop
50
55
  #
51
56
  class SpecialGlobalVars < Base
52
57
  include ConfigurableEnforcedStyle
58
+ include RangeHelp
59
+ include RequireLibrary
53
60
  extend AutoCorrector
54
61
 
55
62
  MSG_BOTH = 'Prefer `%<prefer>s` from the stdlib \'English\' ' \
@@ -90,6 +97,8 @@ module RuboCop
90
97
  # Anything *not* in this set is provided by the English library.
91
98
  NON_ENGLISH_VARS = Set.new(%i[$LOAD_PATH $LOADED_FEATURES $PROGRAM_NAME ARGV]).freeze
92
99
 
100
+ LIBRARY_NAME = 'English'
101
+
93
102
  def on_gvar(node)
94
103
  global_var, = *node
95
104
 
@@ -117,6 +126,8 @@ module RuboCop
117
126
  def autocorrect(corrector, node, global_var)
118
127
  node = node.parent while node.parent&.begin_type? && node.parent.children.one?
119
128
 
129
+ ensure_required(corrector, node, LIBRARY_NAME) if should_require_english?(global_var)
130
+
120
131
  corrector.replace(node, replacement(node, global_var))
121
132
  end
122
133
 
@@ -172,6 +183,16 @@ module RuboCop
172
183
 
173
184
  "{#{preferred_name}}"
174
185
  end
186
+
187
+ def add_require_english?
188
+ cop_config['RequireEnglish']
189
+ end
190
+
191
+ def should_require_english?(global_var)
192
+ style == :use_english_names &&
193
+ add_require_english? &&
194
+ !NON_ENGLISH_VARS.include?(preferred_names(global_var).first)
195
+ end
175
196
  end
176
197
  end
177
198
  end
@@ -9,6 +9,9 @@ module RuboCop
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
11
  #
12
+ # NOTE: When using the `percent` style, %w() arrays containing a space
13
+ # will be registered as offenses.
14
+ #
12
15
  # Configuration option: MinSize
13
16
  # If set, arrays with fewer elements than this value will not trigger the
14
17
  # cop. For example, a `MinSize` of `3` will not enforce a style on an
@@ -21,12 +24,18 @@ module RuboCop
21
24
  # # bad
22
25
  # ['foo', 'bar', 'baz']
23
26
  #
27
+ # # bad (contains spaces)
28
+ # %w[foo\ bar baz\ quux]
29
+ #
24
30
  # @example EnforcedStyle: brackets
25
31
  # # good
26
32
  # ['foo', 'bar', 'baz']
27
33
  #
28
34
  # # bad
29
35
  # %w[foo bar baz]
36
+ #
37
+ # # good (contains spaces)
38
+ # ['foo bar', 'baz quux']
30
39
  class WordArray < Base
31
40
  include ArrayMinSize
32
41
  include ArraySyntax
@@ -53,13 +62,22 @@ module RuboCop
53
62
 
54
63
  private
55
64
 
56
- def complex_content?(strings)
65
+ def complex_content?(strings, complex_regex: word_regex)
57
66
  strings.any? do |s|
67
+ next unless s.str_content
68
+
58
69
  string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
59
- !string.valid_encoding? || !word_regex.match?(string) || / /.match?(string)
70
+ !string.valid_encoding? ||
71
+ (complex_regex && !complex_regex.match?(string)) ||
72
+ / /.match?(string)
60
73
  end
61
74
  end
62
75
 
76
+ def invalid_percent_array_contents?(node)
77
+ # Disallow %w() arrays that contain invalid encoding or spaces
78
+ complex_content?(node.values, complex_regex: false)
79
+ end
80
+
63
81
  def word_regex
64
82
  Regexp.new(cop_config['WordRegex'])
65
83
  end
@@ -46,8 +46,13 @@ module RuboCop
46
46
 
47
47
  def args_begin(node)
48
48
  loc = node.loc
49
- selector =
50
- node.super_type? || node.yield_type? ? loc.keyword : loc.selector
49
+ selector = if node.super_type? || node.yield_type?
50
+ loc.keyword
51
+ elsif node.def_type? || node.defs_type?
52
+ loc.name
53
+ else
54
+ loc.selector
55
+ end
51
56
  selector.end.resize(1)
52
57
  end
53
58
 
@@ -492,7 +492,7 @@ module RuboCop
492
492
  version: 'Display version.',
493
493
  verbose_version: 'Display verbose version.',
494
494
  parallel: ['Use available CPUs to execute inspection in',
495
- 'parallel. Default is false.'],
495
+ 'parallel. Default is true.'],
496
496
  stdin: ['Pipe source from STDIN, using FILE in offense',
497
497
  'reports. This is useful for editor integration.'],
498
498
  init: 'Generate a .rubocop.yml file in the current directory.'
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.18.4'
6
+ STRING = '1.19.0'
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, '\
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
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.18.4
4
+ version: 1.19.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-07-23 00:00:00.000000000 Z
13
+ date: 2021-08-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parallel
@@ -100,7 +100,7 @@ dependencies:
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 1.8.0
103
+ version: 1.9.1
104
104
  - - "<"
105
105
  - !ruby/object:Gem::Version
106
106
  version: '2.0'
@@ -110,7 +110,7 @@ dependencies:
110
110
  requirements:
111
111
  - - ">="
112
112
  - !ruby/object:Gem::Version
113
- version: 1.8.0
113
+ version: 1.9.1
114
114
  - - "<"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '2.0'
@@ -239,6 +239,7 @@ files:
239
239
  - lib/rubocop/cop/correctors/parentheses_corrector.rb
240
240
  - lib/rubocop/cop/correctors/percent_literal_corrector.rb
241
241
  - lib/rubocop/cop/correctors/punctuation_corrector.rb
242
+ - lib/rubocop/cop/correctors/require_library_corrector.rb
242
243
  - lib/rubocop/cop/correctors/space_corrector.rb
243
244
  - lib/rubocop/cop/correctors/string_literal_corrector.rb
244
245
  - lib/rubocop/cop/correctors/unused_arg_corrector.rb
@@ -257,6 +258,7 @@ files:
257
258
  - lib/rubocop/cop/internal_affairs.rb
258
259
  - lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb
259
260
  - lib/rubocop/cop/internal_affairs/example_description.rb
261
+ - lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb
260
262
  - lib/rubocop/cop/internal_affairs/method_name_equal.rb
261
263
  - lib/rubocop/cop/internal_affairs/node_destructuring.rb
262
264
  - lib/rubocop/cop/internal_affairs/node_matcher_directive.rb
@@ -267,6 +269,7 @@ files:
267
269
  - lib/rubocop/cop/internal_affairs/redundant_location_argument.rb
268
270
  - lib/rubocop/cop/internal_affairs/redundant_message_argument.rb
269
271
  - lib/rubocop/cop/internal_affairs/style_detected_api_use.rb
272
+ - lib/rubocop/cop/internal_affairs/undefined_config.rb
270
273
  - lib/rubocop/cop/internal_affairs/useless_message_assertion.rb
271
274
  - lib/rubocop/cop/layout/access_modifier_indentation.rb
272
275
  - lib/rubocop/cop/layout/argument_alignment.rb
@@ -369,6 +372,7 @@ files:
369
372
  - lib/rubocop/cop/lint/ambiguous_assignment.rb
370
373
  - lib/rubocop/cop/lint/ambiguous_block_association.rb
371
374
  - lib/rubocop/cop/lint/ambiguous_operator.rb
375
+ - lib/rubocop/cop/lint/ambiguous_range.rb
372
376
  - lib/rubocop/cop/lint/ambiguous_regexp_literal.rb
373
377
  - lib/rubocop/cop/lint/assignment_in_condition.rb
374
378
  - lib/rubocop/cop/lint/big_decimal_new.rb
@@ -556,6 +560,7 @@ files:
556
560
  - lib/rubocop/cop/mixin/preferred_delimiters.rb
557
561
  - lib/rubocop/cop/mixin/range_help.rb
558
562
  - lib/rubocop/cop/mixin/rational_literal.rb
563
+ - lib/rubocop/cop/mixin/require_library.rb
559
564
  - lib/rubocop/cop/mixin/rescue_node.rb
560
565
  - lib/rubocop/cop/mixin/safe_assignment.rb
561
566
  - lib/rubocop/cop/mixin/space_after_punctuation.rb
@@ -759,6 +764,7 @@ files:
759
764
  - lib/rubocop/cop/style/redundant_return.rb
760
765
  - lib/rubocop/cop/style/redundant_self.rb
761
766
  - lib/rubocop/cop/style/redundant_self_assignment.rb
767
+ - lib/rubocop/cop/style/redundant_self_assignment_branch.rb
762
768
  - lib/rubocop/cop/style/redundant_sort.rb
763
769
  - lib/rubocop/cop/style/redundant_sort_by.rb
764
770
  - lib/rubocop/cop/style/regexp_literal.rb
@@ -883,7 +889,7 @@ metadata:
883
889
  homepage_uri: https://rubocop.org/
884
890
  changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
885
891
  source_code_uri: https://github.com/rubocop/rubocop/
886
- documentation_uri: https://docs.rubocop.org/rubocop/1.18/
892
+ documentation_uri: https://docs.rubocop.org/rubocop/1.19/
887
893
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
888
894
  post_install_message:
889
895
  rdoc_options: []