cloudist 0.0.2 → 0.0.3

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/cloudist.gemspec ADDED
@@ -0,0 +1,114 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{cloudist}
8
+ s.version = "0.0.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ivan Vanderbyl"]
12
+ s.date = %q{2011-01-18}
13
+ s.description = %q{Cloudist is a simple, highly scalable job queue for Ruby applications, it can run within Rails, or on EC2, and does not load your entire Rails stack like delayed job does.}
14
+ s.email = %q{ivanvanderbyl@me.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "cloudist.gemspec",
29
+ "examples/queue_message.rb",
30
+ "examples/sandwich_client.rb",
31
+ "examples/sandwich_worker.rb",
32
+ "lib/cloudist.rb",
33
+ "lib/cloudist/basic_queue.rb",
34
+ "lib/cloudist/core_ext/string.rb",
35
+ "lib/cloudist/errors.rb",
36
+ "lib/cloudist/job.rb",
37
+ "lib/cloudist/job_queue.rb",
38
+ "lib/cloudist/listener.rb",
39
+ "lib/cloudist/payload.rb",
40
+ "lib/cloudist/publisher.rb",
41
+ "lib/cloudist/reply_queue.rb",
42
+ "lib/cloudist/request.rb",
43
+ "lib/cloudist/utils.rb",
44
+ "lib/cloudist/worker.rb",
45
+ "spec/cloudist/basic_queue_spec.rb",
46
+ "spec/cloudist/job_spec.rb",
47
+ "spec/cloudist/payload_spec.rb",
48
+ "spec/cloudist/request_spec.rb",
49
+ "spec/cloudist_spec.rb",
50
+ "spec/core_ext/string_spec.rb",
51
+ "spec/spec_helper.rb"
52
+ ]
53
+ s.homepage = %q{http://github.com/ivanvanderbyl/cloudist}
54
+ s.licenses = ["MIT"]
55
+ s.require_paths = ["lib"]
56
+ s.rubygems_version = %q{1.3.7}
57
+ s.summary = %q{Super fast job queue using AMQP}
58
+ s.test_files = [
59
+ "examples/queue_message.rb",
60
+ "examples/sandwich_client.rb",
61
+ "examples/sandwich_worker.rb",
62
+ "spec/cloudist/basic_queue_spec.rb",
63
+ "spec/cloudist/job_spec.rb",
64
+ "spec/cloudist/payload_spec.rb",
65
+ "spec/cloudist/request_spec.rb",
66
+ "spec/cloudist_spec.rb",
67
+ "spec/core_ext/string_spec.rb",
68
+ "spec/spec_helper.rb"
69
+ ]
70
+
71
+ if s.respond_to? :specification_version then
72
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
73
+ s.specification_version = 3
74
+
75
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
76
+ s.add_runtime_dependency(%q<amqp>, [">= 0"])
77
+ s.add_runtime_dependency(%q<json>, [">= 0"])
78
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
79
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
80
+ s.add_development_dependency(%q<moqueue>, [">= 0"])
81
+ s.add_development_dependency(%q<mocha>, [">= 0"])
82
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
83
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
84
+ s.add_development_dependency(%q<rcov>, [">= 0"])
85
+ s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
86
+ s.add_development_dependency(%q<roodi>, ["~> 2.1.0"])
87
+ else
88
+ s.add_dependency(%q<amqp>, [">= 0"])
89
+ s.add_dependency(%q<json>, [">= 0"])
90
+ s.add_dependency(%q<activesupport>, [">= 0"])
91
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
92
+ s.add_dependency(%q<moqueue>, [">= 0"])
93
+ s.add_dependency(%q<mocha>, [">= 0"])
94
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
95
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
96
+ s.add_dependency(%q<rcov>, [">= 0"])
97
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
98
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
99
+ end
100
+ else
101
+ s.add_dependency(%q<amqp>, [">= 0"])
102
+ s.add_dependency(%q<json>, [">= 0"])
103
+ s.add_dependency(%q<activesupport>, [">= 0"])
104
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
105
+ s.add_dependency(%q<moqueue>, [">= 0"])
106
+ s.add_dependency(%q<mocha>, [">= 0"])
107
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
108
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
109
+ s.add_dependency(%q<rcov>, [">= 0"])
110
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
111
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
112
+ end
113
+ end
114
+
@@ -2,8 +2,6 @@ $:.unshift File.dirname(__FILE__) + '/../lib'
2
2
  require "rubygems"
3
3
  require "cloudist"
4
4
 
5
- ENV["AMQP_URL"] = 'amqp://test_pilot:t35t_p1l0t!@ec2-50-16-134-211.compute-1.amazonaws.com:5672/'
6
-
7
5
  ::Signal.trap('INT') { Cloudist.stop }
8
6
  ::Signal.trap('TERM'){ Cloudist.stop }
9
7
 
@@ -1,7 +1,20 @@
1
+ # Cloudst Example: Sandwich Client
2
+ #
3
+ # This example demonstrates dispatching a job to the worker and receiving event callbacks.
4
+ #
5
+ # Be sure to update the Cloudist connection settings if they differ from defaults:
6
+ # user: guest
7
+ # pass: guest
8
+ # port: 5672
9
+ # host: localhost
10
+ # vhost: /
11
+ #
1
12
  $:.unshift File.dirname(__FILE__) + '/../lib'
2
13
  require "rubygems"
3
14
  require "cloudist"
4
15
 
16
+ ENV['AMQP_URL'] = 'amqp://test_pilot:t35t_p1l0t!@ec2-50-16-8-137.compute-1.amazonaws.com:5672/ivan'
17
+
5
18
  Cloudist.signal_trap!
6
19
 
7
20
  Cloudist.start {
@@ -11,7 +24,8 @@ Cloudist.start {
11
24
 
12
25
  # Listen to all sandwich jobs
13
26
  listen('make.sandwich') {
14
- Cloudist.log.info("Make sandwich event: #{id}")
27
+ # Cloudist.log.info("Make sandwich event: #{data[:event]}")
28
+ Cloudist.log.debug(queue_header.headers.inspect)
15
29
  }
16
30
 
17
31
  }
@@ -1,7 +1,21 @@
1
+ # Cloudst Example: Sandwich Worker
2
+ #
3
+ # This example demonstrates receiving a job and sending back events to the client to let it know we've started and finsihed
4
+ # making a sandwich. From here you could dispatch an eat.sandwich event.
5
+ #
6
+ # Be sure to update the Cloudist connection settings if they differ from defaults:
7
+ # user: guest
8
+ # pass: guest
9
+ # port: 5672
10
+ # host: localhost
11
+ # vhost: /
12
+ #
1
13
  $:.unshift File.dirname(__FILE__) + '/../lib'
2
14
  require "rubygems"
3
15
  require "cloudist"
4
16
 
17
+ ENV['AMQP_URL'] = 'amqp://test_pilot:t35t_p1l0t!@ec2-50-16-8-137.compute-1.amazonaws.com:5672/ivan'
18
+
5
19
  Cloudist.signal_trap!
6
20
 
7
21
  Cloudist.start {
@@ -10,12 +24,15 @@ Cloudist.start {
10
24
  worker {
11
25
  job('make.sandwich') {
12
26
  # Fire the started event
13
- started!
14
27
 
15
28
  log.info("JOB (#{id}) Make sandwich with #{data[:bread]} bread")
16
29
  log.debug(data.inspect)
17
30
 
18
- finished!
31
+ EM.defer {
32
+ started!
33
+ sleep(5)
34
+ finished!
35
+ }
19
36
  }
20
37
  }
21
38
  }
data/lib/cloudist.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'uri'
2
- require 'json'
2
+ require 'json' unless defined? ActiveSupport::JSON
3
3
  require "active_support/hash_with_indifferent_access"
4
4
  require "amqp"
5
5
  require "mq"
@@ -51,7 +51,7 @@ module Cloudist
51
51
  raise Cloudist::ExpiredMessage if request.expired?
52
52
  yield request if block_given?
53
53
  finished = Time.now.utc.to_i
54
-
54
+
55
55
  rescue Cloudist::ExpiredMessage
56
56
  log.info "amqp_message action=timeout #{tag} ttl=#{request.ttl} age=#{request.age} #{request.inspect}"
57
57
  request.ack if amqp_opts[:ack]
@@ -76,6 +76,7 @@ module Cloudist
76
76
  body, headers = payload.formatted
77
77
  q.publish(body, headers)
78
78
  payload.publish
79
+ return headers
79
80
  end
80
81
 
81
82
  def teardown
data/lib/cloudist/job.rb CHANGED
@@ -21,25 +21,38 @@ module Cloudist
21
21
 
22
22
  end
23
23
 
24
- def reply(data, headers = {})
25
- # headers.update(:message_id => payload.headers[:message_id])
24
+ def reply(data, headers = {}, options = {})
25
+ options = {
26
+ :echo => false
27
+ }.update(options)
28
+
26
29
  headers = {
27
30
  :message_id => payload.headers[:message_id],
28
- :reply_type => "reply"
31
+ :message_type => "reply"
29
32
  }.update(headers)
30
33
 
34
+ # Echo the payload back
35
+ data.merge!(payload.body) if options[:echo] == true
36
+
31
37
  reply_payload = Payload.new(data, headers)
32
38
 
33
39
  reply_queue = ReplyQueue.new(payload.reply_to)
34
40
  reply_queue.setup
35
- reply_queue.publish_to_q(reply_payload)
41
+ published_headers = reply_queue.publish_to_q(reply_payload)
36
42
 
37
- # log.debug("Replying: #{data.inspect} - Payload: #{reply_payload.inspect}")
43
+ log.debug("Replying: #{data.inspect} - Headers: #{published_headers.inspect}")
44
+ end
45
+
46
+ # Sends a progress update
47
+ # Inputs: percentage - Integer
48
+ # Optional description, this could be displayed to the user e.g. Resizing image
49
+ def progress(percentage, description = nil)
50
+ reply({:progress => percentage, :description => description}, {:message_type => 'progress'})
38
51
  end
39
52
 
40
- def event(event_name, data = {})
41
- data = {} unless data
42
- reply({:event => event_name}.merge(payload.body), {:reply_type => "event"})
53
+ def event(event_name, event_data = {}, options = {})
54
+ event_data = {} if event_data.nil?
55
+ reply(event_data, {:event => event_name, :message_type => 'event'}, options)
43
56
  end
44
57
 
45
58
  def method_missing(meth, *args, &blk)
@@ -15,7 +15,7 @@ module Cloudist
15
15
  end
16
16
 
17
17
  def subscribe(amqp_opts={}, opts={})
18
- amqp_opts[:ack] = true
18
+ amqp_opts[:ack] ||= true
19
19
  super(amqp_opts, opts) do |request|
20
20
  begin
21
21
  yield request if block_given?
@@ -25,4 +25,4 @@ module Cloudist
25
25
  end
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -19,10 +19,9 @@ module Cloudist
19
19
  reply_queue = Cloudist::ReplyQueue.new(job_queue_name)
20
20
  reply_queue.setup(job_id) if job_id
21
21
 
22
- reply_queue.subscribe do |request|
23
- job = Job.new(request.payload)
24
-
25
- job.instance_eval(&block)
22
+ reply_queue.subscribe do |request|
23
+ # job = Job.new(request.payload)
24
+ request.instance_eval(&block)
26
25
  end
27
26
  end
28
27
 
@@ -4,22 +4,25 @@ module Cloudist
4
4
  class Payload
5
5
  include Utils
6
6
 
7
- attr_accessor :body, :headers
7
+ attr_reader :body, :publish_opts, :headers
8
8
 
9
- def initialize(data_hash_or_json, headers = {})
9
+ def initialize(data_hash_or_json, headers = {}, publish_opts = {})
10
+ @publish_opts, @headers = publish_opts, headers
11
+ @published = false
12
+
10
13
  data_hash_or_json = parse_message(data_hash_or_json) if data_hash_or_json.is_a?(String)
11
14
 
12
15
  raise Cloudist::BadPayload, "Expected Hash for payload" unless data_hash_or_json.is_a?(Hash)
13
16
 
14
- @body, @headers = HashWithIndifferentAccess.new(data_hash_or_json), headers
17
+ @body = HashWithIndifferentAccess.new(data_hash_or_json)
15
18
  update_headers
16
19
  end
17
20
 
21
+ # Return message formatted as JSON and headers ready for transport in array
18
22
  def formatted
19
- body, headers = apply_custom_headers
20
-
21
- # Return message formatted as JSON and headers ready for transport
22
- [body.to_json, headers]
23
+ update_headers
24
+
25
+ [body.to_json, publish_opts]
23
26
  end
24
27
 
25
28
  def id
@@ -41,8 +44,12 @@ module Cloudist
41
44
  end
42
45
 
43
46
  def update_headers
47
+ headers = extract_custom_headers
48
+ (publish_opts[:headers] ||= {}).merge!(headers)
49
+ end
50
+
51
+ def extract_custom_headers
44
52
  raise StaleHeadersError, "Headers cannot be changed because payload has already been published" if published?
45
-
46
53
  headers[:published_on] ||= body.delete('published_on') || Time.now.utc.to_i
47
54
  headers[:ttl] ||= body.delete('ttl') || Cloudist::DEFAULT_TTL
48
55
 
@@ -54,15 +61,17 @@ module Cloudist
54
61
 
55
62
  # We use JSON for message transport exclusively
56
63
  headers[:content_type] ||= 'application/json'
57
-
64
+
65
+ # headers[:headers][:message_type] = 'event'
66
+ # ||= body.delete('message_type') || 'reply'
67
+
68
+ # headers[:headers] = custom_headers
69
+
58
70
  # some strange behavior with integers makes it better to
59
71
  # convert all amqp headers to strings to avoid any problems
60
72
  headers.each { |k,v| headers[k] = v.to_s }
61
- end
62
-
63
- def apply_custom_headers
64
- update_headers
65
- [body, headers]
73
+
74
+ headers
66
75
  end
67
76
 
68
77
  def parse_custom_headers
@@ -107,7 +116,7 @@ module Cloudist
107
116
 
108
117
  def parse_message(raw)
109
118
  return { } unless raw
110
- JSON.parse(raw)
119
+ decode_json(raw)
111
120
  end
112
121
 
113
122
  def [](key)
@@ -2,6 +2,7 @@ module Cloudist
2
2
  class ReplyQueue < Cloudist::BasicQueue
3
3
  def initialize(queue_name, opts={})
4
4
  opts[:auto_delete] = true
5
+ opts[:nowait] = false
5
6
  super
6
7
  end
7
8
 
@@ -5,9 +5,9 @@ module Cloudist
5
5
  def initialize(queue, json_encoded_message, queue_header)
6
6
  @qobj, @queue_header = queue, queue_header
7
7
 
8
- @payload = Cloudist::Payload.new(json_encoded_message.dup, queue_header.properties.dup)
8
+ @payload = Cloudist::Payload.new(json_encoded_message.dup, queue_header.headers.dup)
9
9
  @headers = @payload.parse_custom_headers
10
-
10
+
11
11
  @start = Time.now.utc.to_i
12
12
  end
13
13
 
@@ -32,5 +32,14 @@ module Cloudist
32
32
  ]
33
33
  "%04x%04x%04x%04x%04x%06x%06x" % values
34
34
  end
35
+
36
+ def decode_json(string)
37
+ if defined? ActiveSupport::JSON
38
+ ActiveSupport::JSON.decode string
39
+ else
40
+ JSON.load string
41
+ end
42
+ end
43
+
35
44
  end
36
45
  end
@@ -15,28 +15,25 @@ describe Cloudist::Payload do
15
15
 
16
16
  it "should prepare headers" do
17
17
  payload = Cloudist::Payload.new({:bread => 'white'})
18
- body, headers = payload.apply_custom_headers
19
- body.should == {"bread"=>"white"}
20
- headers.has_key?(:ttl).should be_true
21
- headers.has_key?(:content_type).should be_true
22
- headers[:content_type].should == "application/json"
23
- headers.has_key?(:published_on).should be_true
24
- headers.has_key?(:event_hash).should be_true
25
- headers.has_key?(:message_id).should be_true
18
+ payload.body.should == {"bread"=>"white"}
19
+ payload.headers.has_key?(:ttl).should be_true
20
+ payload.headers.has_key?(:content_type).should be_true
21
+ payload.headers[:content_type].should == "application/json"
22
+ payload.headers.has_key?(:published_on).should be_true
23
+ payload.headers.has_key?(:event_hash).should be_true
24
+ payload.headers.has_key?(:message_id).should be_true
26
25
  end
27
26
 
28
27
  it "should extract published_on from data" do
29
28
  payload = Cloudist::Payload.new({:bread => 'white', :published_on => 12345678})
30
- body, headers = payload.apply_custom_headers
31
- body.should == {"bread"=>"white"}
32
- headers[:published_on].should == "12345678"
29
+ payload.body.should == {"bread"=>"white"}
30
+ payload.headers[:published_on].should == "12345678"
33
31
  end
34
32
 
35
33
  it "should extract custom event hash from data" do
36
34
  payload = Cloudist::Payload.new({:bread => 'white', :event_hash => 'foo'})
37
- body, headers = payload.apply_custom_headers
38
- body.should == {"bread"=>"white"}
39
- headers[:event_hash].should == "foo"
35
+ payload.body.should == {"bread"=>"white"}
36
+ payload.headers[:event_hash].should == "foo"
40
37
  end
41
38
 
42
39
  it "should parse JSON message" do
@@ -67,10 +64,13 @@ describe Cloudist::Payload do
67
64
  end
68
65
 
69
66
  it "should format payload for sending" do
70
- payload = Cloudist::Payload.new({:bread => 'white'}, {:event_hash => 'foo'})
71
- json, headers = payload.formatted
67
+ payload = Cloudist::Payload.new({:bread => 'white'}, {:event_hash => 'foo', :message_type => 'reply'})
68
+ json, popts = payload.formatted
69
+ headers = popts[:headers]
70
+
72
71
  json.should == "{\"bread\":\"white\"}"
73
72
  headers[:ttl].should == "300"
73
+ headers[:message_type].should == 'reply'
74
74
  end
75
75
 
76
76
  it "should generate a unique payload ID" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudist
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ivan Vanderbyl
@@ -15,14 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-16 00:00:00 +11:00
18
+ date: 2011-01-18 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :runtime
23
- prerelease: false
24
- name: amqp
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ requirement: &id001 !ruby/object:Gem::Requirement
26
23
  none: false
27
24
  requirements:
28
25
  - - ">="
@@ -31,12 +28,12 @@ dependencies:
31
28
  segments:
32
29
  - 0
33
30
  version: "0"
34
- requirement: *id001
35
- - !ruby/object:Gem::Dependency
36
31
  type: :runtime
32
+ name: amqp
37
33
  prerelease: false
38
- name: json
39
- version_requirements: &id002 !ruby/object:Gem::Requirement
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ requirement: &id002 !ruby/object:Gem::Requirement
40
37
  none: false
41
38
  requirements:
42
39
  - - ">="
@@ -45,12 +42,12 @@ dependencies:
45
42
  segments:
46
43
  - 0
47
44
  version: "0"
48
- requirement: *id002
49
- - !ruby/object:Gem::Dependency
50
45
  type: :runtime
46
+ name: json
51
47
  prerelease: false
52
- name: activesupport
53
- version_requirements: &id003 !ruby/object:Gem::Requirement
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ requirement: &id003 !ruby/object:Gem::Requirement
54
51
  none: false
55
52
  requirements:
56
53
  - - ">="
@@ -59,12 +56,12 @@ dependencies:
59
56
  segments:
60
57
  - 0
61
58
  version: "0"
62
- requirement: *id003
63
- - !ruby/object:Gem::Dependency
64
- type: :development
59
+ type: :runtime
60
+ name: activesupport
65
61
  prerelease: false
66
- name: rspec
67
- version_requirements: &id004 !ruby/object:Gem::Requirement
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ requirement: &id004 !ruby/object:Gem::Requirement
68
65
  none: false
69
66
  requirements:
70
67
  - - ~>
@@ -75,12 +72,12 @@ dependencies:
75
72
  - 3
76
73
  - 0
77
74
  version: 2.3.0
78
- requirement: *id004
79
- - !ruby/object:Gem::Dependency
80
75
  type: :development
76
+ name: rspec
81
77
  prerelease: false
82
- name: moqueue
83
- version_requirements: &id005 !ruby/object:Gem::Requirement
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ requirement: &id005 !ruby/object:Gem::Requirement
84
81
  none: false
85
82
  requirements:
86
83
  - - ">="
@@ -89,12 +86,12 @@ dependencies:
89
86
  segments:
90
87
  - 0
91
88
  version: "0"
92
- requirement: *id005
93
- - !ruby/object:Gem::Dependency
94
89
  type: :development
90
+ name: moqueue
95
91
  prerelease: false
96
- name: mocha
97
- version_requirements: &id006 !ruby/object:Gem::Requirement
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ requirement: &id006 !ruby/object:Gem::Requirement
98
95
  none: false
99
96
  requirements:
100
97
  - - ">="
@@ -103,12 +100,12 @@ dependencies:
103
100
  segments:
104
101
  - 0
105
102
  version: "0"
106
- requirement: *id006
107
- - !ruby/object:Gem::Dependency
108
103
  type: :development
104
+ name: mocha
109
105
  prerelease: false
110
- name: bundler
111
- version_requirements: &id007 !ruby/object:Gem::Requirement
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ requirement: &id007 !ruby/object:Gem::Requirement
112
109
  none: false
113
110
  requirements:
114
111
  - - ~>
@@ -119,12 +116,12 @@ dependencies:
119
116
  - 0
120
117
  - 0
121
118
  version: 1.0.0
122
- requirement: *id007
123
- - !ruby/object:Gem::Dependency
124
119
  type: :development
120
+ name: bundler
125
121
  prerelease: false
126
- name: jeweler
127
- version_requirements: &id008 !ruby/object:Gem::Requirement
122
+ version_requirements: *id007
123
+ - !ruby/object:Gem::Dependency
124
+ requirement: &id008 !ruby/object:Gem::Requirement
128
125
  none: false
129
126
  requirements:
130
127
  - - ~>
@@ -135,12 +132,12 @@ dependencies:
135
132
  - 5
136
133
  - 2
137
134
  version: 1.5.2
138
- requirement: *id008
139
- - !ruby/object:Gem::Dependency
140
135
  type: :development
136
+ name: jeweler
141
137
  prerelease: false
142
- name: rcov
143
- version_requirements: &id009 !ruby/object:Gem::Requirement
138
+ version_requirements: *id008
139
+ - !ruby/object:Gem::Dependency
140
+ requirement: &id009 !ruby/object:Gem::Requirement
144
141
  none: false
145
142
  requirements:
146
143
  - - ">="
@@ -149,12 +146,12 @@ dependencies:
149
146
  segments:
150
147
  - 0
151
148
  version: "0"
152
- requirement: *id009
153
- - !ruby/object:Gem::Dependency
154
149
  type: :development
150
+ name: rcov
155
151
  prerelease: false
156
- name: reek
157
- version_requirements: &id010 !ruby/object:Gem::Requirement
152
+ version_requirements: *id009
153
+ - !ruby/object:Gem::Dependency
154
+ requirement: &id010 !ruby/object:Gem::Requirement
158
155
  none: false
159
156
  requirements:
160
157
  - - ~>
@@ -165,12 +162,12 @@ dependencies:
165
162
  - 2
166
163
  - 8
167
164
  version: 1.2.8
168
- requirement: *id010
169
- - !ruby/object:Gem::Dependency
170
165
  type: :development
166
+ name: reek
171
167
  prerelease: false
172
- name: roodi
173
- version_requirements: &id011 !ruby/object:Gem::Requirement
168
+ version_requirements: *id010
169
+ - !ruby/object:Gem::Dependency
170
+ requirement: &id011 !ruby/object:Gem::Requirement
174
171
  none: false
175
172
  requirements:
176
173
  - - ~>
@@ -181,7 +178,10 @@ dependencies:
181
178
  - 1
182
179
  - 0
183
180
  version: 2.1.0
184
- requirement: *id011
181
+ type: :development
182
+ name: roodi
183
+ prerelease: false
184
+ version_requirements: *id011
185
185
  description: Cloudist is a simple, highly scalable job queue for Ruby applications, it can run within Rails, or on EC2, and does not load your entire Rails stack like delayed job does.
186
186
  email: ivanvanderbyl@me.com
187
187
  executables: []
@@ -200,6 +200,7 @@ files:
200
200
  - README.md
201
201
  - Rakefile
202
202
  - VERSION
203
+ - cloudist.gemspec
203
204
  - examples/queue_message.rb
204
205
  - examples/sandwich_client.rb
205
206
  - examples/sandwich_worker.rb