resque 1.27.4 → 2.6.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.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY.md +122 -3
  3. data/README.markdown +441 -500
  4. data/bin/resque-web +10 -26
  5. data/lib/resque/data_store.rb +52 -58
  6. data/lib/resque/errors.rb +7 -1
  7. data/lib/resque/failure/airbrake.rb +19 -7
  8. data/lib/resque/failure/multiple.rb +6 -2
  9. data/lib/resque/failure/redis.rb +1 -1
  10. data/lib/resque/failure/redis_multi_queue.rb +1 -1
  11. data/lib/resque/failure.rb +7 -0
  12. data/lib/resque/job.rb +2 -2
  13. data/lib/resque/logging.rb +1 -1
  14. data/lib/resque/railtie.rb +10 -0
  15. data/lib/resque/server/public/jquery-3.6.0.min.js +2 -0
  16. data/lib/resque/server/public/main.js +3 -0
  17. data/lib/resque/server/public/ranger.js +7 -4
  18. data/lib/resque/server/public/style.css +3 -3
  19. data/lib/resque/server/views/error.erb +1 -1
  20. data/lib/resque/server/views/failed.erb +9 -3
  21. data/lib/resque/server/views/failed_job.erb +2 -2
  22. data/lib/resque/server/views/job_class.erb +3 -1
  23. data/lib/resque/server/views/key_string.erb +1 -1
  24. data/lib/resque/server/views/layout.erb +5 -4
  25. data/lib/resque/server/views/next_more.erb +14 -14
  26. data/lib/resque/server/views/queues.erb +6 -6
  27. data/lib/resque/server/views/stats.erb +5 -5
  28. data/lib/resque/server/views/working.erb +7 -7
  29. data/lib/resque/server.rb +11 -119
  30. data/lib/resque/server_helper.rb +185 -0
  31. data/lib/resque/stat.rb +16 -9
  32. data/lib/resque/tasks.rb +3 -11
  33. data/lib/resque/thread_signal.rb +13 -34
  34. data/lib/resque/vendor/utf8_util.rb +2 -8
  35. data/lib/resque/version.rb +1 -1
  36. data/lib/resque/web_runner.rb +374 -0
  37. data/lib/resque/worker.rb +76 -48
  38. data/lib/resque.rb +100 -27
  39. data/lib/tasks/redis.rake +10 -10
  40. metadata +44 -28
  41. data/lib/resque/server/helpers.rb +0 -64
  42. data/lib/resque/server/public/jquery-1.12.4.min.js +0 -5
  43. data/lib/resque/server/test_helper.rb +0 -19
  44. data/lib/resque/vendor/utf8_util/utf8_util_18.rb +0 -91
  45. data/lib/resque/vendor/utf8_util/utf8_util_19.rb +0 -6
data/lib/resque.rb CHANGED
@@ -23,6 +23,8 @@ require 'resque/thread_signal'
23
23
 
24
24
  require 'resque/vendor/utf8_util'
25
25
 
26
+ require 'resque/railtie' if defined?(Rails::Railtie)
27
+
26
28
  module Resque
27
29
  include Helpers
28
30
  extend self
@@ -112,13 +114,12 @@ module Resque
112
114
  def redis=(server)
113
115
  case server
114
116
  when String
115
- if server =~ /redis\:\/\//
116
- redis = Redis.connect(:url => server, :thread_safe => true)
117
+ if server =~ /rediss?\:\/\//
118
+ redis = Redis.new(:url => server)
117
119
  else
118
120
  server, namespace = server.split('/', 2)
119
121
  host, port, db = server.split(':')
120
- redis = Redis.new(:host => host, :port => port,
121
- :thread_safe => true, :db => db)
122
+ redis = Redis.new(:host => host, :port => port, :db => db)
122
123
  end
123
124
  namespace ||= :resque
124
125
 
@@ -147,26 +148,76 @@ module Resque
147
148
  data_store.identifier
148
149
  end
149
150
 
151
+ # Set the data store for the processed and failed statistics.
152
+ #
153
+ # By default it uses the same as `Resque.redis`, but different stores can be used.
154
+ #
155
+ # A custom store needs to obey the following API to work correctly
156
+ #
157
+ # class NullDataStore
158
+ # # Returns the current value for the given stat.
159
+ # def stat(stat)
160
+ # end
161
+ #
162
+ # # Increments the stat by the given value.
163
+ # def increment_stat(stat, by)
164
+ # end
165
+ #
166
+ # # Decrements the stat by the given value.
167
+ # def decrement_stat(stat, by)
168
+ # end
169
+ #
170
+ # # Clear the values for the given stat.
171
+ # def clear_stat(stat)
172
+ # end
173
+ # end
174
+ def stat_data_store=(stat_data_store)
175
+ Resque::Stat.data_store = stat_data_store
176
+ end
177
+
178
+ # Returns the data store for the statistics module.
179
+ def stat_data_store
180
+ Resque::Stat.data_store
181
+ end
182
+
150
183
  # Set or retrieve the current logger object
