rubocop 0.52.0 → 0.52.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 (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