lib/rubocop/cop/rspec/change_by_zero.rb in rubocop-rspec-2.20.0 vs lib/rubocop/cop/rspec/change_by_zero.rb in rubocop-rspec-2.21.0
- old
+ new
@@ -57,68 +57,82 @@
# .to not_change { Foo.bar }
# .and not_change { Foo.baz }
#
class ChangeByZero < Base
extend AutoCorrector
- MSG = 'Prefer `not_to change` over `to change.by(0)`.'
+ MSG = 'Prefer `not_to change` over `to %<method>s.by(0)`.'
MSG_COMPOUND = 'Prefer %<preferred>s with compound expectations ' \
- 'over `change.by(0)`.'
- RESTRICT_ON_SEND = %i[change].freeze
+ 'over `%<method>s.by(0)`.'
+ CHANGE_METHODS = Set[:change, :a_block_changing, :changing].freeze
+ RESTRICT_ON_SEND = CHANGE_METHODS.freeze
# @!method expect_change_with_arguments(node)
def_node_matcher :expect_change_with_arguments, <<-PATTERN
(send
- (send nil? :change ...) :by
+ $(send nil? CHANGE_METHODS ...) :by
(int 0))
PATTERN
# @!method expect_change_with_block(node)
def_node_matcher :expect_change_with_block, <<-PATTERN
(send
(block
- (send nil? :change)
+ $(send nil? CHANGE_METHODS)
(args)
- (send (...) $_)) :by
+ (send (...) _)) :by
(int 0))
PATTERN
# @!method change_nodes(node)
def_node_search :change_nodes, <<-PATTERN
- $(send nil? :change ...)
+ $(send nil? CHANGE_METHODS ...)
PATTERN
def on_send(node)
- expect_change_with_arguments(node.parent) do
- check_offense(node.parent)
+ expect_change_with_arguments(node.parent) do |change|
+ register_offense(node.parent, change)
end
- expect_change_with_block(node.parent.parent) do
- check_offense(node.parent.parent)
+ expect_change_with_block(node.parent.parent) do |change|
+ register_offense(node.parent.parent, change)
end
end
private
- def check_offense(node)
- expression = node.source_range
+ # rubocop:disable Metrics/MethodLength
+ def register_offense(node, change_node)
if compound_expectations?(node)
- add_offense(expression, message: message_compound) do |corrector|
+ add_offense(node.source_range,
+ message: message_compound(change_node)) do |corrector|
autocorrect_compound(corrector, node)
end
else
- add_offense(expression) do |corrector|
- autocorrect(corrector, node)
+ add_offense(node.source_range,
+ message: message(change_node)) do |corrector|
+ autocorrect(corrector, node, change_node)
end
end
end
+ # rubocop:enable Metrics/MethodLength
def compound_expectations?(node)
%i[and or & |].include?(node.parent.method_name)
end
- def autocorrect(corrector, node)
+ def message(change_node)
+ format(MSG, method: change_node.method_name)
+ end
+
+ def message_compound(change_node)
+ format(MSG_COMPOUND, preferred: preferred_method,
+ method: change_node.method_name)
+ end
+
+ def autocorrect(corrector, node, change_node)
corrector.replace(node.parent.loc.selector, 'not_to')
+ corrector.replace(change_node.loc.selector, 'change')
range = node.loc.dot.with(end_pos: node.source_range.end_pos)
corrector.remove(range)
end
def autocorrect_compound(corrector, node)
@@ -131,13 +145,9 @@
end
end
def negated_matcher
cop_config['NegatedMatcher']
- end
-
- def message_compound
- format(MSG_COMPOUND, preferred: preferred_method)
end
def preferred_method
negated_matcher ? "`#{negated_matcher}`" : 'negated matchers'
end