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
@@ -4,6 +4,18 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop looks for uses of block comments (=begin...=end).
7
+ #
8
+ # @example
9
+ # # bad
10
+ # =begin
11
+ # Multiple lines
12
+ # of comments...
13
+ # =end
14
+ #
15
+ # # good
16
+ # # Multiple lines
17
+ # # of comments...
18
+ #
7
19
  class BlockComments < Cop
8
20
  MSG = 'Do not use block comments.'.freeze
9
21
  BEGIN_LENGTH = "=begin\n".length
@@ -17,8 +29,6 @@ module RuboCop
17
29
  end
18
30
  end
19
31
 
20
- private
21
-
22
32
  def autocorrect(comment)
23
33
  eq_begin, eq_end, contents = parts(comment)
24
34
 
@@ -35,6 +45,8 @@ module RuboCop
35
45
  end
36
46
  end
37
47
 
48
+ private
49
+
38
50
  def parts(comment)
39
51
  expr = comment.loc.expression
40
52
  eq_begin = expr.resize(BEGIN_LENGTH)
@@ -5,6 +5,72 @@ module RuboCop
5
5
  module Style
6
6
  # Check for uses of braces or do/end around single line or
7
7
  # multi-line blocks.
8
+ #
9
+ # @example EnforcedStyle: line_count_based (default)
10
+ # # bad - single line block
11
+ # items.each do |item| item / 5 end
12
+ #
13
+ # # good - single line block
14
+ # items.each { |item| item / 5 }
15
+ #
16
+ # # bad - multi-line block
17
+ # things.map { |thing|
18
+ # something = thing.some_method
19
+ # process(something)
20
+ # }
21
+ #
22
+ # # good - multi-line block
23
+ # things.map do |thing|
24
+ # something = thing.some_method
25
+ # process(something)
26
+ # end
27
+ #
28
+ # @example EnforcedStyle: semantic
29
+ # # Prefer `do...end` over `{...}` for procedural blocks.
30
+ #
31
+ # # return value is used/assigned
32
+ # # bad
33
+ # foo = map do |x|
34
+ # x
35
+ # end
36
+ # puts (map do |x|
37
+ # x
38
+ # end)
39
+ #
40
+ # # return value is not used out of scope
41
+ # # good
42
+ # map do |x|
43
+ # x
44
+ # end
45
+ #
46
+ # # Prefer `{...}` over `do...end` for functional blocks.
47
+ #
48
+ # # return value is not used out of scope
49
+ # # bad
50
+ # each { |x|
51
+ # x
52
+ # }
53
+ #
54
+ # # return value is used/assigned
55
+ # # good
56
+ # foo = map { |x|
57
+ # x
58
+ # }
59
+ # map { |x|
60
+ # x
61
+ # }.inspect
62
+ #
63
+ # @example EnforcedStyle: braces_for_chaining
64
+ # # bad
65
+ # words.each do |word|
66
+ # word.flip.flop
67
+ # end.join("-")
68
+ #
69
+ # # good
70
+ # words.each { |word|
71
+ # word.flip.flop
72
+ # }.join("-")
73
+ #
8
74
  class BlockDelimiters < Cop
9
75
  include ConfigurableEnforcedStyle
10
76
 
@@ -28,10 +94,20 @@ module RuboCop
28
94
  add_offense(node, location: :begin) unless proper_block_style?(node)
29
95
  end
30
96
 
97
+ def autocorrect(node)
98
+ return if correction_would_break_code?(node)
99
+
100
+ if node.braces?
101
+ replace_braces_with_do_end(node.loc)
102
+ else
103
+ replace_do_end_with_braces(node.loc)
104
+ end
105
+ end
106
+
31
107
  private
32
108
 
33
109
  def line_count_based_message(node)
34
- if block_length(node) > 0
110
+ if node.multiline?
35
111
  'Avoid using `{...}` for multi-line blocks.'
36
112
  else
37
113
  'Prefer `{...}` over `do...end` for single-line blocks.'
@@ -49,7 +125,7 @@ module RuboCop
49
125
  end
