qu 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.
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source "http://rubygems.org"
2
2
  gemspec :name => 'qu'
3
3
 
4
4
  Dir['qu-*.gemspec'].each do |gemspec|
5
- plugin = gemspec.scan(/qu-(.*)\.gemspec/).to_s
5
+ plugin = gemspec.scan(/qu-(.*)\.gemspec/).flatten.first
6
6
 
7
7
  group plugin do
8
8
  gemspec(:name => "qu-#{plugin}", :development_group => plugin)
@@ -10,8 +10,9 @@ Dir['qu-*.gemspec'].each do |gemspec|
10
10
  end
11
11
 
12
12
  group :test do
13
- gem 'SystemTimer', :platform => :mri_18
14
- gem 'ruby-debug', :platform => :mri_18
13
+ gem 'SystemTimer', :platform => :mri_18
14
+ gem 'ruby-debug', :platform => :mri_18
15
+ gem 'ruby-debug19', :platform => :mri_19, :require => 'ruby-debug'
15
16
  gem 'rake'
16
17
  gem 'rspec', '~> 2.0'
17
18
  gem 'guard-rspec'
data/README.md CHANGED
@@ -102,7 +102,8 @@ However, if you do need to customize it, you can by calling the `Qu.configure`:
102
102
 
103
103
  ``` ruby
104
104
  Qu.configure do |c|
105
- c.connection = Redis::Namespace.new('myapp:qu', :redis => Redis.connect)
105
+ c.connection = Redis::Namespace.new('myapp:qu', :redis => Redis.connect)
106
+ c.logger = Logger.new('log/qu.log')
106
107
  end
107
108
  ```
108
109
 
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ task :release => :build do
17
17
  sh "git tag v#{Qu::VERSION}"
18
18
  sh "git push origin master"
19
19
  sh "git push origin v#{Qu::VERSION}"
20
- sh "ls pkg/*.gem | xargs gem push"
20
+ sh "ls pkg/*.gem | xargs -n 1 gem push"
21
21
  end
22
22
 
23
23
  require 'rspec/core/rake_task'
data/lib/qu.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'qu/version'
2
+ require 'qu/logger'
2
3
  require 'qu/failure'
3
- require 'qu/job'
4
+ require 'qu/payload'
4
5
  require 'qu/backend/base'
5
6
 
6
7
  require 'forwardable'
8
+ require 'logger'
7
9
 
8
10
  module Qu
9
11
  autoload :Worker, 'qu/worker'
@@ -11,9 +13,9 @@ module Qu
11
13
  extend SingleForwardable
12
14
  extend self
13
15
 
14
- attr_accessor :backend, :failure
16
+ attr_accessor :backend, :failure, :logger
15
17
 
16
- def_delegators :backend, :enqueue, :length, :queues, :reserve, :clear, :connection=
18
+ def_delegators :backend, :length, :queues, :reserve, :clear, :connection=
17
19
 
18
20
  def backend
19
21
  @backend || raise("Qu backend not configured. Install one of the backend gems like qu-redis.")
@@ -22,6 +24,15 @@ module Qu
22
24
  def configure(&block)
23
25
  block.call(self)
24
26
  end
27
+
28
+ def enqueue(klass, *args)
29
+ backend.enqueue Payload.new(:klass => klass, :args => args)
30
+ end
31
+ end
32
+
33
+ Qu.configure do |c|
34
+ c.logger = Logger.new(STDOUT)
35
+ c.logger.level = Logger::INFO
25
36
  end
26
37
 
27
38
  require 'qu/railtie' if defined?(Rails)
@@ -3,6 +3,7 @@ require 'multi_json'
3
3
  module Qu
4
4
  module Backend
5
5
  class Base
6
+ include Logger
6
7
  attr_accessor :connection
7
8
 
8
9
  private
@@ -1,3 +1,8 @@
1
+ unless defined?(SystemTimer)
2
+ require 'timeout'
3
+ SystemTimer = Timeout
4
+ end
5
+
1
6
  class SimpleJob
2
7
  def self.perform
3
8
  end
@@ -9,6 +14,7 @@ end
9
14
 
10
15
  shared_examples_for 'a backend' do
11
16
  let(:worker) { Qu::Worker.new('default') }
17
+ let(:payload) { Qu::Payload.new(:klass => SimpleJob) }
12
18
 
