rubocop 0.51.0 → 0.52.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/config/default.yml +86 -10
  4. data/config/disabled.yml +9 -4
  5. data/config/enabled.yml +1105 -1006
  6. data/lib/rubocop.rb +30 -3
  7. data/lib/rubocop/ast/builder.rb +2 -0
  8. data/lib/rubocop/ast/node.rb +24 -2
  9. data/lib/rubocop/ast/node/args_node.rb +17 -0
  10. data/lib/rubocop/ast/node/array_node.rb +1 -1
  11. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  12. data/lib/rubocop/ast/node/send_node.rb +20 -0
  13. data/lib/rubocop/ast/node/str_node.rb +14 -0
  14. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  15. data/lib/rubocop/ast/traversal.rb +4 -4
  16. data/lib/rubocop/cli.rb +45 -4
  17. data/lib/rubocop/comment_config.rb +2 -5
  18. data/lib/rubocop/config.rb +42 -8
  19. data/lib/rubocop/config_loader.rb +39 -100
  20. data/lib/rubocop/config_loader_resolver.rb +99 -2
  21. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  25. data/lib/rubocop/cop/cop.rb +16 -46
  26. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  27. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
  28. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  29. data/lib/rubocop/cop/generator.rb +23 -4
  30. data/lib/rubocop/cop/internal_affairs.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  34. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  36. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
  37. data/lib/rubocop/cop/layout/align_hash.rb +16 -16
  38. data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
  39. data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
  40. data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
  41. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
  44. data/lib/rubocop/cop/layout/dot_position.rb +22 -13
  45. data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
  47. data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  52. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  53. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
  54. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
  55. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  56. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
  59. data/lib/rubocop/cop/layout/indent_array.rb +67 -20
  60. data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
  61. data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
  62. data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
  63. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
  64. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  65. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  69. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
  70. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  71. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
  72. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
  74. data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
  75. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  76. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
  77. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
  78. data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
  79. data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
  80. data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
  81. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  82. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
  83. data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  87. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
  89. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
  90. data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
  91. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  92. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  93. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
  94. data/lib/rubocop/cop/layout/tab.rb +2 -2
  95. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
  96. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
  97. data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
  98. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  99. data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
  100. data/lib/rubocop/cop/lint/else_layout.rb +2 -2
  101. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  102. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
  103. data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
  104. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  105. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  107. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  108. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
  109. data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
  110. data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
  111. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  112. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  113. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  114. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  115. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  116. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  117. data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
  118. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
  119. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
  120. data/lib/rubocop/cop/message_annotator.rb +4 -2
  121. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  122. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  123. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  124. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  125. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  126. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  127. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  128. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  129. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
  130. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  131. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
  132. data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
  134. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  135. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
  138. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  139. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
  140. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
  141. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  142. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  143. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
  145. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
  146. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  147. data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
  148. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
  150. data/lib/rubocop/cop/naming/constant_name.rb +32 -3
  151. data/lib/rubocop/cop/naming/file_name.rb +19 -8
  152. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  153. data/lib/rubocop/cop/naming/method_name.rb +20 -14
  154. data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
  155. data/lib/rubocop/cop/naming/variable_name.rb +17 -2
  156. data/lib/rubocop/cop/naming/variable_number.rb +10 -27
  157. data/lib/rubocop/cop/offense.rb +6 -1
  158. data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
  159. data/lib/rubocop/cop/performance/casecmp.rb +5 -4
  160. data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
  161. data/lib/rubocop/cop/performance/count.rb +5 -4
  162. data/lib/rubocop/cop/performance/detect.rb +7 -4
  163. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
  164. data/lib/rubocop/cop/performance/end_with.rb +2 -2
  165. data/lib/rubocop/cop/performance/flat_map.rb +3 -2
  166. data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
  167. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
  168. data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
  169. data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
  170. data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
  171. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
  172. data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
  173. data/lib/rubocop/cop/performance/size.rb +2 -2
  174. data/lib/rubocop/cop/performance/start_with.rb +2 -2
  175. data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
  176. data/lib/rubocop/cop/performance/times_map.rb +14 -15
  177. data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
  178. data/lib/rubocop/cop/rails/action_filter.rb +22 -0
  179. data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
  180. data/lib/rubocop/cop/rails/application_job.rb +4 -2
  181. data/lib/rubocop/cop/rails/application_record.rb +4 -2
  182. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  183. data/lib/rubocop/cop/rails/delegate.rb +20 -25
  184. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
  185. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  186. data/lib/rubocop/cop/rails/exit.rb +7 -0
  187. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
  188. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
  189. data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
  190. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  191. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  192. data/lib/rubocop/cop/rails/output.rb +9 -0
  193. data/lib/rubocop/cop/rails/output_safety.rb +14 -20
  194. data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
  195. data/lib/rubocop/cop/rails/presence.rb +105 -0
  196. data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
  197. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  198. data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
  199. data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
  200. data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
  201. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  202. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
  203. data/lib/rubocop/cop/rails/validation.rb +7 -7
  204. data/lib/rubocop/cop/security/json_load.rb +4 -2
  205. data/lib/rubocop/cop/security/marshal_load.rb +4 -2
  206. data/lib/rubocop/cop/style/alias.rb +24 -26
  207. data/lib/rubocop/cop/style/and_or.rb +34 -28
  208. data/lib/rubocop/cop/style/array_join.rb +9 -0
  209. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  210. data/lib/rubocop/cop/style/attr.rb +14 -4
  211. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
  212. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  213. data/lib/rubocop/cop/style/block_comments.rb +14 -2
  214. data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
  215. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
  216. data/lib/rubocop/cop/style/case_equality.rb +12 -0
  217. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  218. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
  219. data/lib/rubocop/cop/style/class_check.rb +28 -9
  220. data/lib/rubocop/cop/style/class_methods.rb +8 -8
  221. data/lib/rubocop/cop/style/class_vars.rb +4 -3
  222. data/lib/rubocop/cop/style/collection_methods.rb +4 -2
  223. data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
  224. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  225. data/lib/rubocop/cop/style/command_literal.rb +70 -21
  226. data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
  227. data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
  229. data/lib/rubocop/cop/style/copyright.rb +19 -20
  230. data/lib/rubocop/cop/style/date_time.rb +2 -2
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
  232. data/lib/rubocop/cop/style/dir.rb +2 -2
  233. data/lib/rubocop/cop/style/documentation.rb +17 -2
  234. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  235. data/lib/rubocop/cop/style/each_with_object.rb +5 -5
  236. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  238. data/lib/rubocop/cop/style/empty_else.rb +52 -22
  239. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  240. data/lib/rubocop/cop/style/empty_literal.rb +17 -5
  241. data/lib/rubocop/cop/style/empty_method.rb +4 -10
  242. data/lib/rubocop/cop/style/encoding.rb +2 -1
  243. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  244. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  245. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  246. data/lib/rubocop/cop/style/flip_flop.rb +11 -0
  247. data/lib/rubocop/cop/style/format_string.rb +29 -2
  248. data/lib/rubocop/cop/style/format_string_token.rb +15 -14
  249. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
  250. data/lib/rubocop/cop/style/global_vars.rb +11 -1
  251. data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
  252. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
  253. data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
  254. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
  255. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
  256. data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
  257. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  258. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  259. data/lib/rubocop/cop/style/lambda.rb +23 -31
  260. data/lib/rubocop/cop/style/lambda_call.rb +15 -9
  261. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  262. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
  263. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
  264. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
  265. data/lib/rubocop/cop/style/method_missing.rb +8 -8
  266. data/lib/rubocop/cop/style/min_max.rb +12 -12
  267. data/lib/rubocop/cop/style/missing_else.rb +5 -4
  268. data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
  269. data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
  270. data/lib/rubocop/cop/style/module_function.rb +17 -5
  271. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
  272. data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
  273. data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
  274. data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
  275. data/lib/rubocop/cop/style/negated_if.rb +22 -30
  276. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
  278. data/lib/rubocop/cop/style/next.rb +39 -11
  279. data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
  280. data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
  281. data/lib/rubocop/cop/style/not.rb +14 -4
  282. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
  283. data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
  284. data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
  285. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
  286. data/lib/rubocop/cop/style/option_hash.rb +11 -14
  287. data/lib/rubocop/cop/style/or_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
  289. data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
  290. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
  291. data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
  292. data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
  293. data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
  294. data/lib/rubocop/cop/style/proc.rb +8 -0
  295. data/lib/rubocop/cop/style/raise_args.rb +8 -14
  296. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  297. data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
  298. data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
  299. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  300. data/lib/rubocop/cop/style/redundant_self.rb +25 -26
  301. data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
  303. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  304. data/lib/rubocop/cop/style/return_nil.rb +4 -8
  305. data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
  306. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  307. data/lib/rubocop/cop/style/semicolon.rb +18 -8
  308. data/lib/rubocop/cop/style/send.rb +9 -0
  309. data/lib/rubocop/cop/style/signal_exception.rb +100 -0
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  311. data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
  312. data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
  313. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
  314. data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
  315. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  316. data/lib/rubocop/cop/style/string_literals.rb +22 -0
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
  318. data/lib/rubocop/cop/style/string_methods.rb +18 -7
  319. data/lib/rubocop/cop/style/symbol_array.rb +5 -9
  320. data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
  322. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  323. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  325. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  326. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
  327. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
  328. data/lib/rubocop/cop/style/unless_else.rb +15 -0
  329. data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
  330. data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
  331. data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
  332. data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
  333. data/lib/rubocop/cop/style/when_then.rb +13 -0
  334. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  335. data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
  336. data/lib/rubocop/cop/style/word_array.rb +4 -8
  337. data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
  338. data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
  339. data/lib/rubocop/cop/util.rb +42 -33
  340. data/lib/rubocop/cop/variable_force.rb +1 -1
  341. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  342. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  343. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  344. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
  345. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  346. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  347. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  348. data/lib/rubocop/node_pattern.rb +2 -3
  349. data/lib/rubocop/options.rb +8 -8
  350. data/lib/rubocop/path_util.rb +15 -3
  351. data/lib/rubocop/processed_source.rb +5 -2
  352. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  353. data/lib/rubocop/runner.rb +1 -1
  354. data/lib/rubocop/token.rb +74 -0
  355. data/lib/rubocop/version.rb +1 -1
  356. metadata +37 -10
  357. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  358. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  359. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  360. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # an offense is reported.
