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
@@ -48,24 +48,22 @@ module RuboCop
48
48
 
49
49
  def_node_matcher :include_statement, <<-PATTERN
50
50
  (send nil? ${:include :extend :prepend}
51
- (const nil? _))
51
+ const)
52
52
  PATTERN
53
53
 
54
54
  def on_send(node)
55
- return unless (statement = include_statement(node))
56
- return unless top_level_node?(node)
55
+ include_statement(node) do |statement|
56
+ return if node.argument?
57
+ return if accepted_include?(node)
57
58
 
58
- add_offense(node, message: format(MSG, statement: statement))
59
+ add_offense(node, message: format(MSG, statement: statement))
60
+ end
59
61
  end
60
62
 
61
63
  private
62
64
 
63
- def top_level_node?(node)
64
- if node.parent.parent.nil?
65
- node.sibling_index.zero?
66
- else
67
- top_level_node?(node.parent)
68
- end
65
+ def accepted_include?(node)
66
+ node.parent && node.macro?
69
67
  end
70
68
  end
71
69
  end
@@ -8,18 +8,30 @@ module RuboCop
8
8
  #
9
9
  # Supported styles are: module_function, extend_self.
10
10
  #
11
- # @example
11
+ # @example EnforcedStyle: module_function (default)
12
+ # # bad
13
+ # module Test
14
+ # extend self
15
+ # # ...
16
+ # end
17
+ #
18
+ # # good
19
+ # module Test
20
+ # module_function
21
+ # # ...
22
+ # end
12
23
  #
13
- # # Good if EnforcedStyle is module_function
24
+ # @example EnforcedStyle: extend_self
25
+ # # bad
14
26
  # module Test
15
27
  # module_function
16
- # ...
28
+ # # ...
17
29
  # end
18
30
  #
19
- # # Good if EnforcedStyle is extend_self
31
+ # # good
20
32
  # module Test
21
33
  # extend self
22
- # ...
34
+ # # ...
23
35
  # end
24
36
  #
25
37
  # These offenses are not auto-corrected since there are different
@@ -18,7 +18,7 @@ module RuboCop
18
18
  include StatementModifier
19
19
  include AutocorrectAlignment
20
20
 
21
- MSG = 'Favor a normal %s-statement over a modifier' \
21
+ MSG = 'Favor a normal %<keyword>s-statement over a modifier' \
22
22
  ' clause in a multiline statement.'.freeze
23
23
 
24
24
  def on_if(node)
@@ -27,16 +27,16 @@ module RuboCop
27
27
  add_offense(node)
28
28
  end
29
29
 
30
- private
31
-
32
30
  def autocorrect(node)
33
31
  lambda do |corrector|
34
32
  corrector.replace(node.source_range, to_normal_if(node))
35
33
  end
36
34
  end
37
35
 
36
+ private
37
+
38
38
  def message(node)
39
- format(MSG, node.keyword)
39
+ format(MSG, keyword: node.keyword)
40
40
  end
41
41
 
42
42
  def to_normal_if(node)
@@ -5,13 +5,14 @@ module RuboCop
5
5
  module Style
6
6
  # Checks for uses of the `then` keyword in multi-line if statements.
7
7
  #
8
- # @example This is considered bad practice:
9
- #
8
+ # @example
9
+ # # bad
10
+ # # This is considered bad practice.
10
11
  # if cond then
11
12
  # end
12
13
  #
13
- # @example If statements can contain `then` on the same line:
14
- #
14
+ # # good
15
+ # # If statements can contain `then` on the same line.
15
16
  # if cond then a
16
17
  # elsif cond then b
17
18
  # end
@@ -20,28 +21,28 @@ module RuboCop
20
21
 