13
19
  before(:all) do
14
20
  Qu.backend = described_class.new
@@ -20,53 +26,58 @@ shared_examples_for 'a backend' do
20
26
  end
21
27
 
22
28
  describe 'enqueue' do
23
- it 'should return a job id' do
24
- subject.enqueue(SimpleJob).should be_instance_of(Qu::Job)
29
+ it 'should return a payload' do
30
+ subject.enqueue(payload).should be_instance_of(Qu::Payload)
31
+ end
32
+
33
+ it 'should set the payload id' do
34
+ subject.enqueue(payload)
35
+ payload.id.should_not be_nil
25
36
  end
26
37
 
27
38
  it 'should add a job to the queue' do
28
- job = subject.enqueue(SimpleJob)
29
- job.queue.should == 'default'
30
- subject.length(job.queue).should == 1
39
+ subject.enqueue(payload)
40
+ payload.queue.should == 'default'
41
+ subject.length(payload.queue).should == 1
31
42
  end
32
43
 
33
44
  it 'should add queue to list of queues' do
34
45
  subject.queues.should == []
35
- job = subject.enqueue(SimpleJob)
36
- subject.queues.should == [job.queue]
46
+ subject.enqueue(payload)
47
+ subject.queues.should == [payload.queue]
37
48
  end
38
49
 
39
50
  it 'should assign a different job id for the same job enqueue multiple times' do
40
- subject.enqueue(SimpleJob).id.should_not == subject.enqueue(SimpleJob).id
51
+ subject.enqueue(payload).id.should_not == subject.enqueue(payload).id
41
52
  end
42
53
  end
43
54
 
44
55
  describe 'length' do
45
56
  it 'should use the default queue by default' do
46
57
  subject.length.should == 0
47
- subject.enqueue(SimpleJob)
58
+ subject.enqueue(payload)
48
59
  subject.length.should == 1
49
60
  end
50
61
  end
51
62
 
52
63
  describe 'clear' do
53
64
  it 'should clear jobs for given queue' do
54
- job = subject.enqueue SimpleJob
55
- subject.length(job.queue).should == 1
56
- subject.clear(job.queue)
57
- subject.length(job.queue).should == 0
58
- subject.queues.should_not include(job.queue)
65
+ subject.enqueue payload
66
+ subject.length(payload.queue).should == 1
67
+ subject.clear(payload.queue)
68
+ subject.length(payload.queue).should == 0
69
+ subject.queues.should_not include(payload.queue)
59
70
  end
60
71
 
61
72
  it 'should not clear jobs for a different queue' do
62
- job = subject.enqueue SimpleJob
73
+ subject.enqueue(payload)
63
74
  subject.clear('other')
64
- subject.length(job.queue).should == 1
75
+ subject.length(payload.queue).should == 1
65
76
  end
66
77
 
67
78
  it 'should clear all queues without any args' do
68
- subject.enqueue(SimpleJob).queue.should == 'default'
69
- subject.enqueue(CustomQueue).queue.should == 'custom'
79
+ subject.enqueue(payload).queue.should == 'default'
80
+ subject.enqueue(Qu::Payload.new(:klass => CustomQueue)).queue.should == 'custom'
70
81
  subject.length('default').should == 1
71
82
  subject.length('custom').should == 1
72
83
  subject.clear
@@ -75,16 +86,16 @@ shared_examples_for 'a backend' do
75
86
  end
76
87
 
77
88
  it 'should clear failed queue without any args' do
78
- job = subject.enqueue SimpleJob
79
- subject.failed(job, Exception.new)
89
+ subject.enqueue(payload)
90
+ subject.failed(payload, Exception.new)
80
91
  subject.length('failed').should == 1
81
92
  subject.clear
82
93
  subject.length('failed').should == 0
83
94
  end
84
95
 
85
96
  it 'should not clear failed queue with specified queues' do
86
- job = subject.enqueue SimpleJob
87
- subject.failed(job, Exception.new)
97
+ subject.enqueue(payload)
98
+ subject.failed(payload, Exception.new)
88
99
  subject.length('failed').should == 1
89
100
  subject.clear('default')
90
101
  subject.length('failed').should == 1
@@ -93,26 +104,26 @@ shared_examples_for 'a backend' do
93
104
 
94
105
  describe 'reserve' do
95
106
  before do
