Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,21 @@ | ||
class Range #:nodoc: | ||
module ActiveSupport | ||
module EachTimeWithZone #:nodoc: | ||
def each(&block) | ||
ensure_iteration_allowed | ||
super | ||
end | ||
|
||
def each_with_time_with_zone(&block) | ||
ensure_iteration_allowed | ||
each_without_time_with_zone(&block) | ||
end | ||
# TODO: change to Module#prepend as soon as the fix is backported to MRI 2.2: | ||
# https://bugs.ruby-lang.org/issues/10847 | ||
alias_method :each_without_time_with_zone, :each | ||
alias_method :each, :each_with_time_with_zone | ||
def step(n = 1, &block) | ||
ensure_iteration_allowed | ||
super | ||
end | ||
|
||
def step_with_time_with_zone(n = 1, &block) | ||
ensure_iteration_allowed | ||
step_without_time_with_zone(n, &block) | ||
end | ||
# TODO: change to Module#prepend as soon as the fix is backported to MRI 2.2: | ||
# https://bugs.ruby-lang.org/issues/10847 | ||
alias_method :step_without_time_with_zone, :step | ||
alias_method :step, :step_with_time_with_zone | ||
private | ||
|
||
private | ||
def ensure_iteration_allowed | ||
if first.is_a?(Time) | ||
raise TypeError, "can't iterate from #{first.class}" | ||
end | ||
def ensure_iteration_allowed | ||
raise TypeError, "can't iterate from #{first.class}" if first.is_a?(Time) | ||
end | ||
end | ||
end | ||
|
||
Range.prepend(ActiveSupport::EachTimeWithZone) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,23 @@ | ||
class Range | ||
# Extends the default Range#include? to support range comparisons. | ||
# (1..5).include?(1..5) # => true | ||
# (1..5).include?(2..3) # => true | ||
# (1..5).include?(2..6) # => false | ||
# | ||
# The native Range#include? behavior is untouched. | ||
# ('a'..'f').include?('c') # => true | ||
# (5..9).include?(11) # => false | ||
def include_with_range?(value) | ||
if value.is_a?(::Range) | ||
# 1...10 includes 1..9 but it does not include 1..10. | ||
operator = exclude_end? && !value.exclude_end? ? :< : :<= | ||
include_without_range?(value.first) && value.last.send(operator, last) | ||
else | ||
include_without_range?(value) | ||
module ActiveSupport | ||
module IncludeWithRange #:nodoc: | ||
# Extends the default Range#include? to support range comparisons. | ||
# (1..5).include?(1..5) # => true | ||
# (1..5).include?(2..3) # => true | ||
# (1..5).include?(2..6) # => false | ||
# | ||
# The native Range#include? behavior is untouched. | ||
# ('a'..'f').include?('c') # => true | ||
# (5..9).include?(11) # => false | ||
def include?(value) | ||
if value.is_a?(::Range) | ||
# 1...10 includes 1..9 but it does not include 1..10. | ||
operator = exclude_end? && !value.exclude_end? ? :< : :<= | ||
super(value.first) && value.last.send(operator, last) | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
albertosaurus
|
||
else | ||
super | ||
end | ||
end | ||
end | ||
# TODO: change to Module#prepend as soon as the fix is backported to MRI 2.2: | ||
# https://bugs.ruby-lang.org/issues/10847 | ||
alias_method :include_without_range?, :include? | ||
alias_method :include?, :include_with_range? | ||
end | ||
|
||
Range.prepend(ActiveSupport::IncludeWithRange) |
This logic breaks expressions like this:
Why not instead feed the start and end values of the passed range to
#include_without_range?
In the meantime, it's possible to workaround the breakage in my example by using
Float::MAX
instead: