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
@@ -30,7 +30,7 @@ module RuboCop
30
30
  return if node.keywords?
31
31
 
32
32
  left_brace = node.loc.begin
33
- space_plus_brace = range_with_surrounding_space(left_brace)
33
+ space_plus_brace = range_with_surrounding_space(range: left_brace)
34
34
  used_style =
35
35
  space_plus_brace.source.start_with?('{') ? :no_space : :space
36
36
 
@@ -41,6 +41,15 @@ module RuboCop
41
41
  end
42
42
  end
43
43
 
44
+ def autocorrect(range)
45
+ lambda do |corrector|
46
+ case range.source
47
+ when /\s/ then corrector.remove(range)
48
+ else corrector.insert_before(range, ' ')
49
+ end
50
+ end
51
+ end
52
+
44
53
  private
45
54
 
46
55
  def check_empty(left_brace, space_plus_brace, used_style)
@@ -89,15 +98,6 @@ module RuboCop
89
98
  end
90
99
  end
91
100
 
92
- def autocorrect(range)
93
- lambda do |corrector|
94
- case range.source
95
- when /\s/ then corrector.remove(range)
96
- else corrector.insert_before(range, ' ')
97
- end
98
- end
99
- end
100
-
101
101
  def empty_braces?(loc)
102
102
  loc.begin.end_pos == loc.end.begin_pos
103
103
  end
@@ -4,11 +4,22 @@ module RuboCop
4
4
  module Cop
5
5
  module Layout
6
6
  # Checks for comma (,) preceded by space.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # [1 , 2 , 3]
11
+ # a(1 , 2)
12
+ # each { |a , b| }
13
+ #
14
+ # # good
15
+ # [1, 2, 3]
16
+ # a(1, 2)
17
+ # each { |a, b| }
7
18
  class SpaceBeforeComma < Cop
8
19
  include SpaceBeforePunctuation
9
20
 
10
21
  def kind(token)
11
- 'comma' if token.type == :tCOMMA
22
+ 'comma' if token.comma?
12
23
  end
13
24
  end
14
25
  end
@@ -17,14 +17,12 @@ module RuboCop
17
17
 
18
18
  def investigate(processed_source)
19
19
  processed_source.tokens.each_cons(2) do |t1, t2|
20
- next unless t2.type == :tCOMMENT
21
- next unless t1.pos.line == t2.pos.line
20
+ next unless t2.comment?
21
+ next unless t1.line == t2.line
22
22
  add_offense(t2.pos, location: t2.pos) if t1.pos.end == t2.pos.begin
23
23
  end
24
24
  end
25
25
 
26
- private
27
-
28
26
  def autocorrect(range)
29
27
  ->(corrector) { corrector.insert_before(range, ' ') }
30
28
  end
@@ -11,12 +11,12 @@ module RuboCop
11
11
  # config parameter is true.
12
12
  #
13
13
  # @example
14
- # @bad
14
+ # # bad
15
15
  # something x
16
16
  # something y, z
17
17
  # something'hello'
18
18
  #
19
- # @good
19
+ # # good
20
20
  # something x
21
21
  # something y, z
22
22
  # something 'hello'
@@ -32,7 +32,8 @@ module RuboCop
32
32
  return unless expect_params_after_method_name?(node)
33
33
 
34
34
  first_arg = node.first_argument.source_range
35
- first_arg_with_space = range_with_surrounding_space(first_arg, :left)
35
+ first_arg_with_space = range_with_surrounding_space(range: first_arg,
36
+ side: :left)
36
37
  space = range_between(first_arg_with_space.begin_pos,
37
38
  first_arg.begin_pos)
38
39
 
@@ -15,7 +15,7 @@ module RuboCop
15
15
  include SpaceBeforePunctuation
16
16
 
17
17
  def kind(token)
18
- 'semicolon' if token.type == :tSEMI
18
+ 'semicolon' if token.semicolon?
19
19
  end
20
20
  end
21
21
  end
@@ -6,24 +6,18 @@ module RuboCop
6
6
  # This cop checks for spaces between -> and opening parameter
7
7
  # brace in lambda literals.
8
8
  #
9
- # @example
10
- #
11
- # EnforcedStyle: require_no_space (default)
12
- #
13
- # @bad
9
+ # @example EnforcedStyle: require_no_space (default)
10
+ # # bad
14
11
  # a = -> (x, y) { x + y }
15
12
  #
16
- # @good
13
+ # # good
17
14
  # a = ->(x, y) { x + y }
18
15
  #
19
- # @example
20
- #
21
- # EnforcedStyle: require_space
22
- #
23
- # @bad
16
+ # @example EnforcedStyle: require_space
17
+ # # bad
24
18
  # a = ->(x, y) { x + y }
25
19
  #
26
- # @good
20
+ # # good
27
21
  # a = -> (x, y) { x + y }
28
22
  class SpaceInLambdaLiteral < Cop
29
23
  include ConfigurableEnforcedStyle
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Checks that brackets used for array literals have or don't have
7
+ # surrounding space depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: space
10
+ # # The `space` style enforces that array literals have
11
+ # # surrounding space.
12
+ #
13
+ # # bad
14
+ # array = [a, b, c, d]
15
+ #
16
+ # # good
17
+ # array = [ a, b, c, d ]
18
+ #
19
+ # @example EnforcedStyle: no_space
20
+ # # The `no_space` style enforces that array literals have
21
+ # # no surrounding space.
22
+ #
23
+ # # bad
24
+ # array = [ a, b, c, d ]
25
+ #
26
+ # # good
27
+ # array = [a, b, c, d]
28
+ #
29
+ # @example EnforcedStyle: compact
30
+ # # The `compact` style normally requires a space inside
31
+ # # array brackets, with the exception that successive left
32
+ # # or right brackets are collapsed together in nested arrays.
33
+ #
34
+ # # bad
35
+ # array = [ a, [ b, c ] ]
36
+ #
37
+ # # good
38
+ # array = [ a, [ b, c ]]
39
+ class SpaceInsideArrayLiteralBrackets < Cop
40
+ include SurroundingSpace
41
+ include ConfigurableEnforcedStyle
42
+
43
+ MSG = '%<command>s space inside array brackets.'.freeze
44
+ EMPTY_MSG = '%<command>s space inside empty array brackets.'.freeze
45
+
46
+ def on_array(node)
47
+ return unless node.square_brackets?
48
+ left, right = array_brackets(node)
49
+ if empty_brackets?(left, right)
50
+ return empty_offenses(node, left, right)
51
+ end
52
+
53
+ start_ok = next_to_newline?(node, left)
54
+ end_ok = node.single_line? ? false : end_has_own_line?(right)
55
+
56
+ issue_offenses(node, left, right, start_ok, end_ok)
57
+ end
58
+
59
+ def autocorrect(node)
60
+ left, right = array_brackets(node)
61
+
62
+ lambda do |corrector|
63
+ if empty_brackets?(left, right)
64
+ empty_corrections(corrector, left, right)
65
+ elsif style == :no_space
66
+ no_space_corrector(corrector, left, right)
67
+ elsif style == :space
68
+ space_corrector(corrector, left, right)
69
+ else
70
+ compact_corrections(corrector, node, left, right)
71
+ end
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def array_brackets(node)
78
+ [left_array_bracket(node), right_array_bracket(node)]
79
+ end
80
+
81
+ def left_array_bracket(node)
82
+ tokens(node).find(&:left_array_bracket?)
83
+ end
84
+
85
+ def right_array_bracket(node)
86
+ tokens(node).reverse.find(&:right_bracket?)
87
+ end
88
+
89
+ def empty_brackets?(left, right)
90
+ processed_source.tokens.index(left) ==
91
+ processed_source.tokens.index(right) - 1
92
+ end
93
+
94
+ def empty_offenses(node, left, right)
95
+ empty_offense(node, 'Use one') if offending_empty_space?(left, right)
96
+ return unless offending_empty_no_space?(left, right)
97
+ empty_offense(node, 'Do not use')
98
+ end
99
+
100
+ def empty_offense(node, command)
101
+ add_offense(node, message: format(EMPTY_MSG, command: command))
102
+ end
103
+
104
+ def offending_empty_space?(left, right)
105
+ empty_config == 'space' && !space_between?(left, right)
106
+ end
107
+
108
+ def offending_empty_no_space?(left, right)
109
+ empty_config == 'no_space' && !no_space_between?(left, right)
110
+ end
111
+
112
+ def space_between?(left, right)
113
+ left.end_pos + 1 == right.begin_pos
114
+ end
115
+
116
+ def no_space_between?(left, right)
117
+ left.end_pos == right.begin_pos
118
+ end
119
+
120
+ def empty_config
121
+ cop_config['EnforcedStyleForEmptyBrackets']
122
+ end
123
+
124
+ def empty_corrections(corrector, left, right)
125
+ if offending_empty_space?(left, right)
126
+ range = side_space_range(range: left.pos, side: :right)
127
+ corrector.remove(range)
128
+ corrector.insert_after(left.pos, ' ')
129
+ elsif offending_empty_no_space?(left, right)
130
+ range = side_space_range(range: left.pos, side: :right)
131
+ corrector.remove(range)
132
+ end
133
+ end
134
+
135
+ def next_to_newline?(node, token)
136
+ tokens(node)[index_for(node, token) + 1].line != token.line
137
+ end
138
+
139
+ def end_has_own_line?(token)
140
+ line, col = line_and_column_for(token)
141
+ return true if col == -1
142
+ processed_source.lines[line][0..col].delete(' ').empty?
143
+ end
144
+
145
+ def index_for(node, token)
146
+ tokens(node).index(token)
147
+ end
148
+
149
+ def line_and_column_for(token)
150
+ [token.line - 1, token.column - 1]
151
+ end
152
+
153
+ def issue_offenses(node, left, right, start_ok, end_ok)
154
+ if style == :no_space
155
+ start_ok = next_to_comment?(node, left)
156
+ no_space_offenses(node, left, right, MSG, start_ok: start_ok,
157
+ end_ok: end_ok)
158
+ elsif style == :space
159
+ space_offenses(node, left, right, MSG, start_ok: start_ok,
160
+ end_ok: end_ok)
161
+ else
162
+ compact_offenses(node, left, right, start_ok, end_ok)
163
+ end
164
+ end
165
+
166
+ def next_to_comment?(node, token)
167
+ tokens(node)[index_for(node, token) + 1].comment?
168
+ end
169
+
170
+ def compact_offenses(node, left, right, start_ok, end_ok)
171
+ if qualifies_for_compact?(node, left, side: :left)
172
+ compact_offense(node, left, side: :left)
173
+ elsif !multi_dimensional_array?(node, left, side: :left)
174
+ space_offenses(node, left, nil, MSG, start_ok: start_ok,
175
+ end_ok: true)
176
+ end
177
+ if qualifies_for_compact?(node, right)
178
+ compact_offense(node, right)
179
+ elsif !multi_dimensional_array?(node, right)
180
+ space_offenses(node, nil, right, MSG, start_ok: true,
181
+ end_ok: end_ok)
182
+ end
183
+ end
184
+
185
+ def qualifies_for_compact?(node, token, side: :right)
186
+ if side == :right
187
+ multi_dimensional_array?(node, token) &&
188
+ !next_to_bracket?(token)
189
+ else
190
+ multi_dimensional_array?(node, token, side: :left) &&
191
+ !next_to_bracket?(token, side: :left)
192
+ end
193
+ end
194
+
195
+ def multi_dimensional_array?(node, token, side: :right)
196
+ i = index_for(node, token)
197
+ if side == :right
198
+ tokens(node)[i - 1].right_bracket?
199
+ else
200
+ tokens(node)[i + 1].left_array_bracket?
201
+ end
202
+ end
203
+
204
+ def next_to_bracket?(token, side: :right)
205
+ line_index, col = line_and_column_for(token)
206
+ line = processed_source.lines[line_index]
207
+ side == :right ? line[col] == ']' : line[col + 2] == '['
208
+ end
209
+
210
+ def compact_offense(node, token, side: :right)
211
+ if side == :right
212
+ space_offense(node, token, :left, MSG, NO_SPACE_COMMAND)
213
+ else
214
+ space_offense(node, token, :right, MSG, NO_SPACE_COMMAND)
215
+ end
216
+ end
217
+
218
+ def compact_corrections(corrector, node, left, right)
219
+ if qualifies_for_compact?(node, left, side: :left)
220
+ range = side_space_range(range: left.pos, side: :right)
221
+ corrector.remove(range)
222
+ elsif !left.space_after?
223
+ corrector.insert_after(left.pos, ' ')
224
+ end
225
+ if qualifies_for_compact?(node, right)
226
+ range = side_space_range(range: right.pos, side: :left)
227
+ corrector.remove(range)
228
+ elsif !right.space_before?
229
+ corrector.insert_before(right.pos, ' ')
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -7,11 +7,11 @@ module RuboCop
7
7
  # (i.e. %i/%w).
