rubocop 1.56.0 → 1.57.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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +12 -6
  4. data/lib/rubocop/cli.rb +1 -1
  5. data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
  6. data/lib/rubocop/cop/bundler/duplicated_group.rb +54 -8
  7. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  8. data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -22
  9. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
  10. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  11. data/lib/rubocop/cop/layout/dot_position.rb +1 -5
  12. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +41 -8
  13. data/lib/rubocop/cop/layout/heredoc_indentation.rb +3 -0
  14. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  15. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  16. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
  17. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
  18. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +13 -2
  19. data/lib/rubocop/cop/layout/redundant_line_break.rb +5 -3
  20. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  21. data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
  22. data/lib/rubocop/cop/lint/debugger.rb +10 -1
  23. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  24. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  25. data/lib/rubocop/cop/lint/mixed_case_range.rb +1 -1
  26. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
  27. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -0
  28. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -4
  29. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +11 -4
  30. data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
  31. data/lib/rubocop/cop/lint/useless_assignment.rb +38 -12
  32. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  33. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  34. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  35. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
  36. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
  37. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -7
  38. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  39. data/lib/rubocop/cop/style/arguments_forwarding.rb +22 -11
  40. data/lib/rubocop/cop/style/array_intersect.rb +13 -5
  41. data/lib/rubocop/cop/style/class_equality_comparison.rb +5 -0
  42. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  43. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  44. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  45. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  46. data/lib/rubocop/cop/style/for.rb +1 -1
  47. data/lib/rubocop/cop/style/format_string.rb +24 -3
  48. data/lib/rubocop/cop/style/guard_clause.rb +26 -0
  49. data/lib/rubocop/cop/style/identical_conditional_branches.rb +17 -3
  50. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -1
  51. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  52. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  53. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
  54. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  55. data/lib/rubocop/cop/style/operator_method_call.rb +6 -0
  56. data/lib/rubocop/cop/style/redundant_begin.rb +9 -1
  57. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
  58. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +69 -6
  59. data/lib/rubocop/cop/style/redundant_filter_chain.rb +18 -2
  60. data/lib/rubocop/cop/style/redundant_parentheses.rb +24 -6
  61. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +5 -0
  62. data/lib/rubocop/cop/style/return_nil.rb +6 -2
  63. data/lib/rubocop/cop/style/single_line_do_end_block.rb +65 -0
  64. data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
  65. data/lib/rubocop/cop/style/symbol_array.rb +12 -11
  66. data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
  67. data/lib/rubocop/cop/utils/regexp_ranges.rb +26 -13
  68. data/lib/rubocop/file_finder.rb +4 -7
  69. data/lib/rubocop/lsp/routes.rb +4 -1
  70. data/lib/rubocop/magic_comment.rb +12 -10
  71. data/lib/rubocop/rspec/shared_contexts.rb +2 -3
  72. data/lib/rubocop/server/cache.rb +1 -0
  73. data/lib/rubocop/target_ruby.rb +9 -5
  74. data/lib/rubocop/version.rb +1 -1
  75. data/lib/rubocop.rb +1 -0
  76. metadata +13 -12
@@ -19,22 +19,23 @@ module RuboCop
19
19
  # differently on different classes, and are not guaranteed to
20
20
  # have the same result if reversed.
21
21
  #
22
- # @example SupportedOperators: ['*', '+', '&'']
22
+ # @example SupportedOperators: ['*', '+', '&', '|', '^'] (default)
23
23
  # # bad
24
- # 1 + x
25
24
  # 10 * y
25
+ # 1 + x
26
26
  # 1 & z
27
+ # 1 | x
28
+ # 1 ^ x
27
29
  # 1 + CONST
28
30
  #
29
31
  # # good
30
- # 60 * 24
31
- # x + 1
32
32
  # y * 10
33
+ # x + 1
33
34
  # z & 1
35
+ # x | 1
36
+ # x ^ 1
34
37
  # CONST + 1
35
- #
36
- # # good
37
- # 1 | x
38
+ # 60 * 24
38
39
  #
39
40
  class YodaExpression < Base
40
41
  extend AutoCorrector
@@ -6,27 +6,40 @@ module RuboCop
6
6
  # Helper to abstract complexity of building range pairs
7
7
  # with octal escape reconstruction (needed for regexp_parser < 2.7).
8
8
  class RegexpRanges
9
- attr_reader :compound_token, :root
9
+ attr_reader :root
10
10
 
11
11
  def initialize(root)
12
12
  @root = root
13
13
  @compound_token = []
