rubocop 0.82.0 → 0.86.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -19
  3. data/config/default.yml +111 -23
  4. data/lib/rubocop.rb +16 -59
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +3 -3
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  10. data/lib/rubocop/comment_config.rb +1 -1
  11. data/lib/rubocop/config.rb +6 -2
  12. data/lib/rubocop/config_loader.rb +19 -24
  13. data/lib/rubocop/config_loader_resolver.rb +45 -6
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +2 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  18. data/lib/rubocop/cop/commissioner.rb +0 -21
  19. data/lib/rubocop/cop/cop.rb +36 -21
  20. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
  21. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  23. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  25. data/lib/rubocop/cop/generator.rb +4 -3
  26. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  27. data/lib/rubocop/cop/ignored_node.rb +1 -3
  28. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  29. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  30. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  31. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  32. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  33. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  34. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +128 -0
  35. data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
  36. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -4
  37. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
  38. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  39. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  40. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  41. data/lib/rubocop/cop/layout/hash_alignment.rb +7 -7
  42. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -7
  43. data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
  44. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  45. data/lib/rubocop/cop/layout/line_length.rb +21 -18
  46. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  47. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  48. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  49. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  50. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  51. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -3
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  53. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  54. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  55. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -4
  56. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  57. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  58. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  59. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  60. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  61. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  62. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  63. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  64. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  65. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  66. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  67. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  68. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  69. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
  70. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  71. data/lib/rubocop/cop/lint/loop.rb +1 -1
  72. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  73. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  74. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  75. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  76. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  77. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  78. data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
  79. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +5 -8
  80. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  81. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  82. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  83. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  84. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  85. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  86. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  87. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  88. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  89. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  90. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  91. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
  92. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  93. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  94. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  95. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  96. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  97. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  98. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  99. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  100. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  101. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  102. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  103. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  104. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  105. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -1
  106. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  107. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  108. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  109. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  110. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  111. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  112. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  113. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  114. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -23
  115. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  116. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  117. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  118. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  119. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -3
  120. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  121. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  122. data/lib/rubocop/cop/naming/file_name.rb +28 -17
  123. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  124. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  125. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  126. data/lib/rubocop/cop/registry.rb +63 -10
  127. data/lib/rubocop/cop/severity.rb +1 -3
  128. data/lib/rubocop/cop/style/and_or.rb +2 -2
  129. data/lib/rubocop/cop/style/array_join.rb +1 -1
  130. data/lib/rubocop/cop/style/attr.rb +1 -3
  131. data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -2
  132. data/lib/rubocop/cop/style/block_delimiters.rb +4 -12
  133. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  134. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  135. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  136. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -4
  138. data/lib/rubocop/cop/style/copyright.rb +5 -5
  139. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation.rb +2 -2
  141. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  142. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  143. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  144. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  145. data/lib/rubocop/cop/style/encoding.rb +1 -1
  146. data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
  147. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  148. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  149. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  150. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
  151. data/lib/rubocop/cop/style/hash_syntax.rb +16 -7
  152. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  153. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  154. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  155. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  157. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  158. data/lib/rubocop/cop/style/lambda_call.rb +0 -20
  159. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  160. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  161. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  163. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  164. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  165. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  166. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  167. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  168. data/lib/rubocop/cop/style/next.rb +2 -2
  169. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  170. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  171. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
  172. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  173. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
  175. data/lib/rubocop/cop/style/redundant_fetch_block.rb +103 -0
  176. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -7
  177. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  178. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  179. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  180. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  181. data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
  182. data/lib/rubocop/cop/style/sample.rb +1 -1
  183. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  184. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  185. data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +21 -0
  187. data/lib/rubocop/cop/style/symbol_array.rb +5 -5
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -4
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +3 -3
  190. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  191. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +13 -13
  192. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  193. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  194. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  195. data/lib/rubocop/cop/style/when_then.rb +1 -1
  196. data/lib/rubocop/cop/style/word_array.rb +1 -1
  197. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  198. data/lib/rubocop/cop/team.rb +69 -25
  199. data/lib/rubocop/cop/util.rb +27 -3
  200. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  201. data/lib/rubocop/cop/variable_force.rb +3 -9
  202. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  203. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  204. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  205. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  206. data/lib/rubocop/ext/processed_source.rb +18 -0
  207. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  208. data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -13
  209. data/lib/rubocop/formatter/formatter_set.rb +2 -4
  210. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  211. data/lib/rubocop/magic_comment.rb +1 -1
  212. data/lib/rubocop/name_similarity.rb +18 -9
  213. data/lib/rubocop/options.rb +26 -11
  214. data/lib/rubocop/path_util.rb +2 -2
  215. data/lib/rubocop/platform.rb +1 -1
  216. data/lib/rubocop/remote_config.rb +1 -3
  217. data/lib/rubocop/result_cache.rb +5 -7
  218. data/lib/rubocop/rspec/cop_helper.rb +2 -25
  219. data/lib/rubocop/rspec/expect_offense.rb +58 -15
  220. data/lib/rubocop/rspec/shared_contexts.rb +54 -16
  221. data/lib/rubocop/runner.rb +20 -13
  222. data/lib/rubocop/target_finder.rb +8 -8
  223. data/lib/rubocop/target_ruby.rb +4 -1
  224. data/lib/rubocop/version.rb +5 -3
  225. metadata +51 -74
  226. data/lib/rubocop/ast/builder.rb +0 -85
  227. data/lib/rubocop/ast/node.rb +0 -637
  228. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  229. data/lib/rubocop/ast/node/and_node.rb +0 -29
  230. data/lib/rubocop/ast/node/args_node.rb +0 -29
  231. data/lib/rubocop/ast/node/array_node.rb +0 -70
  232. data/lib/rubocop/ast/node/block_node.rb +0 -121
  233. data/lib/rubocop/ast/node/break_node.rb +0 -17
  234. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  235. data/lib/rubocop/ast/node/case_node.rb +0 -56
  236. data/lib/rubocop/ast/node/class_node.rb +0 -31
  237. data/lib/rubocop/ast/node/def_node.rb +0 -82
  238. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  239. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  240. data/lib/rubocop/ast/node/float_node.rb +0 -12
  241. data/lib/rubocop/ast/node/for_node.rb +0 -53
  242. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  243. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  244. data/lib/rubocop/ast/node/if_node.rb +0 -175
  245. data/lib/rubocop/ast/node/int_node.rb +0 -12
  246. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  247. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  248. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  249. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  250. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  251. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  252. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
  253. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  254. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  255. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  256. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  257. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  258. data/lib/rubocop/ast/node/module_node.rb +0 -24
  259. data/lib/rubocop/ast/node/or_node.rb +0 -29
  260. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  261. data/lib/rubocop/ast/node/range_node.rb +0 -18
  262. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  263. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  264. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  265. data/lib/rubocop/ast/node/return_node.rb +0 -24
  266. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  267. data/lib/rubocop/ast/node/send_node.rb +0 -13
  268. data/lib/rubocop/ast/node/str_node.rb +0 -16
  269. data/lib/rubocop/ast/node/super_node.rb +0 -21
  270. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  271. data/lib/rubocop/ast/node/until_node.rb +0 -35
  272. data/lib/rubocop/ast/node/when_node.rb +0 -53
  273. data/lib/rubocop/ast/node/while_node.rb +0 -35
  274. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  275. data/lib/rubocop/ast/sexp.rb +0 -16
  276. data/lib/rubocop/ast/traversal.rb +0 -202
  277. data/lib/rubocop/node_pattern.rb +0 -887
  278. data/lib/rubocop/processed_source.rb +0 -213
  279. data/lib/rubocop/string_util.rb +0 -14
  280. data/lib/rubocop/token.rb +0 -114
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of "\*" as a substitute for *join*.
6
+ # This cop checks for uses of "*" as a substitute for _join_.
7
7
  #
