delayed_cron 0.2.9 → 0.2.10
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/.ruby-version +1 -1
- data/CHANGES.md +5 -0
- data/README.md +20 -5
- data/lib/delayed_cron.rb +9 -8
- data/lib/delayed_cron/cron_job.rb +58 -0
- data/lib/delayed_cron/scheduling.rb +11 -39
- data/lib/delayed_cron/version.rb +1 -1
- data/spec/cron_job_spec.rb +139 -0
- data/spec/delayed_cron_spec.rb +11 -0
- data/spec/scheduling_spec.rb +15 -54
- data/spec/spec_helper.rb +3 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7a2942e092055795c248a6eb82433c760c26733
|
4
|
+
data.tar.gz: 195e7f6a46052e687611a825afede8ab3d4ef4f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 596b466d8708c44a8023995a0df0ff7c6fa87b2c74b1d2e42521f5671e6d1b41147525fde9e1bdaecfc981978efcadcbf503a01e49d3fc4f1243765586d60f6a
|
7
|
+
data.tar.gz: f2c640b98de5f67f384a54b7c493715b4b14a1a7024ad52c903bb103fc004810a1de8c33c1f259df4efb4ca571774de81d89a3ba15832022a68539c30d5e8fd2
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.2.5
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -23,12 +23,22 @@ class Product < ActiveRecord::Base
|
|
23
23
|
# * this is an alternative to the cron_jobs array in config
|
24
24
|
#
|
25
25
|
# OPTIONS: *optional
|
26
|
-
# - interval
|
27
|
-
# - at
|
28
|
-
|
26
|
+
# - interval - override default_interval from setup
|
27
|
+
# - at - set time of day the cron should be run, timezone and seconds are optional
|
28
|
+
# - time_zone - override default time zone for this job
|
29
|
+
# - precision - set to :hourly to run job at an hourly interval instead of daily
|
30
|
+
#
|
31
|
+
# NOTE: only one of interval or at will be used, at will take precedence if
|
32
|
+
# both are specified
|
33
|
+
cron_job :some_method_to_run_as_cron, at: "00:00:00 -0400"
|
34
|
+
cron_job :some_hourly_job, at: "15:00", precision: :hourly
|
29
35
|
|
30
36
|
def self.some_method_to_run_as_cron
|
31
|
-
# this method will be run every
|
37
|
+
# this method will be run every every day at midnight
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.some_hourly_job
|
41
|
+
# this method will be run hourly at fifteen minutes past the hour
|
32
42
|
end
|
33
43
|
|
34
44
|
...
|
@@ -43,6 +53,11 @@ DelayedCron.setup do |config|
|
|
43
53
|
# default interval to run cron jobs
|
44
54
|
config.default_interval = 10.minutes
|
45
55
|
|
56
|
+
# default time zone for scheduling `:at` jobs
|
57
|
+
# accepts an ActiveSupport or TZInfo time zone name
|
58
|
+
config.default_time_zone = "Eastern Time (US & Canada)"
|
59
|
+
|
60
|
+
|
46
61
|
# array of methods to run at the above configured interval
|
47
62
|
config.cron_jobs = [
|
48
63
|
"SomeClass.expensive_task", # will run at default interval
|
@@ -56,7 +71,7 @@ end
|
|
56
71
|
|
57
72
|
- when using with sidekiq and rails there can be a config/initializer load order issue. Below is a fix to insure sidekiq is loaded first
|
58
73
|
```ruby
|
59
|
-
Rails.application.config.after_initialize do
|
74
|
+
Rails.application.config.after_initialize do
|
60
75
|
DelayedCron.setup do |config|
|
61
76
|
...
|
62
77
|
end
|
data/lib/delayed_cron.rb
CHANGED
@@ -4,7 +4,7 @@ require 'delayed_cron/railtie'
|
|
4
4
|
|
5
5
|
module DelayedCron
|
6
6
|
|
7
|
-
mattr_accessor :default_interval, :cron_jobs
|
7
|
+
mattr_accessor :default_interval, :default_time_zone, :cron_jobs
|
8
8
|
|
9
9
|
class << self
|
10
10
|
|
@@ -17,15 +17,12 @@ module DelayedCron
|
|
17
17
|
|
18
18
|
def define_cron_jobs
|
19
19
|
return false unless cron_jobs.present?
|
20
|
+
|
20
21
|
cron_jobs.each do |job|
|
21
|
-
|
22
|
-
|
23
|
-
job = job_is_hash ? obj[:job] : job
|
24
|
-
interval = job_is_hash ? obj[:interval] : default_interval
|
25
|
-
options_at = job_is_hash ? obj[:at] : nil
|
26
|
-
klass, name = job.split(".")
|
22
|
+
job = job.is_a?(Hash) ? job : { job: job }
|
23
|
+
klass, name = job[:job].split(".")
|
27
24
|
# TODO: raise error if interval is not set
|
28
|
-
options = timing_opts(
|
25
|
+
options = timing_opts(job)
|
29
26
|
DelayedCron.schedule(klass, name, options)
|
30
27
|
end
|
31
28
|
end
|
@@ -44,6 +41,10 @@ module DelayedCron
|
|
44
41
|
schedule(klass, method_name, symbolized_options)
|
45
42
|
end
|
46
43
|
|
44
|
+
def default_time_zone
|
45
|
+
@@default_time_zone || "Eastern Time (US & Canada)"
|
46
|
+
end
|
47
|
+
|
47
48
|
end
|
48
49
|
|
49
50
|
module Glue
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module DelayedCron
|
2
|
+
class CronJob
|
3
|
+
|
4
|
+
attr_accessor :klass, :method_name
|
5
|
+
|
6
|
+
def initialize(options)
|
7
|
+
self.klass = options.delete(:klass)
|
8
|
+
self.method_name = options.delete(:method_name)
|
9
|
+
|
10
|
+
self.raw_options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def enqueue(processor)
|
14
|
+
schedule.each do |opts|
|
15
|
+
processor.enqueue_delayed_cron(klass, method_name, opts)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_accessor :raw_options
|
22
|
+
|
23
|
+
def schedule
|
24
|
+
return [raw_options] if raw_options[:at].blank?
|
25
|
+
|
26
|
+
Array.wrap(raw_options[:at]).map do |at_option|
|
27
|
+
interval_from_at(raw_options.merge(at: at_option))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def interval_from_at(options)
|
32
|
+
interval = convert_time_string_to_seconds_interval(options[:at], options[:time_zone])
|
33
|
+
options.merge(interval: interval)
|
34
|
+
end
|
35
|
+
|
36
|
+
def convert_time_string_to_seconds_interval(scheduled_time_string, zone_name)
|
37
|
+
zone_name ||= DelayedCron.default_time_zone
|
38
|
+
zone = Time.find_zone!(zone_name)
|
39
|
+
|
40
|
+
if hourly?
|
41
|
+
period_in_seconds = 60 * 60
|
42
|
+
scheduled_time_string = "%H:#{scheduled_time_string}"
|
43
|
+
else
|
44
|
+
period_in_seconds = 60 * 60 * 24
|
45
|
+
end
|
46
|
+
|
47
|
+
scheduled_time = zone.now.strftime("%Y-%m-%d #{scheduled_time_string}")
|
48
|
+
scheduled_time = zone.parse(scheduled_time)
|
49
|
+
scheduled_time += period_in_seconds if zone.now >= scheduled_time
|
50
|
+
scheduled_time.to_i - zone.now.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def hourly?
|
54
|
+
raw_options[:precision].to_s == "hourly"
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -1,48 +1,20 @@
|
|
1
|
+
require 'delayed_cron/cron_job'
|
2
|
+
|
1
3
|
module DelayedCron
|
2
4
|
module Scheduling
|
3
5
|
|
4
6
|
def schedule(klass, method_name, options)
|
5
|
-
|
6
|
-
|
7
|
-
parsed_options.each do |opts|
|
8
|
-
processor.enqueue_delayed_cron(klass, method_name, opts)
|
9
|
-
end
|
10
|
-
else
|
11
|
-
processor.enqueue_delayed_cron(klass, method_name, parsed_options)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def parse_options(options)
|
16
|
-
original_options = options
|
17
|
-
if at = options[:at]
|
18
|
-
options = if at.is_a?(Array)
|
19
|
-
at.map do |at_option|
|
20
|
-
add_interval(original_options.merge(at: at_option))
|
21
|
-
end
|
22
|
-
else
|
23
|
-
add_interval(options)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
options
|
27
|
-
end
|
28
|
-
|
29
|
-
def add_interval(options)
|
30
|
-
options[:interval] = convert_time_string_to_seconds_interval(options[:at])
|
31
|
-
options
|
32
|
-
end
|
33
|
-
|
34
|
-
def convert_time_string_to_seconds_interval(scheduled_time_string)
|
35
|
-
day_in_seconds = 60 * 60 * 24
|
36
|
-
scheduled_time = Time.now.strftime("%Y-%m-%d #{scheduled_time_string}")
|
37
|
-
scheduled_time = DateTime.parse(scheduled_time, false).to_time
|
38
|
-
scheduled_time += day_in_seconds if Time.now >= scheduled_time
|
39
|
-
scheduled_time.to_i - Time.now.to_i
|
7
|
+
job = CronJob.new(options.merge(klass: klass, method_name: method_name))
|
8
|
+
job.enqueue(processor)
|
40
9
|
end
|
41
10
|
|
42
|
-
def timing_opts(
|
43
|
-
|
44
|
-
|
45
|
-
|
11
|
+
def timing_opts(job)
|
12
|
+
{
|
13
|
+
interval: job[:interval] || default_interval,
|
14
|
+
time_zone: job[:time_zone],
|
15
|
+
precision: job[:precision],
|
16
|
+
at: job[:at]
|
17
|
+
}.select { |_, value| !value.nil? }
|
46
18
|
end
|
47
19
|
|
48
20
|
end
|
data/lib/delayed_cron/version.rb
CHANGED
@@ -0,0 +1,139 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module DelayedCron
|
4
|
+
RSpec.describe CronJob do
|
5
|
+
describe "#new" do
|
6
|
+
let(:job) { described_class.new(klass: "Foo", method_name: "bar") }
|
7
|
+
|
8
|
+
it "stores klass" do
|
9
|
+
expect(job.klass).to eq "Foo"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "stores method_name" do
|
13
|
+
expect(job.method_name).to eq "bar"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#enqueue" do
|
18
|
+
let(:job) { described_class.new(klass: "Foo", method_name: "bar", interval: 3600) }
|
19
|
+
let(:processor) { class_double(Jobs::Sidekiq) }
|
20
|
+
|
21
|
+
before { Timecop.freeze(Time.utc(2014, 1, 1, 12, 0, 0)) }
|
22
|
+
|
23
|
+
it "passes interval through for periodic jobs" do
|
24
|
+
job = described_class.new(klass: "Foo", method_name: "bar", interval: 3600)
|
25
|
+
|
26
|
+
expect(processor).to receive(:enqueue_delayed_cron)
|
27
|
+
.with("Foo", "bar", interval: 3600)
|
28
|
+
|
29
|
+
job.enqueue(processor)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "converts :at to interval" do
|
33
|
+
job = described_class.new(klass: "Foo", method_name: "bar", interval: 3600, at: "10:00:00")
|
34
|
+
|
35
|
+
expect(processor).to receive(:enqueue_delayed_cron)
|
36
|
+
.with("Foo", "bar", interval: 10800, at: "10:00:00")
|
37
|
+
|
38
|
+
job.enqueue(processor)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "enqueues multiple jobs from array of :at times" do
|
42
|
+
job = described_class.new(
|
43
|
+
klass: "Foo",
|
44
|
+
method_name: "bar",
|
45
|
+
interval: 3600,
|
46
|
+
at: ["10:00:00", "09:00:00"]
|
47
|
+
)
|
48
|
+
|
49
|
+
expect(processor).to receive(:enqueue_delayed_cron)
|
50
|
+
.with("Foo", "bar", interval: 10800, at: "10:00:00")
|
51
|
+
expect(processor).to receive(:enqueue_delayed_cron)
|
52
|
+
.with("Foo", "bar", interval: 7200, at: "09:00:00")
|
53
|
+
|
54
|
+
job.enqueue(processor)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'respects time zone parameter' do
|
58
|
+
job = described_class.new(
|
59
|
+
klass: "Foo",
|
60
|
+
method_name: "bar",
|
61
|
+
interval: 3600,
|
62
|
+
at: "13:00:00",
|
63
|
+
time_zone: "UTC"
|
64
|
+
)
|
65
|
+
|
66
|
+
expect(processor).to receive(:enqueue_delayed_cron)
|
67
|
+
.with("Foo", "bar", interval: 3600, at: "13:00:00", time_zone: "UTC")
|
68
|
+
|
69
|
+
job.enqueue(processor)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ".convert_time_string_to_seconds_interval" do
|
74
|
+
let(:job) { described_class.new({}) }
|
75
|
+
|
76
|
+
let(:next_occurrence) do
|
77
|
+
job.send(:convert_time_string_to_seconds_interval, scheduled_time, "Eastern Time (US & Canada)")
|
78
|
+
end
|
79
|
+
# Set Time.now to January 1, 2014 12:00:00 PM
|
80
|
+
before { Timecop.freeze(Time.utc(2014, 1, 1, 12, 0, 0)) }
|
81
|
+
context "next occurrence is today" do
|
82
|
+
let(:known_interval) { 21600 }
|
83
|
+
let(:scheduled_time) { "13:00:00 -0500" }
|
84
|
+
it "converts a time string to seconds" do
|
85
|
+
expect(next_occurrence).to be(known_interval)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "next occurrence is tomorrow" do
|
90
|
+
let(:known_interval) { 14400 }
|
91
|
+
let(:scheduled_time) { "11:00:00 -0500" }
|
92
|
+
it "converts a time string to seconds" do
|
93
|
+
expect(next_occurrence).to be(known_interval)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "with time zone" do
|
98
|
+
let(:known_interval) { 14400 }
|
99
|
+
let(:scheduled_time) { "11:00:00 Eastern Time (US & Canada)" }
|
100
|
+
it "converts a time string to seconds" do
|
101
|
+
expect(next_occurrence).to be(known_interval)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "with DST" do
|
106
|
+
let(:known_interval) { 14400 }
|
107
|
+
let(:scheduled_time) { "11:00:00 -0500" }
|
108
|
+
it "converts a time string to seconds" do
|
109
|
+
Timecop.freeze(Time.utc(2014, 6, 1, 12, 0, 0))
|
110
|
+
|
111
|
+
expect(next_occurrence).to be(known_interval)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "hourly interval" do
|
116
|
+
let(:job) { described_class.new(precision: :hourly) }
|
117
|
+
let(:known_interval) { 300 }
|
118
|
+
|
119
|
+
let(:scheduled_time) { "05:00 -0500" }
|
120
|
+
it "converts a time string to seconds" do
|
121
|
+
expect(next_occurrence).to be(known_interval)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context "next hour" do
|
126
|
+
let(:job) { described_class.new(precision: :hourly) }
|
127
|
+
let(:known_interval) { 300 }
|
128
|
+
|
129
|
+
let(:scheduled_time) { "00:00" }
|
130
|
+
it "converts a time string to seconds" do
|
131
|
+
Timecop.freeze(Time.utc(2014, 1, 1, 12, 55, 0))
|
132
|
+
|
133
|
+
expect(next_occurrence).to be(known_interval)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/spec/delayed_cron_spec.rb
CHANGED
@@ -26,6 +26,17 @@ describe DelayedCron do
|
|
26
26
|
expect(DelayedCron.default_interval).not_to be_nil
|
27
27
|
end
|
28
28
|
|
29
|
+
it "should have a default_time_zone" do
|
30
|
+
setup(default_time_zone: "UTC")
|
31
|
+
expect(DelayedCron.default_time_zone).to eq "UTC"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should default TZ to Eastern Time when not specified" do
|
35
|
+
setup(cron_jobs: [{job: "Test"}])
|
36
|
+
|
37
|
+
expect(DelayedCron.default_time_zone).to eq "Eastern Time (US & Canada)"
|
38
|
+
end
|
39
|
+
|
29
40
|
it "should have an array of cron_jobs" do
|
30
41
|
setup(default_interval: 1.hour)
|
31
42
|
expect(DelayedCron.cron_jobs).to be_an(Array)
|
data/spec/scheduling_spec.rb
CHANGED
@@ -9,61 +9,10 @@ describe DelayedCron::Scheduling do
|
|
9
9
|
DelayedCron.schedule("SomeClass", "long_method", { interval: 1.hour })
|
10
10
|
expect(DelayedCron.processor).to be_processed_in :cron_job
|
11
11
|
expect(DelayedCron.processor.jobs.size).to eq(1)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe ".parse_options" do
|
16
|
-
let(:at_string) { { interval: 1.day, at: "00:00:00 -0500" } }
|
17
|
-
let(:at_array) { { interval: 1.day, at: ["00:00:00 -0500", "01:00:00 -0500"]} }
|
18
|
-
let(:no_at) { { interval: 1.day } }
|
19
|
-
|
20
|
-
it "parses options `at` option as string" do
|
21
|
-
expect(DelayedCron.parse_options(at_string)[:at]).to eq("00:00:00 -0500")
|
22
|
-
end
|
23
|
-
|
24
|
-
it "parses options `at` option as array" do
|
25
|
-
expected_options_array = [
|
26
|
-
{ interval: 123, at: "00:00:00 -0500" },
|
27
|
-
{ interval: 123, at: "01:00:00 -0500" }
|
28
|
-
]
|
29
|
-
expect(DelayedCron.parse_options(at_array)[0][:at]).to eq("00:00:00 -0500")
|
30
|
-
expect(DelayedCron.parse_options(at_array)[1][:at]).to eq("01:00:00 -0500")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "does not change options if `at` is not present" do
|
34
|
-
expect(DelayedCron.parse_options(no_at)).to eq(no_at)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe ".add_interval" do
|
39
|
-
it 'adds an interval key and value to the options hash' do
|
40
|
-
options = DelayedCron.add_interval(at: '12:00:00 -0500')
|
41
|
-
expect(options).to include(:interval)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe ".convert_time_string_to_seconds_interval" do
|
46
|
-
let(:next_occurrence) do
|
47
|
-
DelayedCron.convert_time_string_to_seconds_interval(scheduled_time)
|
48
|
-
end
|
49
|
-
# Set Time.now to January 1, 2014 12:00:00 PM
|
50
|
-
before { Timecop.freeze(Time.local(2014, 1, 1, 12, 0, 0)) }
|
51
|
-
context "next occurrence is today" do
|
52
|
-
let(:known_interval) { 3600 }
|
53
|
-
let(:scheduled_time) { "13:00:00 -0500" }
|
54
|
-
it "converts a time string to seconds" do
|
55
|
-
expect(next_occurrence).to be(known_interval)
|
56
|
-
end
|
57
|
-
end
|
58
12
|
|
59
|
-
|
60
|
-
|
61
|
-
let(:scheduled_time) { "11:00:00 -0500" }
|
62
|
-
it "converts a time string to seconds" do
|
63
|
-
expect(next_occurrence).to be(known_interval)
|
64
|
-
end
|
13
|
+
expect(DelayedCron.processor.jobs.last["args"])
|
14
|
+
.to eq(["SomeClass", "long_method", { "interval" => 1.hour.to_s }])
|
65
15
|
end
|
66
|
-
|
67
16
|
end
|
68
17
|
|
69
18
|
describe ".timing_opts" do
|
@@ -74,10 +23,22 @@ describe DelayedCron::Scheduling do
|
|
74
23
|
|
75
24
|
it "collects the timing options" do
|
76
25
|
interval = { interval: 1.day }
|
77
|
-
timing_opts = DelayedCron.timing_opts(options
|
26
|
+
timing_opts = DelayedCron.timing_opts(options)
|
78
27
|
expect(timing_opts).to eq(options)
|
79
28
|
expect(timing_opts).not_to eq(interval)
|
80
29
|
end
|
30
|
+
|
31
|
+
it "passes time_zone through" do
|
32
|
+
options_with_zone = options.merge(time_zone: "UTC")
|
33
|
+
timing_opts = DelayedCron.timing_opts(options_with_zone)
|
34
|
+
expect(timing_opts).to eq(options_with_zone)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "ignores unknown parameters" do
|
38
|
+
timing_opts = DelayedCron.timing_opts(foo: :bar)
|
39
|
+
|
40
|
+
expect(timing_opts).to_not have_key(:foo)
|
41
|
+
end
|
81
42
|
end
|
82
43
|
|
83
44
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,6 +21,7 @@ end
|
|
21
21
|
def setup(options)
|
22
22
|
DelayedCron.setup do |config|
|
23
23
|
config.default_interval = options[:default_interval]
|
24
|
+
config.default_time_zone = options[:default_time_zone]
|
24
25
|
config.cron_jobs = options[:cron_jobs] || []
|
25
26
|
end
|
26
27
|
end
|
@@ -44,6 +45,6 @@ def build_class(class_name, name, options = {})
|
|
44
45
|
end
|
45
46
|
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
klass
|
49
|
-
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_cron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Grubbs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayed_job
|
@@ -181,6 +181,7 @@ files:
|
|
181
181
|
- delayed_cron.gemspec
|
182
182
|
- init.rb
|
183
183
|
- lib/delayed_cron.rb
|
184
|
+
- lib/delayed_cron/cron_job.rb
|
184
185
|
- lib/delayed_cron/jobs.rb
|
185
186
|
- lib/delayed_cron/jobs/delayed_job.rb
|
186
187
|
- lib/delayed_cron/jobs/resque.rb
|
@@ -190,6 +191,7 @@ files:
|
|
190
191
|
- lib/delayed_cron/scheduling.rb
|
191
192
|
- lib/delayed_cron/version.rb
|
192
193
|
- rails/init.rb
|
194
|
+
- spec/cron_job_spec.rb
|
193
195
|
- spec/delayed_cron_spec.rb
|
194
196
|
- spec/jobs/sidekiq_spec.rb
|
195
197
|
- spec/scheduling_spec.rb
|
@@ -218,6 +220,7 @@ signing_key:
|
|
218
220
|
specification_version: 4
|
219
221
|
summary: Run your cron jobs with sidekiq, delayed_job, resque, or sucker_punch.
|
220
222
|
test_files:
|
223
|
+
- spec/cron_job_spec.rb
|
221
224
|
- spec/delayed_cron_spec.rb
|
222
225
|
- spec/jobs/sidekiq_spec.rb
|
223
226
|
- spec/scheduling_spec.rb
|