151
184
  attr_accessor :logger
152
185
 
153
186
  DEFAULT_HEARTBEAT_INTERVAL = 60
154
187
  DEFAULT_PRUNE_INTERVAL = DEFAULT_HEARTBEAT_INTERVAL * 5
155
188
 
189
+ # Defines how often a Resque worker updates the heartbeat key. Must be less
190
+ # than the prune interval.
156
191
  attr_writer :heartbeat_interval
157
192
  def heartbeat_interval
158
- @heartbeat_interval || DEFAULT_HEARTBEAT_INTERVAL
193
+ if defined? @heartbeat_interval
194
+ @heartbeat_interval
195
+ else
196
+ DEFAULT_HEARTBEAT_INTERVAL
197
+ end
159
198
  end
160
199
 
200
+ # Defines how often Resque checks for dead workers.
161
201
  attr_writer :prune_interval
162
202
  def prune_interval
163
- @prune_interval || DEFAULT_PRUNE_INTERVAL
203
+ if defined? @prune_interval
204
+ @prune_interval
205
+ else
206
+ DEFAULT_PRUNE_INTERVAL
207
+ end
164
208
  end
165
209
 
210
+ # By default, jobs are pushed to the back of the queue and popped from
211
+ # the front, resulting in "first in, first out" (FIFO) execution order.
212
+ # Set to true to push jobs to the front of the queue instead, resulting
213
+ # in "last in, first out" (LIFO) execution order.
166
214
  attr_writer :enqueue_front
167
215
  def enqueue_front
168
- return @enqueue_front unless @enqueue_front.nil?
169
- @enqueue_front = false
216
+ if defined? @enqueue_front
217
+ @enqueue_front
218
+ else
219
+ @enqueue_front = false
220
+ end
170
221
  end
171
222
 
172
223
  # The `before_first_fork` hook will be run in the **parent** process
@@ -237,6 +288,34 @@ module Resque
237
288
  register_hook(:after_pause, block)
238
289
  end
239
290
 
291
+ # The `queue_empty` hook will be run in the **parent** process when
292
+ # the worker finds no more jobs in the queue and becomes idle.
293
+ #
294
+ # Call with a block to register a hook.
295
+ # Call with no arguments to return all registered hooks.
296
+ def queue_empty(&block)
297
+ block ? register_hook(:queue_empty, block) : hooks(:queue_empty)
298
+ end
299
+
300
+ # Register a queue_empty proc.
301
+ def queue_empty=(block)
302
+ register_hook(:queue_empty, block)
303
+ end
304
+
305
+ # The `worker_exit` hook will be run in the **parent** process
306
+ # after the worker has existed (via SIGQUIT, SIGTERM, SIGINT, etc.).
307
+ #
308
+ # Call with a block to register a hook.
309
+ # Call with no arguments to return all registered hooks.
310
+ def worker_exit(&block)
311
+ block ? register_hook(:worker_exit, block) : hooks(:worker_exit)
312
+ end
313
+
314
+ # Register a worker_exit proc.
315
+ def worker_exit=(block)
316
+ register_hook(:worker_exit, block)
317
+ end
318
+
240
319
  def to_s
241
320
  "Resque Client connected to #{redis_id}"
242
321
  end
@@ -284,8 +363,8 @@ module Resque
284
363
  data_store.queue_size(queue)
285
364
  end
286
365
 
287
- # Returns an array of items currently queued. Queue name should be
288
- # a string.
366
+ # Returns an array of items currently queued, or the item itself
367
+ # if count = 1. Queue name should be a string.
289
368
  #
290
369
  # start and count should be integer and can be used for pagination.
291
370
  # start is the item to begin, count is how many items to return.
@@ -424,7 +503,7 @@ module Resque
424
503
  # Given a class, try to extrapolate an appropriate queue based on a
425
504
  # class instance variable or `queue` method.
426
505
  def queue_from_class(klass)
