simple_scheduler 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/lib/simple_scheduler/at.rb +8 -4
- data/lib/simple_scheduler/future_job.rb +2 -0
- data/lib/simple_scheduler/scheduler_job.rb +1 -2
- data/lib/simple_scheduler/task.rb +9 -5
- data/lib/simple_scheduler/version.rb +1 -1
- metadata +8 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2216e4b3a7b296545fc87bf4ec4509c6e54cf80c
|
4
|
+
data.tar.gz: 3f7b99ddda05bbf8d97d320351e6bed5a617dea9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ea3d1b9fb643828f411b3b260e4684188d3115ea65a2f409720b4fc199092645d86fd4ac841043c2d6c2375cbf17d2dd3c1e62eb677144715a9adb0a32113a5
|
7
|
+
data.tar.gz: 2b02cd203eb5bf2f16a6e469bc2cbab794445840bd95c6ce4af666a87628644a1c557f1d5bb9649ce55ca0aece0fe43837b1c886d8002a321dc5ff8ca339e249
|
data/README.md
CHANGED
@@ -62,10 +62,11 @@ queue_ahead: 360 # Number of minutes to queue jobs into the future
|
|
62
62
|
queue_name: "default" # The Sidekiq queue name used by SimpleScheduler::FutureJob
|
63
63
|
tz: "America/Chicago" # The application time zone will be used by default if not set
|
64
64
|
|
65
|
-
# Runs once every 2 minutes
|
65
|
+
# Runs once every 2 minutes starting at the top of the hour
|
66
66
|
simple_task:
|
67
67
|
class: "SomeActiveJob"
|
68
68
|
every: "2.minutes"
|
69
|
+
at: "*:00"
|
69
70
|
|
70
71
|
# Runs once every day at 4:00 AM. The job will expire after 23 hours, which means the
|
71
72
|
# job will not run if 23 hours passes (server downtime) before the job is actually run
|
@@ -126,11 +127,10 @@ How frequently the task should be performed as an ActiveSupport duration definit
|
|
126
127
|
"1.week"
|
127
128
|
```
|
128
129
|
|
129
|
-
#### :at
|
130
|
+
#### :at
|
130
131
|
|
131
|
-
This is the starting point\* for the `:every` duration.
|
132
|
-
run
|
133
|
-
follow the `:every` duration to determine future execution times.
|
132
|
+
This is the starting point\* for the `:every` duration. This must be set so the expected
|
133
|
+
run times in the future can be determined without duplicating jobs already in the queue.
|
134
134
|
|
135
135
|
Valid string formats/examples:
|
136
136
|
|
data/lib/simple_scheduler/at.rb
CHANGED
@@ -9,8 +9,8 @@ module SimpleScheduler
|
|
9
9
|
# SimpleScheduler::At.new("Sun 0:00")
|
10
10
|
# # => 2016-12-11 00:00:00 -0600
|
11
11
|
class At < Time
|
12
|
-
AT_PATTERN = /\A(Sun|Mon|Tue|Wed|Thu|Fri|Sat)?\s?(?:\*{1,2}|((?:\b[0-1]?[0-9]|2[0-3]))):([0-5]\d)\z
|
13
|
-
DAYS = %w
|
12
|
+
AT_PATTERN = /\A(Sun|Mon|Tue|Wed|Thu|Fri|Sat)?\s?(?:\*{1,2}|((?:\b[0-1]?[0-9]|2[0-3]))):([0-5]\d)\z/.freeze
|
13
|
+
DAYS = %w[Sun Mon Tue Wed Thu Fri Sat].freeze
|
14
14
|
|
15
15
|
# Error class raised when an invalid string is given for the time.
|
16
16
|
class InvalidTime < StandardError; end
|
@@ -25,12 +25,14 @@ module SimpleScheduler
|
|
25
25
|
# "[Sun|Mon|Tue|Wed|Thu|Fri|Sat] 00:00"
|
26
26
|
# @param at [String] The formatted string for a task's run time
|
27
27
|
# @param time_zone [ActiveSupport::TimeZone] The time zone to parse the at time in
|
28
|
+
# rubocop:disable Metrics/AbcSize
|
28
29
|
def initialize(at, time_zone = nil)
|
29
30
|
@at = at
|
30
31
|
@time_zone = time_zone || Time.zone
|
31
32
|
super(parsed_time.year, parsed_time.month, parsed_time.day,
|
32
33
|
parsed_time.hour, parsed_time.min, parsed_time.sec, parsed_time.utc_offset)
|
33
34
|
end
|
35
|
+
# rubocop:enable Metrics/AbcSize
|
34
36
|
|
35
37
|
# Always returns the specified hour if the hour was given, otherwise
|
36
38
|
# it returns the hour calculated based on other specified options.
|
@@ -49,8 +51,10 @@ module SimpleScheduler
|
|
49
51
|
|
50
52
|
def at_match
|
51
53
|
@at_match ||= begin
|
52
|
-
match =
|
54
|
+
match = AT_PATTERN.match(@at)
|
55
|
+
raise InvalidTime, "The `at` option is required." if @at.nil?
|
53
56
|
raise InvalidTime, "The `at` option '#{@at}' is invalid." if match.nil?
|
57
|
+
|
54
58
|
match
|
55
59
|
end
|
56
60
|
end
|
@@ -64,7 +68,7 @@ module SimpleScheduler
|
|
64
68
|
end
|
65
69
|
|
66
70
|
def at_wday
|
67
|
-
@
|
71
|
+
@at_wday ||= DAYS.index(at_match[1])
|
68
72
|
end
|
69
73
|
|
70
74
|
def at_wday?
|
@@ -23,6 +23,7 @@ module SimpleScheduler
|
|
23
23
|
@task = Task.new(task_params)
|
24
24
|
@scheduled_time = Time.at(scheduled_time).in_time_zone(@task.time_zone)
|
25
25
|
raise Expired if expired?
|
26
|
+
|
26
27
|
queue_task
|
27
28
|
end
|
28
29
|
|
@@ -50,6 +51,7 @@ module SimpleScheduler
|
|
50
51
|
# @return [Boolean]
|
51
52
|
def expired?
|
52
53
|
return false if @task.expires_after.blank?
|
54
|
+
|
53
55
|
expire_duration.from_now(@scheduled_time) < Time.now.in_time_zone(@task.time_zone)
|
54
56
|
end
|
55
57
|
|
@@ -29,8 +29,7 @@ module SimpleScheduler
|
|
29
29
|
def queue_future_jobs
|
30
30
|
tasks.each do |task|
|
31
31
|
# Schedule the new run times using the future job wrapper.
|
32
|
-
|
33
|
-
new_run_times.each do |time|
|
32
|
+
task.future_run_times.each do |time|
|
34
33
|
SimpleScheduler::FutureJob.set(queue: @queue_name, wait_until: time)
|
35
34
|
.perform_later(task.params, time.to_i)
|
36
35
|
end
|
@@ -16,7 +16,7 @@ module SimpleScheduler
|
|
16
16
|
# @option params [String] :class The class of the Active Job or Sidekiq Worker
|
17
17
|
# @option params [String] :every How frequently the job will be performed
|
18
18
|
# @option params [String] :at The starting time for the interval
|
19
|
-
# @option params [String] :expires_after The
|
19
|
+
# @option params [String] :expires_after The interval used to determine how late the job is allowed to run
|
20
20
|
# @option params [Integer] :queue_ahead The number of minutes that jobs should be queued in the future
|
21
21
|
# @option params [String] :task_name The name of the task as defined in the YAML config
|
22
22
|
# @option params [String] :tz The time zone to use when parsing the `at` option
|
@@ -42,6 +42,7 @@ module SimpleScheduler
|
|
42
42
|
def existing_jobs
|
43
43
|
@existing_jobs ||= SimpleScheduler::Task.scheduled_set.select do |job|
|
44
44
|
next unless job.display_class == "SimpleScheduler::FutureJob"
|
45
|
+
|
45
46
|
task_params = job.display_args[0].symbolize_keys
|
46
47
|
task_params[:class] == job_class_name && task_params[:name] == name
|
47
48
|
end.to_a
|
@@ -62,22 +63,24 @@ module SimpleScheduler
|
|
62
63
|
# Returns an array Time objects for future run times based on
|
63
64
|
# the current time and the given minutes to look ahead.
|
64
65
|
# @return [Array<Time>]
|
66
|
+
# rubocop:disable Metrics/AbcSize
|
65
67
|
def future_run_times
|
66
|
-
|
67
|
-
last_run_time = future_run_times.last || at - frequency
|
68
|
+
last_run_time = at - frequency
|
68
69
|
last_run_time = last_run_time.in_time_zone(time_zone)
|
70
|
+
future_run_times = []
|
69
71
|
|
70
72
|
# Ensure there are at least two future jobs scheduled and that the queue ahead time is filled
|
71
|
-
while future_run_times.length < 2 || minutes_queued_ahead(last_run_time) < queue_ahead
|
73
|
+
while (future_run_times + existing_run_times).length < 2 || minutes_queued_ahead(last_run_time) < queue_ahead
|
72
74
|
last_run_time = frequency.from_now(last_run_time)
|
73
75
|
# The hour may not match because of a shift caused by DST in previous run times,
|
74
76
|
# so we need to ensure that the hour matches the specified hour if given.
|
75
77
|
last_run_time = last_run_time.change(hour: at.hour, min: at.min) if at.hour?
|
76
|
-
future_run_times << last_run_time
|
78
|
+
future_run_times << last_run_time unless existing_run_times.include?(last_run_time)
|
77
79
|
end
|
78
80
|
|
79
81
|
future_run_times
|
80
82
|
end
|
83
|
+
# rubocop:enable Metrics/AbcSize
|
81
84
|
|
82
85
|
# The class name of the job or worker.
|
83
86
|
# @return [String]
|
@@ -126,6 +129,7 @@ module SimpleScheduler
|
|
126
129
|
def validate_params!(params)
|
127
130
|
raise ArgumentError, "Missing param `class` specifying the class of the job to run." unless params.key?(:class)
|
128
131
|
raise ArgumentError, "Missing param `every` specifying how often the job should run." unless params.key?(:every)
|
132
|
+
|
129
133
|
@job_class = params[:class].constantize
|
130
134
|
params[:name] ||= params[:class]
|
131
135
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Pattison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rainbow
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rainbow
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 2.1.0
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 2.1.0
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: rspec-rails
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,16 +84,16 @@ dependencies:
|
|
98
84
|
name: rubocop
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- - "
|
87
|
+
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
89
|
+
version: 0.66.0
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- - "
|
94
|
+
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
96
|
+
version: 0.66.0
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: simplecov
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
163
|
version: '0'
|
178
164
|
requirements: []
|
179
165
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.5.2
|
166
|
+
rubygems_version: 2.5.2.3
|
181
167
|
signing_key:
|
182
168
|
specification_version: 4
|
183
169
|
summary: An enhancement for Heroku Scheduler + Sidekiq for scheduling jobs at specific
|