cron_swanson 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -1
- data/README.md +48 -24
- data/lib/cron_swanson.rb +9 -1
- data/lib/cron_swanson/version.rb +1 -1
- data/lib/cron_swanson/whenever.rb +32 -19
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c4d87324b0351bbf60e5cc586833282618dba613694fd57b22e0e9a7afce9a5
|
4
|
+
data.tar.gz: f64d0020a6be996393b40040d506d880ad5d2a0315a530205ec8d834abdeb273
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13473ea070dfe8f19fde8f9e0439ab571abbc0eb8274499df442fa21c43da86e5bd26942510156250ac8d474aed73725f1ac510c437da92e9cf855ccf95a6a94
|
7
|
+
data.tar.gz: 990e1e3eb6fb5027111646583ecda830c45a38117b1035f748dd553161b8f3bdfacee1bad1e9e5b21d68baf69bc39db4d47fbe4b6599a664f1e90c1711b4c607
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## 0.
|
3
|
+
## 0.3.0 : "Any dog under 50 pounds is a cat and cats are useless." : November 4, 2019
|
4
|
+
|
5
|
+
New feature:
|
6
|
+
|
7
|
+
* Support for seed strings, to allow the same job to have distinct schedules
|
8
|
+
in various apps.
|
9
|
+
|
10
|
+
Breaking changes:
|
11
|
+
|
12
|
+
* `whenever` integration changed from class methods to instance methods.
|
13
|
+
* Some methods were renamed.
|
14
|
+
|
15
|
+
## 0.2.0 : "Under my tutelage, you will grow from boys to men." : November 3, 2019
|
4
16
|
|
5
17
|
Improvements in whenever integration.
|
6
18
|
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# CronSwanson
|
2
2
|
|
3
|
-
`CronSwanson` helps schedule cron jobs.
|
3
|
+
`CronSwanson` helps distribute schedule cron jobs.
|
4
4
|
|
5
5
|
![Never half-ass two things.](whole-ass.jpg)
|
6
6
|
|
@@ -32,24 +32,24 @@ Or install it yourself as:
|
|
32
32
|
|
33
33
|
## Usage
|
34
34
|
|
35
|
-
###
|
35
|
+
### build_schedule
|
36
36
|
|
37
|
-
Use `
|
38
|
-
the run time of the job.
|
37
|
+
Use `build_schedule` to build a cron schedule string. The supplied string is hashed
|
38
|
+
to determine the run time of the job.
|
39
39
|
|
40
40
|
```ruby
|
41
|
-
CronSwanson.
|
41
|
+
CronSwanson.build_schedule 'whiskey'
|
42
42
|
#=> "33 18 * * *"
|
43
43
|
```
|
44
44
|
|
45
45
|
**To keep two applications running the same job from executing at once**, make the
|
46
|
-
application name part of the
|
46
|
+
application name part of the build_schedule key.
|
47
47
|
|
48
48
|
```ruby
|
49
|
-
CronSwanson.
|
49
|
+
CronSwanson.build_schedule 'application-a whiskey'
|
50
50
|
#=> "4 19 * * *"
|
51
51
|
|
52
|
-
CronSwanson.
|
52
|
+
CronSwanson.build_schedule 'application-b whiskey'
|
53
53
|
#=> "11 7 * * *"
|
54
54
|
```
|
55
55
|
|
@@ -57,14 +57,14 @@ An `interval` (in seconds) can be supplied if you want a job to be run more than
|
|
57
57
|
once/day. This `interval` must be a factor of 24 hours.
|
58
58
|
|
59
59
|
```ruby
|
60
|
-
CronSwanson.
|
60
|
+
CronSwanson.build_schedule 'bacon', interval: 60 * 60 * 4
|
61
61
|
#=> "26 2,6,10,14,18,22 * * *"
|
62
62
|
```
|
63
63
|
|
64
64
|
You can also use `ActiveSupport::Duration` instances.
|
65
65
|
|
66
66
|
```ruby
|
67
|
-
CronSwanson.
|
67
|
+
CronSwanson.build_schedule 'bacon', interval: 4.hours
|
68
68
|
#=> "26 2,6,10,14,18,22 * * *"
|
69
69
|
```
|
70
70
|
|
@@ -72,17 +72,18 @@ CronSwanson.schedule 'bacon', interval: 4.hours
|
|
72
72
|
|
73
73
|
`CronSwanson` is built to integrate with the fantastic [whenever](https://github.com/javan/whenever) gem.
|
74
74
|
|
75
|
-
`
|
76
|
-
|
75
|
+
`#schedule` will calculate a run time for jobs by hashing the text of the job
|
76
|
+
definitions in the given block. (Plus an optional seed string if one is supplied.)
|
77
77
|
|
78
|
-
**NOTE**: This means that if you change the jobs in the block, you will also
|
79
|
-
for these jobs.
|
78
|
+
**NOTE**: This means that if you change the jobs in the block, or the seed, you will also
|
79
|
+
change the schedule time for these jobs.
|
80
80
|
|
81
81
|
#### Daily
|
82
82
|
|
83
83
|
```ruby
|
84
|
-
# in config/
|
85
|
-
CronSwanson::Whenever.
|
84
|
+
# in config/build_schedule.rb
|
85
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-name')
|
86
|
+
swanson.schedule do
|
86
87
|
rake 'sample:job'
|
87
88
|
end
|
88
89
|
```
|
@@ -93,15 +94,17 @@ determined by `CronSwanson`.
|
|
93
94
|
#### Multiple times/day
|
94
95
|
|
95
96
|
```ruby
|
96
|
-
# in config/
|
97
|
+
# in config/build_schedule.rb
|
97
98
|
|
98
99
|
# with ActiveSupport
|
99
|
-
CronSwanson::Whenever.
|
100
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-name')
|
101
|
+
swanson.schedule(interval: 4.hours) do
|
100
102
|
rake 'sample:job'
|
101
103
|
end
|
102
104
|
|
103
105
|
# without ActiveSupport
|
104
|
-
CronSwanson::Whenever.
|
106
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-name')
|
107
|
+
swanson.schedule(interval: 60 * 60 * 4) do
|
105
108
|
rake 'sample:job'
|
106
109
|
end
|
107
110
|
```
|
@@ -111,10 +114,11 @@ end
|
|
111
114
|
Any custom job types which have been defined will work.
|
112
115
|
|
113
116
|
```ruby
|
114
|
-
# in config/
|
117
|
+
# in config/build_schedule.rb
|
115
118
|
job_type :ron, '/usr/bin/ron :task'
|
116
119
|
|
117
|
-
CronSwanson::Whenever.
|
120
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-name')
|
121
|
+
swanson.schedule do
|
118
122
|
ron 'bacon whiskey'
|
119
123
|
end
|
120
124
|
```
|
@@ -125,16 +129,36 @@ Roles are supported. See the [whenever documentation](https://github.com/javan/w
|
|
125
129
|
for more information on this.
|
126
130
|
|
127
131
|
```ruby
|
128
|
-
CronSwanson::Whenever.
|
132
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-name')
|
133
|
+
swanson.schedule do
|
129
134
|
rake 'will_run_on_all_roles'
|
130
135
|
end
|
131
136
|
|
132
|
-
#
|
133
|
-
|
137
|
+
# Added to servers with the :restricted role
|
138
|
+
swanson.schedule(roles: [:restricted]) do
|
134
139
|
rake 'restricted_only'
|
135
140
|
end
|
136
141
|
```
|
137
142
|
|
143
|
+
#### seeds
|
144
|
+
|
145
|
+
Varying the seed string affects all jobs scheduled by that instance.
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-a')
|
149
|
+
swanson.schedule do
|
150
|
+
rake 'job'
|
151
|
+
end
|
152
|
+
|
153
|
+
swanson = CronSwanson::Whenever.new(self, seed: 'application-b')
|
154
|
+
swanson.schedule do
|
155
|
+
rake 'job'
|
156
|
+
end
|
157
|
+
```
|
158
|
+
|
159
|
+
In this example, the job being scheduled is the same, but the schedule times will
|
160
|
+
be different because the seed string is different.
|
161
|
+
|
138
162
|
## Development
|
139
163
|
|
140
164
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/cron_swanson.rb
CHANGED
@@ -36,7 +36,15 @@ module CronSwanson
|
|
36
36
|
offset_seconds
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
# generate a cron schedule string
|
40
|
+
#
|
41
|
+
# the same input will always produce the same output.
|
42
|
+
#
|
43
|
+
# @param [String] job_identifier a job to generate a schedule for
|
44
|
+
# @param [Integer, ActiveSupport::Duration] interval how often should the job
|
45
|
+
# be scheduled to run?
|
46
|
+
# @return [String] a schedule string like '38 4 * * *'
|
47
|
+
def self.build_schedule(job_identifier, interval: default_interval)
|
40
48
|
if interval > SECONDS_PER_DAY
|
41
49
|
raise ArgumentError, "interval must be less than 1 day (#{SECONDS_PER_DAY} seconds)."
|
42
50
|
end
|
data/lib/cron_swanson/version.rb
CHANGED
@@ -1,13 +1,30 @@
|
|
1
1
|
module CronSwanson
|
2
2
|
# integration for the whenever gem: https://github.com/javan/whenever
|
3
3
|
class Whenever
|
4
|
+
# a seed string which should be unique per application
|
5
|
+
#
|
6
|
+
# causes unique hashes (ie: schedules) to be generated by multiple apps all
|
7
|
+
# scheduling the same job.
|
8
|
+
attr_reader :seed
|
9
|
+
|
10
|
+
def initialize(whenever_job_list, seed: '')
|
11
|
+
if !whenever_job_list.is_a?(::Whenever::JobList)
|
12
|
+
raise ArgumentError, "supply a Whenever::JobList. (In schedule.rb code, use `self`.)"
|
13
|
+
end
|
14
|
+
|
15
|
+
@whenever_job_list = whenever_job_list
|
16
|
+
@seed = seed
|
17
|
+
@in_schedule_method = false
|
18
|
+
@whenever_jobs = []
|
19
|
+
end
|
20
|
+
|
4
21
|
# CronSwanson integration for whenever
|
5
22
|
#
|
6
23
|
# The given block can use any job types understood by your whenever configuration.
|
7
24
|
# See https://github.com/javan/whenever#define-your-own-job-types.
|
8
25
|
#
|
9
26
|
# CronSwanson currently uses the location it is invoked from in schedule.rb
|
10
|
-
# to calculate a job time. This means that moving the `.
|
27
|
+
# to calculate a job time. This means that moving the `.schedule` invocation to
|
11
28
|
# a different line in schedule.rb will cause it to be run at a different time.
|
12
29
|
#
|
13
30
|
# This limitation exists because I (currently) don't know of a way to inspect
|
@@ -16,7 +33,7 @@ module CronSwanson
|
|
16
33
|
#
|
17
34
|
# @example run a job once/day
|
18
35
|
# # in config/schedule.rb
|
19
|
-
# CronSwanson::Whenever.
|
36
|
+
# CronSwanson::Whenever.schedule(self) do
|
20
37
|
# rake 'job'
|
21
38
|
# end
|
22
39
|
#
|
@@ -24,18 +41,18 @@ module CronSwanson
|
|
24
41
|
# # in config/schedule.rb
|
25
42
|
#
|
26
43
|
# # with ActiveSupport
|
27
|
-
# CronSwanson::Whenever.
|
44
|
+
# CronSwanson::Whenever.schedule(self, interval: 4.hours) do
|
28
45
|
# rake 'job'
|
29
46
|
# end
|
30
47
|
#
|
31
48
|
# # without ActiveSupport
|
32
|
-
# CronSwanson::Whenever.
|
49
|
+
# CronSwanson::Whenever.schedule(self, interval: 60 * 60 * 4) do
|
33
50
|
# rake 'job'
|
34
51
|
# end
|
35
52
|
#
|
36
53
|
# @example run a job only on servers with a given role
|
37
54
|
# # in config/schedule.rb
|
38
|
-
# CronSwanson::Whenever.
|
55
|
+
# CronSwanson::Whenever.schedule(self, roles: [:app]) do
|
39
56
|
# rake 'job'
|
40
57
|
# end
|
41
58
|
#
|
@@ -44,13 +61,9 @@ module CronSwanson
|
|
44
61
|
# @param [Integer, ActiveSupport::Duration] interval how many seconds do you want between runs
|
45
62
|
# of this job
|
46
63
|
# @param [Array<Symbol>] roles capistrano roles that jobs in this block should be deployed to
|
47
|
-
def
|
64
|
+
def schedule(interval: CronSwanson.default_interval, roles: [], &block)
|
65
|
+
@in_schedule_method = true
|
48
66
|
@whenever_jobs = []
|
49
|
-
@whenever_job_list = whenever_job_list
|
50
|
-
|
51
|
-
if !whenever_job_list.is_a?(::Whenever::JobList)
|
52
|
-
raise ArgumentError, "supply a Whenever::JobList. (In schedule.rb code, use `self`.)"
|
53
|
-
end
|
54
67
|
|
55
68
|
raise ArgumentError, "provide a block containing jobs to schedule." if !block_given?
|
56
69
|
|
@@ -64,23 +77,23 @@ module CronSwanson
|
|
64
77
|
m, args, _block = *job_config
|
65
78
|
"#{m} #{args.join}"
|
66
79
|
end
|
67
|
-
schedule = CronSwanson.
|
80
|
+
schedule = CronSwanson.build_schedule(@seed + schedule_seed.join, interval: interval)
|
68
81
|
|
69
82
|
# now that we know when to schedule the jobs, actually pass the block to Whenever
|
70
83
|
if roles.size > 0
|
71
|
-
whenever_job_list.every(schedule, roles: roles, &Proc.new)
|
84
|
+
@whenever_job_list.every(schedule, roles: roles, &Proc.new)
|
72
85
|
else
|
73
|
-
whenever_job_list.every(schedule, &Proc.new)
|
86
|
+
@whenever_job_list.every(schedule, &Proc.new)
|
74
87
|
end
|
75
88
|
|
76
|
-
@
|
89
|
+
@in_schedule_method = false
|
77
90
|
end
|
78
91
|
|
79
|
-
# during .
|
92
|
+
# during .schedule, we accumulate calls to whenever job types
|
80
93
|
# this allows us to make a schedule hash from the actual jobs which are defined.
|
81
|
-
def
|
82
|
-
if
|
83
|
-
raise "#{self.name}
|
94
|
+
def method_missing(m, *args, &block)
|
95
|
+
if !@in_schedule_method
|
96
|
+
raise "#{self.class.name}#method_missing invoked outside of #{self.class.name}#schedule"
|
84
97
|
end
|
85
98
|
|
86
99
|
if @whenever_job_list.respond_to?(m)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cron_swanson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Dean
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-11-
|
11
|
+
date: 2019-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -83,8 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
|
-
|
87
|
-
rubygems_version: 2.7.6.2
|
86
|
+
rubygems_version: 3.0.3
|
88
87
|
signing_key:
|
89
88
|
specification_version: 4
|
90
89
|
summary: distribute common cron jobs so they don't all start at the same moment
|