50
126
 
51
127
  def braces_for_chaining_message(node)
52
- if block_length(node) > 0
128
+ if node.multiline?
53
129
  if return_value_chaining?(node)
54
130
  'Prefer `{...}` over `do...end` for multi-line chained blocks.'
55
131
  else
@@ -68,16 +144,6 @@ module RuboCop
68
144
  end
69
145
  end
70
146
 
71
- def autocorrect(node)
72
- return if correction_would_break_code?(node)
73
-
74
- if node.braces?
75
- replace_braces_with_do_end(node.loc)
76
- else
77
- replace_do_end_with_braces(node.loc)
78
- end
79
- end
80
-
81
147
  def replace_braces_with_do_end(loc)
82
148
  b = loc.begin
83
149
  e = loc.end
@@ -128,7 +194,7 @@ module RuboCop
128
194
  node.each_child_node { |child| get_blocks(child, &block) }
129
195
  end
130
196
  end
131
- # rubocop:enable Metrics/CyclimaticComplexity
197
+ # rubocop:enable Metrics/CyclomaticComplexity
132
198
 
133
199
  def proper_block_style?(node)
134
200
  return true if ignored_method?(node.method_name)
@@ -155,10 +221,9 @@ module RuboCop
155
221
  end
156
222
 
157
223
  def braces_for_chaining_style?(node)
158
- block_length = block_length(node)
159
224
  block_begin = node.loc.begin.source
160
225
 
161
- block_begin == if block_length > 0
226
+ block_begin == if node.multiline?
162
227
  (return_value_chaining?(node) ? '{' : 'do')
163
228
  else
164
229
  '{'
@@ -5,47 +5,44 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for braces around the last parameter in a method call
7
7
  # if the last parameter is a hash.
8
- # It supports 3 styles:
8
+ # It supports `braces`, `no_braces` and `context_dependent` styles.
9
9
  #
10
- # * The `braces` style enforces braces around all method
11
- # parameters that are hashes.
10
+ # @example EnforcedStyle: braces
11
+ # # The `braces` style enforces braces around all method
12
+ # # parameters that are hashes.
12
13
  #
13
- # ```
14
- # # bad
15
- # some_method(x, y, a: 1, b: 2)
14
+ # # bad
15
+ # some_method(x, y, a: 1, b: 2)
16
16
  #
17
- # # good
18
- # some_method(x, y, {a: 1, b: 2})
19
- # ```
17
+ # # good
18
+ # some_method(x, y, {a: 1, b: 2})
20
19
  #
21
- # * The `no_braces` style checks that the last parameter doesn't
22
- # have braces around it.
20
+ # @example EnforcedStyle: no_braces (default)
21
+ # # The `no_braces` style checks that the last parameter doesn't
22
+ # # have braces around it.
23
23
  #
24
- # ```
25
- # # bad
26
- # some_method(x, y, {a: 1, b: 2})
24
+ # # bad
25
+ # some_method(x, y, {a: 1, b: 2})
27
26
  #
28
- # # good
29
- # some_method(x, y, a: 1, b: 2)
30
- # ```
27
+ # # good
28
+ # some_method(x, y, a: 1, b: 2)
31
29
  #
32
- # * The `context_dependent` style checks that the last parameter
33
- # doesn't have braces around it, but requires braces if the
34
- # second to last parameter is also a hash literal.
30
+ # @example EnforcedStyle: context_dependent
31
+ # # The `context_dependent` style checks that the last parameter
32
+ # # doesn't have braces around it, but requires braces if the
33
+ # # second to last parameter is also a hash literal.
35
34
  #
36
- # ```
37
- # # bad
38
- # some_method(x, y, {a: 1, b: 2})
39
- # some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)
35
+ # # bad
36
+ # some_method(x, y, {a: 1, b: 2})
37
+ # some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)
40
38
  #
41
- # # good
42
- # some_method(x, y, a: 1, b: 2)
43
- # some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})
44
- # ```
39
+ # # good
40
+ # some_method(x, y, a: 1, b: 2)
41
+ # some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})
45
42
  class BracesAroundHashParameters < Cop
