Created
May 14, 2011 02:35
-
-
Save AquaGeek/971805 to your computer and use it in GitHub Desktop.
Rails Lighthouse ticket #6534
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 374863bd66ac49d2f086d367c409ec104129f2d4 Mon Sep 17 00:00:00 2001 | |
From: Ryan Orr <ryanorr12@gmail.com> | |
Date: Sun, 20 Mar 2011 21:43:35 -0500 | |
Subject: [PATCH] Fixed bugs with time zone comparison. | |
--- | |
.../active_support/core_ext/time/calculations.rb | 10 ++++++++++ | |
activesupport/lib/active_support/time_with_zone.rb | 7 +++++-- | |
activesupport/test/core_ext/time_ext_test.rb | 6 ++++++ | |
activesupport/test/core_ext/time_with_zone_test.rb | 11 +++++++++-- | |
4 files changed, 30 insertions(+), 4 deletions(-) | |
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb | |
index 7e134db..3c1c4b8 100644 | |
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb | |
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb | |
@@ -285,4 +285,14 @@ class Time | |
end | |
alias_method :compare_without_coercion, :<=> | |
alias_method :<=>, :compare_with_coercion | |
+ | |
+ # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances | |
+ # can be eql? to an equivalent Time | |
+ def eql_with_coercion(other) | |
+ # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison | |
+ other = other.comparable_time if other.respond_to?(:comparable_time) | |
+ eql_without_coercion(other) | |
+ end | |
+ alias_method :eql_without_coercion, :eql? | |
+ alias_method :eql?, :eql_with_coercion | |
end | |
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb | |
index c66aa78..58659e9 100644 | |
--- a/activesupport/lib/active_support/time_with_zone.rb | |
+++ b/activesupport/lib/active_support/time_with_zone.rb | |
@@ -202,7 +202,11 @@ module ActiveSupport | |
end | |
def eql?(other) | |
- utc == other | |
+ utc.eql?(other) | |
+ end | |
+ | |
+ def hash | |
+ utc.hash | |
end | |
def +(other) | |
@@ -276,7 +280,6 @@ module ActiveSupport | |
def to_i | |
utc.to_i | |
end | |
- alias_method :hash, :to_i | |
alias_method :tv_sec, :to_i | |
# A TimeWithZone acts like a Time, so just return +self+. | |
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb | |
index 53d4970..ed427f9 100644 | |
--- a/activesupport/test/core_ext/time_ext_test.rb | |
+++ b/activesupport/test/core_ext/time_ext_test.rb | |
@@ -744,6 +744,12 @@ class TimeExtCalculationsTest < ActiveSupport::TestCase | |
assert_equal(-1, Time.utc(2000) <=> ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1, 0, 0, 1), ActiveSupport::TimeZone['UTC'] )) | |
end | |
+ def test_eql? | |
+ assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) ) | |
+ assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal false,Time.utc(2000, 1, 1, 0, 0, 1).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) ) | |
+ end | |
+ | |
def test_minus_with_time_with_zone | |
assert_equal 86_400.0, Time.utc(2000, 1, 2) - ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1), ActiveSupport::TimeZone['UTC'] ) | |
end | |
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb | |
index bafa335..ca1f4a6 100644 | |
--- a/activesupport/test/core_ext/time_with_zone_test.rb | |
+++ b/activesupport/test/core_ext/time_with_zone_test.rb | |
@@ -187,8 +187,15 @@ class TimeWithZoneTest < Test::Unit::TestCase | |
end | |
def test_eql? | |
- assert @twz.eql?(Time.utc(2000)) | |
- assert @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal true, @twz.eql?(Time.utc(2000)) | |
+ assert_equal true, @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal false, @twz.eql?( Time.utc(2000, 1, 1, 0, 0, 1) ) | |
+ assert_equal false, @twz.eql?( DateTime.civil(1999, 12, 31, 23, 59, 59) ) | |
+ end | |
+ | |
+ def test_hash | |
+ assert_equal Time.utc(2000).hash, @twz.hash | |
+ assert_equal Time.utc(2000).hash, ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]).hash | |
end | |
def test_plus_with_integer | |
-- | |
1.7.4.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 87f737fa063d8180e934c05de26508c3464463c1 Mon Sep 17 00:00:00 2001 | |
From: Marc-Andre Lafortune <github@marc-andre.ca> | |
Date: Sat, 5 Mar 2011 15:44:05 -0500 | |
Subject: [PATCH] Fix bugs with Time{WithZone}#eql? and TimeWithZone#hash | |
--- | |
.../active_support/core_ext/time/calculations.rb | 10 ++++++++++ | |
activesupport/lib/active_support/time_with_zone.rb | 7 +++++-- | |
activesupport/test/core_ext/time_ext_test.rb | 6 ++++++ | |
activesupport/test/core_ext/time_with_zone_test.rb | 10 ++++++++-- | |
4 files changed, 29 insertions(+), 4 deletions(-) | |
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb | |
index 6e4b69f..7b56487 100644 | |
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb | |
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb | |
@@ -294,4 +294,14 @@ class Time | |
end | |
alias_method :compare_without_coercion, :<=> | |
alias_method :<=>, :compare_with_coercion | |
+ | |
+ # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances | |
+ # can be eql? to an equivalent Time | |
+ def eql_with_coercion(other) | |
+ # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison | |
+ other = other.comparable_time if other.respond_to?(:comparable_time) | |
+ eql_without_coercion(other) | |
+ end | |
+ alias_method :eql_without_coercion, :eql? | |
+ alias_method :eql?, :eql_with_coercion | |
end | |
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb | |
index 3da216a..1d93a81 100644 | |
--- a/activesupport/lib/active_support/time_with_zone.rb | |
+++ b/activesupport/lib/active_support/time_with_zone.rb | |
@@ -202,7 +202,11 @@ module ActiveSupport | |
end | |
def eql?(other) | |
- utc == other | |
+ utc.eql?(other) | |
+ end | |
+ | |
+ def hash | |
+ utc.hash | |
end | |
def +(other) | |
@@ -276,7 +280,6 @@ module ActiveSupport | |
def to_i | |
utc.to_i | |
end | |
- alias_method :hash, :to_i | |
alias_method :tv_sec, :to_i | |
# A TimeWithZone acts like a Time, so just return +self+. | |
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb | |
index 891a6ba..854fae4 100644 | |
--- a/activesupport/test/core_ext/time_ext_test.rb | |
+++ b/activesupport/test/core_ext/time_ext_test.rb | |
@@ -734,6 +734,12 @@ class TimeExtCalculationsTest < ActiveSupport::TestCase | |
assert_equal(-1, Time.utc(2000) <=> ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1, 0, 0, 1), ActiveSupport::TimeZone['UTC'] )) | |
end | |
+ def test_eql? | |
+ assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) ) | |
+ assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal false,Time.utc(2000, 1, 1, 0, 0, 1).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) ) | |
+ end | |
+ | |
def test_minus_with_time_with_zone | |
assert_equal 86_400.0, Time.utc(2000, 1, 2) - ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1), ActiveSupport::TimeZone['UTC'] ) | |
end | |
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb | |
index bafa335..80ab43a 100644 | |
--- a/activesupport/test/core_ext/time_with_zone_test.rb | |
+++ b/activesupport/test/core_ext/time_with_zone_test.rb | |
@@ -187,8 +187,14 @@ class TimeWithZoneTest < Test::Unit::TestCase | |
end | |
def test_eql? | |
- assert @twz.eql?(Time.utc(2000)) | |
- assert @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal true, @twz.eql?(Time.utc(2000)) | |
+ assert_equal true, @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) ) | |
+ assert_equal false, @twz.eql?( Time.utc(2000, 1, 1, 0, 0, 1) ) | |
+ end | |
+ | |
+ def test_hash | |
+ assert_equal Time.utc(2000).hash, @twz.hash | |
+ assert_equal Time.utc(2000).hash, ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]).hash | |
end | |
def test_plus_with_integer | |
-- | |
1.7.3.2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment