diff --git a/index.html b/index.html new file mode 100644 index 0000000..061ed90 --- /dev/null +++ b/index.html @@ -0,0 +1,97 @@ + + +
+ +time_ext.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+ require 'rubygems'
+require 'active_support'
+require 'time_ext/version' |
+
|
+
+ ¶
+
+ Calculation methods such as |
+
+ require 'time_ext/calculations' |
+
|
+
+ ¶
+
+ Iteration methods allowing the use of |
+
+ require 'time_ext/iterations' |
+
|
+
+ ¶
+
+ Core extention of Time class to load in Calculation and +Iteration modules. + |
+
+ require 'time_ext/core_ext/time' |
+
|
+
+ ¶
+
+ Core extention of Numeric class to set a couple of required aliases. + + |
+
+ require 'time_ext/core_ext/numeric' |
+
ext.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+
+ |
+
|
+
+ ¶
+
+ Enable use by: + +
+
+In addition to the default: + +
+
+ |
+
+ require 'time_ext' |
+
time_ext.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+ require 'rubygems'
+require 'active_support'
+require 'time_ext/version' |
+
|
+
+ ¶
+
+ Calculation methods such as |
+
+ require 'time_ext/calculations' |
+
|
+
+ ¶
+
+ Iteration methods allowing the use of |
+
+ require 'time_ext/iterations' |
+
|
+
+ ¶
+
+ Core extention of Time class to load in Calculation and +Iteration modules. + |
+
+ require 'time_ext/core_ext/time' |
+
|
+
+ ¶
+
+ Core extention of Numeric class to set a couple of required aliases. + + |
+
+ require 'time_ext/core_ext/numeric' |
+
calculations.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+ module TimeExt |
+
|
+
+ ¶
+
+ Adds an even greater extent of calculation methods on top of those already +provided by ActiveSupport. + |
+
+ module Calculations
+ |
+
|
+
+ ¶
+
+ Public Methods+ |
+
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the unit specified (second +by default). + |
+
+ def floor(unit = :sec)
+ self.send("beginning_of_#{unit}")
+ end
+ alias :beginning_of :floor
+ alias :at_beginning_of :floor
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the next unit specified (second by default). + |
+
+ def ceil(unit = :sec)
+ self.send("next_#{unit}").send("beginning_of_#{unit}")
+ end
+ alias :beginning_of_next :ceil
+ alias :at_beginning_of_next :ceil
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the current or next unit +specified (second by default) depending which is closest + |
+
+ def round(unit = :sec)
+ next_unit = self.ceil(unit)
+ this_unit = self.floor(unit)
+ (self - this_unit) < (next_unit - self) ? this_unit : next_unit
+ end
+ alias :beginning_of_closest :round
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the previoius unit specified (defaults +to second). + |
+
+ def prev(unit = :sec)
+ send("prev_#{unit}")
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the next unit specified (defaults to +second). + |
+
+ def next(unit = :sec)
+ send("next_#{unit}")
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for seconds_ago(1). + |
+
+ def prev_second
+ seconds_ago(1)
+ end
+ alias :prev_sec :prev_second
+ |
+
|
+
+ ¶
+
+ Short-hand for seconds_since(1). + |
+
+ def next_second
+ seconds_since(1)
+ end
+ alias :next_sec :next_second
+ |
+
|
+
+ ¶
+
+ Short-hand for minutes_ago(1). + |
+
+ def prev_minute
+ minutes_ago(1)
+ end
+ alias :prev_min :prev_minute
+ |
+
|
+
+ ¶
+
+ Short-hand for minutes_since(1). + |
+
+ def next_minute
+ minutes_since(1)
+ end
+ alias :next_min :next_minute
+ |
+
|
+
+ ¶
+
+ Short-hand for hours_ago(1). + |
+
+ def prev_hour
+ hours_ago(1)
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for hours_since(1). + |
+
+ def next_hour
+ hours_since(1)
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for days_ago(1). + |
+
+ def prev_day
+ days_ago(1)
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for days_since(1). + |
+
+ def next_day
+ days_since(1)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the given day in the +previous week (default is Monday). + |
+
+ def prev_week(day = :monday)
+ weeks_ago(1).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for quarters_since(1).beginning_of_quarter. + |
+
+ def next_quarter
+ quarters_since(1).beginning_of_quarter
+ end
+ |
+
|
+
+ ¶
+
+ Short-hand for quarters_ago(1).beginning_of_quarter. + |
+
+ def prev_quarter
+ quarters_ago(1).beginning_of_quarter
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified minutes +ago. + |
+
+ def minutes_ago(minutes)
+ ago(minutes.minutes)
+ end
+ alias :mins_ago :minutes_ago
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified minutes +in the future. + |
+
+ def minutes_since(minutes)
+ since(minutes.minutes)
+ end
+ alias :mins_since :minutes_since
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified hours +ago. + |
+
+ def hours_ago(hours)
+ ago(hours.hours)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified hours in +the future. + |
+
+ def hours_since(hours)
+ since(hours.hours)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified days ago. + |
+
+ def days_ago(days)
+ ago(days.days)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified days in +the future. + |
+
+ def days_since(days)
+ since(days.days)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified weeks +ago. + |
+
+ def weeks_ago(weeks)
+ ago(weeks.weeks)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified weeks in +the future. + |
+
+ def weeks_since(weeks)
+ since(weeks.weeks)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified quarters +(3 months) ago. + |
+
+ def quarters_ago(quarters)
+ ago((quarters * 3).months)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the time a number of specified quarters +(3 months) in the future. + |
+
+ def quarters_since(quarters)
+ since((quarters * 3).months)
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the end of the unit specified (defaults +to second). + |
+
+ def end_of(unit = :sec)
+ send("end_of_#{unit}")
+ end
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the second, XX:XX:XX.000000 +(.000000000 in ruby1.9). + |
+
+ def beginning_of_second
+ change(:usec => 0)
+ end
+ alias :beginning_of_sec :beginning_of_second
+ alias :at_beginning_of_sec :beginning_of_second
+ alias :at_beginning_of_second :beginning_of_second
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the end of the second, XX:XX:XX.999999 +(.999999999 in ruby1.9). + |
+
+ def end_of_second
+ change(:usec => 999999.999)
+ end
+ alias :end_of_sec :end_of_second
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the minute (XX:XX:00). + |
+
+ def beginning_of_minute
+ change(:sec => 0, :usec => 0)
+ end
+ alias :beginning_of_min :beginning_of_minute
+ alias :at_beginning_of_min :beginning_of_minute
+ alias :at_beginning_of_minute :beginning_of_minute
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the end of the hour, XX:XX:59.999999 (.999999999 in ruby1.9). + |
+
+ def end_of_minute
+ change(:sec => 59, :usec => 999999.999)
+ end
+ alias :end_of_min :end_of_minute
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the start of the hour (XX:00:00). + |
+
+ def beginning_of_hour
+ change(:min => 0, :sec => 0, :usec => 0)
+ end
+ alias :at_beginning_of_hour :beginning_of_hour
+ |
+
|
+
+ ¶
+
+ Returns a new Time representing the end of the hour, XX:59:59.999999 +(.999999999 in ruby1.9). + |
+
+ def end_of_hour
+ change(:min => 59, :sec => 59, :usec => 999999.999)
+ end
+
+ private
+ |
+
|
+
+ ¶
+
+ Private Helper Methods+ |
+
+ |
+
|
+
+ ¶
+
+ Definitive list of days in the week. + |
+
+ 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
+ |
+
|
+
+ ¶
+
+ Definitive list of days for each month of the year. + + |
+
+ 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 |
+
numeric.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+
+ |
+
|
+
+ ¶
+
+ Support both Active Support 2.x and 3.x, and also addresses rare loading +issue. + + |
+
+ require 'active_support/core_ext/numeric/time' unless Numeric.new.respond_to?(:seconds)
+
+class Numeric
+ alias :sec :seconds
+ alias :min :minutes
+end |
+
time.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+
+ |
+
|
+
+ ¶
+
+ Support both Active Support 2.x and 3.x, and also address rare loading +issue. + |
+
+ require 'active_support/time' unless Time.respond_to?(:days_in_month)
+require 'active_support/core_ext/time/calculations' unless Time.new.respond_to?(:ago)
+
+class Time |
+
|
+
+ ¶
+
+ Include TimeExt modules into Time object. + |
+
+ include TimeExt::Calculations
+ include TimeExt::Iterations
+ |
+
|
+
+ ¶
+
+ Aliases to keep available method names to a standard pattern. + + |
+
+ alias :secs_ago :ago
+ alias :seconds_ago :ago
+ alias :secs_since :since
+ alias :seconds_since :since
+end |
+
iterations.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+ |
+
+ module TimeExt |
+
|
+
+ ¶
+
+ Allows you to iterate over Time objects with |
+
+ module Iterations |
+
|
+
+ ¶
+
+ Iterator Methods+ |
+
+ |
+
|
+
+ ¶
+
+ Executes passed block for each |
+
+ def each(unit, options = {}, &block)
+ iterate(unit, options.merge(:map_result => false), &block)
+ end
+ |
+
|
+
+ ¶
+
+ Executes passed block for each |
+
+ def beginning_of_each(unit, options = {}, &block)
+ iterate(unit, options.merge(:map_result => false, :beginning_of => true), &block)
+ end
+ |
+
|
+
+ ¶
+
+ Executes passed block for each |
+
+ def map_each(unit, options = {}, &block)
+ iterate(unit, options.merge(:map_result => true), &block)
+ end
+ |
+
|
+
+ ¶
+
+ Executes passed block for each |
+
+ def map_beginning_of_each(unit, options = {}, &block)
+ iterate(unit, options.merge(:map_result => true, :beginning_of => true), &block)
+ end
+ |
+
|
+
+ ¶
+
+ Limiter Methods+ +Usually chained with an iterator method to specify at which point +in time the iterator should stop. + |
+
+ |
+
|
+
+ ¶
+
+ Used togeter with |
+
+ def until(time, &block)
+ time = time.to_time if time.is_a?(::Date)
+ @until = time
+ return call_chain(block) if block_given?
+ self
+ end
+ alias :till :until
+ |
+
|
+
+ ¶
+
+ Used together with |
+
+ def from(time, &block)
+ time = time.to_time if time.is_a?(::Date)
+ method, args = @method_chain.pop if block_given?
+ if !method.nil?
+ time.until(self).send(method, *args, &block)
+ else
+ time.until(self)
+ end
+ end
+ |
+
|
+
+ ¶
+
+ Let’s you iterate over every unit specified in the |
+
+ def of_the(unit, &block)
+ @of_the = unit
+ return call_chain(block) if block_given?
+ self
+ end
+ alias :of :of_the
+ |
+
|
+
+ ¶
+
+ Shorthand Methods+ |
+
+ |
+
|
+
+ ¶
+
+ Dynamically define convenience methods, like |
+
+ [:year, :month, :day, :hour, :min, :sec].each do |unit|
+ [:each, :beginning_of_each, :map_each, :map_beginning_of_each].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
+ [: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
+
+ private
+ |
+
|
+
+ ¶
+
+ Private Helper Methods+ |
+
+ |
+
|
+
+ ¶
+
+ Default options for |
+
+ def default_options
+ { :map_result => false,
+ :beginning_of => false,
+ :end_of => false,
+ :include_start => false,
+ :include_end => true }
+ end
+ |
+
|
+
+ ¶
+
+ Used by |
+
+ def iterate(unit, opts = {}, &block)
+ options = default_options.merge(opts)
+ |
+
|
+
+ ¶
+
+ Perform the grunt work of iteration. + |
+
+ if block_given?
+ units = [:year, :month, :day, :hour, :min, :sec, :usec]
+ parent_unit = units[units.index(unit)-1]
+ if @of_the.nil?
+ 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
+ succ_method = (direction == :f) ? "next_#{unit}" : "prev_#{unit}"
+ time = time.beginning_of(unit) if options[:beginning_of]
+ time = time.send(succ_method) if !options[:include_start]
+ @until = @until.prev(unit).end_of(unit) if !options[:include_end]
+ results = []
+ while (direction == :f && time <= @until) || (direction == :b && time >= @until)
+ options[:map_result] ? results << yield(time) : yield(time)
+ time = time.send(succ_method)
+ end
+ options[:map_result] ? results : self
+ |
+
|
+
+ ¶
+
+ If a block is not given, add itself to the chain list to be +executed when the chain ends. + |
+
+ else
+ add_to_chain(:iterate, unit, options)
+ self
+ end
+ end
+ |
+
|
+
+ ¶
+
+ Enables chaining of iterator methods with + + |
+
+ 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 |
+
version.rb |
+ + |
|---|---|
|
+
+ ¶
+
+
+
+ |
+
+ module TimeExt
+ VERSION = "0.2.9"
+end |
+