14
+ @pairs = []
15
+ @populated = false
16
+ end
17
+
18
+ def compound_token
19
+ populate_all unless @populated
20
+
21
+ @compound_token
14
22
  end
15
23
 
16
24
  def pairs
17
- unless @pairs
18
- @pairs = []
19
- populate(root)
20
- end
25
+ populate_all unless @populated
26
+
27
+ @pairs
28
+ end
29
+
30
+ private
31
+
32
+ def populate_all
33
+ populate(@root)
21
34
 
22
35
  # If either bound is a compound the first one is an escape
23
36
  # and that's all we need to work with.
24
37
  # If there are any cops that wanted to operate on the compound
25
38
  # expression we could wrap it with a facade class.
26
- @pairs.map { |pair| pair.map(&:first) }
27
- end
39
+ @pairs.map! { |pair| pair.map(&:first) }
28
40
 
29
- private
41
+ @populated = true
42
+ end
30
43
 
31
44
  def populate(expr)
32
45
  expressions = expr.expressions.to_a
@@ -35,15 +48,15 @@ module RuboCop
35
48
  current = expressions.shift
36
49
 
37
50
  if escaped_octal?(current)
38
- compound_token << current
39
- compound_token.concat(pop_octal_digits(expressions))
51
+ @compound_token << current
52
+ @compound_token.concat(pop_octal_digits(expressions))
40
53
  # If we have all the digits we can discard.
41
54
  end
42
55
 
43
56
  next unless current.type == :set
44
57
 
45
58
  process_set(expressions, current)
46
- compound_token.clear
59
+ @compound_token.clear
47
60
  end
48
61
  end
49
62
 
@@ -64,8 +77,8 @@ module RuboCop
64
77
 
65
78
  def compose_range(expressions, current)
66
79
  range_start, range_end = current.expressions
67
- range_start = if compound_token.size.between?(1, 2) && octal_digit?(range_start.text)
68
- compound_token.dup << range_start
80
+ range_start = if @compound_token.size.between?(1, 2) && octal_digit?(range_start.text)
81
+ @compound_token.dup << range_start
69
82
  else
70
83
  [range_start]
71
84
  end
@@ -6,12 +6,8 @@ module RuboCop
6
6
  # Common methods for finding files.
7
7
  # @api private
8
8
  module FileFinder
9
- def self.root_level=(level)
10
- @root_level = level
11
- end
12
-
13
- def self.root_level?(path, stop_dir)
14
- (@root_level || stop_dir) == path.to_s
9
+ class << self
10
+ attr_accessor :root_level
15
11
  end
16
12
 
17
13
  def find_file_upwards(filename, start_dir, stop_dir = nil)
@@ -34,7 +30,8 @@ module RuboCop
34
30
  file = dir + filename
35
31
  yield(file.to_s) if file.exist?
36
32
 
37
- break if FileFinder.root_level?(dir, stop_dir)
33
+ dir = dir.to_s
34
+ break if dir == stop_dir || dir == FileFinder.root_level
38
35
  end
39
36
  end
40
37
  end
