sidekiq-scheduler 2.0.18 → 2.0.19

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c583329738c9061f81e69c8569679aa380195ed
4
- data.tar.gz: 8be6d8f440cc5baaedbccf260606e1805dffe319
3
+ metadata.gz: cd4d7812270a42a1fba60eb58d6bb15e64cea545
4
+ data.tar.gz: f19980d703c2914483df61357fc3edd7d5fb4887
5
5
  SHA512:
6
- metadata.gz: 16d39a833ee5a28ae52baf147bd8c0fa289e004dcdd999995b2623c9ab9f2ffdf65d69b6edfc5a9094892cb2b4fe220331e4cee3e419097f73d0fe214c42deb4
7
- data.tar.gz: 94afd34d4725a30fa42011295c855147ca8b4f372f852b7a675fbbba551a4f68ef7eff2fe8f210a04f36bd49dc9fff895ab581d563b172117aecdcdeda18c653
6
+ metadata.gz: 628c7aa26722c33a2744b3239412a307a59d9de62ac5182144eec62098942b5c31b902d24c22089b5bc6c8f5da8141ede0fbc29c42cc72f3f00301d329f929ea
7
+ data.tar.gz: dc1e2a7c303f10fee40dadb5fa7cdb3ad6b8c6e4c437c478ec1beb65c1f32bf2cb88955b7c7e1c625a5d4a628915d84b71795fe4318585904e4e5ca62fdbabea
data/README.md CHANGED
@@ -145,6 +145,22 @@ seconds past the minute).
145
145
  A big shout out to [rufus-scheduler](http://github.com/jmettraux/rufus-scheduler)
146
146
  for handling the heavy lifting of the actual scheduling engine.
147
147
 
148
+ ### Enabling/Disabling jobs
149
+
150
+ By default all the jobs are enabled. There is an option at job's configuration to change
151
+ this behavior.
152
+
153
+ ``` yaml
154
+ clear_leaderboards_moderator:
155
+ every: "30s"
156
+ class: CheckDaemon
157
+ enabled: false
158
+ description: "This job is disabled by default"
159
+ ```
160
+
161
+ However, the flag can be changed through the web interface at the Recurring Jobs tab.
162
+
163
+ NOTE: Changes made thorugh the UI supersede job's configuration, even after a restart.
148
164
 
149
165
  ### Loading the schedule
150
166
 
@@ -45,6 +45,10 @@ module SidekiqScheduler
45
45
  @attributes[key]
46
46
  end
47
47
 
48
+ def enabled?
49
+ Sidekiq::Scheduler.job_enabled?(@name)
50
+ end
51
+
48
52
  # Builds the presenter instances for the schedule hash
49
53
  #
50
54
  # @param schedule_hash [Hash] with the redis schedule
@@ -1,5 +1,5 @@
1
1
  require 'hashie'
2
- require 'multi_json'
2
+ require 'json'
3
3
 
4
4
  module SidekiqScheduler
5
5
  module Schedule
@@ -71,7 +71,7 @@ module SidekiqScheduler
71
71
  get_all_schedules
72
72
  else
73
73
  encoded_schedule = Sidekiq.redis { |r| r.hget(:schedules, name) }
74
- encoded_schedule.nil? ? nil : MultiJson.decode(encoded_schedule)
74
+ encoded_schedule.nil? ? nil : JSON(encoded_schedule)
75
75
  end
76
76
  end
77
77
 
@@ -83,7 +83,7 @@ module SidekiqScheduler
83
83
 
84
84
  Sidekiq.redis { |r| r.hgetall(:schedules) }.tap do |h|
85
85
  h.each do |name, config|
86
- schedules[name] = MultiJson.decode(config)
86
+ schedules[name] = JSON(config)
87
87
  end
88
88
  end
89
89
  end
@@ -103,7 +103,7 @@ module SidekiqScheduler
103
103
  def set_schedule(name, config)
104
104
  existing_config = get_schedule(name)
105
105
  unless existing_config && existing_config == config
106
- Sidekiq.redis { |r| r.hset(:schedules, name, MultiJson.encode(config)) }
106
+ Sidekiq.redis { |r| r.hset(:schedules, name, JSON(config)) }
107
107
  Sidekiq.redis { |r| r.sadd(:schedules_changed, name) }
108
108
  end
109
109
  config
@@ -1,5 +1,5 @@
1
1
  module SidekiqScheduler
2
2
 
3
- VERSION = '2.0.18'
3
+ VERSION = '2.0.19'
4
4
 
5
5
  end
@@ -18,6 +18,11 @@ module SidekiqScheduler
18
18
  Sidekiq::Scheduler.enqueue_job(schedule)
19
19
  redirect "#{root_path}recurring-jobs"
20
20
  end
21
+
22
+ app.get '/recurring-jobs/:name/toggle' do
23
+ Sidekiq::Scheduler.toggle_job_enabled(params[:name])
24
+ redirect "#{root_path}recurring-jobs"
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -2,13 +2,14 @@ require 'rufus/scheduler'
2
2
  require 'thwait'
3
3
  require 'sidekiq/util'
4
4
  require 'sidekiq-scheduler/manager'
5
+ require 'json'
5
6
 
6
7
  module Sidekiq
7
8
  class Scheduler
8
9
  extend Sidekiq::Util
9
10
 
10
11
  REGISTERED_JOBS_THRESHOLD_IN_SECONDS = 24 * 60 * 60
11
- RUFUS_METADATA_KEYS = %w(description at cron every in interval)
12
+ RUFUS_METADATA_KEYS = %w(description at cron every in interval enabled)
12
13
 
13
14
  # We expect rufus jobs to have #params
14
15
  Rufus::Scheduler::Job.module_eval do
@@ -335,10 +336,29 @@ module Sidekiq
335
336
 
336
337
  # Returns the key of the Redis hash for job's execution times hash
337
338
  #
339
+ # @return [String] with the key
338
340
  def next_times_key
339
341
  'sidekiq-scheduler:next_times'
340
342
  end
341
343
 
344
+ # Returns the Redis's key for saving schedule states.
345
+ #
346
+ # @return [String] with the key
347
+ def schedules_state_key
348
+ 'sidekiq-scheduler:states'
349
+ end
350
+
351
+ def job_enabled?(name)
352
+ job = Sidekiq.schedule[name]
353
+ schedule_state(name).fetch('enabled', job.fetch('enabled', true)) if job
354
+ end
355
+
356
+ def toggle_job_enabled(name)
357
+ state = schedule_state(name)
358
+ state['enabled'] = !job_enabled?(name)
359
+ set_schedule_state(name, state)
360
+ end
361
+
342
362
  private
343
363
 
344
364
  def new_rufus_scheduler
@@ -353,7 +373,7 @@ module Sidekiq
353
373
  opts = { :job => true, :tags => [name] }
354
374
 
355
375
  rufus_scheduler.send(interval_type, *args, opts) do |job, time|
356
- idempotent_job_enqueue(name, time, sanitize_job_config(config))
376
+ idempotent_job_enqueue(name, time, sanitize_job_config(config)) if job_enabled?(name)
357
377
  end
358
378
  end
359
379
 
@@ -361,6 +381,24 @@ module Sidekiq
361
381
  config.reject { |k, _| RUFUS_METADATA_KEYS.include?(k) }
362
382
  end
363
383
 
384
+ # Retrieves a schedule state
385
+ #
386
+ # @param name [String] with the schedule's name
387
+ # @return [Hash] with the schedule's state
388
+ def schedule_state(name)
389
+ state = Sidekiq.redis { |r| r.hget(schedules_state_key, name) }
390
+
391
+ state ? JSON(state) : {}
392
+ end
393
+
394
+ # Saves a schedule state
395
+ #
396
+ # @param name [String] with the schedule's name
397
+ # @param name [Hash] with the schedule's state
398
+ def set_schedule_state(name, state)
399
+ Sidekiq.redis { |r| r.hset(schedules_state_key, name, JSON(state)) }
400
+ end
401
+
364
402
  end
365
403
  end
366
404
  end
@@ -9,3 +9,5 @@ cs:
9
9
  enqueue_now: Zařadit nyní
10
10
  next_time: Příště
11
11
  no_next_time: no next execution for this job
12
+ disable: Zakázat
13
+ enable: Povolit
@@ -9,3 +9,5 @@ en:
9
9
  enqueue_now: Enqueue now
10
10
  next_time: Next Time
11
11
  no_next_time: no next execution for this job
12
+ disable: Disable
13
+ enable: Enable
@@ -9,3 +9,5 @@ es:
9
9
  enqueue_now: Encolar ahora
10
10
  next_time: Próxima ejecución
11
11
  no_next_time: esta tarea no se volverá a ejecutar
12
+ disable: Inhabilitar
13
+ enable: Habilitar
@@ -9,3 +9,5 @@ zh-cn:
9
9
  enqueue_now: 立即执行
10
10
  next_time: 下次执行时间
11
11
  no_next_time: 已无后续作业
12
+ disable: 禁用
13
+ enable: 启用
@@ -26,11 +26,16 @@
26
26
  <a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
27
27
  </td>
28
28
  <td><%= job['args'] %></td>
29
- <td><%= job.next_time || t('no_next_time') %></td>
29
+ <td><span style="<%= 'text-decoration:line-through' unless job.enabled? %>">
30
+ <%= job.next_time || t('no_next_time') %>
31
+ </span></td>
30
32
  <td class="text-center">
31
33
  <a class="btn btn-warn btn-xs" href="<%= root_path %>recurring-jobs/<%= URI.escape(job.name) %>/enqueue">
32
34
  <%= t('enqueue_now') %>
33
35
  </a>
36
+ <a class="btn <%= job.enabled? ? "btn-primary" : "btn-warn"%> btn-xs" href="<%= root_path %>recurring-jobs/<%= URI.escape(job.name) %>/toggle">
37
+ <%= job.enabled? ? t('disable') : t('enable') %>
38
+ </a>
34
39
  </td>
35
40
  </tr>
36
41
  <% end %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.18
4
+ version: 2.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morton Jonuschat
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-03 00:00:00.000000000 Z
12
+ date: 2016-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hashie
@@ -67,20 +67,6 @@ dependencies:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
69
  version: 3.1.8
70
- - !ruby/object:Gem::Dependency
71
- name: multi_json
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ~>
75
- - !ruby/object:Gem::Version
76
- version: '1'
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - ~>
82
- - !ruby/object:Gem::Version
83
- version: '1'
84
70
  - !ruby/object:Gem::Dependency
85
71
  name: tilt
86
72
  requirement: !ruby/object:Gem::Requirement
@@ -179,6 +165,20 @@ dependencies:
179
165
  - - ~>
180
166
  - !ruby/object:Gem::Version
181
167
  version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: byebug
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
182
  - !ruby/object:Gem::Dependency
183
183
  name: activejob
184
184
  requirement: !ruby/object:Gem::Requirement