rubocop 0.50.0 → 0.51.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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -6
  3. data/config/default.yml +20 -11
  4. data/config/enabled.yml +44 -7
  5. data/lib/rubocop.rb +526 -514
  6. data/lib/rubocop/ast/node.rb +9 -9
  7. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +2 -2
  8. data/lib/rubocop/ast/node/send_node.rb +4 -0
  9. data/lib/rubocop/cached_data.rb +1 -6
  10. data/lib/rubocop/cli.rb +7 -6
  11. data/lib/rubocop/config.rb +58 -22
  12. data/lib/rubocop/config_loader.rb +37 -21
  13. data/lib/rubocop/config_loader_resolver.rb +3 -2
  14. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -3
  15. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -2
  16. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -53
  17. data/lib/rubocop/cop/commissioner.rb +1 -4
  18. data/lib/rubocop/cop/cop.rb +50 -17
  19. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +96 -0
  20. data/lib/rubocop/cop/generator.rb +8 -3
  21. data/lib/rubocop/cop/internal_affairs.rb +6 -5
  22. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +81 -0
  23. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  24. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +21 -11
  25. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +27 -14
  26. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +38 -16
  27. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  28. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -1
  29. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  30. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  31. data/lib/rubocop/cop/layout/comment_indentation.rb +4 -2
  32. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  33. data/lib/rubocop/cop/layout/else_alignment.rb +5 -2
  34. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  35. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  36. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  37. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  38. data/lib/rubocop/cop/layout/extra_spacing.rb +2 -2
  39. data/lib/rubocop/cop/layout/indent_array.rb +1 -1
  40. data/lib/rubocop/cop/layout/indent_hash.rb +1 -1
  41. data/lib/rubocop/cop/layout/indent_heredoc.rb +2 -2
  42. data/lib/rubocop/cop/layout/indentation_width.rb +7 -5
  43. data/lib/rubocop/cop/layout/initial_indentation.rb +3 -2
  44. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
  45. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  46. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
  47. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  48. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  49. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  50. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -1
  51. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  53. data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -4
  54. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  55. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  56. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -2
  57. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
  58. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  59. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +5 -2
  60. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -0
  61. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  62. data/lib/rubocop/cop/layout/tab.rb +5 -2
  63. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +4 -2
  64. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  65. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
  66. data/lib/rubocop/cop/lint/block_alignment.rb +1 -1
  67. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  68. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  69. data/lib/rubocop/cop/lint/debugger.rb +7 -7
  70. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  71. data/lib/rubocop/cop/lint/duplicate_methods.rb +5 -3
  72. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  73. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  74. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  75. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  76. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  77. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  78. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -3
  79. data/lib/rubocop/cop/lint/interpolation_check.rb +2 -1
  80. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +19 -5
  81. data/lib/rubocop/cop/lint/loop.rb +1 -1
  82. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  83. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  84. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -2
  85. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  86. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  87. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  88. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  89. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  90. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  91. data/lib/rubocop/cop/lint/rescue_type.rb +5 -3
  92. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +6 -3
  93. data/lib/rubocop/cop/lint/return_in_void_context.rb +24 -13
  94. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  95. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  96. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  97. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  98. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/syntax.rb +8 -2
  100. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  101. data/lib/rubocop/cop/lint/unified_integer.rb +2 -2
  102. data/lib/rubocop/cop/lint/unneeded_disable.rb +11 -4
  103. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +50 -0
  104. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +2 -2
  105. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  106. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  107. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -2
  108. data/lib/rubocop/cop/lint/uri_regexp.rb +3 -3
  109. data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -9
  110. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  111. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  112. data/lib/rubocop/cop/lint/useless_setter_call.rb +5 -1
  113. data/lib/rubocop/cop/lint/void.rb +10 -5
  114. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  115. data/lib/rubocop/cop/metrics/line_length.rb +4 -1
  116. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -2
  117. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  118. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
  119. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  120. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  121. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  122. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -2
  123. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  124. data/lib/rubocop/cop/mixin/enforce_superclass.rb +1 -1
  125. data/lib/rubocop/cop/mixin/heredoc.rb +1 -1
  126. data/lib/rubocop/cop/mixin/method_complexity.rb +3 -4
  127. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  128. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -4
  129. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +63 -0
  130. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  131. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -1
  132. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -1
  133. data/lib/rubocop/cop/mixin/space_inside.rb +1 -1
  134. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  135. data/lib/rubocop/cop/mixin/trailing_comma.rb +5 -5
  136. data/lib/rubocop/cop/mixin/unused_argument.rb +43 -2
  137. data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -7
  138. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  139. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  140. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  141. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  142. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  143. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  144. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -2
  145. data/lib/rubocop/cop/naming/predicate_name.rb +36 -5
  146. data/lib/rubocop/cop/performance/caller.rb +2 -2
  147. data/lib/rubocop/cop/performance/case_when_splat.rb +1 -1
  148. data/lib/rubocop/cop/performance/casecmp.rb +1 -1
  149. data/lib/rubocop/cop/performance/compare_with_block.rb +6 -2
  150. data/lib/rubocop/cop/performance/count.rb +3 -1
  151. data/lib/rubocop/cop/performance/detect.rb +4 -4
  152. data/lib/rubocop/cop/performance/double_start_end_with.rb +6 -9
  153. data/lib/rubocop/cop/performance/end_with.rb +1 -1
  154. data/lib/rubocop/cop/performance/flat_map.rb +3 -1
  155. data/lib/rubocop/cop/performance/hash_each_methods.rb +13 -10
  156. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +3 -1
  157. data/lib/rubocop/cop/performance/range_include.rb +1 -1
  158. data/lib/rubocop/cop/performance/redundant_block_call.rb +1 -1
  159. data/lib/rubocop/cop/performance/redundant_match.rb +6 -5
  160. data/lib/rubocop/cop/performance/redundant_merge.rb +1 -1
  161. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -1
  162. data/lib/rubocop/cop/performance/regexp_match.rb +4 -4
  163. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  164. data/lib/rubocop/cop/performance/sample.rb +1 -1
  165. data/lib/rubocop/cop/performance/size.rb +1 -1
  166. data/lib/rubocop/cop/performance/start_with.rb +1 -1
  167. data/lib/rubocop/cop/performance/string_replacement.rb +2 -2
  168. data/lib/rubocop/cop/performance/times_map.rb +3 -3
  169. data/lib/rubocop/cop/performance/unfreeze_string.rb +2 -2
  170. data/lib/rubocop/cop/performance/uri_default_parser.rb +2 -2
  171. data/lib/rubocop/cop/rails/action_filter.rb +1 -1
  172. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -2
  173. data/lib/rubocop/cop/rails/application_job.rb +1 -1
  174. data/lib/rubocop/cop/rails/application_record.rb +1 -1
  175. data/lib/rubocop/cop/rails/blank.rb +20 -17
  176. data/lib/rubocop/cop/rails/date.rb +7 -6
  177. data/lib/rubocop/cop/rails/delegate.rb +1 -1
  178. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  179. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  180. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
  181. data/lib/rubocop/cop/rails/exit.rb +1 -1
  182. data/lib/rubocop/cop/rails/file_path.rb +6 -8
  183. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  184. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  185. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
  186. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +35 -11
  187. data/lib/rubocop/cop/rails/http_positional_arguments.rb +3 -2
  188. data/lib/rubocop/cop/rails/not_null_column.rb +5 -5
  189. data/lib/rubocop/cop/rails/output.rb +2 -2
  190. data/lib/rubocop/cop/rails/output_safety.rb +2 -1
  191. data/lib/rubocop/cop/rails/present.rb +14 -17
  192. data/lib/rubocop/cop/rails/read_write_attribute.rb +3 -3
  193. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  194. data/lib/rubocop/cop/rails/request_referer.rb +2 -2
  195. data/lib/rubocop/cop/rails/reversible_migration.rb +21 -19
  196. data/lib/rubocop/cop/rails/safe_navigation.rb +2 -2
  197. data/lib/rubocop/cop/rails/save_bang.rb +12 -12
  198. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  199. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  200. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  201. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +3 -1
  202. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  203. data/lib/rubocop/cop/rails/validation.rb +1 -1
  204. data/lib/rubocop/cop/registry.rb +2 -1
  205. data/lib/rubocop/cop/security/eval.rb +2 -2
  206. data/lib/rubocop/cop/security/json_load.rb +2 -2
  207. data/lib/rubocop/cop/security/marshal_load.rb +3 -3
  208. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  209. data/lib/rubocop/cop/style/alias.rb +3 -3
  210. data/lib/rubocop/cop/style/and_or.rb +1 -1
  211. data/lib/rubocop/cop/style/array_join.rb +1 -1
  212. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  213. data/lib/rubocop/cop/style/attr.rb +1 -1
  214. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -2
  215. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  216. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  217. data/lib/rubocop/cop/style/block_delimiters.rb +1 -1
  218. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +22 -19
  219. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  220. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -2
  221. data/lib/rubocop/cop/style/class_check.rb +1 -1
  222. data/lib/rubocop/cop/style/class_methods.rb +2 -1
  223. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  224. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  225. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  226. data/lib/rubocop/cop/style/comment_annotation.rb +5 -2
  227. data/lib/rubocop/cop/style/commented_keyword.rb +81 -0
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  229. data/lib/rubocop/cop/style/copyright.rb +1 -1
  230. data/lib/rubocop/cop/style/date_time.rb +44 -0
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
  232. data/lib/rubocop/cop/style/dir.rb +2 -6
  233. data/lib/rubocop/cop/style/documentation.rb +1 -1
  234. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  235. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  236. data/lib/rubocop/cop/style/each_with_object.rb +2 -1
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  238. data/lib/rubocop/cop/style/empty_else.rb +2 -2
  239. data/lib/rubocop/cop/style/empty_literal.rb +9 -9
  240. data/lib/rubocop/cop/style/encoding.rb +7 -51
  241. data/lib/rubocop/cop/style/end_block.rb +1 -1
  242. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  243. data/lib/rubocop/cop/style/for.rb +6 -2
  244. data/lib/rubocop/cop/style/format_string.rb +4 -3
  245. data/lib/rubocop/cop/style/format_string_token.rb +2 -1
  246. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -3
  247. data/lib/rubocop/cop/style/global_vars.rb +1 -1
  248. data/lib/rubocop/cop/style/guard_clause.rb +2 -2
  249. data/lib/rubocop/cop/style/hash_syntax.rb +2 -3
  250. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  251. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -1
  252. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -1
  253. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -2
  254. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  255. data/lib/rubocop/cop/style/inverse_methods.rb +4 -6
  256. data/lib/rubocop/cop/style/lambda.rb +3 -3
  257. data/lib/rubocop/cop/style/line_end_concatenation.rb +1 -1
  258. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
  259. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  260. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -2
  261. data/lib/rubocop/cop/style/min_max.rb +2 -1
  262. data/lib/rubocop/cop/style/mixin_usage.rb +73 -0
  263. data/lib/rubocop/cop/style/module_function.rb +2 -2
  264. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  265. data/lib/rubocop/cop/style/multiline_if_then.rb +2 -1
  266. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  267. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  268. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  269. data/lib/rubocop/cop/style/next.rb +2 -1
  270. data/lib/rubocop/cop/style/nil_comparison.rb +2 -2
  271. data/lib/rubocop/cop/style/non_nil_check.rb +2 -2
  272. data/lib/rubocop/cop/style/not.rb +1 -1
  273. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -2
  274. data/lib/rubocop/cop/style/option_hash.rb +0 -11
  275. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  276. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
  277. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  278. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  279. data/lib/rubocop/cop/style/proc.rb +1 -1
  280. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  281. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  282. data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
  283. data/lib/rubocop/cop/style/redundant_return.rb +1 -1
  284. data/lib/rubocop/cop/style/regexp_literal.rb +2 -2
  285. data/lib/rubocop/cop/style/return_nil.rb +2 -7
  286. data/lib/rubocop/cop/style/safe_navigation.rb +27 -30
  287. data/lib/rubocop/cop/style/self_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  289. data/lib/rubocop/cop/style/send.rb +1 -1
  290. data/lib/rubocop/cop/style/signal_exception.rb +4 -3
  291. data/lib/rubocop/cop/style/stderr_puts.rb +52 -0
  292. data/lib/rubocop/cop/style/string_literals.rb +4 -3
  293. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  294. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  295. data/lib/rubocop/cop/style/symbol_array.rb +1 -5
  296. data/lib/rubocop/cop/style/symbol_proc.rb +5 -5
  297. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -2
  298. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +46 -23
  299. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -1
  300. data/lib/rubocop/cop/style/variable_interpolation.rb +0 -2
  301. data/lib/rubocop/cop/style/when_then.rb +1 -1
  302. data/lib/rubocop/cop/style/while_until_do.rb +2 -1
  303. data/lib/rubocop/cop/style/while_until_modifier.rb +2 -1
  304. data/lib/rubocop/cop/style/word_array.rb +2 -2
  305. data/lib/rubocop/cop/style/zero_length_predicate.rb +4 -4
  306. data/lib/rubocop/cop/util.rb +1 -12
  307. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  308. data/lib/rubocop/formatter/simple_text_formatter.rb +2 -2
  309. data/lib/rubocop/node_pattern.rb +1 -1
  310. data/lib/rubocop/options.rb +4 -0
  311. data/lib/rubocop/processed_source.rb +2 -8
  312. data/lib/rubocop/rake_task.rb +16 -23
  313. data/lib/rubocop/remote_config.rb +8 -0
  314. data/lib/rubocop/rspec/shared_contexts.rb +0 -8
  315. data/lib/rubocop/rspec/support.rb +5 -5
  316. data/lib/rubocop/version.rb +1 -1
  317. metadata +40 -30
  318. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
@@ -15,11 +15,11 @@ module RuboCop
15
15
  class NilComparison < Cop
16
16
  MSG = 'Prefer the use of the `nil?` predicate.'.freeze
17
17
 
18
- def_node_matcher :nil_comparison?, '(send _ {:== :===} (:nil))'
18
+ def_node_matcher :nil_comparison?, '(send _ {:== :===} nil)'
19
19
 
20
20
  def on_send(node)
21
21
  nil_comparison?(node) do
22
- add_offense(node, :selector)
22
+ add_offense(node, location: :selector)
23
23
  end
24
24
  end
25
25
 
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # !current_user.nil?
25
25
  # end
26
26
  class NonNilCheck < Cop
27
- def_node_matcher :not_equal_to_nil?, '(send _ :!= (:nil))'
27
+ def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
28
28
  def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
29
29
  def_node_matcher :nil_check?, '(send _ :nil?)'
30
30
  def_node_matcher :not_and_nil_check?, '(send (send _ :nil?) :!)'
@@ -33,7 +33,7 @@ module RuboCop
33
33
  return if ignored_node?(node)
34
34
 
35
35
  if not_equal_to_nil?(node)
36
- add_offense(node, :selector)
36
+ add_offense(node, location: :selector)
37
37
  elsif include_semantic_changes? &&
