From 4b0789a6a4e933a9186c18423365340ee994b7e3 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Fri, 6 May 2011 01:06:55 +0100 Subject: [PATCH] rebuild pages from 83655b4 --- index.html | 97 +++++ lib/time/ext.html | 66 ++++ lib/time_ext.html | 97 +++++ lib/time_ext/calculations.html | 616 +++++++++++++++++++++++++++++ lib/time_ext/core_ext/numeric.html | 64 +++ lib/time_ext/core_ext/time.html | 90 +++++ lib/time_ext/iterations.html | 364 +++++++++++++++++ lib/time_ext/version.html | 49 +++ 8 files changed, 1443 insertions(+) create mode 100644 index.html create mode 100644 lib/time/ext.html create mode 100644 lib/time_ext.html create mode 100644 lib/time_ext/calculations.html create mode 100644 lib/time_ext/core_ext/numeric.html create mode 100644 lib/time_ext/core_ext/time.html create mode 100644 lib/time_ext/iterations.html create mode 100644 lib/time_ext/version.html 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 + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

time_ext.rb

+
+ +
+ +
+
require 'rubygems'
+require 'active_support'
+require 'time_ext/version'
+
+
+ +
+

Calculation methods such as #floor, #ceil, #round, +#prev_week and many more, adding on top of the defaults present in +ActiveSupport.

+
+
require 'time_ext/calculations'
+
+
+ +
+

Iteration methods allowing the use of #each, #map_each and more on +Time objects similar to how you loop over an Array of items.

+
+
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'
+
+
+ diff --git a/lib/time/ext.html b/lib/time/ext.html new file mode 100644 index 0000000..3b037df --- /dev/null +++ b/lib/time/ext.html @@ -0,0 +1,66 @@ + + + + + ext.rb + + + +
+
+ + + + + + + + + + + + + + + + + +

ext.rb

+
+ +
+ +
+
+
+
+ +
+

Enable use by:

+ +
require 'time/ext'
+
+ +

In addition to the default:

+ +
require 'time_ext'
+
+ +
+
require 'time_ext'
+
+
+ diff --git a/lib/time_ext.html b/lib/time_ext.html new file mode 100644 index 0000000..061ed90 --- /dev/null +++ b/lib/time_ext.html @@ -0,0 +1,97 @@ + + + + + time_ext.rb + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

time_ext.rb

+
+ +
+ +
+
require 'rubygems'
+require 'active_support'
+require 'time_ext/version'
+
+
+ +
+

Calculation methods such as #floor, #ceil, #round, +#prev_week and many more, adding on top of the defaults present in +ActiveSupport.

+
+
require 'time_ext/calculations'
+
+
+ +
+

Iteration methods allowing the use of #each, #map_each and more on +Time objects similar to how you loop over an Array of items.

+
+
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'
+
+
+ diff --git a/lib/time_ext/calculations.html b/lib/time_ext/calculations.html new file mode 100644 index 0000000..f699d86 --- /dev/null +++ b/lib/time_ext/calculations.html @@ -0,0 +1,616 @@ + + + + + calculations.rb + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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
+
+
+ diff --git a/lib/time_ext/core_ext/numeric.html b/lib/time_ext/core_ext/numeric.html new file mode 100644 index 0000000..18162ee --- /dev/null +++ b/lib/time_ext/core_ext/numeric.html @@ -0,0 +1,64 @@ + + + + + numeric.rb + + + +
+
+ + + + + + + + + + + + + + + + + +

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
+
+
+ diff --git a/lib/time_ext/core_ext/time.html b/lib/time_ext/core_ext/time.html new file mode 100644 index 0000000..f49a6ec --- /dev/null +++ b/lib/time_ext/core_ext/time.html @@ -0,0 +1,90 @@ + + + + + time.rb + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

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
+
+
+ diff --git a/lib/time_ext/iterations.html b/lib/time_ext/iterations.html new file mode 100644 index 0000000..fbddef9 --- /dev/null +++ b/lib/time_ext/iterations.html @@ -0,0 +1,364 @@ + + + + + iterations.rb + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

iterations.rb

+
+ +
+ +
+
module TimeExt
+
+
+ +
+

Allows you to iterate over Time objects with #each and other +methods almost as if it was an Array or Hash.

+
+
  module Iterations
+
+
+ +
+

Iterator Methods

+
+
    
+
+
+ +
+

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)
+      iterate(unit, options.merge(:map_result => false), &block)
+    end
+    
+
+
+ +
+

Executes passed block for each unit of time specified, with +a new time object set to the beginning of unit for each +interval passed to the block.

+
+
    def beginning_of_each(unit, options = {}, &block)
+      iterate(unit, options.merge(:map_result => false, :beginning_of => true), &block)
+    end
+    
+
+
+ +
+

Executes passed block for each unit of time specified, +returning an array with the return values from the passed block.

+
+
    def map_each(unit, options = {}, &block)
+      iterate(unit, options.merge(:map_result => true), &block)
+    end
+    
+
+
+ +
+

Executes passed block for each unit of time specified, +returning an array with the return values from passed block. +Additionally the time object passed into the block is set to +the beginning of specified unit.

+
+
    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 #each and other iteration methods to specify +end of interation.

+
+
    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 #each and other interation methods to specify +start of iteration, and end will be current object.

+
+
    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 #each or +#map_each 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
+    
+
+
+ +
+

Shorthand Methods

+
+
    
+
+
+ +
+

Dynamically define convenience methods, like #each_hour as a +shorthand for #each(:hour).

+
+
    [: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 #iterate.

+
+
    def default_options
+      { :map_result    => false,
+        :beginning_of  => false,
+        :end_of        => false,
+        :include_start => false,
+        :include_end   => true }
+    end
+    
+
+
+ +
+

Used by #each, #map_each and similar methods to iterate over +ranges of time.

+
+
    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
+
+
+ diff --git a/lib/time_ext/version.html b/lib/time_ext/version.html new file mode 100644 index 0000000..e3e4905 --- /dev/null +++ b/lib/time_ext/version.html @@ -0,0 +1,49 @@ + + + + + version.rb + + + +
+
+ + + + + + + + + + + + + +

version.rb

+
+ +
+ + +
+
module TimeExt
+  VERSION = "0.2.9"
+end
+
+
+