rubocop 1.31.2 → 1.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +23 -0
  4. data/lib/rubocop/cli.rb +1 -0
  5. data/lib/rubocop/config.rb +1 -1
  6. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +7 -1
  7. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +57 -13
  8. data/lib/rubocop/cop/layout/line_length.rb +2 -0
  9. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -1
  10. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
  11. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -0
  12. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +10 -4
  13. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +55 -24
  14. data/lib/rubocop/cop/lint/number_conversion.rb +7 -1
  15. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +7 -0
  16. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  17. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +35 -1
  18. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  19. data/lib/rubocop/cop/metrics/method_length.rb +1 -0
  20. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -0
  21. data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
  22. data/lib/rubocop/cop/naming/predicate_name.rb +8 -0
  23. data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -0
  24. data/lib/rubocop/cop/style/empty_else.rb +37 -0
  25. data/lib/rubocop/cop/style/empty_heredoc.rb +59 -0
  26. data/lib/rubocop/cop/style/fetch_env_var.rb +10 -177
  27. data/lib/rubocop/cop/style/format_string_token.rb +6 -0
  28. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  29. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -0
  30. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -0
  31. data/lib/rubocop/cop/style/numeric_predicate.rb +20 -6
  32. data/lib/rubocop/cop/style/semicolon.rb +27 -3
  33. data/lib/rubocop/cop/style/symbol_array.rb +2 -3
  34. data/lib/rubocop/cop/style/symbol_proc.rb +9 -1
  35. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -0
  36. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -0
  37. data/lib/rubocop/cop/style/word_array.rb +2 -3
  38. data/lib/rubocop/options.rb +3 -6
  39. data/lib/rubocop/rspec/shared_contexts.rb +14 -14
  40. data/lib/rubocop/rspec/support.rb +14 -0
  41. data/lib/rubocop/runner.rb +4 -0
  42. data/lib/rubocop/server/client_command/base.rb +1 -1
  43. data/lib/rubocop/version.rb +1 -1
  44. data/lib/rubocop.rb +3 -0
  45. metadata +8 -5
@@ -64,12 +64,14 @@ module RuboCop
64
64
  # Make the obvious check first
65
65
  return unless processed_source.raw_source.include?(';')
66
66
 
67
- each_semicolon { |line, column| register_semicolon(line, column, false) }
67
+ each_semicolon do |line, column, token_before_semicolon|
68
+ register_semicolon(line, column, false, token_before_semicolon)
69
+ end
68
70
  end
69
71
 
70
72
  def each_semicolon
71
73
  tokens_for_lines.each do |line, tokens|
72
- yield line, tokens.last.column if tokens.last.semicolon?
74
+ yield line, tokens.last.column, tokens[-2] if tokens.last.semicolon?
73
75
  yield line, tokens.first.column if tokens.first.semicolon?
74
76
  end
75
77
  end
@@ -78,13 +80,21 @@ module RuboCop
78
80
  processed_source.tokens.group_by(&:line)
79
81
  end
80
82
 
81
- def register_semicolon(line, column, after_expression)
83
+ def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
82
84
  range = source_range(processed_source.buffer, line, column)
83
85
 
84
86
  add_offense(range) do |corrector|
85
87
  if after_expression
86
88
  corrector.replace(range, "\n")
87
89
  else
90
+ # Prevents becoming one range instance with subsequent line when endless range
91
+ # without parentheses.
92
+ # See: https://github.com/rubocop/rubocop/issues/10791
93
+ if token_before_semicolon&.regexp_dots?
94
+ range_node = find_range_node(token_before_semicolon)
95
+ corrector.wrap(range_node, '(', ')') if range_node
96
+ end
97
+
88
98
  corrector.remove(range)
89
99
  end
90
100
  end
@@ -103,6 +113,20 @@ module RuboCop
103
113
  yield Regexp.last_match.begin(0)
104
114
  end
105
115
  end