38
38
  (not_and_nil_check?(node) || unless_and_nil_check?(node))
39
39
  add_offense(node)
@@ -19,7 +19,7 @@ module RuboCop
19
19
  def on_send(node)
20
20
  return unless node.keyword_not?
21
21
 
22
- add_offense(node, :selector)
22
+ add_offense(node, location: :selector)
23
23
  end
24
24
 
25
25
  private
@@ -63,8 +63,8 @@ module RuboCop
63
63
 
64
64
  return unless numeric
65
65
 
66
- add_offense(node, :expression,
67
- format(MSG, replacement, node.source))
66
+ add_offense(node,
67
+ message: format(MSG, replacement, node.source))
68
68
  end
69
69
 
70
70
  private
@@ -35,17 +35,6 @@ module RuboCop
35
35
  add_offense(last_arg)
36
36
  end
37
37
 
38
- def validate_config
39
- return unless target_ruby_version < 2.0
40
-
41
- raise ValidationError, 'The `Style/OptionHash` cop is only ' \
42
- 'compatible with Ruby 2.0 and up, but the ' \
43
- 'target Ruby version for your project is ' \
44
- "1.9.\nPlease disable this cop or adjust " \
45
- 'the `TargetRubyVersion` parameter in your ' \
46
- 'configuration.'
47
- end
48
-
49
38
  private
