rubocop 1.48.1 → 1.49.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +13 -2
  4. data/lib/rubocop/cli/command/execute_runner.rb +7 -2
  5. data/lib/rubocop/cli.rb +6 -6
  6. data/lib/rubocop/config.rb +1 -1
  7. data/lib/rubocop/cop/autocorrect_logic.rb +28 -12
  8. data/lib/rubocop/cop/cop.rb +2 -2
  9. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  10. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  11. data/lib/rubocop/cop/internal_affairs/cop_description.rb +1 -1
  12. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +2 -2
  13. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  14. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +29 -2
  15. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
  16. data/lib/rubocop/cop/layout/end_alignment.rb +5 -1
  17. data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
  18. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -1
  19. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  20. data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -7
  21. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  22. data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
  23. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +3 -3
  24. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  25. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  26. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -1
  27. data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -1
  28. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
  29. data/lib/rubocop/cop/lint/useless_method_definition.rb +10 -2
  30. data/lib/rubocop/cop/lint/void.rb +7 -3
  31. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  32. data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
  33. data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
  34. data/lib/rubocop/cop/naming/inclusive_language.rb +22 -3
  35. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  36. data/lib/rubocop/cop/style/class_equality_comparison.rb +15 -2
  37. data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
  38. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  39. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
  40. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  41. data/lib/rubocop/cop/style/hash_except.rb +4 -4
  42. data/lib/rubocop/cop/style/hash_syntax.rb +4 -1
  43. data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -12
  44. data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
  45. data/lib/rubocop/cop/style/map_to_set.rb +4 -1
  46. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -7
  47. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +43 -36
  48. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
  49. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  50. data/lib/rubocop/cop/style/redundant_line_continuation.rb +142 -0
  51. data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
  52. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  53. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -2
  54. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  55. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -3
  56. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
  57. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  58. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  59. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  60. data/lib/rubocop/ext/regexp_node.rb +1 -1
  61. data/lib/rubocop/ext/regexp_parser.rb +1 -1
  62. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  63. data/lib/rubocop/options.rb +4 -1
  64. data/lib/rubocop/result_cache.rb +1 -1
  65. data/lib/rubocop/server/cache.rb +1 -1
  66. data/lib/rubocop/server/helper.rb +1 -1
  67. data/lib/rubocop/server/server_command/exec.rb +1 -1
  68. data/lib/rubocop/version.rb +1 -1
  69. data/lib/rubocop.rb +2 -0
  70. metadata +8 -6
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Check for redundant line continuation.
7
+ #
8
+ # This cop marks a line continuation as redundant if removing the backslash
9
+ # does not result in a syntax error.
10
+ # However, a backslash at the end of a comment or
11
+ # for string concatenation is not redundant and is not considered an offense.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # foo. \
16
+ # bar
17
+ # foo \
18
+ # &.bar \
19
+ # .baz
20
+ #
21
+ # # good
22
+ # foo.
23
+ # bar
24
+ # foo
25
+ # &.bar
26
+ # .baz
27
+ #
28
+ # # bad
29
+ # [foo, \
30
+ # bar]
31
+ # {foo: \
32
+ # bar}
33
+ #
34
+ # # good
35
+ # [foo,
36
+ # bar]
37
+ # {foo:
38
+ # bar}
39
+ #
40
+ # # bad
41
+ # foo(bar, \
42
+ # baz)
43
+ #
44
+ # # good
45
+ # foo(bar,
46
+ # baz)
47
+ #
48
+ # # also good - backslash in string concatenation is not redundant
49
+ # foo('bar' \
50
+ # 'baz')
51
+ #
52
+ # # also good - backslash at the end of a comment is not redundant
53
+ # foo(bar, # \
54
+ # baz)
55
+ #
56
+ # # also good - backslash at the line following the newline begins with a + or -,
57
+ # # it is not redundant
58
+ # 1 \
59
+ # + 2 \
60
+ # - 3
61
+ #
62
+ # # also good - backslash with newline between the method name and its arguments,
63
+ # # it is not redundant.
64
+ # some_method \
65
+ # (argument)
66
+ #
67
+ class RedundantLineContinuation < Base
68
+ include MatchRange
69
+ extend AutoCorrector
70
+
71
+ MSG = 'Redundant line continuation.'
72
+
73
+ def on_new_investigation
74
+ return unless processed_source.ast
75
+
76
+ each_match_range(processed_source.ast.source_range, /(\\\n)/) do |range|
77
+ next if require_line_continuation?(range)
78
+ next unless redundant_line_continuation?(range)
79
+
80
+ add_offense(range) do |corrector|
81
+ corrector.remove_leading(range, 1)
82
+ end
83
+ end
84
+ end
85
+
86
+ private
87
+
88
+ def require_line_continuation?(range)
89
+ !ends_with_backslash_without_comment?(range.source_line) ||
90
+ string_concatenation?(range.source_line) ||
91
+ starts_with_plus_or_minus?(processed_source[range.line])
92
+ end
93
+
94
+ def ends_with_backslash_without_comment?(source_line)
95
+ source_line.gsub(/#.+/, '').end_with?('\\')
96
+ end
97
+
98
+ def string_concatenation?(source_line)
99
+ /["']\s*\\\z/.match?(source_line)
100
+ end
101
+
102
+ def redundant_line_continuation?(range)
103
+ return true unless (node = find_node_for_line(range.line))
104
+ return false if argument_newline?(node)
105
+
106
+ parse(node.source.gsub(/\\\n/, "\n")).valid_syntax?
107
+ end
108
+
109
+ def argument_newline?(node)
110
+ node = node.children.first if node.root? && node.begin_type?
111
+ return if !node.send_type? || node.arguments.empty?
112
+
113
+ node.loc.selector.line != node.first_argument.loc.line
114
+ end
115
+
116
+ def find_node_for_line(line)
117
+ processed_source.ast.each_node do |node|
118
+ return node if same_line?(node, line)
119
+ end
120
+ end
121
+
122
+ def same_line?(node, line)
123
+ return unless (source_range = node.source_range)
124
+
125
+ if node.is_a?(AST::StrNode)
126
+ if node.heredoc?
127
+ (node.loc.heredoc_body.line..node.loc.heredoc_body.last_line).cover?(line)
128
+ else
129
+ (source_range.line..source_range.last_line).cover?(line)
130
+ end
131
+ else
132
+ source_range.line == line
133
+ end
134
+ end
135
+
136
+ def starts_with_plus_or_minus?(source_line)
137
+ %r{\A\s*[+\-*/%]}.match?(source_line)
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -98,7 +98,7 @@ module RuboCop
98
98
  end
99
99
 
100
100
  def like_method_argument_parentheses?(node)
101
- node.send_type? && node.arguments.one? &&
101
+ node.send_type? && node.arguments.one? && !node.parenthesized? &&
102
102
  !node.arithmetic_operation? && node.first_argument.begin_type?
103
103
  end
104
104
 
@@ -93,7 +93,7 @@ module RuboCop
93
93
 
94
94
  return true if STRING_INTERPOLATION_REGEXP.match?(src)
95
95
 
96
- src.scan(/\\./).any? { |s| ESCAPED_NON_BACKSLASH.match?(s) }
96
+ src.scan(/\\./).any?(ESCAPED_NON_BACKSLASH)
97
97
  end
98
98
 
99
99
  def acceptable_capital_q?(node)
@@ -63,7 +63,7 @@ module RuboCop
63
63
  next if expr.type != :set || expr.expressions.size != 1
64
64
  next if expr.negative?
65
65
  next if %i[set posixclass nonposixclass].include?(expr.expressions.first.type)
66
- next if multiple_codepoins?(expr.expressions.first)
66
+ next if multiple_codepoints?(expr.expressions.first)
67
67
 
68
68
  yield expr
69
69
  end
@@ -80,7 +80,7 @@ module RuboCop
80
80
  !non_redundant
81
81
  end
82
82
 
83
- def multiple_codepoins?(expression)
83
+ def multiple_codepoints?(expression)
84
84
  expression.respond_to?(:codepoints) && expression.codepoints.count >= 2
85
85
  end
86
86
 
@@ -107,7 +107,7 @@ module RuboCop
107
107
  end
108
108
  end
109
109
  # Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
110
- # It's for compatibility with regexp_arser 1.8 and will never be maintained.
110
+ # It's for compatibility with regexp_parser 1.8 and will never be maintained.
111
111
  else
112
112
  def each_escape(node)
113
113
  node.parsed_tree&.traverse&.reduce(0) do |char_class_depth, (event, expr)|
@@ -36,7 +36,6 @@ module RuboCop
36
36
  # STR
37
37
  class RedundantStringEscape < Base
38
38
  include MatchRange
39
- include RangeHelp
40
39
  extend AutoCorrector
41
40
 
42
41
  MSG = 'Redundant escape of %<char>s inside string literal.'
@@ -64,10 +63,10 @@ module RuboCop
64
63
  def str_contents_range(node)
65
64
  if heredoc?(node)
66
65
  node.loc.heredoc_body
66
+ elsif node.str_type?
67
+ node.source_range
67
68
  elsif begin_loc_present?(node)
68
69
  contents_range(node)
69
- else
70
- node.source_range
71
70
  end
72
71
  end
73
72
 
@@ -167,7 +167,7 @@ module RuboCop
167
167
  corrector.insert_before(condition,
168
168
  "#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
169
169
 
170
- corrector.remove(node.condition.source_range)
170
+ corrector.remove(node.condition)
171
171
  corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
172
172
  corrector.replace(if_branch.loc.keyword, 'if')
173
173
  end
@@ -187,7 +187,7 @@ module RuboCop
187
187
  return if end_pos > begin_pos
188
188
 
189
189
  corrector.replace(range_between(end_pos, begin_pos), '(')
190
- corrector.insert_after(condition.last_argument.source_range, ')')
190
+ corrector.insert_after(condition.last_argument, ')')
191
191
  end
192
192
 
193
193
  def insert_bang(corrector, node, is_modify_form)
@@ -55,7 +55,7 @@ module RuboCop
55
55
  elsif (class_node = parent.parent).body.nil?
56
56
  corrector.remove(range_for_empty_class_body(class_node, parent))
57
57
  else
58
- corrector.insert_after(parent.source_range, ' do')
58
+ corrector.insert_after(parent, ' do')
59
59
  end
60
60
  end
61
61
 
@@ -238,7 +238,7 @@ module RuboCop
238
238
 
239
239
  indent = ' ' * node.loc.column
240
240
  corrector.replace(
241
- node.source_range,
241
+ node,
242
242
  ['class << self',
243
243
  "#{indent} #{accessor(kind, node.method_name)}",
244
244
  "#{indent}end"].join("\n")
@@ -8,6 +8,7 @@ module RuboCop
8
8
  # to read and understand.
9
9
  #
10
10
  # This cop supports two styles:
11
+ #
11
12
  # - `forbid_mixed_logical_operators` (default)
12
13
  # - `forbid_logical_operators`
13
14
  #
@@ -29,7 +29,7 @@ module RuboCop
29
29
  @parsed_tree&.each_expression(true) { |e| e.origin = origin }
30
30
  end
31
31
  # Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
32
- # It's for compatibility with regexp_arser 1.8 and will never be maintained.
32
+ # It's for compatibility with regexp_parser 1.8 and will never be maintained.
33
33
  else
34
34
  def assign_properties(*)
35
35
  super
@@ -28,7 +28,7 @@ module RuboCop
28
28
  @expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
29
29
  end
30
30
  # Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
31
- # It's for compatibility with regexp_arser 1.8 and will never be maintained.
31
+ # It's for compatibility with regexp_parser 1.8 and will never be maintained.
32
32
  else
33
33
  attr_accessor :source
34
34
 
@@ -61,7 +61,7 @@ module RuboCop
61
61
  correctable_count,
62
62
  rainbow,
63
63
  # :safe_autocorrect is a derived option based on several command-line
64
- # arguments - see Rubocop::Options#add_autocorrection_options
64
+ # arguments - see RuboCop::Options#add_autocorrection_options
65
65
  safe_autocorrect: @options[:safe_autocorrect])
66
66
 
67
67
  output.puts
@@ -182,7 +182,10 @@ module RuboCop
182
182
  raise OptionArgumentError, message
183
183
  end
184
184
 
185
- @options[:"#{option}"] = list.empty? ? [''] : list.split(',')
185
+ cop_names = list.empty? ? [''] : list.split(',')
186
+ cop_names.unshift('Lint/Syntax') if option == 'only' && !cop_names.include?('Lint/Syntax')
187
+
188
+ @options[:"#{option}"] = cop_names
186
189
  end
187
190
  end
188
191
 
@@ -86,7 +86,7 @@ module RuboCop
86
86
  attr :path
87
87
 
88
88
  def initialize(file, team, options, config_store, cache_root = nil)
89
- cache_root ||= options[:cache_root]
89
+ cache_root ||= File.join(options[:cache_root], 'rubocop_cache') if options[:cache_root]
90
90
  cache_root ||= ResultCache.cache_root(config_store)
91
91
  @allow_symlinks_in_cache_location =
92
92
  ResultCache.allow_symlinks_in_cache_location?(config_store)
@@ -116,7 +116,7 @@ module RuboCop
116
116
 
117
117
  def pid_running?
118
118
  Process.kill(0, pid_path.read.to_i) == 1
119
- rescue Errno::ESRCH, Errno::ENOENT
119
+ rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES
120
120
  false
121
121
  end
122
122
 
@@ -11,7 +11,7 @@
11
11
  #
12
12
  module RuboCop
13
13
  module Server
14
- # This module has a helper memthod for `RuboCop::Server::SocketReader`.
14
+ # This module has a helper method for `RuboCop::Server::SocketReader`.
15
15
  # @api private
16
16
  module Helper
17
17
  def self.redirect(stdin: $stdin, stdout: $stdout, stderr: $stderr, &_block)
@@ -21,7 +21,7 @@ module RuboCop
21
21
  # We must pass the --color option to preserve this behavior.
22
22
  @args.unshift('--color') unless %w[--color --no-color].any? { |f| @args.include?(f) }
23
23
  status = RuboCop::CLI.new.run(@args)
24
- # This status file is read by `rubocop --server` (`RuboCop::Server::Clientcommand::Exec`).
24
+ # This status file is read by `rubocop --server` (`RuboCop::Server::ClientCommand::Exec`).
25
25
  # so that they use the correct exit code.
26
26
  # Status is 1 when there are any issues, and 0 otherwise.
27
27
  Cache.write_status_file(status)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.48.1'
6
+ STRING = '1.49.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
@@ -480,6 +480,7 @@ require_relative 'rubocop/cop/style/concat_array_literals'
480
480
  require_relative 'rubocop/cop/style/conditional_assignment'
481
481
  require_relative 'rubocop/cop/style/constant_visibility'
482
482
  require_relative 'rubocop/cop/style/copyright'
483
+ require_relative 'rubocop/cop/style/data_inheritance'
483
484
  require_relative 'rubocop/cop/style/date_time'
484
485
  require_relative 'rubocop/cop/style/def_with_parentheses'
485
486
  require_relative 'rubocop/cop/style/dir'
@@ -563,6 +564,7 @@ require_relative 'rubocop/cop/style/redundant_fetch_block'
563
564
  require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
564
565
  require_relative 'rubocop/cop/style/redundant_heredoc_delimiter_quotes'
565
566
  require_relative 'rubocop/cop/style/redundant_initialize'
567
+ require_relative 'rubocop/cop/style/redundant_line_continuation'
566
568
  require_relative 'rubocop/cop/style/redundant_self_assignment'
567
569
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
568
570
  require_relative 'rubocop/cop/style/require_order'
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.48.1
4
+ version: 1.49.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: 2023-03-13 00:00:00.000000000 Z
13
+ date: 2023-04-03 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.26.0
123
+ version: 1.28.0
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.26.0
133
+ version: 1.28.0
134
134
  - - "<"
135
135
  - !ruby/object:Gem::Version
136
136
  version: '2.0'
@@ -683,6 +683,7 @@ files:
683
683
  - lib/rubocop/cop/style/conditional_assignment.rb
684
684
  - lib/rubocop/cop/style/constant_visibility.rb
685
685
  - lib/rubocop/cop/style/copyright.rb
686
+ - lib/rubocop/cop/style/data_inheritance.rb
686
687
  - lib/rubocop/cop/style/date_time.rb
687
688
  - lib/rubocop/cop/style/def_with_parentheses.rb
688
689
  - lib/rubocop/cop/style/dir.rb
@@ -827,6 +828,7 @@ files:
827
828
  - lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb
828
829
  - lib/rubocop/cop/style/redundant_initialize.rb
829
830
  - lib/rubocop/cop/style/redundant_interpolation.rb
831
+ - lib/rubocop/cop/style/redundant_line_continuation.rb
830
832
  - lib/rubocop/cop/style/redundant_parentheses.rb
831
833
  - lib/rubocop/cop/style/redundant_percent_q.rb
832
834
  - lib/rubocop/cop/style/redundant_regexp_character_class.rb
@@ -988,7 +990,7 @@ metadata:
988
990
  homepage_uri: https://rubocop.org/
989
991
  changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
990
992
  source_code_uri: https://github.com/rubocop/rubocop/
991
- documentation_uri: https://docs.rubocop.org/rubocop/1.48/
993
+ documentation_uri: https://docs.rubocop.org/rubocop/1.49/
992
994
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
993
995
  rubygems_mfa_required: 'true'
994
996
  post_install_message:
@@ -1006,7 +1008,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1006
1008
  - !ruby/object:Gem::Version
1007
1009
  version: '0'
1008
1010
  requirements: []
1009
- rubygems_version: 3.1.2
1011
+ rubygems_version: 3.4.6
1010
1012
  signing_key:
1011
1013
  specification_version: 4
1012
1014
  summary: Automatic Ruby code style checking tool.