116
+
117
+ def find_range_node(token_before_semicolon)
118
+ range_nodes.detect do |range_node|
119
+ range_node.source_range.contains?(token_before_semicolon.pos)
120
+ end
121
+ end
122
+
123
+ def range_nodes
124
+ return @range_nodes if instance_variable_defined?(:@range_nodes)
125
+
126
+ ast = processed_source.ast
127
+ @range_nodes = ast.range_type? ? [ast] : []
128
+ @range_nodes.concat(ast.each_descendant(:irange, :erange).to_a)
129
+ end
106
130
  end
107
131
  end
108
132
  end
@@ -39,7 +39,7 @@ module RuboCop
39
39
  minimum_target_ruby_version 2.0
40
40
 
41
41
  PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
42
- ARRAY_MSG = 'Use `%<prefer>s` for an array of symbols.'
42
+ ARRAY_MSG = 'Use %<prefer>s for an array of symbols.'
43
43
 
44
44
  class << self
45
45
  attr_accessor :largest_brackets
@@ -74,8 +74,7 @@ module RuboCop
74
74
  to_symbol_literal(c.value.to_s)
75
75
  end
76
76
  end
77
-
78
- "[#{syms.join(', ')}]"
77
+ build_bracketed_array_with_appropriate_whitespace(elements: syms, node: node)
79
78
  end
80
79
 
81
80
  def to_symbol_literal(string)
@@ -7,6 +7,8 @@ module RuboCop
7
7
  #
8
8
  # If you prefer a style that allows block for method with arguments,
9
9
  # please set `true` to `AllowMethodsWithArguments`.
10
+ # respond_to , and `define_method?` methods are ignored by default.
11
+ # These are customizable with `IgnoredMethods` option.
10
12
  #
11
13
  # @safety
12
14
  # This cop is unsafe because `proc`s and blocks work differently
@@ -68,6 +70,12 @@ module RuboCop
68
70
  # s.upcase # some comment
69
71
  # # some comment
70
72
  # end
73
+ #
74
+ # @example IgnoredMethods: [respond_to, define_method] (default)
75
+ # # good
76
+ # respond_to { |foo| foo.bar }
77
+ # define_method(:foo) { |foo| foo.bar }
78
+ #
71
79
  class SymbolProc < Base
72
80
  include CommentsHelp
73
81
  include RangeHelp
@@ -81,7 +89,7 @@ module RuboCop
81
89
  def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
82
90
 
83
91
  # @!method symbol_proc_receiver?(node)
84
- def_node_matcher :symbol_proc_receiver?, '{(send ...) (super ...) zsuper}'
92
+ def_node_matcher :symbol_proc_receiver?, '{(call ...) (super ...) zsuper}'
85
93
 
86
94
  # @!method symbol_proc?(node)
87
95
  def_node_matcher :symbol_proc?, <<~PATTERN
@@ -47,6 +47,8 @@ module RuboCop
47
47
  class TopLevelMethodDefinition < Base
48
48
  MSG = 'Do not define methods at the top-level.'
49
49
 
50
+ RESTRICT_ON_SEND = %i[define_method].freeze
51
+
50
52
  def on_def(node)
51
53
  return unless top_level_method_definition?(node)
52
54
 
@@ -5,6 +5,9 @@ module RuboCop
5
5
  module Style
6
6
  # Looks for trivial reader/writer methods, that could
7
7
  # have been created with the attr_* family of functions automatically.
8
+ # `to_ary`, `to_a`, `to_c`, `to_enum`, `to_h`, `to_hash`, `to_i`, `to_int`, `to_io`,
9
+ # `to_open`, `to_path`, `to_proc`, `to_r`, `to_regexp`, `to_str`, `to_s`, and `to_sym` methods
10
+ # are allowed by default. These are customizable with `AllowedMethods` option.
8
11
  #
9
12
  # @example
10
13
  # # bad
@@ -44,7 +44,7 @@ module RuboCop
44
44
  extend AutoCorrector
45
45
 
46
46
  PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'
47
- ARRAY_MSG = 'Use `%<prefer>s` for an array of words.'
47
+ ARRAY_MSG = 'Use %<prefer>s for an array of words.'
48
48
 