50
39
 
51
40
  def suspicious_name?(arg_name)
@@ -39,7 +39,7 @@ module RuboCop
39
39
 
40
40
  def_node_matcher :unless_assignment?, <<-PATTERN
41
41
  (if
42
- ({lvar ivar cvar gvar} _var) nil
42
+ ({lvar ivar cvar gvar} _var) nil?
43
43
  ({lvasgn ivasgn cvasgn gvasgn} _var
44
44
  _))
45
45
  PATTERN
@@ -115,7 +115,7 @@ module RuboCop
115
115
  end
116
116
  end
117
117
 
118
- def_node_matcher :implicit_self_getter?, '(send nil $_)'
118
+ def_node_matcher :implicit_self_getter?, '(send nil? $_)'
119
119
 
120
120
  # Helper class necessitated by silly design of TSort prior to Ruby 2.1
121
121
  # Newer versions have a better API, but that doesn't help us
@@ -25,7 +25,7 @@ module RuboCop
25
25
  # i.e., if the string would become dynamic or has special characters.
26
26
  return if node.children != parse(corrected(node.source)).ast.children
27
27
 
28
- add_offense(node, :begin)
28
+ add_offense(node, location: :begin)
29
29
  end
30
30
 
31
31
  def correct_literal_style?(node)
