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
@@ -7,6 +7,9 @@ module RuboCop
7
7
  module NegativeConditional
8
8
  extend NodePattern::Macros
9
9
 
10
+ MSG = 'Favor `%<inverse>s` over `%<current>s` for ' \
11
+ 'negative conditions.'.freeze
12
+
10
13
  def_node_matcher :single_negative?, '(send !(send _ :!) :!)'
11
14
  def_node_matcher :empty_condition?, '(begin)'
12
15
 
@@ -5,6 +5,17 @@ module RuboCop
5
5
  # Common functionality for Bundler/OrderedGems and
6
6
  # Gemspec/OrderedDependencies.
7
7
  module OrderedGemNode
8
+ def autocorrect(node)
9
+ previous = previous_declaration(node)
10
+
11
+ current_range = declaration_with_comment(node)
12
+ previous_range = declaration_with_comment(previous)
13
+
14
+ lambda do |corrector|
15
+ swap_range(corrector, current_range, previous_range)
16
+ end
17
+ end
18
+
8
19
  private
9
20
 
10
21
  def case_insensitive_out_of_order?(string_a, string_b)
@@ -17,7 +28,11 @@ module RuboCop
17
28
  end
18
29
 
19
30
  def register_offense(previous, current)
20
- message = format(self.class::MSG, gem_name(current), gem_name(previous))
31
+ message = format(
32
+ self.class::MSG,
33
+ previous: gem_name(current),
34
+ current: gem_name(previous)
35
+ )
21
36
  add_offense(current, message: message)
22
37
  end
23
38
 
@@ -25,17 +40,6 @@ module RuboCop
25
40
  declaration_node.first_argument.str_content
26
41
  end
27
42
 
28
- def autocorrect(node)
29
- previous = previous_declaration(node)
30
-
31
- current_range = declaration_with_comment(node)
32
- previous_range = declaration_with_comment(previous)
33
-
34
- lambda do |corrector|
35
- swap_range(corrector, current_range, previous_range)
36
- end
37
- end
38
-
39
43
  def declaration_with_comment(node)
40
44
  buffer = processed_source.buffer
41
45
  begin_pos = get_source_range(node).begin_pos
@@ -15,8 +15,20 @@ module RuboCop
15
15
  lambda do |corrector|
16
16
  corrector.remove(node.loc.begin)
17
17
  corrector.remove(node.loc.end)
18
+
19
+ if ternary_condition?(node) && next_char_is_question_mark?(node)
20
+ corrector.insert_after(node.loc.end, ' ')
21
+ end
18
22
  end
19
23
  end
24
+
25
+ def ternary_condition?(node)
26
+ node.parent && node.parent.if_type? && node.parent.ternary?
27
+ end
28
+
29
+ def next_char_is_question_mark?(node)
30
+ node.loc.last_column == node.parent.loc.question.column
31
+ end
20
32
  end
21
33
  end
22
34
  end
@@ -5,15 +5,19 @@ module RuboCop
5
5
  # Common functionality for cops checking for missing space after
6
6
  # punctuation.
7
7
  module SpaceAfterPunctuation
8
- MSG = 'Space missing after %s.'.freeze
8
+ MSG = 'Space missing after %<token>s.'.freeze
9
9
 
10
10
  def investigate(processed_source)
11
11
  each_missing_space(processed_source.tokens) do |token|
12
12
  add_offense(token, location: token.pos,
13
- message: format(MSG, kind(token)))
13
+ message: format(MSG, token: kind(token)))
14
14
  end
15
15
  end
16
16
 
17
+ def autocorrect(token)
18
+ ->(corrector) { corrector.replace(token.pos, token.pos.source + ' ') }
19
+ end
20
+
17
21
  def each_missing_space(tokens)
18
22
  tokens.each_cons(2) do |t1, t2|
19
23
  next unless kind(t1)
@@ -25,12 +29,12 @@ module RuboCop
25
29
  end
26
30
 
27
31
  def space_missing?(t1, t2)
28
- t1.pos.line == t2.pos.line && t2.pos.column == t1.pos.column + offset
32
+ t1.line == t2.line && t2.column == t1.column + offset
29
33
  end
30
34
 
31
35
  def space_required_before?(token)
32
36
  !(allowed_type?(token) ||
33
- (token.type == :tRCURLY && space_forbidden_before_rcurly?))
37
+ (token.right_curly_brace? && space_forbidden_before_rcurly?))
34
38
  end
35
39
 
36
40
  def allowed_type?(token)
@@ -47,10 +51,6 @@ module RuboCop
47
51
  def offset
48
52
  1
49
53
  end
