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
@@ -5,6 +5,37 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks that braces used for hash literals have or don't have
7
7
  # surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: space
10
+ # # The `space` style enforces that hash literals have
11
+ # # surrounding space.
12
+ #
13
+ # # bad
14
+ # h = {a: 1, b: 2}
15
+ #
16
+ # # good
17
+ # h = { a: 1, b: 2 }
18
+ #
19
+ # @example EnforcedStyle: no_space
20
+ # # The `no_space` style enforces that hash literals have
21
+ # # no surrounding space.
22
+ #
23
+ # # bad
24
+ # h = { a: 1, b: 2 }
25
+ #
26
+ # # good
27
+ # h = {a: 1, b: 2}
28
+ #
29
+ # @example EnforcedStyle: compact
30
+ # # The `compact` style normally requires a space inside
31
+ # # hash braces, with the exception that successive left
32
+ # # braces or right braces are collapsed together in nested hashes.
33
+ #
34
+ # # bad
35
+ # h = { a: { b: 2 } }
36
+ #
37
+ # # good
38
+ # h = { a: { b: 2 }}
8
39
  class SpaceInsideHashLiteralBraces < Cop
9
40
  include SurroundingSpace
10
41
  include ConfigurableEnforcedStyle
@@ -22,36 +53,45 @@ module RuboCop
22
53
  end
23
54
  end
24
55
 
56
+ def autocorrect(range)
57
+ lambda do |corrector|
58
+ # It is possible that BracesAroundHashParameters will remove the
59
+ # braces while this cop inserts spaces. This can lead to unwanted
60
+ # changes to the inspected code. If we replace the brace with a
61
+ # brace plus space (rather than just inserting a space), then any
62
+ # removal of the same brace will give us a clobbering error. This
63
+ # in turn will make RuboCop fall back on cop-by-cop
64
+ # auto-correction. Problem solved.
65
+ case range.source
66
+ when /\s/ then corrector.remove(range)
67
+ when '{' then corrector.replace(range, '{ ')
68
+ else corrector.replace(range, ' }')
69
+ end
70
+ end
71
+ end
72
+
25
73
  private
26
74
 
27
75
  def hash_literal_with_braces(node)
28
76
  tokens = processed_source.tokens
29
77
  begin_index = index_of_first_token(node)
30
- return unless left_brace?(tokens[begin_index])
78
+ return unless tokens[begin_index].left_brace?
31
79
 
32
80
  end_index = index_of_last_token(node)
33
- return unless right_brace?(tokens[end_index])
81
+ return unless tokens[end_index].right_curly_brace?
34
82
 
35
83
  yield begin_index, end_index
36
84
  end
37
85
 
38
- def left_brace?(token)
39
- token.type == :tLBRACE
40
- end
41
-
42
- def right_brace?(token)
43
- token.type == :tRCURLY
44
- end
45
-
46
86
  def check(t1, t2)
47
87
  # No offense if line break inside.
48
- return if t1.pos.line < t2.pos.line
49
- return if t2.type == :tCOMMENT # Also indicates there's a line break.
88
+ return if t1.line < t2.line
89
+ return if t2.comment? # Also indicates there's a line break.
50
90
 
51
- is_empty_braces = left_brace?(t1) && right_brace?(t2)
91
+ is_empty_braces = t1.left_brace? && t2.right_curly_brace?
52
92
  expect_space = expect_space?(t1, t2)
53
93
 
54
- if offense?(t1, t2, expect_space)
94
+ if offense?(t1, expect_space)
55
95
  incorrect_style_detected(t1, t2, expect_space, is_empty_braces)
56
96
  else
57
97
  correct_style_detected
@@ -60,7 +100,7 @@ module RuboCop
60
100
 
61
101
  def expect_space?(t1, t2)
62
102
  is_same_braces = t1.type == t2.type
63
- is_empty_braces = left_brace?(t1) && right_brace?(t2)
103
+ is_empty_braces = t1.left_brace? && t2.right_curly_brace?
64
104
 
65
105
  if is_same_braces && style == :compact
66
106
  false
