cloudist 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,11 +3,11 @@ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
3
3
  describe Cloudist::Request do
4
4
  before {
5
5
  @mq_header = mock("MQ::Header")
6
- @mq_header.stubs(:properties).returns({:published_on=>Time.now.to_i - 60, :event_hash=>"foo", :content_type=>"application/json", :message_id=>"foo", :ttl=>300})
6
+ @mq_header.stubs(:headers).returns({:published_on=>Time.now.to_i - 60, :event_hash=>"foo", :message_id=>"foo", :ttl=>300})
7
7
 
8
8
  q = Cloudist::JobQueue.new('test.queue')
9
9
 
10
- @request = Cloudist::Request.new(q, {:bread => 'white'}.to_json, @mq_header)
10
+ @request = Cloudist::Request.new(q, Marshal.dump({:bread => 'white'}), @mq_header)
11
11
  }
12
12
 
13
13
  it "should return ttl" do
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ describe Cloudist::Utils do
4
+ it "should return reply queue name" do
5
+ Cloudist::Utils.reply_prefix('eat.sandwich').should == 'temp.reply.eat.sandwich'
6
+ end
7
+
8
+ it "should return log queue name" do
9
+ Cloudist::Utils.log_prefix('eat.sandwich').should == 'temp.log.eat.sandwich'
10
+ end
11
+
12
+ it "should return stats queue name" do
13
+ Cloudist::Utils.stats_prefix('eat.sandwich').should == 'temp.stats.eat.sandwich'
14
+ end
15
+
16
+ # it "should generate queue name" do
17
+ # Cloudist::Utils.generate_queue('test').should == ''
18
+ # end
19
+ end
@@ -1,24 +1,55 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require "moqueue"
3
+
4
+ class SandwichWorker < Cloudist::Worker
5
+ def process
6
+ Cloudist.log.info(job.data.inspect)
7
+ end
8
+ end
2
9
 
3
10
  describe "Cloudist" do
4
11
 
5
12
  before(:each) do
6
13
  overload_amqp
7
14
  reset_broker
15
+ Cloudist.remove_workers
16
+
17
+ @mq = mock("MQ")
18
+ @queue, @exchange = mock_queue_and_exchange('make.sandwich')
19
+
20
+ @qobj = Cloudist::JobQueue.any_instance
21
+ @qobj.stubs(:q).returns(@queue)
22
+ @qobj.stubs(:mq).returns(@mq)
23
+ @qobj.stubs(:ex).returns(@exchange)
24
+ @qobj.stubs(:setup)
8
25
  end
9
26
 
10
- def run_start
11
- Cloudist.start {
12
- worker {
13
-
14
- }
15
- }
27
+ it "should register a worker" do
28
+ Cloudist.register_worker('make.sandwich', SandwichWorker)
29
+ Cloudist.workers.should have_key("make.sandwich")
30
+ Cloudist.workers["make.sandwich"].size.should == 1
16
31
  end
17
32
 
18
- it "should start" do
19
- Cloudist.stubs(:worker).returns(true)
20
- Cloudist.expects(:worker).once
21
-
22
- # run_start
33
+ it "should support handle syntax" do
34
+ Cloudist.workers.should == {}
35
+ Cloudist.handle('make.sandwich').with(SandwichWorker)
36
+ Cloudist.workers.should have_key("make.sandwich")
37
+ Cloudist.workers["make.sandwich"].size.should == 1
23
38
  end
39
+
40
+ # it "should support handle syntax with multiple queues" do
41
+ # Cloudist.workers.should == {}
42
+ # Cloudist.handle('make.sandwich', 'eat.sandwich').with(SandwichWorker)
43
+ # # Cloudist.workers.should == {"make.sandwich"=>[SandwichWorker], "eat.sandwich"=>[SandwichWorker]}
44
+ # end
45
+
46
+ it "should call process on worker when job arrives" do
47
+ job = Cloudist.enqueue('make.sandwich', {:bread => 'white'})
48
+ job.payload.published?.should be_true
49
+ SandwichWorker.any_instance.expects(:process)
50
+ Cloudist.handle('make.sandwich').with(SandwichWorker)
51
+ Cloudist.workers.should have_key("make.sandwich")
52
+ Cloudist.workers["make.sandwich"].size.should == 1
53
+ end
54
+
24
55
  end
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: 31
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
8
  - 2
