sidecloq 0.1.0 → 0.1.1
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/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/README.md +84 -13
- data/Rakefile +24 -7
- data/clock_a_clock_on_the_side.png +0 -0
- data/lib/sidecloq/locker.rb +17 -14
- data/lib/sidecloq/runner.rb +6 -6
- data/lib/sidecloq/schedule.rb +3 -6
- data/lib/sidecloq/scheduler.rb +8 -8
- data/lib/sidecloq/utils.rb +4 -3
- data/lib/sidecloq/version.rb +1 -1
- data/lib/sidecloq/web.rb +3 -2
- data/lib/sidecloq.rb +7 -7
- data/screenshot.png +0 -0
- data/sidetoq.gemspec +17 -17
- data/web/views/recurring.erb +1 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c42da59e13d5181bbdaed20b903ea9ec5215d341
|
4
|
+
data.tar.gz: 80bcf519574b7937caa39c862305fedcec503587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d285cf602bc72794c0f01854550fd9a6315d2ab740633e67880e3ec2704f327fbbed220c8f46c013112525d406a8e0ff3609ac68bdac5b9b7ea9dfb98088bd9e
|
7
|
+
data.tar.gz: 6e6af9ab2fb27b80aa41020bb8d9dbd48b967cde2c9d5e8f943b25be7974d27fdb5c6a30127455c336d96c4a5b330e3b8497e01a903277ee4c8533d0a3a0c0ea
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,41 @@
|
|
1
|
+

