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
@@ -29,6 +29,13 @@ module RuboCop
29
29
  add_offense(node, location: :selector)
30
30
  end
31
31
 
32
+ def autocorrect(node)
33
+ lambda do |corrector|
34
+ corrector.replace(node.loc.selector, 'validates')
35
+ correct_validate_type(corrector, node)
36
+ end
37
+ end
38
+
32
39
  private
33
40
 
34
41
  def message(node)
@@ -39,13 +46,6 @@ module RuboCop
39
46
  WHITELIST[BLACKLIST.index(method.to_sym)]
40
47
  end
41
48
 
42
- def autocorrect(node)
43
- lambda do |corrector|
44
- corrector.replace(node.loc.selector, 'validates')
45
- correct_validate_type(corrector, node)
46
- end
47
- end
48
-
49
49
  def correct_validate_type(corrector, node)
50
50
  options = node.arguments.find { |arg| !arg.sym_type? }
51
51
  validate_type = node.method_name.to_s.split('_')[1]
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # JSON.parse("{}")
24
24
  #
25
25
  class JSONLoad < Cop
26
- MSG = 'Prefer `JSON.parse` over `JSON.%s`.'.freeze
26
+ MSG = 'Prefer `JSON.parse` over `JSON.%<method>s`.'.freeze
27
27
 
28
28
  def_node_matcher :json_load, <<-PATTERN
29
29
  (send (const {nil? cbase} :JSON) ${:load :restore} ...)
@@ -31,7 +31,9 @@ module RuboCop
31
31
 
32
32
  def on_send(node)
33
33
  json_load(node) do |method|
34
- add_offense(node, location: :selector, message: format(MSG, method))
34
+ add_offense(node,
35
+ location: :selector,
36
+ message: format(MSG, method: method))
35
37
  end
36
38
  end
37
39
 
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # Marshal.load(Marshal.dump({}))
20
20
  #
21
21
  class MarshalLoad < Cop
22
- MSG = 'Avoid using `Marshal.%s`.'.freeze
22
+ MSG = 'Avoid using `Marshal.%<method>s`.'.freeze
23
23
 
24
24
  def_node_matcher :marshal_load, <<-PATTERN
