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
@@ -56,19 +56,16 @@ module RuboCop
56
56
  PERCENT_CAPITAL_W = '%W'.freeze
57
57
  PERCENT_I = '%i'.freeze
58
58
  PERCENT_CAPITAL_I = '%I'.freeze
59
- ARRAY_NEW_PATTERN = '$(send (const nil? :Array) :new ...)'.freeze
60
59
  ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
61
60
 
62
- def_node_matcher :literal_expansion?, <<-PATTERN
63
- (splat {$({str dstr int float array} ...) (block #{ARRAY_NEW_PATTERN} ...) #{ARRAY_NEW_PATTERN}} ...)
61
+ def_node_matcher :array_new?, '$(send (const nil? :Array) :new ...)'
62
+
63
+ def_node_matcher :literal_expansion, <<-PATTERN
64
+ (splat {$({str dstr int float array} ...) (block $#array_new? ...) $#array_new?} ...)
64
65
  PATTERN
65
66
 
66
67
  def on_splat(node)
67
- literal_expansion?(node) do |object|
68
- if object.send_type?
69
- return unless ASSIGNMENT_TYPES.include?(node.parent.parent.type)
70
- end
71
-
68
+ unneeded_splat_expansion(node) do
72
69
  if array_splat?(node) &&
73
70
  (method_argument?(node) || part_of_an_array?(node))
74
71
  add_offense(node, message: ARRAY_PARAM_MSG)
@@ -78,20 +75,49 @@ module RuboCop
78
75
  end
79
76
  end
80
77
 
78
+ def autocorrect(node)
79
+ range, content = replacement_range_and_content(node)
80
+
81
+ lambda do |corrector|
82
+ corrector.replace(range, content)
83
+ end
84
+ end
85
+
81
86
  private
82
87
 
83
- def autocorrect(node)
88
+ def unneeded_splat_expansion(node)
89
+ literal_expansion(node) do |expanded_item|
90
+ if expanded_item.send_type?
91
+ return if array_new_inside_array_literal?(expanded_item)
92
+
93
+ grandparent = node.parent.parent
94
+ return if grandparent &&
95
+ !ASSIGNMENT_TYPES.include?(grandparent.type)
96
+ end
97
+
98
+ yield
99
+ end
100
+ end
101
+
102
+ def array_new_inside_array_literal?(array_new_node)
103
+ return false unless array_new?(array_new_node)
104
+
105
+ grandparent = array_new_node.parent.parent
106
+ grandparent.array_type? && grandparent.children.size > 1
107
+ end
108
+
109
+ def replacement_range_and_content(node)
84
110
  variable, = *node
85
111
  loc = node.loc
86
112
 
87
- lambda do |corrector|
88
- if !variable.array_type?
89
- corrector.replace(loc.expression, "[#{variable.source}]")
90
- elsif unneeded_brackets?(node)
91
- corrector.replace(loc.expression, remove_brackets(variable))
92
- else
93
- corrector.remove(loc.operator)
94
- end
113
+ if array_new?(variable)
114
+ [node.parent.loc.expression, variable.source]
115
+ elsif !variable.array_type?
116
+ [loc.expression, "[#{variable.source}]"]
117
+ elsif unneeded_brackets?(node)
118
+ [loc.expression, remove_brackets(variable)]
119
+ else
120
+ [loc.operator, '']
95
121
  end
96
122
  end
97
123
 
@@ -103,8 +103,10 @@ module RuboCop
103
103
  end
104
104
 
105
105
  def display_cop_names?
106
- debug? || options[:display_cop_names] ||
107
- config.for_all_cops['DisplayCopNames']
106
+ return true if debug?
107
+ return false if options[:display_cop_names] == false
108
+ return true if options[:display_cop_names]
109
+ config.for_all_cops['DisplayCopNames']
108
110
  end
109
111
 
110
112
  def details
@@ -9,8 +9,8 @@ module RuboCop
9
9
  class AbcSize < Cop
10
10
  include MethodComplexity
11
11
 
12
- MSG = 'Assignment Branch Condition size for %s is too high. ' \
13
- '[%.4g/%.4g]'.freeze
12
+ MSG = 'Assignment Branch Condition size for %<method>s is too high. ' \
13
+ '[%<complexity>.4g/%<max>.4g]'.freeze
14
14
  BRANCH_NODES = %i[send csend].freeze
15
15
  CONDITION_NODES = CyclomaticComplexity::COUNTED_NODES.freeze
16
16
 
@@ -16,7 +16,9 @@ module RuboCop
16
16
  private
17
17
 
18
18
  def message(length, max_length)
19
- format('Class has too many lines. [%d/%d]', length, max_length)
19
+ format('Class has too many lines. [%<length>d/%<max>d]',
20
+ length: length,
21
+ max: max_length)
20
22
  end
21
23
  end
22
24
  end
@@ -16,7 +16,8 @@ module RuboCop
16
16
  class CyclomaticComplexity < Cop
17
17
  include MethodComplexity
18
18
 
19
- MSG = 'Cyclomatic complexity for %s is too high. [%d/%d]'.freeze
19
+ MSG = 'Cyclomatic complexity for %<method>s is too high. ' \
20
+ '[%<complexity>d/%<max>d]'.freeze
20
21
  COUNTED_NODES = %i[if while until for
21
22
  rescue when and or].freeze
22
23
 
@@ -11,7 +11,7 @@ module RuboCop
11
11
  include ConfigurableMax
12
12
  include IgnoredPattern
13
13
 
14
- MSG = 'Line is too long. [%d/%d]'.freeze
14
+ MSG = 'Line is too long. [%<length>d/%<max>d]'.freeze
15
15
 
16
16
  def investigate(processed_source)
17
17
  heredocs = extract_heredocs(processed_source.ast) if allow_heredoc?
@@ -43,7 +43,7 @@ module RuboCop
43
43
  end
44
44
 
45
45
  def register_offense(loc, line)
46
- message = format(MSG, line.length, max)
46
+ message = format(MSG, length: line.length, max: max)
47
47
 
48
48
  add_offense(nil, location: loc, message: message) do
49
49
  self.max = line.length
@@ -16,7 +16,9 @@ module RuboCop
16
16
  private
17
17
 
18
18
  def message(length, max_length)
19
- format('Module has too many lines. [%d/%d]', length, max_length)
19
+ format('Module has too many lines. [%<length>d/%<max>d]',
20
+ length: length,
21
+ max: max_length)
20
22
  end
21
23
  end
22
24
  end
@@ -9,12 +9,15 @@ module RuboCop
9
9
  class ParameterLists < Cop
10
10
  include ConfigurableMax
11
11
 
12
- MSG = 'Avoid parameter lists longer than %d parameters. [%d/%d]'.freeze
12
+ MSG = 'Avoid parameter lists longer than %<max>d parameters. ' \
13
+ '[%<count>d/%<max>d]'.freeze
13
14
 
14
15
  def on_args(node)
15
16
  count = args_count(node)
16
17
  return unless count > max_params
17
18
 
19
+ return if argument_to_lambda_or_proc?(node)
20
+
18
21
  add_offense(node) do
19
22
  self.max = count
20
23
  end
@@ -22,8 +25,12 @@ module RuboCop
22
25
 
23
26
  private
24
27
 
28
+ def_node_matcher :argument_to_lambda_or_proc?, <<-PATTERN
29
+ ^lambda_or_proc?
30
+ PATTERN
31
+
25
32
  def message(node)
26
- format(MSG, max_params, args_count(node), max_params)
33
+ format(MSG, max: max_params, count: args_count(node))
27
34
  end
28
35
 
29
36
  def args_count(node)
@@ -29,7 +29,8 @@ module RuboCop
29
29
  class PerceivedComplexity < Cop
30
30
  include MethodComplexity
31
31
 
32
- MSG = 'Perceived complexity for %s is too high. [%d/%d]'.freeze
32
+ MSG = 'Perceived complexity for %<method>s is too high. ' \
33
+ '[%<complexity>d/%<max>d]'.freeze
33
34
  COUNTED_NODES = %i[if case while until
34
35
  for rescue and or].freeze
35
36
 
@@ -24,7 +24,7 @@ module RuboCop
24
24
  end
25
25
 
26
26
  def preceding_comment?(n1, n2)
27
- n1 && n2 && preceed?(n2, n1) &&
27
+ n1 && n2 && precede?(n2, n1) &&
28
28
  comment_line?(n2.loc.expression.source)
29
29
  end
30
30
 
@@ -9,9 +9,11 @@ module RuboCop
9
9
  extend NodePattern::Macros
10
10
  include ConfigurableEnforcedStyle
11
11
 
12
- MSG_EXTRA = 'Extra empty line detected at %s body %s.'.freeze
13
- MSG_MISSING = 'Empty line missing at %s body %s.'.freeze
14
- MSG_DEFERRED = 'Empty line missing before first %s definition'.freeze
12
+ MSG_EXTRA = 'Extra empty line detected at %<kind>s body ' \
13
+ '%<location>s.'.freeze
14
+ MSG_MISSING = 'Empty line missing at %<kind>s body %<location>s.'.freeze
15
+ MSG_DEFERRED = 'Empty line missing before first %<type>s ' \
16
+ 'definition'.freeze
15
17
 
16
18
  def_node_matcher :constant_definition?, '{class module}'
17
19
  def_node_matcher :empty_line_required?, '{def defs class module}'
@@ -154,11 +156,11 @@ module RuboCop
154
156
  end
155
157
 
156
158
  def message(type, desc)
157
- format(type, self.class::KIND, desc)
159
+ format(type, kind: self.class::KIND, location: desc)
158
160
  end
159
161
 
160
162
  def deferred_message(node)
161
- format(MSG_DEFERRED, node.type)
163
+ format(MSG_DEFERRED, type: node.type)
162
164
  end
163
165
  end
164
166
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common code for empty parameter cops.
6
+ module EmptyParameter
7
+ extend NodePattern::Macros
8
+
9
+ private
10
+
11
+ def_node_matcher :empty_arguments?, <<-PATTERN
12
+ (block _ $(args) _)
13
+ PATTERN
14
+
15
+ def check(node)
16
+ empty_arguments?(node) do |args|
17
+ return if args.empty_and_without_delimiters?
18
+ add_offense(args)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -6,7 +6,8 @@ module RuboCop
6
6
  module EndKeywordAlignment
7
7
  include ConfigurableEnforcedStyle
8
8
 
9
- MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'.freeze
9
+ MSG = '`end` at %<end_line>d, %<end_col>d is not aligned with ' \
10
+ '`%<source>s` at %<align_line>d, %<align_col>d.'.freeze
10
11
 
11
12
  private
12
13
 
@@ -39,8 +40,11 @@ module RuboCop
39
40
 
40
41
  def add_offense_for_misalignment(node, align_with)
41
42
  end_loc = node.loc.end
42
- msg = format(MSG, end_loc.line, end_loc.column, align_with.source,
43
- align_with.line, align_with.column)
43
+ msg = format(MSG, end_line: end_loc.line,
44
+ end_col: end_loc.column,
45
+ source: align_with.source,
46
+ align_line: align_with.line,
47
+ align_col: align_with.column)
44
48
  add_offense(node, location: end_loc, message: msg)
45
49
  end
46
50
 
@@ -1,28 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Common functionality for working with heredoc strings.
4
- module Heredoc
5
- OPENING_DELIMITER = /<<[~-]?['"`]?([^'"`]+)['"`]?/
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality for working with heredoc strings.
6
+ module Heredoc
7
+ OPENING_DELIMITER = /<<[~-]?['"`]?([^'"`]+)['"`]?/
6
8
 
7
- def on_str(node)
8
- return unless heredoc?(node)
9
+ def on_str(node)
10
+ return unless node.heredoc?
9
11
 
10
- on_heredoc(node)
11
- end
12
- alias on_dstr on_str
13
- alias on_xstr on_str
14
-
15
- def on_heredoc(_node)
16
- raise NotImplementedError
17
- end
12
+ on_heredoc(node)
13
+ end
14
+ alias on_dstr on_str
15
+ alias on_xstr on_str
18
16
 
19
- private
17
+ def on_heredoc(_node)
18
+ raise NotImplementedError
19
+ end
20
20
 
21
- def heredoc?(node)
22
- node.loc.is_a?(Parser::Source::Map::Heredoc)
23
- end
21
+ private
24
22
 
25
- def delimiter_string(node)
26
- node.source.match(OPENING_DELIMITER).captures.first
23
+ def delimiter_string(node)
24
+ node.source.match(OPENING_DELIMITER).captures.first
25
+ end
26
+ end
27
27
  end
28
28
  end
@@ -5,25 +5,49 @@ module RuboCop
5
5
  # This module handles measurement and reporting of complexity in methods.
6
6
  module MethodComplexity
7
7
  include ConfigurableMax
8
+ extend NodePattern::Macros
8
9
 
9
10
  def on_def(node)
11
+ check_complexity(node, node.method_name)
12
+ end
13
+ alias on_defs on_def
14
+
15
+ def on_block(node)
16
+ define_method?(node) do |name|
17
+ check_complexity(node, name)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def_node_matcher :define_method?, <<-PATTERN
24
+ (block
25
+ (send nil? :define_method ({sym str} $_))
26
+ args
27
+ _)
28
+ PATTERN
29
+
30
+ def check_complexity(node, method_name)
31
+ # Accepts empty methods always.
32
+ return unless node.body
33
+
10
34
  max = cop_config['Max']
11
- complexity = complexity(node)
35
+ complexity = complexity(node.body)
12
36
 
13
37
  return unless complexity > max
14
38
 
15
- msg = format(self.class::MSG, node.method_name, complexity, max)
39
+ msg = format(self.class::MSG,
40
+ method: method_name,
41
+ complexity: complexity,
42
+ max: max)
16
43
 
17
- add_offense(node, location: :keyword, message: msg) do
44
+ add_offense(node, message: msg) do
18
45
  self.max = complexity.ceil
19
46
  end
20
47
  end
21
- alias on_defs on_def
22
-
23
- private
24
48
 
25
- def complexity(node)
26
- node.each_node(*self.class::COUNTED_NODES).reduce(1) do |score, n|
49
+ def complexity(body)
50
+ body.each_node(*self.class::COUNTED_NODES).reduce(1) do |score, n|
27
51
  score + complexity_score_for(n)
28
52
  end
29
53
  end
@@ -4,14 +4,15 @@ module RuboCop
4
4
  module Cop
5
5
  # Common functionality for checking multiline method calls and binary
6
6
  # operations.
7
- module MultilineExpressionIndentation
7
+ module MultilineExpressionIndentation # rubocop:disable Metrics/ModuleLength
8
8
  KEYWORD_ANCESTOR_TYPES = [:for, :return, *Util::MODIFIER_NODES].freeze
9
9
  UNALIGNED_RHS_TYPES = %i[if while until for return
10
10
  array kwbegin].freeze
11
11
  ASSIGNMENT_RHS_TYPES = [:send, *Util::ASGN_NODES].freeze
12
12
  DEFAULT_MESSAGE_TAIL = 'an expression'.freeze
13
13
  ASSIGNMENT_MESSAGE_TAIL = 'an expression in an assignment'.freeze
14
- KEYWORD_MESSAGE_TAIL = 'a %s in %s `%s` statement'.freeze
14
+ KEYWORD_MESSAGE_TAIL = 'a %<kind>s in %<article>s `%<keyword>s` ' \
15
+ 'statement'.freeze
15
16
 
16
17
  def on_send(node)
17
18
  return if !node.receiver || node.method?(:[])
@@ -103,12 +104,15 @@ module RuboCop
103
104
  kind = keyword == 'for' ? 'collection' : 'condition'
104
105
  article = keyword =~ /^[iu]/ ? 'an' : 'a'
105
106
 
106
- format(KEYWORD_MESSAGE_TAIL, kind, article, keyword)
107
+ format(KEYWORD_MESSAGE_TAIL, kind: kind,
108
+ article: article,
109
+ keyword: keyword)
107
110
  end
108
111
 
109
112
  def kw_node_with_special_indentation(node)
110
113
  keyword_node =
111
114
  node.each_ancestor(*KEYWORD_ANCESTOR_TYPES).find do |ancestor|
115
+ next if ancestor.if_type? && ancestor.ternary?
112
116
  within_node?(node, indented_keyword_expression(ancestor))
113
117
  end
114
118
 
@@ -30,8 +30,8 @@ module RuboCop
30
30
  return if new_line_needed_before_closing_brace?(node)
31
31
 
32
32
  lambda do |corrector|
33
- corrector.remove(range_with_surrounding_space(node.loc.end,
34
- :left))
33
+ corrector.remove(range_with_surrounding_space(range: node.loc.end,
34
+ side: :left))
35
35
 
36
36
  corrector.insert_after(last_element_range_with_trailing_comma(node),
37
37
  node.loc.end.source)
@@ -113,8 +113,10 @@ module RuboCop
113
113
  end
114
114
 
115
115
  def last_element_trailing_comma_range(node)
116
- range = range_with_surrounding_space(children(node).last.source_range,
117
- :right).end.resize(1)
116
+ range = range_with_surrounding_space(
117
+ range: children(node).last.source_range,
118
+ side: :right
119
+ ).end.resize(1)
118
120
  range.source == ',' ? range : nil
119
121
  end
120
122