17
17
  #
18
18
  class Copyright < Cop
19
- MSG = 'Include a copyright notice matching /%s/ before ' \
19
+ MSG = 'Include a copyright notice matching /%<notice>s/ before ' \
20
20
  'any code.'.freeze
21
21
  AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in' \
22
22
  'your RuboCop config'.freeze
@@ -26,7 +26,21 @@ 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
- location: range, message: MSG % notice)
29
+ location: range, message: format(MSG, notice: notice))
30
+ end
31
+
32
+ def autocorrect(token)
33
+ raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
34
+ regex = Regexp.new(notice)
35
+ unless autocorrect_notice =~ regex
36
+ raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
37
+ "match Notice /#{notice}/"
38
+ end
39
+
40
+ lambda do |corrector|
41
+ range = token.nil? ? range_between(0, 0) : token.pos
42
+ corrector.insert_before(range, "#{autocorrect_notice}\n")
43
+ end
30
44
  end
31
45
 
32
46
  private
@@ -49,40 +63,25 @@ module RuboCop
49
63
  def shebang_token?(processed_source, token_index)
50
64
  return false if token_index >= processed_source.tokens.size
51
65
  token = processed_source.tokens[token_index]
52
- token.type == :tCOMMENT && token.text =~ /^#!.*$/
66
+ token.comment? && token.text =~ /^#!.*$/
53
67
  end
54
68
 
55
69
  def encoding_token?(processed_source, token_index)
56
70
  return false if token_index >= processed_source.tokens.size
57
71
  token = processed_source.tokens[token_index]
58
- token.type == :tCOMMENT &&
59
- token.text =~ /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/
72
+ token.comment? && token.text =~ /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/
60
73
  end
61
74
 
62
75
  def notice_found?(processed_source)
63
76
  notice_found = false
64
77
  notice_regexp = Regexp.new(notice)
65
78
  processed_source.tokens.each do |token|
66
- break unless token.type == :tCOMMENT
79
+ break unless token.comment?
67
80
  notice_found = !(token.text =~ notice_regexp).nil?
68
81
  break if notice_found
69
82
  end
70
83
  notice_found
71
84
  end
72
-
73
- def autocorrect(token)
74
- raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
75
- regex = Regexp.new(notice)
76
- unless autocorrect_notice =~ regex
77
- raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
78
- "match Notice /#{notice}/"
79
- end
80
-
81
- lambda do |corrector|
82
- range = token.nil? ? range_between(0, 0) : token.pos
83
- corrector.insert_before(range, "#{autocorrect_notice}\n")
84
- end
85
- end
86
85
  end
87
86
  end
88
87
  end
@@ -26,11 +26,11 @@ module RuboCop
26
26
  MSG = 'Prefer Date or Time over DateTime.'.freeze
