sqs_async 0.0.1 → 0.0.2
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/lib/sqs.rb +93 -20
- data/lib/sqs_attributes.rb +5 -11
- data/lib/sqs_message.rb +3 -3
- data/lib/sqs_permission.rb +41 -0
- data/lib/sqs_queue.rb +1 -1
- data/lib/sqs_send_message_response.rb +19 -0
- data/lib/sqs_utilities.rb +26 -0
- data/spec/fixtures/add_permission.xml +2 -0
- data/spec/fixtures/change_message_visibility.xml +2 -0
- data/spec/fixtures/create_queue.xml +2 -0
- data/spec/fixtures/delete_message.xml +1 -7
- data/spec/fixtures/delete_queue.xml +2 -0
- data/spec/fixtures/error_response.xml +1 -17
- data/spec/fixtures/list_queues.xml +1 -12
- data/spec/fixtures/receive_message.xml +1 -39
- data/spec/fixtures/remove_permission.xml +2 -0
- data/spec/fixtures/send_message.xml +2 -0
- data/spec/fixtures/set_queue_attributes.xml +2 -0
- data/spec/spec_helper.rb +4 -8
- data/spec/sqs_attributes_spec.rb +1 -1
- data/spec/sqs_message_spec.rb +3 -3
- data/spec/sqs_queue_spec.rb +1 -1
- data/spec/sqs_spec.rb +108 -1
- data/spec/sqs_utilities_spec.rb +23 -0
- metadata +22 -54
data/lib/sqs.rb
CHANGED
@@ -12,17 +12,75 @@ require 'em-http-request'
|
|
12
12
|
require 'sqs_message'
|
13
13
|
require 'sqs_queue'
|
14
14
|
require 'sqs_attributes'
|
15
|
+
require 'sqs_utilities'
|
16
|
+
require 'core_ext/hash'
|
15
17
|
require 'logger'
|
16
18
|
|
17
19
|
module SQS
|
20
|
+
include SQS::Utilities
|
18
21
|
attr_accessor :aws_key, :aws_secret, :regions, :default_parameters, :post_options
|
19
22
|
|
23
|
+
def change_message_visibility(options={})
|
24
|
+
raise "no Message specified" unless options[:message]
|
25
|
+
raise "no new visibility_timeout specified" unless options[:visibility_timeout]
|
26
|
+
options.merge!( :receipt_handle => options.delete(:message).receipt_handle,
|
27
|
+
:visibility_timeout => options.delete(:visibility_timeout).to_i)
|
28
|
+
call_amazon(options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_queue_attributes(options={})
|
32
|
+
raise "no target queue specified" unless options[:queue]
|
33
|
+
%w[ :visibility_timeout :policy :maximum_message_size :message_retention_period ].each do |attr_type|
|
34
|
+
if options[attr_type]
|
35
|
+
val = options.delete(attr_type)
|
36
|
+
options.merge! "Attribute.Name" => camelize(attr_type), "Attribute.Value" => val
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
call_amazon(options)
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_message(options={})
|
44
|
+
raise "no object(:message) or string(:message_body) specified" unless (options[:message] || options[:message_body])
|
45
|
+
options.merge!( :message_body => options.delete(:message).body ) if options[:message]
|
46
|
+
body = options[:message_body]
|
47
|
+
|
48
|
+
call_amazon(options){ |req| SQSSendMessageResponse.parse(body, req.response) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_permission(options={})
|
52
|
+
raise "no target queue specified" unless options[:queue]
|
53
|
+
raise "no permissions objects specified" unless options[:permissions]
|
54
|
+
|
55
|
+
[options[:permissions]].flatten.each_with_index do |perm, index|
|
56
|
+
ordinal = index+1
|
57
|
+
options.merge!(perm.to_params(ordinal)) # last label wins.
|
58
|
+
end
|
59
|
+
|
60
|
+
options.delete(:permissions)
|
61
|
+
|
62
|
+
call_amazon(options)
|
63
|
+
end
|
64
|
+
|
65
|
+
def remove_permission(options={})
|
66
|
+
raise "no target queue specified" unless options[:queue]
|
67
|
+
raise "no permissions objects specified" unless options[:permissions]
|
68
|
+
|
69
|
+
[options[:permissions]].flatten.each_with_index do |perm, index|
|
70
|
+
ordinal = index+1
|
71
|
+
options.merge!(perm.to_params(ordinal)) # last label wins.
|
72
|
+
end
|
73
|
+
|
74
|
+
options.delete(:permissions)
|
75
|
+
|
76
|
+
call_amazon(options)
|
77
|
+
end
|
78
|
+
|
20
79
|
def list_queues(options={})
|
21
80
|
prefix = options.delete(:prefix)
|
22
81
|
match = options.delete(:match)
|
23
82
|
|
24
|
-
options.merge!(
|
25
|
-
options.merge!( "QueueNamePrefix" => encode(prefix) ) if prefix
|
83
|
+
options.merge!( :queue_name_prefix => encode(prefix) ) if prefix
|
26
84
|
|
27
85
|
call_amazon(options) do |req|
|
28
86
|
queues = SQSQueue.parse(req.response)
|
@@ -33,42 +91,57 @@ module SQS
|
|
33
91
|
|
34
92
|
def receive_message(options={})
|
35
93
|
raise "no target queue specified" unless options[:queue]
|
36
|
-
options
|
94
|
+
options = { :max_number_of_messages => 10 }.merge(options)
|
37
95
|
call_amazon(options){ |req| SQSMessage.parse(req.response) }
|
38
96
|
end
|
39
97
|
|
40
98
|
def delete_message(options={})
|
41
99
|
raise "no Message specified" unless options[:message]
|
42
|
-
options.merge!(
|
100
|
+
options.merge!(:receipt_handle => options.delete(:message).receipt_handle)
|
43
101
|
call_amazon(options)
|
44
102
|
end
|
45
103
|
|
46
104
|
def get_queue_attributes(options={})
|
47
105
|
raise "no target queue specified" unless options[:queue]
|
48
|
-
options
|
106
|
+
options = {:attribute_name => "All" }.merge(options)
|
49
107
|
call_amazon(options){ |req| SQSAttributes.parse(req.response) }
|
50
108
|
end
|
51
109
|
|
110
|
+
def delete_queue(options={})
|
111
|
+
raise "no target queue specified" unless options[:queue]
|
112
|
+
call_amazon(options)
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_queue(options={})
|
116
|
+
raise "no queue name specified" unless options[:queue_name]
|
117
|
+
options[:default_visibility_timeout] = 30 unless options[:default_visibility_timeout]
|
118
|
+
call_amazon(options){ |req| SQSQueue.parse(req.response) }
|
119
|
+
end
|
120
|
+
|
52
121
|
private
|
53
122
|
|
54
123
|
def call_amazon(options)
|
55
124
|
endpoint = (options[:queue] != nil) ? options.delete(:queue).queue_url : "http://" << ( options.delete(:host) || region_host(:us_east) )
|
56
125
|
callbacks = options.delete(:callbacks) || {:success=>nil, :failure =>nil }
|
57
126
|
|
127
|
+
if( who_called_us = caller(0)[1] )
|
128
|
+
options = {:action => action_from_caller(who_called_us)}.merge(options)
|
129
|
+
end
|
130
|
+
|
131
|
+
options.amazonize_keys!
|
132
|
+
|
58
133
|
params = sign_params( endpoint, options )
|
59
134
|
req = EM::HttpRequest.new("#{endpoint}?#{params}").get
|
60
|
-
req.callback do |
|
61
|
-
if(
|
62
|
-
on_failure(
|
135
|
+
req.callback do |req_ref|
|
136
|
+
if(req_ref.response.to_s.match(/<ErrorResponse>/i))
|
137
|
+
on_failure(req_ref, callbacks)
|
63
138
|
else
|
64
|
-
result =
|
65
|
-
result = yield
|
139
|
+
result = req_ref
|
140
|
+
result = yield req_ref if block_given?
|
66
141
|
callbacks[:success].call(result) if callbacks[:success]
|
67
142
|
end
|
68
143
|
end
|
69
|
-
req.errback
|
70
|
-
on_failure(req, callbacks)
|
71
|
-
end
|
144
|
+
req.errback { |req_ref| on_failure(req_ref, callbacks) }
|
72
145
|
end
|
73
146
|
|
74
147
|
def on_failure(req, callbacks)
|
@@ -98,7 +171,7 @@ module SQS
|
|
98
171
|
end
|
99
172
|
|
100
173
|
def encoding_exclusions
|
101
|
-
/[^\w\d
|
174
|
+
/[^\w\d\-_\.~]/
|
102
175
|
end
|
103
176
|
|
104
177
|
def encode(val)
|
@@ -110,17 +183,17 @@ module SQS
|
|
110
183
|
end
|
111
184
|
|
112
185
|
def regions
|
113
|
-
@regions ||=
|
186
|
+
@regions ||= REGIONS
|
114
187
|
@regions
|
115
188
|
end
|
116
189
|
|
117
190
|
def default_paramters
|
118
|
-
@default_paramters ||=
|
191
|
+
@default_paramters ||= PARAMETERS.merge("AWSAccessKeyId" => aws_key)
|
119
192
|
@default_paramters.merge("Expires" => (Time.now+(60*30)).utc.iso8601)
|
120
193
|
end
|
121
194
|
|
122
195
|
def post_options
|
123
|
-
@post_options ||=
|
196
|
+
@post_options ||= POSTOPTIONS
|
124
197
|
@post_options
|
125
198
|
end
|
126
199
|
|
@@ -141,7 +214,7 @@ module SQS
|
|
141
214
|
logger.error(log_msg.join("\n"))
|
142
215
|
end
|
143
216
|
|
144
|
-
|
217
|
+
REGIONS = {
|
145
218
|
:us_east => { :name => "US-East (Northern Virginia) Region", :uri => "sqs.us-east-1.amazonaws.com"},
|
146
219
|
:us_west => { :name => "US-West (Northern California) Region", :uri => "sqs.us-west-1.amazonaws.com"},
|
147
220
|
:eu => { :name => "EU (Ireland) Region", :uri => "sqs.eu-west-1.amazonaws.com"},
|
@@ -150,13 +223,13 @@ module SQS
|
|
150
223
|
}
|
151
224
|
|
152
225
|
|
153
|
-
|
226
|
+
PARAMETERS = {
|
154
227
|
"Version" => "2009-02-01",
|
155
228
|
"SignatureVersion"=>"2",
|
156
229
|
"SignatureMethod"=>"HmacSHA256",
|
157
230
|
}
|
158
231
|
|
159
|
-
|
232
|
+
POSTOPTIONS = {
|
160
233
|
"Content-Type" => "application/x-www-form-urlencoded"
|
161
234
|
}
|
162
235
|
end
|
data/lib/sqs_attributes.rb
CHANGED
@@ -2,8 +2,11 @@ require 'nokogiri'
|
|
2
2
|
require 'json'
|
3
3
|
require 'base64'
|
4
4
|
require 'ostruct'
|
5
|
+
require 'sqs_utilities'
|
5
6
|
|
6
7
|
class SQSAttributes
|
8
|
+
extend SQS::Utilities
|
9
|
+
|
7
10
|
attr_accessor :approximate_number_of_messages,
|
8
11
|
:approximate_number_of_messages_not_visible,
|
9
12
|
:visibility_timeout,
|
@@ -18,21 +21,12 @@ class SQSAttributes
|
|
18
21
|
doc = Nokogiri::XML(xml)
|
19
22
|
queue_data = SQSAttributes.new
|
20
23
|
doc.search("Attribute").each do |attribute|
|
21
|
-
meth = underscore(attribute.at("Name").text)
|
24
|
+
meth = underscore(attribute.at("Name").text.strip)
|
22
25
|
if queue_data.respond_to? meth.to_sym
|
23
|
-
queue_data.send "#{meth}=", attribute.at("Value").text
|
26
|
+
queue_data.send "#{meth}=", attribute.at("Value").text.strip
|
24
27
|
end
|
25
28
|
end
|
26
29
|
queue_data
|
27
30
|
end
|
28
31
|
|
29
|
-
# Taken from ActiveSupport. License information can be found at rubyonrails.org
|
30
|
-
def self.underscore(camel_cased_word)
|
31
|
-
word = camel_cased_word.to_s.dup
|
32
|
-
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
33
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
34
|
-
word.tr!("-", "_")
|
35
|
-
word.downcase!
|
36
|
-
word
|
37
|
-
end
|
38
32
|
end
|
data/lib/sqs_message.rb
CHANGED
@@ -11,9 +11,9 @@ class SQSMessage
|
|
11
11
|
messages = []
|
12
12
|
doc.search("Message").each do |message_element|
|
13
13
|
s = SQSMessage.new
|
14
|
-
s.body = message_element.at("Body").text
|
15
|
-
s.md5_of_body = message_element.at("MD5OfBody").text
|
16
|
-
s.message_id = message_element.at("MessageId").text
|
14
|
+
s.body = message_element.at("Body").text.strip
|
15
|
+
s.md5_of_body = message_element.at("MD5OfBody").text.strip
|
16
|
+
s.message_id = message_element.at("MessageId").text.strip
|
17
17
|
s.receipt_handle = message_element.at("ReceiptHandle").text.strip
|
18
18
|
messages << s
|
19
19
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SQS
|
2
|
+
module Permissions
|
3
|
+
def self.all
|
4
|
+
"*"
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.send_message
|
8
|
+
"SendMessage"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.receive_message
|
12
|
+
"ReceiveMessage"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.delete_message
|
16
|
+
"DeleteMessage"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.change_message_visibility
|
20
|
+
"ChangeMessageVisibility"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.get_queue_attributes
|
24
|
+
"GetQueueAttributes"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class SQSPermission
|
30
|
+
include SQS::Permissions
|
31
|
+
attr_accessor :aws_account_id, :permission
|
32
|
+
|
33
|
+
def to_params(ordinal=1)
|
34
|
+
{
|
35
|
+
"Label" => "#{aws_account_id}-#{permission.to_s}",
|
36
|
+
"AWSAccountId.#{ordinal}" => aws_account_id,
|
37
|
+
"ActionName.#{ordinal}" => permission.to_s
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
data/lib/sqs_queue.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'json'
|
3
|
+
require 'base64'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
class SQSSendMessageResponse
|
7
|
+
attr_accessor :body, :md5_of_body, :message_id, :receipt_handle
|
8
|
+
|
9
|
+
def self.parse(original_body, xml)
|
10
|
+
doc = Nokogiri::XML(xml)
|
11
|
+
message = SQSMessage.new
|
12
|
+
doc.search("SendMessageResult").each do |message_element|
|
13
|
+
message.body = original_body || ""
|
14
|
+
message.md5_of_body = message_element.at("MD5OfMessageBody").text.strip
|
15
|
+
message.message_id = message_element.at("MessageId").text.strip
|
16
|
+
end
|
17
|
+
message
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# These mixins are lovingly taken from active support.
|
2
|
+
# License information is available online at rubyonrails.org
|
3
|
+
|
4
|
+
module SQS
|
5
|
+
module Utilities
|
6
|
+
|
7
|
+
def action_from_caller(first_element_in_caller)
|
8
|
+
camelize(first_element_in_caller.scan(/\`(\w+)\'/).flatten.first)
|
9
|
+
end
|
10
|
+
|
11
|
+
def camelize(str)
|
12
|
+
str.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
13
|
+
end
|
14
|
+
|
15
|
+
def underscore(camel_cased_word)
|
16
|
+
word = camel_cased_word.to_s.dup
|
17
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
18
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
19
|
+
word.tr!("-", "_")
|
20
|
+
word.downcase!
|
21
|
+
word
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,2 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<CreateQueueResponse><CreateQueueResult><QueueUrl>http://sqs.us-east-1.amazonaws.com/123456789012/testQueue</QueueUrl></CreateQueueResult><ResponseMetadata><RequestId>7a62c49f-347e-4fc4-9331-6e8e7a96aa73</RequestId></ResponseMetadata></CreateQueueResponse>
|
@@ -1,8 +1,2 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<DeleteQueueResponse>
|
3
|
-
<ResponseMetadata>
|
4
|
-
<RequestId>
|
5
|
-
6fde8d1e-52cd-4581-8cd9-c512f4c64223
|
6
|
-
</RequestId>
|
7
|
-
</ResponseMetadata>
|
8
|
-
</DeleteQueueResponse>
|
2
|
+
<DeleteQueueResponse><ResponseMetadata><RequestId>6fde8d1e-52cd-4581-8cd9-c512f4c64223</RequestId></ResponseMetadata></DeleteQueueResponse>
|
@@ -1,18 +1,2 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<ErrorResponse>
|
3
|
-
<Error>
|
4
|
-
<Type>
|
5
|
-
Sender
|
6
|
-
</Type>
|
7
|
-
<Code>
|
8
|
-
AuthFailure
|
9
|
-
</Code>
|
10
|
-
<Message>
|
11
|
-
The provided signature is not valid for this access token
|
12
|
-
</Message>
|
13
|
-
<Detail/>
|
14
|
-
</Error>
|
15
|
-
<RequestId>
|
16
|
-
ef3aba6a-dc84-4937-91bf-cef2ddd6775a
|
17
|
-
</RequestId>
|
18
|
-
</ErrorResponse>
|
2
|
+
<ErrorResponse><Error><Type>Sender</Type><Code>AuthFailure</Code><Message>The provided signature is not valid for this access token</Message><Detail/></Error><RequestId>ef3aba6a-dc84-4937-91bf-cef2ddd6775a</RequestId></ErrorResponse>
|
@@ -1,13 +1,2 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<ListQueuesResponse>
|
3
|
-
<ListQueuesResult>
|
4
|
-
<QueueUrl>
|
5
|
-
http://sqs.us-east-1.amazonaws.com/123456789012/testQueue
|
6
|
-
</QueueUrl>
|
7
|
-
</ListQueuesResult>
|
8
|
-
<ResponseMetadata>
|
9
|
-
<RequestId>
|
10
|
-
725275ae-0b9b-4762-b238-436d7c65a1ac
|
11
|
-
</RequestId>
|
12
|
-
</ResponseMetadata>
|
13
|
-
</ListQueuesResponse>
|
2
|
+
<ListQueuesResponse><ListQueuesResult><QueueUrl>http://sqs.us-east-1.amazonaws.com/123456789012/testQueue</QueueUrl></ListQueuesResult><ResponseMetadata><RequestId>725275ae-0b9b-4762-b238-436d7c65a1ac</RequestId></ResponseMetadata></ListQueuesResponse>
|
@@ -1,40 +1,2 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<ReceiveMessageResponse>
|
3
|
-
<ReceiveMessageResult>
|
4
|
-
<Message>
|
5
|
-
<MessageId>
|
6
|
-
5fea7756-0ea4-451a-a703-a558b933e274
|
7
|
-
</MessageId>
|
8
|
-
<ReceiptHandle>
|
9
|
-
MbZj6wDWli+JvwwJaBV+3dcjk2YW2vA3+STFFljTM8tJJg6HRG6PYSasuWXPJB+Cw
|
10
|
-
Lj1FjgXUv1uSj1gUPAWV66FU/WeR4mq2OKpEGYWbnLmpRCJVAyeMjeU5ZBdtcQ+QE
|
11
|
-
auMZc8ZRv37sIW2iJKq3M9MFx1YvV11A2x/KSbkJ0=
|
12
|
-
</ReceiptHandle>
|
13
|
-
<MD5OfBody>
|
14
|
-
fafb00f5732ab283681e124bf8747ed1
|
15
|
-
</MD5OfBody>
|
16
|
-
<Body>This is a test message</Body>
|
17
|
-
<Attribute>
|
18
|
-
<Name>SenderId</Name>
|
19
|
-
<Value>195004372649</Value>
|
20
|
-
</Attribute>
|
21
|
-
<Attribute>
|
22
|
-
<Name>SentTimestamp</Name>
|
23
|
-
<Value>1238099229000</Value>
|
24
|
-
</Attribute>
|
25
|
-
<Attribute>
|
26
|
-
<Name>ApproximateReceiveCount</Name>
|
27
|
-
<Value>5</Value>
|
28
|
-
</Attribute>
|
29
|
-
<Attribute>
|
30
|
-
<Name>ApproximateFirstReceiveTimestamp</Name>
|
31
|
-
<Value>1250700979248</Value>
|
32
|
-
</Attribute>
|
33
|
-
</Message>
|
34
|
-
</ReceiveMessageResult>
|
35
|
-
<ResponseMetadata>
|
36
|
-
<RequestId>
|
37
|
-
b6633655-283d-45b4-aee4-4e84e0ae6afa
|
38
|
-
</RequestId>
|
39
|
-
</ResponseMetadata>
|
40
|
-
</ReceiveMessageResponse>
|
2
|
+
<ReceiveMessageResponse><ReceiveMessageResult><Message><MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId><ReceiptHandle>MbZj6wDWli+JvwwJaBV+3dcjk2YW2vA3+STFFljTM8tJJg6HRG6PYSasuWXPJB+CwLj1FjgXUv1uSj1gUPAWV66FU/WeR4mq2OKpEGYWbnLmpRCJVAyeMjeU5ZBdtcQ+QEauMZc8ZRv37sIW2iJKq3M9MFx1YvV11A2x/KSbkJ0=</ReceiptHandle><MD5OfBody>fafb00f5732ab283681e124bf8747ed1</MD5OfBody><Body>This is a test message</Body><Attribute><Name>SenderId</Name><Value>195004372649</Value></Attribute><Attribute><Name>SentTimestamp</Name><Value>1238099229000</Value></Attribute><Attribute><Name>ApproximateReceiveCount</Name><Value>5</Value></Attribute><Attribute><Name>ApproximateFirstReceiveTimestamp</Name><Value>1250700979248</Value></Attribute></Message></ReceiveMessageResult><ResponseMetadata><RequestId>b6633655-283d-45b4-aee4-4e84e0ae6afa</RequestId></ResponseMetadata></ReceiveMessageResponse>
|
@@ -0,0 +1,2 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<SendMessageResponse><SendMessageResult><MD5OfMessageBody>fafb00f5732ab283681e124bf8747ed1</MD5OfMessageBody><MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId></SendMessageResult><ResponseMetadata><RequestId>27daac76-34dd-47df-bd01-1f6e873584a0</RequestId></ResponseMetadata></SendMessageResponse>
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
ENV["BUBBLE_ENV"] = "test"
|
2
2
|
|
3
3
|
$:.unshift(File.dirname(__FILE__))
|
4
|
-
%w{ ../ lib config vendor/sqs_async/lib }.each do |d|
|
4
|
+
%w{ ../ lib config vendor/sqs_async/lib lib/core_ext }.each do |d|
|
5
5
|
$:.unshift(File.dirname(__FILE__)+"/#{d}/")
|
6
6
|
end
|
7
7
|
|
@@ -10,11 +10,7 @@ require 'rspec'
|
|
10
10
|
require 'timecop'
|
11
11
|
require 'em-http-request'
|
12
12
|
|
13
|
-
require '
|
14
|
-
require 'sqs_message'
|
15
|
-
require 'sqs_queue'
|
16
|
-
require 'sqs_attributes'
|
17
|
-
|
13
|
+
require 'sqs_async'
|
18
14
|
|
19
15
|
RSpec.configure do |config|
|
20
16
|
config.mock_framework = :mocha
|
@@ -32,11 +28,11 @@ module EventMachine
|
|
32
28
|
end
|
33
29
|
|
34
30
|
def get *args
|
35
|
-
|
31
|
+
self
|
36
32
|
end
|
37
33
|
|
38
34
|
def post *args
|
39
|
-
|
35
|
+
self
|
40
36
|
end
|
41
37
|
|
42
38
|
def callback &block
|
data/spec/sqs_attributes_spec.rb
CHANGED
data/spec/sqs_message_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "SQSMessage" do
|
4
|
-
|
4
|
+
context ".parse" do
|
5
5
|
let(:messages) { SQSMessage.parse(xml_fixture(:receive_message)) }
|
6
6
|
|
7
7
|
it "returns SQSMessage objects" do
|
@@ -13,8 +13,8 @@ describe "SQSMessage" do
|
|
13
13
|
message = messages.first
|
14
14
|
message.body.should == "This is a test message"
|
15
15
|
message.receipt_handle.should match /MbZj6wDWli.+?/im
|
16
|
-
message.md5_of_body.should == "
|
17
|
-
message.message_id.should == "
|
16
|
+
message.md5_of_body.should == "fafb00f5732ab283681e124bf8747ed1"
|
17
|
+
message.message_id.should == "5fea7756-0ea4-451a-a703-a558b933e274"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
data/spec/sqs_queue_spec.rb
CHANGED
data/spec/sqs_spec.rb
CHANGED
@@ -46,6 +46,75 @@ describe "SQS" do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
context "calls Amazon Endpoints asynchronously to" do
|
49
|
+
|
50
|
+
it "change_message_visibility" do
|
51
|
+
mock_obj = mock()
|
52
|
+
mock_obj.expects(:call).once
|
53
|
+
client.change_message_visibility(
|
54
|
+
:queue => queue,
|
55
|
+
:message => message,
|
56
|
+
:visibility_timeout => Time.now.to_i + (30*60),
|
57
|
+
:callbacks => { :success => mock_obj }
|
58
|
+
)
|
59
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:change_message_visibility)))
|
60
|
+
end
|
61
|
+
|
62
|
+
it "set_queue_attributes" do
|
63
|
+
mock_obj = mock()
|
64
|
+
mock_obj.expects(:call).once
|
65
|
+
client.set_queue_attributes(
|
66
|
+
:queue => queue,
|
67
|
+
:visibility_timeout => Time.now.to_i + (30*60),
|
68
|
+
:callbacks => { :success => mock_obj }
|
69
|
+
)
|
70
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:set_queue_attributes)))
|
71
|
+
end
|
72
|
+
|
73
|
+
context "putting a message on the queue" do
|
74
|
+
it "send_message with SQSMessage object" do
|
75
|
+
msg = SQSMessage.new
|
76
|
+
msg.body = "foo"
|
77
|
+
client.send_message(
|
78
|
+
:queue => queue,
|
79
|
+
:message => msg,
|
80
|
+
:callbacks => {
|
81
|
+
:success => lambda { |sqs_message_obj|
|
82
|
+
sqs_message_obj.body.should == "foo"
|
83
|
+
sqs_message_obj.md5_of_body.should_not be_nil
|
84
|
+
}
|
85
|
+
}
|
86
|
+
)
|
87
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:send_message)))
|
88
|
+
end
|
89
|
+
|
90
|
+
it "send_message with message body" do
|
91
|
+
client.send_message(
|
92
|
+
:queue => queue,
|
93
|
+
:message_body => "foo",
|
94
|
+
:callbacks => {
|
95
|
+
:success => lambda { |sqs_message_obj|
|
96
|
+
sqs_message_obj.body.should == "foo"
|
97
|
+
sqs_message_obj.md5_of_body.should_not be_nil
|
98
|
+
}
|
99
|
+
}
|
100
|
+
)
|
101
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:send_message)))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it "creates a queue" do
|
106
|
+
client.create_queue(
|
107
|
+
:queue_name => "testQueue",
|
108
|
+
:callbacks => {
|
109
|
+
:success => lambda{|queues|
|
110
|
+
queues.length.should == 1
|
111
|
+
queues.first.queue_url.to_s.should == "http://sqs.us-east-1.amazonaws.com/123456789012/testQueue"
|
112
|
+
}
|
113
|
+
}
|
114
|
+
)
|
115
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:create_queue)))
|
116
|
+
end
|
117
|
+
|
49
118
|
it "list available queues" do
|
50
119
|
client.list_queues(
|
51
120
|
:callbacks => {
|
@@ -58,6 +127,44 @@ describe "SQS" do
|
|
58
127
|
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:list_queues)))
|
59
128
|
end
|
60
129
|
|
130
|
+
context "permissions management" do
|
131
|
+
let(:permissions) do
|
132
|
+
leon = SQSPermission.new
|
133
|
+
leon.aws_account_id = "a12digitcode"
|
134
|
+
leon.permission = SQS::Permissions.all
|
135
|
+
|
136
|
+
john = SQSPermission.new
|
137
|
+
john.aws_account_id = "b12digitcode"
|
138
|
+
john.permission = SQS::Permissions.send_message
|
139
|
+
|
140
|
+
[leon, john]
|
141
|
+
end
|
142
|
+
|
143
|
+
let(:mock_closure) do
|
144
|
+
mock_closure = mock()
|
145
|
+
mock_closure.expects(:call).once
|
146
|
+
mock_closure
|
147
|
+
end
|
148
|
+
|
149
|
+
it "adds permissions to a queue" do
|
150
|
+
client.add_permission(
|
151
|
+
:queue => queue,
|
152
|
+
:permissions => permissions,
|
153
|
+
:callbacks => { :success => mock_closure }
|
154
|
+
)
|
155
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:add_permission)))
|
156
|
+
end
|
157
|
+
|
158
|
+
it "adds permissions to a queue" do
|
159
|
+
client.remove_permission(
|
160
|
+
:queue => queue,
|
161
|
+
:permissions => permissions,
|
162
|
+
:callbacks => { :success => mock_closure }
|
163
|
+
)
|
164
|
+
EM::HttpRequest.succeed(EM::MockResponse.new(xml_fixture(:remove_permission)))
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
61
168
|
it "pull a message from the queue" do
|
62
169
|
queue.queue_url = URI.parse("http://sqs.us-east-1.amazonaws.com/123456789012/testQueue")
|
63
170
|
client.receive_message(
|
@@ -75,7 +182,7 @@ describe "SQS" do
|
|
75
182
|
end
|
76
183
|
|
77
184
|
it "delete a message from the queue" do
|
78
|
-
mock_obj = mock()
|
185
|
+
mock_obj = mock()
|
79
186
|
mock_obj.expects(:call).once
|
80
187
|
client.delete_message(
|
81
188
|
:queue => queue,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SQS::Utilities" do
|
4
|
+
include SQS::Utilities # i <3 ruby. :)
|
5
|
+
|
6
|
+
it "amazonizes the keys of a hash" do
|
7
|
+
hash = {:queue_name =>"foo", :default_visibility_timeout => 30}
|
8
|
+
hash.amazonize_keys!
|
9
|
+
hash["QueueName"].should == "foo"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "infers an amazonized action from the calling context" do
|
13
|
+
def this_would_be_the_same_as_an_action_name
|
14
|
+
sample_target
|
15
|
+
end
|
16
|
+
|
17
|
+
def sample_target
|
18
|
+
action_from_caller(caller(0)[1]).should == "ThisWouldBeTheSameAsAnActionName"
|
19
|
+
end
|
20
|
+
|
21
|
+
this_would_be_the_same_as_an_action_name
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqs_async
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 29
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
5
|
+
version: 0.0.2
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- EdgeCase <contact@edgecase.com>
|
@@ -17,7 +12,7 @@ autorequire:
|
|
17
12
|
bindir: bin
|
18
13
|
cert_chain: []
|
19
14
|
|
20
|
-
date: 2011-
|
15
|
+
date: 2011-06-03 00:00:00 -04:00
|
21
16
|
default_executable:
|
22
17
|
dependencies:
|
23
18
|
- !ruby/object:Gem::Dependency
|
@@ -28,13 +23,6 @@ dependencies:
|
|
28
23
|
requirements:
|
29
24
|
- - ~>
|
30
25
|
- !ruby/object:Gem::Version
|
31
|
-
hash: 62196357
|
32
|
-
segments:
|
33
|
-
- 1
|
34
|
-
- 0
|
35
|
-
- 0
|
36
|
-
- beta
|
37
|
-
- 3
|
38
26
|
version: 1.0.0.beta.3
|
39
27
|
type: :runtime
|
40
28
|
version_requirements: *id001
|
@@ -46,13 +34,6 @@ dependencies:
|
|
46
34
|
requirements:
|
47
35
|
- - ~>
|
48
36
|
- !ruby/object:Gem::Version
|
49
|
-
hash: 62196363
|
50
|
-
segments:
|
51
|
-
- 1
|
52
|
-
- 0
|
53
|
-
- 0
|
54
|
-
- beta
|
55
|
-
- 4
|
56
37
|
version: 1.0.0.beta.4
|
57
38
|
type: :runtime
|
58
39
|
version_requirements: *id002
|
@@ -64,9 +45,6 @@ dependencies:
|
|
64
45
|
requirements:
|
65
46
|
- - ">="
|
66
47
|
- !ruby/object:Gem::Version
|
67
|
-
hash: 3
|
68
|
-
segments:
|
69
|
-
- 0
|
70
48
|
version: "0"
|
71
49
|
type: :runtime
|
72
50
|
version_requirements: *id003
|
@@ -78,9 +56,6 @@ dependencies:
|
|
78
56
|
requirements:
|
79
57
|
- - ">="
|
80
58
|
- !ruby/object:Gem::Version
|
81
|
-
hash: 3
|
82
|
-
segments:
|
83
|
-
- 0
|
84
59
|
version: "0"
|
85
60
|
type: :runtime
|
86
61
|
version_requirements: *id004
|
@@ -92,9 +67,6 @@ dependencies:
|
|
92
67
|
requirements:
|
93
68
|
- - ">="
|
94
69
|
- !ruby/object:Gem::Version
|
95
|
-
hash: 3
|
96
|
-
segments:
|
97
|
-
- 0
|
98
70
|
version: "0"
|
99
71
|
type: :runtime
|
100
72
|
version_requirements: *id005
|
@@ -106,11 +78,6 @@ dependencies:
|
|
106
78
|
requirements:
|
107
79
|
- - ">="
|
108
80
|
- !ruby/object:Gem::Version
|
109
|
-
hash: 23
|
110
|
-
segments:
|
111
|
-
- 2
|
112
|
-
- 6
|
113
|
-
- 0
|
114
81
|
version: 2.6.0
|
115
82
|
type: :development
|
116
83
|
version_requirements: *id006
|
@@ -122,9 +89,6 @@ dependencies:
|
|
122
89
|
requirements:
|
123
90
|
- - ">="
|
124
91
|
- !ruby/object:Gem::Version
|
125
|
-
hash: 3
|
126
|
-
segments:
|
127
|
-
- 0
|
128
92
|
version: "0"
|
129
93
|
type: :development
|
130
94
|
version_requirements: *id007
|
@@ -136,9 +100,6 @@ dependencies:
|
|
136
100
|
requirements:
|
137
101
|
- - ">="
|
138
102
|
- !ruby/object:Gem::Version
|
139
|
-
hash: 3
|
140
|
-
segments:
|
141
|
-
- 0
|
142
103
|
version: "0"
|
143
104
|
type: :development
|
144
105
|
version_requirements: *id008
|
@@ -150,9 +111,6 @@ dependencies:
|
|
150
111
|
requirements:
|
151
112
|
- - ">="
|
152
113
|
- !ruby/object:Gem::Version
|
153
|
-
hash: 3
|
154
|
-
segments:
|
155
|
-
- 0
|
156
114
|
version: "0"
|
157
115
|
type: :development
|
158
116
|
version_requirements: *id009
|
@@ -164,9 +122,6 @@ dependencies:
|
|
164
122
|
requirements:
|
165
123
|
- - ">="
|
166
124
|
- !ruby/object:Gem::Version
|
167
|
-
hash: 3
|
168
|
-
segments:
|
169
|
-
- 0
|
170
125
|
version: "0"
|
171
126
|
type: :development
|
172
127
|
version_requirements: *id010
|
@@ -182,17 +137,28 @@ files:
|
|
182
137
|
- lib/sqs.rb
|
183
138
|
- lib/sqs_attributes.rb
|
184
139
|
- lib/sqs_message.rb
|
140
|
+
- lib/sqs_permission.rb
|
185
141
|
- lib/sqs_queue.rb
|
142
|
+
- lib/sqs_send_message_response.rb
|
143
|
+
- lib/sqs_utilities.rb
|
144
|
+
- spec/fixtures/add_permission.xml
|
145
|
+
- spec/fixtures/change_message_visibility.xml
|
146
|
+
- spec/fixtures/create_queue.xml
|
186
147
|
- spec/fixtures/delete_message.xml
|
148
|
+
- spec/fixtures/delete_queue.xml
|
187
149
|
- spec/fixtures/error_response.xml
|
188
150
|
- spec/fixtures/list_queues.xml
|
189
151
|
- spec/fixtures/queue_attributes.xml
|
190
152
|
- spec/fixtures/receive_message.xml
|
153
|
+
- spec/fixtures/remove_permission.xml
|
154
|
+
- spec/fixtures/send_message.xml
|
155
|
+
- spec/fixtures/set_queue_attributes.xml
|
191
156
|
- spec/spec_helper.rb
|
192
157
|
- spec/sqs_attributes_spec.rb
|
193
158
|
- spec/sqs_message_spec.rb
|
194
159
|
- spec/sqs_queue_spec.rb
|
195
160
|
- spec/sqs_spec.rb
|
161
|
+
- spec/sqs_utilities_spec.rb
|
196
162
|
has_rdoc: true
|
197
163
|
homepage: https://github.com/edgecase/sqs_async
|
198
164
|
licenses: []
|
@@ -207,34 +173,36 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
207
173
|
requirements:
|
208
174
|
- - ">="
|
209
175
|
- !ruby/object:Gem::Version
|
210
|
-
hash: 3
|
211
|
-
segments:
|
212
|
-
- 0
|
213
176
|
version: "0"
|
214
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
178
|
none: false
|
216
179
|
requirements:
|
217
180
|
- - ">="
|
218
181
|
- !ruby/object:Gem::Version
|
219
|
-
hash: 3
|
220
|
-
segments:
|
221
|
-
- 0
|
222
182
|
version: "0"
|
223
183
|
requirements: []
|
224
184
|
|
225
185
|
rubyforge_project: sqs_async
|
226
|
-
rubygems_version: 1.
|
186
|
+
rubygems_version: 1.6.2
|
227
187
|
signing_key:
|
228
188
|
specification_version: 3
|
229
189
|
summary: Non-Blocking SQS library.
|
230
190
|
test_files:
|
191
|
+
- spec/fixtures/add_permission.xml
|
192
|
+
- spec/fixtures/change_message_visibility.xml
|
193
|
+
- spec/fixtures/create_queue.xml
|
231
194
|
- spec/fixtures/delete_message.xml
|
195
|
+
- spec/fixtures/delete_queue.xml
|
232
196
|
- spec/fixtures/error_response.xml
|
233
197
|
- spec/fixtures/list_queues.xml
|
234
198
|
- spec/fixtures/queue_attributes.xml
|
235
199
|
- spec/fixtures/receive_message.xml
|
200
|
+
- spec/fixtures/remove_permission.xml
|
201
|
+
- spec/fixtures/send_message.xml
|
202
|
+
- spec/fixtures/set_queue_attributes.xml
|
236
203
|
- spec/spec_helper.rb
|
237
204
|
- spec/sqs_attributes_spec.rb
|
238
205
|
- spec/sqs_message_spec.rb
|
239
206
|
- spec/sqs_queue_spec.rb
|
240
207
|
- spec/sqs_spec.rb
|
208
|
+
- spec/sqs_utilities_spec.rb
|