mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
refactored Time#<=> and DateTime#<=> by removing unnecessary calls without losing performance
Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
This commit is contained in:
committed by
Santiago Pastorino
parent
0db915efd1
commit
7872cc992b
@@ -1,6 +1,4 @@
|
||||
require 'rational' unless RUBY_VERSION >= '1.9.2'
|
||||
require 'active_support/core_ext/object/acts_like'
|
||||
require 'active_support/core_ext/time/zones'
|
||||
|
||||
class DateTime
|
||||
class << self
|
||||
@@ -105,11 +103,7 @@ class DateTime
|
||||
end
|
||||
|
||||
# Layers additional behavior on DateTime#<=> so that Time and ActiveSupport::TimeWithZone instances can be compared with a DateTime
|
||||
def compare_with_coercion(other)
|
||||
other = other.comparable_time if other.respond_to?(:comparable_time)
|
||||
other = other.to_datetime unless other.acts_like?(:date)
|
||||
compare_without_coercion(other)
|
||||
def <=>(other)
|
||||
super other.to_datetime
|
||||
end
|
||||
alias_method :compare_without_coercion, :<=>
|
||||
alias_method :<=>, :compare_with_coercion
|
||||
end
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
require 'active_support/duration'
|
||||
require 'active_support/core_ext/date/acts_like'
|
||||
require 'active_support/core_ext/date/calculations'
|
||||
require 'active_support/core_ext/date_time/conversions'
|
||||
|
||||
class Time
|
||||
COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||
@@ -283,14 +280,8 @@ class Time
|
||||
# Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances
|
||||
# can be chronologically compared with a Time
|
||||
def compare_with_coercion(other)
|
||||
# if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do <=> comparison
|
||||
other = other.comparable_time if other.respond_to?(:comparable_time)
|
||||
if other.acts_like?(:date)
|
||||
# other is a Date/DateTime, so coerce self #to_datetime and hand off to DateTime#<=>
|
||||
to_datetime.compare_without_coercion(other)
|
||||
else
|
||||
compare_without_coercion(other)
|
||||
end
|
||||
# we're avoiding Time#to_datetime cause it's expensive
|
||||
other.is_a?(Time) ? compare_without_coercion(other.to_time) : to_datetime <=> other
|
||||
end
|
||||
alias_method :compare_without_coercion, :<=>
|
||||
alias_method :<=>, :compare_with_coercion
|
||||
|
||||
@@ -281,7 +281,7 @@ module ActiveSupport
|
||||
|
||||
# A TimeWithZone acts like a Time, so just return +self+.
|
||||
def to_time
|
||||
self
|
||||
utc
|
||||
end
|
||||
|
||||
def to_datetime
|
||||
|
||||
Reference in New Issue
Block a user