21
22
  NON_MODIFIER_THEN = /then\s*(#.*)?$/
22
23
 
23
- MSG = 'Do not use `then` for multi-line `%s`.'.freeze
24
+ MSG = 'Do not use `then` for multi-line `%<keyword>s`.'.freeze
24
25
 
25
26
  def on_normal_if_unless(node)
26
27
  return unless non_modifier_then?(node)
27
28
 
28
29
  add_offense(node, location: :begin,
29
- message: format(MSG, node.keyword))
30
- end
31
-
32
- private
33
-
34
- def non_modifier_then?(node)
35
- node.loc.begin && node.loc.begin.source_line =~ NON_MODIFIER_THEN
30
+ message: format(MSG, keyword: node.keyword))
36
31
  end
37
32
 
38
33
  def autocorrect(node)
39
34
  lambda do |corrector|
40
35
  corrector.remove(
41
- range_with_surrounding_space(node.loc.begin, :left)
36
+ range_with_surrounding_space(range: node.loc.begin, side: :left)
42
37
  )
43
38
  end
44
39
  end
40
+
41
+ private
42
+
43
+ def non_modifier_then?(node)
44
+ node.loc.begin && node.loc.begin.source_line =~ NON_MODIFIER_THEN
45
+ end
45
46
  end
46
47
  end
47
48
  end
@@ -5,33 +5,27 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks expressions wrapping styles for multiline memoization.
7
7
  #
8
- # @example
9
- #
10
- # # EnforcedStyle: keyword (default)
11
- #
12
- # @bad
8
+ # @example EnforcedStyle: keyword (default)
9
+ # # bad
13
10
  # foo ||= (
14
11
  # bar
15
12
  # baz
16
13
  # )
17
14
  #
18
- # @good
15
+ # # good
19
16
  # foo ||= begin
20
17
  # bar
21
18
  # baz
22
19
  # end
23
20
  #
24
- # @example
25
- #
26
- # # EnforcedStyle: braces
27
- #
28
- # @bad
21
+ # @example EnforcedStyle: braces
22
+ # # bad
29
23
  # foo ||= begin
30
24
  # bar
31
25
  # baz
32
26
  # end
33
27
  #
34
- # @good
28
+ # # good
35
29
  # foo ||= (
36
30
  # bar
37
31
  # baz
@@ -49,8 +43,6 @@ module RuboCop
49
43
  add_offense(rhs, location: node.source_range)
50
44
  end
51
45
 
52
- private
53
-
54
46
  def autocorrect(node)
55
47
  lambda do |corrector|
56
48
  if style == :keyword
@@ -62,6 +54,8 @@ module RuboCop
62
54
  end
63
55
  end
64
56
 
57
+ private
58
+
65
59
  def bad_rhs?(rhs)
66
60
  return false unless rhs.multiline?
67
61
  if style == :keyword
@@ -30,18 +30,6 @@ module RuboCop
30
30
  on_assignment(value)
31
31
  end
32
32
 
33
- private
34
-
35
- def on_assignment(value)
36
- value = splat_value(value) if splat_value(value)
37
-
38
- return unless value && value.mutable_literal?
39
- return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
40
- frozen_string_literals_enabled?
41
-
42
- add_offense(value)
43
- end
44
-
45
33
  def autocorrect(node)
46
34
  expr = node.source_range
47
35
 
@@ -55,6 +43,18 @@ module RuboCop
55
43
  end
56
44
  end
57
45
 
46
+ private
47
+
48
+ def on_assignment(value)
49
+ value = splat_value(value) if splat_value(value)
50
+
51
+ return unless value && value.mutable_literal?
52
+ return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
53
+ frozen_string_literals_enabled?
54
+
55
+ add_offense(value)
56
+ end
57
+
58
58
  def_node_matcher :splat_value, <<-PATTERN
59
59
  (array (splat $_))
60
60
  PATTERN
@@ -10,17 +10,9 @@ module RuboCop
10
10
  # - prefix
11
11
  # - postfix
12
12
  #
13
- # @example
14
- #
15
- # # EnforcedStyle: both
13
+ # @example EnforcedStyle: both (default)
16
14
  # # enforces `unless` for `prefix` and `postfix` conditionals
17
15
  #
