rubocop 0.70.0 → 0.75.0

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 (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
@@ -53,7 +53,7 @@ module RuboCop
53
53
  ALTERNATIVE_PROTECTED = '`protected` inside a `class << self` ' \
54
54
  'block'
55
55
 
56
- def_node_search :private_class_methods, <<-PATTERN
56
+ def_node_search :private_class_methods, <<~PATTERN
57
57
  (send nil? :private_class_method $...)
58
58
  PATTERN
59
59
 
@@ -55,7 +55,7 @@ module RuboCop
55
55
  SystemExit
56
56
  ].freeze
57
57
 
58
- def_node_matcher :class_new_call?, <<-PATTERN
58
+ def_node_matcher :class_new_call?, <<~PATTERN
59
59
  (send
60
60
  (const {cbase nil?} :Class) :new
61
61
  $(const {cbase nil?} _))
@@ -17,21 +17,20 @@ module RuboCop
17
17
  #
18
18
  # "result is 10"
19
19
  class LiteralInInterpolation < Cop
20
+ include Interpolation
20
21
  include RangeHelp
21
22
  include PercentLiteral
22
23
 
23
24
  MSG = 'Literal interpolation detected.'
24
25
  COMPOSITE = %i[array hash pair irange erange].freeze
25
26
 
26
- def on_dstr(node)
27
- node.each_child_node(:begin) do |begin_node|
28
- final_node = begin_node.children.last
29
- next unless final_node
30
- next if special_keyword?(final_node)
31
- next unless prints_as_self?(final_node)
27
+ def on_interpolation(begin_node)
28
+ final_node = begin_node.children.last
29
+ return unless final_node
30
+ return if special_keyword?(final_node)
31
+ return unless prints_as_self?(final_node)
32
32
 
33
- add_offense(final_node)
34
- end
33
+ add_offense(final_node)
35
34
  end
36
35
 
37
36
  def autocorrect(node)
@@ -24,7 +24,7 @@ module RuboCop
24
24
  class MultipleCompare < Cop
25
25
  MSG = 'Use the `&&` operator to compare multiple values.'
26
26
 
27
- def_node_matcher :multiple_compare?, <<-PATTERN
27
+ def_node_matcher :multiple_compare?, <<~PATTERN
28
28
  (send (send _ {:< :> :<= :>=} $_) {:< :> :<= :>=} _)
29
29
  PATTERN
30
30
 
@@ -87,15 +87,15 @@ module RuboCop
87
87
  class_or_module_or_struct_new_call?(child)
88
88
  end
89
89
 
90
- def_node_matcher :eval_call?, <<-PATTERN
90
+ def_node_matcher :eval_call?, <<~PATTERN
91
91
  (block (send _ {:instance_eval :class_eval :module_eval} ...) ...)
92
92
  PATTERN
93
93
 
94
- def_node_matcher :exec_call?, <<-PATTERN
94
+ def_node_matcher :exec_call?, <<~PATTERN
95
95
  (block (send _ {:instance_exec :class_exec :module_exec} ...) ...)
96
96
  PATTERN
97
97
 
