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
@@ -10,7 +10,7 @@ module RuboCop
10
10
  def_node_matcher :case_equality?, '(send _ :=== _)'
11
11
 
12
12
  def on_send(node)
13
- case_equality?(node) { add_offense(node, :selector) }
13
+ case_equality?(node) { add_offense(node, location: :selector) }
14
14
  end
15
15
  end
16
16
  end
@@ -48,12 +48,12 @@ module RuboCop
48
48
 
49
49
  def check_nested_style(node)
50
50
  return unless compact_node_name?(node)
51
- add_offense(node, :name, NESTED_MSG)
51
+ add_offense(node, location: :name, message: NESTED_MSG)
52
52
  end
53
53
 
54
54
  def check_compact_style(node, body)
55
55
  return unless one_child?(body) && !compact_node_name?(node)
56
- add_offense(node, :name, COMPACT_MSG)
56
+ add_offense(node, location: :name, message: COMPACT_MSG)
57
57
  end
58
58
 
59
59
  def one_child?(body)
@@ -15,7 +15,7 @@ module RuboCop
15
15
  class_check?(node) do |method_name|
16
16
  return if style == method_name
17
17
 
18
- add_offense(node, :selector)
18
+ add_offense(node, location: :selector)
19
19
  end
20
20
  end
21
21
 
@@ -51,7 +51,8 @@ module RuboCop
51
51
  return unless name == definee
52
52
 
53
53
  _, class_name = *definee
54
- add_offense(definee, :name, message(class_name, method_name))
54
+ add_offense(definee, location: :name,
55
+ message: message(class_name, method_name))
55
56
  end
56
57
 
57
58
  def message(class_name, method_name)
@@ -10,7 +10,7 @@ module RuboCop
10
10
  MSG = 'Replace class var %s with a class instance var.'.freeze
11
11
 
12
12
  def on_cvasgn(node)
13
- add_offense(node, :name)
13
+ add_offense(node, location: :name)
14
14
  end
15
15
 
16
16
  def message(node)
@@ -41,7 +41,7 @@ module RuboCop
41
41
  def check_method_node(node)
42
42
  return unless preferred_methods[node.method_name]
43
43
 
44
- add_offense(node, :selector)
44
+ add_offense(node, location: :selector)
45
45
  end
46
46
  end
47
47
  end
@@ -10,7 +10,7 @@ module RuboCop
10
10
 
11
11
  def_node_matcher :java_type_node?, <<-PATTERN
12
12
  (send
13
- (const nil :Java)
13
+ (const nil? :Java)
14
14
  {:boolean :byte :char :double :float :int :long :short})
15
15
  PATTERN
16
16
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
  return unless node.receiver && node.double_colon?
22
22
  return if node.camel_case_method?
23
23
 
24
- add_offense(node, :dot)
24
+ add_offense(node, location: :dot)
25
25
  end
26
26
 
27
27
  def autocorrect(node)
@@ -23,8 +23,11 @@ module RuboCop
23
23
  !correct_annotation?(first_word, colon, space, note)
24
24
 
25
25
  length = concat_length(first_word, colon, space)
26
- add_offense(comment, annotation_range(comment, margin, length),
27
- format(note ? MSG : MISSING_NOTE, first_word))
26
+ add_offense(
27
+ comment,
28
+ location: annotation_range(comment, margin, length),
29
+ message: format(note ? MSG : MISSING_NOTE, first_word)
30
+ )
28
31
  end
29
32
  end
