rubocop 0.52.0 → 0.52.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -5
  3. data/config/default.yml +1 -11
  4. data/config/disabled.yml +5 -0
  5. data/config/enabled.yml +6 -8
  6. data/lib/rubocop.rb +13 -2
  7. data/lib/rubocop/ast/node.rb +23 -15
  8. data/lib/rubocop/cli.rb +25 -2
  9. data/lib/rubocop/config.rb +23 -8
  10. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  11. data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -0
  12. data/lib/rubocop/cop/commissioner.rb +1 -1
  13. data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
  14. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  15. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  16. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
  17. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  18. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  19. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  20. data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
  21. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  22. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
  23. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  24. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -0
  25. data/lib/rubocop/cop/generator.rb +18 -87
  26. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  27. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +5 -1
  28. data/lib/rubocop/cop/layout/align_array.rb +5 -1
  29. data/lib/rubocop/cop/layout/align_hash.rb +1 -1
  30. data/lib/rubocop/cop/layout/align_parameters.rb +5 -1
  31. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  32. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  33. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -1
  34. data/lib/rubocop/cop/layout/comment_indentation.rb +5 -1
  35. data/lib/rubocop/cop/layout/else_alignment.rb +5 -1
  36. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
  37. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +17 -19
  38. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +4 -0
  39. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -0
  40. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +4 -0
  41. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -0
  42. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +4 -0
  43. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +4 -0
  44. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +4 -0
  45. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +4 -0
  46. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -0
  47. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
  48. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -2
  49. data/lib/rubocop/cop/layout/indent_array.rb +6 -2
  50. data/lib/rubocop/cop/layout/indent_assignment.rb +6 -2
  51. data/lib/rubocop/cop/layout/indent_hash.rb +5 -1
  52. data/lib/rubocop/cop/layout/indentation_consistency.rb +5 -1
  53. data/lib/rubocop/cop/layout/indentation_width.rb +5 -1
  54. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +4 -0
  55. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +3 -3
  56. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -2
  57. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +4 -0
  58. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +4 -0
  59. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +6 -2
  60. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  61. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -2
  62. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
  63. data/lib/rubocop/cop/layout/space_after_comma.rb +4 -0
  64. data/lib/rubocop/cop/layout/space_after_semicolon.rb +4 -0
  65. data/lib/rubocop/cop/layout/space_before_comma.rb +4 -0
  66. data/lib/rubocop/cop/layout/space_before_semicolon.rb +4 -0
  67. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  68. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -7
  69. data/lib/rubocop/cop/layout/tab.rb +1 -1
  70. data/lib/rubocop/cop/lint/block_alignment.rb +1 -1
  71. data/lib/rubocop/cop/lint/def_end_alignment.rb +2 -2
  72. data/lib/rubocop/cop/lint/end_alignment.rb +3 -1
  73. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  74. data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -0
  75. data/lib/rubocop/cop/lint/unused_method_argument.rb +6 -0
  76. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -1
  77. data/lib/rubocop/cop/mixin/alignment.rb +70 -0
  78. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +2 -0
  79. data/lib/rubocop/cop/mixin/array_syntax.rb +2 -0
  80. data/lib/rubocop/cop/mixin/code_length.rb +2 -0
  81. data/lib/rubocop/cop/mixin/configurable_max.rb +2 -0
  82. data/lib/rubocop/cop/mixin/def_node.rb +3 -1
  83. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  84. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -15
  85. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -25
  86. data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -6
  87. data/lib/rubocop/cop/mixin/first_element_line_break.rb +5 -9
  88. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +2 -2
  89. data/lib/rubocop/cop/mixin/ignored_pattern.rb +2 -0
  90. data/lib/rubocop/cop/mixin/integer_node.rb +2 -0
  91. data/lib/rubocop/cop/mixin/match_range.rb +2 -0
  92. data/lib/rubocop/cop/mixin/min_body_length.rb +2 -0
  93. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
  94. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +9 -48
  95. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -16
  96. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +12 -31
  97. data/lib/rubocop/cop/mixin/parentheses.rb +2 -19
  98. data/lib/rubocop/cop/mixin/percent_literal.rb +3 -3
  99. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +2 -0
  100. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -0
  101. data/lib/rubocop/cop/mixin/safe_assignment.rb +2 -0
  102. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -3
  103. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -3
  104. data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -2
  105. data/lib/rubocop/cop/mixin/string_help.rb +2 -0
  106. data/lib/rubocop/cop/mixin/string_literals_help.rb +2 -13
  107. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -21
  108. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -10
  109. data/lib/rubocop/cop/mixin/unused_argument.rb +2 -15
  110. data/lib/rubocop/cop/performance/case_when_splat.rb +1 -1
  111. data/lib/rubocop/cop/rails/action_filter.rb +3 -2
  112. data/lib/rubocop/cop/rails/active_support_aliases.rb +3 -2
  113. data/lib/rubocop/cop/rails/application_job.rb +6 -0
  114. data/lib/rubocop/cop/rails/application_record.rb +6 -0
  115. data/lib/rubocop/cop/rails/blank.rb +10 -9
  116. data/lib/rubocop/cop/rails/date.rb +22 -14
  117. data/lib/rubocop/cop/rails/delegate.rb +1 -1
  118. data/lib/rubocop/cop/rails/dynamic_find_by.rb +3 -2
  119. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -2
  120. data/lib/rubocop/cop/rails/environment_comparison.rb +2 -2
  121. data/lib/rubocop/cop/rails/file_path.rb +1 -1
  122. data/lib/rubocop/cop/rails/find_by.rb +2 -2
  123. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +15 -7
  124. data/lib/rubocop/cop/rails/http_positional_arguments.rb +2 -2
  125. data/lib/rubocop/cop/rails/inverse_of.rb +130 -8
  126. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +3 -3
  127. data/lib/rubocop/cop/rails/pluralization_grammar.rb +3 -2
  128. data/lib/rubocop/cop/rails/presence.rb +31 -18
  129. data/lib/rubocop/cop/rails/present.rb +11 -8
  130. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +52 -10
  131. data/lib/rubocop/cop/rails/request_referer.rb +2 -3
  132. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +9 -2
  133. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +38 -10
  134. data/lib/rubocop/cop/style/class_and_module_children.rb +76 -0
  135. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  136. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  137. data/lib/rubocop/cop/style/format_string_token.rb +24 -4
  138. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +46 -0
  139. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  140. data/lib/rubocop/cop/style/if_unless_modifier.rb +14 -0
  141. data/lib/rubocop/cop/style/method_def_parentheses.rb +79 -0
  142. data/lib/rubocop/cop/style/mixin_usage.rb +13 -2
  143. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  144. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +19 -0
  145. data/lib/rubocop/cop/style/negated_if.rb +1 -1
  146. data/lib/rubocop/cop/style/negated_while.rb +6 -4
  147. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
  148. data/lib/rubocop/cop/style/parentheses_around_condition.rb +4 -0
  149. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  150. data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -0
  151. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  152. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  153. data/lib/rubocop/cop/style/string_literals.rb +4 -0
  154. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -0
  155. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
  156. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
  157. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +4 -0
  158. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  159. data/lib/rubocop/formatter/disabled_config_formatter.rb +33 -24
  160. data/lib/rubocop/options.rb +33 -10
  161. data/lib/rubocop/path_util.rb +7 -0
  162. data/lib/rubocop/token.rb +4 -0
  163. data/lib/rubocop/version.rb +1 -1
  164. metadata +14 -4
  165. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -149
  166. data/lib/rubocop/cop/style/extend_self.rb +0 -92
