rubocop 0.71.0 → 0.75.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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -8
  3. data/bin/console +1 -0
  4. data/config/default.yml +84 -488
  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 -8
  18. data/lib/rubocop/config_loader_resolver.rb +2 -16
  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/correctors/percent_literal_corrector.rb +1 -1
  31. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  32. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  33. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  34. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  35. data/lib/rubocop/cop/generator.rb +4 -4
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  40. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  41. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  42. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  44. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  45. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  46. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
  51. data/lib/rubocop/cop/layout/indent_assignment.rb +10 -1
  52. data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
  53. data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
  56. data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  59. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
  60. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  62. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
  63. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  64. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  65. data/lib/rubocop/cop/layout/tab.rb +10 -22
  66. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  67. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  68. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  69. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  70. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  71. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  72. data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
  73. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  74. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  75. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  76. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  77. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  78. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  79. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  80. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  81. data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
  82. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  83. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  84. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  85. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
  86. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  87. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  88. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  89. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  90. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
  91. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
  92. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
  93. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  94. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  95. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  96. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  97. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  98. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  99. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  100. data/lib/rubocop/cop/lint/void.rb +3 -22
  101. data/lib/rubocop/cop/message_annotator.rb +16 -7
  102. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  103. data/lib/rubocop/cop/metrics/line_length.rb +6 -0
  104. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  105. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  106. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  107. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  108. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  109. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  110. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  111. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  112. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  113. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  114. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  115. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  116. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  117. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  118. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  119. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  120. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  121. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  122. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  123. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +21 -20
  124. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  125. data/lib/rubocop/cop/offense.rb +18 -7
  126. data/lib/rubocop/cop/registry.rb +22 -1
  127. data/lib/rubocop/cop/security/eval.rb +1 -1
  128. data/lib/rubocop/cop/security/json_load.rb +1 -1
  129. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  130. data/lib/rubocop/cop/security/open.rb +1 -1
  131. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  132. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  133. data/lib/rubocop/cop/style/alias.rb +1 -1
  134. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  135. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
  136. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  137. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  138. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  139. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
  140. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  141. data/lib/rubocop/cop/style/date_time.rb +3 -3
  142. data/lib/rubocop/cop/style/dir.rb +1 -1
  143. data/lib/rubocop/cop/style/documentation_method.rb +45 -1
  144. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  145. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  146. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  147. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  148. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  149. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -4
  150. data/lib/rubocop/cop/style/float_division.rb +94 -0
  151. data/lib/rubocop/cop/style/format_string.rb +13 -9
  152. data/lib/rubocop/cop/style/format_string_token.rb +18 -69
  153. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
  154. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  155. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  156. data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
  157. data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
  158. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  159. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  160. data/lib/rubocop/cop/style/lambda.rb +0 -2
  161. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +32 -26
  162. data/lib/rubocop/cop/style/min_max.rb +1 -1
  163. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  164. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  165. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  166. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  167. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  168. data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
  169. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  170. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  171. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  172. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  173. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  175. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  176. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  177. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  178. data/lib/rubocop/cop/style/redundant_return.rb +12 -0
  179. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  180. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  181. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  182. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  183. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  184. data/lib/rubocop/cop/style/safe_navigation.rb +19 -2
  185. data/lib/rubocop/cop/style/sample.rb +1 -1
  186. data/lib/rubocop/cop/style/semicolon.rb +11 -0
  187. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  188. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  189. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  190. data/lib/rubocop/cop/style/strip.rb +1 -1
  191. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  192. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  193. data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
  194. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  195. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  196. data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
  197. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  198. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  199. data/lib/rubocop/cop/style/word_array.rb +2 -2
  200. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
  201. data/lib/rubocop/cop/team.rb +15 -14
  202. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  203. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  204. data/lib/rubocop/core_ext/string.rb +0 -24
  205. data/lib/rubocop/error.rb +23 -0
  206. data/lib/rubocop/formatter/clang_style_formatter.rb +8 -3
  207. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  208. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  209. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  210. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  211. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  212. data/lib/rubocop/formatter/tap_formatter.rb +17 -4
  213. data/lib/rubocop/magic_comment.rb +4 -0
  214. data/lib/rubocop/node_pattern.rb +2 -2
  215. data/lib/rubocop/options.rb +21 -17
  216. data/lib/rubocop/path_util.rb +1 -1
  217. data/lib/rubocop/processed_source.rb +6 -1
  218. data/lib/rubocop/rspec/cop_helper.rb +0 -1
  219. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  220. data/lib/rubocop/rspec/shared_contexts.rb +12 -17
  221. data/lib/rubocop/rspec/support.rb +0 -1
  222. data/lib/rubocop/runner.rb +14 -25
  223. data/lib/rubocop/target_finder.rb +6 -4
  224. data/lib/rubocop/version.rb +1 -1
  225. data/lib/rubocop/yaml_duplication_checker.rb +8 -2
  226. metadata +17 -92
  227. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  228. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  229. data/lib/rubocop/cop/rails/action_filter.rb +0 -117
  230. data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
  231. data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
  232. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
  233. data/lib/rubocop/cop/rails/application_job.rb +0 -40
  234. data/lib/rubocop/cop/rails/application_record.rb +0 -40
  235. data/lib/rubocop/cop/rails/assert_not.rb +0 -44
  236. data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
  237. data/lib/rubocop/cop/rails/blank.rb +0 -164
  238. data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
  239. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
  240. data/lib/rubocop/cop/rails/date.rb +0 -161
  241. data/lib/rubocop/cop/rails/delegate.rb +0 -132
  242. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
  243. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
  244. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
  245. data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
  246. data/lib/rubocop/cop/rails/exit.rb +0 -67
  247. data/lib/rubocop/cop/rails/file_path.rb +0 -108
  248. data/lib/rubocop/cop/rails/find_by.rb +0 -55
  249. data/lib/rubocop/cop/rails/find_each.rb +0 -51
  250. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
  251. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
  252. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
  253. data/lib/rubocop/cop/rails/http_status.rb +0 -179
  254. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
  255. data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
  256. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
  257. data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
  258. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  259. data/lib/rubocop/cop/rails/output.rb +0 -49
  260. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  261. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
  262. data/lib/rubocop/cop/rails/presence.rb +0 -124
  263. data/lib/rubocop/cop/rails/present.rb +0 -153
  264. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
  265. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
  266. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
  267. data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
  268. data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
  269. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
  270. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  271. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
  272. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
  273. data/lib/rubocop/cop/rails/save_bang.rb +0 -316
  274. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  275. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
  276. data/lib/rubocop/cop/rails/time_zone.rb +0 -238
  277. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
  278. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  279. data/lib/rubocop/cop/rails/validation.rb +0 -109
  280. data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  MSG = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'