50
-
51
- def autocorrect(token)
52
- ->(corrector) { corrector.replace(token.pos, token.pos.source + ' ') }
53
- end
54
54
  end
55
55
  end
56
56
  end
@@ -5,34 +5,38 @@ module RuboCop
5
5
  # Common functionality for cops checking for space before
6
6
  # punctuation.
7
7
  module SpaceBeforePunctuation
8
- MSG = 'Space found before %s.'.freeze
8
+ MSG = 'Space found before %<token>s.'.freeze
9
9
 
10
10
  def investigate(processed_source)
11
11
  each_missing_space(processed_source.tokens) do |token, pos_before|
12
12
  add_offense(pos_before, location: pos_before,
13
- message: format(MSG, kind(token)))
13
+ message: format(MSG, token: kind(token)))
14
14
  end
15
15
  end
16
16
 
17
+ def autocorrect(pos_before_punctuation)
18
+ ->(corrector) { corrector.remove(pos_before_punctuation) }
19
+ end
20
+
17
21
  def each_missing_space(tokens)
18
22
  tokens.each_cons(2) do |t1, t2|
19
23
  next unless kind(t2)
20
24
  next unless space_missing?(t1, t2)
21
25
  next if space_required_after?(t1)
22
26
 
23
- pos_before_punctuation = range_between(t1.pos.end_pos,
24
- t2.pos.begin_pos)
27
+ pos_before_punctuation = range_between(t1.end_pos,
28
+ t2.begin_pos)
25
29
 
26
30
  yield t2, pos_before_punctuation
27
31
  end
28
32
  end
29
33
 
30
34
  def space_missing?(t1, t2)
31
- t1.pos.line == t2.pos.line && t2.pos.begin_pos > t1.pos.end_pos
35
+ t1.line == t2.line && t2.begin_pos > t1.end_pos
32
36
  end
33
37
 
34
38
  def space_required_after?(token)
35
- token.type == :tLCURLY && space_required_after_lcurly?
39
+ token.left_curly_brace? && space_required_after_lcurly?
36
40
  end
37
41
 
38
42
  def space_required_after_lcurly?
@@ -40,10 +44,6 @@ module RuboCop
40
44
  style = cfg['EnforcedStyle'] || 'space'
41
45
  style == 'space'
42
46
  end
43
-
44
- def autocorrect(pos_before_punctuation)
45
- ->(corrector) { corrector.remove(pos_before_punctuation) }
46
- end
47
47
  end
48
48
  end
49
49
  end
@@ -13,12 +13,15 @@ module RuboCop
13
13
  end
14
14
 
15
15
  def non_eligible_node?(node)
16
- line_count(node) > 3 ||
16
+ node.nonempty_line_count > 3 ||
17
17
  !node.modifier_form? && commented?(node.loc.end)
18
18
  end
19
19
 
20
20
  def non_eligible_body?(body)
21
- empty_body?(body) || body.begin_type? || commented?(body.source_range)
21
+ body.nil? ||
22
+ body.empty? ||
23
+ body.begin_type? ||
24
+ commented?(body.source_range)
22
25
  end
23
26
 
24
27
  def non_eligible_condition?(condition)
@@ -27,7 +30,7 @@ module RuboCop
27
30
 
28
31
  def modifier_fits_on_single_line?(node)
29
32
  modifier_length = length_in_modifier_form(node, node.condition,
30
- body_length(node.body))
33
+ node.body.length)
31
34
 
32
35
  modifier_length <= max_line_length
33
36
  end
@@ -41,20 +44,7 @@ module RuboCop
41
44
  end
42
45
 
43
46
  def max_line_length
44
- cop_config['MaxLineLength'] ||
45
- config.for_cop('Metrics/LineLength')['Max']
46
- end
47
-
48
- def line_count(node)
49
- node.source.lines.grep(/\S/).size
50
- end
51
-
52
- def empty_body?(body)
53
- !body || body_length(body).zero?
54
- end
55
-
56
- def body_length(body)
57
- body.source_range ? body.source_range.size : 0
47
+ config.for_cop('Metrics/LineLength')['Max']
58
48
  end
59
49
 
60
50
  def commented?(source)
@@ -2,13 +2,26 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- # Common functionality for checking surrounding space.
5
+ # Common functionality for checking and correcting surrounding whitespace.
6
6
  module SurroundingSpace