@@ -51,6 +51,10 @@ module RuboCop
51
51
  node.source_range.end_pos)
52
52
  end
53
53
 
54
+ def autocorrect(range)
55
+ PunctuationCorrector.swap_comma(range)
56
+ end
57
+
54
58
  private
55
59
 
56
60
  def avoid_autocorrect?(args)
@@ -53,6 +53,10 @@ module RuboCop
53
53
  check_literal(node, 'item of %<article>s hash')
54
54
  end
55
55
 
56
+ def autocorrect(range)
57
+ PunctuationCorrector.swap_comma(range)
58
+ end
59
+
56
60
  private
57
61
 
58
62
  def check_literal(node, kind)
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # end
35
35
  #
36
36
  class TrailingMethodEndStatement < Cop
37
- include AutocorrectAlignment
37
+ include Alignment
38
38
 
39
39
  MSG = 'Place the end statement of a multi-line method on ' \
40
40
  'its own line.'.freeze
@@ -79,14 +79,21 @@ module RuboCop
79
79
  output.puts
80
80
  cfg = self.class.config_to_allow_offenses[cop_name] || {}
81
81
 
82
- output_cop_comments(output, cfg, cop_name, offense_count)
83
- output_cop_config(output, cfg, cop_name)
84
- end
85
-
86
- def output_cop_comments(output, cfg, cop_name, offense_count)
87
- output.puts "# Offense count: #{offense_count}" if @show_offense_counts
82
+ # To avoid malformed YAML when potentially reading the config in
83
+ # #excludes, we use an output buffer and append it to the actual output
84
+ # only when it results in valid YAML.
85
+ output_buffer = StringIO.new
86
+ output_cop_comments(output_buffer, cfg, cop_name, offense_count)
87
+ output_cop_config(output_buffer, cfg, cop_name)
88
+ output.puts(output_buffer.string)
89
+ end
90
+
91
+ def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
92
+ if @show_offense_counts
93
+ output_buffer.puts "# Offense count: #{offense_count}"
94
+ end
88
95
  if COPS[cop_name] && COPS[cop_name].first.new.support_autocorrect?