8
8
  #
9
9
  # @example
10
- # @good
11
- # %i(foo bar baz)
12
10
  #
13
- # @bad
11
+ # # bad
14
12
  # %w(foo bar baz)
13
+ # # good
14
+ # %i(foo bar baz)
15
15
  class SpaceInsideArrayPercentLiteral < Cop
16
16
  include MatchRange
17
17
  include PercentLiteral
@@ -7,6 +7,75 @@ module RuboCop
7
7
  # them on configuration. For blocks taking parameters, it checks that the
8
8
  # left brace has or doesn't have trailing space depending on
9
9
  # configuration.
10
+ #
11
+ # @example EnforcedStyle: space (default)
12
+ # # The `space` style enforces that block braces have
13
+ # # surrounding space.
14
+ #
15
+ # # bad
16
+ # some_array.each {puts e}
17
+ #
18
+ # # good
19
+ # some_array.each { puts e }
20
+ #
21
+ # @example EnforcedStyle: no_space
22
+ # # The `no_space` style enforces that block braces don't
23
+ # # have surrounding space.
24
+ #
25
+ # # bad
26
+ # some_array.each { puts e }
27
+ #
28
+ # # good
29
+ # some_array.each {puts e}
30
+ #
31
+ #
32
+ # @example EnforcedStyleForEmptyBraces: no_space (default)
33
+ # # The `no_space` EnforcedStyleForEmptyBraces style enforces that
34
+ # # block braces don't have a space in between when empty.
35
+ #
36
+ # # bad
37
+ # some_array.each { }
38
+ # some_array.each { }
39
+ # some_array.each { }
40
+ #
41
+ # # good
42
+ # some_array.each {}
43
+ #
44
+ # @example EnforcedStyleForEmptyBraces: space
45
+ # # The `space` EnforcedStyleForEmptyBraces style enforces that
46
+ # # block braces have at least a spece in between when empty.
47
+ #
48
+ # # bad
49
+ # some_array.each {}
50
+ #
51
+ # # good
52
+ # some_array.each { }
53
+ # some_array.each { }
54
+ # some_array.each { }
55
+ #
56
+ #
57
+ # @example SpaceBeforeBlockParameters: true (default)
58
+ # # The SpaceBeforeBlockParameters style set to `true` enforces that
59
+ # # there is a space between `{` and `|`. Overrides `EnforcedStyle`
60
+ # # if there is a conflict.
61
+ #
62
+ # # bad
63
+ # [1, 2, 3].each {|n| n * 2 }
64
+ #
65
+ # # good
66
+ # [1, 2, 3].each { |n| n * 2 }
67
+ #
68
+ # @example SpaceBeforeBlockParameters: true
69
+ # # The SpaceBeforeBlockParameters style set to `false` enforces that
70
+ # # there is no space between `{` and `|`. Overrides `EnforcedStyle`
71
+ # # if there is a conflict.
72
+ #
73
+ # # bad
74
+ # [1, 2, 3].each { |n| n * 2 }
75
+ #
76
+ # # good
77
+ # [1, 2, 3].each {|n| n * 2 }
78
+ #
10
79
  class SpaceInsideBlockBraces < Cop