8
8
  # Not all cases can reliably checked, due to Ruby's dynamic
9
9
  # types, so we consider only cases when the first argument is an
@@ -35,9 +35,7 @@ module RuboCop
35
35
  node_expr = node.source_range
36
36
  attr_expr = attr_name.source_range
37
37
 
38
- if setter&.boolean_type?
39
- remove = range_between(attr_expr.end_pos, node_expr.end_pos)
40
- end
38
+ remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
41
39
 
42
40
  lambda do |corrector|
43
41
  corrector.replace(node.loc.selector, replacement_method(node))
@@ -60,11 +60,11 @@ module RuboCop
60
60
  end
61
61
 
62
62
  def requires_percent_q?(source)
63
- style == :percent_q && source =~ /^%[^\w]/
63
+ style == :percent_q && /^%[^\w]/.match?(source)
64
64
  end
65
65
 
66
66
  def requires_bare_percent?(source)
67
- style == :bare_percent && source =~ /^%Q/
67
+ style == :bare_percent && source.start_with?('%Q')
68
68
  end
69
69
 
70
70
  def add_offense_for_wrong_style(node, good, bad)
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ClassLength
4
3
  module RuboCop
5
4
  module Cop
6
5
  module Style
@@ -210,9 +209,7 @@ module RuboCop
210
209
  end
