From c1ad19c92fde1c3801a93b59003ba2b266e4128f Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Wed, 27 Apr 2016 14:36:22 -0500 Subject: Revert "Change 1.week to create 1 week durations instead of 7 days durations." Regression: adding minutes/hours to a time would change its time zone This reverts commit 1bf9fe75a6473cb7501cae544cab772713e68cef. --- activesupport/CHANGELOG.md | 20 -------------------- .../lib/active_support/core_ext/numeric/time.rb | 16 ++++++++-------- activesupport/lib/active_support/duration.rb | 4 +--- activesupport/test/core_ext/duration_test.rb | 5 ++--- 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index e4497e1756..f7b4aad492 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -112,26 +112,6 @@ *Santosh Wadghule* -* `ActiveSupport::Duration` supports weeks and hours. - - [1.hour.inspect, 1.hour.value, 1.hour.parts] - # => ["3600 seconds", 3600, [[:seconds, 3600]]] # Before - # => ["1 hour", 3600, [[:hours, 1]]] # After - - [1.week.inspect, 1.week.value, 1.week.parts] - # => ["7 days", 604800, [[:days, 7]]] # Before - # => ["1 week", 604800, [[:weeks, 1]]] # After - - This brings us into closer conformance with ISO8601 and relieves some - astonishment about getting `1.hour.inspect # => 3600 seconds`. - - Compatibility: The duration's `value` remains the same, so apps using - durations are oblivious to the new time periods. Apps, libraries, and - plugins that work with the internal `parts` hash will need to broaden - their time period handling to cover hours & weeks. - - *Andrey Novikov* - * Fix behavior of JSON encoding for `Exception`. *namusyaka* diff --git a/activesupport/lib/active_support/core_ext/numeric/time.rb b/activesupport/lib/active_support/core_ext/numeric/time.rb index c6ece22f8d..6c4a975495 100644 --- a/activesupport/lib/active_support/core_ext/numeric/time.rb +++ b/activesupport/lib/active_support/core_ext/numeric/time.rb @@ -25,17 +25,17 @@ class Numeric # Returns a Duration instance matching the number of minutes provided. # - # 2.minutes # => 2 minutes + # 2.minutes # => 120 seconds def minutes - ActiveSupport::Duration.new(self * 60, [[:minutes, self]]) + ActiveSupport::Duration.new(self * 60, [[:seconds, self * 60]]) end alias :minute :minutes # Returns a Duration instance matching the number of hours provided. # - # 2.hours # => 2 hours + # 2.hours # => 7_200 seconds def hours - ActiveSupport::Duration.new(self * 3600, [[:hours, self]]) + ActiveSupport::Duration.new(self * 3600, [[:seconds, self * 3600]]) end alias :hour :hours @@ -49,17 +49,17 @@ class Numeric # Returns a Duration instance matching the number of weeks provided. # - # 2.weeks # => 2 weeks + # 2.weeks # => 14 days def weeks - ActiveSupport::Duration.new(self * 7.days, [[:weeks, self]]) + ActiveSupport::Duration.new(self * 7.days, [[:days, self * 7]]) end alias :week :weeks # Returns a Duration instance matching the number of fortnights provided. # - # 2.fortnights # => 4 weeks + # 2.fortnights # => 28 days def fortnights - ActiveSupport::Duration.new(self * 2.weeks, [[:weeks, self * 2]]) + ActiveSupport::Duration.new(self * 2.weeks, [[:days, self * 14]]) end alias :fortnight :fortnights diff --git a/activesupport/lib/active_support/duration.rb b/activesupport/lib/active_support/duration.rb index 3bde541009..c717e7f357 100644 --- a/activesupport/lib/active_support/duration.rb +++ b/activesupport/lib/active_support/duration.rb @@ -120,7 +120,7 @@ module ActiveSupport def inspect #:nodoc: parts. reduce(::Hash.new(0)) { |h,(l,r)| h[l] += r; h }. - sort_by {|unit, _ | [:years, :months, :weeks, :days, :hours, :minutes, :seconds].index(unit)}. + sort_by {|unit, _ | [:years, :months, :days, :minutes, :seconds].index(unit)}. map {|unit, val| "#{val} #{val == 1 ? unit.to_s.chop : unit.to_s}"}. to_sentence(locale: ::I18n.default_locale) end @@ -159,8 +159,6 @@ module ActiveSupport if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) - elsif [:hours, :minutes].include?(type) - t.in_time_zone.advance(type => sign * number) else t.advance(type => sign * number) end diff --git a/activesupport/test/core_ext/duration_test.rb b/activesupport/test/core_ext/duration_test.rb index bef660fe12..69c2c0d936 100644 --- a/activesupport/test/core_ext/duration_test.rb +++ b/activesupport/test/core_ext/duration_test.rb @@ -66,9 +66,8 @@ class DurationTest < ActiveSupport::TestCase assert_equal '10 years, 2 months, and 1 day', (10.years + 2.months + 1.day).inspect assert_equal '10 years, 2 months, and 1 day', (10.years + 1.month + 1.day + 1.month).inspect assert_equal '10 years, 2 months, and 1 day', (1.day + 10.years + 2.months).inspect - assert_equal '7 days', 7.days.inspect - assert_equal '1 week', 1.week.inspect - assert_equal '2 weeks', 1.fortnight.inspect + assert_equal '7 days', 1.week.inspect + assert_equal '14 days', 1.fortnight.inspect end def test_inspect_locale -- cgit v1.2.3