96
- @job = subject.enqueue SimpleJob
107
+ subject.enqueue(payload)
97
108
  end
98
109
 
99
110
  it 'should return next job' do
100
- subject.reserve(worker).id.should == @job.id
111
+ subject.reserve(worker).id.should == payload.id
101
112
  end
102
113
 
103
114
  it 'should not return an already reserved job' do
104
- another_job = subject.enqueue SimpleJob
115
+ subject.enqueue(payload)
105
116
  subject.reserve(worker).id.should_not == subject.reserve(worker).id
106
117
  end
107
118
 
108
119
  it 'should return next job in given queues' do
109
- subject.enqueue SimpleJob
110
- job = subject.enqueue CustomQueue
111
- subject.enqueue SimpleJob
120
+ subject.enqueue(payload.dup)
121
+ custom = subject.enqueue(Qu::Payload.new(:klass => CustomQueue))
122
+ subject.enqueue(payload.dup)
112
123
 
113
124
  worker = Qu::Worker.new('custom', 'default')
114
125
 
115
- subject.reserve(worker).id.should == job.id
126
+ subject.reserve(worker).id.should == custom.id
116
127
  end
117
128
 
118
129
  it 'should not return job from different queue' do
@@ -143,15 +154,15 @@ shared_examples_for 'a backend' do
143
154
  end
144
155
 
145
156
  describe 'failed' do
146
- let(:job) { Qu::Job.new('1', SimpleJob, []) }
157
+ let(:payload) { Qu::Payload.new(:id => '1', :klass => SimpleJob) }
147
158
 
148
159
  it 'should add to failure queue' do
149
- subject.failed(job, Exception.new)
160
+ subject.failed(payload, Exception.new)
150
161
  subject.length('failed').should == 1
151
162
  end
152
163
 
153
164
  it 'should not add failed queue to the list of queues' do
154
- subject.failed(job, Exception.new)
165
+ subject.failed(payload, Exception.new)
155
166
  subject.queues.should_not include('failed')
156
167
  end
157
168
  end
@@ -164,45 +175,45 @@ shared_examples_for 'a backend' do
164
175
 
165
176
  describe 'release' do
166
177
  before do
167
- subject.enqueue SimpleJob
178
+ subject.enqueue(payload)
168
179
  end
169
180
 
170
181
  it 'should add the job back on the queue' do
171
- job = subject.reserve(worker)
172
- subject.length(job.queue).should == 0
173
- subject.release(job)
174
- subject.length(job.queue).should == 1
182
+ subject.reserve(worker).id.should == payload.id
183
+ subject.length(payload.queue).should == 0
184
+ subject.release(payload)
185
+ subject.length(payload.queue).should == 1
175
186
  end
176
187
  end
177
188
 
178
189
  describe 'requeue' do
179
190
  context 'with a failed job' do
180
191
  before do
181
- subject.enqueue(SimpleJob)
182
- @job = subject.reserve(worker)
183
- subject.failed(@job, Exception.new)
192
+ subject.enqueue(payload)
193
+ subject.reserve(worker).id.should == payload.id
194
+ subject.failed(payload, Exception.new)
184
195
  end
185
196
 
186
197
  it 'should add the job back on the queue' do
187
- subject.length(@job.queue).should == 0
188
- subject.requeue(@job.id)
189
- subject.length(@job.queue).should == 1
190
-
191
- job = subject.reserve(worker)
192
- job.should be_instance_of(Qu::Job)
193
- job.id.should == @job.id
194
- job.klass.should == @job.klass
195
- job.args.should == @job.args
198
+ subject.length(payload.queue).should == 0
199
+ subject.requeue(payload.id)
200
+ subject.length(payload.queue).should == 1
201
+
202
+ p = subject.reserve(worker)
203
+ p.should be_instance_of(Qu::Payload)
204
+ p.id.should == payload.id
205
+ p.klass.should == payload.klass
206
+ p.args.should == payload.args
196
207
  end
197
208
 
198
209
  it 'should remove the job from the failed jobs' do
199
210
  subject.length('failed').should == 1
200
- subject.requeue(@job.id)
211
+ subject.requeue(payload.id)
201
212
  subject.length('failed').should == 0
202
213
  end
203
214
 
204
215
  it 'should return the job' do
205
- subject.requeue(@job.id).id.should == @job.id
216
+ subject.requeue(payload.id).id.should == payload.id
206
217
  end