11
80
  include ConfigurableEnforcedStyle
12
81
  include SurroundingSpace
@@ -20,6 +89,17 @@ module RuboCop
20
89
  check_inside(node, left_brace, right_brace)
21
90
  end
22
91
 
92
+ def autocorrect(range)
93
+ lambda do |corrector|
94
+ case range.source
95
+ when /\s/ then corrector.remove(range)
96
+ when '{}' then corrector.replace(range, '{ }')
97
+ when '{|' then corrector.replace(range, '{ |')
98
+ else corrector.insert_before(range, ' ')
99
+ end
100
+ end
101
+ end
102
+
23
103
  private
24
104
 
25
105
  def check_inside(node, left_brace, right_brace)
@@ -49,7 +129,7 @@ module RuboCop
49
129
  args_delimiter = node.arguments.loc.begin # Can be ( | or nil.
50
130
 
51
131
  check_left_brace(inner, node.loc.begin, args_delimiter)
52
- check_right_brace(inner, node.loc.end, block_length(node))
132
+ check_right_brace(inner, node.loc.end, node.single_line?)
53
133
  end
54
134
 
55
135
  def check_left_brace(inner, left_brace, args_delimiter)
@@ -60,8 +140,8 @@ module RuboCop
60
140
  end
61
141
  end
