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
@@ -8,6 +8,9 @@ module RuboCop
8
8
  # In Ruby 2.3 or newer, squiggly heredocs (`<<~`) should be used. If you
9
9
  # use the older rubies, you should introduce some library to your project
10
10
  # (e.g. ActiveSupport, Powerpack or Unindent).
11
+ # Note: When `Metrics/LineLength`'s `AllowHeredoc` is false(not default),
12
+ # this cop does not add any offenses for long here documents to
13
+ # avoid `Metrics/LineLength`'s offenses.
11
14
  #
12
15
  # @example
13
16
  #
@@ -34,11 +37,12 @@ module RuboCop
34
37
  include ConfigurableEnforcedStyle
35
38
  include SafeMode
36
39
 
37
- RUBY23_MSG = 'Use %d spaces for indentation in a heredoc by using ' \
38
- '`<<~` instead of `%s`.'.freeze
39
- LIBRARY_MSG = 'Use %d spaces for indentation in a heredoc by using %s.'
40
- .freeze
41
- StripMethods = {
40
+ RUBY23_MSG = 'Use %<indentation_width>d spaces for indentation in a ' \
41
+ 'heredoc by using `<<~` instead of ' \
42
+ '`%<current_indent_type>s`.'.freeze
43
+ LIBRARY_MSG = 'Use %<indentation_width>d spaces for indentation in a ' \
44
+ 'heredoc by using %<method>s.'.freeze
45
+ STRIP_METHODS = {
42
46
  unindent: 'unindent',
43
47
  active_support: 'strip_heredoc',
44
48
  powerpack: 'strip_indent'
@@ -57,6 +61,7 @@ module RuboCop
57
61
  return unless body_indent_level.zero?
58
62
  end
59
63
 
64
+ return if too_long_line?(node)
60
65
  add_offense(node, location: :heredoc_body)
61
66
  end
62
67
 
@@ -88,16 +93,49 @@ module RuboCop
88
93
  case style
89
94
  when :squiggly
90
95
  current_indent_type = "<<#{heredoc_indent_type(node)}"
91
- format(RUBY23_MSG, indentation_width, current_indent_type)
96
+ ruby23_message(indentation_width, current_indent_type)
92
97
  when nil
93
98
  method = "some library(e.g. ActiveSupport's `String#strip_heredoc`)"
94
- format(LIBRARY_MSG, indentation_width, method)
99
+ library_message(indentation_width, method)
95
100
  else
96
- method = "`String##{StripMethods[style]}`"
97
- format(LIBRARY_MSG, indentation_width, method)
101
+ method = "`String##{STRIP_METHODS[style]}`"
102
+ library_message(indentation_width, method)
98
103
  end
99
104
  end
100
105
 
106
+ def library_message(indentation_width, method)
107
+ format(
108
+ LIBRARY_MSG,
109
+ indentation_width: indentation_width,
110
+ method: method
111
+ )
112
+ end
113
+
114
+ def ruby23_message(indentation_width, current_indent_type)
115
+ format(
116
+ RUBY23_MSG,
117
+ indentation_width: indentation_width,
118
+ current_indent_type: current_indent_type
119
+ )
120
+ end
121
+
122
+ def too_long_line?(node)
123
+ return false if config.for_cop('Metrics/LineLength')['AllowHeredoc']
124
+ body = heredoc_body(node)
125
+
126
+ expected_indent = base_indent_level(node) + indentation_width
127
+ actual_indent = indent_level(body)
128
+ increase_indent_level = expected_indent - actual_indent
129
+
130
+ max_line = body.each_line.map { |line| line.chomp.size }.max
131
+
132
+ max_line + increase_indent_level >= max_line_length
133
+ end
134
+
135
+ def max_line_length
136
+ config.for_cop('Metrics/LineLength')['Max']
137
+ end
138
+
101
139
  def correct_by_squiggly(node)
102
140
  return if target_ruby_version < 2.3
103
141
  lambda do |corrector|
@@ -114,7 +152,7 @@ module RuboCop
114
152
  def correct_by_library(node)
115
153
  lambda do |corrector|
116
154
  corrector.replace(node.loc.heredoc_body, indented_body(node))
117
- corrected = ".#{StripMethods[style]}"
155
+ corrected = ".#{STRIP_METHODS[style]}"
118
156
  corrector.insert_after(node.loc.expression, corrected)
119
157
  end
120
158
  end
@@ -146,7 +184,9 @@ module RuboCop
146
184
  end
147
185
 
148
186
  def indent_level(str)
149
- indentations = str.scan(/^\s*/).reject { |line| line == "\n" }
187
+ indentations = str.lines
188
+ .map { |line| line[/^\s*/] }
189
+ .reject { |line| line == "\n" }
150
190
  indentations.empty? ? 0 : indentations.min_by(&:size).size
151
191
  end
152
192
 
@@ -10,34 +10,31 @@ module RuboCop
10
10
  # one.
11
11
  #
12
12
  # @example
13
- # # bad, Width: 2
13
+ # # bad
14
14
  # class A
15
15
  # def test
16
16
  # puts 'hello'
17
17
  # end
18
18
  # end
19
19
  #
20
- # # bad, Width: 2,
21
- # IgnoredPatterns:
22
- # - '^\s*module'
23
- # module A
24
- # class B
20
+ # # good
21
+ # class A
25
22
  # def test
26
- # puts 'hello'
23
+ # puts 'hello'
27
24
  # end
28
25
  # end
29
- # end
30
26
  #
31
- # # good, Width: 2
32
- # class A
27
+ # @example IgnoredPatterns: ['^\s*module']
28
+ # # bad
29
+ # module A
30
+ # class B
33
31
  # def test
34
- # puts 'hello'
32
+ # puts 'hello'
35
33
  # end
36
34
  # end
35
+ # end
37
36
  #
38
- # # good, Width: 2,
39
- # IgnoredPatterns:
40
- # - '^\s*module'
37
+ # # good
41
38
  # module A
42
39
  # class B
43
40
  # def test
@@ -51,7 +48,8 @@ module RuboCop
51
48
  include CheckAssignment
52
49
  include IgnoredPattern
53
50
 
54
- MSG = 'Use %d (not %d) spaces for%s indentation.'.freeze
51
+ MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
52
+ 'spaces for%<name>s indentation.'.freeze
55
53
 
56
54
  SPECIAL_MODIFIERS = %w[private protected].freeze
57
55
 
@@ -239,10 +237,19 @@ module RuboCop
239
237
  end
240
238
 
241
239
  name = style == 'normal' ? '' : " #{style}"
242
- msg = format(MSG, configured_indentation_width, indentation, name)
240
+ message = message(configured_indentation_width, indentation, name)
243
241
 
244
242
  add_offense(node, location: offending_range(body_node, indentation),
245
- message: msg)
243
+ message: message)
244
+ end
245
+
246
+ def message(configured_indentation_width, indentation, name)
247
+ format(
248
+ MSG,
249
+ configured_indentation_width: configured_indentation_width,
250
+ indentation: indentation,
251
+ name: name
252
+ )
246
253
  end
247
254
 
248
255
  # Returns true if the given node is within another node that has
@@ -26,16 +26,18 @@ module RuboCop
26
26
 
27
27
  def space_before(token)
28
28
  return unless token
29
- return if token.pos.column.zero?
29
+ return if token.column.zero?
30
30
 
31
- token_with_space =
32
- range_with_surrounding_space(token.pos, :left, false)
31
+ space_range =
32
+ range_with_surrounding_space(range: token.pos,
33
+ side: :left,
34
+ newlines: false)
33
35
  # If the file starts with a byte order mark (BOM), the column can be
34
36
  # non-zero, but then we find out here if there's no space to the left
35
37
  # of the first token.
36
- return if token_with_space == token.pos
38
+ return if space_range == token.pos
37
39
 
38
- yield range_between(token_with_space.begin_pos, token.pos.begin_pos)
40
+ yield range_between(space_range.begin_pos, token.begin_pos)
39
41
  end
40
42
  end
41
43
  end
@@ -28,8 +28,6 @@ module RuboCop
28
28
  end
29
29
  end
30
30
 
31
- private
32
-
33
31
  def autocorrect(comment)
34
32
  expr = comment.loc.expression
35
33
  hash_mark = range_between(expr.begin_pos, expr.begin_pos + 1)
@@ -37,6 +35,8 @@ module RuboCop
37
35
  ->(corrector) { corrector.insert_after(hash_mark, ' ') }
38
36
  end
39
37
 
38
+ private
39
+
40
40
  def allowed_on_first_line?(comment)
41
41
  shebang?(comment) || rackup_config_file? && rackup_options?(comment)
42
42
  end
@@ -26,35 +26,68 @@ module RuboCop
26
26
  # The closing brace of a multi-line array literal must be on the same
27
27
  # line as the last element of the array.
28
28
  #
29
- # @example
29
+ # @example EnforcedStyle: symmetrical (default)
30
+ # # bad
31
+ # [ :a,
32
+ # :b
33
+ # ]
34
+ #
35
+ # # bad
36
+ # [
37
+ # :a,
38
+ # :b ]
30
39
  #
31
- # # symmetrical: bad
32
- # # new_line: good
33
- # # same_line: bad
40
+ # # good
34
41
  # [ :a,
42
+ # :b ]
43
+ #
44
+ # # good
45
+ # [
46
+ # :a,
35
47
  # :b
36
48
  # ]
37
49
  #
38
- # # symmetrical: bad
39
- # # new_line: bad
40
- # # same_line: good
50
+ # @example EnforcedStyle: new_line
51
+ # # bad
41
52
  # [
42
53
  # :a,
43
54
  # :b ]
44
55
  #
45
- # # symmetrical: good
46
- # # new_line: bad
47
- # # same_line: good
56
+ # # bad
48
57
  # [ :a,
49
58
  # :b ]
50
59
  #
51
- # # symmetrical: good
52
- # # new_line: good
53
- # # same_line: bad
60
+ # # good
61
+ # [ :a,
62
+ # :b
63
+ # ]
64
+ #
65
+ # # good
54
66
  # [
55
67
  # :a,
56
68
  # :b
57
69
  # ]
70
+ #
71
+ # @example EnforcedStyle: same_line
72
+ # # bad
73
+ # [ :a,
74
+ # :b
75
+ # ]
76
+ #
77
+ # # bad
78
+ # [
79
+ # :a,
80
+ # :b
81
+ # ]
82
+ #
83
+ # # good
84
+ # [
85
+ # :a,
86
+ # :b ]
87
+ #
88
+ # # good
89
+ # [ :a,
90
+ # :b ]
58
91
  class MultilineArrayBraceLayout < Cop
59
92
  include MultilineLiteralBraceLayout
60
93
 
@@ -70,7 +103,7 @@ module RuboCop
70
103
  'after the last array element.'.freeze
71
104
 
72
105
  ALWAYS_SAME_LINE_MESSAGE = 'Closing array brace must be on the same ' \
73
- 'line as teh last array element.'.freeze
106
+ 'line as the last array element.'.freeze
74
107
 
75
108
  def on_array(node)
76
109
  check_brace_layout(node)
@@ -6,30 +6,31 @@ module RuboCop
6
6
  # This cop checks whether the multiline assignments have a newline
7
7
  # after the assignment operator.
8
8
  #
9
- # @example
10
- # # bad (with EnforcedStyle set to new_line)
9
+ # @example EnforcedStyle: new_line (default)
10
+ # # bad
11
11
  # foo = if expression
12
12
  # 'bar'
13
13
  # end
14
14
  #
15
- # # good (with EnforcedStyle set to same_line)
16
- # foo = if expression
17
- # 'bar'
18
- # end
19
- #
20
- # # good (with EnforcedStyle set to new_line)
15
+ # # good
21
16
  # foo =
22
17
  # if expression
23
18
  # 'bar'
24
19
  # end
25
20
  #
26
- # # good (with EnforcedStyle set to new_line)
21
+ # # good
27
22
  # foo =
28
23
  # begin
29
24
  # compute
30
25
  # rescue => e
31
26
  # nil
32
27
  # end
28
+ #
29
+ # @example EnforcedStyle: same_line
30
+ # # good
31
+ # foo = if expression
32
+ # 'bar'
33
+ # end
33
34
  class MultilineAssignmentLayout < Cop
34
35
  include CheckAssignment
35
36
  include ConfigurableEnforcedStyle
@@ -53,20 +53,6 @@ module RuboCop
53
53
  add_offense_for_expression(node, node.body, MSG)
54
54
  end
55
55
 
56
- private
57
-
58
- def args_on_beginning_line?(node)
59
- !node.arguments? ||
60
- node.loc.begin.line == node.arguments.loc.last_line
61
- end
62
-
63
- def add_offense_for_expression(node, expr, msg)
64
- expression = expr.source_range
65
- range = range_between(expression.begin_pos, expression.end_pos)
66
-
67
- add_offense(node, location: range, message: msg)
68
- end
69
-
70
56
  def autocorrect(node)
71
57
  lambda do |corrector|
72
58
  unless args_on_beginning_line?(node)
@@ -84,9 +70,26 @@ module RuboCop
84
70
  end
85
71
  end
86
72
 
73
+ private
74
+
75
+ def args_on_beginning_line?(node)
76
+ !node.arguments? ||
77
+ node.loc.begin.line == node.arguments.loc.last_line
78
+ end
79
+
80
+ def add_offense_for_expression(node, expr, msg)
81
+ expression = expr.source_range
82
+ range = range_between(expression.begin_pos, expression.end_pos)
83
+
84
+ add_offense(node, location: range, message: msg)
85
+ end
86
+
87
87
  def autocorrect_arguments(corrector, node)
88
- end_pos = range_with_surrounding_space(node.arguments.source_range,
89
- :right, false).end_pos
88
+ end_pos = range_with_surrounding_space(
89
+ range: node.arguments.source_range,
90
+ side: :right,
91
+ newlines: false
92
+ ).end_pos
90
93
  range = range_between(node.loc.begin.end.begin_pos, end_pos)
91
94
  corrector.replace(range, " |#{block_arg_string(node.arguments)}|")
92
95
  end
@@ -26,35 +26,68 @@ module RuboCop
26
26
  # The closing brace of a multi-line hash literal must be on the same
27
27
  # line as the last element of the hash.
28
28
  #
29
- # @example
29
+ # @example EnforcedStyle: symmetrical (default)
30
30
  #
31
- # # symmetrical: bad
32
- # # new_line: good
33
- # # same_line: bad
31
+ # # bad
34
32
  # { a: 1,
35
33
  # b: 2
36
34
  # }
35
+ # # bad
36
+ # {
37
+ # a: 1,
38
+ # b: 2 }
39
+ #
40
+ # # good
41
+ # { a: 1,
42
+ # b: 2 }
43
+ #
44
+ # # good
45
+ # {
46
+ # a: 1,
47
+ # b: 2
48
+ # }
37
49
  #
38
- # # symmetrical: bad
39
- # # new_line: bad
40
- # # same_line: good
50
+ # @example EnforcedStyle: new_line
51
+ # # bad
41
52
  # {
42
53
  # a: 1,
43
54
  # b: 2 }
44
55
  #
45
- # # symmetrical: good
46
- # # new_line: bad
47
- # # same_line: good
56
+ # # bad
48
57
  # { a: 1,
49
58
  # b: 2 }
50
59
  #
51
- # # symmetrical: good
52
- # # new_line: good
53
- # # same_line: bad
60
+ # # good
61
+ # { a: 1,
62
+ # b: 2
63
+ # }
64
+ #
65
+ # # good
54
66
  # {
55
67
  # a: 1,
56
68
  # b: 2
57
69
  # }
70
+ #
71
+ # @example EnforcedStyle: same_line
72
+ # # bad
73
+ # { a: 1,
74
+ # b: 2
75
+ # }
76
+ #
77
+ # # bad
78
+ # {
79
+ # a: 1,
80
+ # b: 2
81
+ # }
82
+ #
83
+ # # good
84
+ # {
85
+ # a: 1,
86
+ # b: 2 }
87
+ #
88
+ # # good
89
+ # { a: 1,
90
+ # b: 2 }
58
91
  class MultilineHashBraceLayout < Cop
59
92
  include MultilineLiteralBraceLayout
60
93