mirror of
https://github.com/jimeh/time_ext.git
synced 2026-02-19 13:26:39 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 53fed4fb33 | |||
| 0bef341111 | |||
| b29c232939 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -23,4 +23,4 @@ pkg/*
|
|||||||
|
|
||||||
## PROJECT::SPECIFIC
|
## PROJECT::SPECIFIC
|
||||||
.yardoc
|
.yardoc
|
||||||
docs/*
|
doc/*
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2011 Jim Myhrberg.
|
Copyright (c) 2010 Jim Myhrberg.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ I recommend you read the complete class [documentation][docs] for the Time objec
|
|||||||
|
|
||||||
## License and Copyright
|
## License and Copyright
|
||||||
|
|
||||||
Copyright (c) 2011 Jim Myhrberg.
|
Copyright (c) 2010 Jim Myhrberg.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|||||||
54
Rakefile
54
Rakefile
@@ -1,9 +1,6 @@
|
|||||||
require 'bundler'
|
require 'bundler'
|
||||||
Bundler::GemHelper.install_tasks
|
Bundler::GemHelper.install_tasks
|
||||||
|
|
||||||
require 'rake/testtask'
|
|
||||||
require 'rake/clean'
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Rspec
|
# Rspec
|
||||||
@@ -23,59 +20,18 @@ task :default => :spec
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Rocco
|
# Yard
|
||||||
#
|
#
|
||||||
|
|
||||||
begin
|
begin
|
||||||
require 'rocco/tasks'
|
require 'yard'
|
||||||
Rocco::make 'docs/'
|
YARD::Rake::YardocTask.new
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
warn "#$! -- rocco tasks not loaded."
|
task :yardoc do
|
||||||
task :rocco
|
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
||||||
end
|
|
||||||
|
|
||||||
desc 'Build rocco docs'
|
|
||||||
task :docs => :rocco
|
|
||||||
directory 'docs/'
|
|
||||||
|
|
||||||
desc 'Build docs and open in browser for the reading'
|
|
||||||
task :read => :docs do
|
|
||||||
sh 'open docs/lib/time_ext.html'
|
|
||||||
end
|
|
||||||
|
|
||||||
# Make index.html a copy of rocco.html
|
|
||||||
file 'docs/index.html' => 'docs/lib/time_ext.html' do |f|
|
|
||||||
cp 'docs/lib/time_ext.html', 'docs/index.html', :preserve => true
|
|
||||||
end
|
|
||||||
task :docs => 'docs/index.html'
|
|
||||||
CLEAN.include 'docs/index.html'
|
|
||||||
|
|
||||||
# Alias for docs task
|
|
||||||
task :doc => :docs
|
|
||||||
|
|
||||||
# GITHUB PAGES ===============================================================
|
|
||||||
|
|
||||||
desc 'Update gh-pages branch'
|
|
||||||
task :pages => ['docs/.git', :docs] do
|
|
||||||
rev = `git rev-parse --short HEAD`.strip
|
|
||||||
Dir.chdir 'docs' do
|
|
||||||
sh "git add *"
|
|
||||||
sh "git commit -m 'rebuild pages from #{rev}'" do |ok,res|
|
|
||||||
if ok
|
|
||||||
verbose { puts "gh-pages updated" }
|
|
||||||
sh "git push -q o HEAD:gh-pages"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Update the pages/ directory clone
|
|
||||||
file 'docs/.git' => ['docs/', '.git/refs/heads/gh-pages'] do |f|
|
|
||||||
sh "cd docs && git init -q && git remote add o ../.git" if !File.exist?(f.name)
|
|
||||||
sh "cd docs && git fetch -q o && git reset -q --hard o/gh-pages && touch ."
|
|
||||||
end
|
|
||||||
CLOBBER.include 'docs/.git'
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc.
|
# Misc.
|
||||||
|
|||||||
@@ -1,7 +1 @@
|
|||||||
# encoding: utf-8
|
require 'time_ext'
|
||||||
|
|
||||||
# Enable use by:
|
|
||||||
# require 'time/ext'
|
|
||||||
# In addition to the default:
|
|
||||||
# require 'time_ext'
|
|
||||||
require 'time_ext'
|
|
||||||
@@ -1,25 +1,7 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'active_support'
|
|
||||||
require 'time_ext/version'
|
|
||||||
|
|
||||||
# [Calculation][ca] methods such as `#floor`, `#ceil`, `#round`,
|
|
||||||
# `#prev_week` and many more, adding on top of the defaults present in
|
|
||||||
# ActiveSupport.
|
|
||||||
# [ca]: /time_ext/lib/time_ext/calculations.html
|
|
||||||
require 'time_ext/calculations'
|
require 'time_ext/calculations'
|
||||||
|
|
||||||
# [Iteration][it] methods allowing the use of `#each`, `#map_each` and more on
|
|
||||||
# Time objects similar to how you loop over an Array of items.
|
|
||||||
# [it]: /time_ext/lib/time_ext/iterations.html
|
|
||||||
require 'time_ext/iterations'
|
require 'time_ext/iterations'
|
||||||
|
require 'time_ext/support'
|
||||||
# Core extention of [Time][ti] class to load in [Calculation][ca] and
|
|
||||||
# [Iteration][it] modules.
|
|
||||||
# [ti]: /time_ext/lib/time_ext/core_ext/time.html
|
|
||||||
require 'time_ext/core_ext/time'
|
require 'time_ext/core_ext/time'
|
||||||
|
|
||||||
# Core extention of [Numeric][nu] class to set a couple of required aliases.
|
|
||||||
# [nu]: /time_ext/lib/time_ext/core_ext/numeric.html
|
|
||||||
require 'time_ext/core_ext/numeric'
|
require 'time_ext/core_ext/numeric'
|
||||||
|
|||||||
@@ -1,191 +1,169 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
module TimeExt
|
module TimeExt
|
||||||
# Adds an even greater extent of calculation methods on top of those already
|
# Adds an even greater extent of calculation methods on top of those already provided by ActiveSupport.
|
||||||
# provided by ActiveSupport.
|
|
||||||
module Calculations
|
module Calculations
|
||||||
|
|
||||||
#### Public Methods
|
# Returns a new Time representing the start of the unit specified (second by default).
|
||||||
|
|
||||||
# Returns a new Time representing the start of the unit specified (second
|
|
||||||
# by default).
|
|
||||||
def floor(unit = :sec)
|
def floor(unit = :sec)
|
||||||
self.send("beginning_of_#{unit}")
|
self.send("beginning_of_#{unit}")
|
||||||
end
|
end
|
||||||
alias :beginning_of :floor
|
alias :beginning_of :floor
|
||||||
alias :at_beginning_of :floor
|
alias :at_beginning_of :floor
|
||||||
|
|
||||||
# Returns a new Time representing the start of the next unit specified (second by default).
|
# Returns a new Time representing the start of the next unit specified (second by default).
|
||||||
def ceil(unit = :sec)
|
def ceil(unit = :sec)
|
||||||
self.send("next_#{unit}").send("beginning_of_#{unit}")
|
self.send("next_#{unit}").send("beginning_of_#{unit}")
|
||||||
end
|
end
|
||||||
alias :beginning_of_next :ceil
|
alias :beginning_of_next :ceil
|
||||||
alias :at_beginning_of_next :ceil
|
alias :at_beginning_of_next :ceil
|
||||||
|
|
||||||
# Returns a new Time representing the start of the current or next unit
|
# Returns a new Time representing the start of the current or next unit specified (second by default) depending which is closest
|
||||||
# specified (second by default) depending which is closest
|
|
||||||
def round(unit = :sec)
|
def round(unit = :sec)
|
||||||
next_unit = self.ceil(unit)
|
next_unit = self.ceil(unit)
|
||||||
this_unit = self.floor(unit)
|
this_unit = self.floor(unit)
|
||||||
(self - this_unit) < (next_unit - self) ? this_unit : next_unit
|
(self - this_unit) < (next_unit - self) ? this_unit : next_unit
|
||||||
end
|
end
|
||||||
alias :beginning_of_closest :round
|
alias :beginning_of_closest :round
|
||||||
|
|
||||||
# Returns a new Time representing the previoius unit specified (defaults
|
# Returns a new Time representing the previoius unit specified (defaults to second).
|
||||||
# to second).
|
|
||||||
def prev(unit = :sec)
|
def prev(unit = :sec)
|
||||||
send("prev_#{unit}")
|
send("prev_#{unit}")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the next unit specified (defaults to
|
# Returns a new Time representing the next unit specified (defaults to second).
|
||||||
# second).
|
|
||||||
def next(unit = :sec)
|
def next(unit = :sec)
|
||||||
send("next_#{unit}")
|
send("next_#{unit}")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for seconds_ago(1).
|
# Short-hand for seconds_ago(1).
|
||||||
def prev_second
|
def prev_second
|
||||||
seconds_ago(1)
|
seconds_ago(1)
|
||||||
end
|
end
|
||||||
alias :prev_sec :prev_second
|
alias :prev_sec :prev_second
|
||||||
|
|
||||||
# Short-hand for seconds_since(1).
|
# Short-hand for seconds_since(1).
|
||||||
def next_second
|
def next_second
|
||||||
seconds_since(1)
|
seconds_since(1)
|
||||||
end
|
end
|
||||||
alias :next_sec :next_second
|
alias :next_sec :next_second
|
||||||
|
|
||||||
# Short-hand for minutes_ago(1).
|
# Short-hand for minutes_ago(1).
|
||||||
def prev_minute
|
def prev_minute
|
||||||
minutes_ago(1)
|
minutes_ago(1)
|
||||||
end
|
end
|
||||||
alias :prev_min :prev_minute
|
alias :prev_min :prev_minute
|
||||||
|
|
||||||
# Short-hand for minutes_since(1).
|
# Short-hand for minutes_since(1).
|
||||||
def next_minute
|
def next_minute
|
||||||
minutes_since(1)
|
minutes_since(1)
|
||||||
end
|
end
|
||||||
alias :next_min :next_minute
|
alias :next_min :next_minute
|
||||||
|
|
||||||
# Short-hand for hours_ago(1).
|
# Short-hand for hours_ago(1).
|
||||||
def prev_hour
|
def prev_hour
|
||||||
hours_ago(1)
|
hours_ago(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for hours_since(1).
|
# Short-hand for hours_since(1).
|
||||||
def next_hour
|
def next_hour
|
||||||
hours_since(1)
|
hours_since(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for days_ago(1).
|
# Short-hand for days_ago(1).
|
||||||
def prev_day
|
def prev_day
|
||||||
days_ago(1)
|
days_ago(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for days_since(1).
|
# Short-hand for days_since(1).
|
||||||
def next_day
|
def next_day
|
||||||
days_since(1)
|
days_since(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the start of the given day in the
|
# Returns a new Time representing the start of the given day in the previous week (default is Monday).
|
||||||
# previous week (default is Monday).
|
|
||||||
def prev_week(day = :monday)
|
def prev_week(day = :monday)
|
||||||
weeks_ago(1).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
|
weeks_ago(1).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for quarters_since(1).beginning_of_quarter.
|
# Short-hand for quarters_since(1).beginning_of_quarter.
|
||||||
def next_quarter
|
def next_quarter
|
||||||
quarters_since(1).beginning_of_quarter
|
quarters_since(1).beginning_of_quarter
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-hand for quarters_ago(1).beginning_of_quarter.
|
# Short-hand for quarters_ago(1).beginning_of_quarter.
|
||||||
def prev_quarter
|
def prev_quarter
|
||||||
quarters_ago(1).beginning_of_quarter
|
quarters_ago(1).beginning_of_quarter
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified minutes
|
# Returns a new Time representing the time a number of specified minutes ago.
|
||||||
# ago.
|
|
||||||
def minutes_ago(minutes)
|
def minutes_ago(minutes)
|
||||||
ago(minutes.minutes)
|
ago(minutes.minutes)
|
||||||
end
|
end
|
||||||
alias :mins_ago :minutes_ago
|
alias :mins_ago :minutes_ago
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified minutes
|
# Returns a new Time representing the time a number of specified minutes in the future.
|
||||||
# in the future.
|
|
||||||
def minutes_since(minutes)
|
def minutes_since(minutes)
|
||||||
since(minutes.minutes)
|
since(minutes.minutes)
|
||||||
end
|
end
|
||||||
alias :mins_since :minutes_since
|
alias :mins_since :minutes_since
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified hours
|
# Returns a new Time representing the time a number of specified hours ago.
|
||||||
# ago.
|
|
||||||
def hours_ago(hours)
|
def hours_ago(hours)
|
||||||
ago(hours.hours)
|
ago(hours.hours)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified hours in
|
# Returns a new Time representing the time a number of specified hours in the future.
|
||||||
# the future.
|
|
||||||
def hours_since(hours)
|
def hours_since(hours)
|
||||||
since(hours.hours)
|
since(hours.hours)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified days ago.
|
# Returns a new Time representing the time a number of specified days ago.
|
||||||
def days_ago(days)
|
def days_ago(days)
|
||||||
ago(days.days)
|
ago(days.days)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified days in
|
# Returns a new Time representing the time a number of specified days in the future.
|
||||||
# the future.
|
|
||||||
def days_since(days)
|
def days_since(days)
|
||||||
since(days.days)
|
since(days.days)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified weeks
|
# Returns a new Time representing the time a number of specified weeks ago.
|
||||||
# ago.
|
|
||||||
def weeks_ago(weeks)
|
def weeks_ago(weeks)
|
||||||
ago(weeks.weeks)
|
ago(weeks.weeks)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified weeks in
|
# Returns a new Time representing the time a number of specified weeks in the future.
|
||||||
# the future.
|
|
||||||
def weeks_since(weeks)
|
def weeks_since(weeks)
|
||||||
since(weeks.weeks)
|
since(weeks.weeks)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified quarters
|
# Returns a new Time representing the time a number of specified quarters (3 months) ago.
|
||||||
# (3 months) ago.
|
|
||||||
def quarters_ago(quarters)
|
def quarters_ago(quarters)
|
||||||
ago((quarters * 3).months)
|
ago((quarters * 3).months)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the time a number of specified quarters
|
# Returns a new Time representing the time a number of specified quarters (3 months) in the future.
|
||||||
# (3 months) in the future.
|
|
||||||
def quarters_since(quarters)
|
def quarters_since(quarters)
|
||||||
since((quarters * 3).months)
|
since((quarters * 3).months)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the end of the unit specified (defaults
|
# Returns a new Time representing the end of the unit specified (defaults to second).
|
||||||
# to second).
|
|
||||||
def end_of(unit = :sec)
|
def end_of(unit = :sec)
|
||||||
send("end_of_#{unit}")
|
send("end_of_#{unit}")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a new Time representing the start of the second, XX:XX:XX.000000
|
# Returns a new Time representing the start of the second, XX:XX:XX.000000 (.000000000 in ruby1.9).
|
||||||
# (.000000000 in ruby1.9).
|
|
||||||
def beginning_of_second
|
def beginning_of_second
|
||||||
change(:usec => 0)
|
change(:usec => 0)
|
||||||
end
|
end
|
||||||
alias :beginning_of_sec :beginning_of_second
|
alias :beginning_of_sec :beginning_of_second
|
||||||
alias :at_beginning_of_sec :beginning_of_second
|
alias :at_beginning_of_sec :beginning_of_second
|
||||||
alias :at_beginning_of_second :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
|
# Returns a new Time representing the end of the hour, XX:XX:XX.999999 (.999999999 in ruby1.9).
|
||||||
# (.999999999 in ruby1.9).
|
|
||||||
def end_of_second
|
def end_of_second
|
||||||
change(:usec => 999999.999)
|
change(:usec => 999999.999)
|
||||||
end
|
end
|
||||||
alias :end_of_sec :end_of_second
|
alias :end_of_sec :end_of_second
|
||||||
|
|
||||||
# Returns a new Time representing the start of the minute (XX:XX:00).
|
# Returns a new Time representing the start of the minute (XX:XX:00).
|
||||||
def beginning_of_minute
|
def beginning_of_minute
|
||||||
change(:sec => 0, :usec => 0)
|
change(:sec => 0, :usec => 0)
|
||||||
@@ -193,38 +171,23 @@ module TimeExt
|
|||||||
alias :beginning_of_min :beginning_of_minute
|
alias :beginning_of_min :beginning_of_minute
|
||||||
alias :at_beginning_of_min :beginning_of_minute
|
alias :at_beginning_of_min :beginning_of_minute
|
||||||
alias :at_beginning_of_minute :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).
|
# Returns a new Time representing the end of the hour, XX:XX:59.999999 (.999999999 in ruby1.9).
|
||||||
def end_of_minute
|
def end_of_minute
|
||||||
change(:sec => 59, :usec => 999999.999)
|
change(:sec => 59, :usec => 999999.999)
|
||||||
end
|
end
|
||||||
alias :end_of_min :end_of_minute
|
alias :end_of_min :end_of_minute
|
||||||
|
|
||||||
# Returns a new Time representing the start of the hour (XX:00:00).
|
# Returns a new Time representing the start of the hour (XX:00:00).
|
||||||
def beginning_of_hour
|
def beginning_of_hour
|
||||||
change(:min => 0, :sec => 0, :usec => 0)
|
change(:min => 0, :sec => 0, :usec => 0)
|
||||||
end
|
end
|
||||||
alias :at_beginning_of_hour :beginning_of_hour
|
alias :at_beginning_of_hour :beginning_of_hour
|
||||||
|
|
||||||
# Returns a new Time representing the end of the hour, XX:59:59.999999
|
# Returns a new Time representing the end of the hour, XX:59:59.999999 (.999999999 in ruby1.9).
|
||||||
# (.999999999 in ruby1.9).
|
|
||||||
def end_of_hour
|
def end_of_hour
|
||||||
change(:min => 59, :sec => 59, :usec => 999999.999)
|
change(:min => 59, :sec => 59, :usec => 999999.999)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
# encoding: utf-8
|
require 'active_support/core_ext/numeric/time' unless Numeric.new.respond_to?(:seconds) # fixes rare loading issue
|
||||||
|
|
||||||
# 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
|
class Numeric
|
||||||
alias :sec :seconds
|
alias :sec :seconds
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
# encoding: utf-8
|
require 'active_support'
|
||||||
|
require 'active_support/time' unless Time.respond_to?(:days_in_month) # support both Active Support 2.x and 3.x
|
||||||
# Support both Active Support 2.x and 3.x, and also address rare loading
|
require 'active_support/core_ext/time/calculations' unless Time.new.respond_to?(:ago) # fixes rare loading issue
|
||||||
# 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
|
class Time
|
||||||
# Include TimeExt modules into Time object.
|
include TimeExt::Support
|
||||||
include TimeExt::Calculations
|
include TimeExt::Calculations
|
||||||
include TimeExt::Iterations
|
include TimeExt::Iterations
|
||||||
|
|
||||||
|
|||||||
@@ -1,114 +1,10 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
module TimeExt
|
module TimeExt
|
||||||
# Allows you to iterate over Time objects with `#each` and other
|
# Allows you to iterate over Time objects with #each and other methods almost as if it was an Array or Hash.
|
||||||
# methods almost as if it was an Array or Hash.
|
|
||||||
module Iterations
|
module Iterations
|
||||||
#### Iterator Methods
|
|
||||||
|
# Used by #each, #map_each and similar methods to iterate over ranges of time.
|
||||||
# Executes passed block for each `unit` of time specified, with
|
def iterate(unit, options = {}, &block)
|
||||||
# a new time object for each interval passed to the block.
|
options.reverse_merge!(:map_result => false, :beginning_of => false, :include_start => false, :include_end => true)
|
||||||
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?
|
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]
|
||||||
@@ -131,28 +27,77 @@ module TimeExt
|
|||||||
time = time.send(succ_method)
|
time = time.send(succ_method)
|
||||||
end
|
end
|
||||||
options[:map_result] ? results : self
|
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
|
else
|
||||||
add_to_chain(:iterate, unit, options)
|
add_to_chain(:iterate, unit, options)
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Enables chaining of iterator methods with
|
# Used togeter with #each and other iteration methods to specify end of interation.
|
||||||
def add_to_chain(method, *args, &block)
|
def until(time, &block)
|
||||||
@method_chain ||= []
|
time = time.to_time if time.is_a?(::Date)
|
||||||
@method_chain << [method.to_sym, args, block]
|
@until = time
|
||||||
|
return call_chain(block) if block_given?
|
||||||
|
self
|
||||||
end
|
end
|
||||||
|
alias :till :until
|
||||||
def call_chain(custom_block = nil, &block)
|
|
||||||
method, args, iblock = @method_chain.pop
|
# Used together with #each and other interation methods to specify start of iteration, and end will be current object.
|
||||||
return nil if method.nil?
|
def from(time, &block)
|
||||||
iblock = custom_block if !custom_block.nil?
|
time = time.to_time if time.is_a?(::Date)
|
||||||
method, args, iblock = yield(method, args, iblock) if block_given?
|
method, args = @method_chain.pop if block_given?
|
||||||
self.send(method, *args, &iblock)
|
if !method.nil?
|
||||||
|
time.until(self).send(method, *args, &block)
|
||||||
|
else
|
||||||
|
time.until(self)
|
||||||
|
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.
|
||||||
|
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
|
||||||
|
|
||||||
|
# Dynamically define convenience methods, like #each_hour instead of #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
|
||||||
|
|
||||||
end
|
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
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
module TimeExt
|
module TimeExt
|
||||||
VERSION = "0.2.9"
|
VERSION = "0.2.9"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -24,6 +24,6 @@ Gem::Specification.new do |s|
|
|||||||
|
|
||||||
s.add_development_dependency 'rake', '>= 0.8.7'
|
s.add_development_dependency 'rake', '>= 0.8.7'
|
||||||
s.add_development_dependency 'rspec', '>= 2.1.0'
|
s.add_development_dependency 'rspec', '>= 2.1.0'
|
||||||
s.add_development_dependency 'rocco', '>= 0.6.0'
|
s.add_development_dependency 'yard', '>= 0.6.3'
|
||||||
s.add_development_dependency 'ruby-debug'
|
s.add_development_dependency 'ruby-debug'
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user