rubocop 0.93.1 → 1.3.1

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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -16
  3. data/config/default.yml +207 -72
  4. data/exe/rubocop +1 -1
  5. data/lib/rubocop.rb +16 -2
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
  7. data/lib/rubocop/cli/command/version.rb +1 -1
  8. data/lib/rubocop/comment_config.rb +1 -1
  9. data/lib/rubocop/config.rb +4 -0
  10. data/lib/rubocop/config_loader.rb +33 -7
  11. data/lib/rubocop/config_loader_resolver.rb +7 -5
  12. data/lib/rubocop/config_validator.rb +7 -6
  13. data/lib/rubocop/cop/badge.rb +9 -24
  14. data/lib/rubocop/cop/base.rb +16 -1
  15. data/lib/rubocop/cop/bundler/duplicated_gem.rb +26 -6
  16. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  17. data/lib/rubocop/cop/commissioner.rb +37 -23
  18. data/lib/rubocop/cop/corrector.rb +3 -1
  19. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  20. data/lib/rubocop/cop/force.rb +1 -1
  21. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -3
  22. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +4 -5
  23. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  24. data/lib/rubocop/cop/generator.rb +2 -9
  25. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  26. data/lib/rubocop/cop/layout/block_alignment.rb +3 -4
  27. data/lib/rubocop/cop/layout/class_structure.rb +22 -3
  28. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  29. data/lib/rubocop/cop/layout/else_alignment.rb +15 -2
  30. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  31. data/lib/rubocop/cop/layout/end_alignment.rb +3 -3
  32. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -2
  33. data/lib/rubocop/cop/layout/hash_alignment.rb +4 -4
  34. data/lib/rubocop/cop/layout/line_length.rb +8 -1
  35. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +24 -18
  36. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -1
  37. data/lib/rubocop/cop/layout/space_inside_parens.rb +35 -13
  38. data/lib/rubocop/cop/layout/trailing_whitespace.rb +37 -13
  39. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +26 -2
  40. data/lib/rubocop/cop/lint/debugger.rb +17 -28
  41. data/lib/rubocop/cop/lint/duplicate_branch.rb +93 -0
  42. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +2 -12
  43. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +77 -0
  44. data/lib/rubocop/cop/lint/else_layout.rb +29 -3
  45. data/lib/rubocop/cop/lint/empty_block.rb +82 -0
  46. data/lib/rubocop/cop/lint/empty_class.rb +93 -0
  47. data/lib/rubocop/cop/lint/flip_flop.rb +8 -2
  48. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +38 -6
  49. data/lib/rubocop/cop/lint/loop.rb +4 -4
  50. data/lib/rubocop/cop/lint/nested_percent_literal.rb +14 -0
  51. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
  52. data/lib/rubocop/cop/lint/number_conversion.rb +46 -13
  53. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +27 -8
  54. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +19 -16
  55. data/lib/rubocop/cop/lint/shadowed_exception.rb +4 -5
  56. data/lib/rubocop/cop/lint/to_enum_arguments.rb +86 -0
  57. data/lib/rubocop/cop/lint/to_json.rb +1 -1
  58. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +185 -0
  59. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
  60. data/lib/rubocop/cop/lint/useless_method_definition.rb +2 -4
  61. data/lib/rubocop/cop/lint/useless_setter_call.rb +6 -1
  62. data/lib/rubocop/cop/metrics/parameter_lists.rb +4 -1
  63. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  64. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  65. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
  66. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -4
  67. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +12 -2
  68. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +11 -5
  69. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +67 -18
  70. data/lib/rubocop/cop/naming/predicate_name.rb +2 -1
  71. data/lib/rubocop/cop/naming/variable_number.rb +98 -8
  72. data/lib/rubocop/cop/offense.rb +3 -3
  73. data/lib/rubocop/cop/security/open.rb +12 -10
  74. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
  75. data/lib/rubocop/cop/style/and_or.rb +1 -3
  76. data/lib/rubocop/cop/style/arguments_forwarding.rb +142 -0
  77. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -4
  78. data/lib/rubocop/cop/style/case_like_if.rb +0 -4
  79. data/lib/rubocop/cop/style/collection_compact.rb +91 -0
  80. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +169 -0
  81. data/lib/rubocop/cop/style/double_negation.rb +6 -1
  82. data/lib/rubocop/cop/style/format_string_token.rb +47 -2
  83. data/lib/rubocop/cop/style/hash_syntax.rb +3 -3
  84. data/lib/rubocop/cop/style/identical_conditional_branches.rb +7 -2
  85. data/lib/rubocop/cop/style/if_inside_else.rb +37 -1
  86. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -3
  87. data/lib/rubocop/cop/style/infinite_loop.rb +4 -0
  88. data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -0
  89. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +10 -13
  90. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -11
  91. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +7 -11
  92. data/lib/rubocop/cop/style/mixin_grouping.rb +0 -4
  93. data/lib/rubocop/cop/style/multiple_comparison.rb +55 -7
  94. data/lib/rubocop/cop/style/negated_if_else_condition.rb +106 -0
  95. data/lib/rubocop/cop/style/nil_lambda.rb +52 -0
  96. data/lib/rubocop/cop/style/raise_args.rb +21 -6
  97. data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -0
  98. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -1
  99. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  100. data/lib/rubocop/cop/style/redundant_self.rb +3 -0
  101. data/lib/rubocop/cop/style/safe_navigation.rb +16 -4
  102. data/lib/rubocop/cop/style/semicolon.rb +3 -0
  103. data/lib/rubocop/cop/style/static_class.rb +97 -0
  104. data/lib/rubocop/cop/style/string_concatenation.rb +13 -1
  105. data/lib/rubocop/cop/style/swap_values.rb +108 -0
  106. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +3 -1
  107. data/lib/rubocop/cop/style/while_until_modifier.rb +9 -0
  108. data/lib/rubocop/cop/team.rb +6 -1
  109. data/lib/rubocop/cop/util.rb +5 -1
  110. data/lib/rubocop/ext/regexp_node.rb +17 -9
  111. data/lib/rubocop/ext/regexp_parser.rb +84 -0
  112. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  113. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +47 -0
  114. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  115. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  116. data/lib/rubocop/magic_comment.rb +2 -2
  117. data/lib/rubocop/options.rb +6 -1
  118. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  119. data/lib/rubocop/target_finder.rb +1 -1
  120. data/lib/rubocop/target_ruby.rb +65 -1
  121. data/lib/rubocop/version.rb +56 -6
  122. metadata +22 -6
@@ -9,6 +9,8 @@ module RuboCop
9
9
  # The nodes modified by the corrections should be part of the
10
10
  # AST of the source_buffer.
11
11
  class Corrector < ::Parser::Source::TreeRewriter
12
+ NOOP_CONSUMER = ->(diagnostic) {} # noop
13
+
12
14
  # @param source [Parser::Source::Buffer, or anything
13
15
  # leading to one via `(processed_source.)buffer`]
14
16
  #
@@ -23,7 +25,7 @@ module RuboCop
23
25
  )
24
26
 
25
27
  # Don't print warnings to stderr if corrections conflict with each other
26
- diagnostics.consumer = ->(diagnostic) {}
28
+ diagnostics.consumer = NOOP_CONSUMER
27
29
  end
28
30
 
29
31
  alias rewrite process # Legacy
@@ -89,7 +89,7 @@ module RuboCop
89
89
  begin_line_num = previous_line_num - base_line_num + 1
90
90
  end_line_num = node.first_line - base_line_num + 1
91
91
  lines = source_in_lines[begin_line_num...end_line_num]
92
- "\n#{(lines.join("\n").split(node.source).first || '')}"
92
+ "\n#{lines.join("\n").split(node.source).first || ''}"
93
93
  end
94
94
 
95
95
  def fix_escaped_content(word_node, escape, delimiters)
@@ -31,7 +31,7 @@ module RuboCop
31
31
  cops.each do |cop|
32
32
  next unless cop.respond_to?(method_name)
33
33
 
34
- cop.send(method_name, *args)
34
+ cop.public_send(method_name, *args)
35
35
  end
36
36
  end
37
37
 
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # spec.add_runtime_dependency('parallel', '~> 1.10')
35
35
  # spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0')
36
36
  # end
37
- class DuplicatedAssignment < Cop
37
+ class DuplicatedAssignment < Base
38
38
  include RangeHelp
39
39
 
40
40
  MSG = '`%<assignment>s` method calls already given on line '\
@@ -54,7 +54,7 @@ module RuboCop
54
54
  (lvar #match_block_variable_name?) #assignment_method? ...)
55
55
  PATTERN
56
56
 
57
- def investigate(processed_source)
57
+ def on_new_investigation
58
58
  return if processed_source.blank?
59
59
 
60
60
  duplicated_assignment_method_nodes.each do |nodes|
@@ -96,7 +96,7 @@ module RuboCop
96
96
  assignment: assignment,
97
97
  line_of_first_occurrence: line_of_first_occurrence
98
98
  )
99
- add_offense(node, location: offense_location, message: message)
99
+ add_offense(offense_location, message: message)
100
100
  end
101
101
  end
102
102
  end
@@ -45,7 +45,7 @@ module RuboCop
45
45
  # Gem::Specification.new do |spec|
46
46
  # spec.required_ruby_version = '~> 2.5'
47
47
  # end
48
- class RequiredRubyVersion < Cop
48
+ class RequiredRubyVersion < Base
49
49
  include RangeHelp
50
50
 
51
51
  NOT_EQUAL_MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
@@ -64,7 +64,7 @@ module RuboCop
64
64
  PATTERN
65
65
 
66
66
  # rubocop:disable Metrics/AbcSize
67
- def investigate(processed_source)
67
+ def on_new_investigation
68
68
  version_def = required_ruby_version(processed_source.ast).first
69
69
 
70
70
  if version_def
@@ -72,13 +72,12 @@ module RuboCop
72
72
  return if !ruby_version || ruby_version == target_ruby_version.to_s
73
73
 
74
74
  add_offense(
75
- processed_source.ast,
76
- location: version_def.loc.expression,
75
+ version_def.loc.expression,
77
76
  message: not_equal_message(ruby_version, target_ruby_version)
78
77
  )
79
78
  else
80
79
  range = source_range(processed_source.buffer, 1, 0)
81
- add_offense(nil, location: range, message: MISSING_MSG)
80
+ add_offense(range, message: MISSING_MSG)
82
81
  end
83
82
  end
84
83
  # rubocop:enable Metrics/AbcSize
@@ -25,7 +25,7 @@ module RuboCop
25
25
  # spec.add_runtime_dependency 'gem_a'
26
26
  # end
27
27
  #
28
- class RubyVersionGlobalsUsage < Cop
28
+ class RubyVersionGlobalsUsage < Base
29
29
  MSG = 'Do not use `RUBY_VERSION` in gemspec file.'
30
30
 
31
31
  def_node_matcher :ruby_version?, '(const {cbase nil?} :RUBY_VERSION)'
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # and spec file when given a valid qualified cop name.
9
9
  # @api private
10
10
  class Generator
11
- # Note: RDoc 5.1.0 or lower has the following issue.
11
+ # NOTE: RDoc 5.1.0 or lower has the following issue.
12
12
  # https://github.com/rubocop-hq/rubocop/issues/7043
13
13
  #
14
14
  # The following `String#gsub` can be replaced with
@@ -17,7 +17,6 @@ module RuboCop
17
17
  SOURCE_TEMPLATE = <<-RUBY.gsub(/^ {8}/, '')
18
18
  # frozen_string_literal: true
19
19
 
20
- # TODO: when finished, run `rake generate_cops_documentation` to update the docs
21
20
  module RuboCop
22
21
  module Cop
23
22
  module %<department>s
@@ -134,7 +133,7 @@ module RuboCop
134
133
  end
135
134
 
136
135
  def inject_config(config_file_path: 'config/default.yml',
137
- version_added: bump_minor_version)
136
+ version_added: '<<next>>')
138
137
  injector =
