rubocop 0.70.0 → 0.75.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -10
  3. data/bin/console +1 -0
  4. data/config/default.yml +91 -494
  5. data/lib/rubocop.rb +16 -54
  6. data/lib/rubocop/ast/builder.rb +2 -0
  7. data/lib/rubocop/ast/node.rb +9 -15
  8. data/lib/rubocop/ast/node/float_node.rb +12 -0
  9. data/lib/rubocop/ast/node/int_node.rb +12 -0
  10. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
  11. data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -0
  12. data/lib/rubocop/ast/node/resbody_node.rb +1 -6
  13. data/lib/rubocop/ast/traversal.rb +3 -3
  14. data/lib/rubocop/cached_data.rb +1 -1
  15. data/lib/rubocop/comment_config.rb +3 -2
  16. data/lib/rubocop/config.rb +21 -508
  17. data/lib/rubocop/config_loader.rb +22 -4
  18. data/lib/rubocop/config_loader_resolver.rb +2 -8
  19. data/lib/rubocop/config_obsoletion.rb +213 -0
  20. data/lib/rubocop/config_validator.rb +239 -0
  21. data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  24. data/lib/rubocop/cop/commissioner.rb +3 -9
  25. data/lib/rubocop/cop/cop.rb +39 -12
  26. data/lib/rubocop/cop/corrector.rb +2 -3
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  30. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  34. data/lib/rubocop/cop/generator.rb +4 -4
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  36. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  44. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  45. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +3 -1
  47. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
  48. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -0
  49. data/lib/rubocop/cop/layout/indent_assignment.rb +9 -1
  50. data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
  51. data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
  52. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
  53. data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
  54. data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
  55. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  56. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  57. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +2 -0
  58. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
  59. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  60. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  61. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
  62. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  63. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  64. data/lib/rubocop/cop/layout/tab.rb +10 -22
  65. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  66. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  67. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  68. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  69. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  70. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  71. data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  73. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  74. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  75. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  76. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  77. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  78. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  79. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  80. data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
  81. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  82. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  83. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  84. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
  85. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  86. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  87. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  88. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  89. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
  90. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
  91. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
  92. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  93. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  94. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  95. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  96. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  97. data/lib/rubocop/cop/message_annotator.rb +16 -7
  98. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  99. data/lib/rubocop/cop/metrics/line_length.rb +6 -0
  100. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  101. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  102. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  103. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  104. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  105. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  106. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  107. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  108. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  109. data/lib/rubocop/cop/mixin/hash_alignment.rb +4 -0
  110. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  111. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  112. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  113. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  114. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  115. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  116. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  117. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  118. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  119. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  120. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +20 -22
  121. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  122. data/lib/rubocop/cop/offense.rb +18 -7
  123. data/lib/rubocop/cop/registry.rb +22 -1
  124. data/lib/rubocop/cop/security/eval.rb +1 -1
  125. data/lib/rubocop/cop/security/json_load.rb +1 -1
  126. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  127. data/lib/rubocop/cop/security/open.rb +1 -1
  128. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  129. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  130. data/lib/rubocop/cop/style/alias.rb +1 -1
  131. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  132. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
  133. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  134. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  135. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  136. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
  137. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  138. data/lib/rubocop/cop/style/date_time.rb +3 -3
  139. data/lib/rubocop/cop/style/dir.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  141. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  142. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  143. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  144. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  145. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  146. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  147. data/lib/rubocop/cop/style/float_division.rb +94 -0
  148. data/lib/rubocop/cop/style/format_string.rb +13 -9
  149. data/lib/rubocop/cop/style/format_string_token.rb +10 -40
  150. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
  151. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  152. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  153. data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
  154. data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
  155. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  157. data/lib/rubocop/cop/style/lambda.rb +0 -2
  158. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -6
  159. data/lib/rubocop/cop/style/min_max.rb +1 -1
  160. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  161. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  163. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  164. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  165. data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
  166. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  168. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  170. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  171. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  172. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  173. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  175. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  176. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  177. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  178. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  179. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  180. data/lib/rubocop/cop/style/safe_navigation.rb +11 -2
  181. data/lib/rubocop/cop/style/sample.rb +1 -1
  182. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  183. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  184. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  185. data/lib/rubocop/cop/style/strip.rb +1 -1
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  187. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
  190. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  191. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  192. data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
  193. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  194. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  195. data/lib/rubocop/cop/style/word_array.rb +2 -2
  196. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
  197. data/lib/rubocop/cop/team.rb +15 -14
  198. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  199. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  200. data/lib/rubocop/core_ext/string.rb +0 -24
  201. data/lib/rubocop/error.rb +23 -0
  202. data/lib/rubocop/formatter/emacs_style_formatter.rb +8 -5
  203. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  204. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  205. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -1
  206. data/lib/rubocop/formatter/tap_formatter.rb +9 -1
  207. data/lib/rubocop/magic_comment.rb +4 -0
  208. data/lib/rubocop/node_pattern.rb +86 -7
  209. data/lib/rubocop/options.rb +18 -2
  210. data/lib/rubocop/path_util.rb +1 -1
  211. data/lib/rubocop/processed_source.rb +9 -1
  212. data/lib/rubocop/rspec/cop_helper.rb +0 -1
  213. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  214. data/lib/rubocop/rspec/shared_contexts.rb +12 -17
  215. data/lib/rubocop/rspec/support.rb +0 -1
  216. data/lib/rubocop/runner.rb +20 -15
  217. data/lib/rubocop/target_finder.rb +6 -4
  218. data/lib/rubocop/version.rb +1 -1
  219. data/lib/rubocop/yaml_duplication_checker.rb +8 -2
  220. metadata +16 -70
  221. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  222. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  223. data/lib/rubocop/cop/rails/action_filter.rb +0 -117
  224. data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
  225. data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
  226. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
  227. data/lib/rubocop/cop/rails/application_job.rb +0 -40
  228. data/lib/rubocop/cop/rails/application_record.rb +0 -40
  229. data/lib/rubocop/cop/rails/assert_not.rb +0 -44
  230. data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
  231. data/lib/rubocop/cop/rails/blank.rb +0 -164
  232. data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
  233. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
  234. data/lib/rubocop/cop/rails/date.rb +0 -161
  235. data/lib/rubocop/cop/rails/delegate.rb +0 -132
  236. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
  237. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
  238. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
  239. data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
  240. data/lib/rubocop/cop/rails/exit.rb +0 -67
  241. data/lib/rubocop/cop/rails/file_path.rb +0 -108
  242. data/lib/rubocop/cop/rails/find_by.rb +0 -55
  243. data/lib/rubocop/cop/rails/find_each.rb +0 -51
  244. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
  245. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
  246. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
  247. data/lib/rubocop/cop/rails/http_status.rb +0 -179
  248. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
  249. data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
  250. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
  251. data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
  252. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  253. data/lib/rubocop/cop/rails/output.rb +0 -49
  254. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  255. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
  256. data/lib/rubocop/cop/rails/presence.rb +0 -124
  257. data/lib/rubocop/cop/rails/present.rb +0 -153
  258. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
  259. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
  260. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
  261. data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
  262. data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
  263. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
  264. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  265. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
  266. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
  267. data/lib/rubocop/cop/rails/save_bang.rb +0 -316
  268. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  269. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
  270. data/lib/rubocop/cop/rails/time_zone.rb +0 -238
  271. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
  272. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  273. data/lib/rubocop/cop/rails/validation.rb +0 -109
  274. data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -10,10 +10,10 @@ module RuboCop