89
- output.puts '# Cop supports --auto-correct.'
96
+ output_buffer.puts '# Cop supports --auto-correct.'
90
97
  end
91
98
 
92
99
  default_cfg = default_config(cop_name)
@@ -95,7 +102,7 @@ module RuboCop
95
102
  params = cop_config_params(default_cfg, cfg)
96
103
  return if params.empty?
97
104
 
98
- output_cop_param_comments(params, default_cfg)
105
+ output_cop_param_comments(output_buffer, params, default_cfg)
99
106
  end
100
107
 
101
108
  def cop_config_params(default_cfg, cfg)
@@ -104,15 +111,17 @@ module RuboCop
104
111
  cfg.keys
105
112
  end
106
113
 
107
- def output_cop_param_comments(params, default_cfg)
114
+ def output_cop_param_comments(output_buffer, params, default_cfg)
108
115
  config_params = params.reject { |p| p.start_with?('Supported') }
109
- output.puts "# Configuration parameters: #{config_params.join(', ')}."
116
+ output_buffer.puts(
117
+ "# Configuration parameters: #{config_params.join(', ')}."
118
+ )
110
119
 
111
120
  params.each do |param|
112
121
  value = default_cfg[param]
113
122
  if value.is_a?(Array)
114
123
  next if value.empty?
115
- output.puts "# #{param}: #{value.join(', ')}"
124
+ output_buffer.puts "# #{param}: #{value.join(', ')}"
116
125
  end
117
126
  end
118
127
  end
@@ -121,38 +130,38 @@ module RuboCop
121
130
  RuboCop::ConfigLoader.default_configuration[cop_name]
122
131
  end
123
132
 
124
- def output_cop_config(output, cfg, cop_name)
133
+ def output_cop_config(output_buffer, cfg, cop_name)
125
134
  # 'Enabled' option will be put into file only if exclude
126
135
  # limit is exceeded.
127
136
  cfg_without_enabled = cfg.reject { |key| key == 'Enabled' }
128
137
 
129
- output.puts "#{cop_name}:"
138
+ output_buffer.puts "#{cop_name}:"
130
139
  cfg_without_enabled.each do |key, value|
131
140
  value = value[0] if value.is_a?(Array)
132
- output.puts " #{key}: #{value}"
141
+ output_buffer.puts " #{key}: #{value}"
133
142
  end
134
143
 
135
- output_offending_files(output, cfg_without_enabled, cop_name)
144
+ output_offending_files(output_buffer, cfg_without_enabled, cop_name)
136
145
  end
137
146
 
138
- def output_offending_files(output, cfg, cop_name)
147
+ def output_offending_files(output_buffer, cfg, cop_name)
139
148
  return unless cfg.empty?
140
149
 
141
150
  offending_files = @files_with_offenses[cop_name].uniq.sort
142
151
  if offending_files.count > @exclude_limit
143
- output.puts ' Enabled: false'
152
+ output_buffer.puts ' Enabled: false'
144
153
  else
145
- output_exclude_list(output, offending_files, cop_name)
154
+ output_exclude_list(output_buffer, offending_files, cop_name)
146
155
  end
