mirror of
https://github.com/jimeh/time_ext.git
synced 2026-02-19 13:26:39 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea6d87e35f | |||
| 74574beaf0 | |||
| ba33dfec57 | |||
| c9cd80fd9e | |||
| 06e167d1ab | |||
| ac1ad2dba4 | |||
| ab6e1e8003 | |||
| 3d2b5d0b9e | |||
| b8ba272b95 | |||
| 3201485eaf | |||
| 77d9d67ed1 |
@@ -1,8 +1,8 @@
|
|||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'active_support'
|
require 'active_support'
|
||||||
|
|
||||||
require 'time_ext/backwards_compatibility'
|
|
||||||
require 'time_ext/calculations'
|
require 'time_ext/calculations'
|
||||||
require 'time_ext/iterations'
|
require 'time_ext/iterations'
|
||||||
require 'time_ext/method_chain'
|
require 'time_ext/support'
|
||||||
require 'time_ext/core_ext/time'
|
require 'time_ext/core_ext/time'
|
||||||
|
require 'time_ext/core_ext/numeric'
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
module TimeExt
|
|
||||||
# Provides helper methods used by TimeExt::Calculations for backwards compatibility with ActiveSupport.
|
|
||||||
module BackwardsCompatibility
|
|
||||||
|
|
||||||
def days_into_week
|
|
||||||
defined?(DAYS_INTO_WEEK) ? DAYS_INTO_WEEK : { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6 }
|
|
||||||
end
|
|
||||||
|
|
||||||
def common_year_days_in_month
|
|
||||||
defined?(COMMON_YEAR_DAYS_IN_MONTH) ? COMMON_YEAR_DAYS_IN_MONTH : [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
4
lib/time_ext/core_ext/numeric.rb
Normal file
4
lib/time_ext/core_ext/numeric.rb
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class Numeric
|
||||||
|
alias :sec :seconds
|
||||||
|
alias :min :minutes
|
||||||
|
end
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
class Time
|
class Time
|
||||||
include TimeExt::MethodChain
|
include TimeExt::Support
|
||||||
include TimeExt::BackwardsCompatibility
|
|
||||||
include TimeExt::Calculations
|
include TimeExt::Calculations
|
||||||
include TimeExt::Iterations
|
include TimeExt::Iterations
|
||||||
|
|
||||||
|
|||||||
@@ -4,16 +4,23 @@ 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]
|
||||||
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
if @of_the.nil?
|
||||||
time = self.clone
|
time = self.clone
|
||||||
|
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
||||||
|
else
|
||||||
|
time = self.beginning_of(@of_the)
|
||||||
|
@until = self.next(@of_the).beginning_of(@of_the)
|
||||||
|
options.merge!(:beginning_of => true, :include_start => true, :include_end => false)
|
||||||
|
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_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)
|
||||||
@@ -46,6 +53,14 @@ module TimeExt
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Let's you iterate over every unit specified in the #each or #map call for the specified unit.
|
||||||
|
def of_the(unit, &block)
|
||||||
|
@of_the = unit
|
||||||
|
return call_chain(block) if block_given?
|
||||||
|
self
|
||||||
|
end
|
||||||
|
alias :of :of_the
|
||||||
|
|
||||||
# Executes passed block for each "unit" of time specified, with a new time object for each interval passed to the block.
|
# Executes passed block for each "unit" of time specified, with a new time object for each interval passed to the block.
|
||||||
def each(unit, options = {}, &block)
|
def each(unit, options = {}, &block)
|
||||||
iterate(unit, options.merge(:map_result => false), &block)
|
iterate(unit, options.merge(:map_result => false), &block)
|
||||||
@@ -76,6 +91,13 @@ module TimeExt
|
|||||||
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||||
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||||
end
|
end
|
||||||
|
[:of_the, :of].each do |method|
|
||||||
|
define_method "#{method}_#{unit}" do |*args, &block|
|
||||||
|
send(method, unit, *args, &block)
|
||||||
|
end
|
||||||
|
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||||
|
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
module TimeExt
|
|
||||||
# Allows iterators' #until and #from methods to chain back to the parent iteration method.
|
|
||||||
module MethodChain
|
|
||||||
|
|
||||||
def add_to_chain(method, *args, &block)
|
|
||||||
@method_chain ||= []
|
|
||||||
@method_chain << [method.to_sym, args, block]
|
|
||||||
end
|
|
||||||
|
|
||||||
def call_chain(custom_block = nil, &block)
|
|
||||||
method, args, iblock = @method_chain.pop
|
|
||||||
return nil if method.nil?
|
|
||||||
iblock = custom_block if !custom_block.nil?
|
|
||||||
method, args, iblock = yield(method, args, iblock) if block_given?
|
|
||||||
self.send(method, *args, &iblock)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
27
lib/time_ext/support.rb
Normal file
27
lib/time_ext/support.rb
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
module TimeExt
|
||||||
|
# Provides helper methods used by TimeExt::Calculations for backwards compatibility with ActiveSupport, and method chaining helpers for TimeExt::Iterations.
|
||||||
|
module Support
|
||||||
|
|
||||||
|
def days_into_week
|
||||||
|
defined?(DAYS_INTO_WEEK) ? DAYS_INTO_WEEK : { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6 }
|
||||||
|
end
|
||||||
|
|
||||||
|
def common_year_days_in_month
|
||||||
|
defined?(COMMON_YEAR_DAYS_IN_MONTH) ? COMMON_YEAR_DAYS_IN_MONTH : [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_to_chain(method, *args, &block)
|
||||||
|
@method_chain ||= []
|
||||||
|
@method_chain << [method.to_sym, args, block]
|
||||||
|
end
|
||||||
|
|
||||||
|
def call_chain(custom_block = nil, &block)
|
||||||
|
method, args, iblock = @method_chain.pop
|
||||||
|
return nil if method.nil?
|
||||||
|
iblock = custom_block if !custom_block.nil?
|
||||||
|
method, args, iblock = yield(method, args, iblock) if block_given?
|
||||||
|
self.send(method, *args, &iblock)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -68,4 +68,32 @@ describe "Time Iterations" do
|
|||||||
(@now + 6.hours).from(@now).map_each(:hour) { |time| time }.should == match
|
(@now + 6.hours).from(@now).map_each(:hour) { |time| time }.should == match
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
it "should iterate over time objects with #map_each and #of_the via method chaining" do
|
||||||
|
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
|
||||||
|
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
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should iterate and respect the include_start and include_end options" do
|
||||||
|
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
|
||||||
|
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
|
||||||
|
|
||||||
|
it "should iterate and respect the beginning_of option" do
|
||||||
|
match = (1..6).map { |i| @now.beginning_of_hour + i.hours }
|
||||||
|
@now.map_beginning_of_each_hour.until(@now.beginning_of_hour + 6.hours) { |time| time }.should == match
|
||||||
|
@now.map_each_hour(:beginning_of => true).until(@now.beginning_of_hour + 6.hours) { |time| time }.should == match
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user