lib/timecop/time_stack_item.rb in timecop-0.5.5 vs lib/timecop/time_stack_item.rb in timecop-0.5.6
- old
+ new
@@ -2,75 +2,75 @@
class Timecop
# A data class for carrying around "time movement" objects. Makes it easy to keep track of the time
# movements on a simple stack.
class TimeStackItem #:nodoc:
attr_reader :mock_type
-
+
def initialize(mock_type, *args)
raise "Unknown mock_type #{mock_type}" unless [:freeze, :travel, :scale].include?(mock_type)
@scaling_factor = args.shift if mock_type == :scale
@mock_type = mock_type
@time = parse_time(*args)
@time_was = Time.now_without_mock_time
@travel_offset = compute_travel_offset
@dst_adjustment = compute_dst_adjustment(@time)
end
-
+
def year
time.year
end
-
+
def month
time.month
end
-
+
def day
time.day
end
-
+
def hour
time.hour
end
-
+
def min
time.min
end
-
+
def sec
time.sec
end
-
+
def utc_offset
time.utc_offset
end
-
+
def travel_offset
@travel_offset
end
def scaling_factor
@scaling_factor
end
-
+
def time(time_klass = Time) #:nodoc:
if travel_offset.nil?
- time_klass.at(@time.to_f)
+ time_klass.at(@time)
elsif scaling_factor.nil?
- time_klass.at((Time.now_without_mock_time + travel_offset).to_f)
+ time_klass.at(Time.now_without_mock_time + travel_offset)
else
time_klass.at(scaled_time)
end
end
def scaled_time
(@time + (Time.now_without_mock_time - @time_was) * scaling_factor).to_f
end
-
+
def date(date_klass = Date)
date_klass.jd(time.__send__(:to_date).jd)
end
-
+
def datetime(datetime_klass = DateTime)
our_offset = utc_offset + dst_adjustment
if Float.method_defined?(:to_r)
fractions_of_a_second = time.to_f % 1
@@ -78,28 +78,28 @@
else
our_offset = utc_offset + dst_adjustment
datetime_klass.new(year, month, day, hour, min, sec, utc_offset_to_rational(our_offset))
end
end
-
+
def dst_adjustment
@dst_adjustment
end
-
+
private
def rational_to_utc_offset(rational)
((24.0 / rational.denominator) * rational.numerator) * (60 * 60)
end
-
+
def utc_offset_to_rational(utc_offset)
Rational(utc_offset, 24 * 60 * 60)
end
-
+
def parse_time(*args)
time_klass = Time.respond_to?(:zone) && Time.zone ? Time.zone : Time
arg = args.shift
- if arg.is_a?(Time)
+ if arg.is_a?(Time)
if Timecop.active_support != false && arg.respond_to?(:in_time_zone)
arg.in_time_zone
else
arg.getlocal
end
@@ -126,16 +126,16 @@
second = args.shift || 0
time_klass.local(year, month, day, hour, minute, second)
end
end
end
-
+
def compute_dst_adjustment(time)
return 0 if !(time.dst? ^ Time.now.dst?)
return -1 * 60 * 60 if time.dst?
return 60 * 60
end
-
+
def compute_travel_offset
return nil if mock_type == :freeze
time - Time.now_without_mock_time
end
end