62
142
 
63
- def check_right_brace(inner, right_brace, block_length)
64
- if inner =~ /\S$/ && block_length.zero?
143
+ def check_right_brace(inner, right_brace, single_line)
144
+ if single_line && inner =~ /\S$/
65
145
  no_space(right_brace.begin_pos, right_brace.end_pos,
66
146
  'Space missing inside }.')
67
147
  else
@@ -96,7 +176,8 @@ module RuboCop
96
176
  end
97
177
  end
98
178
  else
99
- brace_with_space = range_with_surrounding_space(left_brace, :right)
179
+ brace_with_space = range_with_surrounding_space(range: left_brace,
180
+ side: :right)
100
181
  space(brace_with_space.begin_pos + 1, brace_with_space.end_pos,
101
182
  'Space inside { detected.')
102
183
  end
@@ -107,7 +188,8 @@ module RuboCop
107
188
  end
108
189
 
109
190
  def space_inside_right_brace(right_brace)
110
- brace_with_space = range_with_surrounding_space(right_brace, :left)
191
+ brace_with_space = range_with_surrounding_space(range: right_brace,
192
+ side: :left)
111
193
  space(brace_with_space.begin_pos, brace_with_space.end_pos - 1,
112
194
  'Space inside } detected.')
113
195
  end
@@ -140,17 +222,6 @@ module RuboCop
140
222
  else raise 'Unknown EnforcedStyleForEmptyBraces selected!'
141
223
  end
142
224
  end
143
-
144
- def autocorrect(range)
145
- lambda do |corrector|
146
- case range.source
147
- when /\s/ then corrector.remove(range)
148
- when '{}' then corrector.replace(range, '{ }')
149
- when '{|' then corrector.replace(range, '{ |')
150
- else corrector.insert_before(range, ' ')
151
- end
152
- end
153
- end
154
225
  end
155
226
  end
156
227
  end