27
27
 
28
28
  def_node_matcher :date_time?, <<-PATTERN
29
- (send (const _ :DateTime) ...)
29
+ (send (const {nil? (cbase)} :DateTime) ...)
30
30
  PATTERN
31
31
 
32
32
  def_node_matcher :historic_date?, <<-PATTERN
33
- (send _ _ _ (const (const _ :Date) _))
33
+ (send _ _ _ (const (const nil? :Date) _))
34
34
  PATTERN
35
35
 
36
36
  def on_send(node)
@@ -6,6 +6,33 @@ module RuboCop
6
6
  # This cop checks for parentheses in the definition of a method,
7
7
  # that does not take any arguments. Both instance and
8
8
  # class/singleton methods are checked.
9
+ #
10
+ # @example
11
+ #
12
+ # # bad
13
+ # def foo()
14
+ # # does a thing
15
+ # end
16
+ #
17
+ # # good
18
+ # def foo
19
+ # # does a thing
20
+ # end
21
+ #
22
+ # # also good
23
+ # def foo() does_a_thing end
24
+ #
25
+ # @example
26
+ #
27
+ # # bad
28
+ # def Baz.foo()
29
+ # # does a thing
30
+ # end
31
+ #
32
+ # # good
33
+ # def Baz.foo
34
+ # # does a thing
35
+ # end
9
36
  class DefWithParentheses < Cop
10
37
  MSG = "Omit the parentheses in defs when the method doesn't accept " \
11
38
  'any arguments.'.freeze
@@ -18,8 +45,6 @@ module RuboCop
18
45
  end
19
46
  alias on_defs on_def
20
47
 
21
- private
22
-
23
48
  def autocorrect(node)
24
49
  lambda do |corrector|
25
50
  corrector.remove(node.loc.begin)
@@ -31,14 +31,14 @@ module RuboCop
31
31
  end
32
32
  end
33
33
 
34
- private
35
-
36
34
  def autocorrect(node)
37
35
  lambda do |corrector|
38
36
  corrector.replace(node.source_range, '__dir__')
39
37
  end
40
38
  end
41
39
 
40
+ private
41
+
42
42
  def file_keyword?(node)
43
43
  node.str_type? && node.source_range.is?('__FILE__')
44
44
  end
@@ -11,10 +11,23 @@ module RuboCop
11
11
  # The documentation requirement is annulled if the class or module has
12
12
  # a "#:nodoc:" comment next to it. Likewise, "#:nodoc: all" does the
13
13
  # same for all its children.
14
+ #
15
+ # @example
16
+ # # bad
17
+ # class Person
18
+ # # ...
19
+ # end
20
+ #
21
+ # # good
22
+ # # Description/Explanation of Person class
23
+ # class Person
24
+ # # ...
25
+ # end
26
+ #
14
27
  class Documentation < Cop
15
28
  include DocumentationComment
16
29
 
17
- MSG = 'Missing top-level %s documentation comment.'.freeze
30
+ MSG = 'Missing top-level %<type>s documentation comment.'.freeze
18
31
 
19
32
  def_node_matcher :constant_definition?, '{class module casgn}'
20
33
 
@@ -38,7 +51,9 @@ module RuboCop
38
51
  return if namespace?(body)
39
52
  return if documentation_comment?(node) || nodoc_comment?(node)
40
53
 
41
- add_offense(node, location: :keyword, message: format(MSG, type))
54
+ add_offense(node,
55
+ location: :keyword,
56
+ message: format(MSG, type: type))
42
57
  end
