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
@@ -57,24 +57,20 @@ module RuboCop
57
57
  MSG = 'Use `%<preferred>s` instead of `%<bad>s`.'
58
58
 
59
59
  def on_resbody(node)
60
- exception_type, @exception_name = *node
61
- return unless exception_type || @exception_name
62
-
63
- @exception_name ||= exception_type.children.first
64
- return if @exception_name.const_type? ||
65
- variable_name == preferred_name
60
+ name = variable_name(node)
61
+ return unless name
62
+ return if preferred_name(name).to_sym == name
66
63
 
67
64
  add_offense(node, location: offense_range(node))
68
65
  end
69
66
 
70
67
  def autocorrect(node)
71
68
  lambda do |corrector|
72
- offending_name = node.exception_variable.children.first
69
+ offending_name = variable_name(node)
70
+ preferred_name = preferred_name(offending_name)
73
71
  corrector.replace(offense_range(node), preferred_name)
74
72
 
75
- return unless node.body
76
-
77
- node.body.each_descendant(:lvar) do |var|
73
+ node.body&.each_descendant(:lvar) do |var|
78
74
  next unless var.children.first == offending_name
79
75
 
80
76
  corrector.replace(var.loc.expression, preferred_name)
@@ -89,24 +85,26 @@ module RuboCop
89
85
  variable.loc.expression
90
86
  end
91
87
 
92
- def preferred_name
93
- @preferred_name ||= begin
94
- name = cop_config.fetch('PreferredName', 'e')
95
- name = "_#{name}" if variable_name.to_s.start_with?('_')
96
- name
88
+ def preferred_name(variable_name)
89
+ preferred_name = cop_config.fetch('PreferredName', 'e')
90
+ if variable_name.to_s.start_with?('_')
91
+ "_#{preferred_name}"
92
+ else
93
+ preferred_name
97
94
  end
98
95
  end
99
96
 
100
- def variable_name
101
- location.source
102
- end
97
+ def variable_name(node)
98
+ asgn_node = node.exception_variable
99
+ return unless asgn_node
103
100
 
104
- def location
105
- @exception_name.loc.expression
101
+ asgn_node.children.last
106
102
  end
107
103
 
108
- def message(_node = nil)
109
- format(MSG, preferred: preferred_name, bad: variable_name)
104
+ def message(node)
105
+ offending_name = variable_name(node)
106
+ preferred_name = preferred_name(offending_name)
107
+ format(MSG, preferred: preferred_name, bad: offending_name)
110
108
  end
111
109
  end
112
110
  end
@@ -39,6 +39,7 @@ module RuboCop
39
39
  alias on_kwarg on_lvasgn
40
40
  alias on_kwrestarg on_lvasgn
41
41
  alias on_blockarg on_lvasgn
42
+ alias on_lvar on_lvasgn
42
43
 
43
44
  private
44
45
 
@@ -67,23 +67,34 @@ module RuboCop
67
67
 
68
68
  # @api public
69
69
  #
70
- # @!attribute [r] corrected
70
+ # @!attribute [r] corrected?
71
71
  #
72
72
  # @return [Boolean]
73
- # whether this offense is automatically corrected.
74
- def corrected
75
- @status == :corrected
73
+ # whether this offense is automatically corrected via
74
+ # autocorrect or a todo.
75
+ def corrected?
76
+ @status == :corrected || @status == :corrected_with_todo
77
+ end
78
+
79
+ # @api public
80
+ #
81
+ # @!attribute [r] corrected_with_todo?
82
+ #
83
+ # @return [Boolean]
84
+ # whether this offense is automatically disabled via a todo.
85
+ def corrected_with_todo?
86
+ @status == :corrected_with_todo
76
87
  end
77
- alias corrected? corrected
78
88
 
79
89
  # @api public
80
90
  #
81
91
  # @!attribute [r] disabled?
82
92
  #
83
93
  # @return [Boolean]
84
- # whether this offense was locally disabled where it occurred
94
+ # whether this offense was locally disabled with a
95
+ # disable or todo where it occurred.
85
96
  def disabled?
86
- @status == :disabled
97
+ @status == :disabled || @status == :todo
87
98
  end
88
99
 
89
100
  # @api public
@@ -91,8 +91,11 @@ module RuboCop
91
91
  # @note Emits a warning if the provided name has an incorrect namespace
92
92
  #
93
93
  # @return [String] Qualified cop name
94
- def qualified_cop_name(name, path)
94
+ def qualified_cop_name(name, path, shall_warn = true)
95
95
  badge = Badge.parse(name)