7
- def space_between?(t1, _t2)
8
- # Check if the range between the tokens starts with a space. It can
9
- # contain other characters, e.g. a unary plus, but it must start with
10
- # space.
11
- t1.pos.source_buffer.source.match(/\G\s/, t1.pos.end_pos)
7
+ NO_SPACE_COMMAND = 'Do not use'.freeze
8
+ SPACE_COMMAND = 'Use'.freeze
9
+
10
+ def side_space_range(range:, side:)
11
+ buffer = @processed_source.buffer
12
+ src = buffer.source
13
+
14
+ begin_pos = range.begin_pos
15
+ end_pos = range.end_pos
16
+ if side == :left
17
+ begin_pos = reposition(src, begin_pos, -1)
18
+ end_pos -= 1
19
+ end
20
+ if side == :right
21
+ begin_pos += 1
22
+ end_pos = reposition(src, end_pos, 1)
23
+ end
24
+ Parser::Source::Range.new(buffer, begin_pos, end_pos)
12
25
  end
13
26
 
14
27
  def index_of_first_token(node)
@@ -29,12 +42,86 @@ module RuboCop
29
42
  @token_table ||= begin
30
43
  table = {}
31
44
  @processed_source.tokens.each_with_index do |t, ix|
32
- table[t.pos.line] ||= {}
33
- table[t.pos.line][t.pos.column] = ix
45
+ table[t.line] ||= {}
46
+ table[t.line][t.column] = ix
34
47
  end
35
48
  table
36
49
  end
37
50
  end
51
+
52
+ def tokens(node)
53
+ processed_source.tokens.select do |token|
54
+ token.end_pos <= node.source_range.end_pos &&
55
+ token.begin_pos >= node.source_range.begin_pos
56
+ end
57
+ end
58
+
59
+ def no_space_offenses(node, # rubocop:disable Metrics/ParameterLists
60
+ left_token,
61
+ right_token,
62
+ message,
63
+ start_ok: false,
64
+ end_ok: false)
65
+ if extra_space?(left_token, :left) && !start_ok
66
+ space_offense(node, left_token, :right, message, NO_SPACE_COMMAND)
67
+ end
68
+ return if !extra_space?(right_token, :right) || end_ok
69
+ space_offense(node, right_token, :left, message, NO_SPACE_COMMAND)
70
+ end
71
+
72
+ def no_space_corrector(corrector, left_token, right_token)
73
+ if left_token.space_after?
74
+ range = side_space_range(range: left_token.pos, side: :right)
75
+ corrector.remove(range)
76
+ end
77
+ return unless right_token.space_before?
78
+ range = side_space_range(range: right_token.pos, side: :left)
79
+ corrector.remove(range)
80
+ end
81
+
82
+ def space_offenses(node, # rubocop:disable Metrics/ParameterLists
83
+ left_token,
84
+ right_token,
85
+ message,
86
+ start_ok: false,
87
+ end_ok: false)
88
+ unless extra_space?(left_token, :left) || start_ok
89
+ space_offense(node, left_token, :none, message, SPACE_COMMAND)
90
+ end
91
+ return if extra_space?(right_token, :right) || end_ok
92
+ space_offense(node, right_token, :none, message, SPACE_COMMAND)
93
+ end
94
+
95
+ def space_corrector(corrector, left_token, right_token)
96
+ unless left_token.space_after?
97
+ corrector.insert_after(left_token.pos, ' ')
98
+ end
99
+ return if right_token.space_before?
100
+ corrector.insert_before(right_token.pos, ' ')
101
+ end
102
+
103
+ private
104
+
105
+ def extra_space?(token, side)
106
+ return false unless token
107
+ if side == :left
108
+ String(token.space_after?) == ' '
109
+ else
110
+ String(token.space_before?) == ' '
111
+ end
112
+ end
113
+
114
+ def reposition(src, pos, step)
115
+ offset = step == -1 ? -1 : 0
116
+ pos += step while src[pos + offset] =~ /[ \t]/
117
+ pos < 0 ? 0 : pos
118
+ end
119
+
120
+ def space_offense(node, token, side, message, command)
121
+ range = side_space_range(range: token.pos, side: side)
122
+ add_offense(node, location: range,
123
+ message: format(message, command: command))
124
+ end
38
125
  end
39
126
  end
40
127
  end
@@ -7,12 +7,12 @@ module RuboCop
7
7
  include ConfigurableMax
8
8
  include CodeLength
9
9
 
10
- MSG = '%s has too many lines. [%d/%d]'.freeze
10
+ MSG = '%<label>s has too many lines. [%<length>d/%<max>d]'.freeze
11
11
 
12
12
  private
13
13
 
14
14
  def message(length, max_length)
15
- format(MSG, cop_label, length, max_length)
15
+ format(MSG, label: cop_label, length: length, max: max_length)
16
16
  end
17
17
 
18
18
  def code_length(node)
@@ -7,7 +7,18 @@ module RuboCop
7
7
  module TrailingComma
8
8
  include ConfigurableEnforcedStyle