@@ -45,7 +45,7 @@ module RuboCop
45
45
  return unless node.arguments.one? &&
46
46
  offending_selector?(node.method_name)
47
47
 
48
- add_offense(node, :selector)
48
+ add_offense(node, location: :selector)
49
49
  end
50
50
 
51
51
  def autocorrect(node)
@@ -9,7 +9,7 @@ module RuboCop
9
9
  MSG = 'Use `proc` instead of `Proc.new`.'.freeze
10
10
 
11
11
  def_node_matcher :proc_new?,
12
- '(block $(send (const nil :Proc) :new) ...)'
12
+ '(block $(send (const nil? :Proc) :new) ...)'
13
13
 
14
14
  def on_block(node)
15
15
  proc_new?(node) do |block_method|
@@ -30,7 +30,7 @@ module RuboCop
30
30
  def on_def(node)
31
31
  return unless node.body && node.body.kwbegin_type?
32
32
 
33
- add_offense(node.body, :begin)
33
+ add_offense(node.body, location: :begin)
34
34
  end
35
35
  alias on_defs on_def
36
36
 
@@ -22,8 +22,8 @@ module RuboCop
22
22
  'just the message.'.freeze
23
23
 
24
24
  def on_send(node)
25
- exploded?(node) { return add_offense(node, :expression, MSG_1) }
26
- compact?(node) { add_offense(node, :expression, MSG_2) }
25
+ exploded?(node) { return add_offense(node, message: MSG_1) }
26
+ compact?(node) { add_offense(node, message: MSG_2) }
27
27
  end
28
28
 
29
29
  # Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
@@ -43,11 +43,11 @@ module RuboCop
43
43
  end
44
44
 
45
45
  def_node_matcher :exploded?, <<-PATTERN
46
- (send nil ${:raise :fail} (const nil :RuntimeError) $_)
46
+ (send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
47
47
  PATTERN
48
48
 
49
49
  def_node_matcher :compact?, <<-PATTERN
50
- (send nil {:raise :fail} $(send (const nil :RuntimeError) :new $_))
50
+ (send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
51
51
  PATTERN
52
52
  end
53
53
  end
@@ -110,7 +110,7 @@ module RuboCop
110
110
  end
111
111
 
112
112
  def offense(node, msg)
113
- add_offense(node, :expression, "Don't use parentheses around #{msg}.")
113
+ add_offense(node, message: "Don't use parentheses around #{msg}.")
114
114
  end
115
115
 
116
116
  def keyword_ancestor?(node)
@@ -83,7 +83,7 @@ module RuboCop
83
83
  return if cop_config['AllowMultipleReturnValues'] &&
84
84
  node.children.size > 1
85
85
 
86
- add_offense(node, :keyword)
86
+ add_offense(node, location: :keyword)
87
87
  end
88
88
 
89
89
  def check_case_node(node)
@@ -47,13 +47,13 @@ module RuboCop
47
47
  def check_slash_literal(node)
48
48
  return if allowed_slash_literal?(node)
49
49
 
50
- add_offense(node, :expression, MSG_USE_PERCENT_R)
50
+ add_offense(node, message: MSG_USE_PERCENT_R)
51
51
  end
52
52
 
53
53
  def check_percent_r_literal(node)
54
54
  return if allowed_percent_r_literal?(node)
55
55
 
56
- add_offense(node, :expression, MSG_USE_SLASHES)
56
+ add_offense(node, message: MSG_USE_SLASHES)
57
57
  end
58
58
 
59
59
  def allowed_slash_literal?(node)
@@ -39,8 +39,7 @@ module RuboCop
39
39
  RETURN_NIL_MSG = 'Use `return nil` instead of `return`.'.freeze
40
40
 
41
41
  def_node_matcher :return_node?, '(return)'
42
- # TODO: fix (return nil) on the NodePattern class
43
- # def_node_matcher :return_nil_node?, '(return nil)'
42
+ def_node_matcher :return_nil_node?, '(return nil)'
44
43
 
45
44
  def on_return(node)
46
45
  # Check Lint/NonLocalExitFromIterator first before this cop
@@ -80,15 +79,11 @@ module RuboCop
80
79
  style == :return_nil && !return_node?(node)
81
80
  end
82
81
 
83
- def return_nil_node?(node)
84
- !node.children.empty? && node.children.first.nil_type?
85
- end
86
-
87
82
  def scoped_node?(node)
88
83
  node.def_type? || node.defs_type? || node.lambda?
89
84
  end
90
85
 
91
- def_node_matcher :chained_send?, '(send !nil ...)'
86
+ def_node_matcher :chained_send?, '(send !nil? ...)'
92
87
  def_node_matcher :define_method?, <<-PATTERN
93
88
  (send _ {:define_method :define_singleton_method} _)
94
89
  PATTERN
@@ -48,7 +48,7 @@ module RuboCop
48
48
 
49
49
  MSG = 'Use safe navigation (`&.`) instead of checking if an object ' \
50
50
  'exists before calling the method.'.freeze
51
- NIL_METHODS = nil.methods.map(&:to_s).freeze
51
+ NIL_METHODS = nil.methods.freeze
52
52
 
53
53
  minimum_target_ruby_version 2.3
54
54
 
@@ -59,12 +59,12 @@ module RuboCop
59
59
  (if {
60
60
  (send $_ {:nil? :!})
61
61
  $_
62
- } nil $_)
62
+ } nil? $_)
63
63
 
