cloudist 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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