96
+ if shall_warn && department_missing?(badge, name)
97
+ print_warning(name, path)
98
+ end
96
99
  return name if registered?(badge)
97
100
 
98
101
  potential_badges = qualify_badge(badge)
@@ -104,6 +107,24 @@ module RuboCop
104
107
  end
105
108
  end
106
109
 
110
+ def department_missing?(badge, name)
111
+ !badge.qualified? && unqualified_cop_names.include?(name)
112
+ end
113
+
114
+ def print_warning(name, path)
115
+ message = "#{path}: Warning: no department given for #{name}."
116
+ if path.end_with?('.rb')
117
+ message += ' Run `rubocop -a --only Migration/DepartmentName` to fix.'
118
+ end
119
+ warn message
120
+ end
121
+
122
+ def unqualified_cop_names
123
+ @unqualified_cop_names ||=
124
+ Set.new(@cops_by_cop_name.keys.map { |qn| File.basename(qn) }) <<
125
+ 'UnneededCopDisableDirective'
126
+ end
127
+
107
128
  # @return [Hash{String => Array<Class>}]
108
129
  def to_h
109
130
  @cops_by_cop_name
@@ -14,7 +14,7 @@ module RuboCop
14
14
  class Eval < Cop
15
15
  MSG = 'The use of `eval` is a serious security risk.'
16
16
 
17
- def_node_matcher :eval?, <<-PATTERN
17
+ def_node_matcher :eval?, <<~PATTERN
18
18
  (send {nil? (send nil? :binding)} :eval $!str ...)
19
19
  PATTERN
20
20
 
@@ -25,7 +25,7 @@ module RuboCop
25
25
  class JSONLoad < Cop
26
26
  MSG = 'Prefer `JSON.parse` over `JSON.%<method>s`.'
27
27
 
28
- def_node_matcher :json_load, <<-PATTERN
28
+ def_node_matcher :json_load, <<~PATTERN
29
29
  (send (const {nil? cbase} :JSON) ${:load :restore} ...)
30
30
  PATTERN
31
31
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
  class MarshalLoad < Cop
22
22
  MSG = 'Avoid using `Marshal.%<method>s`.'
23
23
 
24
- def_node_matcher :marshal_load, <<-PATTERN
24
+ def_node_matcher :marshal_load, <<~PATTERN
25
25
  (send (const {nil? cbase} :Marshal) ${:load :restore}
26
26
  !(send (const {nil? cbase} :Marshal) :dump ...))
27
27
  PATTERN
@@ -22,7 +22,7 @@ module RuboCop
22
22
  class Open < Cop
23
23
  MSG = 'The use of `Kernel#open` is a serious security risk.'
24
24
 
25
- def_node_matcher :open?, <<-PATTERN
25
+ def_node_matcher :open?, <<~PATTERN
26
26
  (send nil? :open $!str ...)
27
27
  PATTERN
28
28
 
@@ -18,7 +18,7 @@ module RuboCop
18
18
  class YAMLLoad < Cop
19
19
  MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'
20
20
 
21
- def_node_matcher :yaml_load, <<-PATTERN
21
+ def_node_matcher :yaml_load, <<~PATTERN
22
22
  (send (const {nil? cbase} :YAML) :load ...)
23
23
  PATTERN
24
24
 
@@ -63,6 +63,7 @@ module RuboCop
63
63
 
64
64
  def on_send(node)
65
65
  return unless node.access_modifier?
66
+ return if node.parent.pair_type?
66
67
 
67
68
  if offense?(node)
68
69
  add_offense(node, location: :selector) do
@@ -138,7 +138,7 @@ module RuboCop
138
138
  end
139
139
  end
140
140
 
141
- def_node_matcher :identifier, <<-PATTERN
141
+ def_node_matcher :identifier, <<~PATTERN
142
142
  (sym $_)
143
143
  PATTERN
144
144
  end
@@ -114,7 +114,8 @@ module RuboCop
114
114
 
115
115
  def on_send(node)
116
116
  return unless node.arguments?
117
- return if node.parenthesized? || node.operator_method?
117
+ return if node.parenthesized?
118
+ return if node.operator_method? || node.assignment_method?
118
119
 
119
120
  node.arguments.each do |arg|
120
121
  get_blocks(arg) do |block|
@@ -55,10 +55,6 @@ module RuboCop
55
55
  end
56
56
  alias on_csend on_send
57
57
 
