fairway 0.1.3 → 0.1.4
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 +1 -0
- data/Gemfile.lock +9 -3
- data/fairway.gemspec +0 -1
- data/lib/fairway/config.rb +15 -5
- data/lib/fairway/connection.rb +5 -3
- data/lib/fairway/facet.rb +9 -5
- data/lib/fairway/queue.rb +10 -6
- data/lib/fairway/scripts.rb +20 -6
- data/lib/fairway/version.rb +1 -1
- data/lib/fairway.rb +0 -1
- data/spec/lib/fairway/channeled_connection_spec.rb +33 -13
- data/spec/lib/fairway/config_spec.rb +16 -1
- data/spec/lib/fairway/connection_spec.rb +35 -16
- data/spec/lib/fairway/queue_spec.rb +15 -9
- data/spec/lib/fairway/scripts_spec.rb +23 -9
- data/spec/spec_helper.rb +2 -2
- metadata +2 -18
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fairway (0.1.
|
4
|
+
fairway (0.1.3)
|
5
5
|
activesupport
|
6
|
-
hiredis
|
7
6
|
redis
|
8
7
|
redis-namespace (>= 1.3.0)
|
9
8
|
|
@@ -16,10 +15,16 @@ GEM
|
|
16
15
|
celluloid (0.12.4)
|
17
16
|
facter (>= 1.6.12)
|
18
17
|
timers (>= 1.0.0)
|
18
|
+
columnize (0.3.6)
|
19
19
|
connection_pool (1.0.0)
|
20
|
+
debugger (1.6.0)
|
21
|
+
columnize (>= 0.3.1)
|
22
|
+
debugger-linecache (~> 1.2.0)
|
23
|
+
debugger-ruby_core_source (~> 1.2.1)
|
24
|
+
debugger-linecache (1.2.0)
|
25
|
+
debugger-ruby_core_source (1.2.2)
|
20
26
|
diff-lcs (1.1.3)
|
21
27
|
facter (1.6.17)
|
22
|
-
hiredis (0.4.5)
|
23
28
|
i18n (0.6.1)
|
24
29
|
multi_json (1.5.0)
|
25
30
|
redis (3.0.4)
|
@@ -45,6 +50,7 @@ PLATFORMS
|
|
45
50
|
ruby
|
46
51
|
|
47
52
|
DEPENDENCIES
|
53
|
+
debugger
|
48
54
|
fairway!
|
49
55
|
rspec
|
50
56
|
sidekiq
|
data/fairway.gemspec
CHANGED
data/lib/fairway/config.rb
CHANGED
@@ -33,18 +33,28 @@ module Fairway
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def redis
|
36
|
-
@redis ||= Redis::Namespace.new(@namespace, redis: raw_redis)
|
36
|
+
@redis ||= pool { Redis::Namespace.new(@namespace, redis: raw_redis) }
|
37
37
|
end
|
38
38
|
|
39
39
|
def scripts
|
40
|
-
@scripts ||=
|
40
|
+
@scripts ||= begin
|
41
|
+
Scripts.new(pool { raw_redis }, @namespace)
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
|
-
|
45
|
+
private
|
44
46
|
|
45
|
-
def
|
46
|
-
|
47
|
+
def pool(&block)
|
48
|
+
pool_size = @redis_options[:pool] || 1
|
49
|
+
pool_timeout = @redis_options[:timeout] || 5
|
50
|
+
|
51
|
+
ConnectionPool.new(size: pool_size, timeout: pool_timeout) do
|
52
|
+
yield
|
53
|
+
end
|
47
54
|
end
|
48
55
|
|
56
|
+
def raw_redis
|
57
|
+
Redis.new(@redis_options)
|
58
|
+
end
|
49
59
|
end
|
50
60
|
end
|
data/lib/fairway/connection.rb
CHANGED
@@ -26,9 +26,11 @@ module Fairway
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def subscribe(channel_pattern, &block)
|
29
|
-
redis
|
30
|
-
|
31
|
-
|
29
|
+
redis do |conn|
|
30
|
+
conn.psubscribe(channel_pattern) do |on|
|
31
|
+
on.pmessage do |pattern, channel, message|
|
32
|
+
block.call(channel, message)
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/fairway/facet.rb
CHANGED
@@ -10,14 +10,18 @@ module Fairway
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def length
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
redis.with do |conn|
|
14
|
+
each_queue do |queue|
|
15
|
+
conn.llen(facet_key(queue))
|
16
|
+
end.sum
|
17
|
+
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def priority
|
19
|
-
|
20
|
-
|
21
|
+
redis.with do |conn|
|
22
|
+
each_queue do |queue|
|
23
|
+
(conn.hget(priority_key(queue), name) || 1).to_i
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
data/lib/fairway/queue.rb
CHANGED
@@ -8,17 +8,21 @@ module Fairway
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def active_facets
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
redis.with do |conn|
|
12
|
+
facet_names = unique_queues.map do |queue|
|
13
|
+
conn.smembers("#{queue}:active_facets")
|
14
|
+
end.flatten.uniq
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
facet_names.map do |name|
|
17
|
+
Facet.new(self, name)
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
22
|
def length
|
21
|
-
redis.
|
23
|
+
redis.with do |conn|
|
24
|
+
conn.mget(unique_queues.map{|q| "#{q}:length" }).map(&:to_i).sum
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
def peek
|
data/lib/fairway/scripts.rb
CHANGED
@@ -7,29 +7,43 @@ module Fairway
|
|
7
7
|
@script_shas ||= {}
|
8
8
|
end
|
9
9
|
|
10
|
+
attr_reader :redis
|
11
|
+
|
10
12
|
def initialize(redis, namespace)
|
11
|
-
@redis
|
13
|
+
@redis = redis
|
12
14
|
@namespace = namespace
|
13
15
|
end
|
14
16
|
|
15
17
|
def register_queue(name, channel)
|
16
|
-
|
18
|
+
redis.with do |conn|
|
19
|
+
conn.hset(registered_queues_key, name, channel)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
def unregister_queue(name)
|
20
|
-
|
24
|
+
redis.with do |conn|
|
25
|
+
conn.hdel(registered_queues_key, name)
|
26
|
+
end
|
21
27
|
end
|
22
28
|
|
23
29
|
def registered_queues
|
24
|
-
|
30
|
+
redis.with do |conn|
|
31
|
+
conn.hgetall(registered_queues_key)
|
32
|
+
end
|
25
33
|
end
|
26
34
|
|
27
35
|
def method_missing(method_name, *args)
|
28
36
|
loaded = false
|
29
|
-
|
37
|
+
|
38
|
+
redis.with do |conn|
|
39
|
+
conn.evalsha(script_sha(method_name), [namespace], args)
|
40
|
+
end
|
30
41
|
rescue Redis::CommandError => ex
|
31
42
|
if ex.message.include?("NOSCRIPT") && !loaded
|
32
|
-
|
43
|
+
redis.with do |conn|
|
44
|
+
conn.script(:load, script_source(method_name))
|
45
|
+
end
|
46
|
+
|
33
47
|
loaded = true
|
34
48
|
retry
|
35
49
|
else
|
data/lib/fairway/version.rb
CHANGED
data/lib/fairway.rb
CHANGED
@@ -13,7 +13,7 @@ module Fairway
|
|
13
13
|
message[:topic]
|
14
14
|
end
|
15
15
|
end
|
16
|
-
let(:redis)
|
16
|
+
let(:redis) { config.redis }
|
17
17
|
let(:message) { { facet: 1, topic: "event:helloworld" } }
|
18
18
|
|
19
19
|
it "delegates non existant methods to parent connection" do
|
@@ -33,8 +33,11 @@ module Fairway
|
|
33
33
|
config.register_queue("myqueue", ".*:helloworld")
|
34
34
|
config.register_queue("yourqueue", "event:.*world")
|
35
35
|
connection.deliver(message)
|
36
|
-
|
37
|
-
redis.
|
36
|
+
|
37
|
+
redis.with do |conn|
|
38
|
+
conn.llen("myqueue:1").should == 1
|
39
|
+
conn.llen("yourqueue:1").should == 1
|
40
|
+
end
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
@@ -45,25 +48,36 @@ module Fairway
|
|
45
48
|
|
46
49
|
it "adds message to the environment facet for the queue" do
|
47
50
|
connection.deliver(message)
|
48
|
-
|
49
|
-
redis.
|
51
|
+
|
52
|
+
redis.with do |conn|
|
53
|
+
conn.llen("myqueue:1").should == 1
|
54
|
+
conn.lindex("myqueue:1", 0).should == message.to_json
|
55
|
+
end
|
50
56
|
end
|
51
57
|
|
52
58
|
it "adds facet to list of active facets" do
|
53
59
|
connection.deliver(message)
|
54
|
-
|
60
|
+
|
61
|
+
redis.with do |conn|
|
62
|
+
conn.smembers("myqueue:active_facets").should == ["1"]
|
63
|
+
end
|
55
64
|
end
|
56
65
|
|
57
66
|
it "pushes facet onto facet queue" do
|
58
67
|
connection.deliver(message)
|
59
|
-
|
60
|
-
redis.
|
68
|
+
|
69
|
+
redis.with do |conn|
|
70
|
+
conn.llen("myqueue:facet_queue").should == 1
|
71
|
+
conn.lindex("myqueue:facet_queue", 0).should == "1"
|
72
|
+
end
|
61
73
|
end
|
62
74
|
|
63
75
|
it "doesn't push onto to facet queue if currently active" do
|
64
|
-
redis.
|
65
|
-
|
66
|
-
|
76
|
+
redis.with do |conn|
|
77
|
+
conn.sadd("myqueue:active_facets", "1")
|
78
|
+
connection.deliver(message)
|
79
|
+
conn.llen("myqueue:facet_queue").should == 0
|
80
|
+
end
|
67
81
|
end
|
68
82
|
end
|
69
83
|
|
@@ -74,12 +88,18 @@ module Fairway
|
|
74
88
|
|
75
89
|
it "doesn't add message to the queue" do
|
76
90
|
connection.deliver(message)
|
77
|
-
|
91
|
+
|
92
|
+
redis.with do |conn|
|
93
|
+
conn.llen("myqueue:1").should == 0
|
94
|
+
end
|
78
95
|
end
|
79
96
|
|
80
97
|
it "doesn't add facet to list of active facets" do
|
81
98
|
connection.deliver(message)
|
82
|
-
|
99
|
+
|
100
|
+
redis.with do |conn|
|
101
|
+
conn.smembers("myqueue:active_facets").should == []
|
102
|
+
end
|
83
103
|
end
|
84
104
|
end
|
85
105
|
end
|
@@ -23,12 +23,27 @@ module Fairway
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
it "allows
|
26
|
+
it "allows redis config" do
|
27
27
|
Config.new do |config|
|
28
28
|
config.redis = { host: "127.0.0.1", port: 6379 }
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
it "allows setting of connection pooling" do
|
33
|
+
config = Config.new do |config|
|
34
|
+
config.redis = { pool: 10 }
|
35
|
+
end
|
36
|
+
|
37
|
+
config.redis.instance_variable_get("@size").should == 10
|
38
|
+
end
|
39
|
+
|
40
|
+
it "defaults to pool of 1" do
|
41
|
+
config = Config.new do |config|
|
42
|
+
end
|
43
|
+
|
44
|
+
config.redis.instance_variable_get("@size").should == 1
|
45
|
+
end
|
46
|
+
|
32
47
|
it "allows setting of redis namespace" do
|
33
48
|
config = Config.new do |config|
|
34
49
|
config.namespace = "ns"
|
@@ -8,14 +8,16 @@ module Fairway
|
|
8
8
|
|
9
9
|
describe "#initialize" do
|
10
10
|
it "registers queues from the config" do
|
11
|
-
|
12
|
-
|
11
|
+
redis.with do |conn|
|
12
|
+
Fairway.config.register_queue("myqueue", ".*")
|
13
|
+
conn.hgetall("registered_queues").should == {}
|
13
14
|
|
14
|
-
|
15
|
+
Connection.new(Fairway.config)
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
conn.hgetall("registered_queues").should == {
|
18
|
+
"myqueue" => ".*"
|
19
|
+
}
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
context "when an existing queue definition does not match" do
|
@@ -25,7 +27,9 @@ module Fairway
|
|
25
27
|
|
26
28
|
describe "#queues" do
|
27
29
|
it "returns a Queue for every currently registered queue" do
|
28
|
-
|
30
|
+
redis.with do |conn|
|
31
|
+
conn.hset("registered_queues", "name", "channel")
|
32
|
+
end
|
29
33
|
|
30
34
|
connection.queues.should == [
|
31
35
|
Queue.new(connection, "name")
|
@@ -57,25 +61,36 @@ module Fairway
|
|
57
61
|
|
58
62
|
it "adds message to the environment facet for the queue" do
|
59
63
|
connection.deliver(message)
|
60
|
-
|
61
|
-
redis.
|
64
|
+
|
65
|
+
redis.with do |conn|
|
66
|
+
conn.llen("myqueue:1").should == 1
|
67
|
+
conn.lindex("myqueue:1", 0).should == message.to_json
|
68
|
+
end
|
62
69
|
end
|
63
70
|
|
64
71
|
it "adds facet to list of active facets" do
|
65
72
|
connection.deliver(message)
|
66
|
-
|
73
|
+
|
74
|
+
redis.with do |conn|
|
75
|
+
conn.smembers("myqueue:active_facets").should == ["1"]
|
76
|
+
end
|
67
77
|
end
|
68
78
|
|
69
79
|
it "pushes facet onto facet queue" do
|
70
80
|
connection.deliver(message)
|
71
|
-
|
72
|
-
redis.
|
81
|
+
|
82
|
+
redis.with do |conn|
|
83
|
+
conn.llen("myqueue:facet_queue").should == 1
|
84
|
+
conn.lindex("myqueue:facet_queue", 0).should == "1"
|
85
|
+
end
|
73
86
|
end
|
74
87
|
|
75
88
|
it "doesn't push onto to facet queue if currently active" do
|
76
|
-
redis.
|
77
|
-
|
78
|
-
|
89
|
+
redis.with do |conn|
|
90
|
+
conn.sadd("myqueue:active_facets", "1")
|
91
|
+
connection.deliver(message)
|
92
|
+
conn.llen("myqueue:facet_queue").should == 0
|
93
|
+
end
|
79
94
|
end
|
80
95
|
end
|
81
96
|
|
@@ -88,7 +103,11 @@ module Fairway
|
|
88
103
|
connection.deliver(message)
|
89
104
|
connection.unregister_queue("myqueue")
|
90
105
|
connection.deliver(message)
|
91
|
-
|
106
|
+
|
107
|
+
|
108
|
+
redis.with do |conn|
|
109
|
+
conn.llen("myqueue:1").should == 1
|
110
|
+
end
|
92
111
|
end
|
93
112
|
end
|
94
113
|
end
|
@@ -294,7 +294,9 @@ module Fairway
|
|
294
294
|
connection.deliver(message2)
|
295
295
|
connection.deliver(message1)
|
296
296
|
|
297
|
-
connection.redis.
|
297
|
+
connection.redis.with do |conn|
|
298
|
+
conn.del("myqueue:facet_pool")
|
299
|
+
end
|
298
300
|
|
299
301
|
queue.pull.should == ["myqueue", message1.to_json]
|
300
302
|
queue.pull.should == ["myqueue", message2.to_json]
|
@@ -328,11 +330,13 @@ module Fairway
|
|
328
330
|
it "removes any redis keys related to the queue" do
|
329
331
|
connection.deliver(message)
|
330
332
|
|
331
|
-
connection.redis.
|
333
|
+
connection.redis.with do |conn|
|
334
|
+
conn.keys("myqueue:*").length.should > 0
|
332
335
|
|
333
|
-
|
336
|
+
queue.destroy
|
334
337
|
|
335
|
-
|
338
|
+
conn.keys("myqueue:*").length.should == 0
|
339
|
+
end
|
336
340
|
end
|
337
341
|
|
338
342
|
context "multiple queues" do
|
@@ -359,13 +363,15 @@ module Fairway
|
|
359
363
|
end
|
360
364
|
|
361
365
|
it "removes any redis keys related both queues" do
|
362
|
-
connection.redis.
|
363
|
-
|
366
|
+
connection.redis.with do |conn|
|
367
|
+
conn.keys("myqueue1:*").length.should > 0
|
368
|
+
conn.keys("myqueue2:*").length.should > 0
|
364
369
|
|
365
|
-
|
370
|
+
queue.destroy
|
366
371
|
|
367
|
-
|
368
|
-
|
372
|
+
conn.keys("myqueue1:*").length.should == 0
|
373
|
+
conn.keys("myqueue2:*").length.should == 0
|
374
|
+
end
|
369
375
|
end
|
370
376
|
end
|
371
377
|
end
|
@@ -2,6 +2,8 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
module Fairway
|
4
4
|
describe Scripts do
|
5
|
+
let(:redis) { Fairway::Config.new.redis }
|
6
|
+
|
5
7
|
describe "#initialize" do
|
6
8
|
it "requires a redis client" do
|
7
9
|
lambda {
|
@@ -11,36 +13,45 @@ module Fairway
|
|
11
13
|
end
|
12
14
|
|
13
15
|
describe "#register_queue" do
|
14
|
-
let(:scripts) { Scripts.new(
|
16
|
+
let(:scripts) { Scripts.new(redis, "foo") }
|
15
17
|
|
16
18
|
it "adds the queue and channel to the hash of registered queues" do
|
17
19
|
scripts.register_queue("name", "channel")
|
18
|
-
|
20
|
+
|
21
|
+
redis.with do |conn|
|
22
|
+
conn.hgetall("foo:registered_queues").should == { "name" => "channel" }
|
23
|
+
end
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
22
27
|
describe "#unregister_queue" do
|
23
|
-
let(:scripts) { Scripts.new(
|
28
|
+
let(:scripts) { Scripts.new(redis, "foo") }
|
24
29
|
|
25
30
|
it "removes the queue and channel from the hash of registered queues" do
|
26
31
|
scripts.register_queue("name", "channel")
|
27
32
|
scripts.unregister_queue("name")
|
28
|
-
|
33
|
+
|
34
|
+
redis.with do |conn|
|
35
|
+
conn.hgetall("foo:registered_queues").should == {}
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
31
39
|
|
32
40
|
describe "#registered_queues" do
|
33
|
-
let(:scripts) { Scripts.new(
|
41
|
+
let(:scripts) { Scripts.new(redis, "foo") }
|
34
42
|
|
35
43
|
it "returns hash of all registered queues and their channels" do
|
36
|
-
|
37
|
-
|
44
|
+
redis.with do |conn|
|
45
|
+
conn.hset("foo:registered_queues", "first", "channel1")
|
46
|
+
conn.hset("foo:registered_queues", "second", "channel2")
|
47
|
+
end
|
48
|
+
|
38
49
|
scripts.registered_queues.should == { "first" => "channel1", "second" => "channel2" }
|
39
50
|
end
|
40
51
|
end
|
41
52
|
|
42
53
|
describe "#method_missing" do
|
43
|
-
let(:scripts) { Scripts.new(
|
54
|
+
let(:scripts) { Scripts.new(redis, "foo") }
|
44
55
|
|
45
56
|
it "runs the script" do
|
46
57
|
scripts.fairway_pull("namespace", "name")
|
@@ -48,7 +59,10 @@ module Fairway
|
|
48
59
|
|
49
60
|
context "when the script does not exist" do
|
50
61
|
it "loads the script" do
|
51
|
-
|
62
|
+
redis.with do |conn|
|
63
|
+
conn.script(:flush)
|
64
|
+
end
|
65
|
+
|
52
66
|
scripts.fairway_pull("namespace", "name")
|
53
67
|
end
|
54
68
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -27,10 +27,10 @@ RSpec.configure do |config|
|
|
27
27
|
config.facet { |message| message[:facet] }
|
28
28
|
end
|
29
29
|
|
30
|
-
Fairway::Config.new.redis.flushdb
|
30
|
+
Fairway::Config.new.redis.with{ |r| r.flushdb }
|
31
31
|
end
|
32
32
|
|
33
33
|
config.after(:each) do
|
34
|
-
Fairway::Config.new.redis.flushdb
|
34
|
+
Fairway::Config.new.redis.with{ |r| r.flushdb }
|
35
35
|
end
|
36
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fairway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '0'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: hiredis
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
46
|
- !ruby/object:Gem::Dependency
|
63
47
|
name: redis-namespace
|
64
48
|
requirement: !ruby/object:Gem::Requirement
|