rubocop 0.49.1 → 0.50.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +160 -99
  5. data/config/disabled.yml +4 -5
  6. data/config/enabled.yml +149 -47
  7. data/lib/rubocop.rb +41 -14
  8. data/lib/rubocop/ast/builder.rb +4 -1
  9. data/lib/rubocop/ast/node.rb +36 -42
  10. data/lib/rubocop/ast/node/args_node.rb +1 -13
  11. data/lib/rubocop/ast/node/array_node.rb +9 -0
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  17. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  18. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  19. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  20. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  21. data/lib/rubocop/ast/node/send_node.rb +1 -154
  22. data/lib/rubocop/ast/node/super_node.rb +3 -24
  23. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  24. data/lib/rubocop/ast/traversal.rb +6 -6
  25. data/lib/rubocop/cli.rb +7 -3
  26. data/lib/rubocop/config.rb +45 -8
  27. data/lib/rubocop/config_loader.rb +7 -5
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
  31. data/lib/rubocop/cop/commissioner.rb +8 -2
  32. data/lib/rubocop/cop/cop.rb +3 -1
  33. data/lib/rubocop/cop/generator.rb +94 -21
  34. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
  36. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
  38. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
  39. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
  40. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
  41. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  42. data/lib/rubocop/cop/layout/align_hash.rb +2 -2
  43. data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/dot_position.rb +9 -0
  47. data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
  52. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  56. data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
  58. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
  59. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  61. data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
  62. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
  63. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
  64. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
  67. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
  68. data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
  69. data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
  71. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
  74. data/lib/rubocop/cop/layout/tab.rb +1 -1
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  77. data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
  78. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  79. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  80. data/lib/rubocop/cop/lint/debugger.rb +16 -9
  81. data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
  82. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  83. data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
  84. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  85. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  86. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  87. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  88. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  89. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  90. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
  93. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  94. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
  95. data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
  96. data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
  97. data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
  98. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  100. data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
  101. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  102. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
  103. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  104. data/lib/rubocop/cop/lint/rand_one.rb +7 -1
  105. data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
  109. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
  110. data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
  111. data/lib/rubocop/cop/lint/script_permission.rb +6 -0
  112. data/lib/rubocop/cop/lint/syntax.rb +17 -20
  113. data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
  114. data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
  115. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  116. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  117. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  118. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  119. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
  120. data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
  121. data/lib/rubocop/cop/lint/void.rb +29 -23
  122. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  123. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  124. data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
  125. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
  126. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
  127. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  128. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  129. data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
  130. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
  131. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
  132. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
  133. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  134. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  135. data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
  136. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
  137. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
  138. data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
  139. data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
  140. data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
  141. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
  142. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
  143. data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
  144. data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
  145. data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
  146. data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
  147. data/lib/rubocop/cop/performance/caller.rb +39 -11
  148. data/lib/rubocop/cop/performance/casecmp.rb +4 -4
  149. data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
  150. data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
  151. data/lib/rubocop/cop/performance/end_with.rb +3 -3
  152. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  153. data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
  154. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
  155. data/lib/rubocop/cop/performance/range_include.rb +2 -2
  156. data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
  157. data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
  158. data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
  159. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
  160. data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
  161. data/lib/rubocop/cop/performance/size.rb +1 -1
  162. data/lib/rubocop/cop/performance/start_with.rb +3 -3
  163. data/lib/rubocop/cop/performance/times_map.rb +23 -12
  164. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  165. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  166. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
  167. data/lib/rubocop/cop/rails/delegate.rb +36 -7
  168. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  169. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
  170. data/lib/rubocop/cop/rails/file_path.rb +3 -4
  171. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  172. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
  173. data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
  174. data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
  175. data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
  176. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  177. data/lib/rubocop/cop/rails/request_referer.rb +2 -2
  178. data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
  179. data/lib/rubocop/cop/rails/save_bang.rb +8 -6
  180. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  181. data/lib/rubocop/cop/security/eval.rb +2 -2
  182. data/lib/rubocop/cop/security/json_load.rb +2 -2
  183. data/lib/rubocop/cop/security/marshal_load.rb +2 -2
  184. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  185. data/lib/rubocop/cop/style/alias.rb +44 -20
  186. data/lib/rubocop/cop/style/and_or.rb +48 -34
  187. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  188. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  189. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  190. data/lib/rubocop/cop/style/command_literal.rb +20 -9
  191. data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
  192. data/lib/rubocop/cop/style/copyright.rb +10 -10
  193. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
  194. data/lib/rubocop/cop/style/dir.rb +52 -0
  195. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  196. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  197. data/lib/rubocop/cop/style/empty_else.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_literal.rb +1 -2
  199. data/lib/rubocop/cop/style/empty_method.rb +27 -17
  200. data/lib/rubocop/cop/style/flip_flop.rb +2 -2
  201. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  202. data/lib/rubocop/cop/style/guard_clause.rb +4 -2
  203. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  204. data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
  205. data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
  206. data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
  207. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  208. data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
  209. data/lib/rubocop/cop/style/lambda.rb +19 -9
  210. data/lib/rubocop/cop/style/lambda_call.rb +22 -1
  211. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
  212. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  213. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
  214. data/lib/rubocop/cop/style/method_missing.rb +5 -18
  215. data/lib/rubocop/cop/style/min_max.rb +67 -0
  216. data/lib/rubocop/cop/style/missing_else.rb +16 -3
  217. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  218. data/lib/rubocop/cop/style/module_function.rb +8 -4
  219. data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
  220. data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
  221. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  222. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  223. data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
  224. data/lib/rubocop/cop/style/negated_if.rb +8 -4
  225. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
  226. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  227. data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
  228. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
  229. data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
  230. data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
  231. data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
  232. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  233. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  234. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  235. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  236. data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
  237. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  238. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  239. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  240. data/lib/rubocop/cop/style/proc.rb +1 -1
  241. data/lib/rubocop/cop/style/raise_args.rb +16 -17
  242. data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
  243. data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
  244. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  245. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
  246. data/lib/rubocop/cop/style/redundant_return.rb +23 -11
  247. data/lib/rubocop/cop/style/redundant_self.rb +18 -9
  248. data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
  249. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  250. data/lib/rubocop/cop/style/return_nil.rb +98 -0
  251. data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
  252. data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
  253. data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
  254. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  255. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
  256. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
  257. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  258. data/lib/rubocop/cop/style/symbol_array.rb +5 -25
  259. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  260. data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
  261. data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
  262. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
  263. data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
  264. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  265. data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
  266. data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
  267. data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
  268. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
  269. data/lib/rubocop/cop/style/word_array.rb +7 -24
  270. data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
  271. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
  272. data/lib/rubocop/cop/team.rb +16 -8
  273. data/lib/rubocop/cop/util.rb +11 -0
  274. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  275. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  276. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  277. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  278. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  279. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  280. data/lib/rubocop/node_pattern.rb +44 -26
  281. data/lib/rubocop/options.rb +1 -0
  282. data/lib/rubocop/processed_source.rb +3 -1
  283. data/lib/rubocop/remote_config.rb +5 -1
  284. data/lib/rubocop/result_cache.rb +1 -0
  285. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  286. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  287. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  288. data/lib/rubocop/string_util.rb +2 -0
  289. data/lib/rubocop/version.rb +1 -1
  290. metadata +51 -18
  291. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  292. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop identifies places where `URI.escape` can be replaced by