58
- # We let AutocorrectUnlessChangingAST#autocorrect work with the send
59
- # node, because that context is needed. When parsing the code to see if
60
- # the AST has changed, a braceless hash would not be parsed as a hash
61
- # otherwise.
62
58
  def autocorrect(send_node)
63
59
  hash_node = send_node.last_argument
64
60
 
@@ -76,20 +72,32 @@ module RuboCop
76
72
  private
77
73
 
78
74
  def check(arg, args)
79
- if style == :braces && !arg.braces?
80
- add_arg_offense(arg, :missing)
81
- elsif style == :no_braces && arg.braces?
82
- add_arg_offense(arg, :redundant)
83
- elsif style == :context_dependent
75
+ case style
76
+ when :braces
77
+ check_braces(arg)
78
+ when :no_braces
79
+ check_no_braces(arg)
80
+ when :context_dependent
84
81
  check_context_dependent(arg, args)
85
82
  end
86
83
  end
87
84
 
85
+ def check_braces(arg)
86
+ add_arg_offense(arg, :missing) unless arg.braces?
87
+ end
88
+
89
+ def check_no_braces(arg)
90
+ return unless arg.braces? && !braces_needed_for_semantics?(arg)
91
+
92
+ add_arg_offense(arg, :redundant)
93
+ end
94
+
88
95
  def check_context_dependent(arg, args)
89
96
  braces_around_second_from_end = args.size > 1 && args[-2].hash_type?
90
97
 
91
98
  if arg.braces?
92
- unless braces_around_second_from_end
99
+ unless braces_around_second_from_end ||
100
+ braces_needed_for_semantics?(arg)
93
101
  add_arg_offense(arg, :redundant)
94
102
  end
95
103
  elsif braces_around_second_from_end
@@ -97,6 +105,17 @@ module RuboCop
97
105
  end
98
106
  end
99
107
 
108
+ # Returns true if there's block inside the braces of the given hash arg
109
+ # and that block uses do..end. The reason for wanting to check this is
110
+ # that the do..end could bind to a different method invocation if the
111
+ # hash braces were removed.
112
+ def braces_needed_for_semantics?(arg)
113
+ arg.each_pair do |_key, value|
114
+ return true if value.block_type? && !value.braces?
115
+ end
116
+ false
117
+ end
118
+
100
119
  def add_arg_offense(arg, type)