427
- klass.instance_variable_get(:@queue) ||
506
+ (klass.instance_variable_defined?(:@queue) && klass.instance_variable_get(:@queue)) ||
428
507
  (klass.respond_to?(:queue) and klass.queue)
429
508
  end
430
509
 
@@ -483,7 +562,7 @@ module Resque
483
562
  # Returns a hash, similar to redis-rb's #info, of interesting stats.
484
563
  def info
485
564
  return {
486
- :pending => queue_sizes.inject(0) { |sum, (queue_name, queue_size)| sum + queue_size },
565
+ :pending => queue_sizes.inject(0) { |sum, (_queue_name, queue_size)| sum + queue_size },
487
566
  :processed => Stat[:processed],
488
567
  :queues => queues.size,
489
568
  :workers => workers.size.to_i,
@@ -504,9 +583,9 @@ module Resque
504
583
  def queue_sizes
505
584
  queue_names = queues
506
585
 
507
- sizes = redis.pipelined do
586
+ sizes = redis.pipelined do |piped|
508
587
  queue_names.each do |name|
509
- redis.llen("queue:#{name}")
588
+ piped.llen("queue:#{name}")
510
589
  end
511
590
  end
512
591
 
@@ -517,11 +596,11 @@ module Resque
517
596
  def sample_queues(sample_size = 1000)
518
597
  queue_names = queues
519
598
 
520
- samples = redis.pipelined do
599
+ samples = redis.pipelined do |piped|
521
600
  queue_names.each do |name|
522
601
  key = "queue:#{name}"
523
- redis.llen(key)
524
- redis.lrange(key, 0, sample_size - 1)
602
+ piped.llen(key)
603
+ piped.lrange(key, 0, sample_size - 1)
525
604
  end
526
605
  end
527
606
 
@@ -543,6 +622,8 @@ module Resque
543
622
 
544
623
  private
545
624
 
625
+ @hooks = Hash.new { |h, k| h[k] = [] }
626
+
546
627
  # Register a new proc as a hook. If the block is nil this is the
547
628
  # equivalent of removing all hooks of the given name.
548
629
  #
@@ -550,26 +631,18 @@ module Resque
550
631
  def register_hook(name, block)
551
632
  return clear_hooks(name) if block.nil?
552
633
 
553
- @hooks ||= {}
554
- @hooks[name] ||= []
555
-
556
634
  block = Array(block)
557
635
  @hooks[name].concat(block)
558
636
  end
559
637
 
560
638
  # Clear all hooks given a hook name.
561
639
  def clear_hooks(name)
562
- @hooks && @hooks[name] = []
563
- end
564
-
565
- # Retrieve all hooks
566
- def hooks
567
- @hooks || {}
640
+ @hooks[name] = []
568
641
  end
569
642
 
570
643
  # Retrieve all hooks of a given name.
571
644
  def hooks(name)
572
- (@hooks && @hooks[name]) || []
645
+ @hooks[name]
573
646
  end
574
647
  end
575
648
 
data/lib/tasks/redis.rake CHANGED
@@ -17,7 +17,7 @@ class RedisRunner
17
17
  end
18
18
 
19
19
  def self.config
20
- @config ||= if File.exists?(redis_dir + 'etc/redis.conf')
20
+ @config ||= if File.exist?(redis_dir + 'etc/redis.conf')
21
21
  redis_dir + 'etc/redis.conf'
22
22
  else
23
23
  redis_dir + '../etc/redis.conf'
@@ -30,7 +30,7 @@ class RedisRunner
30
30
 
31
31
  # Just check for existance of dtach socket
32
32
  def self.running?
33
- File.exists? dtach_socket
33
+ File.exist? dtach_socket
34
34
  end
35
35
 
36
36
  def self.start
@@ -90,10 +90,10 @@ namespace :redis do
90
90
 
91
91
  if ENV['PREFIX']
92
92
  bin_dir = "#{ENV['PREFIX']}/bin"
93
- sh "mkdir -p #{bin_dir}" unless File.exists?("#{bin_dir}")
93
+ sh "mkdir -p #{bin_dir}" unless File.exist?("#{bin_dir}")
94
94
 
95
95
  conf_dir = "#{ENV['PREFIX']}/etc"
96
- sh "mkdir -p #{conf_dir}" unless File.exists?("#{conf_dir}")
96
+ sh "mkdir -p #{conf_dir}" unless File.exist?("#{conf_dir}")
97
97
  end
98
98
 
99
99
  %w(redis-benchmark redis-cli redis-server).each do |bin|
@@ -102,7 +102,7 @@ namespace :redis do
102
102
 
103
103
  puts "Installed redis-benchmark, redis-cli and redis-server to #{bin_dir}"
104
104
 
105
- unless File.exists?("#{conf_dir}/redis.conf")
105
+ unless File.exist?("#{conf_dir}/redis.conf")
106
106
  sh "cp #{INSTALL_DIR}/redis.conf #{conf_dir}/redis.conf"
107
107
  puts "Installed redis.conf to #{conf_dir} \n You should look at this file!"
108
108
  end
@@ -115,9 +115,9 @@ namespace :redis do
115
115
 
116
116
  desc "Download package"
117
117
  task :download do
118
- sh "rm -rf #{INSTALL_DIR}/" if File.exists?("#{INSTALL_DIR}/.svn")
119
- sh "git clone git://github.com/antirez/redis.git #{INSTALL_DIR}" unless File.exists?(INSTALL_DIR)
120
- sh "cd #{INSTALL_DIR} && git pull" if File.exists?("#{INSTALL_DIR}/.git")
118
+ sh "rm -rf #{INSTALL_DIR}/" if File.exist?("#{INSTALL_DIR}/.svn")
119
+ sh "git clone git://github.com/antirez/redis.git #{INSTALL_DIR}" unless File.exist?(INSTALL_DIR)
120
+ sh "cd #{INSTALL_DIR} && git pull" if File.exist?("#{INSTALL_DIR}/.git")
121
121
  end
122
122
  end
123
123
 
@@ -135,7 +135,7 @@ namespace :dtach do
135
135
 
136
136
  if ENV['PREFIX']
137
137
  bin_dir = "#{ENV['PREFIX']}/bin"
138
- sh "mkdir -p #{bin_dir}" unless File.exists?("#{bin_dir}")
138
+ sh "mkdir -p #{bin_dir}" unless File.exist?("#{bin_dir}")
139
139
  end
140
140
 
141
141
  sh "cp #{INSTALL_DIR}/dtach-0.8/dtach #{bin_dir}"
@@ -147,7 +147,7 @@ namespace :dtach do
147
147
 
148
148
  desc "Download package"
149
149
  task :download do
150
- unless File.exists?("#{INSTALL_DIR}/dtach-0.8.tar.gz")
150
+ unless File.exist?("#{INSTALL_DIR}/dtach-0.8.tar.gz")
151
151
  require 'net/http'
152
152
 
153
153
  url = 'http://downloads.sourceforge.net/project/dtach/dtach/0.8/dtach-0.8.tar.gz'
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.27.4
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Wanstrath
8
8
  - Steve Klabnik
9
9
  - Terence Lee
10
+ - Michael Bianco
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2017-04-15 00:00:00.000000000 Z
14
+ date: 2023-08-19 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: redis-namespace
@@ -18,28 +19,14 @@ dependencies:
18
19
  requirements:
19
20
  - - "~>"
20
21
  - !ruby/object:Gem::Version
21
- version: '1.3'
22
+ version: '1.6'
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
26
  requirements:
26
27
  - - "~>"
27
28
  - !ruby/object:Gem::Version
28
- version: '1.3'
29
- - !ruby/object:Gem::Dependency
30
- name: vegas
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - "~>"
34
- - !ruby/object:Gem::Version
35
- version: 0.1.2
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: 0.1.2
29
+ version: '1.6'
43
30
  - !ruby/object:Gem::Dependency
44
31
  name: sinatra
45
32
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +69,34 @@ dependencies:
82
69
  - - "~>"
83
70
  - !ruby/object:Gem::Version
84
71
  version: '1.0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: thin
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: webrick
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
85
100
  description: |2
86
101
  Resque is a Redis-backed Ruby library for creating background jobs,
87
102
  placing those jobs on multiple queues, and processing them later.
@@ -128,18 +143,18 @@ files:
128
143
  - lib/resque/log_formatters/very_verbose_formatter.rb
129
144
  - lib/resque/logging.rb
130
145
  - lib/resque/plugin.rb
146
+ - lib/resque/railtie.rb
131
147
  - lib/resque/server.rb
132
- - lib/resque/server/helpers.rb
133
148
  - lib/resque/server/public/favicon.ico
134
149
  - lib/resque/server/public/idle.png
135
- - lib/resque/server/public/jquery-1.12.4.min.js
150
+ - lib/resque/server/public/jquery-3.6.0.min.js
136
151
  - lib/resque/server/public/jquery.relatize_date.js
152
+ - lib/resque/server/public/main.js
137
153
  - lib/resque/server/public/poll.png
138
154
  - lib/resque/server/public/ranger.js
139
155
  - lib/resque/server/public/reset.css
140
156
  - lib/resque/server/public/style.css
141
157
  - lib/resque/server/public/working.png
142
- - lib/resque/server/test_helper.rb
143
158
  - lib/resque/server/views/error.erb
144
159
  - lib/resque/server/views/failed.erb
145
160
  - lib/resque/server/views/failed_job.erb
@@ -155,20 +170,22 @@ files:
155
170
  - lib/resque/server/views/stats.erb
156
171
  - lib/resque/server/views/workers.erb
157
172
  - lib/resque/server/views/working.erb
173
+ - lib/resque/server_helper.rb
158
174
  - lib/resque/stat.rb
159
175
  - lib/resque/tasks.rb
160
176
  - lib/resque/thread_signal.rb
161
177
  - lib/resque/vendor/utf8_util.rb
162
- - lib/resque/vendor/utf8_util/utf8_util_18.rb
163
- - lib/resque/vendor/utf8_util/utf8_util_19.rb
164
178
  - lib/resque/version.rb
179
+ - lib/resque/web_runner.rb
165
180
  - lib/resque/worker.rb
166
181
  - lib/tasks/redis.rake
167
182
  - lib/tasks/resque.rake
168
- homepage: http://resque.github.io/
183
+ homepage: https://github.com/resque/resque
169
184
  licenses:
170
185
  - MIT
171
- metadata: {}
186
+ metadata:
187
+ changelog_uri: https://github.com/resque/resque/blob/master/HISTORY.md
188
+ rubygems_mfa_required: 'true'
172
189
  post_install_message:
173
190
  rdoc_options:
174
191
  - "--charset=UTF-8"
@@ -178,15 +195,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
195
  requirements:
179
196
  - - ">="
180
197
  - !ruby/object:Gem::Version
181
- version: '0'
198
+ version: 2.3.0
182
199
  required_rubygems_version: !ruby/object:Gem::Requirement
183
200
  requirements:
184
201
  - - ">="
185
202
  - !ruby/object:Gem::Version
186
203
  version: '0'
187
204
  requirements: []
188
- rubyforge_project:
189
- rubygems_version: 2.6.11
205
+ rubygems_version: 3.4.10
190
206
  signing_key:
191
207
  specification_version: 4
192
208
  summary: Resque is a Redis-backed queueing system.
@@ -1,64 +0,0 @@
1
- Resque::Server.helpers do
2
- ####################
3
- #failed.erb helpers#
4
- ####################
5
-
6
- def failed_date_format
7
- "%Y/%m/%d %T %z"
8
- end
9
-
10
- def failed_multiple_queues?
11
- return @multiple_failed_queues if defined?(@multiple_failed_queues)
12
- @multiple_failed_queues = Resque::Failure.queues.size > 1
13
- end
14
-
15
- def failed_size
16
- @failed_size ||= Resque::Failure.count(params[:queue], params[:class])
17
- end
18
-
19
- def failed_per_page
20
- @failed_per_page = if params[:class]
21
- failed_size
22
- else
23
- 20
24
- end
25
- end
26
-
27
- def failed_start_at
28
- params[:start].to_i
29
- end
30
-
31
- def failed_end_at
32
- if failed_start_at + failed_per_page > failed_size
33
- failed_size
34
- else
35
- failed_start_at + failed_per_page - 1
36
- end
37
- end
38
-
39
- def failed_order
40
- params[:order] || 'desc'
41
- end
42
-
43
- def failed_class_counts(queue = params[:queue])
44
- classes = Hash.new(0)
45
- Resque::Failure.each(0, Resque::Failure.count(queue), queue) do |_, item|
46
- class_name = item['payload']['class'] if item['payload']
47
- class_name ||= "nil"
48
- classes[class_name] += 1
49
- end
50
- classes
51
- end
52
-
53
- def page_entries_info(start, stop, size, name = nil)
54
- if size == 0
55
- name ? "No #{name}s" : '<b>0</b>'
56
- elsif size == 1
57
- 'Showing <b>1</b>' + (name ? " #{name}" : '')
58
- elsif size > failed_per_page
59
- "Showing #{start}-#{stop} of <b>#{size}</b>" + (name ? " #{name}s" : '')
60
- else
61
- "Showing #{start} to <b>#{size - 1}</b>" + (name ? " #{name}s" : '')
62
- end
63
- end
64
- end