207
218
  end
208
219
 
@@ -214,8 +225,6 @@ shared_examples_for 'a backend' do
214
225
  end
215
226
 
216
227
  describe 'register_worker' do
217
- let(:worker) { Qu::Worker.new('default') }
218
-
219
228
  it 'should add worker to array of workers' do
220
229
  subject.register_worker(worker)
221
230
  subject.workers.size.should == 1
@@ -234,10 +243,10 @@ shared_examples_for 'a backend' do
234
243
  end
235
244
 
236
245
  describe 'unregister_worker' do
237
- before { subject.register_worker Qu::Worker.new('default') }
246
+ before { subject.register_worker(worker) }
238
247
 
239
248
  it 'should remove worker' do
240
- subject.unregister_worker(worker.id)
249
+ subject.unregister_worker(worker)
241
250
  subject.workers.size.should == 0
242
251
  end
243
252
 
@@ -245,7 +254,7 @@ shared_examples_for 'a backend' do
245
254
  other_worker = Qu::Worker.new('other')
246
255
  subject.register_worker(other_worker)
247
256
  subject.workers.size.should == 2
248
- subject.unregister_worker(other_worker.id)
257
+ subject.unregister_worker(other_worker)
249
258
  subject.workers.size.should == 1
250
259
  subject.workers.first.id.should == worker.id
251
260
  end
@@ -0,0 +1,20 @@
1
+ module Qu
2
+ module Logger
3
+ def logger
4
+ Qu.logger
5
+ end
6
+
7
+ def log_exception(exception)
8
+ message = "\n#{exception.class} (#{exception.message}):\n "
9
+ message << clean_backtrace(exception).join("\n ") << "\n\n"
10
+ logger.fatal(message)
11
+ end
12
+
13
+ def clean_backtrace(exception)
14
+ defined?(Rails) && Rails.respond_to?(:backtrace_cleaner) ?
15
+ Rails.backtrace_cleaner.clean(exception.backtrace) :
16
+ exception.backtrace
17
+ end
18
+
19
+ end
20
+ end
@@ -1,11 +1,18 @@
1
+ require 'ostruct'
2
+
1
3
  module Qu
2
- class Job
3
- attr_accessor :id, :klass, :args
4
+ class Payload < OpenStruct
5
+ include Logger
6
+
7
+ undef_method(:id) if method_defined?(:id)
4
8
 
5
- def initialize(id, klass, args)
6
- @id, @args = id, args
9
+ def initialize(options = {})
10
+ super
11
+ self.args ||= []
12
+ end
7
13
 
8
- @klass = klass.is_a?(Class) ? klass : constantize(klass)
14
+ def klass
15
+ constantize(super)
9
16
  end
10
17
 
11
18
  def queue
@@ -16,16 +23,25 @@ module Qu
16
23
  klass.perform(*args)
17
24
  Qu.backend.completed(self)
18
25
  rescue Qu::Worker::Abort
26
+ logger.debug "Releasing job #{self}"
19
27
  Qu.backend.release(self)
20
28
  raise
21
29
  rescue Exception => e
30
+ logger.fatal "Job #{self} failed"
31
+ log_exception(e)
22
32
  Qu.failure.create(self, e) if Qu.failure
23
33
  Qu.backend.failed(self, e)
24
34
  end
25
35
 
36
+ def to_s
37
+ "#{id}:#{klass}:#{args.inspect}"
38
+ end
39
+
26
40
  protected
27
41
 
28
42
  def constantize(class_name)
43
+ return unless class_name
44
+ return class_name if class_name.is_a?(Class)
29
45
  constant = Object
30
46
  class_name.split('::').each do |name|
31
47
  constant = constant.const_get(name) || constant.const_missing(name)
@@ -5,5 +5,9 @@ module Qu
5
5
  rake_tasks do
6
6
  load "qu/tasks.rb"
7
7
  end
8
+
9
+ initializer "qu.logger" do |app|
10
+ Qu.logger = Rails.logger
11
+ end
8
12
  end
9
13
  end
@@ -5,3 +5,10 @@ namespace :qu do
5
5
  Qu::Worker.new(*queues).start
6
6
  end
7
7
  end
