rubocop 0.90.0 → 0.93.1

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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +79 -3
  4. data/lib/rubocop.rb +20 -5
  5. data/lib/rubocop/cached_data.rb +2 -1
  6. data/lib/rubocop/cli/command/execute_runner.rb +8 -0
  7. data/lib/rubocop/comment_config.rb +9 -5
  8. data/lib/rubocop/config_loader.rb +3 -3
  9. data/lib/rubocop/config_regeneration.rb +33 -0
  10. data/lib/rubocop/config_store.rb +3 -3
  11. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  12. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -0
  13. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  14. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  15. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
  16. data/lib/rubocop/cop/generator.rb +1 -1
  17. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  18. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  19. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  20. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  21. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  22. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  23. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  24. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  25. data/lib/rubocop/cop/layout/class_structure.rb +1 -1
  26. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  27. data/lib/rubocop/cop/layout/dot_position.rb +6 -9
  28. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  29. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +4 -12
  30. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +13 -8
  31. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -2
  32. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -2
  33. data/lib/rubocop/cop/layout/end_alignment.rb +5 -10
  34. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +26 -4
  35. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +4 -13
  36. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -7
  37. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +0 -4
  38. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +6 -21
  39. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +3 -8
  40. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -2
  41. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
  42. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  43. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +18 -1
  44. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  45. data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
  46. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  47. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  48. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  49. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  50. data/lib/rubocop/cop/lint/duplicate_require.rb +7 -2
  51. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -4
  52. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  53. data/lib/rubocop/cop/lint/empty_file.rb +1 -4
  54. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  55. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  56. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  57. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
  58. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  59. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  60. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  61. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  62. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  63. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  64. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -2
  65. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  66. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  67. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  68. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
  69. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  70. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  71. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +78 -0
  72. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  73. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  74. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  75. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  76. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  77. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  78. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  79. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
  80. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  81. data/lib/rubocop/cop/lint/useless_method_definition.rb +20 -27
  82. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  83. data/lib/rubocop/cop/metrics/block_length.rb +3 -1
  84. data/lib/rubocop/cop/metrics/class_length.rb +14 -6
  85. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +25 -16
  86. data/lib/rubocop/cop/mixin/comments_help.rb +3 -9
  87. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  88. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  89. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +9 -0
  90. data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -2
  91. data/lib/rubocop/cop/mixin/rescue_node.rb +1 -0
  92. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -3
  93. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  94. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  95. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  96. data/lib/rubocop/cop/offense.rb +15 -2
  97. data/lib/rubocop/cop/security/eval.rb +1 -0
  98. data/lib/rubocop/cop/security/json_load.rb +1 -0
  99. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  100. data/lib/rubocop/cop/security/open.rb +1 -0
  101. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  102. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -11
  103. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
  104. data/lib/rubocop/cop/style/alias.rb +2 -0
  105. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  106. data/lib/rubocop/cop/style/array_join.rb +1 -0
  107. data/lib/rubocop/cop/style/attr.rb +1 -0
  108. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
  109. data/lib/rubocop/cop/style/case_equality.rb +3 -0
  110. data/lib/rubocop/cop/style/case_like_if.rb +20 -4
  111. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
  112. data/lib/rubocop/cop/style/class_check.rb +6 -9
  113. data/lib/rubocop/cop/style/class_equality_comparison.rb +64 -0
  114. data/lib/rubocop/cop/style/class_methods_definitions.rb +42 -16
  115. data/lib/rubocop/cop/style/class_vars.rb +1 -2
  116. data/lib/rubocop/cop/style/combinable_loops.rb +13 -11
  117. data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
  118. data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
  119. data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
  120. data/lib/rubocop/cop/style/date_time.rb +12 -1
  121. data/lib/rubocop/cop/style/dir.rb +1 -0
  122. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  123. data/lib/rubocop/cop/style/empty_literal.rb +3 -1
  124. data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
  125. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  126. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  127. data/lib/rubocop/cop/style/explicit_block_argument.rb +7 -3
  128. data/lib/rubocop/cop/style/float_division.rb +2 -0
  129. data/lib/rubocop/cop/style/for.rb +0 -4
  130. data/lib/rubocop/cop/style/format_string.rb +1 -4
  131. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  132. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  133. data/lib/rubocop/cop/style/hash_transform_keys.rb +5 -11
  134. data/lib/rubocop/cop/style/hash_transform_values.rb +5 -11
  135. data/lib/rubocop/cop/style/if_unless_modifier.rb +0 -4
  136. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  137. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -6
  138. data/lib/rubocop/cop/style/lambda_call.rb +3 -1
  139. data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
  140. data/lib/rubocop/cop/style/mixin_usage.rb +8 -27
  141. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  142. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
  143. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -0
  144. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -0
  145. data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
  146. data/lib/rubocop/cop/style/non_nil_check.rb +2 -0
  147. data/lib/rubocop/cop/style/not.rb +1 -0
  148. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -3
  149. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -1
  150. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  151. data/lib/rubocop/cop/style/preferred_hash_methods.rb +2 -0
  152. data/lib/rubocop/cop/style/raise_args.rb +2 -3
  153. data/lib/rubocop/cop/style/random_with_offset.rb +4 -3
  154. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -9
  155. data/lib/rubocop/cop/style/redundant_begin.rb +36 -8
  156. data/lib/rubocop/cop/style/redundant_condition.rb +5 -1
  157. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  158. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  159. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -0
  160. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -1
  161. data/lib/rubocop/cop/style/redundant_interpolation.rb +6 -1
  162. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -6
  163. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  164. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +39 -24
  165. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -15
  166. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  167. data/lib/rubocop/cop/style/redundant_self.rb +7 -9
  168. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  169. data/lib/rubocop/cop/style/redundant_sort.rb +12 -29
  170. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  171. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  172. data/lib/rubocop/cop/style/safe_navigation.rb +5 -0
  173. data/lib/rubocop/cop/style/sample.rb +2 -1
  174. data/lib/rubocop/cop/style/send.rb +2 -3
  175. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  176. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  177. data/lib/rubocop/cop/style/slicing_with_range.rb +2 -1
  178. data/lib/rubocop/cop/style/stderr_puts.rb +1 -0
  179. data/lib/rubocop/cop/style/string_concatenation.rb +17 -3
  180. data/lib/rubocop/cop/style/strip.rb +1 -0
  181. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  182. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +4 -3
  183. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  184. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -5
  185. data/lib/rubocop/cop/util.rb +0 -1
  186. data/lib/rubocop/cop/variable_force/branch.rb +0 -4
  187. data/lib/rubocop/core_ext/string.rb +1 -1
  188. data/lib/rubocop/directive_comment.rb +32 -0
  189. data/lib/rubocop/ext/regexp_node.rb +23 -7
  190. data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
  191. data/lib/rubocop/options.rb +37 -17
  192. data/lib/rubocop/result_cache.rb +38 -15
  193. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  194. data/lib/rubocop/rspec/expect_offense.rb +5 -5
  195. data/lib/rubocop/runner.rb +37 -18
  196. data/lib/rubocop/target_finder.rb +27 -26
  197. data/lib/rubocop/target_ruby.rb +1 -1
  198. data/lib/rubocop/version.rb +6 -1
  199. metadata +19 -18
  200. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
  201. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -7,15 +7,9 @@ module RuboCop
7
7
  include VisibilityHelp
8
8
 
9
9
  def source_range_with_comment(node)
10
- begin_pos, end_pos =
11
- if node.def_type?
12
- start_node = find_visibility_start(node) || node
13
- end_node = find_visibility_end(node) || node
14
- [begin_pos_with_comment(start_node),
15
- end_position_for(end_node) + 1]
16
- else
17
- [begin_pos_with_comment(node), end_position_for(node)]
18
- end
10
+ begin_pos = begin_pos_with_comment(node)
11
+ end_pos = end_position_for(node)
12
+ end_pos += 1 if node.def_type?
19
13
 
20
14
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
21
15
  end
@@ -8,8 +8,8 @@ module RuboCop
8
8
  include ConfigurableFormatting
9
9
 
10
10
  FORMATS = {
11
- snake_case: /^@{0,2}[\da-z_]+[!?=]?$/,
12
- camelCase: /^@{0,2}(?:_|_?[a-z][\da-zA-Z]*)[!?=]?$/
11
+ snake_case: /^@{0,2}[\d[[:lower:]]_]+[!?=]?$/,
12
+ camelCase: /^@{0,2}(?:_|_?[[[:lower:]]][\d[[:lower:]][[:upper:]]]*)[!?=]?$/
13
13
  }.freeze