49
49
  class << self
50
50
  attr_accessor :largest_brackets
@@ -92,8 +92,7 @@ module RuboCop
92
92
  to_string_literal(word.children[0])
93
93
  end
94
94
  end
95
-
96
- "[#{words.join(', ')}]"
95
+ build_bracketed_array_with_appropriate_whitespace(elements: words, node: node)
97
96
  end
98
97
  end
99
98
  end
@@ -421,12 +421,9 @@ module RuboCop
421
421
  end
422
422
 
423
423
  def invalid_arguments_for_parallel
424
- [('--auto-gen-config' if @options.key?(:auto_gen_config)),
425
- ('-F/--fail-fast' if @options.key?(:fail_fast)),
426
- ('-x/--fix-layout' if @options.key?(:fix_layout)),
427
- ('-a/--autocorrect' if @options.key?(:safe_autocorrect)),
428
- ('-A/--autocorrect-all' if @options.key?(:autocorrect_all)),
429
- ('--cache false' if @options > { cache: 'false' })].compact
424
+ [('--auto-gen-config' if @options.key?(:auto_gen_config)),
425
+ ('-F/--fail-fast' if @options.key?(:fail_fast)),
426
+ ('--cache false' if @options > { cache: 'false' })].compact
430
427
  end
431
428
 
432
429
  def only_includes_redundant_disable?
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'tmpdir'
4
4
 
5
- RSpec.shared_context 'isolated environment', :isolated_environment do
5
+ RSpec.shared_context 'isolated environment' do
6
6
  around do |example|
7
7
  Dir.mktmpdir do |tmpdir|
8
8
  original_home = Dir.home
@@ -38,7 +38,7 @@ RSpec.shared_context 'isolated environment', :isolated_environment do
38
38
  end
39
39
  end
40
40
 
41
- RSpec.shared_context 'maintain registry', :restore_registry do
41
+ RSpec.shared_context 'maintain registry' do
42
42
  around(:each) { |example| RuboCop::Cop::Registry.with_temporary_global { example.run } }
43
43
 
44
44
  def stub_cop_class(name, inherit: RuboCop::Cop::Base, &block)
@@ -49,7 +49,7 @@ RSpec.shared_context 'maintain registry', :restore_registry do
49
49
  end
50
50
 
51
51
  # This context assumes nothing and defines `cop`, among others.
52
- RSpec.shared_context 'config', :config do # rubocop:disable Metrics/BlockLength
52
+ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
53
53
  ### Meant to be overridden at will
54
54
 
55
55
  let(:cop_class) do
@@ -116,46 +116,46 @@ RSpec.shared_context 'mock console output' do
116
116
  end
117
117
  end
118
118
 
119
- RSpec.shared_context 'ruby 2.0', :ruby20 do
119
+ RSpec.shared_context 'ruby 2.0' do
120
120
  let(:ruby_version) { 2.0 }
121
121
  end
122
122
 
123
- RSpec.shared_context 'ruby 2.1', :ruby21 do
123
+ RSpec.shared_context 'ruby 2.1' do
124
124
  let(:ruby_version) { 2.1 }
125
125
  end
126
126
 
127
- RSpec.shared_context 'ruby 2.2', :ruby22 do
127
+ RSpec.shared_context 'ruby 2.2' do
128
128
  let(:ruby_version) { 2.2 }
129
129
  end
130
130
 
131
- RSpec.shared_context 'ruby 2.3', :ruby23 do
131
+ RSpec.shared_context 'ruby 2.3' do
132
132
  let(:ruby_version) { 2.3 }
133
133
  end
134
134
 
135
- RSpec.shared_context 'ruby 2.4', :ruby24 do
135
+ RSpec.shared_context 'ruby 2.4' do
136
136
  let(:ruby_version) { 2.4 }
137
137
  end
138
138
 
139
- RSpec.shared_context 'ruby 2.5', :ruby25 do
139
+ RSpec.shared_context 'ruby 2.5' do
140
140
  let(:ruby_version) { 2.5 }
141
141
  end
