rubocop 0.78.0 → 0.82.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +158 -48
  5. data/lib/rubocop.rb +19 -4
  6. data/lib/rubocop/ast/builder.rb +45 -42
  7. data/lib/rubocop/ast/node.rb +12 -19
  8. data/lib/rubocop/ast/node/array_node.rb +13 -0
  9. data/lib/rubocop/ast/node/block_node.rb +5 -1
  10. data/lib/rubocop/ast/node/case_match_node.rb +56 -0
  11. data/lib/rubocop/ast/node/def_node.rb +11 -0
  12. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  13. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
  14. data/lib/rubocop/ast/node/regexp_node.rb +2 -4
  15. data/lib/rubocop/ast/traversal.rb +29 -10
  16. data/lib/rubocop/cli.rb +10 -4
  17. data/lib/rubocop/cli/command/show_cops.rb +11 -4
  18. data/lib/rubocop/comment_config.rb +6 -1
  19. data/lib/rubocop/config.rb +36 -10
  20. data/lib/rubocop/config_loader.rb +42 -33
  21. data/lib/rubocop/config_loader_resolver.rb +1 -1
  22. data/lib/rubocop/config_obsoletion.rb +4 -1
  23. data/lib/rubocop/config_validator.rb +66 -92
  24. data/lib/rubocop/cop/autocorrect_logic.rb +6 -3
  25. data/lib/rubocop/cop/badge.rb +5 -5
  26. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  27. data/lib/rubocop/cop/corrector.rb +48 -24
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  30. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/generator.rb +3 -4
  37. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  39. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  40. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  41. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  42. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  43. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
  44. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  45. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
  46. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -4
  48. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  49. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  50. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  51. data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
  52. data/lib/rubocop/cop/layout/line_length.rb +32 -3
  53. data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -6
  54. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
  55. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  56. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  57. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
  58. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -1
  59. data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
  61. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  62. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  63. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
  64. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  65. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  66. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  67. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  68. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  69. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  70. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  71. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  72. data/lib/rubocop/cop/lint/loop.rb +6 -4
  73. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  74. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  75. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  76. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  77. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
  78. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  79. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -1
  80. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +12 -7
  81. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  82. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  83. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  84. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -22
  85. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  86. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  87. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  88. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -0
  89. data/lib/rubocop/cop/migration/department_name.rb +47 -6
  90. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
  91. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  92. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  93. data/lib/rubocop/cop/mixin/hash_transform_method.rb +171 -0
  94. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
  95. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  96. data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
  97. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -10
  98. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  99. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  100. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  101. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  102. data/lib/rubocop/cop/naming/method_name.rb +30 -0
  103. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  104. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  105. data/lib/rubocop/cop/registry.rb +15 -3
  106. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  107. data/lib/rubocop/cop/style/alias.rb +4 -4
  108. data/lib/rubocop/cop/style/and_or.rb +5 -6
  109. data/lib/rubocop/cop/style/array_join.rb +1 -1
  110. data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
  111. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  112. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  113. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  114. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
  115. data/lib/rubocop/cop/style/copyright.rb +1 -1
  116. data/lib/rubocop/cop/style/dir.rb +1 -1
  117. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  118. data/lib/rubocop/cop/style/documentation.rb +43 -5
  119. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  120. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  121. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  122. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  123. data/lib/rubocop/cop/style/end_block.rb +6 -0
  124. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  125. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  126. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  127. data/lib/rubocop/cop/style/format_string.rb +2 -2
  128. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
  129. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  130. data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
  131. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  132. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  133. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  134. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  135. data/lib/rubocop/cop/style/lambda.rb +3 -2
  136. data/lib/rubocop/cop/style/lambda_call.rb +2 -2
  137. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
  138. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  139. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  140. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  141. data/lib/rubocop/cop/style/module_function.rb +58 -12
  142. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  143. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  144. data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
  145. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  146. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
  147. data/lib/rubocop/cop/style/next.rb +2 -2
  148. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  149. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  150. data/lib/rubocop/cop/style/not.rb +1 -1
  151. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  152. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  153. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -4
  154. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
  155. data/lib/rubocop/cop/style/or_assignment.rb +4 -3
  156. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  157. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  158. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  159. data/lib/rubocop/cop/style/proc.rb +1 -1
  160. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  161. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  162. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  163. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  164. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  165. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  166. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  167. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  168. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  169. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  170. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  171. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  172. data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
  173. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  174. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  175. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  176. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  177. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  178. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  179. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  180. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
  181. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  182. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  183. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  184. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  185. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  186. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  187. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  188. data/lib/rubocop/cop/style/word_array.rb +1 -1
  189. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  190. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  191. data/lib/rubocop/cop/variable_force.rb +4 -1
  192. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  193. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  194. data/lib/rubocop/formatter/junit_formatter.rb +74 -0
  195. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  196. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  197. data/lib/rubocop/node_pattern.rb +96 -10
  198. data/lib/rubocop/options.rb +7 -1
  199. data/lib/rubocop/processed_source.rb +1 -4
  200. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  201. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  202. data/lib/rubocop/rspec/shared_contexts.rb +5 -4
  203. data/lib/rubocop/runner.rb +1 -1
  204. data/lib/rubocop/target_ruby.rb +151 -0
  205. data/lib/rubocop/version.rb +1 -1
  206. metadata +39 -12
  207. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  208. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  209. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