8
+
9
+ # Convenience tasks compatibility
10
+ task 'jobs:work' => 'qu:work'
11
+ task 'resque:work' => 'qu:work'
12
+
13
+ # No-op task in case it doesn't already exist
14
+ task :environment
@@ -1,3 +1,3 @@
1
1
  module Qu
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,5 +1,7 @@
1
1
  module Qu
2
2
  class Worker
3
+ include Logger
4
+
3
5
  attr_accessor :queues
4
6
 
5
7
  class Abort < Exception
@@ -22,23 +24,34 @@ module Qu
22
24
  end
23
25
 
24
26
  def handle_signals
27
+ logger.debug "Worker #{id} registering traps for INT and TERM signals"
25
28
  %W(INT TERM).each do |sig|
26
- trap(sig) { raise Abort }
29
+ trap(sig) do
30
+ logger.info "Worker #{id} received #{sig}, shutting down"
31
+ raise Abort
32
+ end
27
33
  end
28
34
  end
29
35
 
30
36
  def work_off
37
+ logger.debug "Worker #{id} working of all jobs"
31
38
  while job = Qu.reserve(self, :block => false)
39
+ logger.debug "Worker #{id} reserved job #{job}"
32
40
  job.perform
41
+ logger.debug "Worker #{id} completed job #{job}"
33
42
  end
34
43
  end
35
44
 
36
45
  def work
46
+ logger.debug "Worker #{id} waiting for next job"
37
47
  job = Qu.reserve(self)
48
+ logger.debug "Worker #{id} reserved job #{job}"
38
49
  job.perform
50
+ logger.debug "Worker #{id} completed job #{job}"
39
51
  end
40
52
 
41
53
  def start
54
+ logger.warn "Worker #{id} starting"
42
55
  handle_signals
43
56
  Qu.backend.register_worker(self)
44
57
  loop { work }
@@ -46,10 +59,11 @@ module Qu
46
59
  # Ok, we'll shut down, but give us a sec
47
60
  ensure
48
61
  Qu.backend.unregister_worker(self)
62
+ logger.debug "Worker #{id} done"
49
63
  end
50
64
 
51
65
  def id
52
- "#{hostname}:#{pid}:#{queues.join(',')}"
66
+ @id ||= "#{hostname}:#{pid}:#{queues.join(',')}"
53
67
  end
54
68
 
55
69
  def pid
data/qu.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
3
  require "qu/version"
4
4
 
5
- plugins = Dir['qu-*.gemspec'].map {|gemspec| gemspec.scan(/qu-(.*)\.gemspec/).to_s }.join('\|')
5
+ plugins = Dir['qu-*.gemspec'].map {|gemspec| gemspec.scan(/qu-(.*)\.gemspec/).flatten.first }.join('\|')
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "qu"
@@ -1,34 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Qu::Job do
3
+ describe Qu::Payload do
4
4
  class MyJob
5
5
  @queue = :custom
6
6
  end
7
7
 
8
+ it 'should default id to nil' do
9
+ Qu::Payload.new.id.should == nil
10
+ end
11
+
12
+ it 'should allow id to be set' do
13
+ Qu::Payload.new(:id => 5).id.should == 5
14
+ end
15
+
8
16
  describe 'queue' do
9
17
  it 'should default to "default"' do
10
- Qu::Job.new('1', SimpleJob, []).queue.should == 'default'
18
+ Qu::Payload.new.queue.should == 'default'
11
19
  end
12
20
 
13
- it 'should get queue from job instance variable' do
14
- Qu::Job.new('1', MyJob, []).queue.should == 'custom'
21
+ it 'should get queue from instance variable' do
22
+ Qu::Payload.new(:klass => MyJob).queue.should == 'custom'
15
23
  end
16
24
  end
17
25
 
18
26
  describe 'klass' do
19
27
  it 'should constantize string' do
20
- Qu::Job.new('1', 'MyJob', []).klass.should == MyJob
28
+ Qu::Payload.new(:klass => 'MyJob').klass.should == MyJob
21
29
  end
22
30
 
23
- it 'should find namespaced jobs' do
24
- Qu::Job.new('1', 'Qu::Job', []).klass.should == Qu::Job
31
+ it 'should find namespaced class' do
32
+ Qu::Payload.new(:klass => 'Qu::Payload').klass.should == Qu::Payload
25
33
  end
26
34
  end
27
35
 
28
36
  describe 'perform' do