10
- version: 0.1.2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ivan Vanderbyl
@@ -15,11 +15,14 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-18 00:00:00 +11:00
18
+ date: 2011-01-20 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ type: :runtime
23
+ prerelease: false
24
+ name: amqp
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
26
  none: false
24
27
  requirements:
25
28
  - - ~>
@@ -30,12 +33,12 @@ dependencies:
30
33
  - 6
31
34
  - 7
32
35
  version: 0.6.7
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
33
38
  type: :runtime
34
- name: amqp
35
39
  prerelease: false
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ name: json
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
42
  none: false
40
43
  requirements:
41
44
  - - ~>
@@ -46,12 +49,12 @@ dependencies:
46
49
  - 4
47
50
  - 6
48
51
  version: 1.4.6
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
49
54
  type: :runtime
50
- name: json
51
55
  prerelease: false
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ name: activesupport
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
58
  none: false
56
59
  requirements:
57
60
  - - ~>
@@ -62,12 +65,12 @@ dependencies:
62
65
  - 0
63
66
  - 3
64
67
  version: 3.0.3
65
- type: :runtime
66
- name: activesupport
67
- prerelease: false
68
- version_requirements: *id003
68
+ requirement: *id003
69
69
  - !ruby/object:Gem::Dependency
70
- requirement: &id004 !ruby/object:Gem::Requirement
70
+ type: :development
71
+ prerelease: false
72
+ name: rspec
73
+ version_requirements: &id004 !ruby/object:Gem::Requirement
71
74
  none: false
72
75
  requirements:
73
76
  - - ~>
@@ -78,12 +81,12 @@ dependencies:
78
81
  - 3
79
82
  - 0
80
83
  version: 2.3.0
84
+ requirement: *id004
85
+ - !ruby/object:Gem::Dependency
81
86
  type: :development
82
- name: rspec
83
87
  prerelease: false
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ name: moqueue
89
+ version_requirements: &id005 !ruby/object:Gem::Requirement
87
90
  none: false
88
91
  requirements:
89
92
  - - ">="
@@ -92,12 +95,12 @@ dependencies:
92
95
  segments:
93
96
  - 0
94
97
  version: "0"
98
+ requirement: *id005
99
+ - !ruby/object:Gem::Dependency
95
100
  type: :development
96
- name: moqueue
97
101
  prerelease: false
98
- version_requirements: *id005
99
- - !ruby/object:Gem::Dependency
100
- requirement: &id006 !ruby/object:Gem::Requirement
102
+ name: mocha
103
+ version_requirements: &id006 !ruby/object:Gem::Requirement
101
104
  none: false
102
105
  requirements:
103
106
  - - ">="
@@ -106,12 +109,12 @@ dependencies:
106
109
  segments:
107
110
  - 0
108
111
  version: "0"
112
+ requirement: *id006
113
+ - !ruby/object:Gem::Dependency
109
114
  type: :development
110
- name: mocha
111
115
  prerelease: false
112
- version_requirements: *id006
113
- - !ruby/object:Gem::Dependency
114
- requirement: &id007 !ruby/object:Gem::Requirement
116
+ name: bundler
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
115
118
  none: false
116
119
  requirements:
117
120
  - - ~>
@@ -122,12 +125,12 @@ dependencies:
122
125
  - 0
123
126
  - 0
124
127
  version: 1.0.0
128
+ requirement: *id007
129
+ - !ruby/object:Gem::Dependency
125
130
  type: :development
126
- name: bundler
127
131
  prerelease: false
128
- version_requirements: *id007
129
- - !ruby/object:Gem::Dependency
130
- requirement: &id008 !ruby/object:Gem::Requirement
132
+ name: jeweler
133
+ version_requirements: &id008 !ruby/object:Gem::Requirement
131
134
  none: false
