rubocop 1.54.0 → 1.54.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b952fc5852376637345f505d8753d44608bc082ea9bb64f9d4e61b5cc9cd6005
4
- data.tar.gz: e7a695e76983fe1ff49d7951be70eabcb149de9bd20179f564cb61adc04d8b33
3
+ metadata.gz: b5aa0f1796446e72fc2559c5e0ba132c8b8e0e2f244c649e37c475f309911cab
4
+ data.tar.gz: ab9d4c1160f25912df7db584e67e4c2ce13f8372823a8f5f732ca6664ea63863
5
5
  SHA512:
6
- metadata.gz: 1b2f4d9249a3e283b1ed762a73c8d68b31db632de1a2e0005b99769314598fbe9394ea86a56abfff7ead03acd17d4ab343a6540ee712196bc36326959b8f9138
7
- data.tar.gz: 1d8d0d7ac82f4440385d2b502070f3bfb872d651af0707f78ff2df6f90cd6ee51bd03ccf84c71f4f582d812a661be3af2a637895b1b0137dc37ec7606fcfcb45
6
+ metadata.gz: b314533429676735ccfbda5f7e891087c7c277fc84789aa4c82c6961ab966f8d7c6ce1c491f0b6033a7893c48348eebff092dc50f462dd5b3a3cbe77954adf99
7
+ data.tar.gz: 91e2894b3931bed08640afc882785b5e18371d79fee3a1f4a9eddcb44faa9c4b2232fe798185fcb2b57c3b4561efab25ac019ae543fa4c9b0bdaf0f8a361522b
@@ -51,7 +51,9 @@ module RuboCop
51
51
 
52
52
  def extract_receiver(node)
53
53
  receiver = node.receiver
54
- receiver = receiver.receiver if receiver.method?(:loc) || receiver.method?(:source_range)
54
+ if receiver.send_type? && (receiver.method?(:loc) || receiver.method?(:source_range))
55
+ receiver = receiver.receiver
56
+ end
55
57
  receiver.source
56
58
  end
57
59
  end
@@ -24,7 +24,15 @@ module RuboCop
24
24
  end
25
25
 
26
26
  def kind(token)
27
- 'comma' if token.comma?
27
+ 'comma' if token.comma? && !before_semicolon?(token)
28
+ end
29
+
30
+ private
31
+
32
+ def before_semicolon?(token)
33
+ tokens = processed_source.tokens
34
+
35
+ tokens[tokens.index(token) + 1].semicolon?
28
36
  end
29
37
  end
30
38
  end
@@ -51,6 +51,7 @@ module RuboCop
51
51
  # there could be good reasons why it needs to end with a certain
52
52
  # number of newlines.
53
53
  return if ends_in_end?(processed_source)
54
+ return if end_with_percent_blank_string?(processed_source)
54
55
 
55
56
  whitespace_at_end = buffer.source[/\s*\Z/]
56
57
  blank_lines = whitespace_at_end.count("\n") - 1
@@ -86,6 +87,10 @@ module RuboCop
86
87
  extra&.strip&.start_with?('__END__')
87
88
  end
88
89
 
90
+ def end_with_percent_blank_string?(processed_source)
91
+ processed_source.buffer.source.end_with?("%\n\n")
92
+ end
93
+
89
94
  def message(wanted_blank_lines, blank_lines)
90
95
  case blank_lines
91
96
  when -1
@@ -5,6 +5,14 @@ module RuboCop
5
5
  module Lint
6
6
  # Checks for redundant quantifiers inside Regexp literals.
7
7
  #
8
+ # It is always allowed when interpolation is used in a regexp literal,
9
+ # because it's unknown what kind of string will be expanded as a result:
10
+ #
11
+ # [source,ruby]
12
+ # ----
13
+ # /(?:a*#{interpolation})?/x
14
+ # ----
15
+ #
8
16
  # @example
9
17
  # # bad
10
18
  # /(?:x+)+/
@@ -32,6 +40,8 @@ module RuboCop
32
40
  'with a single `%<replacement>s`.'
33
41
 
34
42
  def on_regexp(node)
43
+ return if node.interpolation?
44
+
35
45
  each_redundantly_quantified_pair(node) do |group, child|
36
46
  replacement = merged_quantifier(group, child)