10
10
  # Note: RDoc 5.1.0 or lower has the following issue.
11
11
  # https://github.com/rubocop-hq/rubocop/issues/7043
12
12
  #
13
- # The following `String#strip_indent` can be replaced with
13
+ # The following `String#gsub` can be replaced with
14
14
  # squiggly heredoc when RuboCop supports Ruby 2.5 or higher
15
15
  # (RDoc 6.0 or higher).
16
- SOURCE_TEMPLATE = <<-RUBY.strip_indent
16
+ SOURCE_TEMPLATE = <<-RUBY.gsub(/^ {8}/, '')
17
17
  # frozen_string_literal: true
18
18
 
19
19
  # TODO: when finished, run `rake generate_cops_documentation` to update the docs
@@ -61,9 +61,9 @@ module RuboCop
61
61
  # See https://github.com/rubocop-hq/rubocop/blob/master/lib/rubocop/node_pattern.rb
62
62
  #
63
63
  # For example
64
- MSG = 'Use `#good_method` instead of `#bad_method`.'.freeze
64
+ MSG = 'Use `#good_method` instead of `#bad_method`.'
65
65
 
66
- def_node_matcher :bad_method?, <<-PATTERN
66
+ def_node_matcher :bad_method?, <<~PATTERN
67
67
  (send nil? :bad_method ...)
