diff options
author | Andrew White <pixeltrix@users.noreply.github.com> | 2017-03-15 15:46:55 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-15 15:46:55 +0000 |
commit | 8efbfba248728c3836aaa64efc1690322f3ddad1 (patch) | |
tree | 761ed05323eb2c0e4c9e918bfed2b03611387ce2 /activesupport/lib/active_support | |
parent | 401d3ad56c08f2d03f49b096e69be43e33e16838 (diff) | |
parent | de5eb9ed9869fad99af0296267594e5ae6dff74b (diff) | |
download | rails-8efbfba248728c3836aaa64efc1690322f3ddad1.tar.gz rails-8efbfba248728c3836aaa64efc1690322f3ddad1.tar.bz2 rails-8efbfba248728c3836aaa64efc1690322f3ddad1.zip |
Merge pull request #28425 from rails/remove-duration-deprecation
Remove implicit coercion deprecation of durations
Diffstat (limited to 'activesupport/lib/active_support')
-rw-r--r-- | activesupport/lib/active_support/cache/mem_cache_store.rb | 2 | ||||
-rw-r--r-- | activesupport/lib/active_support/duration.rb | 88 |
2 files changed, 79 insertions, 11 deletions
diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb index 5eee04a34e..e09cee3335 100644 --- a/activesupport/lib/active_support/cache/mem_cache_store.rb +++ b/activesupport/lib/active_support/cache/mem_cache_store.rb @@ -156,7 +156,7 @@ module ActiveSupport expires_in = options[:expires_in].to_i if expires_in > 0 && !options[:raw] # Set the memcache expire a few minutes in the future to support race condition ttls on read - expires_in += 300 + expires_in += 5.minutes end rescue_error_with false do @data.send(method, key, value, expires_in, options) diff --git a/activesupport/lib/active_support/duration.rb b/activesupport/lib/active_support/duration.rb index d26bbac511..99080e34a1 100644 --- a/activesupport/lib/active_support/duration.rb +++ b/activesupport/lib/active_support/duration.rb @@ -1,4 +1,5 @@ require "active_support/core_ext/array/conversions" +require "active_support/core_ext/module/delegation" require "active_support/core_ext/object/acts_like" require "active_support/core_ext/string/filters" require "active_support/deprecation" @@ -9,6 +10,66 @@ module ActiveSupport # # 1.month.ago # equivalent to Time.now.advance(months: -1) class Duration + class Scalar < Numeric #:nodoc: + attr_reader :value + delegate :to_i, :to_f, :to_s, to: :value + + def initialize(value) + @value = value + end + + def coerce(other) + [Scalar.new(other), self] + end + + def -@ + Scalar.new(-value) + end + + def <=>(other) + if Scalar === other || Duration === other + value <=> other.value + elsif Numeric === other + value <=> other + else + nil + end + end + + def +(other) + calculate(:+, other) + end + + def -(other) + calculate(:-, other) + end + + def *(other) + calculate(:*, other) + end + + def /(other) + calculate(:/, other) + end + + private + def calculate(op, other) + if Scalar === other + Scalar.new(value.public_send(op, other.value)) + elsif Duration === other + Duration.seconds(value).public_send(op, other) + elsif Numeric === other + Scalar.new(value.public_send(op, other)) + else + raise_type_error(other) + end + end + + def raise_type_error(other) + raise TypeError, "no implicit conversion of #{other.class} into #{self.class}" + end + end + SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600 SECONDS_PER_DAY = 86400 @@ -91,12 +152,11 @@ module ActiveSupport end def coerce(other) #:nodoc: - ActiveSupport::Deprecation.warn(<<-MSG.squish) - Implicit coercion of ActiveSupport::Duration to a Numeric - is deprecated and will raise a TypeError in Rails 5.2. - MSG - - [other, value] + if Scalar === other + [other, self] + else + [Scalar.new(other), self] + end end # Compares one Duration with another or a Numeric to this Duration. @@ -132,19 +192,23 @@ module ActiveSupport # Multiplies this Duration by a Numeric and returns a new Duration. def *(other) - if Numeric === other + if Scalar === other || Duration === other + Duration.new(value * other.value, parts.map { |type, number| [type, number * other.value] }) + elsif Numeric === other Duration.new(value * other, parts.map { |type, number| [type, number * other] }) else - value * other + raise_type_error(other) end end # Divides this Duration by a Numeric and returns a new Duration. def /(other) - if Numeric === other + if Scalar === other || Duration === other + Duration.new(value / other.value, parts.map { |type, number| [type, number / other.value] }) + elsif Numeric === other Duration.new(value / other, parts.map { |type, number| [type, number / other] }) else - value / other + raise_type_error(other) end end @@ -274,5 +338,9 @@ module ActiveSupport def method_missing(method, *args, &block) value.send(method, *args, &block) end + + def raise_type_error(other) + raise TypeError, "no implicit conversion of #{other.class} into #{self.class}" + end end end |