9
9
 
10
- MSG = '%s comma after the last %s'.freeze
10
+ MSG = '%<command>s comma after the last %<unit>s.'.freeze
11
+
12
+ def autocorrect(range)
13
+ return unless range
14
+
15
+ lambda do |corrector|
16
+ case range.source
17
+ when ',' then corrector.remove(range)
18
+ else corrector.insert_after(range, ',')
19
+ end
20
+ end
21
+ end
11
22
 
12
23
  def style_parameter_name
13
24
  'EnforcedStyleForMultiline'
@@ -116,7 +127,11 @@ module RuboCop
116
127
  def avoid_comma(kind, comma_begin_pos, extra_info)
117
128
  range = range_between(comma_begin_pos, comma_begin_pos + 1)
118
129
  article = kind =~ /array/ ? 'an' : 'a'
119
- msg = format(MSG, 'Avoid', format(kind, article)) + "#{extra_info}."
130
+ msg = format(
131
+ MSG,
132
+ command: 'Avoid',
133
+ unit: format(kind, article: article) + extra_info.to_s
134
+ )
120
135
 
121
136
  add_offense(range, location: range, message: msg)
122
137
  end
@@ -128,7 +143,11 @@ module RuboCop
128
143
  return if last_item.block_pass_type?
129
144
 
130
145
  range = autocorrect_range(last_item)
131
- msg = format(MSG, 'Put a', format(kind, 'a multiline') + '.')
146
+ msg = format(
147
+ MSG,
148
+ command: 'Put a',
149
+ unit: format(kind, article: 'a multiline')
150
+ )
132
151
 
133
152
  add_offense(range, location: range, message: msg)
134
153
  end
@@ -145,17 +164,6 @@ module RuboCop
145
164
  def avoid_autocorrect?(_)
146
165
  false
147
166
  end
148
-
149
- def autocorrect(range)
150
- return unless range
151
-
152
- lambda do |corrector|
153
- case range.source
154
- when ',' then corrector.remove(range)
155
- else corrector.insert_after(range, ',')
156
- end
157
- end
158
- end
159
167
  end
160
168
  end
161
169
  end
@@ -7,8 +7,6 @@ module RuboCop
7
7
  module UnusedArgument
8
8
  extend NodePattern::Macros
9
9
 
10
- def_node_search :uses_var?, '(lvar %)'
11
-
12
10
  def join_force?(force_class)
13
11
  force_class == VariableForce
14
12
  end
@@ -21,7 +19,7 @@ module RuboCop
21
19
 
22
20
  def check_argument(variable)
23
21
  return if variable.should_be_unused?
24
- return if variable_used?(variable)
22
+ return if variable.referenced?
25
23
 
26
24
  message = message(variable)
27
25
  add_offense(variable.declaration_node, location: :name,
@@ -33,7 +31,8 @@ module RuboCop
33
31
 
34
32
  if node.blockarg_type?
35
33
  lambda do |corrector|
36
- range = range_with_surrounding_space(node.source_range, :left)
34
+ range = range_with_surrounding_space(range: node.source_range,
35
+ side: :left)
37
36
  range = range_with_surrounding_comma(range, :left)
38
37
  corrector.remove(range)
39
38
  end
@@ -41,42 +40,6 @@ module RuboCop
41
40
  ->(corrector) { corrector.insert_before(node.loc.name, '_') }
42
41
  end
43
42
  end
44
-
45
- private
46
-
47
- def variable_used?(variable)
48
- return false unless variable.referenced?
49
-
50
- assignment_without_usage =
51
- find_assignment_without_variable_usage(variable)
52
-
53
- # If variable is either not assigned or assigned with usages,
54
- # then it's really used
55
- return true unless assignment_without_usage
56
-
57
- assignment_without_usage_pos =
58
- assignment_without_usage.node.source_range.begin_pos
59
-
60
- reference_positions =
61
- variable.references.map { |var| var.node.source_range.begin_pos }
62
-
63
- # Was variable referenced before it was reassigned?
64
- reference_positions.any? { |pos| pos <= assignment_without_usage_pos }
65
- end
66
-
67
- # Find the first variable assignment, which doesn't reference the
68
- # variable at the rhs.
69
- def find_assignment_without_variable_usage(variable)
70
- variable.assignments.find do |assignment|
71
- # It's impossible to decide whether a branch is executed, so
72
- # this case is ignored
73
- next if assignment.branch
74
-
75
- assignment_node = assignment.meta_assignment_node || assignment.node
76
-
77
- !uses_var?(assignment_node, assignment.variable.name)
78
- end
79
- end
80
43
  end
81
44
  end
82
45
  end