22
22
 
23
- def_node_matcher :redundant_sort_by, <<-PATTERN
23
+ def_node_matcher :redundant_sort_by, <<~PATTERN
24
24
  (block $(send _ :sort_by) (args (arg $_x)) (lvar _x))
25
25
  PATTERN
26
26
 
@@ -5,16 +5,40 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for uses of rescue in its modifier form.
7
7
  #
8
+ # The cop to check `rescue` in its modifier form is added for following
9
+ # reasons:
10
+ #
11
+ # * The syntax of modifier form `rescue` can be misleading because it
12
+ # might led us to believe that `rescue` handles the given exception
13
+ # but it actually rescue all exceptions to return the given rescue
14
+ # block. In this case, value returned by handle_error or
15
+ # SomeException.
16
+ #
17
+ # * Modifier form `rescue` would rescue all the exceptions. It would
18
+ # silently skip all exception or errors and handle the error.
19
+ # Example: If `NoMethodError` is raised, modifier form rescue would
20
+ # handle the exception.
21
+ #
8
22
  # @example
9
23
  # # bad
10
24
  # some_method rescue handle_error
11
25
  #
26
+ # # bad
27
+ # some_method rescue SomeException
28
+ #
12
29
  # # good
13
30
  # begin
14
31
  # some_method
15
32
  # rescue
16
33
  # handle_error
17
34
  # end
35
+ #
36
+ # # good
37
+ # begin
38
+ # some_method
39
+ # rescue SomeException
40
+ # handle_error
41
+ # end
18
42
  class RescueModifier < Cop
19
43
  include Alignment
20
44
  include RescueNode
@@ -80,11 +80,11 @@ module RuboCop
80
80
  MSG_EXPLICIT = 'Avoid rescuing without specifying ' \
81
81
  'an error class.'
82
82
 
83
- def_node_matcher :rescue_without_error_class?, <<-PATTERN
83
+ def_node_matcher :rescue_without_error_class?, <<~PATTERN
84
84
  (resbody nil? _ _)
85
85
  PATTERN
