rufus-scheduler 3.0.0 → 3.0.9
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 +63 -0
- data/CREDITS.txt +16 -0
- data/LICENSE.txt +1 -1
- data/README.md +389 -7
- data/Rakefile +0 -1
- data/TODO.txt +4 -0
- data/lib/rufus/scheduler/cronline.rb +109 -28
- data/lib/rufus/scheduler/job_array.rb +8 -1
- data/lib/rufus/scheduler/jobs.rb +127 -43
- data/lib/rufus/scheduler/locks.rb +95 -0
- data/lib/rufus/scheduler/util.rb +39 -28
- data/lib/rufus/scheduler.rb +150 -46
- data/rufus-scheduler.gemspec +2 -1
- data/spec/basics_spec.rb +54 -0
- data/spec/cronline_spec.rb +349 -92
- data/spec/error_spec.rb +30 -7
- data/spec/job_array_spec.rb +2 -2
- data/spec/job_at_spec.rb +4 -4
- data/spec/job_cron_spec.rb +42 -3
- data/spec/job_every_spec.rb +24 -5
- data/spec/job_interval_spec.rb +5 -5
- data/spec/job_repeat_spec.rb +86 -38
- data/spec/job_spec.rb +172 -55
- data/spec/lock_custom_spec.rb +47 -0
- data/spec/lock_flock_spec.rb +47 -0
- data/spec/{lockfile_spec.rb → lock_lockfile_spec.rb} +5 -5
- data/spec/lock_spec.rb +59 -0
- data/spec/parse_spec.rb +138 -76
- data/spec/schedule_at_spec.rb +46 -17
- data/spec/schedule_cron_spec.rb +6 -6
- data/spec/schedule_every_spec.rb +12 -12
- data/spec/schedule_in_spec.rb +8 -8
- data/spec/schedule_interval_spec.rb +13 -13
- data/spec/scheduler_spec.rb +213 -119
- data/spec/spec_helper.rb +62 -1
- data/spec/threads_spec.rb +24 -3
- metadata +58 -37
data/spec/scheduler_spec.rb
CHANGED
|
@@ -20,26 +20,33 @@ describe Rufus::Scheduler do
|
|
|
20
20
|
t[:name] == "rufus_scheduler_#{scheduler.object_id}_scheduler"
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
t[:rufus_scheduler].
|
|
23
|
+
expect(t[:rufus_scheduler]).to eq(scheduler)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
it 'sets
|
|
26
|
+
it 'sets :name and :rufus_scheduler in the scheduler thread local vars' do
|
|
27
27
|
|
|
28
28
|
scheduler = Rufus::Scheduler.new
|
|
29
|
+
|
|
30
|
+
expect(scheduler.thread[:name]).to eq(
|
|
31
|
+
"rufus_scheduler_#{scheduler.object_id}_scheduler"
|
|
32
|
+
)
|
|
33
|
+
expect(scheduler.thread[:rufus_scheduler]).to eq(
|
|
34
|
+
scheduler
|
|
35
|
+
)
|
|
29
36
|
end
|
|
30
37
|
|
|
31
38
|
it 'accepts a :frequency => integer option' do
|
|
32
39
|
|
|
33
40
|
scheduler = Rufus::Scheduler.new(:frequency => 2)
|
|
34
41
|
|
|
35
|
-
scheduler.frequency.
|
|
42
|
+
expect(scheduler.frequency).to eq(2)
|
|
36
43
|
end
|
|
37
44
|
|
|
38
45
|
it 'accepts a :frequency => "2h1m" option' do
|
|
39
46
|
|
|
40
47
|
scheduler = Rufus::Scheduler.new(:frequency => '2h1m')
|
|
41
48
|
|
|
42
|
-
scheduler.frequency.
|
|
49
|
+
expect(scheduler.frequency).to eq(3600 * 2 + 60)
|
|
43
50
|
end
|
|
44
51
|
|
|
45
52
|
it 'accepts a :thread_name option' do
|
|
@@ -48,7 +55,7 @@ describe Rufus::Scheduler do
|
|
|
48
55
|
|
|
49
56
|
t = Thread.list.find { |t| t[:name] == 'oliphant' }
|
|
50
57
|
|
|
51
|
-
t[:rufus_scheduler].
|
|
58
|
+
expect(t[:rufus_scheduler]).to eq(scheduler)
|
|
52
59
|
end
|
|
53
60
|
|
|
54
61
|
#it 'accepts a :min_work_threads option' do
|
|
@@ -60,7 +67,7 @@ describe Rufus::Scheduler do
|
|
|
60
67
|
|
|
61
68
|
scheduler = Rufus::Scheduler.new(:max_work_threads => 9)
|
|
62
69
|
|
|
63
|
-
scheduler.max_work_threads.
|
|
70
|
+
expect(scheduler.max_work_threads).to eq(9)
|
|
64
71
|
end
|
|
65
72
|
end
|
|
66
73
|
|
|
@@ -80,7 +87,7 @@ describe Rufus::Scheduler do
|
|
|
80
87
|
|
|
81
88
|
sleep 0.4
|
|
82
89
|
|
|
83
|
-
j.
|
|
90
|
+
expect(j).to eq(job)
|
|
84
91
|
end
|
|
85
92
|
|
|
86
93
|
it 'passes the trigger time as second block argument' do
|
|
@@ -90,7 +97,7 @@ describe Rufus::Scheduler do
|
|
|
90
97
|
|
|
91
98
|
sleep 0.4
|
|
92
99
|
|
|
93
|
-
t.class.
|
|
100
|
+
expect(t.class).to eq(Time)
|
|
94
101
|
end
|
|
95
102
|
|
|
96
103
|
class MyHandler
|
|
@@ -111,7 +118,7 @@ describe Rufus::Scheduler do
|
|
|
111
118
|
|
|
112
119
|
sleep 0.4
|
|
113
120
|
|
|
114
|
-
mh.counter.
|
|
121
|
+
expect(mh.counter).to eq(1)
|
|
115
122
|
end
|
|
116
123
|
|
|
117
124
|
class MyOtherHandler
|
|
@@ -130,7 +137,7 @@ describe Rufus::Scheduler do
|
|
|
130
137
|
|
|
131
138
|
sleep 0.4
|
|
132
139
|
|
|
133
|
-
job.handler.counter.
|
|
140
|
+
expect(job.handler.counter).to eq(1)
|
|
134
141
|
end
|
|
135
142
|
|
|
136
143
|
it 'accepts a class as callable' do
|
|
@@ -145,16 +152,16 @@ describe Rufus::Scheduler do
|
|
|
145
152
|
|
|
146
153
|
sleep 0.4
|
|
147
154
|
|
|
148
|
-
job.handler.value.
|
|
155
|
+
expect(job.handler.value).to eq(7)
|
|
149
156
|
end
|
|
150
157
|
|
|
151
158
|
it 'raises if the scheduler is shutting down' do
|
|
152
159
|
|
|
153
160
|
@scheduler.shutdown
|
|
154
161
|
|
|
155
|
-
|
|
162
|
+
expect {
|
|
156
163
|
@scheduler.in('0s') { puts 'hhhhhhhhhhhello!!' }
|
|
157
|
-
}.
|
|
164
|
+
}.to raise_error(Rufus::Scheduler::NotRunningError)
|
|
158
165
|
end
|
|
159
166
|
end
|
|
160
167
|
|
|
@@ -191,23 +198,23 @@ describe Rufus::Scheduler do
|
|
|
191
198
|
|
|
192
199
|
j = @scheduler.schedule '1s' do; end
|
|
193
200
|
|
|
194
|
-
j.class.
|
|
195
|
-
j.original.
|
|
201
|
+
expect(j.class).to eq(Rufus::Scheduler::InJob)
|
|
202
|
+
expect(j.original).to eq('1s')
|
|
196
203
|
end
|
|
197
204
|
|
|
198
205
|
it 'accepts a point in time and schedules an AtJob' do
|
|
199
206
|
|
|
200
207
|
j = @scheduler.schedule '2070/12/24 23:00' do; end
|
|
201
208
|
|
|
202
|
-
j.class.
|
|
203
|
-
j.next_time.strftime('%Y %m %d').
|
|
209
|
+
expect(j.class).to eq(Rufus::Scheduler::AtJob)
|
|
210
|
+
expect(j.next_time.strftime('%Y %m %d')).to eq('2070 12 24')
|
|
204
211
|
end
|
|
205
212
|
|
|
206
213
|
it 'accepts a cron string and schedules a CronJob' do
|
|
207
214
|
|
|
208
215
|
j = @scheduler.schedule '* * * * *' do; end
|
|
209
216
|
|
|
210
|
-
j.class.
|
|
217
|
+
expect(j.class).to eq(Rufus::Scheduler::CronJob)
|
|
211
218
|
end
|
|
212
219
|
end
|
|
213
220
|
|
|
@@ -217,14 +224,14 @@ describe Rufus::Scheduler do
|
|
|
217
224
|
|
|
218
225
|
j = @scheduler.repeat '1s' do; end
|
|
219
226
|
|
|
220
|
-
j.class.
|
|
227
|
+
expect(j.class).to eq(Rufus::Scheduler::EveryJob)
|
|
221
228
|
end
|
|
222
229
|
|
|
223
230
|
it 'accepts a cron string and schedules a CronJob' do
|
|
224
231
|
|
|
225
232
|
j = @scheduler.repeat '* * * * *' do; end
|
|
226
233
|
|
|
227
|
-
j.class.
|
|
234
|
+
expect(j.class).to eq(Rufus::Scheduler::CronJob)
|
|
228
235
|
end
|
|
229
236
|
end
|
|
230
237
|
|
|
@@ -234,22 +241,22 @@ describe Rufus::Scheduler do
|
|
|
234
241
|
|
|
235
242
|
job = @scheduler.schedule_in '10d' do; end
|
|
236
243
|
|
|
237
|
-
job.unscheduled_at.
|
|
244
|
+
expect(job.unscheduled_at).to eq(nil)
|
|
238
245
|
|
|
239
246
|
@scheduler.unschedule(job.id)
|
|
240
247
|
|
|
241
|
-
job.unscheduled_at.
|
|
248
|
+
expect(job.unscheduled_at).not_to eq(nil)
|
|
242
249
|
end
|
|
243
250
|
|
|
244
251
|
it 'accepts jobs' do
|
|
245
252
|
|
|
246
253
|
job = @scheduler.schedule_in '10d' do; end
|
|
247
254
|
|
|
248
|
-
job.unscheduled_at.
|
|
255
|
+
expect(job.unscheduled_at).to eq(nil)
|
|
249
256
|
|
|
250
257
|
@scheduler.unschedule(job)
|
|
251
258
|
|
|
252
|
-
job.unscheduled_at.
|
|
259
|
+
expect(job.unscheduled_at).not_to eq(nil)
|
|
253
260
|
end
|
|
254
261
|
|
|
255
262
|
it 'carefully unschedules repeat jobs' do
|
|
@@ -267,7 +274,7 @@ describe Rufus::Scheduler do
|
|
|
267
274
|
@scheduler.unschedule(job)
|
|
268
275
|
|
|
269
276
|
sleep 1.5
|
|
270
|
-
counter.
|
|
277
|
+
expect(counter).to eq(c)
|
|
271
278
|
end
|
|
272
279
|
end
|
|
273
280
|
|
|
@@ -275,7 +282,7 @@ describe Rufus::Scheduler do
|
|
|
275
282
|
|
|
276
283
|
it 'returns the uptime as a float' do
|
|
277
284
|
|
|
278
|
-
@scheduler.uptime.
|
|
285
|
+
expect(@scheduler.uptime).to be >= 0.0
|
|
279
286
|
end
|
|
280
287
|
end
|
|
281
288
|
|
|
@@ -285,7 +292,7 @@ describe Rufus::Scheduler do
|
|
|
285
292
|
|
|
286
293
|
sleep 1
|
|
287
294
|
|
|
288
|
-
@scheduler.uptime_s.
|
|
295
|
+
expect(@scheduler.uptime_s).to match(/^[12]s\d+$/)
|
|
289
296
|
end
|
|
290
297
|
end
|
|
291
298
|
|
|
@@ -295,13 +302,13 @@ describe Rufus::Scheduler do
|
|
|
295
302
|
|
|
296
303
|
t = Thread.new { @scheduler.join; Thread.current['a'] = 'over' }
|
|
297
304
|
|
|
298
|
-
t['a'].
|
|
305
|
+
expect(t['a']).to eq(nil)
|
|
299
306
|
|
|
300
307
|
@scheduler.shutdown
|
|
301
308
|
|
|
302
309
|
sleep(1)
|
|
303
310
|
|
|
304
|
-
t['a'].
|
|
311
|
+
expect(t['a']).to eq('over')
|
|
305
312
|
end
|
|
306
313
|
end
|
|
307
314
|
|
|
@@ -309,7 +316,7 @@ describe Rufus::Scheduler do
|
|
|
309
316
|
|
|
310
317
|
it 'returns nil if there is no corresponding Job instance' do
|
|
311
318
|
|
|
312
|
-
@scheduler.job('nada').
|
|
319
|
+
expect(@scheduler.job('nada')).to eq(nil)
|
|
313
320
|
end
|
|
314
321
|
|
|
315
322
|
it 'returns the corresponding Job instance' do
|
|
@@ -318,7 +325,7 @@ describe Rufus::Scheduler do
|
|
|
318
325
|
|
|
319
326
|
sleep(1) # give it some time to get scheduled
|
|
320
327
|
|
|
321
|
-
@scheduler.job(job_id).job_id.
|
|
328
|
+
expect(@scheduler.job(job_id).job_id).to eq(job_id)
|
|
322
329
|
end
|
|
323
330
|
end
|
|
324
331
|
|
|
@@ -348,7 +355,7 @@ describe Rufus::Scheduler do
|
|
|
348
355
|
|
|
349
356
|
it 'just lists the main thread (scheduler thread) when no job is scheduled' do
|
|
350
357
|
|
|
351
|
-
@scheduler.threads.
|
|
358
|
+
expect(@scheduler.threads).to eq([ @scheduler.thread ])
|
|
352
359
|
end
|
|
353
360
|
|
|
354
361
|
it 'lists all the threads a scheduler uses' do
|
|
@@ -359,51 +366,39 @@ describe Rufus::Scheduler do
|
|
|
359
366
|
|
|
360
367
|
sleep 0.4
|
|
361
368
|
|
|
362
|
-
@scheduler.threads.size.
|
|
369
|
+
expect(@scheduler.threads.size).to eq(2)
|
|
363
370
|
end
|
|
364
371
|
end
|
|
365
372
|
|
|
366
|
-
describe '#work_threads(:all)' do
|
|
373
|
+
describe '#work_threads(:all | :vacant)' do
|
|
367
374
|
|
|
368
375
|
it 'returns an empty array when the scheduler has not yet done anything' do
|
|
369
376
|
|
|
370
|
-
@scheduler.work_threads.
|
|
377
|
+
expect(@scheduler.work_threads).to eq([])
|
|
378
|
+
expect(@scheduler.work_threads(:all)).to eq([])
|
|
379
|
+
expect(@scheduler.work_threads(:vacant)).to eq([])
|
|
371
380
|
end
|
|
372
381
|
|
|
373
|
-
it 'lists
|
|
382
|
+
it 'lists the [vacant] work threads in the pool' do
|
|
374
383
|
|
|
375
384
|
@scheduler.in '0s' do
|
|
376
|
-
|
|
385
|
+
sleep(0.2)
|
|
377
386
|
end
|
|
378
387
|
@scheduler.in '0s' do
|
|
379
|
-
sleep(2)
|
|
388
|
+
sleep(2.0)
|
|
380
389
|
end
|
|
381
390
|
|
|
382
|
-
sleep 0.
|
|
383
|
-
|
|
384
|
-
@scheduler.work_threads.size.should == 2
|
|
385
|
-
end
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
describe '#work_threads(:vacant)' do
|
|
389
|
-
|
|
390
|
-
it 'returns an empty array when the scheduler has not yet done anything' do
|
|
391
|
-
|
|
392
|
-
@scheduler.work_threads(:vacant).should == []
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
it 'lists all the work threads in the pool' do
|
|
391
|
+
sleep 0.7
|
|
396
392
|
|
|
397
|
-
@scheduler.
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
393
|
+
if @scheduler.work_threads.size == 1
|
|
394
|
+
expect(@scheduler.work_threads.size).to eq(1)
|
|
395
|
+
expect(@scheduler.work_threads(:all).size).to eq(1)
|
|
396
|
+
expect(@scheduler.work_threads(:vacant).size).to eq(0)
|
|
397
|
+
else
|
|
398
|
+
expect(@scheduler.work_threads.size).to eq(2)
|
|
399
|
+
expect(@scheduler.work_threads(:all).size).to eq(2)
|
|
400
|
+
expect(@scheduler.work_threads(:vacant).size).to eq(1)
|
|
402
401
|
end
|
|
403
|
-
|
|
404
|
-
sleep 0.4
|
|
405
|
-
|
|
406
|
-
@scheduler.work_threads(:vacant).size.should == 1
|
|
407
402
|
end
|
|
408
403
|
end
|
|
409
404
|
|
|
@@ -411,7 +406,7 @@ describe Rufus::Scheduler do
|
|
|
411
406
|
|
|
412
407
|
it 'returns [] when there are no jobs running' do
|
|
413
408
|
|
|
414
|
-
@scheduler.work_threads(:active).
|
|
409
|
+
expect(@scheduler.work_threads(:active)).to eq([])
|
|
415
410
|
end
|
|
416
411
|
|
|
417
412
|
it 'returns the list of threads of the running jobs' do
|
|
@@ -423,14 +418,14 @@ describe Rufus::Scheduler do
|
|
|
423
418
|
|
|
424
419
|
sleep 0.4
|
|
425
420
|
|
|
426
|
-
@scheduler.work_threads(:active).size.
|
|
421
|
+
expect(@scheduler.work_threads(:active).size).to eq(1)
|
|
427
422
|
|
|
428
423
|
t = @scheduler.work_threads(:active).first
|
|
429
424
|
|
|
430
|
-
t.class.
|
|
431
|
-
t[@scheduler.thread_key].
|
|
432
|
-
t[:rufus_scheduler_job].
|
|
433
|
-
t[:rufus_scheduler_time].
|
|
425
|
+
expect(t.class).to eq(Thread)
|
|
426
|
+
expect(t[@scheduler.thread_key]).to eq(true)
|
|
427
|
+
expect(t[:rufus_scheduler_job]).to eq(job)
|
|
428
|
+
expect(t[:rufus_scheduler_time]).not_to eq(nil)
|
|
434
429
|
end
|
|
435
430
|
|
|
436
431
|
it 'does not return threads from other schedulers' do
|
|
@@ -444,7 +439,7 @@ describe Rufus::Scheduler do
|
|
|
444
439
|
|
|
445
440
|
sleep 0.4
|
|
446
441
|
|
|
447
|
-
scheduler.work_threads(:active).
|
|
442
|
+
expect(scheduler.work_threads(:active)).to eq([])
|
|
448
443
|
|
|
449
444
|
scheduler.shutdown
|
|
450
445
|
end
|
|
@@ -452,7 +447,7 @@ describe Rufus::Scheduler do
|
|
|
452
447
|
|
|
453
448
|
#describe '#min_work_threads' do
|
|
454
449
|
# it 'returns the min job thread count' do
|
|
455
|
-
# @scheduler.min_work_threads.should ==
|
|
450
|
+
# @scheduler.min_work_threads.should == 3
|
|
456
451
|
# end
|
|
457
452
|
#end
|
|
458
453
|
#describe '#min_work_threads=' do
|
|
@@ -466,7 +461,7 @@ describe Rufus::Scheduler do
|
|
|
466
461
|
|
|
467
462
|
it 'returns the max job thread count' do
|
|
468
463
|
|
|
469
|
-
@scheduler.max_work_threads.
|
|
464
|
+
expect(@scheduler.max_work_threads).to eq(28)
|
|
470
465
|
end
|
|
471
466
|
end
|
|
472
467
|
|
|
@@ -476,7 +471,7 @@ describe Rufus::Scheduler do
|
|
|
476
471
|
|
|
477
472
|
@scheduler.max_work_threads = 14
|
|
478
473
|
|
|
479
|
-
@scheduler.max_work_threads.
|
|
474
|
+
expect(@scheduler.max_work_threads).to eq(14)
|
|
480
475
|
end
|
|
481
476
|
end
|
|
482
477
|
|
|
@@ -504,7 +499,7 @@ describe Rufus::Scheduler do
|
|
|
504
499
|
|
|
505
500
|
it 'returns [] when there are no running jobs' do
|
|
506
501
|
|
|
507
|
-
@scheduler.running_jobs.
|
|
502
|
+
expect(@scheduler.running_jobs).to eq([])
|
|
508
503
|
end
|
|
509
504
|
|
|
510
505
|
it 'returns a list of running Job instances' do
|
|
@@ -516,8 +511,8 @@ describe Rufus::Scheduler do
|
|
|
516
511
|
|
|
517
512
|
sleep 0.4
|
|
518
513
|
|
|
519
|
-
job.running
|
|
520
|
-
@scheduler.running_jobs.
|
|
514
|
+
expect(job.running?).to eq(true)
|
|
515
|
+
expect(@scheduler.running_jobs).to eq([ job ])
|
|
521
516
|
end
|
|
522
517
|
|
|
523
518
|
it 'does not return twice the same job' do
|
|
@@ -529,8 +524,8 @@ describe Rufus::Scheduler do
|
|
|
529
524
|
|
|
530
525
|
sleep 1.5
|
|
531
526
|
|
|
532
|
-
job.running
|
|
533
|
-
@scheduler.running_jobs.
|
|
527
|
+
expect(job.running?).to eq(true)
|
|
528
|
+
expect(@scheduler.running_jobs).to eq([ job ])
|
|
534
529
|
end
|
|
535
530
|
end
|
|
536
531
|
|
|
@@ -545,14 +540,87 @@ describe Rufus::Scheduler do
|
|
|
545
540
|
sleep 3
|
|
546
541
|
end
|
|
547
542
|
|
|
548
|
-
sleep 0.
|
|
543
|
+
sleep 0.49
|
|
549
544
|
|
|
550
|
-
@scheduler.running_jobs(:tag => 't0').map(&:original).
|
|
545
|
+
expect(@scheduler.running_jobs(:tag => 't0').map(&:original)).to eq(
|
|
551
546
|
%w[ 0.1s ]
|
|
552
|
-
|
|
547
|
+
)
|
|
548
|
+
expect(@scheduler.running_jobs(:tag => 't1').map(&:original)).to eq(
|
|
553
549
|
%w[ 0.2s ]
|
|
554
|
-
|
|
550
|
+
)
|
|
551
|
+
expect(@scheduler.running_jobs(:tags => %w[ t0 t1 ]).map(&:original)).to eq(
|
|
555
552
|
[]
|
|
553
|
+
)
|
|
554
|
+
end
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
describe '#occurrences(time0, time1)' do
|
|
558
|
+
|
|
559
|
+
it 'returns a { job => [ times ] } of job occurrences' do
|
|
560
|
+
|
|
561
|
+
j0 = @scheduler.schedule_in '7m' do; end
|
|
562
|
+
j1 = @scheduler.schedule_at '10m' do; end
|
|
563
|
+
j2 = @scheduler.schedule_every '5m' do; end
|
|
564
|
+
j3 = @scheduler.schedule_interval '5m' do; end
|
|
565
|
+
j4 = @scheduler.schedule_cron '* * * * *' do; end
|
|
566
|
+
|
|
567
|
+
h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 11 * 60)
|
|
568
|
+
|
|
569
|
+
expect(h.size).to eq(5)
|
|
570
|
+
expect(h[j0]).to eq([ j0.next_time ])
|
|
571
|
+
expect(h[j1]).to eq([ j1.next_time ])
|
|
572
|
+
expect(h[j2].size).to eq(2)
|
|
573
|
+
expect(h[j3].size).to eq(2)
|
|
574
|
+
expect(h[j4].size).to eq(7)
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
it 'returns a [ [ time, job ], ... ] of job occurrences when :timeline' do
|
|
578
|
+
|
|
579
|
+
j0 = @scheduler.schedule_in '5m' do; end
|
|
580
|
+
j1 = @scheduler.schedule_in '10m' do; end
|
|
581
|
+
|
|
582
|
+
a =
|
|
583
|
+
@scheduler.occurrences(Time.now + 4 * 60, Time.now + 11 * 60, :timeline)
|
|
584
|
+
|
|
585
|
+
expect(a[0][0]).to be_within_1s_of(Time.now + 5 * 60)
|
|
586
|
+
expect(a[0][1]).to eq(j0)
|
|
587
|
+
expect(a[1][0]).to be_within_1s_of(Time.now + 10 * 60)
|
|
588
|
+
expect(a[1][1]).to eq(j1)
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it 'respects :first_at for repeat jobs' do
|
|
592
|
+
|
|
593
|
+
j0 = @scheduler.schedule_every '5m', :first_in => '10m' do; end
|
|
594
|
+
|
|
595
|
+
h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 16 * 60)
|
|
596
|
+
|
|
597
|
+
expect(h[j0][0]).to be_within_1s_of(Time.now + 10 * 60)
|
|
598
|
+
expect(h[j0][1]).to be_within_1s_of(Time.now + 15 * 60)
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
it 'respects :times for repeat jobs' do
|
|
602
|
+
|
|
603
|
+
j0 = @scheduler.schedule_every '1m', :times => 10 do; end
|
|
604
|
+
|
|
605
|
+
h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 16 * 60)
|
|
606
|
+
|
|
607
|
+
expect(h[j0].size).to eq(6)
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
describe '#timeline(time0, time1)' do
|
|
612
|
+
|
|
613
|
+
it 'returns a [ [ time, job ], ... ] of job occurrences' do
|
|
614
|
+
|
|
615
|
+
j0 = @scheduler.schedule_in '5m' do; end
|
|
616
|
+
j1 = @scheduler.schedule_in '10m' do; end
|
|
617
|
+
|
|
618
|
+
a = @scheduler.timeline(Time.now + 4 * 60, Time.now + 11 * 60)
|
|
619
|
+
|
|
620
|
+
expect(a[0][0]).to be_within_1s_of(Time.now + 5 * 60)
|
|
621
|
+
expect(a[0][1]).to eq(j0)
|
|
622
|
+
expect(a[1][0]).to be_within_1s_of(Time.now + 10 * 60)
|
|
623
|
+
expect(a[1][1]).to eq(j1)
|
|
556
624
|
end
|
|
557
625
|
end
|
|
558
626
|
|
|
@@ -566,7 +634,7 @@ describe Rufus::Scheduler do
|
|
|
566
634
|
|
|
567
635
|
@scheduler.shutdown
|
|
568
636
|
|
|
569
|
-
@scheduler.uptime.
|
|
637
|
+
expect(@scheduler.uptime).to eq(nil)
|
|
570
638
|
end
|
|
571
639
|
|
|
572
640
|
it 'shuts the scheduler down' do
|
|
@@ -580,14 +648,14 @@ describe Rufus::Scheduler do
|
|
|
580
648
|
t[:name] == "rufus_scheduler_#{@scheduler.object_id}"
|
|
581
649
|
}
|
|
582
650
|
|
|
583
|
-
t.
|
|
651
|
+
expect(t).to eq(nil)
|
|
584
652
|
end
|
|
585
653
|
|
|
586
654
|
it 'has a #stop alias' do
|
|
587
655
|
|
|
588
656
|
@scheduler.stop
|
|
589
657
|
|
|
590
|
-
@scheduler.uptime.
|
|
658
|
+
expect(@scheduler.uptime).to eq(nil)
|
|
591
659
|
end
|
|
592
660
|
|
|
593
661
|
#it 'has a #close alias'
|
|
@@ -608,10 +676,10 @@ describe Rufus::Scheduler do
|
|
|
608
676
|
|
|
609
677
|
@scheduler.shutdown(:wait)
|
|
610
678
|
|
|
611
|
-
counter.
|
|
612
|
-
@scheduler.uptime.
|
|
613
|
-
@scheduler.running_jobs.
|
|
614
|
-
@scheduler.threads.
|
|
679
|
+
expect(counter).to eq(1)
|
|
680
|
+
expect(@scheduler.uptime).to eq(nil)
|
|
681
|
+
expect(@scheduler.running_jobs).to eq([])
|
|
682
|
+
expect(@scheduler.threads).to eq([])
|
|
615
683
|
end
|
|
616
684
|
end
|
|
617
685
|
|
|
@@ -636,10 +704,10 @@ describe Rufus::Scheduler do
|
|
|
636
704
|
|
|
637
705
|
sleep 1.4
|
|
638
706
|
|
|
639
|
-
counter.
|
|
640
|
-
@scheduler.uptime.
|
|
641
|
-
@scheduler.running_jobs.
|
|
642
|
-
@scheduler.threads.
|
|
707
|
+
expect(counter).to eq(0)
|
|
708
|
+
expect(@scheduler.uptime).to eq(nil)
|
|
709
|
+
expect(@scheduler.running_jobs).to eq([])
|
|
710
|
+
expect(@scheduler.threads).to eq([])
|
|
643
711
|
end
|
|
644
712
|
end
|
|
645
713
|
|
|
@@ -653,7 +721,7 @@ describe Rufus::Scheduler do
|
|
|
653
721
|
|
|
654
722
|
sleep(3)
|
|
655
723
|
|
|
656
|
-
job.last_time.
|
|
724
|
+
expect(job.last_time).to eq(nil)
|
|
657
725
|
end
|
|
658
726
|
end
|
|
659
727
|
|
|
@@ -668,7 +736,7 @@ describe Rufus::Scheduler do
|
|
|
668
736
|
@scheduler.resume
|
|
669
737
|
sleep(2)
|
|
670
738
|
|
|
671
|
-
job.last_time.
|
|
739
|
+
expect(job.last_time).not_to eq(nil)
|
|
672
740
|
end
|
|
673
741
|
end
|
|
674
742
|
|
|
@@ -677,17 +745,40 @@ describe Rufus::Scheduler do
|
|
|
677
745
|
it 'returns true if the scheduler is paused' do
|
|
678
746
|
|
|
679
747
|
@scheduler.pause
|
|
680
|
-
@scheduler.paused
|
|
748
|
+
expect(@scheduler.paused?).to eq(true)
|
|
681
749
|
end
|
|
682
750
|
|
|
683
751
|
it 'returns false if the scheduler is not paused' do
|
|
684
752
|
|
|
685
|
-
@scheduler.paused
|
|
753
|
+
expect(@scheduler.paused?).to eq(false)
|
|
686
754
|
|
|
687
755
|
@scheduler.pause
|
|
688
756
|
@scheduler.resume
|
|
689
757
|
|
|
690
|
-
@scheduler.paused
|
|
758
|
+
expect(@scheduler.paused?).to eq(false)
|
|
759
|
+
end
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
describe '#down?' do
|
|
763
|
+
|
|
764
|
+
it 'returns true when the scheduler is down' do
|
|
765
|
+
|
|
766
|
+
@scheduler.shutdown
|
|
767
|
+
|
|
768
|
+
expect(@scheduler.down?).to eq(true)
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
it 'returns false when the scheduler is up' do
|
|
772
|
+
|
|
773
|
+
expect(@scheduler.down?).to eq(false)
|
|
774
|
+
end
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
describe '#up?' do
|
|
778
|
+
|
|
779
|
+
it 'returns true when the scheduler is up' do
|
|
780
|
+
|
|
781
|
+
expect(@scheduler.up?).to eq(true)
|
|
691
782
|
end
|
|
692
783
|
end
|
|
693
784
|
|
|
@@ -699,7 +790,7 @@ describe Rufus::Scheduler do
|
|
|
699
790
|
|
|
700
791
|
it 'is empty at the beginning' do
|
|
701
792
|
|
|
702
|
-
@scheduler.jobs.
|
|
793
|
+
expect(@scheduler.jobs).to eq([])
|
|
703
794
|
end
|
|
704
795
|
|
|
705
796
|
it 'returns the list of scheduled jobs' do
|
|
@@ -711,7 +802,7 @@ describe Rufus::Scheduler do
|
|
|
711
802
|
|
|
712
803
|
jobs = @scheduler.jobs
|
|
713
804
|
|
|
714
|
-
jobs.collect { |j| j.original }.sort.
|
|
805
|
+
expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 10d 1w ])
|
|
715
806
|
end
|
|
716
807
|
|
|
717
808
|
it 'returns all the jobs (even those pending reschedule)' do
|
|
@@ -722,7 +813,7 @@ describe Rufus::Scheduler do
|
|
|
722
813
|
|
|
723
814
|
sleep 0.4
|
|
724
815
|
|
|
725
|
-
@scheduler.jobs.size.
|
|
816
|
+
expect(@scheduler.jobs.size).to eq(1)
|
|
726
817
|
end
|
|
727
818
|
|
|
728
819
|
it 'does not return unscheduled jobs' do
|
|
@@ -736,7 +827,7 @@ describe Rufus::Scheduler do
|
|
|
736
827
|
|
|
737
828
|
job.unschedule
|
|
738
829
|
|
|
739
|
-
@scheduler.jobs.size.
|
|
830
|
+
expect(@scheduler.jobs.size).to eq(0)
|
|
740
831
|
end
|
|
741
832
|
end
|
|
742
833
|
|
|
@@ -744,8 +835,8 @@ describe Rufus::Scheduler do
|
|
|
744
835
|
|
|
745
836
|
it 'returns [] when there are no jobs with the corresponding tag' do
|
|
746
837
|
|
|
747
|
-
@scheduler.jobs(:tag => 'nada').
|
|
748
|
-
@scheduler.jobs(:tags => %w[ nada hello ]).
|
|
838
|
+
expect(@scheduler.jobs(:tag => 'nada')).to eq([])
|
|
839
|
+
expect(@scheduler.jobs(:tags => %w[ nada hello ])).to eq([])
|
|
749
840
|
end
|
|
750
841
|
|
|
751
842
|
it 'returns the jobs with the corresponding tag' do
|
|
@@ -754,12 +845,15 @@ describe Rufus::Scheduler do
|
|
|
754
845
|
@scheduler.every '2h', :tag => %w[ t0 t1 ] do; end
|
|
755
846
|
@scheduler.every '3h' do; end
|
|
756
847
|
|
|
757
|
-
@scheduler.jobs(:tags => 't0').map(&:original).sort.
|
|
848
|
+
expect(@scheduler.jobs(:tags => 't0').map(&:original).sort).to eq(
|
|
758
849
|
%w[ 10d 2h ]
|
|
759
|
-
|
|
850
|
+
)
|
|
851
|
+
expect(@scheduler.jobs(:tags => 't1').map(&:original).sort).to eq(
|
|
760
852
|
%w[ 2h ]
|
|
761
|
-
|
|
853
|
+
)
|
|
854
|
+
expect(@scheduler.jobs(:tags => [ 't1', 't0' ]).map(&:original).sort).to eq(
|
|
762
855
|
%w[ 2h ]
|
|
856
|
+
)
|
|
763
857
|
end
|
|
764
858
|
end
|
|
765
859
|
|
|
@@ -773,7 +867,7 @@ describe Rufus::Scheduler do
|
|
|
773
867
|
|
|
774
868
|
jobs = @scheduler.every_jobs
|
|
775
869
|
|
|
776
|
-
jobs.collect { |j| j.original }.sort.
|
|
870
|
+
expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 5m ])
|
|
777
871
|
end
|
|
778
872
|
end
|
|
779
873
|
|
|
@@ -787,7 +881,7 @@ describe Rufus::Scheduler do
|
|
|
787
881
|
|
|
788
882
|
jobs = @scheduler.at_jobs
|
|
789
883
|
|
|
790
|
-
jobs.collect { |j| j.original }.sort.
|
|
884
|
+
expect(jobs.collect { |j| j.original }.sort).to eq([ '2030/12/12 12:10:00' ])
|
|
791
885
|
end
|
|
792
886
|
end
|
|
793
887
|
|
|
@@ -801,7 +895,7 @@ describe Rufus::Scheduler do
|
|
|
801
895
|
|
|
802
896
|
jobs = @scheduler.in_jobs
|
|
803
897
|
|
|
804
|
-
jobs.collect { |j| j.original }.sort.
|
|
898
|
+
expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 10d ])
|
|
805
899
|
end
|
|
806
900
|
end
|
|
807
901
|
|
|
@@ -816,7 +910,7 @@ describe Rufus::Scheduler do
|
|
|
816
910
|
|
|
817
911
|
jobs = @scheduler.cron_jobs
|
|
818
912
|
|
|
819
|
-
jobs.collect { |j| j.original }.sort.
|
|
913
|
+
expect(jobs.collect { |j| j.original }.sort).to eq([ '* * * * *' ])
|
|
820
914
|
end
|
|
821
915
|
end
|
|
822
916
|
|
|
@@ -832,7 +926,7 @@ describe Rufus::Scheduler do
|
|
|
832
926
|
|
|
833
927
|
jobs = @scheduler.interval_jobs
|
|
834
928
|
|
|
835
|
-
jobs.collect { |j| j.original }.sort.
|
|
929
|
+
expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 7m ])
|
|
836
930
|
end
|
|
837
931
|
end
|
|
838
932
|
|
|
@@ -857,7 +951,7 @@ describe Rufus::Scheduler do
|
|
|
857
951
|
|
|
858
952
|
sleep 0.7
|
|
859
953
|
|
|
860
|
-
$out.
|
|
954
|
+
expect($out).to eq([ "pre #{job_id}", job_id ])
|
|
861
955
|
end
|
|
862
956
|
|
|
863
957
|
it 'accepts the job and the triggerTime as argument' do
|
|
@@ -874,9 +968,9 @@ describe Rufus::Scheduler do
|
|
|
874
968
|
|
|
875
969
|
sleep 0.7
|
|
876
970
|
|
|
877
|
-
$tt.class.
|
|
878
|
-
$tt.
|
|
879
|
-
$tt.
|
|
971
|
+
expect($tt.class).to eq(Time)
|
|
972
|
+
expect($tt).to be > start
|
|
973
|
+
expect($tt).to be < Time.now
|
|
880
974
|
end
|
|
881
975
|
|
|
882
976
|
context 'when it returns false' do
|
|
@@ -897,7 +991,7 @@ describe Rufus::Scheduler do
|
|
|
897
991
|
|
|
898
992
|
sleep 0.7
|
|
899
993
|
|
|
900
|
-
$out.
|
|
994
|
+
expect($out).to eq([ "pre #{job_id}" ])
|
|
901
995
|
end
|
|
902
996
|
end
|
|
903
997
|
end
|
|
@@ -919,7 +1013,7 @@ describe Rufus::Scheduler do
|
|
|
919
1013
|
|
|
920
1014
|
sleep 0.7
|
|
921
1015
|
|
|
922
|
-
$out.
|
|
1016
|
+
expect($out).to eq([ job_id, "post #{job_id}" ])
|
|
923
1017
|
end
|
|
924
1018
|
end
|
|
925
1019
|
|
|
@@ -939,8 +1033,8 @@ describe Rufus::Scheduler do
|
|
|
939
1033
|
s0 = Rufus::Scheduler.singleton
|
|
940
1034
|
s1 = Rufus::Scheduler.s
|
|
941
1035
|
|
|
942
|
-
s0.class.
|
|
943
|
-
s1.object_id.
|
|
1036
|
+
expect(s0.class).to eq(Rufus::Scheduler)
|
|
1037
|
+
expect(s1.object_id).to eq(s0.object_id)
|
|
944
1038
|
end
|
|
945
1039
|
|
|
946
1040
|
it 'accepts initialization parameters' do
|
|
@@ -948,7 +1042,7 @@ describe Rufus::Scheduler do
|
|
|
948
1042
|
s = Rufus::Scheduler.singleton(:max_work_threads => 77)
|
|
949
1043
|
s = Rufus::Scheduler.singleton(:max_work_threads => 42)
|
|
950
1044
|
|
|
951
|
-
s.max_work_threads.
|
|
1045
|
+
expect(s.max_work_threads).to eq(77)
|
|
952
1046
|
end
|
|
953
1047
|
end
|
|
954
1048
|
end
|