timecop 0.8.0 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6e96be7760b99a2b26e5d68800d2980190fe22c2
4
- data.tar.gz: 9c55cc8abe218ff8dd6035452ffe5e1056d592a4
2
+ SHA256:
3
+ metadata.gz: 778eafd7d7e50dcf0aa223c181fdc6155955ecd2ab47abf996204dddec6362d5
4
+ data.tar.gz: 4e54ef041daff39c88d6363a2de8843bfaa9ce44bdc1f515f1c7d236ff15b689
5
5
  SHA512:
6
- metadata.gz: 6f5b765cd3bc5ead77b8947e18d8230f164a1b4655f26ccc73bc7715a70666bf6e623a8567274fda5b375955f30a7bbeb825921fa24c2bb046de9cd8b26df429
7
- data.tar.gz: 2170ebdcf36371775b6b2abd27faf6ed435ba3d7469c405d8dbda47328622a9375b847de7663e25ff23a6dd8fbddc64012246f4127752a21a143d87458ee0f94
6
+ metadata.gz: a2caa5c9934809e05002b813b5907c0761886c937444b769531b13d19e443f9a73756ae4713569db03e4f75f20b7563550813cd1e3b3026f26ad8e3fd74cfd25
7
+ data.tar.gz: a984ade8c2067409acb19b65f85d042d9208fa31df66a38c21787e741ba2cb24fc87946fa11609bb2f62fdbd7bc7bb9fe195034ed6dcd5c152bd457f1b1638dd
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2012 — Travis Jeffery, John Trupiano
3
+ Copyright (c) 2019 — Travis Jeffery, John Trupiano
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
data/README.markdown CHANGED
@@ -1,6 +1,6 @@
1
1
  # timecop
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/travisjeffery/timecop.png)](http://travis-ci.org/travisjeffery/timecop)
3
+ [![Build Status](https://secure.travis-ci.org/travisjeffery/timecop.svg)](http://travis-ci.org/travisjeffery/timecop)
4
4
 
5
5
  ## DESCRIPTION
6
6
 
@@ -104,7 +104,7 @@ being able to simulate activity via subsequent calls to your application.
104
104
  Timecop.scale(3600)
105
105
  Time.now
106
106
  # => 2012-09-20 21:23:25 -0500
107
- # seconds later, hours have past it's gone from 9pm at night to 6am in the morning
107
+ # seconds later, hours have passed and it's gone from 9pm at night to 6am in the morning
108
108
  Time.now
109
109
  # => 2012-09-21 06:22:59 -0500
110
110
  ```
@@ -128,6 +128,12 @@ Timecop.freeze
128
128
  # => Timecop::SafeModeException: Safe mode is enabled, only calls passing a block are allowed.
129
129
  ```
130
130
 
131
+ ### Rails v Ruby Date/Time libraries
132
+
133
+ Sometimes [Rails Date/Time methods don't play nicely with Ruby Date/Time methods.](https://rails.lighthouseapp.com/projects/8994/tickets/6410-dateyesterday-datetoday)
134
+
135
+ Be careful mixing Ruby `Date.today` with Rails `Date.tomorrow` / `Date.yesterday` as things might break.
136
+
131
137
  ## Contribute
132
138
 
133
139
  timecop is maintained by [travisjeffery](http://github.com/travisjeffery), and
data/Rakefile CHANGED
@@ -3,8 +3,6 @@ require 'bundler/gem_tasks'
3
3
  require 'rake/testtask'
4
4
  require 'rdoc/task'
5
5
 
6
- $LOAD_PATH.unshift("lib")
7
-
8
6
  Rake::RDocTask.new do |rdoc|
9
7
  if File.exist?('VERSION')
10
8
  version = File.read('VERSION')
@@ -21,7 +19,15 @@ Rake::RDocTask.new do |rdoc|
21
19
  end
22
20
 
23
21
  task :test do
24
- system "cd test && ./run_tests.sh" or fail
22
+ failed = Dir["test/*_test.rb"].map do |test|
23
+ command = "ruby #{test}"
24
+ puts
25
+ puts command
26
+ command unless system(command)
27
+ end.compact
28
+ if failed.any?
29
+ abort "#{failed.count} Tests failed\n#{failed.join("\n")}"
30
+ end
25
31
  end
26
32
 
27
33
  desc 'Default: run tests'
@@ -27,19 +27,8 @@ class Time #:nodoc:
27
27
  end
28
28
 
29
29
  class Date #:nodoc:
30
- WEEKDAYS = {
31
- "sunday" => 0,
32
- "monday" => 1,
33
- "tuesday" => 2,
34
- "wednesday" => 3,
35
- "thursday" => 4,
36
- "friday" => 5,
37
- "saturday" => 6
38
- }
39
-
40
30
  class << self
41
31
  def mock_date
42
- mocked_time_stack_item = Timecop.top_stack_item
43
32
  mocked_time_stack_item.nil? ? nil : mocked_time_stack_item.date(self)
44
33
  end
45
34
 
@@ -59,32 +48,67 @@ class Date #:nodoc:
59
48
  "supports Date::ITALY for the start argument."
60
49
  end
61
50
 
62
- Time.strptime(str, fmt).to_date
51
+ d = Date._strptime(str, fmt) || Date.strptime_without_mock_date(str, fmt)
52
+ now = Time.now.to_date
53
+ year = d[:year] || now.year
54
+ mon = d[:mon] || now.mon
55
+ if d[:mday]
56
+ Date.new(year, mon, d[:mday])
57
+ elsif d[:wday]
58
+ Date.new(year, mon, now.mday) + (d[:wday] - now.wday)
59
+ elsif d[:yday]
60
+ Date.new(year).next_day(d[:yday] - 1)
61
+ elsif d[:cwyear] && d[:cweek]
62
+ if d[:cwday]
63
+ Date.commercial(d[:cwyear], d[:cweek], d[:cwday])
64
+ else
65
+ Date.commercial(d[:cwyear], d[:cweek])
66
+ end
67
+ elsif d[:seconds]
68
+ Time.at(d[:seconds]).to_date
69
+ else
70
+ Date.new(year, mon)
71
+ end
63
72
  end
64
73
 
65
74
  alias_method :strptime, :strptime_with_mock_date
66
75
 
67
76
  def parse_with_mock_date(*args)
68
- str = args.first
69
- if str && WEEKDAYS.keys.include?(str.downcase)
70
- offset = WEEKDAYS[str.downcase] - Date.today.wday
71
-
72
- Date.today + offset
77
+ parsed_date = parse_without_mock_date(*args)
78
+ return parsed_date unless mocked_time_stack_item
79
+ date_hash = Date._parse(*args)
80
+
81
+ case
82
+ when date_hash[:year] && date_hash[:mon]
83
+ parsed_date
84
+ when date_hash[:mon] && date_hash[:mday]
85
+ Date.new(mocked_time_stack_item.year, date_hash[:mon], date_hash[:mday])
86
+ when date_hash[:wday]
87
+ closest_wday(date_hash[:wday])
73
88
  else
74
- parse_without_mock_date(*args)
89
+ parsed_date + mocked_time_stack_item.travel_offset_days
75
90
  end
76
91
  end
77
92
 
78
93
  alias_method :parse_without_mock_date, :parse
79
94
  alias_method :parse, :parse_with_mock_date
80
95
 
96
+ def mocked_time_stack_item
97
+ Timecop.top_stack_item
98
+ end
99
+
100
+ def closest_wday(wday)
101
+ today = Date.today
102
+ result = today - today.wday
103
+ result += 1 until wday == result.wday
104
+ result
105
+ end
81
106
  end
82
107
  end
83
108
 
84
109
  class DateTime #:nodoc:
85
110
  class << self
86
111
  def mock_time
87
- mocked_time_stack_item = Timecop.top_stack_item
88
112
  mocked_time_stack_item.nil? ? nil : mocked_time_stack_item.datetime(self)
89
113
  end
90
114
 
@@ -97,19 +121,28 @@ class DateTime #:nodoc:
97
121
  alias_method :now, :now_with_mock_time
98
122
 
99
123
  def parse_with_mock_date(*args)
100
- str = args.first
101
- if str && Date::WEEKDAYS.keys.include?(str.downcase)
102
- offset = Date::WEEKDAYS[str.downcase] - DateTime.now.wday
103
-
104
- parsed_weekday =(DateTime.now + offset)
105
-
106
- DateTime.new(parsed_weekday.year, parsed_weekday.month, parsed_weekday.day, 0, 0, 0, 0)
124
+ date_hash = Date._parse(*args)
125
+ parsed_date = parse_without_mock_date(*args)
126
+ return parsed_date unless mocked_time_stack_item
127
+ date_hash = DateTime._parse(*args)
128
+
129
+ case
130
+ when date_hash[:year] && date_hash[:mon]
131
+ parsed_date
132
+ when date_hash[:mon] && date_hash[:mday]
133
+ DateTime.new(mocked_time_stack_item.year, date_hash[:mon], date_hash[:mday])
134
+ when date_hash[:wday]
135
+ Date.closest_wday(date_hash[:wday]).to_datetime
107
136
  else
108
- parse_without_mock_date(*args)
137
+ parsed_date + mocked_time_stack_item.travel_offset_days
109
138
  end
110
139
  end
111
140
 
112
141
  alias_method :parse_without_mock_date, :parse
113
142
  alias_method :parse, :parse_with_mock_date
143
+
144
+ def mocked_time_stack_item
145
+ Timecop.top_stack_item
146
+ end
114
147
  end
115
148
  end
@@ -43,7 +43,11 @@ class Timecop
43
43
  end
44
44
 
45
45
  def travel_offset
46
- @travel_offset
46
+ @travel_offset unless mock_type == :freeze
47
+ end
48
+
49
+ def travel_offset_days
50
+ (@travel_offset / 60 / 60 / 24).round
47
51
  end
48
52
 
49
53
  def scaling_factor
@@ -52,7 +56,7 @@ class Timecop
52
56
 
53
57
  def time(time_klass = Time) #:nodoc:
54
58
  if @time.respond_to?(:in_time_zone)
55
- time = time_klass.at(@time.dup.utc.to_r)
59
+ time = time_klass.at(@time.dup.localtime)
56
60
  else
57
61
  time = time_klass.at(@time)
58
62
  end
@@ -60,7 +64,7 @@ class Timecop
60
64
  if travel_offset.nil?
61
65
  time
62
66
  elsif scaling_factor.nil?
63
- time_klass.at((Time.now_without_mock_time + travel_offset).to_f)
67
+ time_klass.at(Time.now_without_mock_time + travel_offset)
64
68
  else
65
69
  time_klass.at(scaled_time)
66
70
  end
@@ -101,13 +105,13 @@ class Timecop
101
105
  time_klass.at(arg.to_time.to_f).getlocal
102
106
  elsif Object.const_defined?(:Date) && arg.is_a?(Date)
103
107
  time_klass.local(arg.year, arg.month, arg.day, 0, 0, 0)
104
- elsif args.empty? && arg.kind_of?(Integer)
105
- Time.now + arg
108
+ elsif args.empty? && (arg.kind_of?(Integer) || arg.kind_of?(Float))
109
+ time_klass.now + arg
106
110
  elsif arg.nil?
107
- Time.now
111
+ time_klass.now
108
112
  else
109
113
  if arg.is_a?(String) && Time.respond_to?(:parse)
110
- Time.parse(arg)
114
+ time_klass.parse(arg)
111
115
  else
112
116
  # we'll just assume it's a list of y/m/d/h/m/s
113
117
  year = arg || 2000
@@ -122,7 +126,6 @@ class Timecop
122
126
  end
123
127
 
124
128
  def compute_travel_offset
125
- return nil if mock_type == :freeze
126
129
  time - Time.now_without_mock_time
127
130
  end
128
131
 
@@ -1,5 +1,4 @@
1
1
  require 'singleton'
2
- require File.join(File.dirname(__FILE__), "time_extensions")
3
2
  require File.join(File.dirname(__FILE__), "time_stack_item")
4
3
 
5
4
  # Timecop
@@ -93,6 +92,7 @@ class Timecop
93
92
  nil
94
93
  end
95
94
  end
95
+ alias :unfreeze :return
96
96
 
97
97
  def return_to_baseline
98
98
  instance.send(:return_to_baseline)
@@ -100,7 +100,7 @@ class Timecop
100
100
  end
101
101
 
102
102
  def top_stack_item #:nodoc:
103
- instance.instance_variable_get(:@_stack).last
103
+ instance.send(:stack).last
104
104
  end
105
105
 
106
106
  def safe_mode=(safe)
@@ -111,9 +111,17 @@ class Timecop
111
111
  @safe_mode ||= false
112
112
  end
113
113
 
114
+ def thread_safe=(t)
115
+ instance.send(:thread_safe=, t)
116
+ end
117
+
118
+ def thread_safe
119
+ instance.send(:thread_safe)
120
+ end
121
+
114
122
  # Returns whether or not Timecop is currently frozen/travelled
115
123
  def frozen?
116
- !instance.instance_variable_get(:@_stack).empty?
124
+ !instance.send(:stack).empty?
117
125
  end
118
126
 
119
127
  private
@@ -125,50 +133,97 @@ class Timecop
125
133
 
126
134
  private
127
135
 
128
- def baseline=(baseline)
129
- @baseline = baseline
130
- @_stack << TimeStackItem.new(:travel, baseline)
136
+ def baseline=(b)
137
+ set_baseline(b)
138
+ stack << TimeStackItem.new(:travel, b)
139
+ end
140
+
141
+ def baseline
142
+ if @thread_safe
143
+ Thread.current[:timecop_baseline]
144
+ else
145
+ @baseline
146
+ end
147
+ end
148
+
149
+ def set_baseline(b)
150
+ if @thread_safe
151
+ Thread.current[:timecop_baseline] = b
152
+ else
153
+ @baseline = b
154
+ end
155
+ end
156
+
157
+ def stack
158
+ if @thread_safe
159
+ Thread.current[:timecop_stack] ||= []
160
+ Thread.current[:timecop_stack]
161
+ else
162
+ @stack
163
+ end
164
+ end
165
+
166
+ def set_stack(s)
167
+ if @thread_safe
168
+ Thread.current[:timecop_stack] = s
169
+ else
170
+ @stack = s
171
+ end
131
172
  end
132
173
 
133
174
  def initialize #:nodoc:
134
- @_stack = []
175
+ @stack = []
176
+ @safe = nil
177
+ @thread_safe = false
178
+ end
179
+
180
+ def thread_safe=(t)
181
+ initialize
182
+ @thread_safe = t
183
+ end
184
+
185
+ def thread_safe
186
+ @thread_safe
135
187
  end
136
188
 
137
189
  def travel(mock_type, *args, &block) #:nodoc:
138
- raise SafeModeException if Timecop.safe_mode? && !block_given?
190
+ raise SafeModeException if Timecop.safe_mode? && !block_given? && !@safe
139
191
 
140
192
  stack_item = TimeStackItem.new(mock_type, *args)
141
193
 
142
- stack_backup = @_stack.dup
143
- @_stack << stack_item
194
+ stack_backup = stack.dup
195
+ stack << stack_item
144
196
 
145
197
  if block_given?
198
+ safe_backup = @safe
199
+ @safe = true
146
200
  begin
147
201
  yield stack_item.time
148
202
  ensure
149
- @_stack.replace stack_backup
203
+ stack.replace stack_backup
204
+ @safe = safe_backup
150
205
  end
151
206
  end
152
207
  end
153
208
 
154
209
  def return(&block)
155
- current_stack = @_stack
156
- current_baseline = @baseline
210
+ current_stack = stack
211
+ current_baseline = baseline
157
212
  unmock!
158
213
  yield
159
214
  ensure
160
- @_stack = current_stack
161
- @baseline = current_baseline
215
+ set_stack current_stack
216
+ set_baseline current_baseline
162
217
  end
163
218
 
164
219
  def unmock! #:nodoc:
165
- @baseline = nil
166
- @_stack = []
220
+ set_baseline nil
221
+ set_stack []
167
222
  end
168
223
 
169
224
  def return_to_baseline
170
- if @baseline
171
- @_stack = [@_stack.shift]
225
+ if baseline
226
+ set_stack [stack.shift]
172
227
  else
173
228
  unmock!
174
229
  end
@@ -180,3 +235,6 @@ class Timecop
180
235
  end
181
236
  end
182
237
  end
238
+
239
+ # This must be done after TimeCop is available
240
+ require File.join(File.dirname(__FILE__), "time_extensions")
@@ -1,3 +1,3 @@
1
1
  class Timecop
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.3"
3
3
  end
data/test/test_helper.rb CHANGED
@@ -1,16 +1,13 @@
1
- require 'rubygems'
2
1
  require 'bundler/setup'
3
2
  require 'minitest/autorun'
3
+ require 'minitest/rg'
4
+ require 'pry'
4
5
 
5
6
  $VERBOSE = true # enable ruby warnings
6
7
 
7
- begin
8
- require 'mocha/setup'
9
- rescue LoadError
10
- require 'mocha'
11
- end
8
+ require 'mocha/minitest'
12
9
 
13
- class Minitest::Unit::TestCase
10
+ class Minitest::Test
14
11
  private
15
12
  # Tests to see that two times are within the given distance,
16
13
  # in seconds, from each other.
@@ -32,7 +29,7 @@ class Minitest::Unit::TestCase
32
29
  Time.at(time.to_i).to_datetime.offset
33
30
  end
34
31
 
35
- TIMEZONES = ["Europe/Paris", "UTC", "America/Chicago"]
32
+ TIMEZONES = ["Pacific/Midway", "Europe/Paris", "UTC", "America/Chicago"]
36
33
 
37
34
  def each_timezone
38
35
  old_tz = ENV["TZ"]
@@ -55,4 +52,8 @@ class Minitest::Unit::TestCase
55
52
  assert_in_delta dt1.to_time.to_f, dt2.to_time.to_f, 0.01, "Failed for timezone: #{ENV['TZ']}: #{dt1.to_s} not equal to #{dt2.to_s}"
56
53
  end
57
54
 
55
+ def jruby?
56
+ RUBY_PLATFORM == "java"
57
+ end
58
+
58
59
  end
@@ -1,10 +1,10 @@
1
1
  require 'date'
2
- require File.join(File.dirname(__FILE__), "test_helper")
3
- require File.join(File.dirname(__FILE__), '..', 'lib', 'timecop')
2
+ require_relative "test_helper"
3
+ require 'timecop'
4
4
 
5
5
  require 'active_support/all'
6
6
 
7
- class TestTimeStackItem < Minitest::Unit::TestCase
7
+ class TestTimeStackItem < Minitest::Test
8
8
  def teardown
9
9
  Timecop.return
10
10
  Time.zone = nil
@@ -87,6 +87,19 @@ class TestTimeStackItem < Minitest::Unit::TestCase
87
87
  assert_equal s, stack_item.sec
88
88
  end
89
89
 
90
+ def test_new_with_float
91
+ t = Time.now
92
+ y, m, d, h, min, s = t.year, t.month, t.day, t.hour, t.min, t.sec
93
+ stack_item = Timecop::TimeStackItem.new(:freeze, 0.0)
94
+
95
+ assert_equal y, stack_item.year
96
+ assert_equal m, stack_item.month
97
+ assert_equal d, stack_item.day
98
+ assert_equal h, stack_item.hour
99
+ assert_equal min, stack_item.min
100
+ assert_equal s, stack_item.sec
101
+ end
102
+
90
103
  def test_new_with_individual_arguments
91
104
  y, m, d, h, min, s = 2008, 10, 10, 10, 10, 10
92
105
  stack_item = Timecop::TimeStackItem.new(:freeze, y, m, d, h, min, s)
@@ -168,7 +181,7 @@ class TestTimeStackItem < Minitest::Unit::TestCase
168
181
  t = Time.local(2009, 10, 1, 0, 0, 30)
169
182
  tsi = Timecop::TimeStackItem.new(:freeze, t)
170
183
 
171
- assert_equal nil, tsi.send(:travel_offset)
184
+ assert_nil tsi.send(:travel_offset)
172
185
  end
173
186
 
174
187
  def test_timezones
@@ -179,12 +192,21 @@ class TestTimeStackItem < Minitest::Unit::TestCase
179
192
  end
180
193
  end
181
194
 
195
+ def test_timezones_with_parsed_string
196
+ Time.zone = "Europe/Zurich"
197
+ time_string = "2012-12-27 12:12"
198
+ expected_time = Time.zone.parse(time_string)
199
+ Timecop.freeze(time_string) do |frozen_time|
200
+ assert_equal expected_time, frozen_time
201
+ end
202
+ end
203
+
182
204
  def test_timezones_apply_dates
183
205
  Time.zone = "Central Time (US & Canada)"
184
206
  time = Time.zone.local(2013,1,3)
185
207
 
186
208
  Timecop.freeze(time) do
187
- assert_equal time.to_date, Time.now.to_date
209
+ assert_equal time.to_date, Time.zone.now.to_date
188
210
  end
189
211
  end
190
212
 
data/test/timecop_test.rb CHANGED
@@ -1,7 +1,7 @@
1
- require File.join(File.dirname(__FILE__), "test_helper")
2
- require File.join(File.dirname(__FILE__), '..', 'lib', 'timecop')
1
+ require_relative "test_helper"
2
+ require 'timecop'
3
3
 
4
- class TestTimecop < Minitest::Unit::TestCase
4
+ class TestTimecop < Minitest::Test
5
5
  def teardown
6
6
  Timecop.return
7
7
  end
@@ -37,6 +37,12 @@ class TestTimecop < Minitest::Unit::TestCase
37
37
  assert_nil Time.send(:mock_time)
38
38
  end
39
39
 
40
+ def test_freeze_then_unfreeze_unsets_mock_time
41
+ Timecop.freeze(1)
42
+ Timecop.unfreeze
43
+ assert_nil Time.send(:mock_time)
44
+ end
45
+
40
46
  def test_travel_then_return_unsets_mock_time
41
47
  Timecop.travel(1)
42
48
  Timecop.return
@@ -251,7 +257,7 @@ class TestTimecop < Minitest::Unit::TestCase
251
257
  new_now = Time.now
252
258
  assert_times_effectively_equal(new_now, t, 1, "Looks like we failed to actually travel time")
253
259
  sleep(0.25)
254
- assert_times_effectively_not_equal new_now, Time.now, 0.25, "Looks like time is not moving"
260
+ assert_times_effectively_not_equal new_now, Time.now, 0.24, "Looks like time is not moving"
255
261
  end
256
262
  end
257
263
 
@@ -495,6 +501,18 @@ class TestTimecop < Minitest::Unit::TestCase
495
501
  end
496
502
  end
497
503
 
504
+ def test_raises_when_safe_mode_and_no_block_though_previously_block_given
505
+ Timecop.freeze do
506
+ Timecop.freeze
507
+ end
508
+
509
+ with_safe_mode do
510
+ assert_raises Timecop::SafeModeException do
511
+ Timecop.freeze
512
+ end
513
+ end
514
+ end
515
+
498
516
  def test_no_raise_when_safe_mode_and_block_used
499
517
  with_safe_mode do
500
518
  Timecop.freeze {}
@@ -507,15 +525,11 @@ class TestTimecop < Minitest::Unit::TestCase
507
525
  end
508
526
  end
509
527
 
510
- def test_date_strptime_without_year
511
- Timecop.freeze(Time.new(1984,2,28)) do
512
- assert_equal Date.strptime('04-14', '%m-%d'), Date.new(1984, 4, 14)
513
- end
514
- end
515
-
516
- def test_date_strptime_without_specifying_format
517
- Timecop.freeze(Time.new(1984,2,28)) do
518
- assert_equal Date.strptime('1999-04-14'), Date.new(1999, 4, 14)
528
+ def test_no_raise_when_safe_mode_and_no_block_and_in_block_context
529
+ with_safe_mode do
530
+ Timecop.freeze do
531
+ Timecop.freeze
532
+ end
519
533
  end
520
534
  end
521
535
 
@@ -536,6 +550,33 @@ class TestTimecop < Minitest::Unit::TestCase
536
550
  assert !Timecop.frozen?
537
551
  end
538
552
 
553
+ def test_thread_safe_timecop_in_parallel
554
+ Timecop.thread_safe = true
555
+ date = Time.local(2011, 01, 02)
556
+ thread = Thread.new do
557
+ Timecop.freeze(date) do
558
+ sleep 1 #give main thread time to run
559
+ assert_equal date, Time.now
560
+ end
561
+ end
562
+
563
+ sleep 0.25
564
+ assert Time.now != date
565
+ thread.join
566
+ ensure
567
+ Timecop.thread_safe = false
568
+ end
569
+
570
+ def test_thread_safe_timecop_returns_after_block
571
+ Timecop.thread_safe = true
572
+ date = Time.local(2017, 10, 8)
573
+
574
+ Timecop.freeze(date) { }
575
+ assert Time.now != date
576
+ ensure
577
+ Timecop.thread_safe = false
578
+ end
579
+
539
580
  private
540
581
 
541
582
  def with_safe_mode(enabled=true)
@@ -1,10 +1,8 @@
1
- require File.join(File.dirname(__FILE__), "test_helper")
2
-
3
- class TestTimecopWithoutDateButWithTime < Minitest::Unit::TestCase
4
- TIMECOP_LIB = File.join(File.dirname(__FILE__), '..', 'lib', 'timecop')
1
+ require_relative "test_helper"
2
+ require "time"
5
3
 
4
+ class TestTimecopWithoutDateButWithTime < Minitest::Test
6
5
  def test_loads_properly_when_time_is_required_instead_of_date
7
- require "time"
8
- require TIMECOP_LIB
6
+ require 'timecop'
9
7
  end
10
8
  end
@@ -1,7 +1,7 @@
1
- require File.join(File.dirname(__FILE__), "test_helper")
2
- require File.join(File.dirname(__FILE__), '..', 'lib', 'timecop')
1
+ require_relative "test_helper"
2
+ require 'timecop'
3
3
 
4
- class TestTimecopWithoutDate < Minitest::Unit::TestCase
4
+ class TestTimecopWithoutDate < Minitest::Test
5
5
 
6
6
  def setup
7
7
  Object.send(:remove_const, :Date) if Object.const_defined?(:Date)
@@ -70,7 +70,7 @@ class TestTimecopWithoutDate < Minitest::Unit::TestCase
70
70
  new_now = Time.now
71
71
  assert_times_effectively_equal new_now, t, 1, "Looks like we failed to actually travel time" # 0.1 seconds
72
72
  sleep(0.25)
73
- assert_times_effectively_not_equal new_now, Time.now, 0.25, "Looks like time is not moving"
73
+ assert_times_effectively_not_equal new_now, Time.now, 0.24, "Looks like time is not moving"
74
74
  end
75
75
  end
76
76
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timecop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Travis Jeffery
8
8
  - John Trupiano
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-28 00:00:00.000000000 Z
12
+ date: 2021-02-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A gem providing "time travel" and "time freezing" capabilities, making
15
15
  it dead simple to test time-dependent code. It provides a unified method to mock
@@ -27,37 +27,35 @@ files:
27
27
  - lib/timecop.rb
28
28
  - lib/timecop/time_extensions.rb
29
29
  - lib/timecop/time_stack_item.rb
30
- - lib/timecop/version.rb
31
30
  - lib/timecop/timecop.rb
32
- - test/run_tests.sh
31
+ - lib/timecop/version.rb
33
32
  - test/test_helper.rb
34
33
  - test/time_stack_item_test.rb
35
34
  - test/timecop_test.rb
36
- - test/timecop_without_date_test.rb
37
35
  - test/timecop_without_date_but_with_time_test.rb
36
+ - test/timecop_without_date_test.rb
38
37
  homepage: https://github.com/travisjeffery/timecop
39
38
  licenses:
40
39
  - MIT
41
40
  metadata: {}
42
- post_install_message:
41
+ post_install_message:
43
42
  rdoc_options:
44
- - --charset=UTF-8
43
+ - "--charset=UTF-8"
45
44
  require_paths:
46
45
  - lib
47
46
  required_ruby_version: !ruby/object:Gem::Requirement
48
47
  requirements:
49
- - - '>='
48
+ - - ">="
50
49
  - !ruby/object:Gem::Version
51
50
  version: 1.9.2
52
51
  required_rubygems_version: !ruby/object:Gem::Requirement
53
52
  requirements:
54
- - - '>='
53
+ - - ">="
55
54
  - !ruby/object:Gem::Version
56
55
  version: '0'
57
56
  requirements: []
58
- rubyforge_project: timecop
59
- rubygems_version: 2.0.14
60
- signing_key:
57
+ rubygems_version: 3.0.8
58
+ signing_key:
61
59
  specification_version: 3
62
60
  summary: A gem providing "time travel" and "time freezing" capabilities, making it
63
61
  dead simple to test time-dependent code. It provides a unified method to mock Time.now,
data/test/run_tests.sh DELETED
@@ -1,10 +0,0 @@
1
- #!/bin/sh
2
-
3
- FAILEDCASES=0
4
- for f in *_test.rb; do
5
- if ! ${RUBY:-ruby} -I../lib:. $f; then
6
- FAILEDCASES=`expr "$FAILEDCASES" + 1`
7
- fi
8
- done
9
- echo "$FAILEDCASES test cases had failures"
10
- exit $FAILEDCASES