7
+ # `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component`
8
+ # depending on your specific use case.
9
+ # Also this cop identifies places where `URI.unescape` can be replaced by
10
+ # `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component`
11
+ # depending on your specific use case.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # URI.escape('http://example.com')
16
+ # URI.encode('http://example.com')
17
+ #
18
+ # # good
19
+ # CGI.escape('http://example.com')
20
+ # URI.encode_www_form('http://example.com')
21
+ # URI.encode_www_form_component('http://example.com')
22
+ #
23
+ # # bad
24
+ # URI.unescape(enc_uri)
25
+ # URI.decode(enc_uri)
26
+ #
27
+ # # good
28
+ # CGI.unescape(enc_uri)
29
+ # URI.decode_www_form(enc_uri)
30
+ # URI.decode_www_form_component(enc_uri)
31
+ class UriEscapeUnescape < Cop
32
+ ALTERNATE_METHODS_OF_URI_ESCAPE = %w[
33
+ CGI.escape
34
+ URI.encode_www_form
35
+ URI.encode_www_form_component
36
+ ].freeze
37
+ ALTERNATE_METHODS_OF_URI_UNESCAPE = %w[
38
+ CGI.unescape
39
+ URI.decode_www_form
40
+ URI.decode_www_form_component
41
+ ].freeze
42
+
43
+ MSG = '`%s` method is obsolete and should not be used. Instead, use ' \
44
+ '`%s`, `%s` or `%s` depending on your specific use case.'.freeze
45
+
46
+ def_node_matcher :uri_escape_unescape?, <<-PATTERN
47
+ (send
48
+ (const ${nil cbase} :URI) ${:escape :encode :unescape :decode}
49
+ ...)
50
+ PATTERN
51
+
52
+ def on_send(node)
53
+ uri_escape_unescape?(node) do |top_level, obsolete_method|
54
+ replacement_methods = if %i[escape encode].include?(obsolete_method)
55
+ ALTERNATE_METHODS_OF_URI_ESCAPE
56
+ else
57
+ ALTERNATE_METHODS_OF_URI_UNESCAPE
58
+ end
59
+
60
+ double_colon = top_level ? '::' : ''
61
+
62
+ message = format(
63
+ MSG,
64
+ "#{double_colon}URI.#{obsolete_method}",
65
+ *replacement_methods
66
+ )
67
+
68
+ add_offense(node, :expression, message)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop identifies places where `URI.regexp` is obsolete and should
7
+ # not be used. Instead, use `URI::DEFAULT_PARSER.make_regexp`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # URI.regexp('http://example.com')
12
+ #
13
+ # # good
14
+ # URI::DEFAULT_PARSER.make_regexp('http://example.com')
15
+ #
16
+ class UriRegexp < Cop
17
+ MSG = '`%<top_level>sURI.regexp%<arg>s` is obsolete and should not ' \
18
+ 'be used. Instead, use `%<top_level>sURI::DEFAULT_PARSER.' \
19
+ 'make_regexp%<arg>s`.'.freeze
20
+
21
+ def_node_matcher :uri_regexp_with_argument?, <<-PATTERN
22
+ (send
23
+ (const ${nil cbase} :URI) :regexp
24
+ (str $_))
25
+ PATTERN
26
+
27
+ def_node_matcher :uri_regexp_without_argument?, <<-PATTERN
28
+ (send
29
+ (const ${nil cbase} :URI) :regexp)
30
+ PATTERN
31
+
32
+ def on_send(node)
33
+ uri_regexp_with_argument?(node) do |double_colon, arg|
34
+ register_offense(
35
+ node, top_level: double_colon ? '::' : '', arg: "('#{arg}')"
36
+ )
37
+ end
38
+
39
+ uri_regexp_without_argument?(node) do |double_colon|
40
+ register_offense(node, top_level: double_colon ? '::' : '')
41
+ end
42
+ end
43
+
44
+ def autocorrect(node)
45
+ lambda do |corrector|
46
+ if (captured_values = uri_regexp_with_argument?(node))
47
+ else
48
+ captured_values = uri_regexp_without_argument?(node)
49
+ end
50
+
51
+ double_colon, arg = captured_values
52
+
53
+ top_level = double_colon ? '::' : ''
54
+ argument = arg ? "('#{arg}')" : ''
55
+
56
+ corrector.replace(
57
+ node.loc.expression,
58
+ "#{top_level}URI::DEFAULT_PARSER.make_regexp#{argument}"
59
+ )
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def register_offense(node, top_level: '', arg: '')
66
+ format = format(MSG, top_level: top_level, arg: arg)
67
+
68
+ add_offense(node, :selector, format)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -113,10 +113,6 @@ module RuboCop
113
113
 
