From de188a7cac14c3b3e778e145400830fd57c86999 Mon Sep 17 00:00:00 2001 From: Tom Lea Date: Thu, 4 Sep 2008 17:38:53 +0100 Subject: [PATCH] Made 1.5.days.ago == 36.hours.ago and 1.5.weeks.ago = 3.5.days ago Did not modify the behaviour of 1.5.months.ago, as this could meen different things to different people at different times. --- .../active_support/core_ext/time/calculations.rb | 10 ++++++ activesupport/test/core_ext/duration_test.rb | 34 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 0 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb index cd234c9..ad7e094 100644 --- a/activesupport/lib/active_support/core_ext/time/calculations.rb +++ b/activesupport/lib/active_support/core_ext/time/calculations.rb @@ -83,6 +83,16 @@ module ActiveSupport #:nodoc: # :months, :weeks, :days, :hours, # :minutes, :seconds. def advance(options) + unless options[:weeks].nil? + options[:weeks], partial_weeks = options[:weeks].divmod(1) + options[:days] = (options[:days] || 0) + 7 * partial_weeks + end + + unless options[:days].nil? + options[:days], partial_days = options[:days].divmod(1) + options[:hours] = (options[:hours] || 0) + 24 * partial_days + end + d = to_date.advance(options) time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day) seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600 diff --git a/activesupport/test/core_ext/duration_test.rb b/activesupport/test/core_ext/duration_test.rb index f802ed8..b01fbf2 100644 --- a/activesupport/test/core_ext/duration_test.rb +++ b/activesupport/test/core_ext/duration_test.rb @@ -31,6 +31,40 @@ class DurationTest < Test::Unit::TestCase end uses_mocha 'TestDurationSinceAndAgoWithCurrentTime' do + def test_fractional_weeks + Time.stubs(:now).returns Time.local(2000) + + assert_in_delta((24 * 7 * 1.5).hours, 1.5.weeks, 2 ** -20) + assert_in_delta((24 * 7 * 1.7).hours, 1.7.weeks, 2 ** -20) + end + + def test_fractional_days + Time.stubs(:now).returns Time.local(2000) + + assert_in_delta((24 * 1.5).hours, 1.5.days, 2 ** -20) + assert_in_delta((24 * 1.7).hours, 1.7.days, 2 ** -20) + end + + def test_since_and_ago_with_fractional_days + Time.stubs(:now).returns Time.local(2000) + # since + assert_equal 36.hours.since, 1.5.days.since + assert_equal((24 * 1.7).hours.since, 1.7.days.since) + # ago + assert_equal 36.hours.ago, 1.5.days.ago + assert_equal((24 * 1.7).hours.ago, 1.7.days.ago) + end + + def test_since_and_ago_with_fractional_weeks + Time.stubs(:now).returns Time.local(2000) + # since + assert_equal((7 * 36).hours.since, 1.5.weeks.since) + assert_equal((7 * 24 * 1.7).hours.since, 1.7.weeks.since) + # ago + assert_equal((7 * 36).hours.ago, 1.5.weeks.ago) + assert_equal((7 * 24 * 1.7).hours.ago, 1.7.weeks.ago) + end + def test_since_and_ago_anchored_to_time_now_when_time_zone_default_not_set Time.zone_default = nil with_env_tz 'US/Eastern' do -- 1.6.0.1