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
@@ -7,31 +7,41 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  # # bad
10
- # def set_attribute(value) ...
10
+ # def set_attribute(value)
11
+ # end
11
12
  #
12
13
  # # good
13
14
  # def attribute=(value)
15
+ # end
14
16
  #
15
17
  # # bad
16
- # def get_attribute ...
18
+ # def get_attribute
19
+ # end
17
20
  #
18
21
  # # good
19
- # def attribute ...
22
+ # def attribute
23
+ # end
20
24
  class AccessorMethodName < Cop
25
+ MSG_READER = 'Do not prefix reader method names with `get_`.'.freeze
26
+ MSG_WRITER = 'Do not prefix writer method names with `set_`.'.freeze
27
+
21
28
  def on_def(node)
22
- msg =
23
- if bad_reader_name?(node)
24
- 'Do not prefix reader method names with `get_`.'
25
- elsif bad_writer_name?(node)
26
- 'Do not prefix writer method names with `set_`.'
27
- end
29
+ return unless bad_reader_name?(node) || bad_writer_name?(node)
28
30
 
29
- add_offense(node, location: :name, message: msg) if msg
31
+ add_offense(node, location: :name)
30
32
  end
31
33
  alias on_defs on_def
32
34
 
33
35
  private
34
36
 
37
+ def message(node)
38
+ if bad_reader_name?(node)
39
+ MSG_READER
40
+ elsif bad_writer_name?(node)
41
+ MSG_WRITER
42
+ end
43
+ end
44
+
35
45
  def bad_reader_name?(node)
36
46
  node.method_name.to_s.start_with?('get_') && !node.arguments?
37
47
  end
@@ -1,9 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Style/AsciiComments
4
+
3
5
  module RuboCop
4
6
  module Cop
5
7
  module Naming
6
8
  # This cop checks for non-ascii characters in identifier names.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # def καλημερα # Greek alphabet (non-ascii)
13
+ # end
14
+ #
15
+ # # bad
16
+ # def こんにちはと言う # Japanese character (non-ascii)
17
+ # end
18
+ #
19
+ # # bad
20
+ # def hello_🍣 # Emoji (non-ascii)
21
+ # end
22
+ #
23
+ # # good
24
+ # def say_hello
25
+ # end
26
+ #
27
+ # # bad
28
+ # 신장 = 10 # Hangul character (non-ascii)
29
+ #
30
+ # # good
31
+ # height = 10
32
+ #
33
+ # # bad
34
+ # params[:عرض_gteq] # Arabic character (non-ascii)
35
+ #
36
+ # # good
37
+ # params[:width_gteq]
38
+ #
7
39
  class AsciiIdentifiers < Cop
8
40
  MSG = 'Use only ascii symbols in identifiers.'.freeze
9
41
 
@@ -34,3 +66,4 @@ module RuboCop
34
66
  end
35
67
  end
36
68
  end
69
+ # rubocop:enable Style/AsciiComments
@@ -14,23 +14,24 @@ module RuboCop
14
14
  # # good
15
15
  # def +(other); end
16
16
  class BinaryOperatorParameterName < Cop
17
- MSG = 'When defining the `%s` operator, ' \
17
+ MSG = 'When defining the `%<opr>s` operator, ' \
18
18
  'name its argument `other`.'.freeze
19
19
 
20
20
  OP_LIKE_METHODS = %i[eql? equal?].freeze