64
64
  (if {
65
65
  (send (send $_ :nil?) :!)
66
66
  $_
67
- } $_ nil)
67
+ } $_ nil?)
68
68
  }
69
69
  PATTERN
70
70
 
@@ -119,14 +119,7 @@ module RuboCop
119
119
  checked_variable, receiver =
120
120
  modifier_if_safe_navigation_candidate?(node)
121
121
 
122
- matching_receiver =
123
- find_matching_receiver_invocation(receiver, checked_variable)
124
-
125
- if matching_receiver
126
- method = matching_receiver.parent.loc.selector.source
127
- end
128
-
129
- [checked_variable, matching_receiver, method]
122
+ extract_common_parts(receiver, checked_variable)
130
123
  end
131
124
 
132
125
  def extract_parts_from_and(node)
@@ -136,45 +129,49 @@ module RuboCop
136
129
  not_nil_check?(checked_variable) || checked_variable
137
130
  end
138
131
 
132
+ extract_common_parts(rhs, checked_variable)
133
+ end
134
+
135
+ def extract_common_parts(continuation, checked_variable)
139
136
  matching_receiver =
140
- find_matching_receiver_invocation(rhs, checked_variable)
137
+ find_matching_receiver_invocation(continuation, checked_variable)
141
138
 
142
- if matching_receiver
143
- method = matching_receiver.parent.loc.selector.source
144
- end
139
+ method = matching_receiver.parent if matching_receiver
145
140
 
146
141
  [checked_variable, matching_receiver, method]
147
142
  end
148
143
 
149
144
  def find_matching_receiver_invocation(node, checked_variable)
150
- return nil if node.nil?
145
+ return nil unless node
151
146
 
152
- if node.block_type?
153
- method_call, = *node
154
- receiver, _method = *method_call
155
- elsif node.send_type?
156
- receiver, _method = *node
157
- end
147
+ receiver = if node.block_type?
148
+ node.send_node.receiver
149
+ else
150
+ node.receiver
151
+ end
158
152
 
159
153
  return receiver if receiver == checked_variable
160
154
 
161
155
  find_matching_receiver_invocation(receiver, checked_variable)
162
156
  end
163
157
 
164
- def unsafe_method?(method)
165
- NIL_METHODS.include?(method) || method !~ /\w+[=!?]?/
158
+ def unsafe_method?(send_node)
159
+ NIL_METHODS.include?(send_node.method_name) ||
160
+ negated?(send_node) || !send_node.dot?
161
+ end
162
+
163
+ def negated?(send_node)
164
+ send_node.parent.send_type? && send_node.parent.method?(:!)
166
165
  end
167
166
 
168
167
  def begin_range(node, method_call)
169
- Parser::Source::Range.new(node.loc.expression.source_buffer,
170
- node.loc.expression.begin_pos,
171
- method_call.loc.expression.begin_pos)
168
+ range_between(node.loc.expression.begin_pos,
169
+ method_call.loc.expression.begin_pos)
172
170
  end