101
120
  add_offense(arg.parent, location: arg.source_range,
102
121
  message: format(MSG,
@@ -115,7 +115,7 @@ module RuboCop
115
115
  end
116
116
 
117
117
  def indent_width
118
- @config.for_cop('IndentationWidth')['Width'] || 2
118
+ @config.for_cop('Layout/IndentationWidth')['Width'] || 2
119
119
  end
120
120
 
121
121
  def check_style(node, body)
@@ -20,7 +20,7 @@ module RuboCop
20
20
  class ColonMethodCall < Cop
21
21
  MSG = 'Do not use `::` for method calls.'
22
22
 
23
- def_node_matcher :java_type_node?, <<-PATTERN
23
+ def_node_matcher :java_type_node?, <<~PATTERN
24
24
  (send
25
25
  (const nil? :Java) _)
26
26
  PATTERN
@@ -6,7 +6,8 @@ module RuboCop
6
6
  # This cop checks for comments put on the same line as some keywords.
7
7
  # These keywords are: `begin`, `class`, `def`, `end`, `module`.
8
8
  #
9
- # Note that some comments (`:nodoc:`, `:yields:, and `rubocop:disable`)
9
+ # Note that some comments
10
+ # (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
10
11
  # are allowed.
11
12
  #
12
13
  # @example
@@ -33,53 +34,38 @@ module RuboCop
33
34
  # y
34
35
  # end
35
36
  class CommentedKeyword < Cop
36
- include RangeHelp
37
-
38
37
  MSG = 'Do not place comments on the same line as the ' \
39
38
  '`%<keyword>s` keyword.'
40
39
 
41
40
  def investigate(processed_source)
42
- heredoc_lines = extract_heredoc_lines(processed_source.ast)
43
-
44
41
  processed_source.each_comment do |comment|
45
- location = comment.location
46
- line_position = location.line
47
- line = processed_source.lines[line_position - 1]
48
- next if heredoc_lines.any? { |r| r.include?(line_position) }
49
- next unless offensive?(line)
50
-
51
- range = source_range(processed_source.buffer,
52
- line_position,
53
- (location.column)...(location.last_column))
54
-
55
- add_offense(range, location: range)
42
+ add_offense(comment) if offensive?(comment)
56
43
  end
57
44
  end
58
45
 
59
46
  private
60
47
 
61
48
  KEYWORDS = %w[begin class def end module].freeze
62
- ALLOWED_COMMENTS = %w[:nodoc: :yields: rubocop:disable].freeze
49
+ ALLOWED_COMMENTS = %w[
50
+ :nodoc:
51
+ :yields:
52
+ rubocop:disable
53
+ rubocop:todo
54
+ ].freeze
63
55
 
64
- def offensive?(line)
65
- line = line.lstrip
66
- KEYWORDS.any? { |word| line =~ /^#{word}\s/ } &&
56
+ def offensive?(comment)
57
+ line = line(comment)
58
+ KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
67
59
  ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
68
60
  end
69
61
 
70
- def message(node)
71
- line = node.source_line
72
- keyword = /^\s*(\S+).*#/.match(line)[1]
62
+ def message(comment)
63
+ keyword = line(comment).match(/(\S+).*#/)[1]
73
64
  format(MSG, keyword: keyword)
74
65
  end
75
66
 
76
- def extract_heredoc_lines(ast)
77
- return [] unless ast
78
-
79
- ast.each_node(:str, :dstr, :xstr).select(&:heredoc?).map do |node|
80
- body = node.location.heredoc_body
81
- (body.first_line...body.last_line)
82
- end
67
+ def line(comment)
68
+ comment.location.expression.source_line
83
69
  end
84
70
  end
85
71
  end
@@ -68,16 +68,16 @@ module RuboCop
68
68
  private
69
69
 
70
70
  def expand_elsif(node, elsif_branches = [])
71
- return [] if node.nil? || !node.if_type?
71
+ return [] if node.nil? || !node.if_type? || !node.elsif?
72
72
 
73
73
  elsif_branches << node.if_branch
74
74
 
75
- if node.else_branch&.if_type?
76
- expand_elsif(node.else_branch, elsif_branches)
75
+ else_branch = node.else_branch
76
+ if else_branch&.if_type? && else_branch&.elsif?
77
+ expand_elsif(else_branch, elsif_branches)
77
78
  else
78
- elsif_branches << node.else_branch
79
+ elsif_branches << else_branch
79
80
  end
80
- elsif_branches
81
81
  end
82
82
 
83
83
  def lhs_for_send(node)
@@ -219,11 +219,9 @@ module RuboCop
219
219
  SINGLE_LINE_CONDITIONS_ONLY = 'SingleLineConditionsOnly'
220
220
  WIDTH = 'Width'
221
221
 
222
- def_node_matcher :condition?, '{if case}'
223
-
224
222
  # The shovel operator `<<` does not have its own type. It is a `send`
225
223
  # type.
226
- def_node_matcher :assignment_type?, <<-PATTERN
224
+ def_node_matcher :assignment_type?, <<~PATTERN
227
225
  {
228
226
  #{ASSIGNMENT_TYPES.join(' ')}
229
227
  (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq?} ...)
@@ -596,7 +594,8 @@ module RuboCop
596
594
 
597
595
  remove_whitespace_in_branches(corrector, branch, condition, column)
598
596
 
599
- branch_else = branch.parent.loc.else
597
+ return unless (branch_else = branch.parent.loc.else)
598
+
600
599
  corrector.remove_preceding(branch_else, branch_else.column - column)
601
600
  end
602
601
  end
@@ -46,7 +46,14 @@ module RuboCop
46
46
  end
47
47
 
48
48
  def class_or_module_scope?(node)
49
- node.parent && %i[class module].include?(node.parent.type)
49
+ return false unless node.parent
50
+
51
+ case node.parent.type
52
+ when :begin
53
+ class_or_module_scope?(node.parent)
54
+ when :class, :module
55
+ true
56
+ end
50
57
  end
51
58
 
52
59
  def visibility_declaration?(node)
@@ -57,9 +64,13 @@ module RuboCop
57
64
  end
58
65
  end
59
66
 
60
- def_node_matcher :visibility_declaration_for?, <<-PATTERN
61
- (send nil? {:public_constant :private_constant} ({sym str} %1))
67
+ def_node_matcher :visibility_declaration_for?, <<~PATTERN
68
+ (send nil? {:public_constant :private_constant} ({sym str} #match_name?(%1)))
62
69
  PATTERN
70
+
71
+ def match_name?(name, constant_name)
72
+ name.to_sym == constant_name.to_sym
73
+ end
63
74
  end
64
75
  end
65
76
  end