21
21
  BLACKLISTED = %i[+@ -@ [] []= << `].freeze
22
22
 
23
23
  def_node_matcher :op_method_candidate?, <<-PATTERN
24
- (def $_ (args $(arg [!:other !:_other])) _)
24
+ (def [#op_method? $_] (args $(arg [!:other !:_other])) _)
25
25
  PATTERN
26
26
 
27
27
  def on_def(node)
28
28
  op_method_candidate?(node) do |name, arg|
29
- return unless op_method?(name)
30
- add_offense(arg, message: format(MSG, name))
29
+ add_offense(arg, message: format(MSG, opr: name))
31
30
  end
32
31
  end
33
32
 
33
+ private
34
+
34
35
  def op_method?(name)
35
36
  return false if BLACKLISTED.include?(name)
36
37
  name !~ /\A\w/ || OP_LIKE_METHODS.include?(name)
@@ -5,24 +5,28 @@ module RuboCop
5
5
  module Naming
6
6
  # This cops checks for class and module names with
7
7
  # an underscore in them.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # class My_Class
12
+ # end
13
+ # module My_Module
14
+ # end
15
+ #
16
+ # # good
17
+ # class MyClass
18
+ # end
19
+ # module MyModule
20
+ # end
8
21
  class ClassAndModuleCamelCase < Cop
9
22
  MSG = 'Use CamelCase for classes and modules.'.freeze
10
23
 
11
24
  def on_class(node)
12
- check_name(node)
13
- end
14
-
15
- def on_module(node)
16
- check_name(node)
17
- end
18
-
19
- private
20
-
21
- def check_name(node)
22
- name = node.loc.name.source
25
+ return unless node.loc.name.source =~ /_/
23
26
 
24
- add_offense(node, location: :name) if name =~ /_/
27
+ add_offense(node, location: :name)
25
28
  end
29
+ alias on_module on_class
26
30
  end
27
31
  end
28
32
  end
@@ -8,21 +8,50 @@ module RuboCop
8
8
  #
9
9
  # To avoid false positives, it ignores cases in which we cannot know
10
10
  # for certain the type of value that would be assigned to a constant.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # InchInCm = 2.54
15
+ # INCHinCM = 2.54
16
+ # Inch_In_Cm = 2.54
17
+ #
18
+ # # good
19
+ # INCH_IN_CM = 2.54
11
20
  class ConstantName < Cop
12
21
  MSG = 'Use SCREAMING_SNAKE_CASE for constants.'.freeze
13
- SNAKE_CASE = /^[\dA-Z_]+$/
22
+ # Use POSIX character classes, so we allow accented characters rather
23
+ # than just standard ASCII characters
24
+ SNAKE_CASE = /^[[:digit:][:upper:]_]+$/
25
+
26
+ def_node_matcher :class_or_struct_return_method?, <<-PATTERN
27
+ (send
28
+ (const _ {:Class :Struct}) :new
29
+ ...)
30
+ PATTERN
14
31
 
15
32
  def on_casgn(node)
16
33
  _scope, const_name, value = *node
17
34
 
18
35
  # We cannot know the result of method calls like
19
36
  # NewClass = something_that_returns_a_class
20
- # It's also ok to assign a class constant another class constant
37
+ # It's also ok to assign a class constant another class constant,
38
+ # `Class.new(...)` or `Struct.new(...)`
21
39
  # SomeClass = SomeOtherClass
22
- return if value && %i[send block const].include?(value.type)
40
+ # SomeClass = Class.new(...)
41
+ # SomeClass = Struct.new(...)
42
+ return if value && %i[block const casgn].include?(value.type) ||
43
+ allowed_method_call_on_rhs?(value) ||
44
+ class_or_struct_return_method?(value)
23
45
 
24
46
  add_offense(node, location: :name) if const_name !~ SNAKE_CASE
25
47
  end
48
+
49
+ private
50
+
51
+ def allowed_method_call_on_rhs?(node)
52
+ node && node.send_type? &&
53
+ (node.receiver.nil? || !node.receiver.literal?)
54
+ end
26
55
  end
27
56
  end
28
57
  end
@@ -8,12 +8,23 @@ module RuboCop
8
8
  # This cop makes sure that Ruby source files have snake_case
9
9
  # names. Ruby scripts (i.e. source files with a shebang in the
10
10
  # first line) are ignored.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # lib/layoutManager.rb
15
+ #
16
+ # anything/usingCamelCase
17
+ #
18
+ # # good
19
+ # lib/layout_manager.rb
20
+ #
21
+ # anything/using_snake_case.rake
11
22
  class FileName < Cop
12
- MSG_SNAKE_CASE = 'The name of this source file (`%s`) ' \
23
+ MSG_SNAKE_CASE = 'The name of this source file (`%<basename>s`) ' \
13
24
  'should use snake_case.'.freeze
14
- MSG_NO_DEFINITION = '%s should define a class or module ' \
15
- 'called `%s`.'.freeze
16
- MSG_REGEX = '`%s` should match `%s`.'.freeze
25
+ MSG_NO_DEFINITION = '%<basename>s should define a class or module ' \
26
+ 'called `%<namespace>s`.'.freeze
27
+ MSG_REGEX = '`%<basename>s` should match `%<regex>s`.'.freeze
17
28
 
18
29
  SNAKE_CASE = /^[\da-z_.?!]+$/
19
30
 
@@ -50,15 +61,15 @@ module RuboCop
50
61
 
51
62
  def no_definition_message(basename, file_path)
52
63
  format(MSG_NO_DEFINITION,
53
- basename,
54
- to_namespace(file_path).join('::'))
64
+ basename: basename,
65
+ namespace: to_namespace(file_path).join('::'))
55
66
  end
56
67
 
57
68
  def other_message(basename)
58
69
  if regex
59
- format(MSG_REGEX, basename, regex)
70
+ format(MSG_REGEX, basename: basename, regex: regex)
60
71
  else
61
- format(MSG_SNAKE_CASE, basename)
72
+ format(MSG_SNAKE_CASE, basename: basename)
62
73
  end
63
74
  end
64
75
 
@@ -6,38 +6,32 @@ module RuboCop
6
6
  # This cop checks that your heredocs are using the configured case.
7
7
  # By default it is configured to enforce uppercase heredocs.
8
8
  #
9
- # @example
10
- #
11
- # # EnforcedStyle: uppercase (default)
9
+ # @example EnforcedStyle: uppercase (default)
10
+ # # bad
11
+ # <<-sql
12
+ # SELECT * FROM foo
13
+ # sql
12
14
  #
13
15
  # # good
14
16
  # <<-SQL
15
17
  # SELECT * FROM foo
16
18
  # SQL
17
19
  #
20
+ # @example EnforcedStyle: lowercase
18
21
  # # bad
19
- # <<-sql
22
+ # <<-SQL
20
23
  # SELECT * FROM foo
21
- # sql
22
- #
23
- # @example
24
- #
25
- # # EnforcedStyle: lowercase
24
+ # SQL
26
25
  #
27
26
  # # good
28
27
  # <<-sql
29
28
  # SELECT * FROM foo
30
29
  # sql
31
- #
32
- # # bad
33
- # <<-SQL
34
- # SELECT * FROM foo
35
- # SQL
36
30
  class HeredocDelimiterCase < Cop
37
31
  include Heredoc
38
32
  include ConfigurableEnforcedStyle
39
33
 
40
- MSG = 'Use %s heredoc delimiters.'.freeze
34
+ MSG = 'Use %<style>s heredoc delimiters.'.freeze
41
35
 
42
36
  def on_heredoc(node)
43
37
  return if correct_case_delimiters?(node)
@@ -48,7 +42,7 @@ module RuboCop
48
42
  private
49
43
 
50
44
  def message(_node)
51
- format(MSG, style)
45
+ format(MSG, style: style)
52
46
  end
53
47
 
54
48
  def correct_case_delimiters?(node)
@@ -4,29 +4,35 @@ module RuboCop
4
4
  module Cop
5
5
  module Naming
6
6
  # This cop makes sure that all methods use the configured style,
7
- # snake_case or camelCase, for their names. Some special arrangements
8
- # have to be made for operator methods.
7
+ # snake_case or camelCase, for their names.
8
+ #
9
+ # @example EnforcedStyle: snake_case (default)
10
+ # # bad
11
+ # def fooBar; end
12
+ #
13
+ # # good
14
+ # def foo_bar; end
15
+ #
16
+ # @example EnforcedStyle: camelCase
17
+ # # bad
18
+ # def foo_bar; end
19
+ #
20
+ # # good
21
+ # def fooBar; end
9
22
  class MethodName < Cop
10
23
  include ConfigurableNaming
11
24
 
12
- def on_def(node)
13
- name, = *node
14
- check_name(node, sanitize_name(name), node.loc.name)
15
- end
25
+ MSG = 'Use %<style>s for method names.'.freeze
16
26
 
17
- def on_defs(node)
18
- _object, name, = *node
19
- check_name(node, sanitize_name(name), node.loc.name)
27
+ def on_def(node)
28
+ check_name(node, node.method_name, node.loc.name)
20
29
  end
30
+ alias on_defs on_def
21
31
 
22
32
  private
23
33
 
24
34
  def message(style)
25
- format('Use %s for method names.', style)
26
- end
27
-
28
- def sanitize_name(name)
29
- name.to_s.delete('@').to_sym
35
+ format(MSG, style: style)
30
36
  end
31
37
  end
32
38
  end
@@ -7,16 +7,20 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  # # bad
10
- # def is_even?(value) ...
10
+ # def is_even?(value)
11
+ # end
11
12
  #
12
13
  # # good
13
14
  # def even?(value)
15
+ # end
14
16
  #
15
17
  # # bad
16
- # def has_value? ...
18
+ # def has_value?
19
+ # end
17
20
  #
18
21
  # # good
19
- # def value? ...
22
+ # def value?
23
+ # end
20
24
  class PredicateName < Cop
21
25
  def_node_matcher :dynamic_method_define, <<-PATTERN
22
26
  (send nil? #method_definition_macros
@@ -5,15 +5,30 @@ module RuboCop
5
5
  module Naming
6
6
  # This cop makes sure that all variables use the configured style,
7
7
  # snake_case or camelCase, for their names.
8
+ #
9
+ # @example EnforcedStyle: snake_case (default)
10
+ # # bad
11
+ # fooBar = 1
12
+ #
13
+ # # good
14
+ # foo_bar = 1
15
+ #
16
+ # @example EnforcedStyle: camelCase
17
+ # # bad
18
+ # foo_bar = 1
19
+ #
20
+ # # good
21
+ # fooBar = 1
8
22
  class VariableName < Cop
9
23
  include ConfigurableNaming
10
24
 
25
+ MSG = 'Use %<style>s for variable names.'.freeze
26
+
11
27
  def on_lvasgn(node)
12
28
  name, = *node
13
29
  return unless name
14
30
  check_name(node, name, node.loc.name)
15
31
  end
16
-
17
32
  alias on_ivasgn on_lvasgn
18
33
  alias on_cvasgn on_lvasgn
19
34
  alias on_arg on_lvasgn
@@ -27,7 +42,7 @@ module RuboCop
27
42
  private
28
43
 
29
44
  def message(style)
30
- format('Use %s for variable names.', style)
45
+ format(MSG, style: style)
31
46
  end
32
47
  end
33
48
  end
@@ -7,9 +7,7 @@ module RuboCop
7
7
  # configured style, snake_case, normalcase or non_integer,
8
8
  # for their numbering.
9
9
  #
10
- # @example
11
- # "EnforcedStyle => 'snake_case'"
12
- #
10
+ # @example EnforcedStyle: snake_case
13
11
  # # bad
14
12
  #
15
13
  # variable1 = 1
@@ -18,9 +16,7 @@ module RuboCop
18
16
  #
19
17
  # variable_1 = 1
20
18
  #
21
- # @example
22
- # "EnforcedStyle => 'normalcase'"
23
- #
19
+ # @example EnforcedStyle: normalcase (default)
24
20
  # # bad
25
21
  #
26
22
  # variable_1 = 1
@@ -29,48 +25,35 @@ module RuboCop
29
25
  #
30
26
  # variable1 = 1
31
27
  #
32
- # @example
33
- # "EnforcedStyle => 'non_integer'"
34
- #
35
- # #bad
28
+ # @example EnforcedStyle: non_integer
29
+ # # bad
36
30
  #
37
31
  # variable1 = 1
38
32
  #
39
33
  # variable_1 = 1
40
34
  #
41
- # #good
35
+ # # good
42
36
  #
43
37
  # variableone = 1
44
38
  #
45
39
  # variable_one = 1
46
- #
47
40
  class VariableNumber < Cop
48
41
  include ConfigurableNumbering
49
42
 
50
- def on_lvasgn(node)
51
- name, = *node
52
- check_name(node, name, node.loc.name)
53
- end
54
-
55
- def on_ivasgn(node)
56
- name, = *node
57
- check_name(node, name, node.loc.name)
58
- end
59
-
60
- def on_cvasgn(node)
61
- name, = *node
62
- check_name(node, name, node.loc.name)
63
- end
43
+ MSG = 'Use %<style>s for variable numbers.'.freeze
64
44
 
65
45
  def on_arg(node)
66
46
  name, = *node
67
47
  check_name(node, name, node.loc.name)
68
48
  end
49
+ alias on_lvasgn on_arg
50
+ alias on_ivasgn on_arg
51
+ alias on_cvasgn on_arg
69
52
 
70
53
  private
71
54
 
72
55
  def message(style)
73
- format('Use %s for variable numbers.', style)
56
+ format(MSG, style: style)
74
57
  end
75
58
  end
76
59
  end