68
68
  PATTERN
69
69
 
@@ -12,7 +12,6 @@ module RuboCop
12
12
  Description: 'TODO: Write a description of the cop.'
13
13
  Enabled: true
14
14
  VersionAdded: '%<version_added>s'
15
-
16
15
  YAML
17
16
 
18
17
  def initialize(configuration_file_path:, badge:, version_added:)
@@ -23,8 +22,13 @@ module RuboCop
23
22
  end
24
23
 
25
24
  def inject
26
- configuration_entries.insert(find_target_line,
27
- new_configuration_entry)
25
+ target_line = find_target_line
26
+ if target_line
27
+ configuration_entries.insert(find_target_line,
28
+ new_configuration_entry + "\n")
29
+ else
30
+ configuration_entries.push("\n" + new_configuration_entry)
31
+ end
28
32
 
29
33
  File.write(configuration_file_path, configuration_entries.join)
30
34
 
@@ -49,7 +53,8 @@ module RuboCop
49
53
 
50
54
  return index if badge.to_s < line
51
55
  end
52
- configuration_entries.size - 1
56
+
57
+ nil
53
58
  end
54
59
 
55
60
  def cop_name_line?(yaml)
@@ -54,7 +54,7 @@ module RuboCop
54
54
  elsif in_the_same_department
55
55
  break index
56
56
  end
57
- end
57
+ end || require_entries.size
58
58
  end
59
59
  end
60
60
 
@@ -19,11 +19,11 @@ module RuboCop
19
19
  MSG = 'Use the methods provided with the node extensions instead ' \
20
20
  'of manually destructuring nodes.'
21
21
 