147
156
  end
148
157
 
149
- def output_exclude_list(output, offending_files, cop_name)
158
+ def output_exclude_list(output_buffer, offending_files, cop_name)
150
159
  require 'pathname'
151
160
  parent = Pathname.new(Dir.pwd)
152
161
 
153
- output.puts ' Exclude:'
162
+ output_buffer.puts ' Exclude:'
154
163
  excludes(offending_files, cop_name, parent).each do |file|
155
- output_exclude_path(output, file, parent)
164
+ output_exclude_path(output_buffer, file, parent)
156
165
  end
157
166
  end
158
167
 
@@ -168,12 +177,12 @@ module RuboCop
168
177
  ((cfg['Exclude'] || []) + offending_files).uniq
169
178
  end
170
179
 
171
- def output_exclude_path(output, file, parent)
180
+ def output_exclude_path(output_buffer, file, parent)
172
181
  file_path = Pathname.new(file)
173
182
  relative = file_path.relative_path_from(parent)
174
- output.puts " - '#{relative}'"
183
+ output_buffer.puts " - '#{relative}'"
175
184
  rescue ArgumentError
176
- output.puts " - '#{file}'"
185
+ output_buffer.puts " - '#{file}'"
177
186
  end
178
187
  end
179
188
  end
@@ -4,6 +4,8 @@ require 'optparse'
4
4
  require 'shellwords'
5
5
 
6
6
  module RuboCop
7
+ class IncorrectCopNameError < StandardError; end
8
+
7
9
  # This class handles command line options.
8
10
  class Options
9
11
  EXITING_OPTIONS = %i[version verbose_version show_cops].freeze
@@ -183,19 +185,40 @@ module RuboCop
183
185
 
184
186
  # Validates option arguments and the options' compatibility with each other.
185
187
  class OptionsValidator
186
- # Cop name validation must be done later than option parsing, so it's not
187
- # called from within Options.
188
- def self.validate_cop_list(names)
189
- return unless names
188
+ class << self
189
+ # Cop name validation must be done later than option parsing, so it's not
190
+ # called from within Options.
191
+ def validate_cop_list(names)
192
+ return unless names
193
+
194
+ cop_names = Cop::Cop.registry.names
195
+ departments = Cop::Cop.registry.departments.map(&:to_s)
196
+
197
+ names.each do |name|
198
+ next if cop_names.include?(name)
199
+ next if departments.include?(name)
200
+ next if %w[Syntax Lint/Syntax].include?(name)
201
+
202
+ raise IncorrectCopNameError, format_message_from(name, cop_names)
203
+ end
204
+ end
190
205
 
191
- departments = Cop::Cop.registry.departments.map(&:to_s)
206
+ private
192
207
 
193
- names.each do |name|
194
- next if Cop::Cop.registry.names.include?(name)
195
- next if departments.include?(name)
196
- next if %w[Syntax Lint/Syntax].include?(name)
208
+ def format_message_from(name, cop_names)
209
+ message = 'Unrecognized cop or department: %{name}.'
210
+ message_with_candidate = "#{message}\nDid you mean? %{candidate}"
211
+ corrections = cop_names.select do |cn|
212
+ score = StringUtil.similarity(cn, name)
213
+ score >= NameSimilarity::MINIMUM_SIMILARITY_TO_SUGGEST
214
+ end.sort
197
215
 
198
- raise ArgumentError, "Unrecognized cop or department: #{name}."
216
+ if corrections.empty?
217
+ format message, name: name
218
+ else
219
+ format message_with_candidate, name: name,
220
+ candidate: corrections.join(', ')
221
+ end
199
222
  end
200
223
  end
201
224
 
@@ -43,6 +43,13 @@ module RuboCop
43
43
  end
44
44
  end
45
45
 
46
+ def find_file_upwards(filename, start_dir = PathUtil.pwd)
47
+ Pathname(File.expand_path(start_dir)).ascend do |dir|
48
+ file = File.join(dir, filename)
49
+ return file if File.exist?(file)
50
+ end
51
+ end
52
+
46
53
  # Returns true for an absolute Unix or Windows path.
47
54
  def absolute?(path)
48
55
  path =~ %r{\A([A-Z]:)?/}
@@ -50,6 +50,10 @@ module RuboCop
50
50
  type == :tLBRACK2