114
114
  private
115
115
 
116
- def_node_matcher :access_modifier, <<-PATTERN
117
- (send nil ${:public :protected :private})
118
- PATTERN
119
-
120
116
  def_node_matcher :static_method_definition?, <<-PATTERN
121
117
  {def (send nil {:attr :attr_reader :attr_writer :attr_accessor} ...)}
122
118
  PATTERN
@@ -138,8 +134,8 @@ module RuboCop
138
134
 
139
135
  if node.begin_type?
140
136
  check_scope(node)
141
- elsif (vis = access_modifier(node))
142
- add_offense(node, :expression, format(MSG, vis))
137
+ elsif node.send_type? && node.access_modifier?
138
+ add_offense(node, :expression, format(MSG, node.method_name))
143
139
  end
144
140
  end
145
141
 
@@ -151,9 +147,9 @@ module RuboCop
151
147
 
152
148
  def check_child_nodes(node, unused, cur_vis)
153
149
  node.child_nodes.each do |child|
154
- if (new_vis = access_modifier(child))
150
+ if child.send_type? && child.access_modifier?
155
151
  cur_vis, unused =
156
- check_new_visibility(child, unused, new_vis, cur_vis)
152
+ check_new_visibility(child, unused, child.method_name, cur_vis)
157
153
  elsif method_definition?(child)
158
154
  unused = nil
159
155
  elsif start_of_new_scope?(child)