142
142
 
143
- RSpec.shared_context 'ruby 2.6', :ruby26 do
143
+ RSpec.shared_context 'ruby 2.6' do
144
144
  let(:ruby_version) { 2.6 }
145
145
  end
146
146
 
147
- RSpec.shared_context 'ruby 2.7', :ruby27 do
147
+ RSpec.shared_context 'ruby 2.7' do
148
148
  let(:ruby_version) { 2.7 }
149
149
  end
150
150
 
151
- RSpec.shared_context 'ruby 3.0', :ruby30 do
151
+ RSpec.shared_context 'ruby 3.0' do
152
152
  let(:ruby_version) { 3.0 }
153
153
  end
154
154
 
155
- RSpec.shared_context 'ruby 3.1', :ruby31 do
155
+ RSpec.shared_context 'ruby 3.1' do
156
156
  let(:ruby_version) { 3.1 }
157
157
  end
158
158
 
159
- RSpec.shared_context 'ruby 3.2', :ruby32 do
159
+ RSpec.shared_context 'ruby 3.2' do
160
160
  let(:ruby_version) { 3.2 }
161
161
  end
@@ -11,4 +11,18 @@ require_relative 'parallel_formatter'
11
11
  RSpec.configure do |config|
12
12
  config.include CopHelper
13
13
  config.include HostEnvironmentSimulatorHelper
14
+ config.include_context 'config', :config
15
+ config.include_context 'isolated environment', :isolated_environment
16
+ config.include_context 'maintain registry', :restore_registry
17
+ config.include_context 'ruby 2.0', :ruby20
18
+ config.include_context 'ruby 2.1', :ruby21
19
+ config.include_context 'ruby 2.2', :ruby22
20
+ config.include_context 'ruby 2.3', :ruby23
21
+ config.include_context 'ruby 2.4', :ruby24
22
+ config.include_context 'ruby 2.5', :ruby25
23
+ config.include_context 'ruby 2.6', :ruby26
24
+ config.include_context 'ruby 2.7', :ruby27
25
+ config.include_context 'ruby 3.0', :ruby30
26
+ config.include_context 'ruby 3.1', :ruby31
27
+ config.include_context 'ruby 3.2', :ruby32
14
28
  end
@@ -63,8 +63,12 @@ module RuboCop
63
63
  # Warms up the RuboCop cache by forking a suitable number of RuboCop
64
64
  # instances that each inspects its allotted group of files.
65
65
  def warm_cache(target_files)
66
+ saved_options = @options.dup
66
67
  puts 'Running parallel inspection' if @options[:debug]
68
+ %i[autocorrect safe_autocorrect].each { |opt| @options[opt] = false }
67
69
  Parallel.each(target_files) { |target_file| file_offenses(target_file) }
70
+ ensure
71
+ @options = saved_options
68
72
  end
69
73
 
70
74
  def find_target_files(paths)
@@ -29,7 +29,7 @@ module RuboCop
29
29
  socket.puts [Cache.token_path.read, Dir.pwd, command, *args].shelljoin
30
30
  socket.write body
31
31
  socket.close_write
32
- $stdout.write socket.read(4096) until socket.eof?
32
+ $stdout.write socket.readpartial(4096) until socket.eof?
33
33
  end
34
34
  end
35
35
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.31.2'
6
+ STRING = '1.32.0'
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
data/lib/rubocop.rb CHANGED
@@ -233,6 +233,7 @@ require_relative 'rubocop/cop/layout/multiline_method_argument_line_breaks'
233
233
  require_relative 'rubocop/cop/layout/multiline_method_call_brace_layout'
234
234
  require_relative 'rubocop/cop/layout/multiline_method_call_indentation'
235
235
  require_relative 'rubocop/cop/layout/multiline_method_definition_brace_layout'
236
+ require_relative 'rubocop/cop/layout/multiline_method_parameter_line_breaks'
236
237
  require_relative 'rubocop/cop/layout/multiline_operation_indentation'
237
238
  require_relative 'rubocop/cop/layout/parameter_alignment'