30
33
 
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for comments put on the same line as some keywords.
7
+ # These keywords are: `begin`, `class`, `def`, `end`, `module`.
8
+ #
9
+ # Note that some comments (such as `:nodoc:` and `rubocop:disable`) are
10
+ # allowed.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # if condition
15
+ # statement
16
+ # end # end if
17
+ #
18
+ # # bad
19
+ # class X # comment
20
+ # statement
21
+ # end
22
+ #
23
+ # # bad
24
+ # def x; end # comment
25
+ #
26
+ # # good
27
+ # if condition
28
+ # statement
29
+ # end
30
+ #
31
+ # # good
32
+ # class x # :nodoc:
33
+ # y
34
+ # end
35
+ class CommentedKeyword < Cop
36
+ MSG = 'Do not place comments on the same line as the ' \
37
+ '`%s` keyword.'.freeze
38
+
39
+ def investigate(processed_source)
40
+ heredoc_lines = extract_heredoc_lines(processed_source.ast)
41
+
42
+ processed_source.lines.each_with_index do |line, index|
43
+ next if heredoc_lines.any? { |r| r.include?(index + 1) }
44
+ next unless offensive?(line)
45
+
46
+ range = source_range(processed_source.buffer,
47
+ index + 1,
48
+ (line.index('#'))...(line.length))
49
+
50
+ add_offense(range, location: range)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ KEYWORDS = %w[begin class def end module].freeze
57
+ ALLOWED_COMMENTS = %w[:nodoc: rubocop:disable].freeze
58
+
59
+ def offensive?(line)
60
+ KEYWORDS.any? { |k| line =~ /^\s*#{k}\s+.*#/ } &&
61
+ ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
62
+ end
63
+
64
+ def message(node)
65
+ line = node.source_line
66
+ keyword = /^\s*(\S+).*#/.match(line)[1]
67
+ format(MSG, keyword)
68
+ end
69
+
70
+ def extract_heredoc_lines(ast)
71
+ return [] unless ast
72
+ ast.each_node.with_object([]) do |node, heredocs|
73
+ next unless node.location.is_a?(Parser::Source::Map::Heredoc)
74
+ body = node.location.heredoc_body
75
+ heredocs << (body.first_line...body.last_line)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -283,7 +283,7 @@ module RuboCop
283
283
  return unless else_branch
284
284
  return if allowed_single_line?([*branches, else_branch])
285
285
 
286
- add_offense(node, :expression, ASSIGN_TO_CONDITION_MSG)
286
+ add_offense(node, message: ASSIGN_TO_CONDITION_MSG)
287
287
  end
288
288
 
289
289
  def candidate_node?(node)
@@ -26,7 +26,7 @@ module RuboCop
26
26
  return if notice_found?(processed_source)
27
27
  range = source_range(processed_source.buffer, 1, 0)
28
28
  add_offense(insert_notice_before(processed_source),
29
- range, MSG % notice)
29
+ location: range, message: MSG % notice)
30
30
  end
31
31
 
32
32
  private
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for uses of `DateTime` that should be replaced by
7
+ # `Date` or `Time`.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad - uses `DateTime` for current time
12
+ # DateTime.now
13
+ #
14
+ # # good - uses `Time` for current time
15
+ # Time.now
16
+ #
17
+ # # bad - uses `DateTime` for modern date
18
+ # DateTime.iso8601('2016-06-29')
19
+ #
20
+ # # good - uses `Date` for modern date
21
+ # Date.iso8601('2016-06-29')
22
+ #
23
+ # # good - uses `DateTime` with start argument for historical date
24
+ # DateTime.iso8601('1751-04-23', Date::ENGLAND)
25
+ class DateTime < Cop
26
+ MSG = 'Prefer Date or Time over DateTime.'.freeze
27
+
28
+ def_node_matcher :date_time?, <<-PATTERN
29
+ (send (const _ :DateTime) ...)
30
+ PATTERN
31
+
32
+ def_node_matcher :historic_date?, <<-PATTERN
33
+ (send _ _ _ (const (const _ :Date) _))
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ return unless date_time?(node)
38
+ return if historic_date?(node)
39
+ add_offense(node)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -14,7 +14,7 @@ module RuboCop
14
14
  return if node.single_line?
15
15
  return unless !node.arguments? && node.arguments.loc.begin
16
16
 
17
- add_offense(node.arguments, :begin)
17
+ add_offense(node.arguments, location: :begin)
18
18
  end
19
19
  alias on_defs on_def
20
20
 
@@ -17,18 +17,14 @@ module RuboCop
17
17
  # # good
18
18
  # path = __dir__
19
19
  class Dir < Cop