@@ -25,26 +25,25 @@ module RuboCop
25
25
  # x
26
26
  # end
27
27
  class UselessSetterCall < Cop
28
- include OnMethodDef
29
-
30
28
  MSG = 'Useless setter call to local variable `%s`.'.freeze
31
29
  ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
32
30
 
33
- private
34
-
35
- def on_method_def(_node, _method_name, _args, body)
36
- return unless body
31
+ def on_def(node)
32
+ return unless node.body
37
33
 
38
- last_expr = last_expression(body)
34
+ last_expr = last_expression(node.body)
39
35
  return unless setter_call_to_local_variable?(last_expr)
40
36
 
41
- tracker = MethodVariableTracker.new(body)
37
+ tracker = MethodVariableTracker.new(node.body)
42
38
  receiver, = *last_expr
43
39
  variable_name, = *receiver
44
40
  return unless tracker.contain_local_object?(variable_name)
45
41
 
46
42
  add_offense(receiver, :name, format(MSG, receiver.loc.name.source))
47
43
  end
44
+ alias on_defs on_def
45
+
46
+ private
48
47
 
49
48
  def last_expression(body)
50
49
  expression = body.begin_type? ? body.children : body
@@ -54,9 +53,9 @@ module RuboCop
54
53
 
55
54
  def setter_call_to_local_variable?(node)
56
55
  return unless node && node.send_type?
57
- receiver, method, _args = *node
58
- return unless receiver && receiver.lvar_type?
59
- method =~ /(?:\w|\[\])=$/
56
+ return unless node.receiver && node.receiver.lvar_type?
57
+
58
+ node.method_name =~ /(?:\w|\[\])=$/
60
59
  end
61
60
 
62
61
  # This class tracks variable assignments in a method body
@@ -19,7 +19,7 @@ module RuboCop
19
19
  #
20
20
  # # bad
21
21
  #
22
- # def some_method
22
+ # def some_method(some_var)
23
23
  # some_var
24
24
  # do_something
25
25
  # end
@@ -37,7 +37,7 @@ module RuboCop
37
37
  #
38
38
  # # good
39
39
  #
40
- # def some_method
40
+ # def some_method(some_var)
41
41
  # do_something
42
42
  # some_var
43
43
  # end
@@ -48,60 +48,66 @@ module RuboCop
48
48
  SELF_MSG = '`self` used in void context.'.freeze
49
49
  DEFINED_MSG = '`%s` used in void context.'.freeze
50
50
 
51
- OPS = %w[* / % + - == === != < > <= >= <=>].freeze
51
+ BINARY_OPERATORS = %i[* / % + - == === != < > <= >= <=>].freeze
52
+ UNARY_OPERATORS = %i[+@ -@ ~ !].freeze
53
+ OPERATORS = (BINARY_OPERATORS + UNARY_OPERATORS).freeze
54
+ VOID_CONTEXT_TYPES = %i[def for block].freeze
52
55
 
53
56
  def on_begin(node)
54
57
  check_begin(node)
55
58
  end
56
-
57
- def on_kwbegin(node)
58
- check_begin(node)
59
- end
59
+ alias on_kwbegin on_begin
60
60
 
61
61
  private
62
62
 
63
63
  def check_begin(node)
64
64
  expressions = *node
65
-
66
- expressions.drop_last(1).each do |expr|
67
- check_for_void_op(expr)
68
- check_for_literal(expr)
69
- check_for_var(expr)
70
- check_for_self(expr)
71
- check_for_defined(expr)
65
+ expressions = expressions.drop_last(1) unless in_void_context?(node)
66
+ expressions.each do |expr|
67
+ check_void_op(expr)
68
+ check_literal(expr)
69
+ check_var(expr)
70
+ check_self(expr)
71
+ check_defined(expr)
72
72
  end
73
73
  end
74
74
 
75
- def check_for_void_op(node)
76
- return unless node.send_type? && node.loc.selector
75
+ def check_void_op(node)
76
+ return unless node.send_type? && OPERATORS.include?(node.method_name)
77
77
 
78
- op = node.loc.selector.source
79
-
80
- add_offense(node, :selector, format(OP_MSG, op)) if OPS.include?(op)
78
+ add_offense(node, :selector, format(OP_MSG, node.method_name))
81
79
  end
82
80
 
83
- def check_for_var(node)
81
+ def check_var(node)
84
82
  return unless node.variable? || node.const_type?
85
83
  add_offense(node, :name, format(VAR_MSG, node.loc.name.source))
86
84
  end
87
85
 