51
51
  end
52
52
 
53
+ def left_bracket?
54
+ %i[tLBRACK tLBRACK2].include?(type)
55
+ end
56
+
53
57
  def right_bracket?
54
58
  type == :tRBRACK
55
59
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.52.0'.freeze
6
+ STRING = '0.52.1'.freeze
7
7
 
8
8
  MSG = '%s (using Parser %s, running on %s %s %s)'.freeze
9
9
 
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: 0.52.0
4
+ version: 0.52.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-12-12 00:00:00.000000000 Z
13
+ date: 2017-12-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parallel
@@ -200,11 +200,22 @@ files:
200
200
  - lib/rubocop/cop/commissioner.rb
201
201
  - lib/rubocop/cop/cop.rb
202
202
  - lib/rubocop/cop/corrector.rb
203
+ - lib/rubocop/cop/correctors/alignment_corrector.rb
204
+ - lib/rubocop/cop/correctors/condition_corrector.rb
205
+ - lib/rubocop/cop/correctors/empty_line_corrector.rb
206
+ - lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb
207
+ - lib/rubocop/cop/correctors/ordered_gem_corrector.rb
208
+ - lib/rubocop/cop/correctors/parentheses_corrector.rb
209
+ - lib/rubocop/cop/correctors/punctuation_corrector.rb
210
+ - lib/rubocop/cop/correctors/space_corrector.rb
211
+ - lib/rubocop/cop/correctors/string_literal_corrector.rb
212
+ - lib/rubocop/cop/correctors/unused_arg_corrector.rb
203
213
  - lib/rubocop/cop/force.rb
204
214
  - lib/rubocop/cop/gemspec/duplicated_assignment.rb
205
215
  - lib/rubocop/cop/gemspec/ordered_dependencies.rb
206
216
  - lib/rubocop/cop/gemspec/required_ruby_version.rb
207
217
  - lib/rubocop/cop/generator.rb
218
+ - lib/rubocop/cop/generator/require_file_injector.rb
208
219
  - lib/rubocop/cop/ignored_node.rb
209
220
  - lib/rubocop/cop/internal_affairs.rb
210
221
  - lib/rubocop/cop/internal_affairs/node_destructuring.rb
@@ -370,11 +381,11 @@ files:
370
381
  - lib/rubocop/cop/metrics/module_length.rb
371
382
  - lib/rubocop/cop/metrics/parameter_lists.rb
372
383
  - lib/rubocop/cop/metrics/perceived_complexity.rb
384
+ - lib/rubocop/cop/mixin/alignment.rb
373
385
  - lib/rubocop/cop/mixin/annotation_comment.rb
374
386
  - lib/rubocop/cop/mixin/array_hash_indentation.rb
375
387
  - lib/rubocop/cop/mixin/array_min_size.rb
376
388
  - lib/rubocop/cop/mixin/array_syntax.rb
377
- - lib/rubocop/cop/mixin/autocorrect_alignment.rb
378
389
  - lib/rubocop/cop/mixin/check_assignment.rb
379
390
  - lib/rubocop/cop/mixin/classish_length.rb
380
391
  - lib/rubocop/cop/mixin/code_length.rb
@@ -552,7 +563,6 @@ files:
552
563
  - lib/rubocop/cop/style/end_block.rb
553
564
  - lib/rubocop/cop/style/eval_with_location.rb
554
565
  - lib/rubocop/cop/style/even_odd.rb
555
- - lib/rubocop/cop/style/extend_self.rb
556
566
  - lib/rubocop/cop/style/flip_flop.rb
557
567
  - lib/rubocop/cop/style/for.rb