238
239
  require_relative 'rubocop/cop/layout/redundant_line_break'
@@ -356,6 +357,7 @@ require_relative 'rubocop/cop/lint/redundant_with_object'
356
357
  require_relative 'rubocop/cop/lint/refinement_import_methods'
357
358
  require_relative 'rubocop/cop/lint/regexp_as_condition'
358
359
  require_relative 'rubocop/cop/lint/require_parentheses'
360
+ require_relative 'rubocop/cop/lint/require_range_parentheses'
359
361
  require_relative 'rubocop/cop/lint/require_relative_self_path'
360
362
  require_relative 'rubocop/cop/lint/rescue_exception'
361
363
  require_relative 'rubocop/cop/lint/rescue_type'
@@ -479,6 +481,7 @@ require_relative 'rubocop/cop/style/each_with_object'
479
481
  require_relative 'rubocop/cop/style/empty_block_parameter'
480
482
  require_relative 'rubocop/cop/style/empty_case_condition'
481
483
  require_relative 'rubocop/cop/style/empty_else'
484
+ require_relative 'rubocop/cop/style/empty_heredoc'
482
485
  require_relative 'rubocop/cop/style/empty_lambda_parameter'
483
486
  require_relative 'rubocop/cop/style/empty_literal'
484
487
  require_relative 'rubocop/cop/style/empty_method'
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.31.2
4
+ version: 1.32.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: 2022-07-07 00:00:00.000000000 Z
13
+ date: 2022-07-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -120,7 +120,7 @@ dependencies:
120
120
  requirements:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
- version: 1.18.0
123
+ version: 1.19.1
124
124
  - - "<"
125
125
  - !ruby/object:Gem::Version
126
126
  version: '2.0'
@@ -130,7 +130,7 @@ dependencies:
130
130
  requirements:
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: 1.18.0
133
+ version: 1.19.1
134
134
  - - "<"
135
135
  - !ruby/object:Gem::Version
136
136
  version: '2.0'
@@ -367,6 +367,7 @@ files:
367
367
  - lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb
368
368
  - lib/rubocop/cop/layout/multiline_method_call_indentation.rb
369
369
  - lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb
370
+ - lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb
370
371
  - lib/rubocop/cop/layout/multiline_operation_indentation.rb
371
372
  - lib/rubocop/cop/layout/parameter_alignment.rb
372
373
  - lib/rubocop/cop/layout/redundant_line_break.rb
@@ -491,6 +492,7 @@ files:
491
492
  - lib/rubocop/cop/lint/refinement_import_methods.rb
492
493
  - lib/rubocop/cop/lint/regexp_as_condition.rb
493
494
  - lib/rubocop/cop/lint/require_parentheses.rb
495
+ - lib/rubocop/cop/lint/require_range_parentheses.rb
494
496
  - lib/rubocop/cop/lint/require_relative_self_path.rb
495
497
  - lib/rubocop/cop/lint/rescue_exception.rb
496
498
  - lib/rubocop/cop/lint/rescue_type.rb
@@ -696,6 +698,7 @@ files:
696
698
  - lib/rubocop/cop/style/empty_block_parameter.rb
697
699
  - lib/rubocop/cop/style/empty_case_condition.rb
698
700
  - lib/rubocop/cop/style/empty_else.rb
701
+ - lib/rubocop/cop/style/empty_heredoc.rb
699
702
  - lib/rubocop/cop/style/empty_lambda_parameter.rb
700
703
  - lib/rubocop/cop/style/empty_literal.rb
701
704
  - lib/rubocop/cop/style/empty_method.rb
@@ -968,7 +971,7 @@ metadata:
968
971
  homepage_uri: https://rubocop.org/
969
972
  changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
970
973
  source_code_uri: https://github.com/rubocop/rubocop/
971
- documentation_uri: https://docs.rubocop.org/rubocop/1.31/
974
+ documentation_uri: https://docs.rubocop.org/rubocop/1.32/
972
975
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
973
976
  rubygems_mfa_required: 'true'
974
977
  post_install_message: