mirror of
https://github.com/jimeh/time_ext.git
synced 2026-02-19 13:26:39 +00:00
added include_end option to #iterate
This commit is contained in:
@@ -4,7 +4,7 @@ module TimeExt
|
|||||||
|
|
||||||
# Used by #each, #map_each and similar methods to iterate over ranges of time.
|
# Used by #each, #map_each and similar methods to iterate over ranges of time.
|
||||||
def iterate(unit, options = {}, &block)
|
def iterate(unit, options = {}, &block)
|
||||||
options.reverse_merge!(:map_result => false, :beginning_of => false, :include_start => false)
|
options.reverse_merge!(:map_result => false, :beginning_of => false, :include_start => false, :include_end => true)
|
||||||
if block_given?
|
if block_given?
|
||||||
units = [:year, :month, :day, :hour, :min, :sec, :usec]
|
units = [:year, :month, :day, :hour, :min, :sec, :usec]
|
||||||
parent_unit = units[units.index(unit)-1]
|
parent_unit = units[units.index(unit)-1]
|
||||||
@@ -13,14 +13,14 @@ module TimeExt
|
|||||||
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
||||||
else
|
else
|
||||||
time = self.beginning_of(@of_the)
|
time = self.beginning_of(@of_the)
|
||||||
@until = self.end_of(@of_the)
|
@until = self.next(@of_the).beginning_of(@of_the)
|
||||||
options.merge!(:beginning_of => true, :include_start => true)
|
options.merge!(:beginning_of => true, :include_start => true, :include_end => false)
|
||||||
end
|
end
|
||||||
direction = (self < @until) ? :f : :b
|
direction = (self < @until) ? :f : :b
|
||||||
succ_method = (direction == :f) ? "next_#{unit}" : "prev_#{unit}"
|
succ_method = (direction == :f) ? "next_#{unit}" : "prev_#{unit}"
|
||||||
time = time.beginning_of(unit) if options[:beginning_of]
|
time = time.beginning_of(unit) if options[:beginning_of]
|
||||||
time = time.send(succ_method) if !options[:include_start]
|
time = time.send(succ_method) if !options[:include_start]
|
||||||
@until = @until.prev(unit).end_of(unit) if options[:include_start] && @of_the.nil?
|
@until = @until.prev(unit).end_of(unit) if !options[:include_end]
|
||||||
results = []
|
results = []
|
||||||
while (direction == :f && time <= @until) || (direction == :b && time >= @until)
|
while (direction == :f && time <= @until) || (direction == :b && time >= @until)
|
||||||
options[:map_result] ? results << yield(time) : yield(time)
|
options[:map_result] ? results << yield(time) : yield(time)
|
||||||
|
|||||||
@@ -72,13 +72,22 @@ describe "Time Iterations" do
|
|||||||
match = (0..23).map { |i| ((@now - (@now.hour).hours) + i.hours).beginning_of_hour }
|
match = (0..23).map { |i| ((@now - (@now.hour).hours) + i.hours).beginning_of_hour }
|
||||||
@now.map_each_hour.of_the(:day) { |time| time }.should == match
|
@now.map_each_hour.of_the(:day) { |time| time }.should == match
|
||||||
@now.map_each_hour.of_the_day { |time| time }.should == match
|
@now.map_each_hour.of_the_day { |time| time }.should == match
|
||||||
match = @now.beginning_of_month.map_beginning_of_each_hour(:include_start => true).until(@now.next_month.beginning_of_month) { |time| time }
|
match = @now.beginning_of_month.map_beginning_of_each_hour(:include_start => true, :include_end => false).until(@now.next_month.beginning_of_month) { |time| time }
|
||||||
@now.map_each_hour.of_the(:month) { |time| time }.should == match
|
@now.map_each_hour.of_the(:month) { |time| time }.should == match
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should iterate and respect the include_start option" do
|
it "should iterate and respect the include_start and include_end options" do
|
||||||
match = (0..5).map { |i| @now + i.hours }
|
match = (1..6).map { |i| @now + i.hours }
|
||||||
|
@now.map_each_hour.until(@now + 6.hours) { |time| time }.should == match
|
||||||
|
match = (1..6).map { |i| @now + i.hours }
|
||||||
|
@now.map_each_hour(:include_end => true).until(@now + 6.hours) { |time| time }.should == match
|
||||||
|
@now.map_each_hour(:include_start => false).until(@now + 6.hours) { |time| time }.should == match
|
||||||
|
match = (0..6).map { |i| @now + i.hours }
|
||||||
@now.map_each_hour(:include_start => true).until(@now + 6.hours) { |time| time }.should == match
|
@now.map_each_hour(:include_start => true).until(@now + 6.hours) { |time| time }.should == match
|
||||||
|
match = (0..5).map { |i| @now + i.hours }
|
||||||
|
@now.map_each_hour(:include_start => true, :include_end => false).until(@now + 6.hours) { |time| time }.should == match
|
||||||
|
match = (0..6).map { |i| @now + i.hours }
|
||||||
|
@now.map_each_hour(:include_start => true, :include_end => true).until(@now + 6.hours) { |time| time }.should == match
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should iterate and respect the beginning_of option" do
|
it "should iterate and respect the beginning_of option" do
|
||||||
|
|||||||
Reference in New Issue
Block a user