25
25
  (send (const {nil? cbase} :Marshal) ${:load :restore}
@@ -28,7 +28,9 @@ module RuboCop
28
28
 
29
29
  def on_send(node)
30
30
  marshal_load(node) do |method|
31
- add_offense(node, location: :selector, message: format(MSG, method))
31
+ add_offense(node,
32
+ location: :selector,
33
+ message: format(MSG, method: method))
32
34
  end
33
35
  end
34
36
  end
@@ -7,38 +7,35 @@ module RuboCop
7
7
  # depending on configuration.
8
8
  # It also flags uses of `alias :symbol` rather than `alias bareword`.
9
9
  #
10
- # @example
11
- #
12
- # # EnforcedStyle: prefer_alias
10
+ # @example EnforcedStyle: prefer_alias (default)
11
+ # # bad
12
+ # alias_method :bar, :foo
13
+ # alias :bar :foo
13
14
  #
14
15
  # # good
15
16
  # alias bar foo
16
17
  #
18
+ # @example EnforcedStyle: prefer_alias_method
17
19
  # # bad
18
- # alias_method :bar, :foo
19
20
  # alias :bar :foo
20
- #
21
- # @example
22
- #
23
- # # EnforcedStyle: prefer_alias_method
21
+ # alias bar foo
24
22
  #
25
23
  # # good
26
24
  # alias_method :bar, :foo
27
- #
28
- # # bad
29
- # alias bar foo
30
25
  class Alias < Cop
31
26
  include ConfigurableEnforcedStyle
32
27
 
33
28
  MSG_ALIAS = 'Use `alias_method` instead of `alias`.'.freeze
34
- MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` %s.'.freeze
35
- MSG_SYMBOL_ARGS = 'Use `alias %s` instead of `alias %s`.'.freeze
29
+ MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` ' \
30
+ '%<current>s.'.freeze
31
+ MSG_SYMBOL_ARGS = 'Use `alias %<prefer>s` instead of ' \
32
+ '`alias %<current>s`.'.freeze
36
33
 
37
34
  def on_send(node)
38
35
  return unless node.command?(:alias_method)
39
36
  return unless style == :prefer_alias && alias_keyword_possible?(node)
40
37
 
41
- msg = format(MSG_ALIAS_METHOD, lexical_scope_type(node))
38
+ msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
42
39
  add_offense(node, location: :selector, message: msg)
43
40
  end
44
41
 
@@ -52,6 +49,16 @@ module RuboCop
52
49
  end
53
50
  end
54
51
 
52
+ def autocorrect(node)
53
+ if node.send_type?
54
+ correct_alias_method_to_alias(node)
55
+ elsif scope_type(node) == :dynamic || style == :prefer_alias_method
56
+ correct_alias_to_alias_method(node)
57
+ else
58
+ correct_alias_with_symbol_args(node)
59
+ end
60
+ end
61
+
55
62
  private
56
63
 
57
64
  def alias_keyword_possible?(node)
@@ -63,22 +70,13 @@ module RuboCop
63
70
  node.children.none?(&:gvar_type?)
64
71
  end
65
72
 
66
- def autocorrect(node)
67
- if node.send_type?
68
- correct_alias_method_to_alias(node)
69
- elsif scope_type(node) == :dynamic || style == :prefer_alias_method
70
- correct_alias_to_alias_method(node)
71
- else
72
- correct_alias_with_symbol_args(node)
73
- end
74
- end
75
-
76
73
  def add_offense_for_args(node)
77
74
  existing_args = node.children.map(&:source).join(' ')
78
75
  preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
79
76
  arg_ranges = node.children.map(&:source_range)
80
- msg = format(MSG_SYMBOL_ARGS, preferred_args,
81
- existing_args)
77
+ msg = format(MSG_SYMBOL_ARGS,
78
+ prefer: preferred_args,
79
+ current: existing_args)
82
80
  add_offense(node, location: arg_ranges.reduce(&:join), message: msg)
83
81
  end
84
82
 
@@ -7,33 +7,39 @@ module RuboCop
7
7
  # `|| instead`. It can be configured to check only in conditions, or in
8
8
  # all contexts.
9
9
  #
10
- # @example
10
+ # @example EnforcedStyle: always (default)
11
+ # # bad
12
+ # foo.save and return
11
13
  #
12
- # # EnforcedStyle: always (default)
14
+ # # bad
15
+ # if foo and bar
16
+ # end
13
17
  #
14
18
  # # good
15
19
  # foo.save && return
20
+ #
21
+ # # good
16
22
  # if foo && bar
23
+ # end
17
24
  #
25
+ # @example EnforcedStyle: conditionals
18
26
  # # bad
19
- # foo.save and return
20
27
  # if foo and bar
21
- #
22
- # @example
23
- #
24
- # # EnforcedStyle: conditionals
28
+ # end
25
29
  #
26
30
  # # good
27
31
  # foo.save && return
32
+ #
33
+ # # good
28
34
  # foo.save and return
29
- # if foo && bar
30
35
  #
31
- # # bad
32
- # if foo and bar
36
+ # # good
37
+ # if foo && bar
38
+ # end
33
39
  class AndOr < Cop
34
40
  include ConfigurableEnforcedStyle
35
41
 
36
- MSG = 'Use `%s` instead of `%s`.'.freeze
42
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
37
43
 
38
44
  def on_and(node)
39
45
  process_logical_operator(node) if style == :always
@@ -48,6 +54,22 @@ module RuboCop
48
54
  alias on_until on_if
49
55
  alias on_until_post on_if
50
56
 
57
+ def autocorrect(node)
58
+ lambda do |corrector|
59
+ node.each_child_node do |expr|
60
+ if expr.send_type?
61
+ correct_send(expr, corrector)
62
+ elsif expr.return_type?
63
+ correct_other(expr, corrector)
64
+ elsif expr.assignment?
65
+ correct_other(expr, corrector)
66
+ end
67
+ end
68
+
69
+ corrector.replace(node.loc.operator, node.alternate_operator)
70
+ end
71
+ end
72
+
51
73
  private
52
74
 
53
75
  def on_conditionals(node)
@@ -63,23 +85,7 @@ module RuboCop
63
85
  end
64
86
 
65
87
  def message(node)
66
- format(MSG, node.alternate_operator, node.operator)
67
- end
68
-
69
- def autocorrect(node)
70
- lambda do |corrector|
71
- node.each_child_node do |expr|
72
- if expr.send_type?
73
- correct_send(expr, corrector)
74
- elsif expr.return_type?
75
- correct_other(expr, corrector)
76
- elsif expr.assignment?
77
- correct_other(expr, corrector)
78
- end
79
- end
80
-
81
- corrector.replace(node.loc.operator, node.alternate_operator)
82
- end
88
+ format(MSG, prefer: node.alternate_operator, current: node.operator)
83
89
  end
84
90
 
85
91
  def correct_send(node, corrector)
@@ -8,6 +8,15 @@ module RuboCop
8
8
  # Not all cases can reliably checked, due to Ruby's dynamic
9
9
  # types, so we consider only cases when the first argument is an
10
10
  # array literal or the second is a string literal.
11
+ #
12
+ # @example
13
+ #
14
+ # # bad
15
+ # %w(foo bar baz) * ","
16
+ #
17
+ # # good
18
+ # %w(foo bar bax).join(",")
19
+ #
11
20
  class ArrayJoin < Cop
12
21
  MSG = 'Favor `Array#join` over `Array#*`.'.freeze
13
22
 
@@ -1,18 +1,28 @@
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 Style
6
8
  # This cop checks for non-ascii (non-English) characters
7
- # in comments.
9
+ # in comments. You could set an array of allowed non-ascii chars in
10
+ # AllowedChars attribute (empty by default).
11
+ #
12
+ # @example
13
+ # # bad
14
+ # # Translates from English to 日本語。
15
+ #
16
+ # # good
17
+ # # Translates from English to Japanese
8
18
  class AsciiComments < Cop
9
19
  MSG = 'Use only ascii symbols in comments.'.freeze
10
20
 
11
21
  def investigate(processed_source)
12
22
  processed_source.comments.each do |comment|
13
- unless comment.text.ascii_only?
14
- add_offense(comment, location: first_offense_range(comment))
15
- end
23
+ next if comment.text.ascii_only?
24
+ next if only_allowed_non_ascii_chars?(comment.text)
25
+ add_offense(comment, location: first_offense_range(comment))
16
26
  end
17
27
  end
18
28
 
@@ -32,7 +42,17 @@ module RuboCop
32
42
  def first_non_ascii_chars(string)
33
43
  string.match(/[^[:ascii:]]+/).to_s
34
44
  end
45
+
46
+ def only_allowed_non_ascii_chars?(string)
47
+ non_ascii = string.scan(/[^[:ascii:]]/)
48
+ (non_ascii - allowed_non_ascii_chars).empty?
49
+ end
50
+
51
+ def allowed_non_ascii_chars
52
+ cop_config['AllowedChars'] || []
53
+ end
35
54
  end
36
55
  end
37
56
  end
38
57
  end
58
+ # rubocop:enable Style/AsciiComments
@@ -4,8 +4,18 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for uses of Module#attr.
7
+ #
8
+ # @example
9
+ # # bad - creates a single attribute accessor (deprecated in Ruby 1.9)
10
+ # attr :something, true
11
+ # attr :one, :two, :three # behaves as attr_reader
12
+ #
13
+ # # good
14
+ # attr_accessor :something
15
+ # attr_reader :one, :two, :three
16
+ #
7
17
  class Attr < Cop
8
- MSG = 'Do not use `attr`. Use `%s` instead.'.freeze
18
+ MSG = 'Do not use `attr`. Use `%<replacement>s` instead.'.freeze
9
19
 
10
20
  def on_send(node)
11
21
  return unless node.command?(:attr) && node.arguments?
@@ -13,8 +23,6 @@ module RuboCop
13
23
  add_offense(node, location: :selector)
14
24
  end
15
25
 
16
- private
17
-
18
26
  def autocorrect(node)
19
27
  attr_name, setter = *node.arguments
20
28
 
@@ -31,8 +39,10 @@ module RuboCop
31
39
  end
32
40
  end
33
41
 
42
+ private
43
+
34
44
  def message(node)
35
- format(MSG, replacement_method(node))
45
+ format(MSG, replacement: replacement_method(node))
36
46
  end
37
47
 
38
48
  def replacement_method(node)
@@ -14,10 +14,10 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # File.open('file') do |f|
17
- # ...
17
+ # # ...
18
18
  # end
19
19
  class AutoResourceCleanup < Cop
20
- MSG = 'Use the block version of `%s.%s`.'.freeze
20
+ MSG = 'Use the block version of `%<class>s.%<method>s`.'.freeze
21
21
 
22
22
  TARGET_METHODS = {
23
23
  File: :open
@@ -33,7 +33,9 @@ module RuboCop
33
33
  next if node.block_argument?
34
34
 
35
35
  add_offense(node,
36
- message: format(MSG, target_class, target_method))
36
+ message: format(MSG,
37
+ class: target_class,
38
+ method: target_method))
37
39
  end
38
40
  end
39
41
  end
@@ -4,10 +4,29 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks if usage of %() or %Q() matches configuration.
7
+ #
8
+ # @example EnforcedStyle: bare_percent (default)
9
+ # # bad
10
+ # %Q(He said: "#{greeting}")
11
+ # %q{She said: 'Hi'}
12
+ #
13
+ # # good
14
+ # %(He said: "#{greeting}")
15
+ # %{She said: 'Hi'}
16
+ #
17
+ # @example EnforcedStyle: percent_q
18
+ # # bad
19
+ # %|He said: "#{greeting}"|
20
+ # %/She said: 'Hi'/
21
+ #
22
+ # # good
23
+ # %Q|He said: "#{greeting}"|
24
+ # %q/She said: 'Hi'/
25
+ #
7
26
  class BarePercentLiterals < Cop
8
27
  include ConfigurableEnforcedStyle
9
28
 
10
- MSG = 'Use `%%%s` instead of `%%%s`.'.freeze
29
+ MSG = 'Use `%%%<good>s` instead of `%%%<bad>s`.'.freeze
11
30
 
12
31
  def on_dstr(node)
13
32
  check(node)
@@ -17,6 +36,14 @@ module RuboCop
17
36
  check(node)
18
37
  end
19
38
 
39
+ def autocorrect(node)
40
+ src = node.loc.begin.source
41
+ replacement = src.start_with?('%Q') ? '%' : '%Q'
42
+ lambda do |corrector|
43
+ corrector.replace(node.loc.begin, src.sub(/%Q?/, replacement))
44
+ end
45
+ end
46
+
20
47
  private
21
48
 
22
49
  def check(node)
@@ -41,15 +68,9 @@ module RuboCop
41
68
  end
42
69
 
43
70
  def add_offense_for_wrong_style(node, good, bad)
44
- add_offense(node, location: :begin, message: format(MSG, good, bad))
45
- end
46
-
47
- def autocorrect(node)
48
- src = node.loc.begin.source
49
- replacement = src.start_with?('%Q') ? '%' : '%Q'
50
- lambda do |corrector|
51
- corrector.replace(node.loc.begin, src.sub(/%Q?/, replacement))
52
- end
71
+ add_offense(node, location: :begin, message: format(MSG,
72
+ good: good,
73
+ bad: bad))
53
74
  end
54
75
  end
55
76
  end