211
210
 
212
211
  def message(node)
213
- if braces_required_method?(node.method_name)
214
- return braces_required_message(node)
215
- end
212
+ return braces_required_message(node) if braces_required_method?(node.method_name)
216
213
 
217
214
  case style
218
215
  when :line_count_based then line_count_based_message(node)
@@ -248,14 +245,13 @@ module RuboCop
248
245
  end
249
246
 
250
247
  def whitespace_before?(range)
251
- range.source_buffer.source[range.begin_pos - 1, 1] =~ /\s/
248
+ /\s/.match?(range.source_buffer.source[range.begin_pos - 1, 1])
252
249
  end
253
250
 
254
251
  def whitespace_after?(range, length = 1)
255
- range.source_buffer.source[range.begin_pos + length, 1] =~ /\s/
252
+ /\s/.match?(range.source_buffer.source[range.begin_pos + length, 1])
256
253
  end
257
254
 
258
- # rubocop:disable Metrics/CyclomaticComplexity
259
255
  def get_blocks(node, &block)
260
256
  case node.type
261
257
  when :block
@@ -273,12 +269,9 @@ module RuboCop
273
269
  node.each_child_node { |child| get_blocks(child, &block) }
274
270
  end
275
271
  end
276
- # rubocop:enable Metrics/CyclomaticComplexity
277
272
 
278
273
  def proper_block_style?(node)
279
- if special_method?(node.method_name)
280
- return special_method_proper_block_style?(node)
281
- end
274
+ return special_method_proper_block_style?(node) if special_method?(node.method_name)
282
275
 
283
276
  case style
284
277
  when :line_count_based then line_count_based_block_style?(node)
@@ -387,4 +380,3 @@ module RuboCop
387
380
  end
388
381
  end
389
382
  end
390
- # rubocop:enable Metrics/ClassLength
@@ -42,7 +42,7 @@ module RuboCop
42
42
 
43
43
  def const?(node)
44
44
  if cop_config.fetch('AllowOnConstant', false)
45
- !node.const_type?
45
+ !node&.const_type?
46
46
  else
47
47
  true
48
48
  end
@@ -143,7 +143,7 @@ module RuboCop
143
143
  end
144
144
 
145
145
  def compact_node_name?(node)
146
- node.loc.name.source =~ /::/
146
+ /::/.match?(node.loc.name.source)
147
147
  end
148
148
  end
149
149
  end
@@ -153,7 +153,7 @@ module RuboCop
153
153
  end
154
154
 
155
155
  def contains_backtick?(node)
156
- node_body(node) =~ /`/
156
+ /`/.match?(node_body(node))
157
157
  end
158
158
 
159
159
  def node_body(node)
@@ -55,8 +55,8 @@ module RuboCop
55
55
 
56
56
  def offensive?(comment)
57
57
  line = line(comment)