139
138
  ConfigurationInjector.new(configuration_file_path: config_file_path,
140
139
  badge: badge,
@@ -213,12 +212,6 @@ module RuboCop
213
212
  .gsub(/([A-Z])([A-Z][^A-Z\d]+)/, '\1_\2')
214
213
  .downcase
215
214
  end
216
-
217
- def bump_minor_version
218
- versions = RuboCop::Version::STRING.split('.')
219
-
220
- "#{versions[0]}.#{versions[1].succ}"
221
- end
222
215
  end
223
216
  end
224
217
  end
@@ -14,7 +14,7 @@ module RuboCop
14
14
  VersionAdded: '%<version_added>s'
15
15
  YAML
16
16
 
17
- def initialize(configuration_file_path:, badge:, version_added:)
17
+ def initialize(configuration_file_path:, badge:, version_added: '<<next>>')
18
18
  @configuration_file_path = configuration_file_path
19
19
  @badge = badge
20
20
  @version_added = version_added
@@ -210,10 +210,9 @@ module RuboCop
210
210
  end
211
211
 
212
212
  def alt_start_msg(start_loc, source_line_column)
213
- if style != :either
214
- ''
215
- elsif start_loc.line == source_line_column[:line] &&
216
- start_loc.column == source_line_column[:column]
213
+ if style != :either ||
214
+ (start_loc.line == source_line_column[:line] &&
215
+ start_loc.column == source_line_column[:column])
217
216
  ''
218
217
  else
219
218
  " or #{format_source_line_column(source_line_column)}"
@@ -147,6 +147,10 @@ module RuboCop
147
147
  MSG = '`%<category>s` is supposed to appear before ' \
148
148
  '`%<previous>s`.'
149
149
 
150
+ def_node_matcher :dynamic_constant?, <<~PATTERN
151
+ (casgn nil? _ (send ...))
152
+ PATTERN
153
+
150
154
  # Validates code style on class declaration.
151
155
  # Add offense when find a node out of expected order.
152
156
  def on_class(class_node)
@@ -168,11 +172,10 @@ module RuboCop
168
172
 
169
173
  # Autocorrect by swapping between two nodes autocorrecting them
170
174
  def autocorrect(corrector, node)
171
- node_classification = classify(node)
172
175
  previous = node.left_siblings.find do |sibling|
173
- classification = classify(sibling)
174
- !ignore?(classification) && node_classification != classification
176
+ !ignore_for_autocorrect?(node, sibling)
175
177
  end
178
+ return unless previous
176
179
 
177
180
  current_range = source_range_with_comment(node)
178
181
  previous_range = source_range_with_comment(previous)
@@ -241,6 +244,15 @@ module RuboCop
241
244
  expected_order.index(classification).nil?
242
245
  end
243
246
 
247
+ def ignore_for_autocorrect?(node, sibling)
248
+ classification = classify(node)
249
+ sibling_class = classify(sibling)
250
+
251
+ ignore?(sibling_class) ||
252
+ classification == sibling_class ||
253
+ dynamic_constant?(node)
254
+ end
255
+
244
256
  def humanize_node(node)
245
257
  if node.def_type?
246
258
  return :initializer if node.method?(:initialize)
@@ -265,6 +277,9 @@ module RuboCop
265
277
  end
266
278
 
267
279
  def end_position_for(node)
280
+ heredoc = find_heredoc(node)
281
+ return heredoc.location.heredoc_end.end_pos + 1 if heredoc
282
+
268
283
  end_line = buffer.line_for_position(node.loc.expression.end_pos)
269
284
  buffer.line_range(end_line).end_pos
270
285
  end
@@ -284,6 +299,10 @@ module RuboCop
284
299
  buffer.line_range(node.loc.line).begin_pos - 1
285
300
  end
286
301
 
302
+ def find_heredoc(node)
303
+ node.each_node(:str, :dstr, :xstr).find(&:heredoc?)
304
+ end
305
+
287
306
  def buffer
288
307
  processed_source.buffer
289
308
  end
@@ -46,7 +46,7 @@ module RuboCop
46
46
  alias on_defs on_def
47
47
 
48
48
  def on_send(node)
49
- return if !node.def_modifier? || node.method?(:using)
49
+ return unless node.def_modifier?
50
50
 
51
51
  method_def = node.each_descendant(:def, :defs).first
52
52
  expr = node.source_range
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # This cop checks the alignment of else keywords. Normally they should
7
- # be aligned with an if/unless/while/until/begin/def keyword, but there
7
+ # be aligned with an if/unless/while/until/begin/def/rescue keyword, but there
8
8
  # are special cases when they should follow the same rules as the
9
9
  # alignment of end.
10
10
  #
@@ -93,7 +93,13 @@ module RuboCop
93
93
  case parent.type
94
94
  when :def, :defs then base_for_method_definition(parent)
95
95
  when :kwbegin then parent.loc.begin
96
- when :block then parent.send_node.source_range
96
+ when :block
97
+ assignment_node = assignment_node(parent)
98
+ if same_line?(parent, assignment_node)
99
+ assignment_node.source_range
100
+ else
101
+ parent.send_node.source_range
102
+ end
97
103
  else node.loc.keyword
98
104
  end
99
105
  end
@@ -136,6 +142,13 @@ module RuboCop
136
142
  )