@@ -45,7 +45,10 @@ module RuboCop
45
45
  result: LanguageServer::Protocol::Interface::InitializeResult.new(
46
46
  capabilities: LanguageServer::Protocol::Interface::ServerCapabilities.new(
47
47
  document_formatting_provider: true,
48
- diagnostic_provider: true,
48
+ diagnostic_provider: LanguageServer::Protocol::Interface::DiagnosticOptions.new(
49
+ inter_file_dependencies: false,
50
+ workspace_diagnostics: false
51
+ ),
49
52
  text_document_sync: LanguageServer::Protocol::Interface::TextDocumentSyncOptions.new(
50
53
  change: LanguageServer::Protocol::Constant::TextDocumentSyncKind::FULL,
51
54
  open_close: true
@@ -7,7 +7,7 @@ module RuboCop
7
7
  class MagicComment
8
8
  # IRB's pattern for matching magic comment tokens.
9
9
  # @see https://github.com/ruby/ruby/blob/b4a55c1/lib/irb/magic-file.rb#L5
10
- TOKEN = /[[:alnum:]\-_]+/.freeze
10
+ TOKEN = '(?<token>[[:alnum:]\-_]+)'
11
11
  KEYWORDS = {
12
12
  encoding: '(?:en)?coding',
13
13
  frozen_string_literal: 'frozen[_-]string[_-]literal',
@@ -129,7 +129,7 @@ module RuboCop
129
129
  # @return [String] if pattern matched
130
130
  # @return [nil] otherwise
131
131
  def extract(pattern)
132
- @comment[pattern, 1]
132
+ @comment[pattern, :token]
133
133
  end
134
134
 
135
135
  # Parent to Vim and Emacs magic comment handling.
@@ -157,10 +157,10 @@ module RuboCop
157
157
  # @return [String] extracted value if it is found
158
158
  # @return [nil] otherwise
159
159
  def match(keyword)
160
- pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s*(#{TOKEN})\z/
160
+ pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s*#{TOKEN}\z/
161
161
 
162
162
  tokens.each do |token|
163
- next unless (value = token[pattern, 1])
163
+ next unless (value = token[pattern, :token])
164
164
 
165
165
  return value.downcase
166
166
  end
@@ -188,7 +188,7 @@ module RuboCop
188
188
  # @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
189
189
  # @see https://github.com/ruby/ruby/blob/3f306dc/parse.y#L6873-L6892 Emacs handling in parse.y
190
190
  class EmacsComment < EditorComment
191
- REGEXP = /-\*-(.+)-\*-/.freeze
191
+ REGEXP = /-\*-(?<token>.+)-\*-/.freeze
192
192
  FORMAT = '# -*- %s -*-'
193
193
  SEPARATOR = ';'
194
194
  OPERATOR = ':'
@@ -216,7 +216,7 @@ module RuboCop
216
216
  #
217
217
  # comment.encoding # => 'ascii-8bit'
218
218
  class VimComment < EditorComment
219
- REGEXP = /#\s*vim:\s*(.+)/.freeze
219
+ REGEXP = /#\s*vim:\s*(?<token>.+)/.freeze
220
220
  FORMAT = '# vim: %s'
221
221
  SEPARATOR = ', '
222
222
  OPERATOR = '='
@@ -259,9 +259,11 @@ module RuboCop
259
259
  # comment2.frozen_string_literal # => nil
260
260
  # comment2.encoding # => 'utf-8'
261
261
  class SimpleComment < MagicComment
262
+ FSTRING_LITERAL_COMMENT = 'frozen_string_literal:\s*(true|false)'
263
+
262
264
  # Match `encoding` or `coding`
263
265
  def encoding
264
- extract(/\A\s*\#.*\b#{KEYWORDS[:encoding]}: (#{TOKEN})/io)
266
+ extract(/\A\s*\#\s*(#{FSTRING_LITERAL_COMMENT})?\s*#{KEYWORDS[:encoding]}: (#{TOKEN})/io)
265
267
  end
266
268
 
267
269
  # Rewrite the comment without a given token type
@@ -283,15 +285,15 @@ module RuboCop
283
285
  # Case-insensitive and dashes/underscores are acceptable.
284
286
  # @see https://github.com/ruby/ruby/blob/78b95b4/parse.y#L7134-L7138
285
287
  def extract_frozen_string_literal
286
- extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*(#{TOKEN})\s*\z/io)
288
+ extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*#{TOKEN}\s*\z/io)
287
289
  end
288
290
 
289
291
  def extract_shareable_constant_value
290
- extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s*(#{TOKEN})\s*\z/io)
292
+ extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s*#{TOKEN}\s*\z/io)
291
293
  end
292
294
 
293
295
  def extract_typed
294
- extract(/\A\s*#\s*#{KEYWORDS[:typed]}:\s*(#{TOKEN})\s*\z/io)
296
+ extract(/\A\s*#\s*#{KEYWORDS[:typed]}:\s*#{TOKEN}\s*\z/io)
295
297
  end
296
298
  end
297
299
  end
@@ -11,6 +11,8 @@ RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLe
11
11
  # Make sure to expand all symlinks in the path first. Otherwise we may
12
12
  # get mismatched pathnames when loading config files later on.
13
13
  tmpdir = File.realpath(tmpdir)
14
+ # Make upwards search for .rubocop.yml files stop at this directory.
15
+ RuboCop::FileFinder.root_level = tmpdir
14
16
 
15
17
  virtual_home = File.expand_path(File.join(tmpdir, 'home'))
16
18
  Dir.mkdir(virtual_home)
@@ -21,9 +23,6 @@ RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLe
21
23
  root = example.metadata[:root]
22
24
  working_dir = root ? File.join(base_dir, 'work', root) : File.join(base_dir, 'work')
23
25
 
24
- # Make upwards search for .rubocop.yml files stop at this directory.
25
- RuboCop::FileFinder.root_level = working_dir
26
-
27
26
  begin
28
27
  FileUtils.mkdir_p(working_dir)
29
28
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'fileutils'
3
4
  require 'pathname'
4
5
  require_relative '../cache_config'
5
6
  require_relative '../config_finder'
@@ -155,9 +155,11 @@ module RuboCop
155
155
  (send _ :required_ruby_version= $_)
156
156
  PATTERN
157
157
 
158
- # @!method gem_requirement?(node)
159
- def_node_matcher :gem_requirement?, <<~PATTERN
160
- (send (const(const _ :Gem):Requirement) :new $str)
158
+ # @!method gem_requirement_versions(node)
159
+ def_node_matcher :gem_requirement_versions, <<~PATTERN
160
+ (send (const(const _ :Gem):Requirement) :new
161
+ {$str+ | (send $str :freeze)+ | (array $str+) | (array (send $str :freeze)+)}
162
+ )
161
163
  PATTERN
162
164
 
163
165
  def name
@@ -194,10 +196,12 @@ module RuboCop
194
196
  end
195
197
 
196
198
  def version_from_right_hand_side(right_hand_side)
199
+ gem_requirement_versions = gem_requirement_versions(right_hand_side)
200
+
197
201
  if right_hand_side.array_type?
198
202
  version_from_array(right_hand_side)
199
- elsif gem_requirement?(right_hand_side)
200
- right_hand_side.children.last.value
203
+ elsif gem_requirement_versions
204
+ gem_requirement_versions.map(&:value)
201
205
  else
202
206
  right_hand_side.value
203
207
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.56.0'
6
+ STRING = '1.57.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
@@ -580,6 +580,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
580
580
  require_relative 'rubocop/cop/style/redundant_self_assignment'
581
581
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
582
582
  require_relative 'rubocop/cop/style/require_order'
583
+ require_relative 'rubocop/cop/style/single_line_do_end_block'
583
584
  require_relative 'rubocop/cop/style/sole_nested_conditional'
584
585
  require_relative 'rubocop/cop/style/static_class'
585
586
  require_relative 'rubocop/cop/style/map_compact_with_conditional_block'
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.56.0
4
+ version: 1.57.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
8
8
  - Jonas Arvidsson
9
9
  - Yuji Nakayama
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2023-08-09 00:00:00.000000000 Z
13
+ date: 2023-10-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: base64
@@ -74,14 +74,14 @@ dependencies:
74
74
  requirements:
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 3.2.2.3
77
+ version: 3.2.2.4
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 3.2.2.3
84
+ version: 3.2.2.4
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: rainbow
87
87
  requirement: !ruby/object:Gem::Requirement
@@ -196,9 +196,9 @@ dependencies:
196
196
  - - "<"
197
197
  - !ruby/object:Gem::Version
198
198
  version: '3.0'
199
- description: |2
200
- RuboCop is a Ruby code style checking and code formatting tool.
201
- It aims to enforce the community-driven Ruby Style Guide.
199
+ description: |
200
+ RuboCop is a Ruby code style checking and code formatting tool.
201
+ It aims to enforce the community-driven Ruby Style Guide.
202
202
  email: rubocop@googlegroups.com
203
203
  executables:
204
204
  - rubocop
@@ -895,6 +895,7 @@ files:
895
895
  - lib/rubocop/cop/style/signal_exception.rb
896
896
  - lib/rubocop/cop/style/single_argument_dig.rb
897
897
  - lib/rubocop/cop/style/single_line_block_params.rb
898
+ - lib/rubocop/cop/style/single_line_do_end_block.rb
898
899
  - lib/rubocop/cop/style/single_line_methods.rb
899
900
  - lib/rubocop/cop/style/slicing_with_range.rb
900
901
  - lib/rubocop/cop/style/sole_nested_conditional.rb
@@ -1038,10 +1039,10 @@ metadata:
1038
1039
  homepage_uri: https://rubocop.org/
1039
1040
  changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
1040
1041
  source_code_uri: https://github.com/rubocop/rubocop/
1041
- documentation_uri: https://docs.rubocop.org/rubocop/1.56/
1042
+ documentation_uri: https://docs.rubocop.org/rubocop/1.57/
1042
1043
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
1043
1044
  rubygems_mfa_required: 'true'
1044
- post_install_message:
1045
+ post_install_message:
1045
1046
  rdoc_options: []
1046
1047
  require_paths:
1047
1048
  - lib
@@ -1056,8 +1057,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1056
1057
  - !ruby/object:Gem::Version
1057
1058
  version: '0'
1058
1059
  requirements: []
1059
- rubygems_version: 3.4.6
1060
- signing_key:
1060
+ rubygems_version: 3.3.7
1061
+ signing_key:
1061
1062
  specification_version: 4
1062
1063
  summary: Automatic Ruby code style checking tool.
1063
1064
  test_files: []