173
171
 
174
172
  def end_range(node, method_call)
175
- Parser::Source::Range.new(node.loc.expression,
176
- method_call.loc.expression.end_pos,
177
- node.loc.expression.end_pos)
173
+ range_between(method_call.loc.expression.end_pos,
174
+ node.loc.expression.end_pos)
178
175
  end
179
176
  end
180
177
  end
@@ -52,7 +52,7 @@ module RuboCop
52
52
  target_node = s(var_type, var_name)
53
53
  return unless receiver == target_node
54
54
 
55
- add_offense(node, :expression, format(MSG, method_name))
55
+ add_offense(node, message: format(MSG, method_name))
56
56
  end
57
57
 
58
58
  def check_boolean_node(node, rhs, var_name, var_type)
@@ -62,7 +62,7 @@ module RuboCop
62
62
  return unless first_operand == target_node
63
63
 
64
64
  operator = rhs.loc.operator.source
65
- add_offense(node, :expression, format(MSG, operator))
65
+ add_offense(node, message: format(MSG, operator))
66
66
  end
67
67
 
68
68
  def autocorrect(node)
@@ -57,7 +57,7 @@ module RuboCop
57
57
  range = source_range(@processed_source.buffer, line, column)
58
58
  # Don't attempt to autocorrect if semicolon is separating statements
59
59
  # on the same line
60
- add_offense(autocorrect ? range : nil, range)
60
+ add_offense(autocorrect ? range : nil, location: range)
61
61
  end
62
62
 
63
63
  def autocorrect(range)
@@ -13,7 +13,7 @@ module RuboCop
13
13
  def on_send(node)
14
14
  return unless sending?(node) && node.arguments?
15
15
 
16
- add_offense(node, :selector)
16
+ add_offense(node, location: :selector)
17
17
  end
18
18
  end
19
19
  end
@@ -11,7 +11,7 @@ module RuboCop
11
11
  RAISE_MSG = 'Use `raise` instead of `fail` to ' \
12
12
  'rethrow exceptions.'.freeze
13
13
 
14
- def_node_matcher :kernel_call?, '(send (const nil :Kernel) %1 ...)'
14
+ def_node_matcher :kernel_call?, '(send (const nil? :Kernel) %1 ...)'
15
15
  def_node_search :custom_fail_methods,
16
16
  '{(def :fail ...) (defs _ :fail ...)}'
17
17
 
@@ -77,7 +77,8 @@ module RuboCop
77
77
  each_command_or_kernel_call(method_name, node) do |send_node|
78
78
  next if ignored_node?(send_node)
79
79
 
80
- add_offense(send_node, :selector, message(method_name))
80
+ add_offense(send_node,
81
+ location: :selector, message: message(method_name))
81
82
  ignore_node(send_node)
82
83
  end
83
84
  end
@@ -85,7 +86,7 @@ module RuboCop
85
86
  def check_send(method_name, node)
86
87
  return unless node && command_or_kernel_call?(method_name, node)
87
88
 
88
- add_offense(node, :selector, message(method_name))
89
+ add_offense(node, location: :selector, message: message(method_name))
89
90
  end
90
91
 
91
92
  def command_or_kernel_call?(name, node)
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop identifies places where `$stderr.puts`
7
+ # can be replaced by `warn`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # $stderr.puts('hello')
12
+ #
13
+ # # good
14
+ # warn('hello')
15
+ #
16
+ class StderrPuts < Cop
17
+ MSG = 'Use `warn` instead of `$stderr.puts`.'.freeze
18
+
19
+ def_node_matcher :stderr_puts?, <<-PATTERN
20
+ (send
21
+ (gvar #stderr_gvar?) :puts
22
+ ...)
23
+ PATTERN
24
+
25
+ def on_send(node)
26
+ return unless stderr_puts?(node)
27
+
28
+ add_offense(node, location: stderr_puts_range(node))
29
+ end
30
+
31
+ def autocorrect(node)
32
+ lambda do |corrector|
33
+ corrector.replace(stderr_puts_range(node), 'warn')
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def stderr_gvar?(sym)
40
+ sym == :$stderr
41
+ end
42
+
43
+ def stderr_puts_range(send)
44
+ range_between(
45
+ send.loc.expression.begin_pos,
46
+ send.loc.selector.end_pos
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end