rufus-scheduler 3.0.3 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +5 -0
- data/LICENSE.txt +1 -1
- data/README.md +7 -1
- data/lib/rufus/scheduler.rb +2 -2
- data/lib/rufus/scheduler/cronline.rb +24 -2
- data/lib/rufus/scheduler/job_array.rb +1 -1
- data/lib/rufus/scheduler/jobs.rb +6 -1
- data/lib/rufus/scheduler/util.rb +1 -1
- data/spec/cronline_spec.rb +53 -5
- data/spec/job_cron_spec.rb +39 -0
- data/spec/scheduler_spec.rb +13 -27
- metadata +3 -3
data/CHANGELOG.txt
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
= rufus-scheduler CHANGELOG.txt
|
3
3
|
|
4
4
|
|
5
|
+
== rufus-scheduler - 3.0.4 released 2014/10/19
|
6
|
+
|
7
|
+
- make CronLine#frequency faster (to avoid 20s schedule_cron times)
|
8
|
+
|
9
|
+
|
5
10
|
== rufus-scheduler - 3.0.3 released 2013/12/12
|
6
11
|
|
7
12
|
- CronLine#previous_time fix by Yassen Bantchev (https://github.com/yassenb)
|
data/LICENSE.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
Copyright (c) 2005-
|
2
|
+
Copyright (c) 2005-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -717,16 +717,22 @@ Rufus::Scheduler.parse('* * * * * *').frequency # ==> 1
|
|
717
717
|
Rufus::Scheduler.parse('5 23 * * *').frequency # ==> 24 * 3600
|
718
718
|
Rufus::Scheduler.parse('5 * * * *').frequency # ==> 3600
|
719
719
|
Rufus::Scheduler.parse('10,20,30 * * * *').frequency # ==> 600
|
720
|
+
|
721
|
+
Rufus::Scheduler.parse('10,20,30 * * * * *').frequency # ==> 10
|
720
722
|
```
|
721
723
|
|
722
724
|
It's used to determine if the job frequency is higher than the scheduler frequency (it raises an ArgumentError if that is the case).
|
723
725
|
|
726
|
+
### brute_frequency
|
727
|
+
|
728
|
+
Cron jobs also have a ```#brute_frequency``` method that looks a one year of intervals to determine the shortest delta for the cron. This method can take between 20 to 50 seconds for cron lines that go the second level. ```#frequency``` above, when encountering second level cron lines will take a shortcut to answer as quickly as possible with a usable value.
|
729
|
+
|
724
730
|
|
725
731
|
## looking up jobs
|
726
732
|
|
727
733
|
### Scheduler#job(job_id)
|
728
734
|
|
729
|
-
The scheduler
|
735
|
+
The scheduler ```#job(job_id)``` method can be used to lookup Job instances.
|
730
736
|
|
731
737
|
```ruby
|
732
738
|
require 'rufus-scheduler'
|
data/lib/rufus/scheduler.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2006-
|
2
|
+
# Copyright (c) 2006-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -38,7 +38,7 @@ module Rufus
|
|
38
38
|
require 'rufus/scheduler/cronline'
|
39
39
|
require 'rufus/scheduler/job_array'
|
40
40
|
|
41
|
-
VERSION = '3.0.
|
41
|
+
VERSION = '3.0.4'
|
42
42
|
|
43
43
|
#
|
44
44
|
# A common error class for rufus-scheduler
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2006-
|
2
|
+
# Copyright (c) 2006-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -197,6 +197,28 @@ class Rufus::Scheduler
|
|
197
197
|
]
|
198
198
|
end
|
199
199
|
|
200
|
+
# Returns a quickly computed approximation of the frequency for this
|
201
|
+
# cron line.
|
202
|
+
#
|
203
|
+
# #brute_frequency, on the other hand, will compute the frequency by
|
204
|
+
# examining a whole, that can take more than seconds for a seconds
|
205
|
+
# level cron...
|
206
|
+
#
|
207
|
+
def frequency
|
208
|
+
|
209
|
+
return brute_frequency unless @seconds && @seconds.length > 1
|
210
|
+
|
211
|
+
delta = 60
|
212
|
+
prev = @seconds[0]
|
213
|
+
|
214
|
+
@seconds[1..-1].each do |sec|
|
215
|
+
d = sec - prev
|
216
|
+
delta = d if d < delta
|
217
|
+
end
|
218
|
+
|
219
|
+
delta
|
220
|
+
end
|
221
|
+
|
200
222
|
# Returns the shortest delta between two potential occurences of the
|
201
223
|
# schedule described by this cronline.
|
202
224
|
#
|
@@ -221,7 +243,7 @@ class Rufus::Scheduler
|
|
221
243
|
# See https://github.com/jmettraux/rufus-scheduler/issues/89
|
222
244
|
# for a discussion about this method.
|
223
245
|
#
|
224
|
-
def
|
246
|
+
def brute_frequency
|
225
247
|
|
226
248
|
delta = 366 * DAY_S
|
227
249
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2006-
|
2
|
+
# Copyright (c) 2006-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
data/lib/rufus/scheduler/jobs.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2006-
|
2
|
+
# Copyright (c) 2006-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -535,6 +535,11 @@ module Rufus
|
|
535
535
|
@cron_line.frequency
|
536
536
|
end
|
537
537
|
|
538
|
+
def brute_frequency
|
539
|
+
|
540
|
+
@cron_line.brute_frequency
|
541
|
+
end
|
542
|
+
|
538
543
|
protected
|
539
544
|
|
540
545
|
def set_next_time(is_post, trigger_time)
|
data/lib/rufus/scheduler/util.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2006-
|
2
|
+
# Copyright (c) 2006-2014, John Mettraux, jmettraux@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
data/spec/cronline_spec.rb
CHANGED
@@ -396,6 +396,23 @@ describe Rufus::Scheduler::CronLine do
|
|
396
396
|
match '* * * * sun#2,sun#3', local(1970, 1, 18)
|
397
397
|
no_match '* * * * sun#2,sun#3', local(1970, 1, 25)
|
398
398
|
end
|
399
|
+
|
400
|
+
it 'matches correctly for seconds' do
|
401
|
+
|
402
|
+
match '* * * * * *', local(1970, 1, 11)
|
403
|
+
match '* * * * * *', local(1970, 1, 11, 0, 0, 13)
|
404
|
+
end
|
405
|
+
|
406
|
+
it 'matches correctly for seconds / interval' do
|
407
|
+
|
408
|
+
match '*/2 * * * * *', local(1970, 1, 11)
|
409
|
+
match '*/5 * * * * *', local(1970, 1, 11)
|
410
|
+
match '*/5 * * * * *', local(1970, 1, 11, 0, 0, 0)
|
411
|
+
no_match '*/5 * * * * *', local(1970, 1, 11, 0, 0, 1)
|
412
|
+
match '*/5 * * * * *', local(1970, 1, 11, 0, 0, 5)
|
413
|
+
match '*/2 * * * * *', local(1970, 1, 11, 0, 0, 2)
|
414
|
+
match '*/2 * * * * *', local(1970, 1, 11, 0, 0, 2, 500)
|
415
|
+
end
|
399
416
|
end
|
400
417
|
|
401
418
|
describe '#monthdays' do
|
@@ -420,12 +437,43 @@ describe Rufus::Scheduler::CronLine do
|
|
420
437
|
|
421
438
|
it 'returns the shortest delta between two occurrences' do
|
422
439
|
|
423
|
-
Rufus::Scheduler::CronLine.new(
|
424
|
-
|
440
|
+
Rufus::Scheduler::CronLine.new(
|
441
|
+
'* * * * *').frequency.should == 60
|
442
|
+
Rufus::Scheduler::CronLine.new(
|
443
|
+
'* * * * * *').frequency.should == 1
|
444
|
+
|
445
|
+
Rufus::Scheduler::CronLine.new(
|
446
|
+
'5 23 * * *').frequency.should == 24 * 3600
|
447
|
+
Rufus::Scheduler::CronLine.new(
|
448
|
+
'5 * * * *').frequency.should == 3600
|
449
|
+
Rufus::Scheduler::CronLine.new(
|
450
|
+
'10,20,30 * * * *').frequency.should == 600
|
451
|
+
|
452
|
+
Rufus::Scheduler::CronLine.new(
|
453
|
+
'10,20,30 * * * * *').frequency.should == 10
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
describe '#brute_frequency' do
|
458
|
+
|
459
|
+
it 'returns the shortest delta between two occurrences' do
|
460
|
+
|
461
|
+
Rufus::Scheduler::CronLine.new(
|
462
|
+
'* * * * *').brute_frequency.should == 60
|
463
|
+
Rufus::Scheduler::CronLine.new(
|
464
|
+
'* * * * * *').brute_frequency.should == 1
|
425
465
|
|
426
|
-
Rufus::Scheduler::CronLine.new(
|
427
|
-
|
428
|
-
Rufus::Scheduler::CronLine.new(
|
466
|
+
Rufus::Scheduler::CronLine.new(
|
467
|
+
'5 23 * * *').brute_frequency.should == 24 * 3600
|
468
|
+
Rufus::Scheduler::CronLine.new(
|
469
|
+
'5 * * * *').brute_frequency.should == 3600
|
470
|
+
Rufus::Scheduler::CronLine.new(
|
471
|
+
'10,20,30 * * * *').brute_frequency.should == 600
|
472
|
+
|
473
|
+
#Rufus::Scheduler::CronLine.new(
|
474
|
+
# '10,20,30 * * * * *').brute_frequency.should == 10
|
475
|
+
#
|
476
|
+
# takes > 20s ...
|
429
477
|
end
|
430
478
|
end
|
431
479
|
end
|
data/spec/job_cron_spec.rb
CHANGED
@@ -62,6 +62,45 @@ describe Rufus::Scheduler::CronJob do
|
|
62
62
|
job.first_at.should be_within_1s_of(t + 3)
|
63
63
|
job.last_time.should == nil
|
64
64
|
end
|
65
|
+
|
66
|
+
it 'triggers for the first time at first_at' do
|
67
|
+
|
68
|
+
first_time = nil
|
69
|
+
t = Time.now
|
70
|
+
|
71
|
+
job = @scheduler.schedule_cron '* * * * * *', :first_in => '3s' do
|
72
|
+
first_time ||= Time.now
|
73
|
+
end
|
74
|
+
sleep 4.5
|
75
|
+
|
76
|
+
job.first_at.should be_within_1s_of(t + 3)
|
77
|
+
first_time.should be_within_1s_of(job.first_at)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'scheduling the cron itself' do
|
82
|
+
|
83
|
+
# for https://github.com/jmettraux/rufus-scheduler/issues/95
|
84
|
+
#
|
85
|
+
# schedule_cron takes more than 30 seconds, blocking...
|
86
|
+
#
|
87
|
+
it 'does not sit scheduling and blocking...' do
|
88
|
+
|
89
|
+
n = Time.now
|
90
|
+
first = nil
|
91
|
+
|
92
|
+
job = @scheduler.schedule_cron '*/2 * * * * *' do
|
93
|
+
first ||= Time.now
|
94
|
+
end
|
95
|
+
|
96
|
+
(Time.now - n).should < 1.0
|
97
|
+
|
98
|
+
loop do
|
99
|
+
next unless first
|
100
|
+
(first - n).should < 4.0
|
101
|
+
break
|
102
|
+
end
|
103
|
+
end
|
65
104
|
end
|
66
105
|
end
|
67
106
|
|
data/spec/scheduler_spec.rb
CHANGED
@@ -363,37 +363,16 @@ describe Rufus::Scheduler do
|
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
-
describe '#work_threads(:all)' do
|
366
|
+
describe '#work_threads(:all | :vacant)' do
|
367
367
|
|
368
368
|
it 'returns an empty array when the scheduler has not yet done anything' do
|
369
369
|
|
370
370
|
@scheduler.work_threads.should == []
|
371
|
-
|
372
|
-
|
373
|
-
it 'lists all the work threads in the pool' do
|
374
|
-
|
375
|
-
@scheduler.in '0s' do
|
376
|
-
sleep(0.2)
|
377
|
-
end
|
378
|
-
@scheduler.in '0s' do
|
379
|
-
sleep(2.0)
|
380
|
-
end
|
381
|
-
|
382
|
-
sleep 0.6
|
383
|
-
|
384
|
-
@scheduler.work_threads.size.should == 2
|
385
|
-
@scheduler.work_threads(:all).size.should == 2
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
describe '#work_threads(:vacant)' do
|
390
|
-
|
391
|
-
it 'returns an empty array when the scheduler has not yet done anything' do
|
392
|
-
|
371
|
+
@scheduler.work_threads(:all).should == []
|
393
372
|
@scheduler.work_threads(:vacant).should == []
|
394
373
|
end
|
395
374
|
|
396
|
-
it 'lists
|
375
|
+
it 'lists the [vacant] work threads in the pool' do
|
397
376
|
|
398
377
|
@scheduler.in '0s' do
|
399
378
|
sleep(0.2)
|
@@ -402,10 +381,17 @@ describe Rufus::Scheduler do
|
|
402
381
|
sleep(2.0)
|
403
382
|
end
|
404
383
|
|
405
|
-
sleep 0.
|
384
|
+
sleep 0.7
|
406
385
|
|
407
|
-
@scheduler.work_threads
|
408
|
-
|
386
|
+
if @scheduler.work_threads.size == 1
|
387
|
+
@scheduler.work_threads.size.should == 1
|
388
|
+
@scheduler.work_threads(:all).size.should == 1
|
389
|
+
@scheduler.work_threads(:vacant).size.should == 0
|
390
|
+
else
|
391
|
+
@scheduler.work_threads.size.should == 2
|
392
|
+
@scheduler.work_threads(:all).size.should == 2
|
393
|
+
@scheduler.work_threads(:vacant).size.should == 1
|
394
|
+
end
|
409
395
|
end
|
410
396
|
end
|
411
397
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufus-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tzinfo
|
@@ -103,7 +103,7 @@ files:
|
|
103
103
|
homepage: http://github.com/jmettraux/rufus-scheduler
|
104
104
|
licenses:
|
105
105
|
- MIT
|
106
|
-
post_install_message: ! "\n***\n\nThanks for installing rufus-scheduler 3.0.
|
106
|
+
post_install_message: ! "\n***\n\nThanks for installing rufus-scheduler 3.0.4\n\nIt
|
107
107
|
might not be 100% compatible with rufus-scheduler 2.x.\n\nIf you encounter issues
|
108
108
|
with this new rufus-scheduler, especially\nif your app worked fine with previous
|
109
109
|
versions of it, you can\n\nA) Forget it and peg your Gemfile to rufus-scheduler
|