86
86
 
87
- def_node_matcher :rescue_standard_error?, <<-PATTERN
87
+ def_node_matcher :rescue_standard_error?, <<~PATTERN
88
88
  (resbody $(array (const nil? :StandardError)) _ _)
89
89
  PATTERN
90
90
 
@@ -80,7 +80,7 @@ module RuboCop
80
80
  end
81
81
 
82
82
  def_node_matcher :chained_send?, '(send !nil? ...)'
83
- def_node_matcher :define_method?, <<-PATTERN
83
+ def_node_matcher :define_method?, <<~PATTERN
84
84
  (send _ {:define_method :define_singleton_method} _)
85
85
  PATTERN
86
86
  end
@@ -69,7 +69,7 @@ module RuboCop
69
69
 
70
70
  # if format: (if checked_variable body nil)
71
71
  # unless format: (if checked_variable nil body)
72
- def_node_matcher :modifier_if_safe_navigation_candidate, <<-PATTERN
72
+ def_node_matcher :modifier_if_safe_navigation_candidate, <<~PATTERN
73
73
  {
74
74
  (if {
75
75
  (send $_ {:nil? :!})
@@ -120,6 +120,7 @@ module RuboCop
120
120
  corrector.remove(begin_range(node, body))
121
121
  corrector.remove(end_range(node, body))
122
122
  corrector.insert_before(method_call.loc.dot, '&')
123
+ handle_comments(corrector, node, method_call)
123
124
 
124
125
  add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
125
126
  end
@@ -127,6 +128,22 @@ module RuboCop
127
128
 
128
129
  private
129
130
 
131
+ def handle_comments(corrector, node, method_call)
132
+ return if processed_source.comments.empty?
133
+
134
+ corrector.insert_before(method_call.loc.expression,
135
+ "#{comments(node).join("\n")}\n")
136
+ end
137
+
138
+ def comments(node)
139
+ comments = processed_source.comments.select do |comment|
140
+ comment.loc.first_line >= node.loc.first_line &&
141
+ comment.loc.last_line <= node.loc.last_line
142
+ end
143
+
144
+ comments.map(&:text)
145
+ end
146
+
130
147
  def allowed_if_condition?(node)
131
148
  node.else? || node.elsif? || node.ternary?
132
149
  end
@@ -224,7 +241,7 @@ module RuboCop
224
241
  end
225
242
 
226
243
  def method_called?(send_node)
227
- send_node.parent&.send_type?
244
+ send_node&.parent&.send_type?
228
245
  end
229
246
 
230
247
  def begin_range(node, method_call)
@@ -30,7 +30,7 @@ module RuboCop
30
30
  class Sample < Cop
31
31
  MSG = 'Use `%<correct>s` instead of `%<incorrect>s`.'
32
32
 
33
- def_node_matcher :sample_candidate?, <<-PATTERN
33
+ def_node_matcher :sample_candidate?, <<~PATTERN
34
34
  (send $(send _ :shuffle $...) ${:first :last :[] :at :slice} $...)
35
35
  PATTERN
36
36
 
@@ -6,6 +6,9 @@ module RuboCop
6
6
  # This cop checks for multiple expressions placed on the same line.
7
7
  # It also checks for lines terminated with a semicolon.
8
8
  #
9
+ # This cop has `AllowAsExpressionSeparator` configuration option.
10
+ # It allows `;` to separate several expressions on the same line.
11
+ #
9
12
  # @example
10
13
  # # bad
11
14
  # foo = 1; bar = 2;
@@ -15,6 +18,14 @@ module RuboCop
15
18
  # foo = 1
16
19
  # bar = 2
17
20
  # baz = 3
21
+ #
22
+ # @example AllowAsExpressionSeparator: false (default)
23
+ # # bad
24
+ # foo = 1; bar = 2
25
+ #
26
+ # @example AllowAsExpressionSeparator: true
27
+ # # good
28
+ # foo = 1; bar = 2
18
29
  class Semicolon < Cop
19
30
  include RangeHelp
20
31
 
@@ -13,10 +13,17 @@ module RuboCop
13
13
  # def @table.columns; super; end
14
14
  #
15
15
  # # good
16
- # def no_op; end
17
16
  # def self.resource_class=(klass); end
18
17
  # def @table.columns; end
19
18
  #
19
+ # @example AllowIfMethodIsEmpty: true (default)
20
+ # # good
21
+ # def no_op; end
22
+ #
23
+ # @example AllowIfMethodIsEmpty: false
24
+ # # bad
25
+ # def no_op; end
26
+ #
20
27
  class SingleLineMethods < Cop
21
28
  include Alignment
22
29
 
@@ -20,7 +20,7 @@ module RuboCop
20
20
  MSG =
21
21
  'Use `warn` instead of `%<bad>s` to allow such output to be disabled.'
22
22
 
23
- def_node_matcher :stderr_puts?, <<-PATTERN
23
+ def_node_matcher :stderr_puts?, <<~PATTERN
24
24
  (send
25
25
  {(gvar #stderr_gvar?) (const nil? :STDERR)}
26
26
  :puts $_
@@ -15,11 +15,11 @@ module RuboCop
15
15
  class StringHashKeys < Cop
16
16
  MSG = 'Prefer symbols instead of strings as hash keys.'
17
17
 
18
- def_node_matcher :string_hash_key?, <<-PATTERN
18
+ def_node_matcher :string_hash_key?, <<~PATTERN
19
19
  (pair (str _) _)
20
20
  PATTERN
21
21
 
22
- def_node_matcher :receive_environments_method?, <<-PATTERN
22
+ def_node_matcher :receive_environments_method?, <<~PATTERN
23
23
  {
24
24
  ^^(send (const {nil? cbase} :IO) :popen ...)
25
25
  ^^(send (const {nil? cbase} :Open3)
@@ -18,7 +18,7 @@ module RuboCop
18
18
 
19
19
  MSG = 'Use `strip` instead of `%<methods>s`.'
20
20
 
21
- def_node_matcher :lstrip_rstrip, <<-PATTERN
21
+ def_node_matcher :lstrip_rstrip, <<~PATTERN
22
22
  {(send $(send _ $:rstrip) $:lstrip)
23
23
  (send $(send _ $:lstrip) $:rstrip)}
24
24
  PATTERN
@@ -29,9 +29,9 @@ module RuboCop
29
29
  add_offense(node, location: node.parent_class.source_range)
30
30
  end
31
31
 
32
- def_node_matcher :struct_constructor?, <<-PATTERN
33
- {(send (const nil? :Struct) :new ...)
34
- (block (send (const nil? :Struct) :new ...) ...)}
32
+ def_node_matcher :struct_constructor?, <<~PATTERN
33
+ {(send (const nil? :Struct) :new ...)
34
+ (block (send (const nil? :Struct) :new ...) ...)}
35
35
  PATTERN
36
36
  end
37
37
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  SUPER_TYPES = %i[super zsuper].freeze
21
21
 
22
22
  def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
23
- def_node_matcher :symbol_proc?, <<-PATTERN
23
+ def_node_matcher :symbol_proc?, <<~PATTERN
24
24
  (block
25
25
  ${(send ...) (super ...) zsuper}
26
26
  $(args (arg _var))
@@ -8,6 +8,11 @@ module RuboCop
8
8
  # parentheses using `EnforcedStyle`. Omission is only enforced when
9
9
  # removing the parentheses won't cause a different behavior.
10
10
  #
11
+ # `AllowSafeAssignment` option for safe assignment.
12
+ # By safe assignment we mean putting parentheses around
13
+ # an assignment to indicate "I know I'm using an assignment
14
+ # as a condition. It's not a mistake."
15
+ #
11
16
  # @example EnforcedStyle: require_no_parentheses (default)
12
17
  # # bad
13
18
  # foo = (bar?) ? a : b
@@ -40,6 +45,15 @@ module RuboCop
40
45
  # foo = bar? ? a : b
41
46
  # foo = bar.baz? ? a : b
42
47
  # foo = (bar && baz) ? a : b
48
+ #
49
+ # @example AllowSafeAssignment: true (default)
50
+ # # good
51
+ # foo = (bar = baz) ? a : b
52
+ #
53
+ # @example AllowSafeAssignment: false
54
+ # # bad
55
+ # foo = (bar = baz) ? a : b
56
+ #
43
57
  class TernaryParentheses < Cop
44
58
  include SafeAssignment
45
59
  include ConfigurableEnforcedStyle
@@ -53,11 +67,16 @@ module RuboCop
53
67
  ' complex conditions.'
54
68
 
55
69
  def on_if(node)
70
+ return if only_closing_parenthesis_is_last_line?(node.condition)
56
71
  return unless node.ternary? && !infinite_loop? && offense?(node)
57
72
 
58
73
  add_offense(node, location: node.source_range)
59
74
  end
60
75
 
76
+ def only_closing_parenthesis_is_last_line?(condition)
77
+ condition.source.split("\n").last == ')'
78
+ end
79
+
61
80
  def autocorrect(node)
62
81
  condition = node.condition
63
82
 
@@ -108,7 +127,7 @@ module RuboCop
108
127
  end
109
128
 
110
129
  def non_complex_send?(node)
111
- return false unless node.send_type?
130
+ return false unless node.call_type?
112
131
 
113
132
  !node.operator_method? || node.method?(:[])
114
133
  end
@@ -149,7 +168,8 @@ module RuboCop
149
168
 
150
169
  def unsafe_autocorrect?(condition)
151
170
  condition.children.any? do |child|
152
- unparenthesized_method_call?(child)
171
+ unparenthesized_method_call?(child) ||
172
+ below_ternary_precedence?(child)
153
173
  end
154
174
  end
155
175
 
@@ -157,7 +177,16 @@ module RuboCop
157
177
  method_name(child) =~ /^[a-z]/i && !child.parenthesized?
158
178
  end
159
179
 
160
- def_node_matcher :method_name, <<-PATTERN
180
+ def below_ternary_precedence?(child)
181
+ # Handle English "or", e.g. 'foo or bar ? a : b'
182
+ (child.or_type? && child.semantic_operator?) ||
183
+ # Handle English "and", e.g. 'foo and bar ? a : b'
184
+ (child.and_type? && child.semantic_operator?) ||
185
+ # Handle English "not", e.g. 'not foo ? a : b'
186
+ (child.send_type? && child.prefix_not?)
187
+ end
188
+
189
+ def_node_matcher :method_name, <<~PATTERN
161
190
  {($:defined? (send nil? _) ...)
162
191
  (send {_ nil?} $_ _ ...)}
163
192
  PATTERN
@@ -42,7 +42,7 @@ module RuboCop
42
42
  def on_def(node)
43
43
  return unless trailing_end?(node)
44
44
 
45
- add_offense(node.to_a.last, location: end_token(node).pos)
45
+ add_offense(node, location: end_token(node).pos)
46
46
  end
47
47
 
48
48
  def autocorrect(node)
@@ -61,7 +61,7 @@ module RuboCop
61
61
  end
62
62
 
63
63
  def end_token(node)
64
- @end_token ||= tokens(node).reverse.find(&:end?)
64
+ tokens(node).reverse.find(&:end?)
65
65
  end
66
66
 
67
67
  def body_and_end_on_same_line?(node)
@@ -69,10 +69,8 @@ module RuboCop
69
69
  end
70
70
 
71
71
  def token_before_end(node)
72
- @token_before_end ||= begin
73
- i = tokens(node).index(end_token(node))
74
- tokens(node)[i - 1]
75
- end
72
+ i = tokens(node).index(end_token(node))
73
+ tokens(node)[i - 1]
76
74
  end
77
75
 
78
76
  def break_line_before_end(node, corrector)
@@ -118,7 +118,7 @@ module RuboCop
118
118
  !allowed_method?(node) && !allowed_writer?(node.method_name)
119
119
  end
120
120
 
121
- def_node_matcher :looks_like_trivial_writer?, <<-PATTERN
121
+ def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
122
122
  {(def _ (args (arg ...)) (ivasgn _ (lvar _)))
123
123
  (defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
124
124
  PATTERN
@@ -55,7 +55,7 @@ module RuboCop
55
55
  MSG = 'Use `%<suggestion>s` instead of '\
56
56
  '`%<sorter>s...%<accessor_source>s`.'
57
57
 
58
- def_node_matcher :unneeded_sort?, <<-MATCHER
58
+ def_node_matcher :unneeded_sort?, <<~MATCHER
59
59
  {
60
60
  (send $(send _ $:sort ...) ${:last :first})
61
61
  (send $(send _ $:sort ...) ${:[] :at :slice} {(int 0) (int -1)})
@@ -25,7 +25,7 @@ module RuboCop
25
25
  MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
26
26
  '`%<receiver>s.unpack(%<format>s)%<method>s`.'
27
27
 
28
- def_node_matcher :unpack_and_first_element?, <<-PATTERN
28
+ def_node_matcher :unpack_and_first_element?, <<~PATTERN
29
29
  {
30
30
  (send $(send (...) :unpack $(...)) :first)
31
31
  (send $(send (...) :unpack $(...)) {:[] :slice :at} (int 0))
@@ -16,19 +16,15 @@ module RuboCop
16
16
  # /check #{$pattern}/
17
17
  # "Let's go to the #{@store}"
18
18
  class VariableInterpolation < Cop
19
+ include Interpolation
20
+
19
21
  MSG = 'Replace interpolated variable `%<variable>s` ' \
20
22
  'with expression `#{%<variable>s}`.'
21
23
 
22
- def on_dstr(node)
23
- check_for_interpolation(node)
24
- end
25
-
26
- def on_regexp(node)
27
- check_for_interpolation(node)
28
- end
29
-
30
- def on_xstr(node)
31
- check_for_interpolation(node)
24
+ def on_node_with_interpolations(node)
25
+ var_nodes(node.children).each do |var_node|
26
+ add_offense(var_node)
27
+ end
32
28
  end
33
29
 
34
30
  def autocorrect(node)
@@ -39,12 +35,6 @@ module RuboCop
39
35
 
40
36
  private
41
37
 
42
- def check_for_interpolation(node)
43
- var_nodes(node.children).each do |var_node|
44
- add_offense(var_node)
45
- end
46
- end
47
-
48
38
  def message(node)
49
39
  format(MSG, variable: node.source)
50
40
  end
@@ -71,8 +71,8 @@ module RuboCop
71
71
 
72
72
  def complex_content?(strings)
73
73
  strings.any? do |s|
74
- string = s.str_content
75
- !string.dup.force_encoding(::Encoding::UTF_8).valid_encoding? ||
74
+ string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
75
+ !string.valid_encoding? ||
76
76
  string !~ word_regex || string =~ / /
77
77
  end
78
78
  end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # by a predicate method, such as receiver.length == 0,
8
8
  # receiver.length > 0, receiver.length != 0,
9
9
  # receiver.length < 1 and receiver.size == 0 that can be
10
- # replaced by receiver.empty? and !receiver.empty.
10
+ # replaced by receiver.empty? and !receiver.empty?.
11
11
  #
12
12
  # @example
13
13
  # # bad
@@ -73,14 +73,14 @@ module RuboCop
73
73
  )
74
74
  end
75
75
 
76
- def_node_matcher :zero_length_predicate, <<-PATTERN
76
+ def_node_matcher :zero_length_predicate, <<~PATTERN
77
77
  {(send (send (...) ${:length :size}) $:== (int $0))
78
78
  (send (int $0) $:== (send (...) ${:length :size}))
79
79
  (send (send (...) ${:length :size}) $:< (int $1))
80
80
  (send (int $1) $:> (send (...) ${:length :size}))}
81
81
  PATTERN
82
82
 
83
- def_node_matcher :nonzero_length_predicate, <<-PATTERN
83
+ def_node_matcher :nonzero_length_predicate, <<~PATTERN
84
84
  {(send (send (...) ${:length :size}) ${:> :!=} (int $0))
85
85
  (send (int $0) ${:< :!=} (send (...) ${:length :size}))}
86
86
  PATTERN
@@ -92,14 +92,14 @@ module RuboCop
92
92
  "!#{other_receiver(node).source}.empty?"
93
93
  end
94
94
 
95
- def_node_matcher :zero_length_receiver, <<-PATTERN
95
+ def_node_matcher :zero_length_receiver, <<~PATTERN
96
96
  {(send (send $_ _) :== (int 0))
97
97
  (send (int 0) :== (send $_ _))
98
98
  (send (send $_ _) :< (int 1))
99
99
  (send (int 1) :> (send $_ _))}
100
100
  PATTERN
101
101
 
102
- def_node_matcher :other_receiver, <<-PATTERN
102
+ def_node_matcher :other_receiver, <<~PATTERN
103
103
  {(send (send $_ _) _ _)
104
104
  (send _ _ (send $_ _))}
105
105
  PATTERN
@@ -107,7 +107,7 @@ module RuboCop
107
107
  # Some collection like objects in the Ruby standard library
108
108
  # implement `#size`, but not `#empty`. We ignore those to
109
109
  # reduce false positives.
110
- def_node_matcher :non_polymorphic_collection?, <<-PATTERN
110
+ def_node_matcher :non_polymorphic_collection?, <<~PATTERN
111
111
  {(send (send (send (const nil? :File) :stat _) ...) ...)
112
112
  (send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
113
113
  PATTERN