class RuboCop::Cop::Style::NumericPredicate
This cop checks for usage of comparison operators (`==`, `>`, `<`) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.
The cop disregards `#nonzero?` as it its value is truthy or falsey, but not `true` and `false`, and thus not always interchangeable with `!= 0`.
The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves `Integer` polymorphic.
@example EnforcedStyle: predicate (default)
# bad foo == 0 0 > foo bar.baz > 0 # good foo.zero? foo.negative? bar.baz.positive?
@example EnforcedStyle: comparison
# bad foo.zero? foo.negative? bar.baz.positive? # good foo == 0 0 > foo bar.baz > 0
Constants
- MSG
- REPLACEMENTS
Public Instance Methods
autocorrect(node)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 71 def autocorrect(node) _, replacement = check(node) lambda do |corrector| corrector.replace(node.loc.expression, replacement) end end
on_send(node)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 56 def on_send(node) return if node.each_ancestor(:send, :block).any? do |ancestor| ignored_method?(ancestor.method_name) end numeric, replacement = check(node) return unless numeric add_offense(node, message: format(MSG, prefer: replacement, current: node.source)) end
Private Instance Methods
check(node)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 81 def check(node) numeric, operator = if style == :predicate comparison(node) || inverted_comparison(node, &invert) else predicate(node) end return unless numeric && operator [numeric, replacement(numeric, operator)] end
invert()
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 115 def invert lambda do |comparison, numeric| comparison = { :> => :<, :< => :> }[comparison] || comparison [numeric, comparison] end end
parenthesized_source(node)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 103 def parenthesized_source(node) if require_parentheses?(node) "(#{node.source})" else node.source end end
replacement(numeric, operation)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 94 def replacement(numeric, operation) if style == :predicate [parenthesized_source(numeric), REPLACEMENTS.invert[operation.to_s]].join('.') else [numeric.source, REPLACEMENTS[operation.to_s], 0].join(' ') end end
require_parentheses?(node)
click to toggle source
# File lib/rubocop/cop/style/numeric_predicate.rb, line 111 def require_parentheses?(node) node.send_type? && node.binary_operation? && !node.parenthesized? end