aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/duration.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-12-15 02:27:41 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-12-15 02:27:41 +0000
commit887870f20c347179aef0545ee2019c02ed9f74d1 (patch)
treed93605ee6317bb1a427477c363ddc7a6ee67db0f /activesupport/lib/active_support/duration.rb
parentbb152cd8ca2502c4b426a46fa9d86d9cff68d0cb (diff)
downloadrails-887870f20c347179aef0545ee2019c02ed9f74d1.tar.gz
rails-887870f20c347179aef0545ee2019c02ed9f74d1.tar.bz2
rails-887870f20c347179aef0545ee2019c02ed9f74d1.zip
Ruby 1.9 compat: define Duration#== [chuyeow]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8399 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport/lib/active_support/duration.rb')
-rw-r--r--activesupport/lib/active_support/duration.rb60
1 files changed, 35 insertions, 25 deletions
diff --git a/activesupport/lib/active_support/duration.rb b/activesupport/lib/active_support/duration.rb
index fd9b505c2f..cbee4fd0ca 100644
--- a/activesupport/lib/active_support/duration.rb
+++ b/activesupport/lib/active_support/duration.rb
@@ -6,11 +6,11 @@ module ActiveSupport
# 1.month.ago # equivalent to Time.now.advance(:months => -1)
class Duration < BasicObject
attr_accessor :value, :parts
-
+
def initialize(value, parts) #:nodoc:
@value, @parts = value, parts
end
-
+
# Adds another Duration or a Numeric to this Duration. Numeric values
# are treated as seconds.
def +(other)
@@ -20,39 +20,49 @@ module ActiveSupport
Duration.new(value + other, @parts + [[:seconds, other]])
end
end
-
+
# Subtracts another Duration or a Numeric from this Duration. Numeric
# values are treated as seconds.
def -(other)
self + (-other)
end
-
+
def -@ #:nodoc:
Duration.new(-value, parts.map { |type,number| [type, -number] })
end
-
+
def is_a?(klass) #:nodoc:
klass == Duration || super
end
-
+
+ # Returns true if <tt>other</tt> is also a Duration instance with the
+ # same <tt>value</tt>, or if <tt>other == value</tt>.
+ def ==(other)
+ if Duration === other
+ other.value == value
+ else
+ other == value
+ end
+ end
+
def self.===(other) #:nodoc:
other.is_a?(Duration) rescue super
end
-
+
# Calculates a new Time or Date that is as far in the future
# as this Duration represents.
def since(time = ::Time.now)
sum(1, time)
end
alias :from_now :since
-
+
# Calculates a new Time or Date that is as far in the past
# as this Duration represents.
def ago(time = ::Time.now)
sum(-1, time)
end
alias :until :ago
-
+
def inspect #:nodoc:
consolidated = parts.inject(Hash.new(0)) { |h,part| h[part.first] += part.last; h }
[:years, :months, :days, :minutes, :seconds].map do |length|
@@ -60,27 +70,27 @@ module ActiveSupport
"#{n} #{n == 1 ? length.to_s.singularize : length.to_s}" if n.nonzero?
end.compact.to_sentence
end
-
+
protected
-
- def sum(sign, time = ::Time.now) #:nodoc:
- parts.inject(time) do |t,(type,number)|
- if t.acts_like?(:time) || t.acts_like?(:date)
- if type == :seconds
- t.since(sign * number)
+
+ def sum(sign, time = ::Time.now) #:nodoc:
+ parts.inject(time) do |t,(type,number)|
+ if t.acts_like?(:time) || t.acts_like?(:date)
+ if type == :seconds
+ t.since(sign * number)
+ else
+ t.advance(type => sign * number)
+ end
else
- t.advance(type => sign * number)
+ raise ArgumentError, "expected a time or date, got #{time.inspect}"
end
- else
- raise ArgumentError, "expected a time or date, got #{time.inspect}"
end
end
- end
-
+
private
-
- def method_missing(method, *args, &block) #:nodoc:
- value.send(method, *args)
- end
+
+ def method_missing(method, *args, &block) #:nodoc:
+ value.send(method, *args)
+ end
end
end