29
- subject { Qu::Job.new('1', SimpleJob, []) }
37
+ subject { Qu::Payload.new(:klass => SimpleJob) }
30
38
 
31
- it 'should call .perform on job class with args' do
39
+ it 'should call .perform on class with args' do
32
40
  subject.args = ['a', 'b']
33
41
  SimpleJob.should_receive(:perform).with('a', 'b')
34
42
  subject.perform
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Qu::Worker do
4
- let(:job) { Qu::Job.new('1', SimpleJob, []) }
4
+ let(:job) { Qu::Payload.new(:id => '1', :klass => SimpleJob) }
5
5
 
6
6
  describe 'queues' do
7
7
  it 'should use default if none specified' do
@@ -1,13 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Qu do
4
- %w(enqueue length queues reserve clear connection=).each do |method|
4
+ %w(length queues reserve clear connection=).each do |method|
5
5
  it "should delegate #{method} to backend" do
6
6
  Qu.backend.should_receive(method).with(:arg)
7
7
  Qu.send(method, :arg)
8
8
  end
9
9
  end
10
10
 
11
+ describe 'enqueue' do
12
+ it 'should call enqueue on backend with a payload' do
13
+ Qu.backend.should_receive(:enqueue) do |payload|
14
+ payload.should be_instance_of(Qu::Payload)
15
+ payload.klass.should == SimpleJob
16
+ payload.args.should == [9,8]
17
+ end
18
+
19
+ Qu.enqueue SimpleJob, 9, 8
20
+ end
21
+ end
22
+
11
23
  describe 'configure' do
12
24
  it 'should yield Qu' do
13
25
  Qu.configure do |c|
@@ -9,4 +9,6 @@ RSpec.configure do |config|
9
9
  :register_worker => nil, :unregister_worker => nil)
10
10
  Qu.failure = nil
11
11
  end
12
- end
12
+ end
13
+
14
+ Qu.logger = Logger.new('/dev/null')
metadata CHANGED
@@ -1,47 +1,34 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: qu
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Brandon Keepers
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-09-23 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-03 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: multi_json
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70136826415300 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- description: ""
36
- email:
23
+ prerelease: false
24
+ version_requirements: *70136826415300
25
+ description: ''
26
+ email:
37
27
  - brandon@opensoul.org
38
28
  executables: []
39
-
40
29
  extensions: []
41
-
42
30
  extra_rdoc_files: []
43
-
44
- files:
31
+ files:
45
32
  - .gitignore
46
33
  - Gemfile
47
34
  - Guardfile
@@ -51,52 +38,43 @@ files:
51
38
  - lib/qu/backend/base.rb
52
39
  - lib/qu/backend/spec.rb
53
40
  - lib/qu/failure.rb
54
- - lib/qu/job.rb
41
+ - lib/qu/logger.rb
42
+ - lib/qu/payload.rb
55
43
  - lib/qu/railtie.rb
56
44
  - lib/qu/tasks.rb
57
45
  - lib/qu/version.rb
58
46
  - lib/qu/worker.rb
59
47
  - qu.gemspec
60
- - spec/qu/job_spec.rb
48
+ - spec/qu/payload_spec.rb
61
49
  - spec/qu/worker_spec.rb
62
50
  - spec/qu_spec.rb
63
51
  - spec/spec_helper.rb
64
- has_rdoc: true
65
52
  homepage: http://github.com/bkeepers/qu
66
53
  licenses: []
67
-
68
54
  post_install_message:
69
55
  rdoc_options: []
70
-
71
- require_paths:
56
+ require_paths:
72
57
  - lib
73
- required_ruby_version: !ruby/object:Gem::Requirement
58
+ required_ruby_version: !ruby/object:Gem::Requirement
74
59
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- hash: 3
79
- segments:
80
- - 0
81
- version: "0"
82
- required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
65
  none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
91
70
  requirements: []
92
-
93
71
  rubyforge_project:
94
- rubygems_version: 1.6.1
72
+ rubygems_version: 1.8.6
95
73
  signing_key:
96
74
  specification_version: 3
97
- summary: ""
98
- test_files:
99
- - spec/qu/job_spec.rb
75
+ summary: ''
76
+ test_files:
77
+ - spec/qu/payload_spec.rb
100
78
  - spec/qu/worker_spec.rb
101
79
  - spec/qu_spec.rb
102
80
  - spec/spec_helper.rb