46
43
  include ConfigurableEnforcedStyle
47
44
 
48
- MSG = '%s curly braces around a hash parameter.'.freeze
45
+ MSG = '%<type>s curly braces around a hash parameter.'.freeze
49
46
 
50
47
  def on_send(node)
51
48
  return if node.assignment_method? || node.operator_method?
@@ -56,6 +53,24 @@ module RuboCop
56
53
  check(node.last_argument, node.arguments)
57
54
  end
58
55
 
56
+ # We let AutocorrectUnlessChangingAST#autocorrect work with the send
57
+ # node, because that context is needed. When parsing the code to see if
58
+ # the AST has changed, a braceless hash would not be parsed as a hash
59
+ # otherwise.
60
+ def autocorrect(send_node)
61
+ hash_node = send_node.last_argument
62
+
63
+ lambda do |corrector|
64
+ if hash_node.braces?
65
+ remove_braces_with_whitespace(corrector,
66
+ hash_node,
67
+ extra_space(hash_node))
68
+ else
69
+ add_braces(corrector, hash_node)
70
+ end
71
+ end
72
+ end
73
+
59
74
  private
60
75
 
61
76
  def check(arg, args)
@@ -82,27 +97,36 @@ module RuboCop
82
97
 
83
98
  def add_arg_offense(arg, type)
84
99
  add_offense(arg.parent, location: arg.source_range,
85
- message: format(MSG, type.to_s.capitalize))
100
+ message: format(MSG,
101
+ type: type.to_s.capitalize))
86
102
  end
87
103
 
88
- # We let AutocorrectUnlessChangingAST#autocorrect work with the send
89
- # node, because that context is needed. When parsing the code to see if
90
- # the AST has changed, a braceless hash would not be parsed as a hash
91
- # otherwise.
92
- def autocorrect(send_node)
93
- hash_node = send_node.last_argument
104
+ def extra_space(hash_node)
105
+ {
106
+ newlines: extra_left_space?(hash_node) &&
107
+ extra_right_space?(hash_node),
108
+ left: extra_left_space?(hash_node),
109
+ right: extra_right_space?(hash_node)
110
+ }
111
+ end
94
112
 
95
- lambda do |corrector|
96
- if hash_node.braces?
97
- remove_braces_with_whitespace(corrector, hash_node)
98
- else
99
- add_braces(corrector, hash_node)
100
- end
113
+ def extra_left_space?(hash_node)
114
+ @extra_left_space ||= begin
115
+ top_line = hash_node.source_range.source_line
116
+ top_line.delete(' ') == '{'
117
+ end
118
+ end
119
+
120
+ def extra_right_space?(hash_node)
121
+ @extra_right_space ||= begin
122
+ bottom_line_number = hash_node.source_range.last_line
123
+ bottom_line = processed_source.lines[bottom_line_number - 1]
124
+ bottom_line.delete(' ') == '}'
101
125
  end
102
126
  end
103
127
 
104
- def remove_braces_with_whitespace(corrector, node)
105
- right_brace_and_space = right_brace_and_space(node.loc.end)
128
+ def remove_braces_with_whitespace(corrector, node, space)
129
+ right_brace_and_space = right_brace_and_space(node.loc.end, space)
106
130
 
107
131
  if comment_on_line?(right_brace_and_space.line)
108
132
  # Removing a line break between a comment and the closing
@@ -110,15 +134,24 @@ module RuboCop
110
134
  # braces in that case.
111
135
  remove_braces(corrector, node)
112
136
  else
113
- left_brace_and_space = range_with_surrounding_space(node.loc.begin,
114
- :right)
137
+ left_brace_and_space =
138
+ range_with_surrounding_space(range: node.loc.begin,
139
+ side: :right,
140
+ newlines: space[:newlines],
141
+ whitespace: space[:left])
115
142
  corrector.remove(left_brace_and_space)
116
143
  corrector.remove(right_brace_and_space)
117
144
  end
118
145
  end
119
146
 