558
568
  - lib/rubocop/cop/style/format_string.rb
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- # This module does auto-correction of nodes that should just be moved to
6
- # the left or to the right, amount being determined by the instance
7
- # variable @column_delta.
8
- module AutocorrectAlignment
9
- SPACE = ' '.freeze
10
-
11
- def configured_indentation_width
12
- cop_config['IndentationWidth'] ||
13
- config.for_cop('IndentationWidth')['Width']
14
- end
15
-
16
- def indentation(node)
17
- offset(node) + (SPACE * configured_indentation_width)
18
- end
19
-
20
- def offset(node)
21
- SPACE * node.loc.column
22
- end
23
-
24
- def display_column(range)
25
- line = processed_source.lines[range.line - 1]
26
- Unicode::DisplayWidth.of(line[0, range.column])
27
- end
28
-
29
- def check_alignment(items, base_column = nil)
30
- unless items.empty?
31
- base_column ||= display_column(items.first.source_range)
32
- end
33
-
34
- each_bad_alignment(items, base_column) do |current|
35
- expr = current.source_range
36
- if offenses.any? { |o| within?(expr, o.location) }
37
- # If this offense is within a line range that is already being
38
- # realigned by autocorrect, we report the offense without
39
- # autocorrecting it. Two rewrites in the same area by the same
40
- # cop can not be handled. The next iteration will find the
41
- # offense again and correct it.
42
- add_offense(nil, location: expr)
43
- else
44
- add_offense(current)
45
- end
46
- end
47
- end
48
-
49
- def autocorrect(arg)
50
- return unless arg
51
-
52
- heredoc_ranges = heredoc_ranges(arg)
53
- expr = arg.respond_to?(:loc) ? arg.loc.expression : arg
54
-
55
- # We can't use the instance variable inside the lambda. That would just
56
- # give each lambda the same reference and they would all get the last
57
- # value of @column_delta. A local variable fixes the problem.
58
- column_delta = @column_delta
59
-
60
- return if block_comment_within?(expr)
61
-
62
- lambda do |corrector|
63
- each_line(expr) do |line_begin_pos|
64
- autocorrect_line(corrector, line_begin_pos, expr, column_delta,
65
- heredoc_ranges)
66
- end
67
- end
68
- end
69
-
70
- private
71
-
72
- def each_bad_alignment(items, base_column)
73
- prev_line = -1
74
- items.each do |current|
75
- if current.loc.line > prev_line &&
76
- begins_its_line?(current.source_range)
77
- @column_delta = base_column - display_column(current.source_range)
78
-
79
- yield current if @column_delta.nonzero?
80
- end
81
- prev_line = current.loc.line
82
- end
83
- end
84
-
85
- def autocorrect_line(corrector, line_begin_pos, expr, column_delta,
86
- heredoc_ranges)
87
- range = calculate_range(expr, line_begin_pos, column_delta)
88
- # We must not change indentation of heredoc strings.
89
- return if heredoc_ranges.any? { |h| within?(range, h) }
90
-
91
- if column_delta > 0
92
- unless range.source == "\n"
93
- corrector.insert_before(range, ' ' * column_delta)
94
- end
95
- elsif range.source =~ /\A[ \t]+\z/
96
- remove(range, corrector)
97
- end
98
- end
99
-
100
- def heredoc_ranges(arg)
101
- return [] unless arg.is_a?(Parser::AST::Node)
102
-
103
- arg.each_node(:dstr)
104
- .select { |n| n.loc.respond_to?(:heredoc_body) }
105
- .map { |n| n.loc.heredoc_body.join(n.loc.heredoc_end) }
106
- end
107
-
108
- def block_comment_within?(expr)
109
- processed_source.comments.select(&:document?).any? do |c|
110
- within?(c.loc.expression, expr)
111
- end
112
- end
113
-
114
- def within?(inner, outer)
115
- inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
116
- end
117
-
118
- def calculate_range(expr, line_begin_pos, column_delta)
119
- starts_with_space = expr.source_buffer.source[line_begin_pos] =~ / /
120
- pos_to_remove = if column_delta > 0 || starts_with_space
121
- line_begin_pos
122
- else
123
- line_begin_pos - column_delta.abs
124
- end
125
-
126
- range_between(pos_to_remove, pos_to_remove + column_delta.abs)
127
- end
128
-
129
- def remove(range, corrector)
130
- original_stderr = $stderr
131
- $stderr = StringIO.new # Avoid error messages on console
132
- corrector.remove(range)
133
- rescue RuntimeError
134
- range = range_between(range.begin_pos + 1, range.end_pos + 1)
135
- retry if range.source =~ /^ +$/
136
- ensure
137
- $stderr = original_stderr
138
- end
139
-
140
- def each_line(expr)
141
- line_begin_pos = expr.begin_pos
142
- expr.source.each_line do |line|
143
- yield line_begin_pos
144
- line_begin_pos += line.length
145
- end
146
- end
147
- end
148
- end
149
- end