43
58
 
44
59
  def namespace?(node)
@@ -10,17 +10,17 @@ module RuboCop
10
10
  # This check only applies if the block takes no parameters.
11
11
  #
12
12
  # @example
13
- # @bad
13
+ # # bad
14
14
  # (1..5).each { }
15
15
  #
16
- # @good
16
+ # # good
17
17
  # 5.times { }
18
18
  #
19
19
  # @example
20
- # @bad
20
+ # # bad
21
21
  # (0...10).each {}
22
22
  #
23
- # @good
23
+ # # good
24
24
  # 10.times {}
25
25
  class EachForSimpleLoop < Cop
26
26
  MSG = 'Use `Integer#times` for a simple loop which iterates a fixed ' \
@@ -36,19 +36,19 @@ module RuboCop
36
36
  add_offense(node, location: range)
37
37
  end
38
38
 
39
- private
40
-
41
39
  def autocorrect(node)
42
40
  lambda do |corrector|
43
41
  range_type, min, max = offending_each_range(node)
44
42
 
45
43
  max += 1 if range_type == :irange
46
44
 
47
- corrector.replace(node.children.first.source_range,
45
+ corrector.replace(node.send_node.source_range,
48
46
  "#{max - min}.times")
49
47
  end
50
48
  end
51
49
 
50
+ private
51
+
52
52
  def_node_matcher :offending_each_range, <<-PATTERN
53
53
  (block (send (begin (${irange erange} (int $_) (int $_))) :each) (args) ...)
54
54
  PATTERN
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # # good
18
18
  # [1, 2].each_with_object({}) { |e, a| a[e] = e }
19
19
  class EachWithObject < Cop
20
- MSG = 'Use `each_with_object` instead of `%s`.'.freeze
20
+ MSG = 'Use `each_with_object` instead of `%<method>s`.'.freeze
21
21
  METHODS = %i[inject reduce].freeze
22
22
 
23
23
  def_node_matcher :each_with_object_candidate?, <<-PATTERN
@@ -35,12 +35,10 @@ module RuboCop
35
35
  return if accumulator_param_assigned_to?(body, args)
36
36
 
37
37
  add_offense(node, location: method.loc.selector,
38
- message: format(MSG, method_name))
38
+ message: format(MSG, method: method_name))
39
39
  end
40
40
  end
41
41
 
42
- private
43
-
44
42
  # rubocop:disable Metrics/AbcSize
45
43
  def autocorrect(node)
46
44
  lambda do |corrector|
@@ -56,7 +54,9 @@ module RuboCop
56
54
  corrector.remove(return_value.loc.expression)
57
55
  end
58
56
  end
59
- # rubocop:endable Metrics/AbcSize
57
+ # rubocop:enable Metrics/AbcSize
58
+
59
+ private
60
60
 
61
61
  def simple_method_arg?(method_arg)
62
62
  method_arg && method_arg.basic_literal?
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for pipes for empty block parameters. Pipes for empty
7
+ # block parameters do not cause syntax errors, but they are redundant.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # a do ||
12
+ # do_something
13
+ # end
14
+ #
15
+ # # bad
16
+ # a { || do_something }
17
+ #
18
+ # # good
19
+ # a do
20
+ # end
21
+ #
22
+ # # good
23
+ # a { do_something }
24
+ class EmptyBlockParameter < Cop
25
+ include EmptyParameter
26
+
27
+ MSG = 'Omit pipes for the empty block parameters.'.freeze
28
+
29
+ def on_block(node)
30
+ send_node = node.send_node
31
+ check(node) unless send_node.send_type? && send_node.stabby_lambda?
32
+ end
33
+
34
+ def autocorrect(node)
35
+ lambda do |corrector|
36
+ block = node.parent
37
+ range = range_between(
38
+ block.loc.begin.end_pos,
39
+ node.loc.expression.end_pos
40
+ )
41
+ corrector.remove(range)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -45,8 +45,6 @@ module RuboCop
45
45
  add_offense(case_node, location: :keyword)
46
46
  end
47
47
 
48
- private
49
-
50
48
  def autocorrect(case_node)
51
49
  when_branches = case_node.when_branches
52
50
 
@@ -56,6 +54,8 @@ module RuboCop
56
54
  end
