propono 0.3.0 → 0.4.0
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 +8 -8
- data/lib/propono.rb +2 -2
- data/lib/propono/{services/post_subscriber.rb → components/post_subscription.rb} +4 -4
- data/lib/propono/{services/queue_subscriber.rb → components/queue_subscription.rb} +9 -7
- data/lib/propono/services/queue_listener.rb +27 -19
- data/lib/propono/services/subscriber.rb +2 -2
- data/lib/propono/version.rb +1 -1
- data/test/{post_subscriber_test.rb → post_subscription_test.rb} +6 -6
- data/test/queue_listener_test.rb +41 -18
- data/test/{queue_subscriber_test.rb → queue_subscription_test.rb} +19 -19
- data/test/subscriber_test.rb +6 -6
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OGI3ZmNiOTNiM2RhMmMzOWQwM2NlNTM4OWRhMjY0NjJiYmUyZGMwMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTgyOTIyOTRlNWZhYzNiNGRjNzc0NGZiZTk4ZWVhZjA1ODNmY2UzZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjZjMTVlN2IwMmM5Njc5YzMyN2YzZTNmZmUzMDFkYWNkNWFiY2JkYmY1MWMx
|
10
|
+
MDA2OWJlOTNhODc2MWQyNzUzYjgxODI0ZjZiMzBhZDJiNDEwZjM1ZmNiMzhl
|
11
|
+
Y2ZkNTc1MTQ3NDcyZDJkZjdiZjNlYTQyZmZmMmI1MjY1M2RkYzk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NmM4ZGNmNThjOTFmZTc5MGNmOGFmOWMxNjJlODE0NDRjMWMyZGFkNWU1OThm
|
14
|
+
NjNhNDNhMDQ2NjUxOTc0MTU4Njk1NmIwOTE0NGM5ZjkyN2EyOTNjNzkzZjFm
|
15
|
+
OWE4MTIzZmMyMGMyN2YzNGM2NDQxNTJjMDA0ZGUyNTg0ZTlmZDA=
|
data/lib/propono.rb
CHANGED
@@ -4,12 +4,12 @@ require 'propono/components/sns'
|
|
4
4
|
require 'propono/components/sqs'
|
5
5
|
require "propono/components/queue"
|
6
6
|
require "propono/components/topic"
|
7
|
+
require "propono/components/post_subscription"
|
8
|
+
require "propono/components/queue_subscription"
|
7
9
|
|
8
|
-
require "propono/services/post_subscriber"
|
9
10
|
require "propono/services/publisher"
|
10
11
|
require "propono/services/queue_creator"
|
11
12
|
require "propono/services/queue_listener"
|
12
|
-
require "propono/services/queue_subscriber"
|
13
13
|
require "propono/services/subscriber"
|
14
14
|
require "propono/services/topic_creator"
|
15
15
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Propono
|
2
|
-
class
|
2
|
+
class PostSubscription
|
3
3
|
include Sns
|
4
4
|
|
5
|
-
def self.
|
6
|
-
new(topic, endpoint).
|
5
|
+
def self.create(topic, endpoint)
|
6
|
+
new(topic, endpoint).create
|
7
7
|
end
|
8
8
|
|
9
9
|
def initialize(topic_id, endpoint)
|
@@ -11,7 +11,7 @@ module Propono
|
|
11
11
|
@endpoint = endpoint
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def create
|
15
15
|
topic_arn = TopicCreator.find_or_create(@topic_id)
|
16
16
|
sns.subscribe(topic_arn, @endpoint, 'http')
|
17
17
|
end
|
@@ -1,31 +1,33 @@
|
|
1
1
|
module Propono
|
2
|
-
class
|
2
|
+
class QueueSubscription
|
3
3
|
|
4
4
|
include Sns
|
5
5
|
include Sqs
|
6
6
|
|
7
7
|
attr_reader :topic_arn, :queue
|
8
8
|
|
9
|
-
def self.
|
10
|
-
new(topic_id).
|
9
|
+
def self.create(topic_id)
|
10
|
+
new(topic_id).tap do |subscription|
|
11
|
+
subscription.create
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
def initialize(topic_id)
|
14
16
|
@topic_id = topic_id
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
19
|
+
def create
|
18
20
|
@topic = TopicCreator.find_or_create(@topic_id)
|
19
21
|
@queue = QueueCreator.find_or_create(queue_name)
|
20
22
|
sns.subscribe(@topic.arn, @queue.arn, 'sqs')
|
21
23
|
end
|
22
24
|
|
23
|
-
private
|
24
|
-
|
25
25
|
def queue_name
|
26
|
-
"#{config.application_name.gsub(" ", "_")}::#{@topic_id}"
|
26
|
+
@queue_name ||= "#{config.application_name.gsub(" ", "_")}::#{@topic_id}"
|
27
27
|
end
|
28
28
|
|
29
|
+
private
|
30
|
+
|
29
31
|
def config
|
30
32
|
Configuration.instance
|
31
33
|
end
|
@@ -3,43 +3,51 @@ module Propono
|
|
3
3
|
|
4
4
|
include Sqs
|
5
5
|
|
6
|
-
def self.listen(
|
7
|
-
new(
|
6
|
+
def self.listen(topic_id, &message_processor)
|
7
|
+
new(topic_id, &message_processor).listen
|
8
8
|
end
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
@
|
10
|
+
def initialize(topic_id, &message_processor)
|
11
|
+
@topic_id = topic_id
|
12
|
+
@message_processor = message_processor
|
13
13
|
end
|
14
14
|
|
15
15
|
def listen
|
16
|
-
loop
|
17
|
-
|
18
|
-
|
16
|
+
loop do
|
17
|
+
unless read_messages
|
18
|
+
sleep 10
|
19
|
+
end
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
private
|
22
24
|
|
23
25
|
def read_messages
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
process_messages(messages)
|
31
|
-
end
|
32
|
-
rescue
|
33
|
-
config.logger.puts "Unexpected error reading from queue #{@queue_url}"
|
26
|
+
response = sqs.receive_message( queue_url, options = { 'MaxNumberOfMessages' => 10 } )
|
27
|
+
messages = response.body['Message']
|
28
|
+
if messages.empty?
|
29
|
+
false
|
30
|
+
else
|
31
|
+
process_messages(messages)
|
34
32
|
end
|
33
|
+
rescue
|
34
|
+
config.logger.puts "Unexpected error reading from queue #{queue_url}"
|
35
35
|
end
|
36
36
|
|
37
37
|
def process_messages(messages)
|
38
38
|
messages.each do |message|
|
39
|
-
@
|
39
|
+
@message_processor.call(message)
|
40
40
|
sqs.delete_message(message['ReceiptHandle'])
|
41
41
|
end
|
42
42
|
true
|
43
43
|
end
|
44
|
+
|
45
|
+
def queue_url
|
46
|
+
@queue_url ||= subscription.queue.url
|
47
|
+
end
|
48
|
+
|
49
|
+
def subscription
|
50
|
+
@subscription ||= QueueSubscription.create(@topic_id)
|
51
|
+
end
|
44
52
|
end
|
45
53
|
end
|
@@ -2,11 +2,11 @@ module Propono
|
|
2
2
|
|
3
3
|
module Subscriber
|
4
4
|
def self.subscribe_by_queue(topic)
|
5
|
-
|
5
|
+
QueueSubscription.create(topic)
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.subscribe_by_post(topic, endpoint)
|
9
|
-
|
9
|
+
PostSubscription.create(topic, endpoint)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/propono/version.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require File.expand_path('../test_helper', __FILE__)
|
2
2
|
|
3
3
|
module Propono
|
4
|
-
class
|
4
|
+
class PostSubscriptionTest < Minitest::Test
|
5
5
|
def test_create_topic
|
6
6
|
topic = 'foobar'
|
7
7
|
TopicCreator.expects(:find_or_create).with(topic)
|
8
|
-
|
8
|
+
PostSubscription.create(topic, "foobar")
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def test_create_calls_create
|
12
12
|
arn = "arn123"
|
13
13
|
endpoint = "http://meducation.net/some_queue_name"
|
14
14
|
|
@@ -16,9 +16,9 @@ module Propono
|
|
16
16
|
|
17
17
|
sns = mock()
|
18
18
|
sns.expects(:subscribe).with(arn, endpoint, 'http')
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
subscription = PostSubscription.new("Some topic", endpoint)
|
20
|
+
subscription.stubs(sns: sns)
|
21
|
+
subscription.create
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_it_correctly_uses_http_and_https
|
data/test/queue_listener_test.rb
CHANGED
@@ -4,10 +4,11 @@ module Propono
|
|
4
4
|
class QueueListenerTest < Minitest::Test
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
7
|
+
super
|
8
|
+
@topic_id = "some-topic"
|
8
9
|
|
9
|
-
@
|
10
|
-
@
|
10
|
+
@receipt_handle1 = "test-receipt-handle1"
|
11
|
+
@receipt_handle2 = "test-receipt-handle2"
|
11
12
|
@message1 = { "ReceiptHandle" => @receipt_handle1}
|
12
13
|
@message2 = { "ReceiptHandle" => @receipt_handle2}
|
13
14
|
@messages = { "Message" => [ @message1, @message2 ] }
|
@@ -22,10 +23,10 @@ module Propono
|
|
22
23
|
|
23
24
|
sqs.expects(:receive_message).returns(message_response)
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
queue_listener = QueueListener.new(@topic_id) {}
|
27
|
+
queue_listener.stubs(sqs: sqs)
|
27
28
|
|
28
|
-
|
29
|
+
queue_listener.send(:read_messages)
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_each_message_yielded
|
@@ -37,10 +38,10 @@ module Propono
|
|
37
38
|
sqs.expects(:delete_message).with(@receipt_handle1)
|
38
39
|
sqs.expects(:delete_message).with(@receipt_handle2)
|
39
40
|
|
40
|
-
|
41
|
-
|
41
|
+
queue_listener = QueueListener.new(@topic_id) { }
|
42
|
+
queue_listener.stubs(sqs: sqs)
|
42
43
|
|
43
|
-
|
44
|
+
queue_listener.send(:read_messages)
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_each_message_deleted_from_sqs
|
@@ -51,10 +52,10 @@ module Propono
|
|
51
52
|
sqs.stubs(receive_message: message_response)
|
52
53
|
|
53
54
|
messages_yielded = [ ]
|
54
|
-
|
55
|
-
|
55
|
+
queue_listener = QueueListener.new(@topic_id) { |m| messages_yielded.push(m) }
|
56
|
+
queue_listener.stubs(sqs: sqs)
|
56
57
|
|
57
|
-
|
58
|
+
queue_listener.send(:read_messages)
|
58
59
|
|
59
60
|
assert_equal messages_yielded.size, 2
|
60
61
|
assert messages_yielded.include?(@message1)
|
@@ -70,29 +71,51 @@ module Propono
|
|
70
71
|
|
71
72
|
sqs.expects(:receive_message).returns(message_response)
|
72
73
|
|
73
|
-
|
74
|
-
|
74
|
+
queue_listener = QueueListener.new(@topic_id) {}
|
75
|
+
queue_listener.stubs(sqs: sqs)
|
75
76
|
|
76
|
-
refute
|
77
|
+
refute queue_listener.send(:read_messages)
|
77
78
|
end
|
78
79
|
|
79
80
|
def test_exception_from_sqs_is_logged
|
80
81
|
sqs = mock()
|
81
82
|
sqs.stubs(:receive_message).raises(StandardError)
|
82
83
|
|
83
|
-
|
84
|
-
|
84
|
+
queue_listener = QueueListener.new(@topic_id) {}
|
85
|
+
queue_listener.stubs(sqs: sqs)
|
86
|
+
queue_listener.stubs(queue_url: "http://example.com")
|
85
87
|
|
86
88
|
# capture_io reasigns stderr. Assign the config.logger
|
87
89
|
# to where capture_io has redirected it to for this test.
|
88
90
|
out, err = capture_io do
|
89
91
|
config.logger = $stderr
|
90
|
-
|
92
|
+
queue_listener.send(:read_messages)
|
91
93
|
end
|
92
94
|
# Reassign config.logger to the correct stderr
|
93
95
|
config.logger = $stderr
|
94
96
|
assert_equal "Unexpected error reading from queue http://example.com\n", err
|
95
97
|
end
|
96
98
|
|
99
|
+
def test_exception_from_sqs_returns_false
|
100
|
+
sqs = mock()
|
101
|
+
sqs.stubs(:receive_message).raises(StandardError)
|
102
|
+
|
103
|
+
queue_listener = QueueListener.new(@topic_id) {}
|
104
|
+
queue_listener.stubs(sqs: sqs)
|
105
|
+
|
106
|
+
refute queue_listener.send(:read_messages)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_listen_should_loop
|
110
|
+
listener = QueueListener.new(@topic_id)
|
111
|
+
listener.expects(:loop)
|
112
|
+
listener.listen
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_read_messages_should_subscribe
|
116
|
+
listener = QueueListener.new(@topic_id)
|
117
|
+
QueueSubscription.expects(create: mock(queue: mock(url: {})))
|
118
|
+
listener.send(:read_messages)
|
119
|
+
end
|
97
120
|
end
|
98
121
|
end
|
@@ -1,46 +1,46 @@
|
|
1
1
|
require File.expand_path('../test_helper', __FILE__)
|
2
2
|
|
3
3
|
module Propono
|
4
|
-
class
|
4
|
+
class QueueSubscriptionTest < Minitest::Test
|
5
5
|
def test_create_topic
|
6
6
|
topic_id = 'foobar'
|
7
7
|
topic = Topic.new(topic_id)
|
8
8
|
TopicCreator.expects(:find_or_create).with(topic_id).returns(topic)
|
9
|
-
|
9
|
+
QueueSubscription.create(topic_id)
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_sqs_create_is_called
|
13
13
|
topic_id = "Foobar"
|
14
|
-
|
14
|
+
subscription = QueueSubscription.new(topic_id)
|
15
15
|
|
16
16
|
TopicCreator.stubs(find_or_create: Topic.new("1123"))
|
17
17
|
|
18
18
|
sqs = mock()
|
19
|
-
sqs.expects(:create_queue).with(
|
19
|
+
sqs.expects(:create_queue).with(subscription.send(:queue_name)).returns(mock(body: {'QueueUrl' => Fog::AWS::SQS::Mock::QueueUrl}))
|
20
20
|
QueueCreator.any_instance.stubs(sqs: sqs)
|
21
21
|
|
22
|
-
|
22
|
+
subscription.create
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def test_subscription_queue_name
|
26
26
|
config.application_name = "MyApp"
|
27
27
|
|
28
28
|
topic_id = "Foobar"
|
29
|
-
|
29
|
+
subscription = QueueSubscription.new(topic_id)
|
30
30
|
|
31
|
-
assert_equal
|
31
|
+
assert_equal subscription.send(:queue_name), "MyApp::Foobar"
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def test_subscription_queue_name_with_spaces
|
35
35
|
config.application_name = "My App"
|
36
36
|
|
37
37
|
topic_id = "Foobar"
|
38
|
-
|
38
|
+
subscription = QueueSubscription.new(topic_id)
|
39
39
|
|
40
|
-
assert_equal
|
40
|
+
assert_equal subscription.send(:queue_name), "My_App::Foobar"
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
43
|
+
def test_create_calls_create
|
44
44
|
arn = "arn123"
|
45
45
|
|
46
46
|
TopicCreator.stubs(find_or_create: Topic.new(arn))
|
@@ -48,18 +48,18 @@ module Propono
|
|
48
48
|
|
49
49
|
sns = mock()
|
50
50
|
sns.expects(:subscribe).with(arn, Fog::AWS::SQS::Mock::QueueArn, 'sqs')
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
subscription = QueueSubscription.new("Some topic")
|
52
|
+
subscription.stubs(sns: sns)
|
53
|
+
subscription.create
|
54
54
|
end
|
55
55
|
|
56
|
-
def
|
56
|
+
def test_create_saves_queue
|
57
57
|
queue = Queue.new(Fog::AWS::SQS::Mock::QueueUrl)
|
58
58
|
|
59
59
|
QueueCreator.expects(:find_or_create).returns(queue)
|
60
|
-
|
61
|
-
|
62
|
-
assert_equal queue,
|
60
|
+
subscription = QueueSubscription.new("Some Topic")
|
61
|
+
subscription.create
|
62
|
+
assert_equal queue, subscription.queue
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
data/test/subscriber_test.rb
CHANGED
@@ -4,16 +4,16 @@ module Propono
|
|
4
4
|
class SubscriberTest < Minitest::Test
|
5
5
|
|
6
6
|
def test_subscribe_by_queue_calls_queue_subscriber
|
7
|
-
subscriber =
|
8
|
-
|
9
|
-
|
7
|
+
subscriber = QueueSubscription.new("topic")
|
8
|
+
QueueSubscription.expects(:new).with("topic").returns(subscriber)
|
9
|
+
QueueSubscription.any_instance.expects(:create)
|
10
10
|
Subscriber.subscribe_by_queue("topic")
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_subscribe_by_post_calls_post_subscribe
|
14
|
-
subscriber =
|
15
|
-
|
16
|
-
|
14
|
+
subscriber = PostSubscription.new("topic", 'endpoint')
|
15
|
+
PostSubscription.expects(:new).with("topic", 'endpoint').returns(subscriber)
|
16
|
+
PostSubscription.any_instance.expects(:create)
|
17
17
|
Subscriber.subscribe_by_post("topic", "endpoint")
|
18
18
|
end
|
19
19
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: propono
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MalcyL
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
@@ -97,26 +97,26 @@ files:
|
|
97
97
|
- README.md
|
98
98
|
- Rakefile
|
99
99
|
- lib/propono.rb
|
100
|
+
- lib/propono/components/post_subscription.rb
|
100
101
|
- lib/propono/components/queue.rb
|
102
|
+
- lib/propono/components/queue_subscription.rb
|
101
103
|
- lib/propono/components/sns.rb
|
102
104
|
- lib/propono/components/sqs.rb
|
103
105
|
- lib/propono/components/topic.rb
|
104
106
|
- lib/propono/configuration.rb
|
105
|
-
- lib/propono/services/post_subscriber.rb
|
106
107
|
- lib/propono/services/publisher.rb
|
107
108
|
- lib/propono/services/queue_creator.rb
|
108
109
|
- lib/propono/services/queue_listener.rb
|
109
|
-
- lib/propono/services/queue_subscriber.rb
|
110
110
|
- lib/propono/services/subscriber.rb
|
111
111
|
- lib/propono/services/topic_creator.rb
|
112
112
|
- lib/propono/version.rb
|
113
113
|
- propono.gemspec
|
114
114
|
- test/configuration_test.rb
|
115
|
-
- test/
|
115
|
+
- test/post_subscription_test.rb
|
116
116
|
- test/publisher_test.rb
|
117
117
|
- test/queue_creator_test.rb
|
118
118
|
- test/queue_listener_test.rb
|
119
|
-
- test/
|
119
|
+
- test/queue_subscription_test.rb
|
120
120
|
- test/queue_test.rb
|
121
121
|
- test/sns_test.rb
|
122
122
|
- test/sqs_test.rb
|
@@ -150,11 +150,11 @@ specification_version: 4
|
|
150
150
|
summary: General purpose pub/sub library built on top of AWS SNS and SQS
|
151
151
|
test_files:
|
152
152
|
- test/configuration_test.rb
|
153
|
-
- test/
|
153
|
+
- test/post_subscription_test.rb
|
154
154
|
- test/publisher_test.rb
|
155
155
|
- test/queue_creator_test.rb
|
156
156
|
- test/queue_listener_test.rb
|
157
|
-
- test/
|
157
|
+
- test/queue_subscription_test.rb
|
158
158
|
- test/queue_test.rb
|
159
159
|
- test/sns_test.rb
|
160
160
|
- test/sqs_test.rb
|