sneakers 1.0.2 → 1.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.
- checksums.yaml +4 -4
- data/lib/sneakers/configuration.rb +11 -1
- data/lib/sneakers/queue.rb +6 -3
- data/lib/sneakers/version.rb +1 -1
- data/lib/sneakers/worker.rb +1 -1
- data/sneakers.gemspec +3 -2
- data/spec/sneakers/configuration_spec.rb +34 -1
- data/spec/sneakers/queue_spec.rb +53 -26
- metadata +24 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec56c8e9d5a17b77884550db383bd199027c6df5
|
4
|
+
data.tar.gz: 057d82d280432901949988868f0643958cd26ec4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d57c46bf38eb2bbb9752cc4fdc14d2de9ff9abdd9cf5d32a5a9a89c68e62d1884ccff6ba9c46eae106ea02c30ed2b4f8faffe8d3e69a1527ba395b3c0a2663a
|
7
|
+
data.tar.gz: f31f033a8fb2173632e16f7bd2ac73d6e6572270e8c77cc6f3d8dd3510ae63cd02bd241d6609c488a5dbb93ecc34d1d66653985e1e7895265c185ef92f7fd10f
|
@@ -4,7 +4,7 @@ module Sneakers
|
|
4
4
|
class Configuration
|
5
5
|
|
6
6
|
extend Forwardable
|
7
|
-
def_delegators :@hash, :to_hash, :[], :[]=,
|
7
|
+
def_delegators :@hash, :to_hash, :[], :[]=, :==, :fetch, :delete
|
8
8
|
|
9
9
|
DEFAULTS = {
|
10
10
|
# runner
|
@@ -39,6 +39,16 @@ module Sneakers
|
|
39
39
|
@hash[:vhost] = AMQ::Settings.parse_amqp_url(@hash[:amqp]).fetch(:vhost, '/')
|
40
40
|
end
|
41
41
|
|
42
|
+
def merge!(hash)
|
43
|
+
# parse vhost from amqp if vhost is not specified explicitly
|
44
|
+
if hash[:vhost].nil? && !hash[:amqp].nil?
|
45
|
+
hash = hash.dup
|
46
|
+
hash[:vhost] = AMQ::Settings.parse_amqp_url(hash[:amqp]).fetch(:vhost, '/')
|
47
|
+
end
|
48
|
+
|
49
|
+
@hash.merge!(hash)
|
50
|
+
end
|
51
|
+
|
42
52
|
def merge(hash)
|
43
53
|
instance = self.class.new
|
44
54
|
instance.merge! to_hash
|
data/lib/sneakers/queue.rb
CHANGED
@@ -22,7 +22,8 @@ class Sneakers::Queue
|
|
22
22
|
@channel = @bunny.create_channel
|
23
23
|
@channel.prefetch(@opts[:prefetch])
|
24
24
|
|
25
|
-
|
25
|
+
exchange_name = @opts[:exchange]
|
26
|
+
@exchange = @channel.exchange(exchange_name,
|
26
27
|
:type => @opts[:exchange_type],
|
27
28
|
:durable => @opts[:durable])
|
28
29
|
|
@@ -35,8 +36,10 @@ class Sneakers::Queue
|
|
35
36
|
queue_durable = @opts[:queue_durable].nil? ? @opts[:durable] : @opts[:queue_durable]
|
36
37
|
queue = @channel.queue(@name, :durable => queue_durable, :arguments => @opts[:arguments])
|
37
38
|
|
38
|
-
|
39
|
-
|
39
|
+
if exchange_name.length > 0
|
40
|
+
routing_keys.each do |key|
|
41
|
+
queue.bind(@exchange, :routing_key => key)
|
42
|
+
end
|
40
43
|
end
|
41
44
|
|
42
45
|
# NOTE: we are using the worker's options. This is necessary so the handler
|
data/lib/sneakers/version.rb
CHANGED
data/lib/sneakers/worker.rb
CHANGED
@@ -50,7 +50,7 @@ module Sneakers
|
|
50
50
|
|
51
51
|
begin
|
52
52
|
metrics.increment("work.#{self.class.name}.started")
|
53
|
-
Timeout.timeout(@timeout_after) do
|
53
|
+
Timeout.timeout(@timeout_after, Timeout::Error) do
|
54
54
|
metrics.timing("work.#{self.class.name}.time") do
|
55
55
|
if @call_with_params
|
56
56
|
res = work_with_params(msg, delivery_info, metadata)
|
data/sneakers.gemspec
CHANGED
@@ -16,9 +16,9 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.executables = gem.files.grep(/^bin/).map { |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(/^(test|spec|features)\//)
|
18
18
|
gem.require_paths = ['lib']
|
19
|
-
gem.add_dependency 'serverengine'
|
19
|
+
gem.add_dependency 'serverengine', '~> 1.5.5'
|
20
20
|
gem.add_dependency 'bunny', '~> 1.7.0'
|
21
|
-
gem.add_dependency 'thread'
|
21
|
+
gem.add_dependency 'thread', '0.1.5'
|
22
22
|
gem.add_dependency 'thor'
|
23
23
|
|
24
24
|
gem.add_development_dependency 'rr'
|
@@ -30,5 +30,6 @@ Gem::Specification.new do |gem|
|
|
30
30
|
gem.add_development_dependency 'simplecov-rcov-text'
|
31
31
|
gem.add_development_dependency 'rake'
|
32
32
|
gem.add_development_dependency 'minitest'
|
33
|
+
gem.add_development_dependency 'guard'
|
33
34
|
end
|
34
35
|
|
@@ -32,6 +32,39 @@ describe Sneakers::Configuration do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
it 'should parse vhost from amqp option' do
|
36
|
+
env_url = 'amqp://foo:bar@localhost:5672/foobarvhost'
|
37
|
+
with_env('RABBITMQ_URL', env_url) do
|
38
|
+
url = 'amqp://foo:bar@localhost:5672/testvhost'
|
39
|
+
config = Sneakers::Configuration.new
|
40
|
+
config.merge!({ :amqp => url })
|
41
|
+
config[:vhost].must_equal 'testvhost'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should not parse vhost from amqp option if vhost is specified explicitly' do
|
46
|
+
url = 'amqp://foo:bar@localhost:5672/foobarvhost'
|
47
|
+
config = Sneakers::Configuration.new
|
48
|
+
config.merge!({ :amqp => url, :vhost => 'test_host' })
|
49
|
+
config[:vhost].must_equal 'test_host'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should use vhost option if it is specified' do
|
53
|
+
url = 'amqp://foo:bar@localhost:5672/foobarvhost'
|
54
|
+
with_env('RABBITMQ_URL', url) do
|
55
|
+
config = Sneakers::Configuration.new
|
56
|
+
config.merge!({ :vhost => 'test_host' })
|
57
|
+
config[:vhost].must_equal 'test_host'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should use default vhost if vhost is not specified in amqp option' do
|
62
|
+
url = 'amqp://foo:bar@localhost:5672'
|
63
|
+
config = Sneakers::Configuration.new
|
64
|
+
config.merge!({ :amqp => url })
|
65
|
+
config[:vhost].must_equal '/'
|
66
|
+
end
|
67
|
+
|
35
68
|
def with_env(key, value)
|
36
69
|
old_value = ENV[key]
|
37
70
|
ENV[key] = value
|
@@ -39,4 +72,4 @@ describe Sneakers::Configuration do
|
|
39
72
|
ensure
|
40
73
|
ENV[key] = old_value
|
41
74
|
end
|
42
|
-
end
|
75
|
+
end
|
data/spec/sneakers/queue_spec.rb
CHANGED
@@ -8,35 +8,38 @@ describe Sneakers::Queue do
|
|
8
8
|
Sneakers.configure
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
let :queue_vars do
|
12
|
+
{
|
13
|
+
:prefetch => 25,
|
14
|
+
:durable => true,
|
15
|
+
:ack => true,
|
16
|
+
:heartbeat => 2,
|
17
|
+
:vhost => '/',
|
18
|
+
:exchange => "sneakers",
|
19
|
+
:exchange_type => :direct
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
@mkbunny = Object.new
|
25
|
+
@mkchan = Object.new
|
26
|
+
@mkex = Object.new
|
27
|
+
@mkqueue = Object.new
|
28
|
+
@mkqueue_nondurable = Object.new
|
29
|
+
@mkworker = Object.new
|
23
30
|
|
31
|
+
mock(@mkbunny).start {}
|
32
|
+
mock(@mkbunny).create_channel{ @mkchan }
|
33
|
+
mock(Bunny).new(anything, :vhost => '/', :heartbeat => 2){ @mkbunny }
|
34
|
+
|
35
|
+
mock(@mkchan).prefetch(25)
|
36
|
+
|
37
|
+
stub(@mkworker).opts { { :exchange => 'test-exchange' } }
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#subscribe with sneakers exchange" do
|
24
41
|
before do
|
25
|
-
@mkbunny = Object.new
|
26
|
-
@mkchan = Object.new
|
27
|
-
@mkex = Object.new
|
28
|
-
@mkqueue = Object.new
|
29
|
-
@mkqueue_nondurable = Object.new
|
30
|
-
@mkworker = Object.new
|
31
|
-
|
32
|
-
mock(@mkbunny).start {}
|
33
|
-
mock(@mkbunny).create_channel{ @mkchan }
|
34
|
-
mock(Bunny).new(anything, :vhost => '/', :heartbeat => 2){ @mkbunny }
|
35
|
-
|
36
|
-
mock(@mkchan).prefetch(25)
|
37
42
|
mock(@mkchan).exchange("sneakers", :type => :direct, :durable => true){ @mkex }
|
38
|
-
|
39
|
-
stub(@mkworker).opts { { :exchange => 'test-exchange' } }
|
40
43
|
end
|
41
44
|
|
42
45
|
it "should setup a bunny queue according to configuration values" do
|
@@ -86,5 +89,29 @@ describe Sneakers::Queue do
|
|
86
89
|
myqueue = q.instance_variable_get(:@queue)
|
87
90
|
end
|
88
91
|
end
|
92
|
+
|
93
|
+
describe "#subscribe with default exchange" do
|
94
|
+
before do
|
95
|
+
# expect default exchange
|
96
|
+
queue_vars[:exchange] = ""
|
97
|
+
mock(@mkchan).exchange("", :type => :direct, :durable => true){ @mkex }
|
98
|
+
end
|
99
|
+
|
100
|
+
it "does not bind to exchange" do
|
101
|
+
mock(@mkchan).queue("downloads", :durable => true) { @mkqueue }
|
102
|
+
@handler = Object.new
|
103
|
+
worker_opts = { :handler => @handler }
|
104
|
+
stub(@mkworker).opts { worker_opts }
|
105
|
+
mock(@handler).new(@mkchan, @mkqueue, worker_opts).once
|
106
|
+
|
107
|
+
stub(@mkqueue).bind do
|
108
|
+
raise "bind should not be called"
|
109
|
+
end
|
110
|
+
|
111
|
+
stub(@mkqueue).subscribe
|
112
|
+
q = Sneakers::Queue.new("downloads", queue_vars)
|
113
|
+
q.subscribe(@mkworker)
|
114
|
+
end
|
115
|
+
end
|
89
116
|
end
|
90
117
|
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sneakers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dotan Nahum
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serverengine
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.5.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.5.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bunny
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: thread
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.1.5
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.1.5
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: thor
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +192,20 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: guard
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
195
209
|
description: " Fast background processing framework for Ruby and RabbitMQ "
|
196
210
|
email:
|
197
211
|
- jondotan@gmail.com
|