@@ -92,8 +132,8 @@ module RuboCop
92
132
  end
93
133
  end
94
134
 
95
- def offense?(t1, t2, expect_space)
96
- has_space = space_between?(t1, t2)
135
+ def offense?(t1, expect_space)
136
+ has_space = t1.space_after?
97
137
  expect_space ? !has_space : has_space
98
138
  end
99
139
 
@@ -107,23 +147,6 @@ module RuboCop
107
147
  format(MSG, "#{inside_what} #{problem}")
108
148
  end
109
149
 
110
- def autocorrect(range)
111
- lambda do |corrector|
112
- # It is possible that BracesAroundHashParameters will remove the
113
- # braces while this cop inserts spaces. This can lead to unwanted
114
- # changes to the inspected code. If we replace the brace with a
115
- # brace plus space (rather than just inserting a space), then any
116
- # removal of the same brace will give us a clobbering error. This
117
- # in turn will make RuboCop fall back on cop-by-cop
118
- # auto-correction. Problem solved.
119
- case range.source
120
- when /\s/ then corrector.remove(range)
121
- when '{' then corrector.replace(range, '{ ')
122
- else corrector.replace(range, ' }')
123
- end
124
- end
125
- end
126
-
127
150
  def space_range(token_range)
128
151
  if token_range.source == '{'
129
152
  range_of_space_to_the_right(token_range)
@@ -14,10 +14,38 @@ module RuboCop
14
14
  # f(3)
15
15
  # g = (a + 3)
16
16
  class SpaceInsideParens < Cop
17
- include SpaceInside
17
+ include SurroundingSpace
18
18
 
19
- def specifics
20
- [%i[tLPAREN tLPAREN2], :tRPAREN, 'parentheses']
19
+ MSG = 'Space inside parentheses detected.'.freeze
20
+
21
+ def investigate(processed_source)
22
+ @processed_source = processed_source
23
+ each_extraneous_space(processed_source.tokens) do |range|
24
+ add_offense(range, location: range)
25
+ end
26
+ end
27
+
28
+ def autocorrect(range)
29
+ ->(corrector) { corrector.remove(range) }
30
+ end
31
+
32
+ private
33
+
34
+ def each_extraneous_space(tokens)
35
+ tokens.each_cons(2) do |t1, t2|
36
+ next unless parens?(t1, t2)
37
+
38
+ # If the second token is a comment, that means that a line break
39
+ # follows, and that the rules for space inside don't apply.
40
+ next if t2.comment?
41
+ next unless t2.line == t1.line && t1.space_after?
42
+
43
+ yield range_between(t1.end_pos, t2.begin_pos)
44
+ end
45
+ end
46
+
47
+ def parens?(t1, t2)
48
+ t1.left_parens? || t2.right_parens?
21
49
  end
22
50
  end
23
51
  end
@@ -28,21 +28,6 @@ module RuboCop
28
28
  check(node)
29
29
  end
30
30
 