58
- KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
59
- ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
58
+ KEYWORDS.any? { |word| /^\s*#{word}\s/.match?(line) } &&
59
+ ALLOWED_COMMENTS.none? { |c| /#\s*#{c}/.match?(line) }
60
60
  end
61
61
 
62
62
  def message(comment)
@@ -67,7 +67,7 @@ module RuboCop
67
67
 
68
68
  private
69
69
 
70
- def expand_elsif(node, elsif_branches = [])
70
+ def expand_elsif(node, elsif_branches = []) # rubocop:todo Metrics/CyclomaticComplexity
71
71
  return [] if node.nil? || !node.if_type? || !node.elsif?
72
72
 
73
73
  elsif_branches << node.if_branch
@@ -312,9 +312,7 @@ module RuboCop
312
312
  # ignore pseudo-assignments without rhs in for nodes
313
313
  return if node.parent&.for_type?
314
314
 
315
- if assignment.begin_type? && assignment.children.one?
316
- assignment, = *assignment
317
- end
315
+ assignment, = *assignment if assignment.begin_type? && assignment.children.one?
318
316
 
319
317
  assignment
320
318
  end
@@ -8,8 +8,8 @@ module RuboCop
8
8
  # The default regexp for an acceptable copyright notice can be found in
9
9
  # config/default.yml. The default can be changed as follows:
10
10
  #
11
- # Style/Copyright:
12
- # Notice: '^Copyright (\(c\) )?2\d{3} Acme Inc'
11
+ # Style/Copyright:
12
+ # Notice: '^Copyright (\(c\) )?2\d{3} Acme Inc'
13
13
  #
14
14
  # This regex string is treated as an unanchored regex. For each file
15
15
  # that RuboCop scans, a comment that matches this regex must be found or
@@ -72,14 +72,14 @@ module RuboCop
72
72
  return false if token_index >= processed_source.tokens.size
73
73
 
74
74
  token = processed_source.tokens[token_index]
75
- token.comment? && token.text =~ /^#!.*$/
75
+ token.comment? && /^#!.*$/.match?(token.text)
76
76
  end
77
77
 
78
78
  def encoding_token?(processed_source, token_index)
79
79
  return false if token_index >= processed_source.tokens.size
80
80
 
81
81
  token = processed_source.tokens[token_index]
82
- token.comment? && token.text =~ /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/
82
+ token.comment? && /^#.*coding\s?[:=]\s?(?:UTF|utf)-8/.match?(token.text)
83
83
  end
84
84
 
85
85
  def notice_found?(processed_source)
@@ -88,7 +88,7 @@ module RuboCop
88
88
  processed_source.each_token do |token|
89
89
  break unless token.comment?
90
90
 
91
- notice_found = !(token.text =~ notice_regexp).nil?
91
+ notice_found = notice_regexp.match?(token.text)
92
92
  break if notice_found
93
93
  end
94
94
  notice_found
@@ -41,7 +41,7 @@ module RuboCop
41
41
  private
42
42
 
43
43
  def rubocop_directive_comment?(comment)
44
- comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
44
+ CommentConfig::COMMENT_DIRECTIVE_REGEXP.match?(comment.text)
45
45
  end
46
46
  end
47
47
  end
@@ -104,7 +104,7 @@ module RuboCop
104
104
  end
105
105
 
106
106
  def compact_namespace?(node)
107
- node.loc.name.source =~ /::/
107
+ /::/.match?(node.loc.name.source)
108
108
  end
109
109
 
110
110
  # First checks if the :nodoc: comment is associated with the
@@ -123,7 +123,7 @@ module RuboCop
123
123
  end
124
124
 
125
125
  def nodoc?(comment, require_all = false)
126
- comment.text =~ /^#\s*:nodoc:#{"\s+all\s*$" if require_all}/
126
+ /^#\s*:nodoc:#{"\s+all\s*$" if require_all}/.match?(comment.text)
127
127
  end
128
128
 
129
129
  def nodoc(node)
@@ -3,32 +3,69 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of double negation (!!) to convert something
7
- # to a boolean value. As this is both cryptic and usually redundant, it
8
- # should be avoided.
6
+ # This cop checks for uses of double negation (`!!`) to convert something to a boolean value.
9
7
  #
10
- # @example
8
+ # When using `EnforcedStyle: allowed_in_returns`, allow double nagation in contexts
9
+ # that use boolean as a return value. When using `EnforcedStyle: forbidden`, double nagation
10
+ # should be forbidden always.
11
11
  #
12
+ # @example
12
13
  # # bad
13
14
  # !!something
14
15
  #
15
16
  # # good
16
17
  # !something.nil?
17
18
  #
19
+ # @example EnforcedStyle: allowed_in_returns (default)
20
+ # # good
21
+ # def foo?
22
+ # !!return_value
23
+ # end
24
+ #
25
+ # @example EnforcedStyle: forbidden
26
+ # # bad
27
+ # def foo?
28
+ # !!return_value
29
+ # end
30
+ #
18
31
  # Please, note that when something is a boolean value
19
32
  # !!something and !something.nil? are not the same thing.
20
33
  # As you're unlikely to write code that can accept values of any type
21
34
  # this is rarely a problem in practice.
22
35
  class DoubleNegation < Cop
36
+ include ConfigurableEnforcedStyle
37
+
23
38
  MSG = 'Avoid the use of double negation (`!!`).'
24
39
 
25
40
  def_node_matcher :double_negative?, '(send (send _ :!) :!)'
26
41
 
27
42
  def on_send(node)
28
43
  return unless double_negative?(node) && node.prefix_bang?
44
+ return if style == :allowed_in_returns && allowed_in_returns?(node)
29
45
 
30
46
  add_offense(node, location: :selector)
31
47
  end
48
+
49
+ private
50
+
51
+ def allowed_in_returns?(node)
52
+ node.parent&.return_type? || end_of_method_definition?(node)
53
+ end
54
+
55
+ def end_of_method_definition?(node)
56
+ return false unless (def_node = find_def_node_from_ascendant(node))
57
+
58
+ last_child = def_node.child_nodes.last
59
+
60
+ last_child.last_line == node.last_line
61
+ end
62
+
63
+ def find_def_node_from_ascendant(node)
64
+ return unless (parent = node.parent)
65
+ return parent if parent.def_type? || parent.defs_type?
66
+
67
+ find_def_node_from_ascendant(node.parent)
68
+ end
32
69
  end
33
70
  end
34
71
  end
@@ -43,13 +43,15 @@ module RuboCop
43
43
 
44
44
  def on_case(case_node)
45
45
  return if case_node.condition
46
- return if case_node.when_branches.any? do |when_branch|
47
- when_branch.each_descendant.any?(&:return_type?)
48
- end
49
46
 
50
- if (else_branch = case_node.else_branch)
51
- return if else_branch.return_type? ||
52
- else_branch.each_descendant.any?(&:return_type?)
47
+ branch_bodies = [
48
+ *case_node.when_branches.map(&:body),
49
+ case_node.else_branch
50
+ ].compact
51
+
52
+ return if branch_bodies.any? do |body|
53
+ body.return_type? ||
54
+ body.each_descendant.any?(&:return_type?)
53
55
  end
54
56
 
55
57
  add_offense(case_node, location: :keyword)
@@ -68,9 +68,7 @@ module RuboCop
68
68
 
69
69
  def first_argument_unparenthesized?(node)
70
70
  parent = node.parent
71
- unless parent && %i[send super zsuper].include?(parent.type)
72
- return false
73
- end
71
+ return false unless parent && %i[send super zsuper].include?(parent.type)
74
72
 
75
73
  node.object_id == parent.arguments.first.object_id &&
76
74
  !parentheses?(node.parent)
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # line (compact style), but it can be configured to enforce the `end`
9
9
  # to go on its own line (expanded style).
10
10
  #
11
- # Note: A method definition is not considered empty if it contains
11
+ # NOTE: A method definition is not considered empty if it contains
12
12
  # comments.
13
13
  #
14
14
  # @example EnforcedStyle: compact (default)
@@ -90,10 +90,6 @@ module RuboCop
90
90
  compact_style? ? '; ' : "\n#{indent}"
91
91
  end
92
92
 
93
- def comment_lines?(node)
94
- processed_source[line_range(node)].any? { |line| comment_line?(line) }
95
- end
96
-
97
93
  def compact?(node)
98
94
  node.single_line?
99
95
  end
@@ -42,7 +42,7 @@ module RuboCop
42
42
  end
43
43
 
44
44
  def encoding_omitable?(line)
45
- line =~ ENCODING_PATTERN
45
+ ENCODING_PATTERN.match?(line)
46
46
  end
47
47
 
48
48
  def encoding_line_number(processed_source)
@@ -5,12 +5,12 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces consistency when using exponential notation
7
7
  # for numbers in the code (eg 1.2e4). Different styles are supported:
8
- # - `scientific` which enforces a mantissa between 1 (inclusive)
8
+ # * `scientific` which enforces a mantissa between 1 (inclusive)
9
9
  # and 10 (exclusive).
10
- # - `engineering` which enforces the exponent to be a multiple of 3
10
+ # * `engineering` which enforces the exponent to be a multiple of 3
11
11
  # and the mantissa to be between 0.1 (inclusive)
12
12
  # and 10 (exclusive).
13
- # - `integral` which enforces the mantissa to always be a whole number
13
+ # * `integral` which enforces the mantissa to always be a whole number
14
14
  # without trailing zeroes.
15
15
  #
16
16
  # @example EnforcedStyle: scientific (default)
@@ -69,7 +69,7 @@ module RuboCop
69
69
 
70
70
  def scientific?(node)
71
71
  mantissa, = node.source.split('e')
72
- mantissa =~ /^-?[1-9](\.\d*[0-9])?$/
72
+ /^-?[1-9](\.\d*[0-9])?$/.match?(mantissa)
73
73
  end
74
74
 
75
75
  def engineering?(node)
@@ -85,7 +85,7 @@ module RuboCop
85
85
 
86
86
  def integral(node)
87
87
  mantissa, = node.source.split('e')
88
- mantissa =~ /^-?[1-9](\d*[1-9])?$/
88
+ /^-?[1-9](\d*[1-9])?$/.match?(mantissa)
89
89
  end
90
90
 
91
91
  def offense?(node)
@@ -5,11 +5,10 @@ module RuboCop
5
5
  module Style
6
6
  # Use a consistent style for named format string tokens.
7
7
  #
8
- # **Note:**
9
- # `unannotated` style cop only works for strings
8
+ # NOTE: `unannotated` style cop only works for strings
10
9
  # which are passed as arguments to those methods:
11
10
  # `printf`, `sprintf`, `format`, `%`.
12
- # The reason is that *unannotated* format is very similar
11
+ # The reason is that _unannotated_ format is very similar
13
12
  # to encoded URLs or Date/Time formatting strings.
14
13
  #
15
14
  # @example EnforcedStyle: annotated (default)
@@ -8,8 +8,7 @@ module RuboCop
8
8
  # It will add the comment `# frozen_string_literal: true` to the top of
9
9
  # files to enable frozen string literals. Frozen string literals may be
10
10
  # default in future Ruby. The comment will be added below a shebang and
11
- # encoding comment. The frozen string literal comment is only valid in
12
- # Ruby 2.3+.
11
+ # encoding comment.
13
12
  #
14
13
  # Note that the cop will ignore files where the comment exists but is set
15
14
  # to `false` instead of `true`.
@@ -149,9 +148,7 @@ module RuboCop
149
148
  end
150
149
 
151
150
  next_token = processed_source.tokens[token_number]
152
- if next_token && next_token.text =~ Encoding::ENCODING_PATTERN
153
- token = next_token
154
- end
151
+ token = next_token if Encoding::ENCODING_PATTERN.match?(next_token&.text)
155
152
 
156
153
  token
157
154
  end
@@ -216,7 +213,7 @@ module RuboCop
216
213
  if comment
217
214
  corrector.insert_after(line_range(comment.line), following_comment)
218
215
  else
219
- corrector.insert_before(line_range(1), preceding_comment)
216
+ corrector.insert_before(processed_source.buffer.source_range, preceding_comment)
220
217
  end
221
218
  end
222
219
 
@@ -35,6 +35,17 @@ module RuboCop
35
35
  # # good
36
36
  # raise 'exception' if something
37
37
  # ok
38
+ #
39
+ # # bad
40
+ # if something
41
+ # foo || raise('exception')
42
+ # else
43
+ # ok
44
+ # end
45
+ #
46
+ # # good
47
+ # foo || raise('exception') if something
48
+ # ok
38
49
  class GuardClause < Cop
39
50
  include MinBodyLength
40
51
  include StatementModifier
@@ -69,7 +80,8 @@ module RuboCop
69
80
  else
70
81
  opposite_keyword(node)
71
82
  end
72
- register_offense(node, guard_clause.source, kw)
83
+
84
+ register_offense(node, guard_clause_source(guard_clause), kw)
73
85
  end
74
86
 
75
87
  private
@@ -98,13 +110,24 @@ module RuboCop
98
110
  message: format(MSG, example: example))
99
111
  end
100
112
 
113
+ def guard_clause_source(guard_clause)
114
+ parent = guard_clause.parent
115
+
116
+ if parent.and_type? || parent.or_type?
117
+ guard_clause.parent.source
118
+ else
119
+ guard_clause.source
120
+ end
121
+ end
122
+
101
123
  def too_long_for_single_line?(node, example)
102
124
  max = max_line_length
103
125
  max && node.source_range.column + example.length > max
104
126
  end
105
127
 
106
128
  def accepted_form?(node, ending = false)
107
- accepted_if?(node, ending) || node.condition.multiline?
129
+ accepted_if?(node, ending) || node.condition.multiline? ||
130
+ node.parent&.assignment?
108
131
  end
109
132
 
110
133
  def accepted_if?(node, ending)