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
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for parentheses for empty lambda parameters. Parentheses
7
+ # for empty lambda parameters do not cause syntax errors, but they are
8
+ # redundant.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # -> () { do_something }
13
+ #
14
+ # # good
15
+ # -> { do_something }
16
+ #
17
+ # # good
18
+ # -> (arg) { do_something(arg) }
19
+ class EmptyLambdaParameter < Cop
20
+ include EmptyParameter
21
+
22
+ MSG = 'Omit parentheses for the empty lambda parameters.'.freeze
23
+
24
+ def on_block(node)
25
+ send_node = node.send_node
26
+ return unless send_node.send_type?
27
+ check(node) if node.send_node.stabby_lambda?
28
+ end
29
+
30
+ def autocorrect(node)
31
+ lambda do |corrector|
32
+ send_node = node.parent.send_node
33
+ range = range_between(
34
+ send_node.loc.expression.end_pos,
35
+ node.loc.expression.end_pos
36
+ )
37
+ corrector.remove(range)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -5,12 +5,24 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for the use of a method, the result of which
7
7
  # would be a literal, like an empty array, hash or string.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # a = Array.new
12
+ # h = Hash.new
13
+ # s = String.new
14
+ #
15
+ # # good
16
+ # a = []
17
+ # h = {}
18
+ # s = ''
8
19
  class EmptyLiteral < Cop
9
20
  include FrozenStringLiteral
10
21
 
11
22
  ARR_MSG = 'Use array literal `[]` instead of `Array.new`.'.freeze
12
23
  HASH_MSG = 'Use hash literal `{}` instead of `Hash.new`.'.freeze
13
- STR_MSG = 'Use string literal `%s` instead of `String.new`.'.freeze
24
+ STR_MSG = 'Use string literal `%<prefer>s` instead of ' \
25
+ '`String.new`.'.freeze
14
26
 
15
27
  def_node_matcher :array_node, '(send (const nil? :Array) :new)'
16
28
  def_node_matcher :hash_node, '(send (const nil? :Hash) :new)'
@@ -28,7 +40,8 @@ module RuboCop
28
40
  return if frozen_string_literals_enabled?
29
41
 
30
42
  add_offense(node,
31
- message: format(STR_MSG, preferred_string_literal))
43
+ message: format(STR_MSG,
44
+ prefer: preferred_string_literal))
32
45
  end
33
46
  end
34
47
 
@@ -67,9 +80,8 @@ module RuboCop
67
80
  # to rewrite the arguments to wrap them in parenthesis.
68
81
  _receiver, _method_name, *args = *node.parent
69
82
 
70
- Parser::Source::Range.new(node.parent.loc.expression,
71
- args[0].loc.expression.begin_pos - 1,
72
- args[-1].loc.expression.end_pos)
83
+ range_between(args[0].loc.expression.begin_pos - 1,
84
+ args[-1].loc.expression.end_pos)
73
85
  else
74
86
  node.source_range
75
87
  end
@@ -11,10 +11,7 @@ module RuboCop
11
11
  # Note: A method definition is not considered empty if it contains
12
12
  # comments.
13
13
  #
14
- # @example
15
- #
16
- # # EnforcedStyle: compact (default)
17
- #
14
+ # @example EnforcedStyle: compact (default)
18
15
  # # bad
19
16
  # def foo(bar)
20
17
  # end
@@ -31,10 +28,7 @@ module RuboCop
31
28
  #
32
29
  # def self.foo(bar); end
33
30
  #
34
- # @example
35
- #
36
- # # EnforcedStyle: expanded
37
- #
31
+ # @example EnforcedStyle: expanded
38
32
  # # bad
39
33
  # def foo(bar); end
40
34
  #
@@ -61,14 +55,14 @@ module RuboCop
61
55
  end
62
56
  alias on_defs on_def
63
57
 
64
- private
65
-
66
58
  def autocorrect(node)
67
59
  lambda do |corrector|
68
60
  corrector.replace(node.source_range, corrected(node))
69
61
  end
70
62
  end
71
63
 
64
+ private
65
+
72
66
  def message(_node)
73
67
  compact_style? ? MSG_COMPACT : MSG_EXPANDED
74
68
  end
@@ -21,7 +21,8 @@ module RuboCop
21
21
 
22
22
  def autocorrect(range)
23
23
  lambda do |corrector|
24
- corrector.remove(range_with_surrounding_space(range, :right))
24
+ corrector.remove(range_with_surrounding_space(range: range,
25
+ side: :right))
25
26
  end
26
27
  end
27
28
 
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks `eval` method usage. `eval` can receive source location
7
+ # metadata, that are filename and line number. The metadata is used by
8
+ # backtraces. This cop recommends to pass the metadata to `eval` method.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # eval <<-RUBY
13
+ # def do_something
14
+ # end
15
+ # RUBY
16
+ #
17
+ # # bad
18
+ # C.class_eval <<-RUBY
19
+ # def do_something
20
+ # end
21
+ # RUBY
22
+ #
23
+ # # good
24
+ # eval <<-RUBY, binding, __FILE__, __LINE__ + 1
25
+ # def do_something
26
+ # end
27
+ # RUBY
28
+ #
29
+ # # good
30
+ # C.class_eval <<-RUBY, __FILE__, __LINE__ + 1
31
+ # def do_something
32
+ # end
33
+ # RUBY
34
+ class EvalWithLocation < Cop
35
+ MSG = 'Pass `__FILE__` and `__LINE__` to `eval` method, ' \
36
+ 'as they are used by backtraces.'.freeze
37
+ MSG_INCORRECT_LINE = 'Use `%<expected>s` instead of `%<actual>s`, ' \
38
+ 'as they are used by backtraces.'.freeze
39
+
40
+ def_node_matcher :eval_without_location?, <<-PATTERN
41
+ {
42
+ (send nil? :eval ${str dstr})
43
+ (send nil? :eval ${str dstr} _)
44
+ (send nil? :eval ${str dstr} _ #special_file_keyword?)
45
+ (send nil? :eval ${str dstr} _ #special_file_keyword? _)
46
+
47
+ (send _ {:class_eval :module_eval :instance_eval}
48
+ ${str dstr})
49
+ (send _ {:class_eval :module_eval :instance_eval}
50
+ ${str dstr} #special_file_keyword?)
51
+ (send _ {:class_eval :module_eval :instance_eval}
52
+ ${str dstr} #special_file_keyword? _)
53
+ }
54
+ PATTERN
55
+
56
+ def_node_matcher :line_with_offset?, <<-PATTERN
57
+ {
58
+ (send #special_line_keyword? %1 (int %2))
59
+ (send (int %2) %1 #special_line_keyword?)
60
+ }
61
+ PATTERN
62
+
63
+ def on_send(node)
64
+ eval_without_location?(node) do |code|
65
+ if with_lineno?(node)
66
+ on_with_lineno(node, code)
67
+ else
68
+ add_offense(node)
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def special_file_keyword?(node)
76
+ node.str_type? &&
77
+ node.source == '__FILE__'
78
+ end
79
+
80
+ def special_line_keyword?(node)
81
+ node.int_type? &&
82
+ node.source == '__LINE__'
83
+ end
84
+
85
+ # FIXME: It's a Style/ConditionalAssignment's false positive.
86
+ # rubocop:disable Style/ConditionalAssignment
87
+ def with_lineno?(node)
88
+ if node.method_name == :eval
89
+ node.arguments.size == 4
90
+ else
91
+ node.arguments.size == 3
92
+ end
93
+ end
94
+ # rubocop:enable Style/ConditionalAssignment
95
+
96
+ def message_incorrect_line(actual, sign, line_diff)
97
+ expected =
98
+ if line_diff.zero?
99
+ '__LINE__'
100
+ else
101
+ "__LINE__ #{sign} #{line_diff}"
102
+ end
103
+ format(MSG_INCORRECT_LINE, actual: actual.source, expected: expected)
104
+ end
105
+
106
+ def on_with_lineno(node, code)
107
+ line_node = node.arguments.last
108
+ lineno_range = line_node.loc.expression
109
+ line_diff = string_first_line(code) - lineno_range.first_line
110
+ if line_diff.zero?
111
+ add_offense_for_same_line(node, line_node)
112
+ else
113
+ add_offense_for_different_line(node, line_node, line_diff)
114
+ end
115
+ end
116
+
117
+ def string_first_line(str_node)
118
+ if str_node.heredoc?
119
+ str_node.loc.heredoc_body.first_line
120
+ else
121
+ str_node.loc.expression.first_line
122
+ end
123
+ end
124
+
125
+ def add_offense_for_same_line(node, line_node)
126
+ return if special_line_keyword?(line_node)
127
+ add_offense(
128
+ node,
129
+ location: line_node.loc.expression,
130
+ message: message_incorrect_line(line_node, nil, 0)
131
+ )
132
+ end
133
+
134
+ def add_offense_for_different_line(node, line_node, line_diff)
135
+ sign = line_diff > 0 ? :+ : :-
136
+ return if line_with_offset?(line_node, sign, line_diff.abs)
137
+ add_offense(
138
+ node,
139
+ location: line_node.loc.expression,
140
+ message: message_incorrect_line(line_node, sign, line_diff)
141
+ )
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -10,11 +10,13 @@ module RuboCop
10
10
  #
11
11
  # # bad
12
12
  # if x % 2 == 0
13
+ # end
13
14
  #
14
15
  # # good
15
16
  # if x.even?
17
+ # end
16
18
  class EvenOdd < Cop
17
- MSG = 'Replace with `Integer#%s?`.'.freeze
19
+ MSG = 'Replace with `Integer#%<method>s?`.'.freeze
18
20
 
19
21
  def_node_matcher :even_odd_candidate?, <<-PATTERN
20
22
  (send
@@ -27,7 +29,7 @@ module RuboCop
27
29
  def on_send(node)
28
30
  even_odd_candidate?(node) do |_base_number, method, arg|
29
31
  replacement_method = replacement_method(arg, method)
30
- add_offense(node, message: format(MSG, replacement_method))
32
+ add_offense(node, message: format(MSG, method: replacement_method))
31
33
  end
32
34
  end
33
35
 
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks that `#module_function` is used over `extend self`.
7
+ #
8
+ # @example EnforcedStyle: module_function (default)
9
+ #
10
+ # # bad
11
+ # module Foo
12
+ # extend self
13
+ # end
14
+ #
15
+ # # good
16
+ # module Foo
17
+ # module_function
18
+ # end
19
+ #
20
+ # @example EnforcedStyle: extend_self
21
+ #
22
+ # # bad
23
+ # module Foo
24
+ # module_function
25
+ # end
26
+ #
27
+ # # good
28
+ # module Foo
29
+ # extend self
30
+ # end
31
+ class ExtendSelf < Cop
32
+ include ConfigurableEnforcedStyle
33
+
34
+ MSG = 'Use `%<enforced>s` instead of `%<alternate>s`.'.freeze
35
+
36
+ def_node_matcher :extend_self?, <<-PATTERN
37
+ (send nil? :extend (self))
38
+ PATTERN
39
+
40
+ def_node_matcher :module_function?, <<-PATTERN
41
+ (send nil? :module_function)
42
+ PATTERN
43
+
44
+ def_node_matcher :module_scope?, <<-PATTERN
45
+ {^(module ...) ^^(module _ ({begin kwbegin} ...))}
46
+ PATTERN
47
+
48
+ def on_send(node)
49
+ return unless module_scope?(node)
50
+ return unless module_function_enforced? && extend_self?(node) ||
51
+ extend_self_enforced? && module_function?(node)
52
+
53
+ add_offense(node)
54
+ end
55
+
56
+ def autocorrect(node)
57
+ lambda do |corrector|
58
+ corrector.replace(node.loc.expression, enforced_source)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def message(_node)
65
+ format(MSG, enforced: enforced_source, alternate: alternate_source)
66
+ end
67
+
68
+ def enforced_source
69
+ case style
70
+ when :module_function then 'module_function'
71
+ when :extend_self then 'extend self'
72
+ end
73
+ end
74
+
75
+ def alternate_source
76
+ case style
77
+ when :module_function then 'extend self'
78
+ when :extend_self then 'module_function'
79
+ end
80
+ end
81
+
82
+ def module_function_enforced?
83
+ style == :module_function
84
+ end
85
+
86
+ def extend_self_enforced?
87
+ style == :extend_self
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -4,6 +4,17 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop looks for uses of flip flop operator
7
+ #
8
+ # @example
9
+ # # bad
10
+ # (1..20).each do |x|
11
+ # puts x if (x == 5) .. (x == 10)
12
+ # end
13
+ #
14
+ # # good
15
+ # (1..20).each do |x|
16
+ # puts x if (x >= 5) && (x <= 10)
17
+ # end
7
18
  class FlipFlop < Cop
8
19
  MSG = 'Avoid the use of flip flop operators.'.freeze
9
20
 
@@ -10,10 +10,35 @@ module RuboCop
10
10
  # manner for all cases, so only two scenarios are considered -
11
11
  # if the first argument is a string literal and if the second
12
12
  # argument is an array literal.
13
+ #
14
+ # @example EnforcedStyle: format(default)
15
+ # # bad
16
+ # puts sprintf('%10s', 'hoge')
17
+ # puts '%10s' % 'hoge'
18
+ #
19
+ # # good
20
+ # puts format('%10s', 'hoge')
21
+ #
22
+ # @example EnforcedStyle: sprintf
23
+ # # bad
24
+ # puts format('%10s', 'hoge')
25
+ # puts '%10s' % 'hoge'
26
+ #
27
+ # # good
28
+ # puts sprintf('%10s', 'hoge')
29
+ #
30
+ # @example EnforcedStyle: percent
31
+ # # bad
32
+ # puts format('%10s', 'hoge')
33
+ # puts sprintf('%10s', 'hoge')
34
+ #
35
+ # # good
36
+ # puts '%10s' % 'hoge'
37
+ #
13
38
  class FormatString < Cop
14
39
  include ConfigurableEnforcedStyle
15
40
 
16
- MSG = 'Favor `%s` over `%s`.'.freeze
41
+ MSG = 'Favor `%<prefer>s` over `%<current>s`.'.freeze
17
42
 
18
43
  def_node_matcher :formatter, <<-PATTERN
19
44
  {
@@ -35,7 +60,9 @@ module RuboCop
35
60
  end
36
61
 
37
62
  def message(detected_style)
38
- format(MSG, method_name(style), method_name(detected_style))
63
+ format(MSG,
64
+ prefer: method_name(style),
65
+ current: method_name(detected_style))
39
66
  end
40
67
 
41
68
  def method_name(style_name)