18
- # # good
19
- #
20
- # unless foo
21
- # bar
22
- # end
23
- #
24
16
  # # bad
25
17
  #
26
18
  # if !foo
@@ -29,26 +21,30 @@ module RuboCop
29
21
  #
30
22
  # # good
31
23
  #
32
- # bar unless foo
24
+ # unless foo
25
+ # bar
26
+ # end
33
27
  #
34
28
  # # bad
35
29
  #
36
30
  # bar if !foo
37
31
  #
38
- # @example
32
+ # # good
39
33
  #
40
- # # EnforcedStyle: prefix
34
+ # bar unless foo
35
+ #
36
+ # @example EnforcedStyle: prefix
41
37
  # # enforces `unless` for just `prefix` conditionals
42
38
  #
43
- # # good
39
+ # # bad
44
40
  #
45
- # unless foo
41
+ # if !foo
46
42
  # bar
47
43
  # end
48
44
  #
49
- # # bad
45
+ # # good
50
46
  #
51
- # if !foo
47
+ # unless foo
52
48
  # bar
53
49
  # end
54
50
  #
@@ -56,21 +52,19 @@ module RuboCop
56
52
  #
57
53
  # bar if !foo
58
54
  #
59
- # @example
60
- #
61
- # # EnforcedStyle: postfix
55
+ # @example EnforcedStyle: postfix
62
56
  # # enforces `unless` for just `postfix` conditionals
63
57
  #
64
- # # good
65
- #
66
- # bar unless foo
67
- #
68
58
  # # bad
69
59
  #
70
60
  # bar if !foo
71
61
  #
72
62
  # # good
73
63
  #
64
+ # bar unless foo
65
+ #
66
+ # # good
67
+ #
74
68
  # if !foo
75
69
  # bar
76
70
  # end
@@ -78,8 +72,6 @@ module RuboCop
78
72
  include ConfigurableEnforcedStyle
79
73
  include NegativeConditional
80
74
 
81
- MSG = 'Favor `%s` over `%s` for negative conditions.'.freeze
82
-
83
75
  def on_if(node)
84
76
  return if node.elsif? || node.ternary?
85
77
  return if correct_style?(node)
@@ -87,14 +79,14 @@ module RuboCop
87
79
  check_negative_conditional(node)
88
80
  end
89
81
 
82
+ def autocorrect(node)
83
+ negative_conditional_corrector(node)
84
+ end
85
+
90
86
  private
91
87
 
92
88
  def message(node)
93
- format(MSG, node.inverse_keyword, node.keyword)
94
- end
95
-
96
- def autocorrect(node)
97
- negative_conditional_corrector(node)
89
+ format(MSG, inverse: node.inverse_keyword, current: node.keyword)
98
90
  end
99
91
 
100
92
  def correct_style?(node)
@@ -7,8 +7,6 @@ module RuboCop
7
7
  class NegatedWhile < Cop
8
8
  include NegativeConditional
9
9
 
10
- MSG = 'Favor `%s` over `%s` for negative conditions.'.freeze
11
-
12
10
  def on_while(node)
13
11
  check_negative_conditional(node)
14
12
  end
@@ -18,11 +16,9 @@ module RuboCop
18
16
  end
19
17
 
20
18
  def message(node)
21
- format(MSG, node.inverse_keyword, node.keyword)
19
+ format(MSG, inverse: node.inverse_keyword, current: node.keyword)
22
20
  end
23
21
 
24
- private
25
-
26
22
  def autocorrect(node)
27
23
  negative_conditional_corrector(node)
28
24
  end
@@ -7,13 +7,13 @@ module RuboCop
7
7
  # of a parenthesized method call.
8
8
  #
9
9
  # @example
10
- # @good
10
+ # # good
11
11
  # method1(method2(arg), method3(arg))
12
12
  #
13
- # @bad
13
+ # # bad
14
14
  # method1(method2 arg, method3, arg)
15
15
  class NestedParenthesizedCalls < Cop
16
- MSG = 'Add parentheses to nested method call `%s`.'.freeze
16
+ MSG = 'Add parentheses to nested method call `%<source>s`.'.freeze
17
17
 
18
18
  def on_send(node)
19
19
  return unless node.parenthesized?
@@ -23,7 +23,21 @@ module RuboCop
23
23
 
24
24
  add_offense(nested,
25
25
  location: nested.source_range,
26
- message: format(MSG, nested.source))
26
+ message: format(MSG, source: nested.source))
27
+ end
28
+ end
29
+
30
+ def autocorrect(nested)
31
+ first_arg = nested.first_argument.source_range
32
+ last_arg = nested.last_argument.source_range
33
+
34
+ leading_space =
35
+ range_with_surrounding_space(range: first_arg,
36
+ side: :left).begin.resize(1)
37
+
38
+ lambda do |corrector|
39
+ corrector.replace(leading_space, '(')
40
+ corrector.insert_after(last_arg, ')')
27
41
  end
28
42
  end
29
43
 
@@ -41,19 +55,6 @@ module RuboCop
41
55
  send_node.arguments.one?
42
56
  end
43
57
 
44
- def autocorrect(nested)
45
- first_arg = nested.first_argument.source_range
46
- last_arg = nested.last_argument.source_range
47
-
48
- leading_space =
49
- range_with_surrounding_space(first_arg, :left).begin.resize(1)
50
-
51
- lambda do |corrector|
52
- corrector.replace(leading_space, '(')
53
- corrector.insert_after(last_arg, ')')
54
- end
55
- end
56
-
57
58
  def whitelisted_methods
58
59
  cop_config['Whitelist'] || []
59
60
  end
@@ -5,7 +5,35 @@ module RuboCop
5
5
  module Style
6
6
  # Use `next` to skip iteration instead of a condition at the end.
7
7
  #
8
- # @example
8
+ # @example EnforcedStyle: skip_modifier_ifs (default)
9
+ # # bad
10
+ # [1, 2].each do |a|
11
+ # if a == 1
12
+ # puts a
13
+ # end
14
+ # end
15
+ #
16
+ # # good
17
+ # [1, 2].each do |a|
18
+ # next unless a == 1
19
+ # puts a
20
+ # end
21
+ #
22
+ # # good
23
+ # [1, 2].each do |o|
24
+ # puts o unless o == 1
25
+ # end
26
+ #
27
+ # @example EnforcedStyle: always
28
+ # # With `always` all conditions at the end of an iteration needs to be
29
+ # # replaced by next - with `skip_modifier_ifs` the modifier if like
30
+ # # this one are ignored: `[1, 2].each { |a| return 'yes' if a == 1 }`
31
+ #
32
+ # # bad
33
+ # [1, 2].each do |o|
34
+ # puts o unless o == 1
35
+ # end
36
+ #
9
37
  # # bad
10
38
  # [1, 2].each do |a|
11
39
  # if a == 1
@@ -44,6 +72,16 @@ module RuboCop
44
72
  alias on_until on_while
45
73
  alias on_for on_while
46
74
 
75
+ def autocorrect(node)
76
+ lambda do |corrector|
77
+ if node.modifier_form?
78
+ autocorrect_modifier(corrector, node)
79
+ else
80
+ autocorrect_block(corrector, node)
81
+ end
82
+ end
83
+ end
84
+
47
85
  private
48
86
 
49
87
  def check(node)
@@ -102,16 +140,6 @@ module RuboCop
102
140
  offense_begin_pos.join(condition_expression.source_range)
103
141
  end
104
142
 
105
- def autocorrect(node)
106
- lambda do |corrector|
107
- if node.modifier_form?
108
- autocorrect_modifier(corrector, node)
109
- else
110
- autocorrect_block(corrector, node)
111
- end
112
- end
113
- end
114
-
115
143
  def autocorrect_modifier(corrector, node)
116
144
  cond, if_body, else_body = *node
117
145
  body = if_body || else_body