22
- def_node_matcher :node_variable?, <<-PATTERN
22
+ def_node_matcher :node_variable?, <<~PATTERN
23
23
  {(lvar [#node_suffix? _]) (send nil? [#node_suffix? _])}
24
24
  PATTERN
25
25
 
26
- def_node_matcher :node_destructuring?, <<-PATTERN
26
+ def_node_matcher :node_destructuring?, <<~PATTERN
27
27
  {(masgn (mlhs ...) {(send #node_variable? :children) (array (splat #node_variable?))})}
28
28
  PATTERN
29
29
 
@@ -16,7 +16,7 @@ module RuboCop
16
16
  class NodeTypePredicate < Cop
17
17
  MSG = 'Use `#%<type>s_type?` to check node type.'
18
18
 
19
- def_node_matcher :node_type_check, <<-PATTERN
19
+ def_node_matcher :node_type_check, <<~PATTERN
20
20
  (send (send $_ :type) :== (sym $_))
21
21
  PATTERN
22
22
 
@@ -33,11 +33,11 @@ module RuboCop
33
33
 
34
34
  private
35
35
 
36
- def_node_matcher :node_type_check, <<-PATTERN
36
+ def_node_matcher :node_type_check, <<~PATTERN
37
37
  (send nil? :add_offense $_node $hash)
38
38
  PATTERN
39
39
 
40
- def_node_matcher :offending_location_argument, <<-PATTERN
40
+ def_node_matcher :offending_location_argument, <<~PATTERN
41
41
  (pair (sym :location) $(send (send $_node :loc) $_keyword))
42
42
  PATTERN
43
43
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
 
22
22
  MSG = 'Redundant location argument to `#add_offense`.'
23
23
 
24
- def_node_matcher :redundant_location_argument, <<-PATTERN
24
+ def_node_matcher :redundant_location_argument, <<~PATTERN
25
25
  (send nil? :add_offense _
26
26
  (hash <$(pair (sym :location) (sym :expression)) ...>)
27
27
  )
@@ -24,11 +24,11 @@ module RuboCop
24
24
 
25
25
  MSG = 'Redundant message argument to `#add_offense`.'
26
26
 
27
- def_node_matcher :node_type_check, <<-PATTERN
27
+ def_node_matcher :node_type_check, <<~PATTERN
28
28
  (send nil? :add_offense $_node $hash)
29
29
  PATTERN
30
30
 
31
- def_node_matcher :redundant_message_argument, <<-PATTERN
31
+ def_node_matcher :redundant_message_argument, <<~PATTERN
32
32
  (pair
33
33
  (sym :message)
34
34
  ${(const nil? :MSG) (send nil? :message) (send nil? :message _)})
@@ -16,11 +16,11 @@ module RuboCop
16
16
  class UselessMessageAssertion < Cop
17
17
  MSG = 'Do not specify cop behavior using `described_class::MSG`.'
18
18
 
19
- def_node_search :described_class_msg, <<-PATTERN
19
+ def_node_search :described_class_msg, <<~PATTERN
20
20
  (const (send nil? :described_class) :MSG)
21
21
  PATTERN
22
22
 
23
- def_node_matcher :rspec_expectation_on_msg?, <<-PATTERN
23
+ def_node_matcher :rspec_expectation_on_msg?, <<~PATTERN
24
24
  (send (send nil? :expect #contains_described_class_msg?) :to ...)
25
25
  PATTERN
26
26
 
@@ -44,8 +44,8 @@ module RuboCop
44
44
  #
45
45
  # foo.bar
46
46
  # .each do
47
- # baz
48
- # end
47
+ # baz
48
+ # end
49
49
  #
50
50
  # @example EnforcedStyleAlignWith: start_of_line
51
51
  # # bad
@@ -67,7 +67,7 @@ module RuboCop
67
67
 
68
68
  MSG = '%<current>s is not aligned with %<prefer>s%<alt_prefer>s.'
69
69
 
70
- def_node_matcher :block_end_align_target?, <<-PATTERN
70
+ def_node_matcher :block_end_align_target?, <<~PATTERN
71
71
  {assignment?
72
72
  splat
73
73
  and
@@ -129,7 +129,7 @@ module RuboCop
129
129
  # end
130
130
  # end
131
131
  #
132
- # @see https://github.com/rubocop-hq/ruby-style-guide#consistent-classes
132
+ # @see https://rubystyle.guide#consistent-classes
133
133
  class ClassStructure < Cop
134
134
  HUMANIZED_NODE_TYPE = {
135
135
  casgn: :constants,
@@ -142,7 +142,7 @@ module RuboCop
142
142
  MSG = '`%<category>s` is supposed to appear before ' \
143
143
  '`%<previous>s`.'
144
144
 
145
- def_node_matcher :visibility_block?, <<-PATTERN
145
+ def_node_matcher :visibility_block?, <<~PATTERN
146
146
  (send nil? { :private :protected :public })
147
147
  PATTERN
148
148
 
@@ -191,7 +191,7 @@ module RuboCop
191
191
  end
192
192
 
193
193
  def indentation_width
194
- @config.for_cop('IndentationWidth')['Width'] || 2
194
+ @config.for_cop('Layout/IndentationWidth')['Width'] || 2
195
195
  end
196
196
 
197
197
  def line_break_after_left_paren?(left_paren, elements)
@@ -27,7 +27,9 @@ module RuboCop
27
27
  KIND = 'block'
28
28
 
29
29
  def on_block(node)
30
- check(node, node.body)
30
+ first_line = node.send_node.last_line
31
+
32
+ check(node, node.body, adjusted_first_line: first_line)
31
33
  end
32
34
 
33
35
  def autocorrect(node)
@@ -41,12 +41,7 @@ module RuboCop
41
41
  def investigate(processed_source)
42
42
  return if processed_source.blank?
43
43
 
44
- if force_equal_sign_alignment?
45
- @asgn_tokens = assignment_tokens
46
- @asgn_lines = @asgn_tokens.map(&:line)
47
- # Don't attempt to correct the same = more than once
48
- @corrected = Set.new
49
- end
44
+ @corrected = Set.new if force_equal_sign_alignment?
50
45
 
51
46
  processed_source.tokens.each_cons(2) do |token1, token2|
52
47
  check_tokens(processed_source.ast, token1, token2)
@@ -65,24 +60,10 @@ module RuboCop
65
60
 
66
61
  private
67
62
 
68
- def assignment_tokens
69
- tokens = processed_source.tokens.select(&:equal_sign?)
70
- # we don't want to operate on equals signs which are part of an
71
- # optarg in a method definition
72
- # e.g.: def method(optarg = default_val); end
73
- tokens = remove_optarg_equals(tokens, processed_source)
74
-
75
- # Only attempt to align the first = on each line
76
- Set.new(tokens.uniq(&:line))
77
- end
78
-
79
63
  def check_tokens(ast, token1, token2)
80
64
  return if token2.type == :tNL
81
65
 
82
- if force_equal_sign_alignment? &&
83
- @asgn_tokens.include?(token2) &&
84
- (@asgn_lines.include?(token2.line - 1) ||
85
- @asgn_lines.include?(token2.line + 1))
66
+ if force_equal_sign_alignment? && assignment_tokens.include?(token2)
86
67
  check_assignment(token2)
87
68
  else
88
69
  check_other(token1, token2, ast)
@@ -90,32 +71,18 @@ module RuboCop
90
71
  end
91
72
 
92
73
  def check_assignment(token)
93
- assignment_line = ''
94
- message = ''
95
- if should_aligned_with_preceding_line?(token)
96
- assignment_line = processed_source.preceding_line(token)
97
- message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
98
- else
99
- assignment_line = processed_source.following_line(token)
100
- message = format(MSG_UNALIGNED_ASGN, location: 'following')
101
- end
102
- return if aligned_assignment?(token.pos, assignment_line)
74
+ return unless aligned_with_preceding_assignment(token) == :no
103
75
 
76
+ message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
104
77
  add_offense(token.pos, location: token.pos, message: message)
105
78
  end
106
79
 
107
- def should_aligned_with_preceding_line?(token)
108
- @asgn_lines.include?(token.line - 1)
109
- end
110
-
111
80
  def check_other(token1, token2, ast)
112
81
  return false if allow_for_trailing_comments? &&
113
82
  token2.text.start_with?('#')
114
83
 
115
84
  extra_space_range(token1, token2) do |range|
116
- # Unary + doesn't appear as a token and needs special handling.
117
85
  next if ignored_range?(ast, range.begin_pos)
118
- next if unary_plus_non_offense?(range)
119
86
 
120
87
  add_offense(range, location: range, message: MSG_UNNECESSARY)
121
88
  end
@@ -145,10 +112,6 @@ module RuboCop
145
112
  ignored_ranges(ast).any? { |r| r.include?(start_pos) }
146
113
  end
147
114
 
148
- def unary_plus_non_offense?(range)
149
- range.resize(range.size + 1).source =~ /^ ?\+$/
150
- end
151
-
152
115
  # Returns an array of ranges that should not be reported. It's the
153
116
  # extra spaces between the keys and values in a multiline hash,
154
117
  # since those are handled by the Style/AlignHash cop.
@@ -188,8 +151,8 @@ module RuboCop
188
151
  end
189
152
 
190
153
  def align_equal_signs(range, corrector)
191
- lines = contiguous_assignment_lines(range)
192
- tokens = @asgn_tokens.select { |t| lines.include?(t.line) }
154
+ lines = all_relevant_assignment_lines(range.line)
155
+ tokens = assignment_tokens.select { |t| lines.include?(t.line) }
193
156
 
194
157
  columns = tokens.map { |t| align_column(t) }
195
158
  align_to = columns.max
@@ -209,17 +172,15 @@ module RuboCop
209
172
  end
210
173
  end
211
174
 
212
- def contiguous_assignment_lines(range)
213
- result = [range.line]
175
+ def all_relevant_assignment_lines(line_number)
176
+ last_line_number = processed_source.lines.size
214
177
 
215
- range.line.downto(1) do |lineno|
216
- @asgn_lines.include?(lineno) ? result << lineno : break
217
- end
218
- range.line.upto(processed_source.lines.size) do |lineno|
219
- @asgn_lines.include?(lineno) ? result << lineno : break
220
- end
221
-
222
- result.sort!
178
+ (
179
+ relevant_assignment_lines(line_number.downto(1)) +
180
+ relevant_assignment_lines(line_number.upto(last_line_number))
181
+ )
182
+ .uniq
183
+ .sort
223
184
  end
224
185
 
225
186
  def align_column(asgn_token)
@@ -231,12 +192,6 @@ module RuboCop
231
192
  asgn_token.pos.last_column - spaces + 1
232
193
  end
233
194
 
234
- def remove_optarg_equals(asgn_tokens, processed_source)
235
- optargs = processed_source.ast.each_node(:optarg)
236
- optarg_eql = optargs.map { |o| o.loc.operator.begin_pos }.to_set
237
- asgn_tokens.reject { |t| optarg_eql.include?(t.begin_pos) }
238
- end
239
-
240
195
  def allow_for_trailing_comments?
241
196
  cop_config['AllowBeforeTrailingComments']
242
197
  end
@@ -108,6 +108,10 @@ module RuboCop
108
108
  end
109
109
  end
110
110
 
111
+ def self.autocorrect_incompatible_with
112
+ [Style::TrailingCommaInArguments]
113
+ end
114
+
111
115
  private
112
116
 
113
117
  def outermost_send_on_same_line(heredoc)
@@ -33,13 +33,21 @@ module RuboCop
33
33
  return unless node.loc.operator
34
34
  return if node.loc.operator.line == rhs.first_line
35
35
 
36
- base = display_column(node.source_range)
36
+ base = display_column(leftmost_multiple_assignment(node).source_range)
37
37
  check_alignment([rhs], base + configured_indentation_width)
38
38
  end
39
39
 
40
40
  def autocorrect(node)
41
41
  AlignmentCorrector.correct(processed_source, node, column_delta)
42
42
  end
43
+
44
+ def leftmost_multiple_assignment(node)
45
+ return node unless node.parent&.assignment?
46
+
47
+ leftmost_multiple_assignment(node.parent)
48
+
49
+ node.parent
50
+ end
43
51
  end
44
52
  end
45
53
  end
@@ -4,8 +4,12 @@ module RuboCop
4
4
  module Cop
5
5
  # rubocop:disable Metrics/LineLength
6
6
  module Layout
7
- # This cop checks the indentation of the first argument in a method call
8
- # or definition.
7
+ # This cop checks the indentation of the first argument in a method call.
8
+ # Arguments after the first one are checked by Layout/AlignArguments,
9
+ # not by this cop.
10
+ #
11
+ # For indenting the first parameter of method *definitions*, check out
12
+ # Layout/IndentFirstParameter.
9
13
  #
10
14
  # @example
11
15
  #
@@ -200,7 +204,7 @@ module RuboCop
200
204
  node.source_range.begin_pos > parent.source_range.begin_pos
201
205
  end
202
206
 
203
- def_node_matcher :eligible_method_call?, <<-PATTERN
207
+ def_node_matcher :eligible_method_call?, <<~PATTERN
204
208
  (send _ !:[]= ...)
205
209
  PATTERN
206
210
 
@@ -3,9 +3,13 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # This cop checks the indentation of the first parameter in a method call.
7
- # Parameters after the first one are checked by Layout/AlignParameters,
8
- # not by this cop.
6
+ # This cop checks the indentation of the first parameter in a method
7
+ # definition. Parameters after the first one are checked by
8
+ # Layout/AlignParameters, not by this cop.
9
+ #
10
+ # For indenting the first argument of method *calls*, check out
11
+ # Layout/IndentFirstArgument, which supports options related to
12
+ # nesting that are irrelevant for method *definitions*.
9
13
  #
10
14
  # @example
11
15
  #
@@ -37,7 +37,7 @@ module RuboCop
37
37
  # # good
38
38
  # # When EnforcedStyle is powerpack, bad code is auto-corrected to
39
39
  # # the following code.
40
- # <<~RUBY
40
+ # <<-RUBY.strip_indent
41
41
  # something
42
42
  # RUBY
43
43
  #
@@ -52,7 +52,6 @@ module RuboCop
52
52
  class IndentHeredoc < Cop
53
53
  include Heredoc
54
54
  include ConfigurableEnforcedStyle
55
- include SafeMode
56
55
 
57
56
  RUBY23_TYPE_MSG = 'Use %<indentation_width>d spaces for indentation ' \
58
57
  'in a heredoc by using `<<~` instead of ' \
@@ -207,7 +206,8 @@ module RuboCop
207
206
  body = heredoc_body(node)
208
207
  body_indent_level = indent_level(body)
209
208
  correct_indent_level = base_indent_level(node) + indentation_width
210
- body.gsub(/^\s{#{body_indent_level}}/, ' ' * correct_indent_level)
209
+ body.gsub(/^[^\S\r\n]{#{body_indent_level}}/,
210
+ ' ' * correct_indent_level)
211
211
  end
212
212
 
213
213
  def indented_end(node)
@@ -240,7 +240,7 @@ module RuboCop
240
240
  end
241
241
 
242
242
  def indentation_width
243
- @config.for_cop('IndentationWidth')['Width'] || 2
243
+ @config.for_cop('Layout/IndentationWidth')['Width'] || 2
244
244
  end
245
245
 
246
246
  def heredoc_body(node)