57
55
  end
58
56
 
57
+ private
58
+
59
59
  def correct_case_when(corrector, case_node, when_nodes)
60
60
  case_range = case_node.loc.keyword.join(when_nodes.first.loc.keyword)
61
61
 
@@ -6,56 +6,64 @@ module RuboCop
6
6
  # Checks for empty else-clauses, possibly including comments and/or an
7
7
  # explicit `nil` depending on the EnforcedStyle.
8
8
  #
9
- # SupportedStyles:
9
+ # @example EnforcedStyle: empty
10
+ # # warn only on empty else
10
11
  #
11
- # @example
12
- # # good for all styles
12
+ # # bad
13
+ # if condition
14
+ # statement
15
+ # else
16
+ # end
13
17
  #
18
+ # # good
19
+ # if condition
20
+ # statement
21
+ # else
22
+ # nil
23
+ # end
24
+ #
25
+ # # good
14
26
  # if condition
15
27
  # statement
16
28
  # else
17
29
  # statement
18
30
  # end
19
31
  #
20
- # # good for all styles
32
+ # # good
21
33
  # if condition
22
34
  # statement
23
35
  # end
24
36
  #
25
- # @example
26
- # # empty - warn only on empty else
37
+ # @example EnforcedStyle: nil
38
+ # # warn on else with nil in it
27
39
  #
28
40
  # # bad
29
41
  # if condition
30
42
  # statement
31
43
  # else
44
+ # nil
32
45
  # end
33
46
  #
34
47
  # # good
35
48
  # if condition
36
49
  # statement
37
50
  # else
38
- # nil
39
51
  # end
40
52
  #
41
- # @example
42
- # # nil - warn on else with nil in it
43
- #
44
- # # bad
53
+ # # good
45
54
  # if condition
46
55
  # statement
47
56
  # else
48
- # nil
57
+ # statement
49
58
  # end
50
59
  #
51
60
  # # good
52
61
  # if condition
53
62
  # statement
54
- # else
55
63
  # end
56
64
  #
57
- # @example
58
- # # both - warn on empty else and else with nil in it
65
+ # @example EnforcedStyle: both (default)
66
+ # # warn on empty else and else with nil in it
59
67
  #
60
68
  # # bad
61
69
  # if condition
@@ -69,6 +77,18 @@ module RuboCop
69
77
  # statement
70
78
  # else
71
79
  # end
80
+ #
81
+ # # good
82
+ # if condition
83
+ # statement
84
+ # else
85
+ # statement
86
+ # end
87
+ #
88
+ # # good
89
+ # if condition
90
+ # statement
91
+ # end
72
92
  class EmptyElse < Cop
73
93
  include OnNormalIfUnless
74
94
  include ConfigurableEnforcedStyle
@@ -83,6 +103,16 @@ module RuboCop
83
103
  check(node)
84
104
  end
85
105
 
106
+ def autocorrect(node)
107
+ return false if autocorrect_forbidden?(node.type.to_s)
108
+ return false if comment_in_else?(node)
109
+
110
+ lambda do |corrector|
111
+ end_pos = base_if_node(node).loc.end.begin_pos
112
+ corrector.remove(range_between(node.loc.else.begin_pos, end_pos))
113
+ end
114
+ end
115
+
86
116
  private
87
117
 
88
118
  def check(node)
@@ -110,14 +140,14 @@ module RuboCop
110
140
  add_offense(node, location: :else)
111
141
  end
112
142
 
113
- def autocorrect(node)
114
- return false if autocorrect_forbidden?(node.type.to_s)
115
-
116
- lambda do |corrector|
117
- end_pos = base_if_node(node).loc.end.begin_pos
143
+ def comment_in_else?(node)
144
+ range = else_line_range(node.loc)
145
+ processed_source.comments.find { |c| range.include?(c.loc.line) }
146
+ end
118
147
 
119
- corrector.remove(range_between(node.loc.else.begin_pos, end_pos))
120
- end
148
+ def else_line_range(loc)
149
+ return 0..0 if loc.else.nil? || loc.end.nil?
150
+ loc.else.first_line..loc.end.first_line
121
151
  end
122
152
 
123
153
  def base_if_node(node)