14
14
  end
15
15
  end
@@ -8,9 +8,9 @@ module RuboCop
8
8
  include ConfigurableFormatting
9
9
 
10
10
  FORMATS = {
11
- snake_case: /(?:[a-z_]|_\d+)$/,
12
- normalcase: /(?:_\D*|[A-Za-z]\d*)$/,
13
- non_integer: /[A-Za-z_]$/
11
+ snake_case: /(?:[[[:lower:]]_]|_\d+)$/,
12
+ normalcase: /(?:_\D*|[[[:upper:]][[:lower:]]]\d*)$/,
13
+ non_integer: /[[[:upper:]][[:lower:]]_]$/
14
14
  }.freeze
15
15
  end
16
16
  end
@@ -39,6 +39,15 @@ module RuboCop
39
39
  end
40
40
  end
41
41
 
42
+ def start_line_range(node)
43
+ expr = node.source_range
44
+ buffer = expr.source_buffer
45
+ source = buffer.source_line(expr.line)
46
+ range = buffer.line_range(expr.line)
47
+
48
+ range_between(range.begin_pos + (source =~ /\S/), range.begin_pos + (source =~ /\s*\z/))
49
+ end
50
+
42
51
  def add_offense_for_misalignment(node, align_with)
43
52
  end_loc = node.loc.end
44
53
  msg = format(MSG, end_line: end_loc.line,
@@ -4,7 +4,15 @@ module RuboCop
4
4
  module Cop
5
5
  # Common functionality for Style/HashTransformKeys and
6
6
  # Style/HashTransformValues
7
- module HashTransformMethod
7
+ module HashTransformMethod # rubocop:disable Metrics/ModuleLength
8
+ extend NodePattern::Macros
9
+
10
+ RESTRICT_ON_SEND = %i[[] to_h].freeze
11
+
12
+ def_node_matcher :array_receiver?, <<~PATTERN
13
+ {(array ...) (send _ :each_with_index) (send _ :with_index _ ?) (send _ :zip ...)}
14
+ PATTERN
15
+
8
16
  def on_block(node)
9
17
  on_bad_each_with_object(node) do |*match|
10
18
  handle_possible_offense(node, match, 'each_with_object')
@@ -129,7 +137,7 @@ module RuboCop
129
137
  end
130
138
 
131
139
  # Internal helper class to hold autocorrect data
132
- Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do # rubocop:disable Metrics/BlockLength
140
+ Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
133
141
  def self.from_each_with_object(node, match)
134
142
  new(match, node, 0, 0)
135
143
  end
@@ -18,6 +18,7 @@ module RuboCop
18
18
  @modifier_locations.include?(node.loc.keyword)
19
19
  end
20
20
 
21
+ # @deprecated Use ResbodyNode#exceptions instead
21
22
  def rescued_exceptions(resbody)
22
23
  rescue_group, = *resbody
23
24
  if rescue_group
@@ -57,10 +57,11 @@ module RuboCop
57
57
  end
58
58
 
59
59
  def first_line_comment(node)
60
- comment =
61
- processed_source.find_comment { |c| c.loc.line == node.loc.line }
60
+ comment = processed_source.find_comment { |c| c.loc.line == node.loc.line }
61
+ return unless comment
62
62
 
63
- comment ? comment.loc.expression.source : nil
63
+ comment_source = comment.loc.expression.source
64
+ comment_source unless comment_disables_cop?(comment_source)
64
65
  end
65
66
 
66
67
  def parenthesize?(node)
@@ -80,6 +81,11 @@ module RuboCop
80
81
 
81
82
  config.for_cop('Layout/LineLength')['Max']
82
83
  end
84
+
85
+ def comment_disables_cop?(comment)
86
+ regexp_pattern = "# rubocop : (disable|todo) ([^,],)* (all|#{cop_name})"
87
+ Regexp.new(regexp_pattern.gsub(' ', '\s*')).match?(comment)
88
+ end
83
89
  end
84
90
  end
85
91
  end
@@ -16,32 +16,20 @@ module RuboCop
16
16
  end
17
17
 
18
18
  def find_visibility_start(node)
19
- left_siblings_of(node)
20
- .reverse
21
- .find(&method(:visibility_block?))
19
+ node.left_siblings
20
+ .reverse
21
+ .find(&method(:visibility_block?))
22
22
  end
23
23
 
24
24
  # Navigate to find the last protected method
25
25
  def find_visibility_end(node)
26
26
  possible_visibilities = VISIBILITY_SCOPES - [node_visibility(node)]
27
- right = right_siblings_of(node)
27
+ right = node.right_siblings
28
28
  right.find do |child_node|
29
29
  possible_visibilities.include?(node_visibility(child_node))
30
30
  end || right.last
31
31
  end
32
32
 
33
- def left_siblings_of(node)
34
- siblings_of(node)[0, node.sibling_index]
35
- end
36
-
37
- def right_siblings_of(node)
38
- siblings_of(node)[node.sibling_index..-1]
39
- end
40
-
41
- def siblings_of(node)
42
- node.parent.children
43
- end
44
-
45
33
  def_node_matcher :visibility_block?, <<~PATTERN
46
34
  (send nil? { :private :protected :public })
47
35
  PATTERN
@@ -35,7 +35,7 @@ module RuboCop
35
35
  def op_method?(name)
36
36
  return false if EXCLUDED.include?(name)
37
37
 
38
- !/\A\w/.match?(name) || OP_LIKE_METHODS.include?(name)
38
+ !/\A[[:word:]]/.match?(name) || OP_LIKE_METHODS.include?(name)
39
39
  end
40
40
  end
41
41
  end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  'called `%<namespace>s`.'
34
34
  MSG_REGEX = '`%<basename>s` should match `%<regex>s`.'
35
35
 
36
- SNAKE_CASE = /^[\da-z_.?!]+$/.freeze
36
+ SNAKE_CASE = /^[\d[[:lower:]]_.?!]+$/.freeze
37
37
 
38
38
  def on_new_investigation
39
39
  file_path = processed_source.file_path
@@ -63,10 +63,23 @@ module RuboCop
63
63
  attr_reader :corrector
64
64
 
65
65
  PseudoSourceRange = Struct.new(:line, :column, :source_line, :begin_pos,
66
- :end_pos)
66
+ :end_pos) do
67
+ alias_method :first_line, :line
68
+ alias_method :last_line, :line
69
+ alias_method :last_column, :column
70
+
71
+ def column_range
72
+ column...last_column
73
+ end
74
+
75
+ def size
76
+ end_pos - begin_pos
77
+ end
78
+ alias_method :length, :size
79
+ end
67
80
  private_constant :PseudoSourceRange
68
81
 
69
- NO_LOCATION = PseudoSourceRange.new(1, 0, '', 0, 1).freeze
82
+ NO_LOCATION = PseudoSourceRange.new(1, 0, '', 0, 0).freeze
70
83
 
71
84
  # @api private
72
85
  def initialize(severity, location, message, cop_name, # rubocop:disable Metrics/ParameterLists
@@ -13,6 +13,7 @@ module RuboCop
13
13
  # binding.eval(something)
14
14
  class Eval < Base
15
15
  MSG = 'The use of `eval` is a serious security risk.'
16
+ RESTRICT_ON_SEND = %i[eval].freeze
16
17
 
17
18
  def_node_matcher :eval?, <<~PATTERN
18
19
  (send {nil? (send nil? :binding)} :eval $!str ...)
@@ -26,6 +26,7 @@ module RuboCop
26
26
  extend AutoCorrector
27
27
 
28
28
  MSG = 'Prefer `JSON.parse` over `JSON.%<method>s`.'
29
+ RESTRICT_ON_SEND = %i[load restore].freeze
29
30
 
30
31
  def_node_matcher :json_load, <<~PATTERN
31
32
  (send (const {nil? cbase} :JSON) ${:load :restore} ...)
@@ -20,6 +20,7 @@ module RuboCop
20
20
  #
21
21
  class MarshalLoad < Base
22
22
  MSG = 'Avoid using `Marshal.%<method>s`.'
23
+ RESTRICT_ON_SEND = %i[load restore].freeze
23
24
 
24
25
  def_node_matcher :marshal_load, <<~PATTERN
25
26
  (send (const {nil? cbase} :Marshal) ${:load :restore}
@@ -21,6 +21,7 @@ module RuboCop
21
21
  # URI.parse(something).open
22
22
  class Open < Base
23
23
  MSG = 'The use of `Kernel#open` is a serious security risk.'
24
+ RESTRICT_ON_SEND = %i[open].freeze
24
25
 
25
26
  def_node_matcher :open?, <<~PATTERN
26
27
  (send nil? :open $!str ...)
@@ -19,6 +19,7 @@ module RuboCop
19
19
  extend AutoCorrector
20
20
 
21
21
  MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'
22
+ RESTRICT_ON_SEND = %i[load].freeze
22
23
 
23
24
  def_node_matcher :yaml_load, <<~PATTERN
24
25
  (send (const {nil? cbase} :YAML) :load ...)
@@ -65,8 +65,6 @@ module RuboCop
65
65
  class AccessModifierDeclarations < Base
66
66
  include ConfigurableEnforcedStyle
67
67
 
68
- ACCESS_MODIFIERS = %i[private protected public module_function].to_set.freeze
69
-
70
68
  GROUP_STYLE_MESSAGE = [
71
69
  '`%<access_modifier>s` should not be',
72
70
  'inlined in method definitions.'
@@ -77,14 +75,16 @@ module RuboCop
77
75
  'inlined in method definitions.'
78
76
  ].join(' ')
79
77
 
78
+ RESTRICT_ON_SEND = %i[private protected public module_function].freeze
79
+
80
80
  def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
81
81
  (send nil? {:private :protected :public} (sym _))
82
82
  PATTERN
83
83
 
84
84
  def on_send(node)
85
- return unless access_modifier?(node)
86
- return if node.parent.pair_type?
87
- return if cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
85
+ return unless node.access_modifier?
86
+ return if node.parent&.pair_type?
87
+ return if allow_modifiers_on_symbols?(node)
88
88
 
89
89
  if offense?(node)
90
90
  add_offense(node.loc.selector) if opposite_style_detected
@@ -95,12 +95,8 @@ module RuboCop
95
95
 
96
96
  private
97
97
 
98
- def access_modifier?(node)
99
- maybe_access_modifier?(node) && node.access_modifier?
100
- end
101
-
102
- def maybe_access_modifier?(node)
103
- !node.receiver && ACCESS_MODIFIERS.include?(node.method_name)
98
+ def allow_modifiers_on_symbols?(node)
99
+ cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
104
100
  end
105
101
 
106
102
  def offense?(node)
@@ -7,6 +7,9 @@ module RuboCop
7
7
  # By default it enforces accessors to be placed in grouped declarations,
8
8
  # but it can be configured to enforce separating them in multiple declarations.
9
9
  #
10
+ # Note: `Sorbet` is not compatible with "grouped" style. Consider "separated" style
11
+ # or disabling this cop.
12
+ #
10
13
  # @example EnforcedStyle: grouped (default)
11
14
  # # bad
12
15
  # class Foo
@@ -32,6 +32,8 @@ module RuboCop
32
32
  MSG_SYMBOL_ARGS = 'Use `alias %<prefer>s` instead of ' \
33
33
  '`alias %<current>s`.'
34
34
 
35
+ RESTRICT_ON_SEND = %i[alias_method].freeze
36
+
35
37
  def on_send(node)
36
38
  return unless node.command?(:alias_method)
37
39
  return unless style == :prefer_alias && alias_keyword_possible?(node)
@@ -5,6 +5,10 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces the use of `Array()` instead of explicit `Array` check or `[*var]`.
7
7
  #
8
+ # This cop is disabled by default because false positive will occur if
9
+ # the argument of `Array()` is not an array (e.g. Hash, Set),
10
+ # an array will be returned as an incompatibility result.
11
+ #
8
12
  # @example
9
13
  # # bad
10
14
  # paths = [paths] unless paths.is_a?(Array)
@@ -21,6 +21,7 @@ module RuboCop
21
21
  extend AutoCorrector
22
22
 
23
23
  MSG = 'Favor `Array#join` over `Array#*`.'
24
+ RESTRICT_ON_SEND = %i[*].freeze
24
25
 
25
26
  def_node_matcher :join_candidate?, '(send $array :* $str)'
26
27
 
@@ -19,6 +19,7 @@ module RuboCop
19
19
  extend AutoCorrector
20
20
 
21
21
  MSG = 'Do not use `attr`. Use `%<replacement>s` instead.'
22
+ RESTRICT_ON_SEND = %i[attr].freeze
22
23
 
23
24
  def on_send(node)
24
25
  return unless node.command?(:attr) && node.arguments?
@@ -23,6 +23,8 @@ module RuboCop
23
23
  File: :open
24
24
  }.freeze
25
25
 
26
+ RESTRICT_ON_SEND = TARGET_METHODS.values.freeze
27
+
26
28
  def on_send(node)
27
29
  TARGET_METHODS.each do |target_class, target_method|
28
30
  next if node.method_name != target_method
@@ -33,11 +33,14 @@ module RuboCop
33
33
  extend AutoCorrector
34
34
 
35
35
  MSG = 'Avoid the use of the case equality operator `===`.'
36
+ RESTRICT_ON_SEND = %i[===].freeze
36
37
 
37
38
  def_node_matcher :case_equality?, '(send $#const? :=== $_)'
38
39
 
39
40
  def on_send(node)
40
41
  case_equality?(node) do |lhs, rhs|
42
+ return if lhs.const_type? && !lhs.module_name?
43
+
41
44
  add_offense(node.loc.selector) do |corrector|
42
45
  replacement = replacement(lhs, rhs)
43
46
  corrector.replace(node, replacement) if replacement
@@ -42,6 +42,8 @@ module RuboCop
42
42
  convertible = true
43
43
 
44
44
  branch_conditions(node).each do |branch_condition|
45
+ return false if regexp_with_working_captures?(branch_condition)
46
+
45
47
  conditions << []
46
48
  convertible = collect_conditions(branch_condition, target, conditions.last)
47
49
  break unless convertible
@@ -49,9 +51,7 @@ module RuboCop
49
51
 
50
52
  return unless convertible
51
53
 
52
- add_offense(node) do |corrector|
53
- autocorrect(corrector, node)
54
- end
54
+ add_offense(node) { |corrector| autocorrect(corrector, node) }
55
55
  end
56
56
 
57
57
  private
@@ -107,7 +107,7 @@ module RuboCop
107
107
  when :include?, :cover?
108
108
  receiver = deparenthesize(node.receiver)
109
109
  node.arguments.first if receiver.range_type?
110
- when :match, :match?
110
+ when :match, :match?, :=~
111
111
  find_target_in_match_node(node)
112
112
  end
113
113
  end
@@ -230,6 +230,22 @@ module RuboCop
230
230
  def indent(node)
231
231
  ' ' * node.loc.column
232
232
  end
233
+
234
+ # Named captures work with `=~` (if regexp is on lhs) and with `match` (both sides)
235
+ def regexp_with_working_captures?(node)
236
+ case node.type
237
+ when :match_with_lvasgn
238
+ lhs, _rhs = *node
239
+ node.loc.selector.source == '=~' && regexp_with_named_captures?(lhs)
240
+ when :send
241
+ lhs, method, rhs = *node
242
+ method == :match && [lhs, rhs].any? { |n| regexp_with_named_captures?(n) }
243
+ end
244
+ end
245
+
246
+ def regexp_with_named_captures?(node)
247
+ node.regexp_type? && node.each_capture(named: true).count.positive?
248
+ end
233
249
  end
234
250
  end
235
251
  end
@@ -112,6 +112,8 @@ module RuboCop
112
112
  end
113
113
 
114
114
  def check_style(node, body)
115
+ return if node.identifier.children[0]&.cbase_type?
116
+
115
117
  if style == :nested
116
118
  check_nested_style(node)
117
119
  else
@@ -28,19 +28,16 @@ module RuboCop
28
28
  extend AutoCorrector
29
29
 
30
30
  MSG = 'Prefer `Object#%<prefer>s` over `Object#%<current>s`.'
31
-
32
- def_node_matcher :class_check?, '(send _ ${:is_a? :kind_of?} _)'
31
+ RESTRICT_ON_SEND = %i[is_a? kind_of?].freeze
33
32
 
34
33
  def on_send(node)
35
- class_check?(node) do |method_name|
36
- return if style == method_name
34
+ return if style == node.method_name
37
35
 
38
- message = message(node)
39
- add_offense(node.loc.selector, message: message) do |corrector|
40
- replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
36
+ message = message(node)
37
+ add_offense(node.loc.selector, message: message) do |corrector|
38
+ replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
41
39
 
42
- corrector.replace(node.loc.selector, replacement)
43
- end
40
+ corrector.replace(node.loc.selector, replacement)
44
41
  end
45
42
  end
46
43