37
47
  add_offense(
@@ -190,7 +190,7 @@ module RuboCop
190
190
  def source_from_node_with_heredoc(node)
191
191
  last_line = -1
192
192
  node.each_descendant do |descendant|
193
- next unless descendant.loc
193
+ next unless descendant.source
194
194
 
195
195
  descendant_last_line =
196
196
  if heredoc_node?(descendant)
@@ -75,9 +75,7 @@ module RuboCop
75
75
  end
76
76
 
77
77
  def aligned_token?(range, line)
78
- aligned_words?(range, line) ||
79
- aligned_char?(range, line) ||
80
- aligned_assignment?(range, line)
78
+ aligned_words?(range, line) || aligned_dot?(range, line) || aligned_assignment?(range, line)
81
79
  end
82
80
 
83
81
  def aligned_operator?(range, line)
@@ -88,8 +86,10 @@ module RuboCop
88
86
  /\s\S/.match?(line[range.column - 1, 2])
89
87
  end
90
88
 
91
- def aligned_char?(range, line)
92
- line[range.column] == range.source[0]
89
+ def aligned_dot?(range, line)
90
+ char = line[range.column]
91
+
92
+ char == '.' && char == range.source[0]
93
93
  end
94
94
 
95
95
  def aligned_assignment?(range, line)
@@ -106,7 +106,7 @@ module RuboCop
106
106
  end
107
107
 
108
108
  def elements(node)
109
- return node.children unless %i[csend send].include?(node.type)
109
+ return node.children unless node.call_type?
110
110
 
111
111
  node.arguments.flat_map do |argument|
112
112
  # For each argument, if it is a multi-line hash without braces,
@@ -31,7 +31,9 @@ module RuboCop
31
31
  def on_heredoc(node)
32
32
  return if meaningful_delimiters?(node)
33
33
 
34
- add_offense(node.loc.heredoc_end)
34
+ range = node.children.empty? ? node : node.loc.heredoc_end
35
+
36
+ add_offense(range)
35
37
  end
36
38
 
37
39
  private
@@ -142,7 +142,9 @@ module RuboCop
142
142
  end
143
143
 
144
144
  next_token = processed_source.tokens[token_number]
145
- token = next_token if Encoding::ENCODING_PATTERN.match?(next_token&.text)
145
+ if next_token&.text&.valid_encoding? && Encoding::ENCODING_PATTERN.match?(next_token.text)
146
+ token = next_token
147
+ end
146
148
 
147
149
  token
148
150
  end
@@ -57,6 +57,7 @@ module RuboCop
57
57
  corrector.replace(regexp_node, prefer)
58
58
  end
59
59
  end
60
+ alias on_csend on_send
60
61
 
61
62
  private
62
63
 
@@ -31,7 +31,7 @@ module RuboCop
31
31
  # do_something?
32
32
  # end
33
33
  #
34
- # @example AllowedMethod: ['foo?']
34
+ # @example AllowedMethods: ['foo?']
35
35
  # # good
36
36
  # def foo?
37
37
  # return if condition
@@ -39,7 +39,7 @@ module RuboCop
39
39
  # do_something?
40
40
  # end
41
41
  #
42
- # @example AllowedPattern: [/foo/]
42
+ # @example AllowedPatterns: [/foo/]
43
43
  # # good
44
44
  # def foo?
45
45
  # return if condition
@@ -62,9 +62,6 @@ module RuboCop
62
62
  private
63
63
 
64
64
  def check_for_line_terminator_or_opener
65
- # Make the obvious check first
66
- return unless processed_source.raw_source.include?(';')
67
-
68
65
  each_semicolon do |line, column, token_before_semicolon|
69
66
  register_semicolon(line, column, false, token_before_semicolon)
70
67
  end
@@ -102,10 +102,11 @@ module RuboCop
102
102
  end
103
103
 
104
104
  def multiple_assignment_node
105
- grandparent_node = node.parent&.parent
106
- return nil unless grandparent_node
105
+ return nil unless (grandparent_node = node.parent&.parent)
106
+ if (node = find_multiple_assignment_node(grandparent_node))
107
+ return node
108
+ end
107
109
  return nil unless grandparent_node.type == MULTIPLE_ASSIGNMENT_TYPE
108
- return nil unless node.parent.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
109
110
 
110
111
  grandparent_node
111
112
  end
@@ -122,6 +123,16 @@ module RuboCop
122
123
 
123
124
  node.parent
124
125
  end
126
+
127
+ def find_multiple_assignment_node(grandparent_node)
128
+ return unless grandparent_node.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
129
+ return if grandparent_node.children.any?(&:splat_type?)
130
+
131
+ parent = grandparent_node.parent
132
+ return parent if parent.type == MULTIPLE_ASSIGNMENT_TYPE
133
+
134
+ find_multiple_assignment_node(parent)
135
+ end
125
136
  end
126
137
  end
127
138
  end
@@ -32,7 +32,7 @@ module RuboCop
32
32
 
33
33
  def ensure_server!
34
34
  if incompatible_version?
35
- puts 'RuboCop version incompatibility found, RuboCop server restarting...'
35
+ warn 'RuboCop version incompatibility found, RuboCop server restarting...'
36
36
  ClientCommand::Stop.new.run
37
37
  elsif check_running_server
38
38
  return
@@ -32,9 +32,9 @@ module RuboCop
32
32
 
33
33
  def interpret_string_escape(escape)
34
34
  case escape[1]
35
- when 'u' then interpret_unicode(escape)
36
- when 'x' then interpret_hex(escape)
37
- when /\d/ then interpret_octal(escape)
35
+ when 'u' then interpret_unicode(escape)
36
+ when 'x' then interpret_hex(escape)
37
+ when /\d/ then interpret_octal(escape)
38
38
  else
39
39
  escape[1] # literal escaped char, like \\
40
40
  end
@@ -114,7 +114,7 @@ module RuboCop
114
114
  end
115
115
 
116
116
  def combined_exclude_glob_patterns(base_dir)
117
- exclude = @config_store.for(base_dir).for_all_cops['Exclude']
117
+ exclude = @config_store.for(base_dir).for_all_cops['Exclude'] || []
118
118
  patterns = exclude.select { |pattern| pattern.is_a?(String) && pattern.end_with?('/**/*') }
119
119
  .map { |pattern| pattern.sub("#{base_dir}/", '') }
120
120
  "#{base_dir}/{#{patterns.join(',')}}"
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.54.0'
6
+ STRING = '1.54.2'
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.54.0
4
+ version: 1.54.2
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: 2023-07-01 00:00:00.000000000 Z
13
+ date: 2023-07-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json