137
143
  add_offense(else_range, location: else_range, message: message)
138
144
  end
145
+
146
+ def assignment_node(node)
147
+ assignment_node = node.ancestors.first
148
+ return unless assignment_node&.assignment?
149
+
150
+ assignment_node
151
+ end
139
152
  end
140
153
  end
141
154
  end
@@ -141,6 +141,7 @@ module RuboCop
141
141
  def previous_line_empty?(send_line)
142
142
  previous_line = previous_line_ignoring_comments(processed_source,
143
143
  send_line)
144
+ return true unless previous_line
144
145
 
145
146
  block_start?(send_line) ||
146
147
  class_def?(send_line) ||
@@ -137,10 +137,10 @@ module RuboCop
137
137
  def asgn_variable_align_with(outer_node, inner_node)
138
138
  expr = outer_node.source_range
139
139
 
140
- if !line_break_before_keyword?(expr, inner_node)
141
- range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
142
- else
140
+ if line_break_before_keyword?(expr, inner_node)
143
141
  inner_node.loc.keyword
142
+ else
143
+ range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
144
144
  end
145
145
  end
146
146
 
@@ -56,8 +56,7 @@ module RuboCop
56
56
  aligned = Set[locs.first.line, locs.last.line]
57
57
  locs.each_cons(3) do |before, loc, after|
58
58
  col = loc.column
59
- aligned << loc.line if col == before.column || # rubocop:disable Style/MultipleComparison
60
- col == after.column
59
+ aligned << loc.line if col == before.column || col == after.column
61
60
  end
62
61
  aligned
63
62
  end
@@ -296,13 +296,13 @@ module RuboCop
296
296
  # just give each lambda the same reference and they would all get the
297
297
  # last value of each. A local variable fixes the problem.
298
298
 
299
- if !node.value
300
- delta_value = delta[:key] || 0
301
- correct_no_value(corrector, delta_value, node.source_range)
302
- else
299
+ if node.value
303
300
  correct_key_value(corrector, delta, node.key.source_range,
304
301
  node.value.source_range,
305
302
  node.loc.operator)
303
+ else
304
+ delta_value = delta[:key] || 0
305
+ correct_no_value(corrector, delta_value, node.source_range)
306
306
  end
307
307
  end
308
308
 
@@ -88,6 +88,10 @@ module RuboCop
88
88
  end
89
89
  end
90
90
 
91
+ def correctable?
92
+ super && !breakable_range.nil?
93
+ end
94
+
91
95
  def autocorrect(range)
92
96
  return if range.nil?
93
97
 
@@ -98,6 +102,8 @@ module RuboCop
98
102
 
99
103
  private
100
104
 
105
+ attr_accessor :breakable_range
106
+
101
107
  def check_for_breakable_node(node)
102
108
  breakable_node = extract_breakable_node(node, max)
103
109
  return if breakable_node.nil?
@@ -195,7 +201,8 @@ module RuboCop
195
201
  def register_offense(loc, line, line_index)
196
202
  message = format(MSG, length: line_length(line), max: max)
197
203
 
198
- breakable_range = breakable_range_by_line_index[line_index]
204
+ self.breakable_range = breakable_range_by_line_index[line_index]
205
+
199
206
  add_offense(breakable_range, location: loc, message: message) do
200
207
  self.max = line_length(line)
201
208
  end
@@ -54,17 +54,11 @@ module RuboCop
54
54
  end
55
55
 
56
56
  def check_inside_pipes(arguments)
57
- opening_pipe, closing_pipe = pipes(arguments)
58
-
59
57
  case style
