rufus-scheduler 3.0.9 → 3.1.0
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.
- data/CHANGELOG.txt +7 -0
- data/CREDITS.txt +3 -0
- data/LICENSE.txt +1 -1
- data/README.md +6 -13
- data/lib/rufus/scheduler.rb +4 -3
- data/lib/rufus/scheduler/cronline.rb +78 -74
- data/lib/rufus/scheduler/job_array.rb +2 -1
- data/lib/rufus/scheduler/jobs.rb +16 -15
- data/lib/rufus/scheduler/locks.rb +1 -1
- data/lib/rufus/scheduler/util.rb +2 -25
- data/lib/rufus/scheduler/zones.rb +174 -0
- data/lib/rufus/scheduler/zotime.rb +154 -0
- data/rufus-scheduler.gemspec +2 -27
- data/spec/cronline_spec.rb +152 -103
- data/spec/job_cron_spec.rb +22 -0
- data/spec/job_every_spec.rb +14 -0
- data/spec/job_repeat_spec.rb +1 -0
- data/spec/parse_spec.rb +28 -30
- data/spec/schedule_at_spec.rb +1 -1
- data/spec/scheduler_spec.rb +4 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/zotime_spec.rb +396 -0
- metadata +15 -18
data/spec/job_cron_spec.rb
CHANGED
@@ -102,5 +102,27 @@ describe Rufus::Scheduler::CronJob do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
105
|
+
|
106
|
+
describe '.next_time' do
|
107
|
+
|
108
|
+
it 'returns the next trigger time' do
|
109
|
+
|
110
|
+
n = Time.now
|
111
|
+
nt = Time.parse("#{n.year}-#{n.month + 1}-01")
|
112
|
+
|
113
|
+
expect(
|
114
|
+
@scheduler.schedule_cron('* * 1 * *', lambda {}).next_time
|
115
|
+
).to eq(nt)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'returns the next trigger time (first_at => Time)' do
|
119
|
+
|
120
|
+
ft = Time.parse('2100-12-31')
|
121
|
+
|
122
|
+
job = @scheduler.schedule_cron('* * 1 * *', :first_at => ft) {}
|
123
|
+
|
124
|
+
expect(job.next_time).to eq(ft)
|
125
|
+
end
|
126
|
+
end
|
105
127
|
end
|
106
128
|
|
data/spec/job_every_spec.rb
CHANGED
@@ -49,6 +49,20 @@ describe Rufus::Scheduler::EveryJob do
|
|
49
49
|
expect(times[2] - times[1]).to be < 3.4
|
50
50
|
end
|
51
51
|
|
52
|
+
context 'summer time' do
|
53
|
+
|
54
|
+
it 'triggers correctly through a DST transition' do
|
55
|
+
|
56
|
+
job = Rufus::Scheduler::EveryJob.new(@scheduler, '1m', {}, lambda {})
|
57
|
+
t1 = ltz('America/Los_Angeles', 2015, 3, 8, 1, 55)
|
58
|
+
t2 = ltz('America/Los_Angeles', 2015, 3, 8, 3, 05)
|
59
|
+
job.next_time = t1
|
60
|
+
occurrences = job.occurrences(t1, t2)
|
61
|
+
|
62
|
+
expect(occurrences.length).to eq(11)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
52
66
|
context 'first_at/in' do
|
53
67
|
|
54
68
|
it 'triggers for the first time at first_at' do
|
data/spec/job_repeat_spec.rb
CHANGED
data/spec/parse_spec.rb
CHANGED
@@ -12,53 +12,51 @@ describe Rufus::Scheduler do
|
|
12
12
|
|
13
13
|
describe '.parse' do
|
14
14
|
|
15
|
-
def
|
16
|
-
Rufus::Scheduler.parse(s, opts)
|
17
|
-
end
|
15
|
+
def pa(s, opts={}); Rufus::Scheduler.parse(s, opts); end
|
18
16
|
|
19
17
|
it 'parses duration strings' do
|
20
18
|
|
21
|
-
expect(
|
19
|
+
expect(pa('1.0d1.0w1.0d')).to eq(777600.0)
|
22
20
|
end
|
23
21
|
|
24
22
|
it 'parses datetimes' do
|
25
23
|
|
26
24
|
# local
|
27
25
|
|
28
|
-
expect(
|
26
|
+
expect(pa('Sun Nov 18 16:01:00 2012').strftime('%c')).to eq(
|
29
27
|
'Sun Nov 18 16:01:00 2012'
|
30
28
|
)
|
31
29
|
end
|
32
30
|
|
33
31
|
it 'parses datetimes with timezones' do
|
34
32
|
|
35
|
-
expect(
|
36
|
-
'Sun Nov 18
|
37
|
-
)
|
33
|
+
expect(
|
34
|
+
pa('Sun Nov 18 16:01:00 2012 Asia/Singapore').getutc.strftime('%c %z')
|
35
|
+
).to eq('Sun Nov 18 08:01:00 2012 +0000')
|
38
36
|
|
39
|
-
expect(
|
37
|
+
expect(pa('Sun Nov 18 16:01:00 2012 Zulu').getutc.strftime('%c')).to eq(
|
40
38
|
'Sun Nov 18 16:01:00 2012'
|
41
39
|
)
|
42
40
|
|
43
|
-
expect(
|
44
|
-
'Sun Nov 18
|
45
|
-
)
|
41
|
+
expect(
|
42
|
+
pa('Sun Nov 18 16:01:00 Asia/Singapore 2012').getutc.strftime('%c %z')
|
43
|
+
).to eq('Sun Nov 18 08:01:00 2012 +0000')
|
46
44
|
|
47
|
-
expect(
|
48
|
-
'Sun Nov 18
|
49
|
-
)
|
45
|
+
expect(
|
46
|
+
pa('Asia/Singapore Sun Nov 18 16:01:00 2012').getutc.strftime('%c %z')
|
47
|
+
).to eq('Sun Nov 18 08:01:00 2012 +0000')
|
50
48
|
|
51
|
-
expect(
|
52
|
-
'Sun Nov 18
|
53
|
-
)
|
49
|
+
expect(
|
50
|
+
pa('Sun Nov 18 16:01:00 2012 America/New_York').getutc.strftime('%c %z')
|
51
|
+
).to eq('Sun Nov 18 21:01:00 2012 +0000')
|
54
52
|
end
|
55
53
|
|
56
54
|
it 'parses datetimes with named timezones' do
|
57
55
|
|
58
|
-
expect(
|
56
|
+
expect(pa(
|
59
57
|
'Sun Nov 18 16:01:00 2012 Europe/Berlin'
|
60
58
|
).strftime('%c %z')).to eq(
|
61
|
-
'Sun Nov 18
|
59
|
+
'Sun Nov 18 16:01:00 2012 +0100'
|
62
60
|
)
|
63
61
|
end
|
64
62
|
|
@@ -66,32 +64,32 @@ describe Rufus::Scheduler do
|
|
66
64
|
|
67
65
|
localzone = Time.now.strftime('%z')
|
68
66
|
|
69
|
-
expect(
|
70
|
-
|
71
|
-
)
|
67
|
+
expect(
|
68
|
+
pa('Nov 18 16:01:00 2012').strftime('%c %z')
|
69
|
+
).to eq("Sun Nov 18 16:01:00 2012 #{localzone}")
|
72
70
|
end
|
73
71
|
|
74
72
|
it 'parses cronlines' do
|
75
73
|
|
76
|
-
out =
|
74
|
+
out = pa('* * * * *')
|
77
75
|
|
78
76
|
expect(out.class).to eq(Rufus::Scheduler::CronLine)
|
79
77
|
expect(out.original).to eq('* * * * *')
|
80
78
|
|
81
|
-
expect(
|
82
|
-
expect(
|
79
|
+
expect(pa('10 23 * * *').class).to eq(Rufus::Scheduler::CronLine)
|
80
|
+
expect(pa('* 23 * * *').class).to eq(Rufus::Scheduler::CronLine)
|
83
81
|
end
|
84
82
|
|
85
83
|
it 'raises on unparseable input' do
|
86
84
|
|
87
85
|
expect {
|
88
|
-
|
86
|
+
pa('nada')
|
89
87
|
}.to raise_error(ArgumentError, 'couldn\'t parse "nada"')
|
90
88
|
end
|
91
89
|
|
92
90
|
it 'does not use Chronic if not present' do
|
93
91
|
|
94
|
-
t =
|
92
|
+
t = pa('next monday 7 PM')
|
95
93
|
|
96
94
|
n = Time.now
|
97
95
|
|
@@ -104,7 +102,7 @@ describe Rufus::Scheduler do
|
|
104
102
|
|
105
103
|
with_chronic do
|
106
104
|
|
107
|
-
t =
|
105
|
+
t = pa('next monday 7 PM')
|
108
106
|
|
109
107
|
expect(t.wday).to eq(1)
|
110
108
|
expect(t.hour).to eq(19)
|
@@ -117,7 +115,7 @@ describe Rufus::Scheduler do
|
|
117
115
|
|
118
116
|
with_chronic do
|
119
117
|
|
120
|
-
t =
|
118
|
+
t = pa('monday', :context => :past)
|
121
119
|
|
122
120
|
expect(t.wday).to eq(1)
|
123
121
|
expect(t).to be < Time.now
|
data/spec/schedule_at_spec.rb
CHANGED
@@ -107,7 +107,7 @@ describe Rufus::Scheduler do
|
|
107
107
|
|
108
108
|
job = @scheduler.at('2050-12-12 20:30 Europe/Berlin', :job => true) {}
|
109
109
|
|
110
|
-
expect(job.time.strftime('%c %z')).to eq('Mon Dec 12
|
110
|
+
expect(job.time.strftime('%c %z')).to eq('Mon Dec 12 20:30:00 2050 +0100')
|
111
111
|
end
|
112
112
|
|
113
113
|
it 'accepts a Chronic string (if Chronic is present)' do
|
data/spec/scheduler_spec.rb
CHANGED
@@ -602,7 +602,10 @@ describe Rufus::Scheduler do
|
|
602
602
|
|
603
603
|
j0 = @scheduler.schedule_every '1m', :times => 10 do; end
|
604
604
|
|
605
|
-
|
605
|
+
t0 = Time.parse((Time.now + 5 * 60).strftime('%Y-%m-%d %H:%M:01'))
|
606
|
+
t1 = t0 + 12 * 60 - 1
|
607
|
+
|
608
|
+
h = @scheduler.occurrences(t0, t1)
|
606
609
|
|
607
610
|
expect(h[j0].size).to eq(6)
|
608
611
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -107,7 +107,7 @@ RSpec::Matchers.define :be_within_1s_of do |expected|
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
|
110
|
+
failure_message do |actual|
|
111
111
|
|
112
112
|
if actual.respond_to?(:asctime)
|
113
113
|
"expected #{actual.inspect} to be within 1 second of #{expected}"
|
data/spec/zotime_spec.rb
ADDED
@@ -0,0 +1,396 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Specifying rufus-scheduler
|
4
|
+
#
|
5
|
+
# Wed Mar 11 21:17:36 JST 2015, quatre ans...
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'spec_helper'
|
9
|
+
|
10
|
+
|
11
|
+
describe Rufus::Scheduler::ZoTime do
|
12
|
+
|
13
|
+
describe '.new' do
|
14
|
+
|
15
|
+
it 'accepts an integer' do
|
16
|
+
|
17
|
+
zt = Rufus::Scheduler::ZoTime.new(1234567890, 'America/Los_Angeles')
|
18
|
+
|
19
|
+
expect(zt.seconds.to_i).to eq(1234567890)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'accepts a float' do
|
23
|
+
|
24
|
+
zt = Rufus::Scheduler::ZoTime.new(1234567890.1234, 'America/Los_Angeles')
|
25
|
+
|
26
|
+
expect(zt.seconds.to_i).to eq(1234567890)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'accepts a Time instance' do
|
30
|
+
|
31
|
+
zt =
|
32
|
+
Rufus::Scheduler::ZoTime.new(
|
33
|
+
Time.utc(2007, 11, 1, 15, 25, 0),
|
34
|
+
'America/Los_Angeles')
|
35
|
+
|
36
|
+
expect(zt.seconds.to_i).to eq(1193930700)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#it "flips burgers" do
|
41
|
+
# puts "---"
|
42
|
+
# t0 = ltz('America/New_York', 2004, 10, 31, 0, 30, 0)
|
43
|
+
# t1 = ltz('America/New_York', 2004, 10, 31, 1, 30, 0)
|
44
|
+
# p t0
|
45
|
+
# p t1
|
46
|
+
# puts "---"
|
47
|
+
# zt0 = Rufus::Scheduler::ZoTime.new(t0, 'America/New_York')
|
48
|
+
# zt1 = Rufus::Scheduler::ZoTime.new(t1, 'America/New_York')
|
49
|
+
# p zt0.time
|
50
|
+
# p zt1.time
|
51
|
+
# puts "---"
|
52
|
+
# zt0.add(3600)
|
53
|
+
# p [ zt0.time, zt0.time.zone ]
|
54
|
+
# p [ zt1.time, zt1.time.zone ]
|
55
|
+
# #puts "---"
|
56
|
+
# #zt0.add(3600)
|
57
|
+
# #zt1.add(3600)
|
58
|
+
# #p [ zt0.time, zt0.time.zone ]
|
59
|
+
# #p [ zt1.time, zt1.time.zone ]
|
60
|
+
#end
|
61
|
+
|
62
|
+
describe '#time' do
|
63
|
+
|
64
|
+
it 'returns a Time instance in with the right offset' do
|
65
|
+
|
66
|
+
zt = Rufus::Scheduler::ZoTime.new(1193898300, 'America/Los_Angeles')
|
67
|
+
t = zt.time
|
68
|
+
|
69
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z')
|
70
|
+
).to eq('2007/10/31 23:25:00 PDT')
|
71
|
+
end
|
72
|
+
|
73
|
+
# New York EST: UTC-5
|
74
|
+
# summer (dst) EDT: UTC-4
|
75
|
+
|
76
|
+
it 'chooses the non DST time when there is ambiguity' do
|
77
|
+
|
78
|
+
t = ltz('America/New_York', 2004, 10, 31, 0, 30, 0)
|
79
|
+
zt = Rufus::Scheduler::ZoTime.new(t, 'America/New_York')
|
80
|
+
zt.add(3600)
|
81
|
+
ztt = zt.time
|
82
|
+
|
83
|
+
expect(ztt.to_i).to eq(1099204200)
|
84
|
+
|
85
|
+
if ruby18?
|
86
|
+
expect(ztt.strftime('%Y/%m/%d %H:%M:%S %Z %z')
|
87
|
+
).to eq('2004/10/31 01:30:00 EST -0500')
|
88
|
+
else
|
89
|
+
expect(ztt.strftime('%Y/%m/%d %H:%M:%S %Z %z')
|
90
|
+
).to eq('2004/10/31 01:30:00 EST -0500')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#utc' do
|
96
|
+
|
97
|
+
it 'returns an UTC Time instance' do
|
98
|
+
|
99
|
+
zt = Rufus::Scheduler::ZoTime.new(1193898300, 'America/Los_Angeles')
|
100
|
+
t = zt.utc
|
101
|
+
|
102
|
+
expect(t.to_i).to eq(1193898300)
|
103
|
+
|
104
|
+
if ruby18?
|
105
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z')
|
106
|
+
).to eq('2007/11/01 06:25:00 GMT +0000')
|
107
|
+
else
|
108
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z')
|
109
|
+
).to eq('2007/11/01 06:25:00 UTC +0000')
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#add' do
|
115
|
+
|
116
|
+
it 'adds seconds' do
|
117
|
+
|
118
|
+
zt = Rufus::Scheduler::ZoTime.new(1193898300, 'Europe/Paris')
|
119
|
+
zt.add(111)
|
120
|
+
|
121
|
+
expect(zt.seconds).to eq(1193898300 + 111)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'goes into DST' do
|
125
|
+
|
126
|
+
zt =
|
127
|
+
Rufus::Scheduler::ZoTime.new(
|
128
|
+
Time.gm(2015, 3, 8, 9, 59, 59),
|
129
|
+
'America/Los_Angeles')
|
130
|
+
|
131
|
+
t0 = zt.time
|
132
|
+
zt.add(1)
|
133
|
+
t1 = zt.time
|
134
|
+
|
135
|
+
st0 = t0.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t0.isdst}"
|
136
|
+
st1 = t1.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t1.isdst}"
|
137
|
+
|
138
|
+
expect(t0.to_i).to eq(1425808799)
|
139
|
+
expect(t1.to_i).to eq(1425808800)
|
140
|
+
expect(st0).to eq('2015/03/08 01:59:59 PST false')
|
141
|
+
expect(st1).to eq('2015/03/08 03:00:00 PDT true')
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'goes out of DST' do
|
145
|
+
|
146
|
+
zt =
|
147
|
+
Rufus::Scheduler::ZoTime.new(
|
148
|
+
ltz('Europe/Berlin', 2014, 10, 26, 01, 59, 59),
|
149
|
+
'Europe/Berlin')
|
150
|
+
|
151
|
+
t0 = zt.time
|
152
|
+
zt.add(1)
|
153
|
+
t1 = zt.time
|
154
|
+
zt.add(3600)
|
155
|
+
t2 = zt.time
|
156
|
+
zt.add(1)
|
157
|
+
t3 = zt.time
|
158
|
+
|
159
|
+
st0 = t0.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t0.isdst}"
|
160
|
+
st1 = t1.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t1.isdst}"
|
161
|
+
st2 = t2.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t2.isdst}"
|
162
|
+
st3 = t3.strftime('%Y/%m/%d %H:%M:%S %Z') + " #{t3.isdst}"
|
163
|
+
|
164
|
+
expect(t0.to_i).to eq(1414281599)
|
165
|
+
expect(t1.to_i).to eq(1414285200)
|
166
|
+
expect(t2.to_i).to eq(1414285200)
|
167
|
+
expect(t3.to_i).to eq(1414285201)
|
168
|
+
|
169
|
+
expect(st0).to eq('2014/10/26 01:59:59 CEST true')
|
170
|
+
expect(st1).to eq('2014/10/26 02:00:00 CET false')
|
171
|
+
expect(st2).to eq('2014/10/26 02:00:00 CET false')
|
172
|
+
expect(st3).to eq('2014/10/26 02:00:01 CET false')
|
173
|
+
|
174
|
+
expect(t1 - t0).to eq(3601)
|
175
|
+
expect(t2 - t1).to eq(0)
|
176
|
+
expect(t3 - t2).to eq(1)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe '#to_f' do
|
181
|
+
|
182
|
+
it 'returns the @seconds' do
|
183
|
+
|
184
|
+
zt = Rufus::Scheduler::ZoTime.new(1193898300, 'Europe/Paris')
|
185
|
+
|
186
|
+
expect(zt.to_f).to eq(1193898300)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe '.envtzable?' do
|
191
|
+
|
192
|
+
def etza?(s); Rufus::Scheduler::ZoTime.envtzable?(s); end
|
193
|
+
|
194
|
+
it 'matches' do
|
195
|
+
|
196
|
+
expect(etza?('Asia/Tokyo')).to eq(true)
|
197
|
+
expect(etza?('America/Los_Angeles')).to eq(true)
|
198
|
+
expect(etza?('Europe/Paris')).to eq(true)
|
199
|
+
expect(etza?('UTC')).to eq(true)
|
200
|
+
|
201
|
+
expect(etza?('Japan')).to eq(true)
|
202
|
+
expect(etza?('Turkey')).to eq(true)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'does not match' do
|
206
|
+
|
207
|
+
expect(etza?('14:00')).to eq(false)
|
208
|
+
expect(etza?('14:00:14')).to eq(false)
|
209
|
+
expect(etza?('2014/12/11')).to eq(false)
|
210
|
+
expect(etza?('2014-12-11')).to eq(false)
|
211
|
+
expect(etza?('+25:00')).to eq(false)
|
212
|
+
|
213
|
+
expect(etza?('+09:00')).to eq(false)
|
214
|
+
expect(etza?('-01:30')).to eq(false)
|
215
|
+
expect(etza?('-0200')).to eq(false)
|
216
|
+
|
217
|
+
expect(etza?('Wed')).to eq(false)
|
218
|
+
expect(etza?('Sun')).to eq(false)
|
219
|
+
expect(etza?('Nov')).to eq(false)
|
220
|
+
|
221
|
+
expect(etza?('PST')).to eq(false)
|
222
|
+
expect(etza?('Z')).to eq(false)
|
223
|
+
|
224
|
+
expect(etza?('YTC')).to eq(false)
|
225
|
+
expect(etza?('Asia/Paris')).to eq(false)
|
226
|
+
expect(etza?('Nada/Nada')).to eq(false)
|
227
|
+
end
|
228
|
+
|
229
|
+
#it 'returns true for all entries in the tzinfo list' do
|
230
|
+
# File.readlines(
|
231
|
+
# File.join(File.dirname(__FILE__), '../misc/tz_all.txt')
|
232
|
+
# ).each do |tz|
|
233
|
+
# tz = tz.strip
|
234
|
+
# if tz.length > 0 && tz.match(/^[^#]/)
|
235
|
+
# p tz
|
236
|
+
# expect(llat?(tz)).to eq(true)
|
237
|
+
# end
|
238
|
+
# end
|
239
|
+
#end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe '.is_timezone?' do
|
243
|
+
|
244
|
+
def is_timezone?(o); Rufus::Scheduler::ZoTime.is_timezone?(o); end
|
245
|
+
|
246
|
+
it 'returns true when passed a string describing a timezone' do
|
247
|
+
|
248
|
+
expect(is_timezone?('Asia/Tokyo')).to eq(true)
|
249
|
+
expect(is_timezone?('Europe/Paris')).to eq(true)
|
250
|
+
expect(is_timezone?('UTC')).to eq(true)
|
251
|
+
expect(is_timezone?('GMT')).to eq(true)
|
252
|
+
expect(is_timezone?('Z')).to eq(true)
|
253
|
+
expect(is_timezone?('Zulu')).to eq(true)
|
254
|
+
expect(is_timezone?('PST')).to eq(true)
|
255
|
+
expect(is_timezone?('+09:00')).to eq(true)
|
256
|
+
expect(is_timezone?('-01:30')).to eq(true)
|
257
|
+
expect(is_timezone?('Japan')).to eq(true)
|
258
|
+
expect(is_timezone?('Turkey')).to eq(true)
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'returns false when it cannot make sense of the timezone' do
|
262
|
+
|
263
|
+
expect(is_timezone?('Asia/Paris')).to eq(false)
|
264
|
+
#expect(is_timezone?('YTC')).to eq(false)
|
265
|
+
expect(is_timezone?('Nada/Nada')).to eq(false)
|
266
|
+
expect(is_timezone?('7')).to eq(false)
|
267
|
+
expect(is_timezone?('06')).to eq(false)
|
268
|
+
expect(is_timezone?('sun#3')).to eq(false)
|
269
|
+
end
|
270
|
+
|
271
|
+
#it 'returns true for all entries in the tzinfo list' do
|
272
|
+
# File.readlines(
|
273
|
+
# File.join(File.dirname(__FILE__), '../misc/tz_all.txt')
|
274
|
+
# ).each do |tz|
|
275
|
+
# tz = tz.strip
|
276
|
+
# if tz.length > 0 && tz.match(/^[^#]/)
|
277
|
+
# #p tz
|
278
|
+
# expect(is_timezone?(tz)).to eq(true)
|
279
|
+
# end
|
280
|
+
# end
|
281
|
+
#end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe '.parse' do
|
285
|
+
|
286
|
+
it 'parses a time string without a timezone' do
|
287
|
+
|
288
|
+
zt =
|
289
|
+
in_zone('Europe/Moscow') {
|
290
|
+
Rufus::Scheduler::ZoTime.parse('2015/03/08 01:59:59')
|
291
|
+
}
|
292
|
+
|
293
|
+
t = zt.time
|
294
|
+
u = zt.utc
|
295
|
+
|
296
|
+
expect(t.to_i).to eq(1425769199)
|
297
|
+
expect(u.to_i).to eq(1425769199)
|
298
|
+
|
299
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{t.isdst}"
|
300
|
+
).to eq('2015/03/08 01:59:59 MSK +0300 false')
|
301
|
+
|
302
|
+
if ruby18?
|
303
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
304
|
+
).to eq('2015/03/07 22:59:59 GMT +0000 false')
|
305
|
+
else
|
306
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
307
|
+
).to eq('2015/03/07 22:59:59 UTC +0000 false')
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'parses a time string with a full name timezone' do
|
312
|
+
|
313
|
+
zt =
|
314
|
+
Rufus::Scheduler::ZoTime.parse(
|
315
|
+
'2015/03/08 01:59:59 America/Los_Angeles')
|
316
|
+
|
317
|
+
t = zt.time
|
318
|
+
u = zt.utc
|
319
|
+
|
320
|
+
expect(t.to_i).to eq(1425808799)
|
321
|
+
expect(u.to_i).to eq(1425808799)
|
322
|
+
|
323
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{t.isdst}"
|
324
|
+
).to eq('2015/03/08 01:59:59 PST -0800 false')
|
325
|
+
|
326
|
+
if ruby18?
|
327
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
328
|
+
).to eq('2015/03/08 09:59:59 GMT +0000 false')
|
329
|
+
else
|
330
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
331
|
+
).to eq('2015/03/08 09:59:59 UTC +0000 false')
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
it 'parses a time string with a delta timezone' do
|
336
|
+
|
337
|
+
zt =
|
338
|
+
in_zone('Europe/Berlin') {
|
339
|
+
Rufus::Scheduler::ZoTime.parse('2015-12-13 12:30 -0200')
|
340
|
+
}
|
341
|
+
|
342
|
+
t = zt.time
|
343
|
+
u = zt.utc
|
344
|
+
|
345
|
+
expect(t.to_i).to eq(1450017000)
|
346
|
+
expect(u.to_i).to eq(1450017000)
|
347
|
+
|
348
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{t.isdst}"
|
349
|
+
).to eq('2015/12/13 15:30:00 CET +0100 false')
|
350
|
+
|
351
|
+
if ruby18?
|
352
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
353
|
+
).to eq('2015/12/13 14:30:00 GMT +0000 false')
|
354
|
+
else
|
355
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
356
|
+
).to eq('2015/12/13 14:30:00 UTC +0000 false')
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
it 'parses a time string with a delta (:) timezone' do
|
361
|
+
|
362
|
+
zt =
|
363
|
+
in_zone('Europe/Berlin') {
|
364
|
+
Rufus::Scheduler::ZoTime.parse('2015-12-13 12:30 -02:00')
|
365
|
+
}
|
366
|
+
|
367
|
+
t = zt.time
|
368
|
+
u = zt.utc
|
369
|
+
|
370
|
+
expect(t.to_i).to eq(1450017000)
|
371
|
+
expect(u.to_i).to eq(1450017000)
|
372
|
+
|
373
|
+
expect(t.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{t.isdst}"
|
374
|
+
).to eq('2015/12/13 15:30:00 CET +0100 false')
|
375
|
+
|
376
|
+
if ruby18?
|
377
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
378
|
+
).to eq('2015/12/13 14:30:00 GMT +0000 false')
|
379
|
+
else
|
380
|
+
expect(u.strftime('%Y/%m/%d %H:%M:%S %Z %z') + " #{u.isdst}"
|
381
|
+
).to eq('2015/12/13 14:30:00 UTC +0000 false')
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'takes the local TZ when it does not know the timezone' do
|
386
|
+
|
387
|
+
in_zone 'Europe/Moscow' do
|
388
|
+
|
389
|
+
zt = Rufus::Scheduler::ZoTime.parse('2015/03/08 01:59:59 Nada/Nada')
|
390
|
+
|
391
|
+
expect(zt.time.zone).to eq('MSK')
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|