31
- private
32
-
33
- def check(node)
34
- expression = node.source
35
- op = node.loc.operator.source
36
- escaped_op = op.gsub(/\./, '\.')
37
-
38
- # account for multiline range literals
39
- expression.sub!(/#{escaped_op}\n\s*/, op)
40
-
41
- return unless expression =~ /(\s#{escaped_op})|(#{escaped_op}\s)/
42
-
43
- add_offense(node)
44
- end
45
-
46
31
  def autocorrect(node)
47
32
  expression = node.source
48
33
  operator = node.loc.operator.source
@@ -57,6 +42,21 @@ module RuboCop
57
42
  )
58
43
  end
59
44
  end
45
+
46
+ private
47
+
48
+ def check(node)
49
+ expression = node.source
50
+ op = node.loc.operator.source
51
+ escaped_op = op.gsub(/\./, '\.')
52
+
53
+ # account for multiline range literals
54
+ expression.sub!(/#{escaped_op}\n\s*/, op)
55
+
56
+ return unless expression =~ /(\s#{escaped_op})|(#{escaped_op}\s)/
57
+
58
+ add_offense(node)
59
+ end
60
60
  end
61
61
  end
62
62
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks that reference brackets have or don't have
7
+ # surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: no_space (default)
10
+ # # The `no_space` style enforces that reference brackets have
11
+ # # no surrounding space.
12
+ #
13
+ # # bad
14
+ # hash[ :key ]
15
+ # array[ index ]
16
+ #
17
+ # # good
18
+ # hash[:key]
19
+ # array[index]
20
+ #
21
+ # @example EnforcedStyle: space
22
+ # # The `space` style enforces that reference brackets have
23
+ # # surrounding space.
24
+ #
25
+ # # bad
26
+ # hash[:key]
27
+ # array[index]
28
+ #
29
+ # # good
30
+ # hash[ :key ]
31
+ # array[ index ]
32
+ class SpaceInsideReferenceBrackets < Cop
33
+ include SurroundingSpace
34
+ include ConfigurableEnforcedStyle
35
+
36
+ MSG = '%<command>s space inside reference brackets.'.freeze
37
+
38
+ def on_send(node)
39
+ return if node.multiline?
40
+ return unless left_ref_bracket(node)
41
+ left_token = left_ref_bracket(node)
42
+ right_token = right_ref_bracket(node, left_token)
43
+
44
+ if style == :no_space
45
+ no_space_offenses(node, left_token, right_token, MSG)
46
+ else
47
+ space_offenses(node, left_token, right_token, MSG)
48
+ end
49
+ end
50
+
51
+ def autocorrect(node)
52
+ lambda do |corrector|
53
+ left, right = reference_brackets(node)
54
+
55
+ if style == :no_space
56
+ no_space_corrector(corrector, left, right)
57
+ else
58
+ space_corrector(corrector, left, right)
59
+ end
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def reference_brackets(node)
66
+ left = left_ref_bracket(node)
67
+ [left, right_ref_bracket(node, left)]
68
+ end
69
+
70
+ def left_ref_bracket(node)
71
+ tokens(node).reverse.find(&:left_ref_bracket?)
72
+ end
73
+
74
+ def right_ref_bracket(node, token)
75
+ i = tokens(node).index(token)
76
+ tokens(node).slice(i..-1).find(&:right_bracket?)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -5,11 +5,18 @@ module RuboCop
5
5
  module Layout
6
6
  # This cop checks for whitespace within string interpolations.
7
7
  #
8
- # @example
9
- # # Good if EnforcedStyle is no_space, bad if space.
8
+ # @example EnforcedStyle: no_space (default)
9
+ # # bad
10
+ # var = "This is the #{ space } example"
11
+ #
12
+ # # good
13
+ # var = "This is the #{no_space} example"
14
+ #
15
+ # @example EnforcedStyle: space
16
+ # # bad
10
17
  # var = "This is the #{no_space} example"
11
18
  #
12
- # # Good if EnforceStyle is space, bad if no_space.
19
+ # # good
13
20
  # var = "This is the #{ space } example"
14
21
  class SpaceInsideStringInterpolation < Cop
15
22
  include ConfigurableEnforcedStyle
@@ -23,6 +30,16 @@ module RuboCop
23
30
  end
24
31
  end
25
32
 
33
+ def autocorrect(node)
34
+ new_source = style == :no_space ? node.source : " #{node.source} "
35
+ lambda do |corrector|
36
+ corrector.replace(
37
+ range_with_surrounding_space(range: node.source_range),
38
+ new_source
39
+ )
40
+ end
41
+ end
42
+
26
43
  private
27
44
 
28
45
  def each_style_violation(node)
@@ -44,25 +61,19 @@ module RuboCop
44
61
 
45
62
  def space_on_any_side?(node)
46
63
  interp = node.source_range
47
- interp_with_surrounding_space = range_with_surrounding_space(interp)
64
+ interp_with_surrounding_space =
65
+ range_with_surrounding_space(range: interp)
48
66
 
49
67
  interp_with_surrounding_space != interp
50
68
  end
51
69
 
52
70
  def space_on_each_side?(node)
53
71
  interp = node.source_range
54
- interp_with_surrounding_space = range_with_surrounding_space(interp)
72
+ interp_with_surrounding_space =
73
+ range_with_surrounding_space(range: interp)
55
74
 
56
75
  interp_with_surrounding_space.source == " #{interp.source} "
57
76
  end
58
-
59
- def autocorrect(node)
60
- new_source = style == :no_space ? node.source : " #{node.source} "
61
- lambda do |corrector|
62
- corrector.replace(range_with_surrounding_space(node.source_range),
63
- new_source)
64
- end
65
- end
66
77
  end
67
78
  end
68
79
  end
@@ -28,8 +28,6 @@ module RuboCop
28
28
  end
29
29
  end
30
30
 
31
- private
32
-
33
31
  def autocorrect(range)
34
32
  lambda do |corrector|
35
33
  spaces = ' ' * configured_indentation_width
@@ -37,6 +35,8 @@ module RuboCop
37
35
  end
38
36
  end
39
37
 
38
+ private
39
+
40
40
  def string_literal_lines(ast)
41
41
  # which lines start inside a string literal?
42
42
  return [] if ast.nil?
@@ -28,6 +28,12 @@ module RuboCop
28
28
  whitespace_at_end)
29
29
  end
30
30
 
31
+ def autocorrect(range)
32
+ lambda do |corrector|
33
+ corrector.replace(range, style == :final_newline ? "\n" : "\n\n")
34
+ end
35
+ end
36
+
31
37
  private
32
38
 
33
39
  def offense_detected(sb, wanted_blank_lines, blank_lines,
@@ -48,7 +54,7 @@ module RuboCop
48
54
  return true if sb.source.strip.start_with?('__END__')
49
55
  return false if processed_source.tokens.empty?
50
56
 
51
- extra = sb.source[processed_source.tokens.last.pos.end_pos..-1]
57
+ extra = sb.source[processed_source.tokens.last.end_pos..-1]
52
58
  extra && extra.strip.start_with?('__END__')
53
59
  end
54
60
 
@@ -68,12 +74,6 @@ module RuboCop
68
74
  instead_of)
69
75
  end
70
76
  end
71
-
72
- def autocorrect(range)
73
- lambda do |corrector|
74
- corrector.replace(range, style == :final_newline ? "\n" : "\n\n")
75
- end
76
- end
77
77
  end
78
78
  end
79
79
  end
@@ -29,39 +29,30 @@ module RuboCop
29
29
  ' associated with the `%s` method call.'.freeze
30
30
 
31
31
  def on_send(node)
32
- return if node.parenthesized? || allowed_method?(node)
33
- return if lambda_argument?(node.last_argument)
32
+ return if !node.arguments? || node.parenthesized? ||
33
+ node.last_argument.lambda? || allowed_method?(node)
34
34
 
35
- return unless method_with_block?(node.last_argument)
36
- last_param = node.last_argument.children.first
37
- return unless method_as_param?(last_param)
35
+ return unless ambiguous_block_association?(node)
38
36
 
39
37
  add_offense(node)
40
38
  end
41
39
 
42
40
  private
43
41
 
44
- def allowed_method?(node)
45
- node.assignment? || node.operator_method? || node.method?(:[])
46
- end
47
-
48
- def method_with_block?(param)
49
- param && param.block_type?
42
+ def ambiguous_block_association?(send_node)
43
+ send_node.last_argument.block_type? &&
44
+ !send_node.last_argument.send_node.arguments?
50
45
  end
51
46
 
52
- def method_as_param?(param)
53
- param && param.send_type? && !param.arguments?
47
+ def allowed_method?(node)
48
+ node.assignment? || node.operator_method? || node.method?(:[])
54
49
  end
55
50
 
56
- def message(node)
57
- param = node.last_argument
51
+ def message(send_node)
52
+ block_param = send_node.last_argument
58
53
 
59
- format(MSG, param.source, param.children.first.source)
54
+ format(MSG, block_param.source, block_param.send_node.source)
60
55
  end
61
-
62
- def_node_matcher :lambda_argument?, <<-PATTERN
63
- (block (send _ :lambda) ...)
64
- PATTERN
65
56
  end
66
57
  end
67
58
  end