120
- def right_brace_and_space(loc_end)
121
- brace_and_space = range_with_surrounding_space(loc_end, :left)
147
+ def right_brace_and_space(loc_end, space)
148
+ brace_and_space =
149
+ range_with_surrounding_space(
150
+ range: loc_end,
151
+ side: :left,
152
+ newlines: space[:newlines],
153
+ whitespace: space[:right]
154
+ )
122
155
  range_with_surrounding_comma(brace_and_space, :left)
123
156
  end
124
157
 
@@ -4,6 +4,18 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for uses of the case equality operator(===).
7
+ #
8
+ # @example
9
+ # # bad
10
+ # Array === something
11
+ # (1..100) === 7
12
+ # /something/ === some_string
13
+ #
14
+ # # good
15
+ # something.is_a?(Array)
16
+ # (1..100).include?(7)
17
+ # some_string =~ /something/
18
+ #
7
19
  class CaseEquality < Cop
8
20
  MSG = 'Avoid the use of the case equality operator `===`.'.freeze
9
21
 
@@ -4,6 +4,16 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for uses of the character literal ?x.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # ?x
11
+ #
12
+ # # good
13
+ # 'x'
14
+ #
15
+ # # good
16
+ # ?\C-\M-d
7
17
  class CharacterLiteral < Cop
8
18
  include StringHelp
9
19
 
@@ -6,13 +6,17 @@ module RuboCop
6
6
  # This cop checks the style of children definitions at classes and
7
7
  # modules. Basically there are two different styles:
8
8
  #
9
- # nested - have each child on its own line
9
+ # @example EnforcedStyle: nested (default)
10
+ # # good
11
+ # # have each child on its own line
10
12
  # class Foo
11
13
  # class Bar
12
14
  # end
13
15
  # end
14
16
  #
15
- # compact - combine definitions as much as possible
17
+ # @example EnforcedStyle: compact
18
+ # # good
19
+ # # combine definitions as much as possible
16
20
  # class Foo::Bar
17
21
  # end
18
22
  #
@@ -4,10 +4,29 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop enforces consistent use of `Object#is_a?` or `Object#kind_of?`.
7
+ #
8
+ # @example EnforcedStyle: is_a? (default)
9
+ # # bad
10
+ # var.kind_of?(Date)
11
+ # var.kind_of?(Integer)
12
+ #
13
+ # # good
14
+ # var.is_a?(Date)
15
+ # var.is_a?(Integer)
16
+ #
17
+ # @example EnforcedStyle: kind_of?
18
+ # # bad
19
+ # var.is_a?(Time)
20
+ # var.is_a?(String)
21
+ #
22
+ # # good
23
+ # var.kind_of?(Time)
24
+ # var.kind_of?(String)
25
+ #
7
26
  class ClassCheck < Cop
8
27
  include ConfigurableEnforcedStyle
9
28
 
10
- MSG = 'Prefer `Object#%s` over `Object#%s`.'.freeze
29
+ MSG = 'Prefer `Object#%<prefer>s` over `Object#%<current>s`.'.freeze
11
30
 
12
31
  def_node_matcher :class_check?, '(send _ ${:is_a? :kind_of?} _)'
13
32
 
@@ -19,14 +38,6 @@ module RuboCop
19
38
  end
20
39
  end
21
40
 
22
- def message(node)
23
- if node.method?(:is_a?)
24
- format(MSG, 'kind_of?', 'is_a?')
25
- else
26
- format(MSG, 'is_a?', 'kind_of?')
27
- end
28
- end
29
-
30
41
  def autocorrect(node)
31
42
  lambda do |corrector|
32
43
  replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
@@ -34,6 +45,14 @@ module RuboCop
34
45
  corrector.replace(node.loc.selector, replacement)
35
46
  end
36
47
  end
48
+
49
+ def message(node)
50
+ if node.method?(:is_a?)
51
+ format(MSG, prefer: 'kind_of?', current: 'is_a?')
52
+ else
53
+ format(MSG, prefer: 'is_a?', current: 'kind_of?')
54
+ end
55
+ end
37
56
  end
38
57
  end
39
58
  end