60
58
  when :no_space
61
- check_no_space_style_inside_pipes(arguments.children,
62
- opening_pipe,
63
- closing_pipe)
59
+ check_no_space_style_inside_pipes(arguments)
64
60
  when :space
65
- check_space_style_inside_pipes(arguments.children,
66
- opening_pipe,
67
- closing_pipe)
61
+ check_space_style_inside_pipes(arguments)
68
62
  end
69
63
  end
70
64
 
@@ -76,22 +70,29 @@ module RuboCop
76
70
  closing_pipe, 'after closing `|`')
77
71
  end
78
72
 
79
- def check_no_space_style_inside_pipes(args, opening_pipe, closing_pipe)
73
+ def check_no_space_style_inside_pipes(arguments)
74
+ args = arguments.children
75
+ opening_pipe, closing_pipe = pipes(arguments)
76
+
80
77
  first = args.first.source_range
81
78
  last = args.last.source_range
82
79
 
83
80
  check_no_space(opening_pipe.end_pos, first.begin_pos,
84
81
  'Space before first')
85
- check_no_space(last_end_pos_inside_pipes(last),
82
+ check_no_space(last_end_pos_inside_pipes(arguments, last),
86
83
  closing_pipe.begin_pos, 'Space after last')
87
84
  end
88
85
 
89
- def check_space_style_inside_pipes(args, opening_pipe, closing_pipe)
90
- check_opening_pipe_space(args, opening_pipe)
91
- check_closing_pipe_space(args, closing_pipe)
86
+ def check_space_style_inside_pipes(arguments)
87
+ opening_pipe, closing_pipe = pipes(arguments)
88
+
89
+ check_opening_pipe_space(arguments, opening_pipe)
90
+ check_closing_pipe_space(arguments, closing_pipe)
92
91
  end
93
92
 
94
- def check_opening_pipe_space(args, opening_pipe)
93
+ def check_opening_pipe_space(arguments, opening_pipe)
94
+ args = arguments.children
95
+
95
96
  first_arg = args.first
96
97
  range = first_arg.source_range
97
98
 
@@ -101,9 +102,11 @@ module RuboCop
101
102
  'Extra space before first')
102
103
  end
103
104
 
104
- def check_closing_pipe_space(args, closing_pipe)
105
+ def check_closing_pipe_space(arguments, closing_pipe)
106
+ args = arguments.children
107
+
105
108
  last = args.last.source_range
106
- last_end_pos = last_end_pos_inside_pipes(last)
109
+ last_end_pos = last_end_pos_inside_pipes(arguments, last)
107
110
 
108
111
  check_space(last_end_pos, closing_pipe.begin_pos, last,
109
112
  'after last block parameter')
@@ -111,9 +114,12 @@ module RuboCop
111
114
  'Extra space after last')
112
115
  end
113
116
 
114
- def last_end_pos_inside_pipes(range)
117
+ def last_end_pos_inside_pipes(arguments, range)
115
118
  pos = range.end_pos
116
- range.source_buffer.source[pos] == ',' ? pos + 1 : pos
119
+ num = pos - arguments.source_range.begin_pos
120
+ trailing_comma_index = arguments.source[num..-1].index(',')
121
+
122
+ trailing_comma_index ? pos + trailing_comma_index + 1 : pos
117
123
  end
118
124
 
119
125
  def check_each_arg(args)
@@ -5,6 +5,8 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks that operators have space around them, except for ** which
7
7
  # should or shouldn't have surrounding space depending on configuration.
8
+ # It allows vertical alignment consisting of one or more whitespace
9
+ # around operators.
8
10
  #
9
11
  # This cop has `AllowForAlignment` option. When `true`, allows most
10
12
  # uses of extra spacing if the intent is to align with an operator on
@@ -207,7 +209,8 @@ module RuboCop
207
209
  token = Token.new(operator, nil, operator.source)
208
210
  align_preceding = aligned_with_preceding_assignment(token)
209
211
 
210
- return align_preceding == :no unless align_preceding == :none
212
+ return false if align_preceding == :yes ||
213
+ aligned_with_subsequent_assignment(token) == :none
211
214
 
212
215
  aligned_with_subsequent_assignment(token) != :yes
213
216
  end