time_freeze 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+ require 'date'
2
+
3
+ class Time
4
+
5
+ # stolen from ActiveSupport...
6
+ # but I don't want to require ActiveSupport
7
+
8
+ # Converts a Time object to a Date, dropping hour, minute, and second precision.
9
+ #
10
+ # my_time = Time.now # => Mon Nov 12 22:59:51 -0500 2007
11
+ # my_time.to_date # => Mon, 12 Nov 2007
12
+ #
13
+ # your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
14
+ # your_time.to_date # => Tue, 13 Jan 2009
15
+ def to_date
16
+ ::Date.new(year, month, day)
17
+ end unless method_defined?(:to_date)
18
+
19
+ # A method to keep Time, Date and DateTime instances interchangeable on conversions.
20
+ # In this case, it simply returns +self+.
21
+ def to_time
22
+ self
23
+ end unless method_defined?(:to_time)
24
+
25
+ # Converts a Time instance to a Ruby DateTime instance, preserving UTC offset.
26
+ #
27
+ # my_time = Time.now # => Mon Nov 12 23:04:21 -0500 2007
28
+ # my_time.to_datetime # => Mon, 12 Nov 2007 23:04:21 -0500
29
+ #
30
+ # your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
31
+ # your_time.to_datetime # => Tue, 13 Jan 2009 13:13:03 -0500
32
+ def to_datetime
33
+ ::DateTime.civil(year, month, day, hour, min, sec, Rational(utc_offset, 86400))
34
+ end unless method_defined?(:to_datetime)
35
+
36
+ # Ruby 1.8-cvs and early 1.9 series define private Time#to_date
37
+ %w(to_time to_date to_datetime).each do |method|
38
+ if private_instance_methods.include?(method) || private_instance_methods.include?(method.to_sym)
39
+ public method
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,62 @@
1
+ require 'time_freeze/time_extensions'
2
+
3
+ module TimeFreeze
4
+
5
+ @@frozen_time = nil
6
+
7
+ def self.frozen_time
8
+ @@frozen_time
9
+ end
10
+
11
+ def self.frozen_time=(value)
12
+ @@frozen_time = value
13
+ end
14
+
15
+ def self.freeze!(frozen_time=Time.now)
16
+ raise ArgumentError, "we can only freeze to a Time" unless frozen_time.is_a?(Time)
17
+ TimeFreeze.frozen_time, time_before = frozen_time, TimeFreeze.frozen_time
18
+ yield
19
+ ensure
20
+ # no matter what happens
21
+ # we need to reset this
22
+ TimeFreeze.frozen_time = time_before
23
+ end
24
+
25
+ def self.unfreeze!
26
+ self.frozen_time=nil
27
+ end
28
+
29
+ end
30
+
31
+ class << Time
32
+ alias :now_unfrozen :now
33
+ def now
34
+ if TimeFreeze.frozen_time
35
+ TimeFreeze.frozen_time.to_time
36
+ else
37
+ self.now_unfrozen
38
+ end
39
+ end
40
+ end
41
+
42
+ class << Date
43
+ alias :today_unfrozen :today
44
+ def today
45
+ if TimeFreeze.frozen_time
46
+ TimeFreeze.frozen_time.to_date
47
+ else
48
+ self.today_unfrozen
49
+ end
50
+ end
51
+ end
52
+
53
+ class << DateTime
54
+ alias :now_unfrozen :now
55
+ def now
56
+ if TimeFreeze.frozen_time
57
+ TimeFreeze.frozen_time.to_datetime
58
+ else
59
+ self.now_unfrozen
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require 'test/unit'
3
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
4
+
5
+ require 'time_freeze'
@@ -0,0 +1,95 @@
1
+ require 'test_helper'
2
+ require 'time'
3
+ require 'date'
4
+
5
+ class TimeFreezeTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @time_now = Time.now
9
+ @datetime_now = DateTime.now
10
+ @date_today = Date.today
11
+
12
+ TimeFreeze.unfreeze!
13
+ end
14
+
15
+ def test_normal_function
16
+ assert_unfrozen_time
17
+
18
+ sleep 10
19
+
20
+ assert_unfrozen_time(10)
21
+ end
22
+
23
+ def test_freeze!
24
+ time1 = Time.mktime(2001,12,30,13,45,59,999999)
25
+
26
+ assert_unfrozen_time
27
+
28
+ TimeFreeze.freeze!(time1) do
29
+ assert_frozen_time(time1)
30
+ end
31
+
32
+ assert_unfrozen_time
33
+ end
34
+
35
+ class ExampleRaisedException < Exception; end
36
+
37
+ def test_freeze_unfreezes_after_exception
38
+ time1 = Time.mktime(2001,12,30,13,45,59,999999)
39
+
40
+ assert_unfrozen_time
41
+
42
+ begin
43
+ TimeFreeze.freeze!(time1) do
44
+
45
+ assert_frozen_time(time1)
46
+
47
+ raise ExampleRaisedException
48
+
49
+ flunk "we seem to have resumed after the raise"
50
+ end
51
+
52
+ rescue ExampleRaisedException
53
+
54
+ assert_unfrozen_time
55
+
56
+ end
57
+
58
+ assert_unfrozen_time
59
+ end
60
+
61
+ def test_nested_freeze
62
+ time1 = Time.mktime(2001,12,30,13,45,59,999999)
63
+ time2 = Time.mktime(2015,03,16,23,22,13,764282)
64
+
65
+ assert_unfrozen_time
66
+
67
+ TimeFreeze.freeze!(time1) do
68
+ assert_frozen_time(time1)
69
+
70
+ TimeFreeze.freeze!(time2) do
71
+ assert_frozen_time(time2)
72
+ end
73
+
74
+ assert_frozen_time(time1)
75
+ end
76
+
77
+ assert_unfrozen_time
78
+ end
79
+
80
+ def assert_frozen_time(expected_time)
81
+ assert_equal TimeFreeze.frozen_time, expected_time
82
+ assert_equal expected_time, Time.now
83
+ assert_equal expected_time.to_datetime, DateTime.now
84
+ assert_equal expected_time.to_date, Date.today
85
+ end
86
+
87
+ def assert_unfrozen_time(offset=0)
88
+ assert_in_delta offset, Time.now - @time_now, 0.5
89
+ assert_in_delta offset*DateTime::SECONDS_IN_DAY, DateTime.now - @datetime_now, 0.5*DateTime::SECONDS_IN_DAY
90
+
91
+ assert_equal @date_today, Date.today
92
+ end
93
+
94
+ end
95
+
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: time_freeze
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Matthew Rudy Jacobs
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-02 00:00:00 +08:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description:
23
+ email: MatthewRudyJacobs@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - test/test_helper.rb
32
+ - test/time_freeze_test.rb
33
+ - lib/time_freeze/time_extensions.rb
34
+ - lib/time_freeze.rb
35
+ has_rdoc: true
36
+ homepage: http://yoursite.example.com
37
+ licenses: []
38
+
39
+ post_install_message:
40
+ rdoc_options: []
41
+
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ hash: 3
50
+ segments:
51
+ - 0
52
+ version: "0"
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ requirements: []
63
+
64
+ rubyforge_project:
65
+ rubygems_version: 1.3.7
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: The simplest possible way to freeze time
69
+ test_files: []
70
+