132
135
  requirements:
133
136
  - - ~>
@@ -138,12 +141,12 @@ dependencies:
138
141
  - 5
139
142
  - 2
140
143
  version: 1.5.2
144
+ requirement: *id008
145
+ - !ruby/object:Gem::Dependency
141
146
  type: :development
142
- name: jeweler
143
147
  prerelease: false
144
- version_requirements: *id008
145
- - !ruby/object:Gem::Dependency
146
- requirement: &id009 !ruby/object:Gem::Requirement
148
+ name: rcov
149
+ version_requirements: &id009 !ruby/object:Gem::Requirement
147
150
  none: false
148
151
  requirements:
149
152
  - - ">="
@@ -152,12 +155,12 @@ dependencies:
152
155
  segments:
153
156
  - 0
154
157
  version: "0"
158
+ requirement: *id009
159
+ - !ruby/object:Gem::Dependency
155
160
  type: :development
156
- name: rcov
157
161
  prerelease: false
158
- version_requirements: *id009
159
- - !ruby/object:Gem::Dependency
160
- requirement: &id010 !ruby/object:Gem::Requirement
162
+ name: reek
163
+ version_requirements: &id010 !ruby/object:Gem::Requirement
161
164
  none: false
162
165
  requirements:
163
166
  - - ~>
@@ -168,12 +171,12 @@ dependencies:
168
171
  - 2
169
172
  - 8
170
173
  version: 1.2.8
174
+ requirement: *id010
175
+ - !ruby/object:Gem::Dependency
171
176
  type: :development
172
- name: reek
173
177
  prerelease: false
174
- version_requirements: *id010
175
- - !ruby/object:Gem::Dependency
176
- requirement: &id011 !ruby/object:Gem::Requirement
178
+ name: roodi
179
+ version_requirements: &id011 !ruby/object:Gem::Requirement
177
180
  none: false
178
181
  requirements:
179
182
  - - ~>
@@ -184,10 +187,7 @@ dependencies:
184
187
  - 1
185
188
  - 0
186
189
  version: 2.1.0
187
- type: :development
188
- name: roodi
189
- prerelease: false
190
- version_requirements: *id011
190
+ requirement: *id011
191
191
  description: Cloudist is a simple, highly scalable job queue for Ruby applications, it can run within Rails, DaemonKit or your own custom application. Refer to github page for examples
192
192
  email: ivanvanderbyl@me.com
193
193
  executables: []
@@ -207,21 +207,25 @@ files:
207
207
  - Rakefile
208
208
  - VERSION
209
209
  - cloudist.gemspec
210
+ - examples/extending_values.rb
210
211
  - examples/queue_message.rb
211
212
  - examples/sandwich_client.rb
212
213
  - examples/sandwich_worker.rb
214
+ - examples/sandwich_worker_with_class.rb
213
215
  - lib/cloudist.rb
214
- - lib/cloudist/basic_queue.rb
215
216
  - lib/cloudist/callback.rb
216
217
  - lib/cloudist/callback_methods.rb
218
+ - lib/cloudist/callbacks/error_callback.rb
219
+ - lib/cloudist/core_ext/object.rb
217
220
  - lib/cloudist/core_ext/string.rb
218
221
  - lib/cloudist/errors.rb
219
222
  - lib/cloudist/job.rb
220
- - lib/cloudist/job_queue.rb
221
223
  - lib/cloudist/listener.rb
222
224
  - lib/cloudist/payload.rb
223
225
  - lib/cloudist/publisher.rb
224
- - lib/cloudist/reply_queue.rb
226
+ - lib/cloudist/queues/basic_queue.rb
227
+ - lib/cloudist/queues/job_queue.rb
228
+ - lib/cloudist/queues/reply_queue.rb
225
229
  - lib/cloudist/request.rb
226
230
  - lib/cloudist/utils.rb
227
231
  - lib/cloudist/worker.rb