|
2
|
+
|
1
3
|
# Sidecloq
|
2
4
|
|
3
5
|
[](https://travis-ci.org/mattyr/sidecloq)
|
6
|
+
[](https://badge.fury.io/rb/sidecloq)
|
7
|
+
[](https://codeclimate.com/github/mattyr/sidecloq)
|
8
|
+
[](https://codeclimate.com/github/mattyr/sidecloq/coverage)
|
9
|
+
[](https://gemnasium.com/mattyr/sidecloq)
|
4
10
|
|
5
|
-
|
11
|
+
Recurring / Periodic / Scheduled / Cron job extension for
|
12
|
+
[Sidekiq](https://github.com/mperham/sidekiq)
|
6
13
|
|
7
14
|
## Why
|
8
15
|
|
9
|
-
|
10
|
-
|
16
|
+
There are several options for running periodic tasks with Sidekiq,
|
17
|
+
including [Sidetiq](https://github.com/tobiassvn/sidetiq),
|
18
|
+
[sidekiq-scheduler](https://github.com/Moove-it/sidekiq-scheduler),
|
19
|
+
[sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron), as well as
|
20
|
+
[Sidekiq Pro](http://sidekiq.org/products/pro). Each tackles the
|
21
|
+
problem slightly differently. Sidecloq is inspired by various facets
|
22
|
+
of these projects, as well as
|
23
|
+
[resque-scheduler](https://github.com/resque/resque-scheduler). I urge
|
24
|
+
you to take a look at all of these options to see what works best for
|
25
|
+
you.
|
26
|
+
|
27
|
+
Sidecloq is:
|
28
|
+
|
29
|
+
- **Lightweight:** Celluloid is not required. This coincides well with
|
30
|
+
Sidekiq 4, which no longer uses Celluloid.
|
31
|
+
- **Clean:** Sidecloq leverages only the public API of Sidekiq, and does
|
32
|
+
not pollute the Sidekiq namespace.
|
33
|
+
- **Easy to deploy:** Sidecloq boots with all Sideqik processes,
|
34
|
+
automatically. Leader election ensures only one process enqueues
|
35
|
+
jobs, and a new leader is automatically chosen should the current
|
36
|
+
leader die.
|
37
|
+
- **Easy to configure:** Schedule configuration is done in YAML, using
|
38
|
+
the familiar cron syntax. No special DSL or job class mixins required.
|
11
39
|
|
12
40
|
## Installation
|
13
41
|
|
@@ -17,20 +45,61 @@ Add this line to your application's Gemfile:
|
|
17
45
|
gem 'sidecloq'
|
18
46
|
```
|
19
47
|
|
20
|
-
|
21
|
-
|
22
|
-
|
48
|
+
## Configuration
|
49
|
+
|
50
|
+
### Quickstart
|
51
|
+
|
52
|
+
Tell Sidecloq where your schedule file is located:
|
23
53
|
|
24
54
|
```ruby
|
25
55
|
Sidcloq.configure do |config|
|
26
|
-
config[:schedule_file] =
|
27
|
-
File.join(Rails.root, "config/myschedule.yml")
|
56
|
+
config[:schedule_file] = "path/to/myschedule.yml"
|
28
57
|
end
|
29
58
|
```
|
59
|
+
### Rails
|
30
60
|
|
31
|
-
|
61
|
+
If using Rails, and your schedule is located at config/sidecloq.yml,
|
62
|
+
Sidecloq will find the schedule automatically (ie, you don't have to use
|
63
|
+
the above configuration block).
|
32
64
|
|
33
|
-
|
65
|
+
## Schedule file format
|
66
|
+
|
67
|
+
### Example:
|
68
|
+
|
69
|
+
```yaml
|
70
|
+
my_scheduled_job: # a unique name for this schedule
|
71
|
+
class: Jobs::DoWork # the job class
|
72
|
+
cron: "* * * * *" # cron formatted schedule
|
73
|
+
queue: "queue_name" # Sidekiq queue for job
|
74
|
+
|
75
|
+
my_other_scheduled_job:
|
76
|
+
class: Jobs::AnotherClassName
|
77
|
+
cron: "1 1 * * *"
|
78
|
+
queue: "a_different_queue"
|
79
|
+
```
|
80
|
+
|
81
|
+
### Rails
|
82
|
+
|
83
|
+
If using Rails, you can nest the schedules under top-level environment
|
84
|
+
keys, and Sidecloq will select the correct group based on the Rails
|
85
|
+
environment. This is useful for development/staging scenarios. For
|
86
|
+
example:
|
87
|
+
|
88
|
+
```yaml
|
89
|
+
production:
|
90
|
+
# these will only run in production
|
91
|
+
my_scheduled_job:
|
92
|
+
class: Jobs::ClassName
|
93
|
+
cron: "* * * * *"
|
94
|
+
queue: "queue_name"
|
95
|
+
|
96
|
+
staging:
|
97
|
+
# this will only run in staging
|
98
|
+
my_other_scheduled_job:
|
99
|
+
class: Jobs::AnotherClassName
|
100
|
+
cron: "1 1 * * *"
|
101
|
+
queue: "a_different_queue"
|
102
|
+
```
|
34
103
|
|
35
104
|
## Web Extension
|
36
105
|
|
@@ -41,7 +110,11 @@ require 'sidekiq/web'
|
|
41
110
|
require 'sidecloq/web'
|
42
111
|
```
|
43
112
|
|
44
|
-
|
113
|
+
This will add a "Recurring" tab to the sidekiq web ui, where the loaded
|
114
|
+
schedules are displayed. You can enqueue a job immediately by clicking
|
115
|
+
it's corresponding "Enqueue now" button.
|
116
|
+
|
117
|
+

|
45
118
|
|
46
119
|
## Contributing
|
47
120
|
|
@@ -50,5 +123,3 @@ Bug reports and pull requests are welcome.
|
|
50
123
|
## License
|
51
124
|
|
52
125
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
53
|
-
|
54
|
-
TODO: project links
|
data/Rakefile
CHANGED
@@ -1,21 +1,38 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
5
|
+
t.libs << 'test'
|
6
|
+
t.libs << 'lib'
|
7
7
|
t.test_files = FileList['test/**/test_*.rb']
|
8
8
|
end
|
9
9
|
|
10
|
-
task :
|
10
|
+
task default: :test
|
11
11
|
|
12
|
-
desc
|
12
|
+
desc 'Run the Sidekiq web interface (w/Sidecloq)'
|
13
13
|
task :web do
|
14
14
|
require 'sidekiq'
|
15
15
|
require 'sidecloq'
|
16
16
|
|
17
17
|
Sidekiq.configure_client do |config|
|
18
|
-
config.redis = {
|
18
|
+
config.redis = {
|
19
|
+
url: 'redis://localhost:6379/0',
|
20
|
+
size: 1,
|
21
|
+
namespace: 'sidecloq'
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
# throw a fake job in
|
26
|
+
Sidecloq.configure do |config|
|
27
|
+
sched = Sidecloq::Schedule.from_hash({
|
28
|
+
my_scheduled_job: {
|
29
|
+
class: 'DoWork',
|
30
|
+
cron: '* * * * *',
|
31
|
+
queue: 'default'
|
32
|
+
}
|
33
|
+
})
|
34
|
+
sched.save_redis
|
35
|
+
config[:schedule] = sched
|
19
36
|
end
|
20
37
|
|
21
38
|
require 'sidekiq/web'
|
Binary file
|
data/lib/sidecloq/locker.rb
CHANGED
@@ -3,9 +3,9 @@ module Sidecloq
|
|
3
3
|
class Locker
|
4
4
|
include Utils
|
5
5
|
|
6
|
-
DEFAULT_LOCK_KEY =
|
6
|
+
DEFAULT_LOCK_KEY = 'sidecloq_leader_lock'
|
7
7
|
|
8
|
-
def initialize(options={})
|
8
|
+
def initialize(options = {})
|
9
9
|
# we keep a connection from the pool by default
|
10
10
|
@redis = options[:redis] || Sidekiq.redis_pool.checkout
|
11
11
|
@key = options[:lock_key] || DEFAULT_LOCK_KEY
|
@@ -24,33 +24,36 @@ module Sidecloq
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def stop(timeout = nil)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
return unless @check_task
|
28
|
+
|
29
|
+
logger.debug('Stopping locker check task')
|
30
|
+
@check_task.shutdown
|
31
|
+
@check_task.wait_for_termination(timeout)
|
32
|
+
logger.debug('Stopped locker check task')
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
35
|
+
def locked?
|
36
36
|
@obtained_lock.set?
|
37
37
|
end
|
38
38
|
|
39
39
|
private unless $TESTING
|
40
40
|
|
41
41
|
def start
|
42
|
-
logger.debug(
|
43
|
-
@check_task = Concurrent::TimerTask.new(
|
44
|
-
|
42
|
+
logger.debug('Starting locker check task')
|
43
|
+
@check_task = Concurrent::TimerTask.new(
|
44
|
+
execution_interval: @check_interval,
|
45
|
+
run_now: true
|
46
|
+
) do
|
47
|
+
try_to_get_or_refresh_lock
|
45
48
|
end
|
46
49
|
@check_task.execute
|
47
50
|
end
|
48
51
|
|
49
|
-
def
|
52
|
+
def try_to_get_or_refresh_lock
|
50
53
|
# redlock is in ms, not seconds
|
51
54
|
@lock = @lock_manager.lock(@key, @ttl * 1000, extend: @lock)
|
52
55
|
@obtained_lock.set if @lock
|
53
|
-
logger.debug("Leader lock #{
|
56
|
+
logger.debug("Leader lock #{'not ' unless @lock}held")
|
54
57
|
@lock
|
55
58
|
end
|
56
59
|
end
|
data/lib/sidecloq/runner.rb
CHANGED
@@ -13,24 +13,24 @@ module Sidecloq
|
|
13
13
|
|
14
14
|
def run
|
15
15
|
@thread = Thread.new do
|
16
|
-
logger.info(
|
16
|
+
logger.info('Runner starting')
|
17
17
|
@locker.with_lock do
|
18
18
|
# i am the leader
|
19
|
-
logger.info(
|
19
|
+
logger.info('Obtained leader lock')
|
20
20
|
@scheduler.run
|
21
21
|
end
|
22
|
-
logger.info(
|
22
|
+
logger.info('Runner ending')
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def stop(timeout = nil)
|
27
|
-
logger.debug(
|
28
|
-
if @locker.
|
27
|
+
logger.debug('Stopping runner')
|
28
|
+
if @locker.locked?
|
29
29
|
@scheduler.stop(timeout)
|
30
30
|
@locker.stop(timeout)
|
31
31
|
end
|
32
32
|
@thread.join if @thread
|
33
|
-
logger.debug(
|
33
|
+
logger.debug('Stopped runner')
|
34
34
|
end
|
35
35
|
|
36
36
|
private unless $TESTING
|
data/lib/sidecloq/schedule.rb
CHANGED
@@ -32,23 +32,20 @@ module Sidecloq
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.from_hash(hash)
|
35
|
-
if defined?(Rails) && hash.key?(Rails.env)
|
36
|
-
hash = hash[Rails.env]
|
37
|
-
end
|
35
|
+
hash = hash[Rails.env] if defined?(Rails) && hash.key?(Rails.env)
|
38
36
|
|
39
|
-
specs = hash.
|
37
|
+
specs = hash.each_with_object({}) do |(name, spec), memo|
|
40
38
|
memo[name] = spec.dup.tap do |s|
|
41
39
|
s['class'] = name unless spec.key?('class') || spec.key?(:class)
|
42
40
|
s['args'] = s['args'] || s[:args] || []
|
43
41
|
end
|
44
|
-
memo
|
45
42
|
end
|
46
43
|
|
47
44
|
new(specs)
|
48
45
|
end
|
49
46
|
|
50
47
|
def save_yaml(filename)
|
51
|
-
File.open(filename,'w') do |h|
|
48
|
+
File.open(filename, 'w') do |h|
|
52
49
|
h.write @job_specs.to_yaml
|
53
50
|
end
|
54
51
|
end
|
data/lib/sidecloq/scheduler.rb
CHANGED
@@ -10,13 +10,13 @@ module Sidecloq
|
|
10
10
|
|
11
11
|
# run queues jobs per their schedules, blocking forever
|
12
12
|
def run
|
13
|
-
logger.info(
|
13
|
+
logger.info('Loading schedules into redis')
|
14
14
|
sync_with_redis
|
15
|
-
logger.info(
|
15
|
+
logger.info('Starting scheduler')
|
16
16
|
load_schedule_into_rufus
|
17
|
-
logger.debug(
|
17
|
+
logger.debug('Joining rufus thread')
|
18
18
|
rufus.join
|
19
|
-
logger.debug(
|
19
|
+
logger.debug('Scheduler run ended')
|
20
20
|
end
|
21
21
|
|
22
22
|
def stop(timeout = nil)
|
@@ -33,7 +33,7 @@ module Sidecloq
|
|
33
33
|
rufus.shutdown(:wait)
|
34
34
|
end
|
35
35
|
rufus.join
|
36
|
-
logger.info(
|
36
|
+
logger.info('Stopped scheduler')
|
37
37
|
end
|
38
38
|
|
39
39
|
private unless $TESTING
|
@@ -47,7 +47,7 @@ module Sidecloq
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def load_schedule_into_rufus
|
50
|
-
logger.debug(
|
50
|
+
logger.debug('Scheduling jobs')
|
51
51
|
@schedule.job_specs.each do |name, spec|
|
52
52
|
load_into_rufus(name, spec)
|
53
53
|
end
|
@@ -71,14 +71,14 @@ module Sidecloq
|
|
71
71
|
|
72
72
|
# failed enqeueuing should not b0rk stuff
|
73
73
|
begin
|
74
|
-
enqueue_job!(
|
74
|
+
enqueue_job!(spec)
|
75
75
|
rescue => e
|
76
76
|
logger.info "error enqueuing #{name} - #{e.class.name}: #{e.message}"
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
80
|
# can raise exceptions, but shouldn't
|
81
|
-
def enqueue_job!(
|
81
|
+
def enqueue_job!(spec)
|
82
82
|
Sidekiq::Client.push(spec)
|
83
83
|
end
|
84
84
|
end
|
data/lib/sidecloq/utils.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Sidecloq
|
2
|
+
# Useful stuff
|
2
3
|
module Utils
|
4
|
+
# Sets the Sidekiq::Logging context automatically with direct calls to
|
5
|
+
# *.logger
|
3
6
|
class ContextLogger
|
4
7
|
def initialize(ctx)
|
5
8
|
@context = ctx
|
@@ -25,9 +28,7 @@ module Sidecloq
|
|
25
28
|
def will_never_run(cronline)
|
26
29
|
# look for non-existent day of month
|
27
30
|
split = cronline.split(/\s+/)
|
28
|
-
if split.length > 3 &&
|
29
|
-
split[2] =~ /\d+/
|
30
|
-
split[3] =~ /\d+/
|
31
|
+
if split.length > 3 && split[2] =~ /\d+/ && split[3] =~ /\d+/
|
31
32
|
|
32
33
|
month = split[3].to_i
|
33
34
|
day = split[2].to_i
|
data/lib/sidecloq/version.rb
CHANGED
data/lib/sidecloq/web.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Sidecloq
|
2
|
+
# Plugin for sidekiq-web
|
2
3
|
module Web
|
3
4
|
VIEW_PATH = File.expand_path('../../../web/views', __FILE__)
|
4
5
|
|
5
6
|
def self.registered(app)
|
6
|
-
|
7
7
|
app.get '/recurring' do
|
8
8
|
@schedule = Schedule.from_redis
|
9
9
|
|
@@ -11,12 +11,13 @@ module Sidecloq
|
|
11
11
|
end
|
12
12
|
|
13
13
|
app.post '/recurring/:name/enqueue' do |name|
|
14
|
+
# rubocop:disable Lint/AssignmentInCondition
|
14
15
|
if spec = Sidecloq::Schedule.from_redis.job_specs[name]
|
15
16
|
Sidekiq::Client.push(spec)
|
16
17
|
end
|
18
|
+
# rubocop:enableLint/AssignmentInCondition
|
17
19
|
redirect "#{root_path}recurring"
|
18
20
|
end
|
19
|
-
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
data/lib/sidecloq.rb
CHANGED
@@ -11,6 +11,7 @@ require 'sidecloq/scheduler'
|
|
11
11
|
require 'sidecloq/runner'
|
12
12
|
require 'sidecloq/version'
|
13
13
|
|
14
|
+
# Sideloq provides a lightweight recurring job scheduler for sidekiq
|
14
15
|
module Sidecloq
|
15
16
|
def self.install
|
16
17
|
Sidekiq.configure_server do |config|
|
@@ -33,13 +34,12 @@ module Sidecloq
|
|
33
34
|
end
|
34
35
|
|
35
36
|
def self.configure
|
36
|
-
yield
|
37
|
+
yield options
|
37
38
|
end
|
38
39
|
|
39
40
|
def self.startup
|
40
|
-
unless options[:scheduler]
|
41
|
-
|
42
|
-
end
|
41
|
+
options[:schedule] ||= extract_schedule unless options[:scheduler]
|
42
|
+
|
43
43
|
@runner = Runner.new(options)
|
44
44
|
@runner.run
|
45
45
|
end
|
@@ -55,13 +55,13 @@ module Sidecloq
|
|
55
55
|
return options[:schedule] if options[:schedule]
|
56
56
|
|
57
57
|
# try for a file
|
58
|
-
options[:schedule_file] ||=
|
59
|
-
if File.
|
58
|
+
options[:schedule_file] ||= 'config/sidecloq.yml'
|
59
|
+
if File.exist?(options[:schedule_file])
|
60
60
|
return Schedule.from_yaml(options[:schedule_file])
|
61
61
|
elsif defined?(Rails)
|
62
62
|
# try rails-root-relative
|
63
63
|
full_path = File.join(Rails.root, options[:schedule_file])
|
64
|
-
if File.
|
64
|
+
if File.exist?(full_path)
|
65
65
|
options[:schedule_file] = full_path
|
66
66
|
return Schedule.from_yaml(options[:schedule_file])
|
67
67
|
end
|
data/screenshot.png
ADDED
Binary file
|
data/sidetoq.gemspec
CHANGED
@@ -4,30 +4,30 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'sidecloq/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'sidecloq'
|
8
8
|
spec.version = Sidecloq::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Matt Robinson']
|
10
|
+
spec.email = ['robinson.matty@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
12
|
+
spec.summary = 'Recurring jobs for Sidekiq'
|
13
13
|
spec.description = spec.summary
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
14
|
+
spec.homepage = 'http://github.com/mattyr/sidecloq'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
18
|
+
spec.bindir = 'bin'
|
19
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_dependency
|
23
|
-
spec.add_dependency
|
22
|
+
spec.add_dependency 'sidekiq', '~> 4.0.1'
|
23
|
+
spec.add_dependency 'redlock', '~> 0.1.2'
|
24
24
|
# mimics some dev dependencies of sidekiq:
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency
|
28
|
-
spec.add_dependency
|
29
|
-
spec.add_dependency
|
25
|
+
spec.add_dependency 'concurrent-ruby'
|
26
|
+
spec.add_dependency 'sinatra', '~> 1.4', '>= 1.4.6'
|
27
|
+
spec.add_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
|
28
|
+
spec.add_dependency 'multi_json', '~> 1.11'
|
29
|
+
spec.add_dependency 'rufus-scheduler', '~> 3.1', '>= 3.1.10'
|
30
30
|
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'minitest'
|
33
33
|
end
|
data/web/views/recurring.erb
CHANGED
@@ -5,8 +5,7 @@
|
|
5
5
|
<thead>
|
6
6
|
<tr>
|
7
7
|
<th>Name</th>
|
8
|
-
<th>
|
9
|
-
<th>Interval</th>
|
8
|
+
<th>Cron</th>
|
10
9
|
<th>Class</th>
|
11
10
|
<th>Queue</th>
|
12
11
|
<th>Arguments</th>
|
@@ -18,7 +17,6 @@
|
|
18
17
|
<% @schedule.job_specs.each do |name, job_spec| %>
|
19
18
|
<tr>
|
20
19
|
<td><%= name %></td>
|
21
|
-
<td><%= job_spec['description'] %></td>
|
22
20
|
<td><%= job_spec.fetch 'cron', job_spec['every'] %></td>
|
23
21
|
<td><%= job_spec['class'] %></td>
|
24
22
|
<td>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidecloq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Robinson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -167,6 +167,7 @@ files:
|
|
167
167
|
- LICENSE.txt
|
168
168
|
- README.md
|
169
169
|
- Rakefile
|
170
|
+
- clock_a_clock_on_the_side.png
|
170
171
|
- lib/sidecloq.rb
|
171
172
|
- lib/sidecloq/locker.rb
|
172
173
|
- lib/sidecloq/runner.rb
|
@@ -175,6 +176,7 @@ files:
|
|
175
176
|
- lib/sidecloq/utils.rb
|
176
177
|
- lib/sidecloq/version.rb
|
177
178
|
- lib/sidecloq/web.rb
|
179
|
+
- screenshot.png
|
178
180
|
- sidetoq.gemspec
|
179
181
|
- web/views/recurring.erb
|
180
182
|
homepage: http://github.com/mattyr/sidecloq
|