88
- def check_for_literal(node)
86
+ def check_literal(node)
89
87
  return if !node.literal? || node.xstr_type?
90
88
 
91
89
  add_offense(node, :expression, format(LIT_MSG, node.source))
92
90
  end
93
91
 
94
- def check_for_self(node)
92
+ def check_self(node)
95
93
  return unless node.self_type?
96
94
 
97
95
  add_offense(node, :expression, SELF_MSG)
98
96
  end
99
97
 
100
- def check_for_defined(node)
98
+ def check_defined(node)
101
99
  return unless node.defined_type?
102
100
 
103
101
  add_offense(node, :expression, format(DEFINED_MSG, node.source))
104
102
  end
103
+
104
+ def in_void_context?(node)
105
+ parent = node.parent
106
+
107
+ return false unless parent && parent.children.last == node
108
+
109
+ VOID_CONTEXT_TYPES.include?(parent.type) && parent.void_context?
110
+ end
105
111
  end
106
112
  end
107
113
  end
@@ -118,12 +118,12 @@ module RuboCop
118
118
  def valid_uri?(uri_ish_string)
119
119
  URI.parse(uri_ish_string)
120
120
  true
121
- rescue
121
+ rescue URI::InvalidURIError, NoMethodError
122
122
  false
123
123
  end
124
124
 
125
125
  def uri_regexp
126
- @regexp ||= URI::Parser.new.make_regexp(cop_config['URISchemes'])
126
+ @regexp ||= URI::DEFAULT_PARSER.make_regexp(cop_config['URISchemes'])
127
127
  end
128
128
 
129
129
  def check_directive_line(line, index)
@@ -7,17 +7,22 @@ module RuboCop
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
9
  class MethodLength < Cop
10
- include OnMethodDef
11
10
  include TooManyLines
12
11
 
13
12
  LABEL = 'Method'.freeze
14
13
 
15
- private
14
+ def on_def(node)
15
+ check_code_length(node)
16
+ end
17
+ alias on_defs on_def
16
18
 
17
- def on_method_def(node, _method_name, _args, _body)
19
+ def on_block(node)
20
+ return unless node.send_node.method_name == :define_method
18
21
  check_code_length(node)
19
22
  end
20
23
 
24
+ private
25
+
21
26
  def cop_label
22
27
  LABEL
23
28
  end
@@ -16,14 +16,17 @@ module RuboCop
16
16
  count = args_count(node)
17
17
  return unless count > max_params
18
18
 
19
- message = format(MSG, max_params, count, max_params)
20
- add_offense(node, :expression, message) do
19
+ add_offense(node) do
21
20
  self.max = count
22
21
  end
23
22
  end
24
23
 
25
24
  private
26
25
 
26
+ def message(node)
27
+ format(MSG, max_params, args_count(node), max_params)
28
+ end
29
+
27
30
  def args_count(node)
28
31
  if count_keyword_args?
29
32
  node.children.size
@@ -41,7 +41,7 @@ module RuboCop
41
41
  # offense again and correct it.
42
42
  add_offense(nil, expr)
43
43
  else
44
- add_offense(current, :expression)
44
+ add_offense(current)
45
45
  end
46
46
  end
47
47
  end
@@ -16,13 +16,13 @@ module RuboCop
16
16
 
17
17
  def on_class(node)
18
18
  class_definition(node) do
19
- add_offense(node.children[1], :expression, self.class::MSG)
19
+ add_offense(node.children[1])
20
20
  end
21
21
  end
22
22
 
23
23
  def on_send(node)
24
24
  class_new_definition(node) do
25
- add_offense(node.children.last, :expression, self.class::MSG)
25
+ add_offense(node.children.last)
26
26
  end
27
27
  end
28
28
 
@@ -28,13 +28,22 @@ module RuboCop
28
28
  return if children.size < 2
29
29
 
30
30
  line = start.loc.line
31
- min = children.min_by { |n| n.loc.first_line }
31
+
32
+ min = first_by_line(children)
32
33
  return if line != min.loc.first_line
33
34
 
34
- max = children.max_by { |n| n.loc.last_line }
35
+ max = last_by_line(children)
35
36
  return if line == max.loc.last_line
36
37
 
37
- add_offense(min, :expression, self.class::MSG)
38
+ add_offense(min)
39
+ end
40
+
41
+ def first_by_line(nodes)
42
+ nodes.min_by { |n| n.loc.first_line }
43
+ end
44
+
45
+ def last_by_line(nodes)
46
+ nodes.max_by { |n| n.loc.last_line }
38
47
  end
39
48
  end
40
49
  end