@@ -229,6 +233,7 @@ files:
229
233
  - spec/cloudist/job_spec.rb
230
234
  - spec/cloudist/payload_spec.rb
231
235
  - spec/cloudist/request_spec.rb
236
+ - spec/cloudist/utils_spec.rb
232
237
  - spec/cloudist_spec.rb
233
238
  - spec/core_ext/string_spec.rb
234
239
  - spec/spec_helper.rb
@@ -267,13 +272,16 @@ signing_key:
267
272
  specification_version: 3
268
273
  summary: Super fast job queue using AMQP
269
274
  test_files:
275
+ - examples/extending_values.rb
270
276
  - examples/queue_message.rb
271
277
  - examples/sandwich_client.rb
272
278
  - examples/sandwich_worker.rb
279
+ - examples/sandwich_worker_with_class.rb
273
280
  - spec/cloudist/basic_queue_spec.rb
274
281
  - spec/cloudist/job_spec.rb
275
282
  - spec/cloudist/payload_spec.rb
276
283
  - spec/cloudist/request_spec.rb
284
+ - spec/cloudist/utils_spec.rb
277
285
  - spec/cloudist_spec.rb
278
286
  - spec/core_ext/string_spec.rb
279
287
  - spec/spec_helper.rb
@@ -1,92 +0,0 @@
1
- module Cloudist
2
- class UnknownReplyTo < RuntimeError; end
3
- class ExpiredMessage < RuntimeError; end
4
-
5
- class BasicQueue
6
- attr_reader :queue_name, :opts
7
- attr_reader :q, :ex, :mq
8
-
9
- def initialize(queue_name, opts = {})
10
- opts = {
11
- :auto_delete => true,
12
- :durable => false,
13
- :prefetch => 1
14
- }.update(opts)
15
-
16
- @queue_name, @opts = queue_name, opts
17
- end
18
-
19
- def setup
20
- return if @setup == true
21
-
22
- @mq = MQ.new
23
- @q = @mq.queue(queue_name, opts)
24
- # if we don't specify an exchange name it defaults to the queue_name
25
- @ex = @mq.direct(opts[:exchange_name] || queue_name)
26
-
27
- q.bind(ex) if ex
28
-
29
- @setup = true
30
- end
31
-
32
- def log
33
- Cloudist.log
34
- end
35
-
36
- def tag
37
- s = "queue=#{q.name}"
38
- s += " exchange=#{ex.name}" if ex
39
- s
40
- end
41
-
42
- def subscribe(amqp_opts={}, opts={})
43
- setup
44
-
45
- q.subscribe(amqp_opts) do |queue_header, json_encoded_message|
46
- return if Cloudist.closing?
47
-
48
- request = Cloudist::Request.new(self, json_encoded_message, queue_header)
49
-
50
- begin
51
- raise Cloudist::ExpiredMessage if request.expired?
52
- yield request if block_given?
53
- finished = Time.now.utc.to_i
54
-
55
- rescue Cloudist::ExpiredMessage
56
- log.info "amqp_message action=timeout #{tag} ttl=#{request.ttl} age=#{request.age} #{request.inspect}"
57
- request.ack if amqp_opts[:ack]
58
-
59
- rescue => e
60
- request.ack if amqp_opts[:ack]
61
- Cloudist.handle_error(e)
62
- end
63
- end
64
- log.info "amqp_subscribe #{tag}"
65
- self
66
- end
67
-
68
- def publish(payload)
69
- payload.set_reply_to(queue_name)
70
- body, headers = payload.formatted
71
- ex.publish(body, headers)
72
- payload.publish
73
- end
74
-
75
- def publish_to_q(payload)
76
- body, headers = payload.formatted
77
- q.publish(body, headers)
78
- payload.publish
79
- return headers
80
- end
81
-
82
- def teardown
83
- @q.unsubscribe
84
- @mq.close
85
- log.debug "amqp_unsubscribe #{tag}"
86
- end
87
-
88
- def destroy
89
- teardown
90
- end
91
- end
92
- end