20
- extend TargetRubyVersion
21
-
22
20
  MSG = 'Use `__dir__` to get an absolute path to the current ' \
23
21
  "file's directory.".freeze
24
22
 
25
23
  def_node_matcher :dir_replacement?, <<-PATTERN
26
- {(send (const nil :File) :expand_path (send (const nil :File) :dirname #file_keyword?))
27
- (send (const nil :File) :dirname (send (const nil :File) :realpath #file_keyword?))}
24
+ {(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
25
+ (send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
28
26
  PATTERN
29
27
 
30
- minimum_target_ruby_version 2.0
31
-
32
28
  def on_send(node)
33
29
  dir_replacement?(node) do
34
30
  add_offense(node)
@@ -38,7 +38,7 @@ module RuboCop
38
38
  return if namespace?(body)
39
39
  return if documentation_comment?(node) || nodoc_comment?(node)
40
40
 
41
- add_offense(node, :keyword, format(MSG, type))
41
+ add_offense(node, location: :keyword, message: format(MSG, type))
42
42
  end
43
43
 
44
44
  def namespace?(node)
@@ -27,7 +27,7 @@ module RuboCop
27
27
  def on_send(node)
28
28
  return unless double_negative?(node) && node.keyword_bang?
29
29
 
30
- add_offense(node, :selector)
30
+ add_offense(node, location: :selector)
31
31
  end
32
32
  end
33
33
  end
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  range = send_node.receiver.source_range.join(send_node.loc.selector)
35
35
 
36
- add_offense(node, range)
36
+ add_offense(node, location: range)
37
37
  end
38
38
 
39
39
  private
@@ -34,7 +34,8 @@ module RuboCop
34
34
  return unless first_argument_returned?(args, return_value)
35
35
  return if accumulator_param_assigned_to?(body, args)
36
36
 
37
- add_offense(node, method.loc.selector, format(MSG, method_name))
37
+ add_offense(node, location: method.loc.selector,
38
+ message: format(MSG, method_name))
38
39
  end
39
40
  end
40
41
 
@@ -42,7 +42,7 @@ module RuboCop
42
42
  def on_case(case_node)
43
43
  return if case_node.condition
44
44
 
45
- add_offense(case_node, :keyword)
45
+ add_offense(case_node, location: :keyword)
46
46
  end
47
47
 
48
48
  private
@@ -101,13 +101,13 @@ module RuboCop
101
101
  def empty_check(node)
102
102
  return unless node.else? && !node.else_branch
103
103
 
104
- add_offense(node, :else)
104
+ add_offense(node, location: :else)
105
105
  end
106
106
 
107
107
  def nil_check(node)
108
108
  return unless node.else_branch && node.else_branch.nil_type?
109
109
 
110
- add_offense(node, :else)
110
+ add_offense(node, location: :else)
111
111
  end
112
112
 
113
113
  def autocorrect(node)
@@ -12,23 +12,23 @@ module RuboCop
12
12
  HASH_MSG = 'Use hash literal `{}` instead of `Hash.new`.'.freeze
13
13
  STR_MSG = 'Use string literal `%s` instead of `String.new`.'.freeze
14
14
 
15
- def_node_matcher :array_node, '(send (const nil :Array) :new)'
16
- def_node_matcher :hash_node, '(send (const nil :Hash) :new)'
17
- def_node_matcher :str_node, '(send (const nil :String) :new)'
15
+ def_node_matcher :array_node, '(send (const nil? :Array) :new)'
16
+ def_node_matcher :hash_node, '(send (const nil? :Hash) :new)'
17
+ def_node_matcher :str_node, '(send (const nil? :String) :new)'
18
18
  def_node_matcher :array_with_block,
19
- '(block (send (const nil :Array) :new) args _)'
19
+ '(block (send (const nil? :Array) :new) args _)'
20
20
  def_node_matcher :hash_with_block,
21
- '(block (send (const nil :Hash) :new) args _)'
21
+ '(block (send (const nil? :Hash) :new) args _)'
22
22
 
23
23
  def on_send(node)
24
- add_offense(node, :expression, ARR_MSG) if offense_array_node?(node)
25
- add_offense(node, :expression, HASH_MSG) if offense_hash_node?(node)
24
+ add_offense(node, message: ARR_MSG) if offense_array_node?(node)
25
+ add_offense(node, message: HASH_MSG) if offense_hash_node?(node)
26
26
 
27
27
  str_node(node) do
28
28
  return if frozen_string_literals_enabled?
29
29
 
30
- add_offense(node, :expression,
31
- format(STR_MSG, preferred_string_literal))
30
+ add_offense(node,
31
+ message: format(STR_MSG, preferred_string_literal))
32
32
  end
33
33
  end
34
34
 
@@ -3,23 +3,10 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks whether the source file has a utf-8 encoding
7
- # comment or not.
8
- # Setting this check to "always" and "when_needed" makes sense only
9
- # for code that should support Ruby 1.9, since in 2.0+ utf-8 is the
10
- # default source file encoding. There are three styles:
11
- #
12
- # when_needed - only enforce an encoding comment if there are non ASCII
13
- # characters, otherwise report an offense
14
- # always - enforce encoding comment in all files
15
- # never - enforce no encoding comment in all files
6
+ # This cop checks ensures source files have no utf-8 encoding comments.
16
7
  class Encoding < Cop
17
- include ConfigurableEnforcedStyle
18
-
19
- MSG_MISSING = 'Missing utf-8 encoding comment.'.freeze
20
8
  MSG_UNNECESSARY = 'Unnecessary utf-8 encoding comment.'.freeze
21
9
  ENCODING_PATTERN = /#.*coding\s?[:=]\s?(?:UTF|utf)-8/
22
- AUTO_CORRECT_ENCODING_COMMENT = 'AutoCorrectEncodingComment'.freeze
23
10
  SHEBANG = '#!'.freeze
24
11
 
25
12
  def investigate(processed_source)
@@ -29,56 +16,25 @@ module RuboCop
29
16
  return unless (@message = offense(processed_source, line_number))
30
17
 
31
18
  range = processed_source.buffer.line_range(line_number + 1)
32
- add_offense(range, range, @message)
19
+ add_offense(range, location: range, message: @message)
33
20
  end
34
21
 
35
22
  def autocorrect(range)
36
- if @message == MSG_MISSING
37
- raise encoding_mismatch_message unless matching_encoding?
38
-
39
- lambda do |corrector|
40
- corrector.insert_before(range, "#{encoding}\n")
41
- end
42
- else
43
- # Need to remove unnecessary encoding comment
44
- lambda do |corrector|
45
- corrector.remove(range_with_surrounding_space(range, :right))
46
- end
23
+ lambda do |corrector|
24
+ corrector.remove(range_with_surrounding_space(range, :right))
47
25
  end
48
26
  end
49
27
 
50
28
  private
51
29
 
52
- def encoding
53
- cop_config[AUTO_CORRECT_ENCODING_COMMENT]
54
- end
55
-
56
- def matching_encoding?
57
- encoding =~ ENCODING_PATTERN
58
- end
59
-
60
- def encoding_mismatch_message
61
- "#{encoding} does not match #{ENCODING_PATTERN}"
62
- end
63
-
64
30
  def offense(processed_source, line_number)
65
31
  line = processed_source[line_number]
66
32
 
67
- if !encoding_present?(line) && !encoding_omitable?
68
- MSG_MISSING
69
- elsif encoding_present?(line) && encoding_omitable?
70
- MSG_UNNECESSARY
71
- end
72
- end
73
-
74
- def encoding_present?(line)
75
- MagicComment.parse(line).encoding
33
+ MSG_UNNECESSARY if encoding_omitable?(line)
76
34
  end
77
35
 
78
- def encoding_omitable?
79
- return true if style == :never
80
-
81
- style != :always && processed_source.buffer.source.ascii_only?
36
+ def encoding_omitable?(line)
37
+ line =~ ENCODING_PATTERN
82
38
  end
83
39
 
84
40
  def encoding_line_number(processed_source)