98
- def_node_matcher :class_or_module_or_struct_new_call?, <<-PATTERN
98
+ def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
99
99
  (block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
100
100
  PATTERN
101
101
  end
@@ -25,7 +25,7 @@ module RuboCop
25
25
  class NextWithoutAccumulator < Cop
26
26
  MSG = 'Use `next` with an accumulator argument in a `reduce`.'
27
27
 
28
- def_node_matcher :on_body_of_reduce, <<-PATTERN
28
+ def_node_matcher :on_body_of_reduce, <<~PATTERN
29
29
  (block (send _recv {:reduce :inject} !sym) _blockargs $(begin ...))
30
30
  PATTERN
31
31
 
@@ -74,7 +74,7 @@ module RuboCop
74
74
  end
75
75
 
76
76
  def_node_matcher :chained_send?, '(send !nil? ...)'
77
- def_node_matcher :define_method?, <<-PATTERN
77
+ def_node_matcher :define_method?, <<~PATTERN
78
78
  (send _ {:define_method :define_singleton_method} _)
79
79
  PATTERN
80
80
  end
@@ -31,17 +31,17 @@ module RuboCop
31
31
  '%<number_object>s.%<to_method>s, use stricter '\
32
32
  '%<corrected_method>s.'
33
33
 
34
- def_node_matcher :to_method, <<-PATTERN
34
+ def_node_matcher :to_method, <<~PATTERN
35
35
  (send $_ ${:to_i :to_f :to_c})
36
36
  PATTERN
37
37
 
38
- def_node_matcher :datetime?, <<-PATTERN
38
+ def_node_matcher :datetime?, <<~PATTERN
39
39
  (send (const {nil? (cbase)} {:Time :DateTime}) ...)
40
40
  PATTERN
41
41
 
42
42
  def on_send(node)
43
43
  to_method(node) do |receiver, to_method|
44
- next if date_time_object?(receiver)
44
+ next if receiver.nil? || date_time_object?(receiver)
45
45
 
46
46
  message = format(
47
47
  MSG,
@@ -64,7 +64,7 @@ module RuboCop
64
64
 
65
65
  def date_time_object?(node)
66
66
  child = node
67
- while child.send_type?
67
+ while child&.send_type?
68
68
  return true if datetime? child
69
69
 
70
70
  child = child.children[0]
@@ -24,7 +24,7 @@ module RuboCop
24
24
  MSG = '`%<method>s` always returns `0`. ' \
25
25
  'Perhaps you meant `rand(2)` or `rand`?'
26
26
 
27
- def_node_matcher :rand_one?, <<-PATTERN
27
+ def_node_matcher :rand_one?, <<~PATTERN
28
28
  (send {(const nil? :Kernel) nil?} :rand {(int {-1 1}) (float {-1.0 1.0})})
29
29
  PATTERN
30
30
 
@@ -32,7 +32,7 @@ module RuboCop
32
32
  MSG_EACH_WITH_INDEX = 'Use `each` instead of `each_with_index`.'
33
33
  MSG_WITH_INDEX = 'Remove redundant `with_index`.'
34
34
 
35
- def_node_matcher :redundant_with_index?, <<-PATTERN
35
+ def_node_matcher :redundant_with_index?, <<~PATTERN
36
36
  (block
37
37
  $(send
38
38
  _ {:each_with_index :with_index} ...)
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  MSG_WITH_OBJECT = 'Remove redundant `with_object`.'
35
35
 
36
- def_node_matcher :redundant_with_object?, <<-PATTERN
36
+ def_node_matcher :redundant_with_object?, <<~PATTERN
37
37
  (block
38
38
  $(send _ {:each_with_object :with_object}
39
39
  _)
@@ -29,11 +29,11 @@ module RuboCop
29
29
  MSG = 'Do not chain ordinary method call' \
30
30
  ' after safe navigation operator.'
31
31
 
32
- def_node_matcher :bad_method?, <<-PATTERN
33
- {
34
- (send $(csend ...) $_ ...)
35
- (send $(block (csend ...) ...) $_ ...)
36
- }
32
+ def_node_matcher :bad_method?, <<~PATTERN
33
+ {
34
+ (send $(csend ...) $_ ...)
35
+ (send $(block (csend ...) ...) $_ ...)
36
+ }
37
37
  PATTERN
38
38
 
39
39
  def on_send(node)
@@ -23,7 +23,7 @@ module RuboCop
23
23
  MSG = 'Avoid calling `empty?` with the safe navigation operator ' \
24
24
  'in conditionals.'
25
25
 
26
- def_node_matcher :safe_navigation_empty_in_conditional?, <<-PATTERN
26
+ def_node_matcher :safe_navigation_empty_in_conditional?, <<~PATTERN
27
27
  (if (csend (send ...) :empty?) ...)
28
28
  PATTERN
29
29
 
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ #
7
+ # This cop checks for `send`, `public_send`, and `__send__` methods
8
+ # when using mix-in.
9
+ #
10
+ # `include` and `prepend` methods were private methods until Ruby 2.0,
11
+ # they were mixed-in via `send` method. This cop uses Ruby 2.1 or
12
+ # higher style that can be called by public methods.
13
+ # And `extend` method that was originally a public method is also targeted
14
+ # for style unification.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # Foo.send(:include, Bar)
19
+ # Foo.send(:prepend, Bar)
20
+ # Foo.send(:extend, Bar)
21
+ #
22
+ # # bad
23
+ # Foo.public_send(:include, Bar)
24
+ # Foo.public_send(:prepend, Bar)
25
+ # Foo.public_send(:extend, Bar)
26
+ #
27
+ # # bad
28
+ # Foo.__send__(:include, Bar)
29
+ # Foo.__send__(:prepend, Bar)
30
+ # Foo.__send__(:extend, Bar)
31
+ #
32
+ # # good
33
+ # Foo.include Bar
34
+ # Foo.prepend Bar
35
+ # Foo.extend Bar
36
+ #
37
+ class SendWithMixinArgument < Cop
38
+ include RangeHelp
39
+
40
+ MSG = 'Use `%<method>s %<module_name>s` instead of `%<bad_method>s`.'
41
+ MIXIN_METHODS = %i[include prepend extend].freeze
42
+
43
+ def_node_matcher :send_with_mixin_argument?, <<~PATTERN
44
+ (send
45
+ (const _ _) {:send :public_send :__send__}
46
+ ({sym str} $#mixin_method?)
47
+ $(const _ _))
48
+ PATTERN
49
+
50
+ def on_send(node)
51
+ send_with_mixin_argument?(node) do |method, module_name|
52
+ message = message(
53
+ method, module_name.source, bad_location(node).source
54
+ )
55
+
56
+ add_offense(node, location: bad_location(node), message: message)
57
+ end
58
+ end
59
+
60
+ def autocorrect(node)
61
+ send_with_mixin_argument?(node) do |method, module_name|
62
+ lambda do |corrector|
63
+ corrector.replace(
64
+ bad_location(node), "#{method} #{module_name.source}"
65
+ )
66
+ end
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def bad_location(node)
73
+ loc = node.loc
74
+
75
+ range_between(loc.selector.begin_pos, loc.expression.end_pos)
76
+ end
77
+
78
+ def message(method, module_name, bad_method)
79
+ format(
80
+ MSG,
81
+ method: method, module_name: module_name, bad_method: bad_method
82
+ )
83
+ end
84
+
85
+ def mixin_method?(node)
86
+ MIXIN_METHODS.include?(node.to_sym)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -18,20 +18,20 @@ module RuboCop
18
18
  #
19
19
  # "result is #{something}"
20
20
  class StringConversionInInterpolation < Cop
21
+ include Interpolation
22
+
21
23
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
22
24
  MSG_SELF = 'Use `self` instead of `Object#to_s` in ' \
23
25
  'interpolation.'
24
26
 
25
27
  def_node_matcher :to_s_without_args?, '(send _ :to_s)'
26
28
 
27
- def on_dstr(node)
28
- node.each_child_node(:begin) do |begin_node|
29
- final_node = begin_node.children.last
29
+ def on_interpolation(begin_node)
30
+ final_node = begin_node.children.last
30
31
 
31
- next unless to_s_without_args?(final_node)
32
+ return unless to_s_without_args?(final_node)
32
33
 
33
- add_offense(final_node, location: :selector)
34
- end
34
+ add_offense(final_node, location: :selector)
35
35
  end
36
36
 
37
37
  def autocorrect(node)
@@ -20,7 +20,7 @@ module RuboCop
20
20
  class UnifiedInteger < Cop
21
21
  MSG = 'Use `Integer` instead of `%<klass>s`.'
22
22
 
23
- def_node_matcher :fixnum_or_bignum_const, <<-PATTERN
23
+ def_node_matcher :fixnum_or_bignum_const, <<~PATTERN
24
24
  (:const {nil? (:cbase)} ${:Fixnum :Bignum})
25
25
  PATTERN
26
26
 
@@ -155,7 +155,7 @@ module RuboCop
155
155
  end
156
156
 
157
157
  def all_disabled?(comment)
158
- comment.text =~ /rubocop\s*:\s*disable\s+all\b/
158
+ comment.text =~ /rubocop\s*:\s*(?:disable|todo)\s+all\b/
159
159
  end
160
160
 
161
161
  def ignore_offense?(disabled_ranges, line_range)
@@ -26,7 +26,7 @@ module RuboCop
26
26
 
27
27
  MSG = 'Remove unnecessary `require` statement.'
28
28
 
29
- def_node_matcher :unnecessary_require_statement?, <<-PATTERN
29
+ def_node_matcher :unnecessary_require_statement?, <<~PATTERN
30
30
  (send nil? :require
31
31
  (str {"enumerator" "rational" "complex" "thread"}))
32
32
  PATTERN
@@ -58,9 +58,14 @@ module RuboCop
58
58
  PERCENT_CAPITAL_I = '%I'
59
59
  ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
60
60
 
61
- def_node_matcher :array_new?, '$(send (const nil? :Array) :new ...)'
61
+ def_node_matcher :array_new?, <<~PATTERN
62
+ {
63
+ $(send (const nil? :Array) :new ...)
64
+ $(block (send (const nil? :Array) :new ...) ...)
65
+ }
66
+ PATTERN
62
67
 
63
- def_node_matcher :literal_expansion, <<-PATTERN
68
+ def_node_matcher :literal_expansion, <<~PATTERN
64
69
  (splat {$({str dstr int float array} ...) (block $#array_new? ...) $#array_new?} ...)
65
70
  PATTERN
66
71
 
@@ -51,7 +51,7 @@ module RuboCop
51
51
 
52
52
  private
53
53
 
54
- def_node_matcher :flow_command?, <<-PATTERN
54
+ def_node_matcher :flow_command?, <<~PATTERN
55
55
  {
56
56
  return next break retry redo
57
57
  (send
@@ -45,7 +45,7 @@ module RuboCop
45
45
  'Instead, use %<replacements>s depending on your specific use ' \
46
46
  'case.'
47
47
 
48
- def_node_matcher :uri_escape_unescape?, <<-PATTERN
48
+ def_node_matcher :uri_escape_unescape?, <<~PATTERN
49
49
  (send
50
50
  (const ${nil? cbase} :URI) ${:escape :encode :unescape :decode}
51
51
  ...)
@@ -18,13 +18,13 @@ module RuboCop
18
18
  'be used. Instead, use `%<top_level>sURI::DEFAULT_PARSER.' \
19
19
  'make_regexp%<arg>s`.'
20
20
 
21
- def_node_matcher :uri_regexp_with_argument?, <<-PATTERN
21
+ def_node_matcher :uri_regexp_with_argument?, <<~PATTERN
22
22
  (send
23
23
  (const ${nil? cbase} :URI) :regexp
24
24
  (str $_))
25
25
  PATTERN
26
26
 
27
- def_node_matcher :uri_regexp_without_argument?, <<-PATTERN
27
+ def_node_matcher :uri_regexp_without_argument?, <<~PATTERN
28
28
  (send
29
29
  (const ${nil? cbase} :URI) :regexp)
30
30
  PATTERN
@@ -113,19 +113,19 @@ module RuboCop
113
113
 
114
114
  private
115
115
 
116
- def_node_matcher :static_method_definition?, <<-PATTERN
116
+ def_node_matcher :static_method_definition?, <<~PATTERN
117
117
  {def (send nil? {:attr :attr_reader :attr_writer :attr_accessor} ...)}
118
118
  PATTERN
119
119
 
120
- def_node_matcher :dynamic_method_definition?, <<-PATTERN
120
+ def_node_matcher :dynamic_method_definition?, <<~PATTERN
121
121
  {(send nil? :define_method ...) (block (send nil? :define_method ...) ...)}
122
122
  PATTERN
123
123
 
124
- def_node_matcher :class_or_instance_eval?, <<-PATTERN
124
+ def_node_matcher :class_or_instance_eval?, <<~PATTERN
125
125
  (block (send _ {:class_eval :instance_eval}) ...)
126
126
  PATTERN
127
127
 
128
- def_node_matcher :class_or_module_or_struct_new_call?, <<-PATTERN
128
+ def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
129
129
  (block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
130
130
  PATTERN
131
131
 
@@ -202,7 +202,7 @@ module RuboCop
202
202
  cop_config.fetch('MethodCreatingMethods', []).any? do |m|
203
203
  matcher_name = "#{m}_method?".to_sym
204
204
  unless respond_to?(matcher_name)
205
- self.class.def_node_matcher matcher_name, <<-PATTERN
205
+ self.class.def_node_matcher matcher_name, <<~PATTERN
206
206
  {def (send nil? :#{m} ...)}
207
207
  PATTERN
208
208
  end
@@ -226,7 +226,7 @@ module RuboCop
226
226
  cop_config.fetch('ContextCreatingMethods', []).any? do |m|
227
227
  matcher_name = "#{m}_block?".to_sym
228
228
  unless respond_to?(matcher_name)
229
- self.class.def_node_matcher matcher_name, <<-PATTERN
229
+ self.class.def_node_matcher matcher_name, <<~PATTERN
230
230
  (block (send {nil? const} {:#{m}} ...) ...)
231
231
  PATTERN
232
232
  end
@@ -49,7 +49,7 @@ module RuboCop
49
49
 
50
50
  private
51
51
 
52
- def_node_matcher :setter_call_to_local_variable?, <<-PATTERN
52
+ def_node_matcher :setter_call_to_local_variable?, <<~PATTERN
53
53
  [(send (lvar _) ...) setter_method?]
54
54
  PATTERN
55
55
 
@@ -9,11 +9,11 @@ module RuboCop
9
9
  #
10
10
  # @example
11
11
  # RuboCop::Cop::MessageAnnotator.new(
12
- # config, cop_config, @options
13
- # ).annotate('message', 'Cop/CopName')
12
+ # config, cop_name, cop_config, @options
13
+ # ).annotate('message')
14
14
  # #=> 'Cop/CopName: message (http://example.org/styleguide)'
15
15
  class MessageAnnotator
16
- attr_reader :options, :config, :cop_config
16
+ attr_reader :options, :config, :cop_name, :cop_config
17
17
 
18
18
  @style_guide_urls = {}
19
19
 
@@ -29,6 +29,7 @@ module RuboCop
29
29
  # :ExtraDetails [Boolean] Include cop details
30
30
  # :DisplayCopNames [Boolean] Include cop name
31
31
  #
32
+ # @param [String] cop_name for specific cop name
32
33
  # @param [Hash] cop_config configs for specific cop, from config#for_cop
33
34
  # @option cop_config [String] :StyleGuide Extension of base styleguide URL
34
35
  # @option cop_config [String] :Reference Full reference URL
@@ -43,8 +44,9 @@ module RuboCop
43
44
  # Include debug output
44
45
  # @option options [Boolean] :display_cop_names
45
46
  # Include cop name
46
- def initialize(config, cop_config, options)
47
+ def initialize(config, cop_name, cop_config, options)
47
48
  @config = config
49
+ @cop_name = cop_name
48
50
  @cop_config = cop_config || {}
49
51
  @options = options
50
52
  end
@@ -53,8 +55,8 @@ module RuboCop
53
55
  # based on params passed into initializer
54
56
  #
55
57
  # @return [String] annotated message
56
- def annotate(message, name)
57
- message = "#{name}: #{message}" if display_cop_names?
58
+ def annotate(message)
59
+ message = "#{cop_name}: #{message}" if display_cop_names?
58
60
  message += " #{details}" if extra_details? && details
59
61
  if display_style_guide?
60
62
  links = urls.join(', ')
@@ -74,7 +76,7 @@ module RuboCop
74
76
  return nil if url.nil? || url.empty?
75
77
 
76
78
  self.class.style_guide_urls[url] ||= begin
77
- base_url = config.for_all_cops['StyleGuideBaseURL']
79
+ base_url = style_guide_base_url
78
80
  if base_url.nil? || base_url.empty?
79
81
  url
80
82
  else
@@ -83,6 +85,13 @@ module RuboCop
83
85
  end
84
86
  end
85
87
 
88
+ def style_guide_base_url
89
+ department_name = cop_name.split('/').first
90
+
91
+ config.for_department(department_name)['StyleGuideBaseURL'] ||
92
+ config.for_all_cops['StyleGuideBaseURL']
93
+ end
94
+
86
95
  def display_style_guide?
87
96
  (options[:display_style_guide] ||
88
97
  config.for_all_cops['DisplayStyleGuide']) &&