@@ -5,11 +5,12 @@ module RuboCop
5
5
  module Style
6
6
  # Access modifiers should be declared to apply to a group of methods
7
7
  # or inline before each method, depending on configuration.
8
+ # EnforcedStyle config covers only method definitions.
9
+ # Applications of visibility methods to symbols can be controlled
10
+ # using AllowModifiersOnSymbols config.
8
11
  #
9
12
  # @example EnforcedStyle: group (default)
10
- #
11
13
  # # bad
12
- #
13
14
  # class Foo
14
15
  #
15
16
  # private def bar; end
@@ -18,7 +19,6 @@ module RuboCop
18
19
  # end
19
20
  #
20
21
  # # good
21
- #
22
22
  # class Foo
23
23
  #
24
24
  # private
@@ -27,10 +27,9 @@ module RuboCop
27
27
  # def baz; end
28
28
  #
29
29
  # end
30
- # @example EnforcedStyle: inline
31
30
  #
31
+ # @example EnforcedStyle: inline
32
32
  # # bad
33
- #
34
33
  # class Foo
35
34
  #
36
35
  # private
@@ -41,13 +40,28 @@ module RuboCop
41
40
  # end
42
41
  #
43
42
  # # good
44
- #
45
43
  # class Foo
46
44
  #
47
45
  # private def bar; end
48
46
  # private def baz; end
49
47
  #
50
48
  # end
49
+ #
50
+ # @example AllowModifiersOnSymbols: true
51
+ # # good
52
+ # class Foo
53
+ #
54
+ # private :bar, :baz
55
+ #
56
+ # end
57
+ #
58
+ # @example AllowModifiersOnSymbols: false
59
+ # # bad
60
+ # class Foo
61
+ #
62
+ # private :bar, :baz
63
+ #
64
+ # end
51
65
  class AccessModifierDeclarations < Cop
52
66
  include ConfigurableEnforcedStyle
53
67
 
@@ -61,9 +75,15 @@ module RuboCop
61
75
  'inlined in method definitions.'
62
76
  ].join(' ')
63
77
 
78
+ def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
79
+ (send nil? {:private :protected :public} (sym _))
80
+ PATTERN
81
+
64
82
  def on_send(node)
65
83
  return unless node.access_modifier?
66
84
  return if node.parent.pair_type?
85
+ return if cop_config['AllowModifiersOnSymbols'] &&
86
+ access_modifier_with_symbol?(node)
67
87
 
68
88
  if offense?(node)
69
89
  add_offense(node, location: :selector) do
@@ -115,7 +115,7 @@ module RuboCop
115
115
  lambda do |corrector|
116
116
  new, old = *send_node.arguments
117
117
  replacement = "alias #{identifier(new)} #{identifier(old)}"
118
- corrector.replace(send_node.source_range, replacement)
118
+ corrector.replace(send_node, replacement)
119
119
  end
120
120
  end
121
121
 
@@ -125,15 +125,15 @@ module RuboCop
125
125
  'alias_method ' \
126
126
  ":#{identifier(node.new_identifier)}, " \
127
127
  ":#{identifier(node.old_identifier)}"
128
- corrector.replace(node.source_range, replacement)
128
+ corrector.replace(node, replacement)
129
129
  end
130
130
  end
131
131
 
132
132
  def correct_alias_with_symbol_args(node)
133
133
  lambda do |corrector|
134
- corrector.replace(node.new_identifier.source_range,
134
+ corrector.replace(node.new_identifier,
135
135
  node.new_identifier.source[1..-1])
136
- corrector.replace(node.old_identifier.source_range,
136
+ corrector.replace(node.old_identifier,
137
137
  node.old_identifier.source[1..-1])
138
138
  end
139
139
  end
@@ -97,12 +97,12 @@ module RuboCop
97
97
  return unless correctable_send?(node)
98
98
 
99
99
  corrector.replace(whitespace_before_arg(node), '(')
100
- corrector.insert_after(node.last_argument.source_range, ')')
100
+ corrector.insert_after(node.last_argument, ')')
101
101
  end
102
102
 
103
103
  def correct_setter(node, corrector)
104
- corrector.insert_before(node.receiver.source_range, '(')
105
- corrector.insert_after(node.last_argument.source_range, ')')
104
+ corrector.insert_before(node.receiver, '(')
105
+ corrector.insert_after(node.last_argument, ')')
106
106
  end
107
107
 
108
108
  # ! is a special case:
@@ -124,8 +124,7 @@ module RuboCop
124
124
  def correct_other(node, corrector)
125
125
  return if node.source_range.begin.is?('(')
126
126
 
127
- corrector.insert_before(node.source_range, '(')
128
- corrector.insert_after(node.source_range, ')')
127
+ corrector.wrap(node, '(', ')')
129
128
  end
130
129
 
131
130
  def correctable_send?(node)
@@ -137,7 +136,7 @@ module RuboCop
137
136
  end_paren = begin_paren
138
137
  # Increment position of parenthesis, unless message is a predicate
139
138
  # method followed by a non-whitespace char (e.g. is_a?String).
140
- end_paren += 1 unless node.source =~ /\?\S/
139
+ end_paren += 1 unless /\?\S/.match?(node.source)
141
140
  range_between(begin_paren, end_paren)
142
141
  end
143
142
  end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  array, join_arg = join_candidate?(node).map(&:source)
31
31
 
32
32
  lambda do |corrector|
33
- corrector.replace(node.source_range, "#{array}.join(#{join_arg})")
33
+ corrector.replace(node, "#{array}.join(#{join_arg})")
34
34
  end
35
35
  end
36
36
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
3
4
  module RuboCop
4
5
  module Cop
5
6
  module Style
@@ -106,12 +107,41 @@ module RuboCop
106
107
  # word.flip.flop
107
108
  # }
108
109
  #
110
+ # @example BracesRequiredMethods: ['sig']
111
+ #
112
+ # # Methods listed in the BracesRequiredMethods list, such as 'sig'
113
+ # # in this example, will require `{...}` braces. This option takes
114
+ # # precedence over all other configurations except IgnoredMethods.
115
+ #
116
+ # # bad
117
+ # sig do
118
+ # params(
119
+ # foo: string,
120
+ # ).void
121
+ # end
122
+ # def bar(foo)
123
+ # puts foo
124
+ # end
125
+ #
126
+ # # good
127
+ # sig {
128
+ # params(
129
+ # foo: string,
130
+ # ).void
131
+ # }
132
+ # def bar(foo)
133
+ # puts foo
134
+ # end
135
+ #
109
136
  class BlockDelimiters < Cop
110
137
  include ConfigurableEnforcedStyle
111
138
  include IgnoredMethods
112
139
 
113
140
  ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
114
141
 
142
+ BRACES_REQUIRED_MESSAGE = 'Brace delimiters `{...}` required for ' \
143
+ "'%<method_name>s' method."
144
+
115
145
  def on_send(node)
116
146
  return unless node.arguments?
117
147
  return if node.parenthesized?
@@ -175,7 +205,15 @@ module RuboCop
175
205
  end
176
206
  end
177
207
 
208
+ def braces_required_message(node)
209
+ format(BRACES_REQUIRED_MESSAGE, method_name: node.method_name.to_s)
210
+ end
211
+
178
212
  def message(node)
213
+ if braces_required_method?(node.method_name)
214
+ return braces_required_message(node)
215
+ end
216
+
179
217
  case style
180
218
  when :line_count_based then line_count_based_message(node)
181
219
  when :semantic then semantic_message(node)
@@ -238,7 +276,9 @@ module RuboCop
238
276
  # rubocop:enable Metrics/CyclomaticComplexity
239
277
 
240
278
  def proper_block_style?(node)
241
- return true if ignored_method?(node.method_name)
279
+ if special_method?(node.method_name)
280
+ return special_method_proper_block_style?(node)
281
+ end
242
282
 
243
283
  case style
244
284
  when :line_count_based then line_count_based_block_style?(node)
@@ -248,6 +288,24 @@ module RuboCop
248
288
  end
249
289
  end
250
290
 
291
+ def special_method?(method_name)
292
+ ignored_method?(method_name) || braces_required_method?(method_name)
293
+ end
294
+
295
+ def special_method_proper_block_style?(node)
296
+ method_name = node.method_name
297
+ return true if ignored_method?(method_name)
298
+ return node.braces? if braces_required_method?(method_name)
299
+ end
300
+
301
+ def braces_required_method?(method_name)
302
+ braces_required_methods.include?(method_name.to_s)
303
+ end
304
+
305
+ def braces_required_methods
306
+ cop_config.fetch('BracesRequiredMethods', [])
307
+ end
308
+
251
309
  def line_count_based_block_style?(node)
252
310
  node.multiline? ^ node.braces?
253
311
  end
@@ -329,3 +387,4 @@ module RuboCop
329
387
  end
330
388
  end
331
389
  end
390
+ # rubocop:enable Metrics/ClassLength
@@ -16,14 +16,37 @@ module RuboCop
16
16
  # (1..100).include?(7)
17
17
  # some_string =~ /something/
18
18
  #
19
+ # @example AllowOnConstant
20
+ # # Style/CaseEquality:
21
+ # # AllowOnConstant: true
22
+ #
23
+ # # bad
24
+ # (1..100) === 7
25
+ # /something/ === some_string
26
+ #
27
+ # # good
28
+ # Array === something
29
+ # (1..100).include?(7)
30
+ # some_string =~ /something/
31
+ #
19
32
  class CaseEquality < Cop
20
33
  MSG = 'Avoid the use of the case equality operator `===`.'
21
34
 
22
- def_node_matcher :case_equality?, '(send _ :=== _)'
35
+ def_node_matcher :case_equality?, '(send #const? :=== _)'
23
36
 
24
37
  def on_send(node)
25
38
  case_equality?(node) { add_offense(node, location: :selector) }
26
39
  end
40
+
41
+ private
42
+
43
+ def const?(node)
44
+ if cop_config.fetch('AllowOnConstant', false)
45
+ !node.const_type?
46
+ else
47
+ true
48
+ end
49
+ end
27
50
  end
28
51
  end
29
52
  end
@@ -33,9 +33,9 @@ module RuboCop
33
33
  # special character like \n
34
34
  # or ' which needs to use "" or be escaped.
35
35
  if string.length == 2 || string == "'"
36
- corrector.replace(node.source_range, %("#{string}"))
36
+ corrector.replace(node, %("#{string}"))
37
37
  elsif string.length == 1 # normal character
38
- corrector.replace(node.source_range, "'#{string}'")
38
+ corrector.replace(node, "'#{string}'")
39
39
  end
40
40
  end
41
41
  end
@@ -27,6 +27,7 @@ module RuboCop
27
27
  # items.inject
28
28
  # items.detect
29
29
  # items.find_all
30
+ # items.member?
30
31
  #
31
32
  # # good
32
33
  # items.map
@@ -34,6 +35,7 @@ module RuboCop
34
35
  # items.reduce
35
36
  # items.find
36
37
  # items.select
38
+ # items.include?
37
39
  #
38
40
  class CollectionMethods < Cop
39
41
  include MethodPreference
@@ -458,7 +458,7 @@ module RuboCop
458
458
  def correct_if_branches(corrector, cop, node)
459
459
  if_branch, elsif_branches, else_branch = extract_tail_branches(node)
460
460
 
461
- corrector.insert_before(node.source_range, lhs(if_branch))
461
+ corrector.insert_before(node, lhs(if_branch))
462
462
  replace_branch_assignment(corrector, if_branch)
463
463
  correct_branches(corrector, elsif_branches)
464
464
  replace_branch_assignment(corrector, else_branch)
@@ -475,13 +475,13 @@ module RuboCop
475
475
  source
476
476
  end
477
477
 
478
- corrector.replace(branch.source_range, replacement)
478
+ corrector.replace(branch, replacement)
479
479
  end
480
480
 
481
481
  def correct_branches(corrector, branches)
482
482
  branches.each do |branch|
483
483
  *_, assignment = *branch
484
- corrector.replace(branch.source_range, assignment.source)
484
+ corrector.replace(branch, assignment.source)
485
485
  end
486
486
  end
487
487
  end
@@ -494,7 +494,7 @@ module RuboCop
494
494
 
495
495
  def correct(node)
496
496
  lambda do |corrector|
497
- corrector.replace(node.source_range, correction(node))
497
+ corrector.replace(node, correction(node))
498
498
  end
499
499
  end
500
500
 
@@ -547,7 +547,7 @@ module RuboCop
547
547
  end
548
548
 
549
549
  def move_branch_inside_condition(corrector, branch, assignment)
550
- corrector.insert_before(branch.loc.expression, assignment.source)
550
+ corrector.insert_before(branch, assignment.source)
551
551
  end
552
552
  end
553
553
  end
@@ -589,7 +589,7 @@ module RuboCop
589
589
  def move_branch_inside_condition(corrector, branch, condition,
590
590
  assignment, column)
591
591
  branch_assignment = tail(branch)
592
- corrector.insert_before(branch_assignment.loc.expression,
592
+ corrector.insert_before(branch_assignment,
593
593
  assignment.source)
594
594
 
595
595
  remove_whitespace_in_branches(corrector, branch, condition, column)
@@ -611,7 +611,7 @@ module RuboCop
611
611
  when_branches, else_branch = extract_tail_branches(node)
612
612
 
613
613
  lambda do |corrector|
614
- corrector.insert_before(node.source_range, lhs(else_branch))
614
+ corrector.insert_before(node, lhs(else_branch))
615
615
  correct_branches(corrector, when_branches)
616
616
  replace_branch_assignment(corrector, else_branch)
617
617
 
@@ -652,7 +652,7 @@ module RuboCop
652
652
  def move_branch_inside_condition(corrector, branch, condition,
653
653
  assignment, column)
654
654
  branch_assignment = tail(branch)
655
- corrector.insert_before(branch_assignment.loc.expression,
655
+ corrector.insert_before(branch_assignment,
656
656
  assignment.source)
657
657
 
658
658
  remove_whitespace_in_branches(corrector, branch, condition, column)
@@ -55,7 +55,7 @@ module RuboCop
55
55
  raise Warning, AUTOCORRECT_EMPTY_WARNING if autocorrect_notice.empty?
56
56
 
57
57
  regex = Regexp.new(notice)
58
- return if autocorrect_notice =~ regex
58
+ return if autocorrect_notice&.match?(regex)
59
59
 
60
60
  raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must " \
61
61
  "match Notice /#{notice}/"
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  def autocorrect(node)
35
35
  lambda do |corrector|
36
- corrector.replace(node.source_range, '__dir__')
36
+ corrector.replace(node, '__dir__')
37
37
  end
38
38
  end
39
39
 
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Lint/RedundantCopDisableDirective
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Style
8
+ # Detects comments to enable/disable RuboCop.
9
+ # This is useful if want to make sure that every RuboCop error gets fixed
10
+ # and not quickly disabled with a comment.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # # rubocop:disable Metrics/AbcSize
15
+ # def f
16
+ # end
17
+ # # rubocop:enable Metrics/AbcSize
18
+ #
19
+ # # good
20
+ # def fixed_method_name_and_no_rubocop_comments
21
+ # end
22
+ #
23
+ class DisableCopsWithinSourceCodeDirective < Cop
24
+ # rubocop:enable Lint/RedundantCopDisableDirective
25
+ MSG = 'Comment to disable/enable RuboCop.'
26
+
27
+ def investigate(processed_source)
28
+ processed_source.comments.each do |comment|
29
+ next unless rubocop_directive_comment?(comment)
30
+
31
+ add_offense(comment)
32
+ end
33
+ end
34
+
35
+ def autocorrect(comment)
36
+ lambda do |corrector|
37
+ corrector.replace(comment, '')
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def rubocop_directive_comment?(comment)
44
+ comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end