propono 0.5.4 → 0.5.5
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 +5 -13
- data/lib/propono/components/queue_subscription.rb +26 -0
- data/lib/propono/configuration.rb +2 -3
- data/lib/propono/services/publisher.rb +28 -3
- data/lib/propono/version.rb +1 -1
- data/test/publisher_test.rb +69 -17
- data/test/queue_listener_test.rb +0 -5
- data/test/queue_subscription_test.rb +16 -1
- data/test/test_helper.rb +22 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NjY0MDAzODFkZmEyMDAzYWI3ZDQwYmQyMWE4ZTEyNWUwYTlmYjc3OQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e24f186302b02c6e3a2896ab707fbbcc2cd6b447
|
4
|
+
data.tar.gz: 813ea1ee8356ae861fc0f5b77f84eb08b5497b26
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MTA4ZTRiNDhkMmRiZjM1MWFmMWI5OGQ4YTU2MzI3N2E5ODdkNGRhMTBlMTM1
|
11
|
-
ZjJiYWFhYTgyN2Y3YjI3MzZmZjJhMzU2YmFjOGY0OGM2MTUzMWQ=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2VhYTFjZTNmOGJiNGMyZjY2OGViNjZmODZlY2Y2OWM5OGExNjRkOTAxYWJm
|
14
|
-
Y2JkNjQ1YzY4NWRlZWUzOWNkZTA0YzJiYzBjOTU4ZmE3MzgzZTNhNmNlZWU1
|
15
|
-
NTY2NDE5MDE4YzJjZTVjMzNkMWUyZDBmZTdiYjE2NzNjYjU3ODc=
|
6
|
+
metadata.gz: 28b340921d2d6681824f219864f1875c9f3136670ea869aa621a8a3a5d23326a4fcac618abb39e1313b8075497906a95fa7d5da573839f01766b82436019f1b7
|
7
|
+
data.tar.gz: 0adc3c6ef53887926106b62c60ca6a4fd0800a5519ffd48bd9ea792ecc0320404d37d679668955d81fdb5e0d50e9760369e5074b35c864d4c64447d18136b974
|
@@ -20,6 +20,7 @@ module Propono
|
|
20
20
|
@topic = TopicCreator.find_or_create(@topic_id)
|
21
21
|
@queue = QueueCreator.find_or_create(queue_name)
|
22
22
|
sns.subscribe(@topic.arn, @queue.arn, 'sqs')
|
23
|
+
sqs.set_queue_attributes(@queue.url, "Policy", policy)
|
23
24
|
end
|
24
25
|
|
25
26
|
def queue_name
|
@@ -31,5 +32,30 @@ module Propono
|
|
31
32
|
def config
|
32
33
|
Configuration.instance
|
33
34
|
end
|
35
|
+
|
36
|
+
def policy
|
37
|
+
<<-EOS
|
38
|
+
{
|
39
|
+
"Version": "2008-10-17",
|
40
|
+
"Id": "arn:aws:sqs:eu-west-1:950417255687:manual_queue/SQSDefaultPolicy",
|
41
|
+
"Statement": [
|
42
|
+
{
|
43
|
+
"Sid": "Sid1382106399628",
|
44
|
+
"Effect": "Allow",
|
45
|
+
"Principal": {
|
46
|
+
"AWS": "*"
|
47
|
+
},
|
48
|
+
"Action": "SQS:SendMessage",
|
49
|
+
"Resource": "arn:aws:sqs:eu-west-1:950417255687:manual_queue",
|
50
|
+
"Condition": {
|
51
|
+
"ArnEquals": {
|
52
|
+
"aws:SourceArn": "arn:aws:sns:eu-west-1:950417255687:metrics"
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
}
|
58
|
+
EOS
|
59
|
+
end
|
34
60
|
end
|
35
61
|
end
|
@@ -5,16 +5,41 @@ module Propono
|
|
5
5
|
class Publisher
|
6
6
|
include Sns
|
7
7
|
|
8
|
-
def self.publish(
|
9
|
-
new
|
8
|
+
def self.publish(topic_id, message, options = {})
|
9
|
+
new(topic_id, message, options).publish
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
attr_reader :topic_id, :message, :protocol
|
13
|
+
|
14
|
+
def initialize(topic_id, message, options = {})
|
13
15
|
raise PublisherError.new("Topic is nil") if topic_id.nil?
|
14
16
|
raise PublisherError.new("Message is nil") if message.nil?
|
15
17
|
|
18
|
+
@topic_id = topic_id
|
19
|
+
@message = message
|
20
|
+
@protocol = options.fetch(:protocol, :sns).to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
def publish
|
24
|
+
send("publish_via_#{protocol}")
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def publish_via_sns
|
16
30
|
topic = TopicCreator.find_or_create(topic_id)
|
17
31
|
sns.publish(topic.arn, message)
|
18
32
|
end
|
33
|
+
|
34
|
+
def publish_via_udp
|
35
|
+
payload = {topic: topic_id, message: message}.to_json
|
36
|
+
UDPSocket.new.send(payload, 0, config.udp_host, config.udp_port)
|
37
|
+
rescue SocketError => e
|
38
|
+
config.logger.puts "Udp2sqs failed to send : #{e}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def config
|
42
|
+
Configuration.instance
|
43
|
+
end
|
19
44
|
end
|
20
45
|
end
|
data/lib/propono/version.rb
CHANGED
data/test/publisher_test.rb
CHANGED
@@ -4,51 +4,103 @@ module Propono
|
|
4
4
|
class PublisherTest < Minitest::Test
|
5
5
|
|
6
6
|
def test_initialization
|
7
|
-
|
8
|
-
refute
|
7
|
+
publisher = Publisher.new('topic', 'message')
|
8
|
+
refute publisher.nil?
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def test_self_publish_calls_new
|
12
12
|
topic = "topic123"
|
13
13
|
message = "message123"
|
14
|
-
Publisher.
|
15
|
-
Publisher.
|
14
|
+
Publisher.expects(:new).with(topic, message, {}).returns(mock(publish: nil))
|
15
|
+
Publisher.publish(topic, message)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def test_self_publish_calls_publish
|
19
|
+
Publisher.any_instance.expects(:publish)
|
20
|
+
Publisher.publish("topic", "message")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_protocol_should_be_sns_by_default
|
24
|
+
publisher = Publisher.new('topic', 'message')
|
25
|
+
assert_equal :sns, publisher.protocol
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_publish_proxies_to_sns
|
29
|
+
publisher = Publisher.new('topic', 'message')
|
30
|
+
publisher.expects(:publish_via_sns)
|
31
|
+
publisher.publish
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_publish_proxies_to_udp
|
35
|
+
publisher = Publisher.new('topic', 'message', protocol: :udp)
|
36
|
+
publisher.expects(:publish_via_udp)
|
37
|
+
publisher.publish
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_publish_via_sns_should_call_sns_on_correct_topic_and_message
|
19
41
|
topic = "topic123"
|
20
42
|
message = "message123"
|
21
43
|
topic_arn = "arn123"
|
44
|
+
topic = Topic.new(topic_arn)
|
22
45
|
|
23
|
-
TopicCreator.stubs(find_or_create:
|
46
|
+
TopicCreator.stubs(find_or_create: topic)
|
24
47
|
|
25
48
|
sns = mock()
|
26
49
|
sns.expects(:publish).with(topic_arn, message)
|
27
|
-
publisher = Publisher.new
|
50
|
+
publisher = Publisher.new(topic, message)
|
28
51
|
publisher.stubs(sns: sns)
|
29
|
-
|
30
|
-
publisher.publish(topic, message)
|
52
|
+
publisher.send(:publish_via_sns)
|
31
53
|
end
|
32
54
|
|
33
|
-
def
|
55
|
+
def test_publish_via_sns_should_propogate_exception_on_topic_creation_error
|
34
56
|
TopicCreator.stubs(:find_or_create).raises(TopicCreatorError)
|
35
57
|
|
36
58
|
assert_raises(TopicCreatorError) do
|
37
|
-
Publisher.
|
59
|
+
publisher = Publisher.new("topic", "message")
|
60
|
+
publisher.send(:publish_via_sns)
|
38
61
|
end
|
39
62
|
end
|
40
63
|
|
41
|
-
def
|
42
|
-
|
64
|
+
def test_publish_via_sns_creates_a_topic
|
65
|
+
topic_id = "Malcs_topic_id"
|
66
|
+
topic_arn = "Malcs_topic_arn"
|
67
|
+
topic = Topic.new(topic_arn)
|
43
68
|
|
44
|
-
TopicCreator.expects(:find_or_create).with(topic)
|
69
|
+
TopicCreator.expects(:find_or_create).with(topic_id).returns(topic)
|
45
70
|
|
46
71
|
sns = mock()
|
47
72
|
sns.stubs(:publish)
|
48
|
-
publisher = Publisher.new
|
73
|
+
publisher = Publisher.new(topic_id, "Foobar")
|
49
74
|
publisher.stubs(sns: sns)
|
50
75
|
|
51
|
-
publisher.
|
76
|
+
publisher.send(:publish_via_sns)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_udp_uses_correct_message_host_and_port
|
80
|
+
host = "http://meducation.net"
|
81
|
+
port = 1234
|
82
|
+
config.udp_host = host
|
83
|
+
config.udp_port = port
|
84
|
+
topic_id = "my-fav-topic"
|
85
|
+
message = "foobar"
|
86
|
+
payload = {topic: topic_id, message: message}.to_json
|
87
|
+
UDPSocket.any_instance.expects(:send).with(payload, 0, host, port)
|
88
|
+
|
89
|
+
publisher = Publisher.new(topic_id, message)
|
90
|
+
publisher.send(:publish_via_udp)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_client_with_bad_host_logs_error
|
94
|
+
host = "http://meducation.net"
|
95
|
+
port = 1234
|
96
|
+
config.udp_host = host
|
97
|
+
config.udp_port = port
|
98
|
+
|
99
|
+
client = Publisher.new("topic_id", "message")
|
100
|
+
_, err = capture_io do
|
101
|
+
client.send(:publish_via_udp)
|
102
|
+
end
|
103
|
+
assert_match("Udp2sqs failed to send : getaddrinfo:", err)
|
52
104
|
end
|
53
105
|
|
54
106
|
def test_publish_should_raise_exception_if_topic_is_nil
|
data/test/queue_listener_test.rb
CHANGED
@@ -85,14 +85,9 @@ module Propono
|
|
85
85
|
queue_listener.stubs(sqs: sqs)
|
86
86
|
queue_listener.stubs(queue_url: "http://example.com")
|
87
87
|
|
88
|
-
# capture_io reasigns stderr. Assign the config.logger
|
89
|
-
# to where capture_io has redirected it to for this test.
|
90
88
|
out, err = capture_io do
|
91
|
-
config.logger = $stderr
|
92
89
|
queue_listener.send(:read_messages)
|
93
90
|
end
|
94
|
-
# Reassign config.logger to the correct stderr
|
95
|
-
config.logger = $stderr
|
96
91
|
assert_equal "Unexpected error reading from queue http://example.com\n", err
|
97
92
|
end
|
98
93
|
|
@@ -40,7 +40,7 @@ module Propono
|
|
40
40
|
assert_equal subscription.send(:queue_name), "My_App-Foobar"
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
43
|
+
def test_create_calls_subscribe
|
44
44
|
arn = "arn123"
|
45
45
|
|
46
46
|
TopicCreator.stubs(find_or_create: Topic.new(arn))
|
@@ -53,6 +53,21 @@ module Propono
|
|
53
53
|
subscription.create
|
54
54
|
end
|
55
55
|
|
56
|
+
def test_create_calls_set_queue_attributes
|
57
|
+
arn = "arn123"
|
58
|
+
policy = "{foobar: 123}"
|
59
|
+
|
60
|
+
TopicCreator.stubs(find_or_create: Topic.new(arn))
|
61
|
+
QueueCreator.stubs(find_or_create: Queue.new(Fog::AWS::SQS::Mock::QueueUrl))
|
62
|
+
|
63
|
+
sqs = mock()
|
64
|
+
sqs.expects(:set_queue_attributes).with(Fog::AWS::SQS::Mock::QueueUrl, "Policy", policy)
|
65
|
+
subscription = QueueSubscription.new("Some topic")
|
66
|
+
subscription.stubs(sqs: sqs)
|
67
|
+
subscription.stubs(policy: policy)
|
68
|
+
subscription.create
|
69
|
+
end
|
70
|
+
|
56
71
|
def test_create_saves_queue
|
57
72
|
queue = Queue.new(Fog::AWS::SQS::Mock::QueueUrl)
|
58
73
|
|
data/test/test_helper.rb
CHANGED
@@ -25,8 +25,28 @@ class Minitest::Test
|
|
25
25
|
def config
|
26
26
|
Propono::Configuration.instance
|
27
27
|
end
|
28
|
+
|
29
|
+
# capture_io reasigns stderr. Assign the config.logger
|
30
|
+
# to where capture_io has redirected it to for this test.
|
31
|
+
def capture_io(&block)
|
32
|
+
require 'stringio'
|
33
|
+
|
34
|
+
orig_stdout, orig_stderr = $stdout, $stderr
|
35
|
+
captured_stdout, captured_stderr = StringIO.new, StringIO.new
|
36
|
+
$stdout, $stderr = captured_stdout, captured_stderr
|
37
|
+
|
38
|
+
config.logger = $stderr
|
39
|
+
yield
|
40
|
+
|
41
|
+
return captured_stdout.string, captured_stderr.string
|
42
|
+
ensure
|
43
|
+
$stdout = orig_stdout
|
44
|
+
$stderr = orig_stderr
|
45
|
+
config.logger = $stderr
|
46
|
+
end
|
28
47
|
end
|
29
48
|
|
49
|
+
require 'fog'
|
30
50
|
class Fog::AWS::SNS::Mock
|
31
51
|
def create_topic(*args)
|
32
52
|
foo = Object.new
|
@@ -42,10 +62,11 @@ class Fog::AWS::SNS::Mock
|
|
42
62
|
end
|
43
63
|
end
|
44
64
|
|
45
|
-
require 'fog'
|
46
65
|
class Fog::AWS::SQS::Mock
|
47
66
|
def create_queue(*args)
|
48
67
|
end
|
68
|
+
def set_queue_attributes(*args)
|
69
|
+
end
|
49
70
|
end
|
50
71
|
|
51
72
|
Fog::AWS::SQS::Mock::QueueUrl = 'https://meducation.net/foobar'
|
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.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MalcyL
|
@@ -43,28 +43,28 @@ dependencies:
|
|
43
43
|
name: rake
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - '>='
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: mocha
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
@@ -137,12 +137,12 @@ require_paths:
|
|
137
137
|
- lib
|
138
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
139
|
requirements:
|
140
|
-
- -
|
140
|
+
- - '>='
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '0'
|
143
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- -
|
145
|
+
- - '>='
|
146
146
|
- !ruby/object:Gem::Version
|
147
147
|
version: '0'
|
148
148
|
requirements: []
|