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
@@ -55,7 +55,7 @@ module RuboCop
55
55
  private
56
56
 
57
57
  def register_offense(node)
58
- add_offense(node, :keyword)
58
+ add_offense(node, location: :keyword)
59
59
  end
60
60
  end
61
61
  end
@@ -95,7 +95,7 @@ module RuboCop
95
95
  PATTERN
96
96
 
97
97
  def_node_matcher :class_or_module_or_struct_new_call?, <<-PATTERN
98
- (block (send (const nil {:Class :Module :Struct}) :new ...) ...)
98
+ (block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
99
99
  PATTERN
100
100
  end
101
101
  end
@@ -59,7 +59,7 @@ module RuboCop
59
59
  next if args_node.children.empty?
60
60
 
61
61
  if chained_send?(send_node)
62
- add_offense(return_node, :keyword)
62
+ add_offense(return_node, location: :keyword)
63
63
  break
64
64
  end
65
65
  end
@@ -75,7 +75,7 @@ module RuboCop
75
75
  !return_node.children.empty?
76
76
  end
77
77
 
78
- def_node_matcher :chained_send?, '(send !nil ...)'
78
+ def_node_matcher :chained_send?, '(send !nil? ...)'
79
79
  def_node_matcher :define_method?, <<-PATTERN
80
80
  (send _ {:define_method :define_singleton_method} _)
81
81
  PATTERN
@@ -29,8 +29,9 @@ module RuboCop
29
29
  space_length = spaces_before_left_parenthesis(node)
30
30
  return unless space_length > 0
31
31
 
32
- add_offense(nil, space_range(node.first_argument.source_range,
33
- space_length))
32
+ range = space_range(node.first_argument.source_range, space_length)
33
+
34
+ add_offense(nil, location: range)
34
35
  end
35
36
 
36
37
  private
@@ -44,7 +44,7 @@ module RuboCop
44
44
 
45
45
  def contains_quotes_or_commas?(node)
46
46
  node.values.any? do |value|
47
- literal = scrub_string(value.children.first.to_s)
47
+ literal = value.children.first.to_s.scrub
48
48
 
49
49
  # To avoid likely false positives (e.g. a single ' or ")
50
50
  next if literal.gsub(/[^\p{Alnum}]/, '').empty?
@@ -25,7 +25,7 @@ module RuboCop
25
25
  'Perhaps you meant `rand(2)` or `rand`?'.freeze
26
26
 
27
27
  def_node_matcher :rand_one?, <<-PATTERN
28
- (send {(const nil :Kernel) nil} :rand {(int {-1 1}) (float {-1.0 1.0})})
28
+ (send {(const nil? :Kernel) nil?} :rand {(int {-1 1}) (float {-1.0 1.0})})
29
29
  PATTERN
30
30
 
31
31
  def on_send(node)
@@ -41,7 +41,7 @@ module RuboCop
41
41
 
42
42
  def on_block(node)
43
43
  redundant_with_index?(node) do |send|
44
- add_offense(node, with_index_range(send))
44
+ add_offense(node, location: with_index_range(send))
45
45
  end
46
46
  end
47
47
 
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for redundant `with_object`.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # ary.each_with_object([]) do |v|
11
+ # v
12
+ # end
13
+ #
14
+ # # good
15
+ # ary.each do |v|
16
+ # v
17
+ # end
18
+ #
19
+ # # bad
20
+ # ary.each.with_object([]) do |v|
21
+ # v
22
+ # end
23
+ #
24
+ # # good
25
+ # ary.each do |v|
26
+ # v
27
+ # end
28
+ #
29
+ class RedundantWithObject < Cop
30
+ MSG_EACH_WITH_OBJECT = 'Use `each` instead of `each_with_object`.'
31
+ .freeze
32
+ MSG_WITH_OBJECT = 'Remove redundant `with_object`.'.freeze
33
+
34
+ def_node_matcher :redundant_with_object?, <<-PATTERN
35
+ (block
36
+ $(send _ {:each_with_object :with_object}
37
+ (_))
38
+ (args
39
+ (arg _))
40
+ ...)
41
+ PATTERN
42
+
43
+ def on_block(node)
44
+ redundant_with_object?(node) do |send|
45
+ add_offense(node, location: with_object_range(send))
46
+ end
47
+ end
48
+
49
+ def autocorrect(node)
50
+ lambda do |corrector|
51
+ redundant_with_object?(node) do |send|
52
+ if send.method_name == :each_with_object
53
+ corrector.replace(with_object_range(send), 'each')
54
+ else
55
+ corrector.remove(with_object_range(send))
56
+ corrector.remove(send.loc.dot)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def message(node)
65
+ if node.method_name == :each_with_object
66
+ MSG_EACH_WITH_OBJECT
67
+ else
68
+ MSG_WITH_OBJECT
69
+ end
70
+ end
71
+
72
+ def with_object_range(send)
73
+ range_between(
74
+ send.loc.selector.begin_pos,
75
+ send.source.length
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for regexp literals used as `match-current-line`.
7
+ # If a regexp literal is in condition, the regexp matches `$_` implicitly.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # if /foo/
12
+ # do_something
13
+ # end
14
+ #
15
+ # # good
16
+ # if /foo/ =~ $_
17
+ # do_something
18
+ # end
19
+ class RegexpAsCondition < Cop
20
+ MSG = 'Do not use regexp literal as a condition.' \
21
+ ' The regexp literal matches `$_` implicitly.'.freeze
22
+
23
+ def on_match_current_line(node)
24
+ add_offense(node)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  range = range_between(node.source_range.begin_pos,
48
48
  ternary.condition.source_range.end_pos)
49
49
 
50
- add_offense(range, range)
50
+ add_offense(range, location: range)
51
51
  end
52
52
 
53
53
  def check_predicate(predicate, node)
@@ -48,9 +48,11 @@ module RuboCop
48
48
  invalid_exceptions = invalid_exceptions(exceptions)
49
49
  return if invalid_exceptions.empty?
50
50
 
51
- add_offense(node,
52
- node.loc.keyword.join(rescued.loc.expression),
53
- format(MSG, invalid_exceptions.map(&:source).join(', ')))
51
+ add_offense(
52
+ node,
53
+ location: node.loc.keyword.join(rescued.loc.expression),
54
+ message: format(MSG, invalid_exceptions.map(&:source).join(', '))
55
+ )
54
56
  end
55
57
 
56
58
  private
@@ -21,16 +21,19 @@ module RuboCop
21
21
  # bar
22
22
  # end
23
23
  class RescueWithoutErrorClass < Cop
24
+ include RescueNode
25
+
24
26
  MSG = 'Avoid rescuing without specifying an error class.'.freeze
25
27
 
26
28
  def_node_matcher :rescue_without_error_class?, <<-PATTERN
27
- (resbody nil ...)
29
+ (resbody nil? _ _)
28
30
  PATTERN
29
31
 
30
32
  def on_resbody(node)
31
- return unless rescue_without_error_class?(node)
33
+ return unless rescue_without_error_class?(node) &&
34
+ !rescue_modifier?(node)
32
35
 
33
- add_offense(node, :keyword)
36
+ add_offense(node, location: :keyword)
34
37
  end
35
38
  end
36
39
  end
@@ -33,29 +33,40 @@ module RuboCop
33
33
  # end
34
34
  class ReturnInVoidContext < Cop
35
35
  MSG = 'Do not return a value in `%s`.'.freeze
36
+
36
37
  def on_return(return_node)
37
- method_name = method_name(return_node)
38
- return unless method_name && return_node.descendants.any? &&
39
- useless_return_method?(method_name)
38
+ return unless return_node.descendants.any?
39
+
40
+ context_node = non_void_context(return_node)
41
+
42
+ return unless context_node && context_node.def_type?
40
43
 
41
- add_offense(return_node, :keyword, format(message, method_name))
44
+ method_name = method_name(context_node)
45
+
46
+ return unless method_name && void_context_method?(method_name)
47
+
48
+ add_offense(return_node,
49
+ location: :keyword,
50
+ message: format(message, method_name))
42
51
  end
43
52
 
44
53
  private
45
54
 
46
- def method_name(return_node)
47
- method_node = return_node.each_ancestor(:block, :def, :defs).first
48
- return nil unless method_node.def_type?
49
- method_node.children.first
55
+ def non_void_context(return_node)
56
+ return_node.each_ancestor(:block, :def, :defs).first
50
57
  end
51
58
 
52
- def method_setter?(method_name)
53
- method_name.to_s.end_with?('=') &&
54
- !AST::Node::COMPARISON_OPERATORS.include?(method_name)
59
+ def method_name(context_node)
60
+ context_node.children.first
61
+ end
62
+
63
+ def void_context_method?(method_name)
64
+ method_name == :initialize || setter_method?(method_name)
55
65
  end
56
66
 
57
- def useless_return_method?(method_name)
58
- method_name == :initialize || method_setter?(method_name)
67
+ def setter_method?(method_name)
68
+ method_name.to_s.end_with?('=') &&
69
+ !AST::Node::COMPARISON_OPERATORS.include?(method_name)
59
70
  end
60
71
  end
61
72
  end
@@ -41,7 +41,7 @@ module RuboCop
41
41
 
42
42
  loc = node.loc.dot || :selector
43
43
 
44
- add_offense(node, loc)
44
+ add_offense(node, location: loc)
45
45
  end
46
46
  end
47
47
 
@@ -15,7 +15,7 @@ module RuboCop
15
15
  return if executable?(processed_source)
16
16
  comment = processed_source.comments[0]
17
17
  message = format_message_from(processed_source)
18
- add_offense(comment, :expression, message)
18
+ add_offense(comment, message: message)
19
19
  end
20
20
 
21
21
  def autocorrect(node)
@@ -19,8 +19,6 @@ module RuboCop
19
19
  # handle_standard_error
20
20
  # end
21
21
  #
22
- # @example
23
- #
24
22
  # # good
25
23
  #
26
24
  # begin
@@ -30,6 +28,21 @@ module RuboCop
30
28
  # rescue Exception
31
29
  # handle_exception
32
30
  # end
31
+ #
32
+ # # good, however depending on runtime environment.
33
+ # #
34
+ # # This is a special case for system call errors.
35
+ # # System dependent error code depends on runtime environment.
36
+ # # For example, whether `Errno::EAGAIN` and `Errno::EWOULDBLOCK` are
37
+ # # the same error code or different error code depends on environment.
38
+ # # This good case is for `Errno::EAGAIN` and `Errno::EWOULDBLOCK` with
39
+ # # the same error code.
40
+ # begin
41
+ # something
42
+ # rescue Errno::EAGAIN, Errno::EWOULDBLOCK
43
+ # handle_standard_error
44
+ # end
45
+ #
33
46
  class ShadowedException < Cop
34
47
  include RescueNode
35
48
 
@@ -51,7 +64,7 @@ module RuboCop
51
64
  return if !rescue_group_rescues_multiple_levels &&
52
65
  sorted?(rescued_groups)
53
66
 
54
- add_offense(node, offense_range(rescues))
67
+ add_offense(node, location: offense_range(rescues))
55
68
  end
56
69
 
57
70
  private
@@ -77,7 +90,27 @@ module RuboCop
77
90
  return !(group.size == 2 && group.include?(NilClass))
78
91
  end
79
92
 
80
- group.combination(2).any? { |a, b| a && b && a <=> b }
93
+ group.combination(2).any? do |a, b|
94
+ compare_exceptions(a, b)
95
+ end
96
+ end
97
+
98
+ def compare_exceptions(exception, other_exception)
99
+ if system_call_err?(exception) && system_call_err?(other_exception)
100
+ # This condition logic is for special case.
101
+ # System dependent error code depends on runtime environment.
102
+ # For example, whether `Errno::EAGAIN` and `Errno::EWOULDBLOCK` are
103
+ # the same error code or different error code depends on runtime
104
+ # environment. This checks the error code for that.
105
+ exception.const_get(:Errno) != other_exception.const_get(:Errno) &&
106
+ exception <=> other_exception
107
+ else
108
+ exception && other_exception && exception <=> other_exception
109
+ end
110
+ end
111
+
112
+ def system_call_err?(error)
113
+ error && error.ancestors[1] == SystemCallError
81
114
  end
82
115
 
83
116
  def evaluate_exceptions(rescue_group)
@@ -116,12 +149,6 @@ module RuboCop
116
149
  def rescued_exceptions(rescue_group)
117
150
  klasses = *rescue_group
118
151
  klasses.map do |klass|
119
- # `rescue nil` is valid syntax in all versions of Ruby. In Ruby
120
- # 1.9.3, it effectively disables the `rescue`. In versions
121
- # after 1.9.3, a `TypeError` is thrown when the statement is
122
- # rescued. In order to account for this, we convert `nil` to
123
- # `NilClass`.
124
- next 'NilClass' if klass.nil_type?
125
152
  next unless klass.const_type?
126
153
  klass.source
127
154
  end.compact
@@ -45,7 +45,7 @@ module RuboCop
45
45
  return unless outer_local_variable
46
46
 
47
47
  message = format(MSG, variable.name)
48
- add_offense(variable.declaration_node, :expression, message)
48
+ add_offense(variable.declaration_node, message: message)
49
49
  end
50
50
  end
51
51
  end
@@ -29,7 +29,7 @@ module RuboCop
29
29
  next unless final_node && final_node.send_type? &&
30
30
  final_node.method?(:to_s) && !final_node.arguments?
31
31
 
32
- add_offense(final_node, :selector)
32
+ add_offense(final_node, location: :selector)
33
33
  end
34
34
  end
35
35
 
@@ -31,12 +31,18 @@ module RuboCop
31
31
  message =
32
32
  "#{diagnostic.message}\n(Using Ruby #{ruby_version} parser; " \
33
33
  'configure using `TargetRubyVersion` parameter, under `AllCops`)'
34
- add_offense(nil, diagnostic.location, message, diagnostic.level)
34
+ add_offense(nil,
35
+ location: diagnostic.location,
36
+ message: message,
37
+ severity: diagnostic.level)
35
38
  end
36
39
 
37
40
  def add_offense_from_error(error)
38
41
  message = beautify_message(error.message)
39
- add_offense(nil, ERROR_SOURCE_RANGE, message, :fatal)
42
+ add_offense(nil,
43
+ location: ERROR_SOURCE_RANGE,
44
+ message: message,
45
+ severity: :fatal)
40
46
  end
41
47
 
42
48
  private
@@ -54,7 +54,7 @@ module RuboCop
54
54
  node.loc.name
55
55
  end
56
56
 
57
- add_offense(nil, location)
57
+ add_offense(nil, location: location)
58
58
  end
59
59
  end
60
60
  end