lib/timecop/time_stack_item.rb in timecop-0.9.4 vs lib/timecop/time_stack_item.rb in timecop-0.9.5

- old
+ new

@@ -1,140 +1,140 @@ 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 + # 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) - @travel_offset = @scaling_factor = nil - @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 - end + def initialize(mock_type, *args) + raise "Unknown mock_type #{mock_type}" unless [:freeze, :travel, :scale].include?(mock_type) + @travel_offset = @scaling_factor = nil + @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 + end - def year - time.year - end + def year + time.year + end - def month - time.month - end + def month + time.month + end - def day - time.day - end + def day + time.day + end - def hour - time.hour - end + def hour + time.hour + end - def min - time.min - end + def min + time.min + end - def sec - time.sec - end + def sec + time.sec + end - def utc_offset - time.utc_offset - end + def utc_offset + time.utc_offset + end - def travel_offset - @travel_offset unless mock_type == :freeze - end + def travel_offset + @travel_offset unless mock_type == :freeze + end - def travel_offset_days - (@travel_offset / 60 / 60 / 24).round - end + def travel_offset_days + (@travel_offset / 60 / 60 / 24).round + end - def scaling_factor - @scaling_factor - end + def scaling_factor + @scaling_factor + end - def time(time_klass = Time) #:nodoc: - if @time.respond_to?(:in_time_zone) - time = time_klass.at(@time.dup.localtime) - else - time = time_klass.at(@time) - end - - if travel_offset.nil? - time - elsif scaling_factor.nil? - time_klass.at(Time.now_without_mock_time + travel_offset) - else - time_klass.at(scaled_time) - end + def time(time_klass = Time) #:nodoc: + if @time.respond_to?(:in_time_zone) + time = time_klass.at(@time.dup.localtime) + else + time = time_klass.at(@time) end - def scaled_time - (@time + (Time.now_without_mock_time - @time_was) * scaling_factor).to_f + if travel_offset.nil? + time + elsif scaling_factor.nil? + time_klass.at(Time.now_without_mock_time + travel_offset) + else + time_klass.at(scaled_time) end + end - def date(date_klass = Date) - date_klass.jd(time.__send__(:to_date).jd) - end + def scaled_time + (@time + (Time.now_without_mock_time - @time_was) * scaling_factor).to_f + end - def datetime(datetime_klass = DateTime) - if Float.method_defined?(:to_r) - fractions_of_a_second = time.to_f % 1 - datetime_klass.new(year, month, day, hour, min, (fractions_of_a_second + sec), utc_offset_to_rational(utc_offset)) - else - datetime_klass.new(year, month, day, hour, min, sec, utc_offset_to_rational(utc_offset)) - end + def date(date_klass = Date) + date_klass.jd(time.__send__(:to_date).jd) + end + + def datetime(datetime_klass = DateTime) + if Float.method_defined?(:to_r) + fractions_of_a_second = time.to_f % 1 + datetime_klass.new(year, month, day, hour, min, (fractions_of_a_second + sec), utc_offset_to_rational(utc_offset)) + else + datetime_klass.new(year, month, day, hour, min, sec, utc_offset_to_rational(utc_offset)) end + end - private + private - def rational_to_utc_offset(rational) - ((24.0 / rational.denominator) * rational.numerator) * (60 * 60) - end + 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 utc_offset_to_rational(utc_offset) + Rational(utc_offset, 24 * 60 * 60) + end - def parse_time(*args) - arg = args.shift - if arg.is_a?(Time) - arg - elsif Object.const_defined?(:DateTime) && arg.is_a?(DateTime) - time_klass.at(arg.to_time.to_f).getlocal - elsif Object.const_defined?(:Date) && arg.is_a?(Date) - time_klass.local(arg.year, arg.month, arg.day, 0, 0, 0) - elsif args.empty? && (arg.kind_of?(Integer) || arg.kind_of?(Float)) - time_klass.now + arg - elsif arg.nil? - time_klass.now + def parse_time(*args) + arg = args.shift + if arg.is_a?(Time) + arg + elsif Object.const_defined?(:DateTime) && arg.is_a?(DateTime) + time_klass.at(arg.to_time.to_f).getlocal + elsif Object.const_defined?(:Date) && arg.is_a?(Date) + time_klass.local(arg.year, arg.month, arg.day, 0, 0, 0) + elsif args.empty? && (arg.kind_of?(Integer) || arg.kind_of?(Float)) + time_klass.now + arg + elsif arg.nil? + time_klass.now + else + if arg.is_a?(String) && Time.respond_to?(:parse) + time_klass.parse(arg) else - if arg.is_a?(String) && Time.respond_to?(:parse) - time_klass.parse(arg) - else - # we'll just assume it's a list of y/m/d/h/m/s - year = arg || 2000 - month = args.shift || 1 - day = args.shift || 1 - hour = args.shift || 0 - minute = args.shift || 0 - second = args.shift || 0 - time_klass.local(year, month, day, hour, minute, second) - end + # we'll just assume it's a list of y/m/d/h/m/s + year = arg || 2000 + month = args.shift || 1 + day = args.shift || 1 + hour = args.shift || 0 + minute = args.shift || 0 + second = args.shift || 0 + time_klass.local(year, month, day, hour, minute, second) end end + end - def compute_travel_offset - time - Time.now_without_mock_time - end + def compute_travel_offset + time - Time.now_without_mock_time + end - def times_are_equal_within_epsilon t1, t2, epsilon_in_seconds - (t1 - t2).abs < epsilon_in_seconds - end + def times_are_equal_within_epsilon t1, t2, epsilon_in_seconds + (t1 - t2).abs < epsilon_in_seconds + end - def time_klass - Time.respond_to?(:zone) && Time.zone ? Time.zone : Time - end + def time_klass + Time.respond_to?(:zone) && Time.zone ? Time.zone : Time end + end end