bisques 1.0.1 → 1.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/CHANGELOG ADDED
@@ -0,0 +1,7 @@
1
+ === v1.0.1
2
+
3
+ Corrected homepage link
4
+
5
+ === v1.0.0
6
+
7
+ First version
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jeremy Wells
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc CHANGED
@@ -45,7 +45,7 @@ fibonacci sequence, with the consumer script doing the actual calculation.
45
45
 
46
46
  == LICENSE
47
47
 
48
- Copyright (c) 2012 Jeremy Wells
48
+ Copyright (c) 2013 Jeremy Wells
49
49
 
50
50
  Permission is hereby granted, free of charge, to any person
51
51
  obtaining a copy of this software and associated documentation
data/lib/bisques.rb CHANGED
@@ -1,4 +1,4 @@
1
- # See README.rdoc
1
+ # See {file:README README}
2
2
  module Bisques
3
3
  class Error < StandardError; end
4
4
  class MessageHasWrongMd5Error < Error
@@ -17,9 +17,20 @@ module Bisques
17
17
  end
18
18
 
19
19
  # This module is for making API classes more convenient. The including class
20
- # must pass the correct params via super from it's #initialize call. Two
21
- # useful methods are added to the including class, #request and #action.
20
+ # must pass the correct params via super from it's {#initialize} call. Two
21
+ # useful methods are added to the including class, {#request} and {#action}.
22
+ #
23
+ # @example
24
+ # class Sqs
25
+ # include AwsConnection
26
+ #
27
+ # def initialize(region)
28
+ # super(region, 'sqs')
29
+ # end
30
+ # end
31
+ #
22
32
  module AwsConnection
33
+ # @!visibility private
23
34
  def self.included(mod) # :nodoc:
24
35
  mod.class_eval do
25
36
  attr_accessor :credentials, :region, :service
@@ -28,8 +39,11 @@ module Bisques
28
39
 
29
40
  # Give the region, service and optionally the AwsCredentials.
30
41
  #
31
- # === Example:
42
+ # @param [String] region the AWS region (ex. us-east-1)
43
+ # @param [String] service the AWS service (ex. sqs)
44
+ # @param [AwsCredentials] credentials
32
45
  #
46
+ # @example
33
47
  # class Sqs
34
48
  # include AwsConnection
35
49
  #
@@ -42,19 +56,19 @@ module Bisques
42
56
  @region, @service, @credentials = region, service, credentials
43
57
  end
44
58
 
45
- def connection # :nodoc:
46
- @connection ||= HTTPClient.new.tap do |http|
47
- http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
48
- http.receive_timeout = 30
49
- end
50
- end
51
-
52
59
  # Perform an HTTP query to the given path using the given method (GET,
53
60
  # POST, PUT, DELETE). A hash of query params can be specified. A POST or
54
61
  # PUT body cna be specified as either a string or a hash of form params. A
55
62
  # hash of HTTP headers can be specified.
63
+ #
64
+ # @param [String] method HTTP method, should be GET, POST, PUT or DELETE
65
+ # @param [String] path
66
+ # @param [Hash] query HTTP query params to send. Specify these as a hash, do not append them to the path.
67
+ # @param [Hash,#to_s] body HTTP request body. This can be form data as a hash or a String. Only applies to POST and PUT HTTP methods.
68
+ # @param [Hash] headers additional HTTP headers to send.
69
+ # @return [AwsRequest]
56
70
  def request(method, path, query = {}, body = nil, headers = {})
57
- AwsRequest.new(connection).tap do |aws_request|
71
+ AwsRequest.new(aws_http_connection).tap do |aws_request|
58
72
  aws_request.credentials = credentials
59
73
  aws_request.path = path
60
74
  aws_request.region = region
@@ -68,13 +82,17 @@ module Bisques
68
82
  end
69
83
 
70
84
  # Call an AWS API with the given name at the given path. An optional hash
71
- # of options can be passed as arguments for the API call. Returns an
72
- # AwsResponse. If the response is not successful then an AwsActionError is
73
- # raised and the error information is extracted into the exception
74
- # instance.
85
+ # of options can be passed as arguments for the API call.
86
+ #
87
+ # @note The API call will be automatically retried *once* if the returned status code is
88
+ # in the 500 range.
75
89
  #
76
- # The API call will be automatically retried if the returned status code is
77
- # in the 500 range.
90
+ # @param [String] action_name
91
+ # @param [String] path
92
+ # @param [Hash] options
93
+ # @return [AwsResponse]
94
+ # @raise [AwsActionError] if the response is not successful. AWS error
95
+ # information can be extracted from the exception.
78
96
  def action(action_name, path = "/", options = {})
79
97
  retries = 0
80
98
 
@@ -96,5 +114,13 @@ module Bisques
96
114
  end
97
115
  end
98
116
  end
117
+
118
+ private
119
+ def aws_http_connection
120
+ @aws_http_connection ||= HTTPClient.new.tap do |http|
121
+ http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
122
+ http.receive_timeout = 30
123
+ end
124
+ end
99
125
  end
100
126
  end
@@ -2,18 +2,23 @@ module Bisques
2
2
  # Represents an AWS key/secret combination. Provides a convenient class
3
3
  # method for setting defaults that can be used by all objects later on.
4
4
  #
5
- # Example:
5
+ # @example
6
6
  #
7
7
  # AwsCredentials.default('aws_key', 'aws_secret')
8
8
  #
9
9
  class AwsCredentials
10
+ # @return [String]
10
11
  attr_reader :aws_key, :aws_secret
11
12
 
13
+ # @param [String] aws_key
14
+ # @param [String] aws_secret
12
15
  def initialize(aws_key, aws_secret)
13
16
  @aws_key, @aws_secret = aws_key, aws_secret
14
17
  end
15
18
 
16
19
  class << self
20
+ # (see #initialize)
21
+ # Set or retrieve the default credentials
17
22
  def default(*args)
18
23
  if args.size == 2
19
24
  @default = AwsCredentials.new(*args)
@@ -4,10 +4,10 @@ require 'bisques/aws_response'
4
4
  module Bisques
5
5
  # A request to an AWS API call. This class must be initiated with a client
6
6
  # instance of HTTPClient. A number of mandatory attributes must be set before
7
- # calling make_request to return the response. #make_request returns an
8
- # AwsResponse object.
7
+ # calling {#make_request} to return the response. {#make_request} returns an
8
+ # {AwsResponse} object.
9
9
  #
10
- # === Example
10
+ # @example
11
11
  #
12
12
  # request = AwsRequest.new(httpclient)
13
13
  # request.method = "GET" or "POST"
@@ -18,47 +18,55 @@ module Bisques
18
18
  # request.region = "AWS region (ex. us-east-1)"
19
19
  # request.service = "AWS service (ex. sqs)"
20
20
  # request.credentials = AwsCredentials.new("aws_key", "aws_secret")
21
- # response = request.make_request => Returns AwsResponse
21
+ # response = request.make_request
22
22
  #
23
23
  class AwsRequest
24
- # The HTTP method to use. Should be GET or POST.
24
+ # @return [String] The HTTP method to use. Should be GET or POST.
25
25
  attr_accessor :method
26
- # A hash describing the query params to send.
26
+ # @return [Hash] A hash describing the query params to send.
27
27
  attr_accessor :query
28
- # A hash or string describing the form params or HTTP body. Only used when
29
- # the method is POST or PUT.
28
+ # @return [Hash,String] A hash or string describing the form params or HTTP body. Only used when
29
+ # the method is POST or PUT.
30
30
  attr_accessor :body
31
- # A hash of additional HTTP headers to send with the request.
31
+ # @return [Hash] A hash of additional HTTP headers to send with the request.
32
32
  attr_accessor :headers
33
- # The path to the API call. This shouldn't be the full URL as the host part
34
- # is built from the region and service.
33
+ # @return [String] The path to the API call. This shouldn't be the full URL as the host part
34
+ # is built from the region and service.
35
35
  attr_accessor :path
36
- # The AWS region. Ex: us-east-1
36
+ # @return [String] The AWS region. Ex: us-east-1
37
37
  attr_accessor :region
38
- # The AWS service. Ex: sqs
38
+ # @return [String] The AWS service. Ex: sqs
39
39
  attr_accessor :service
40
- # The AWS credentials. Should respond to aws_key and aws_secret. Use
41
- # AwsCredentials.
40
+ # @return [AwsCredentials] The AWS credentials. Should respond to aws_key and aws_secret.
42
41
  attr_accessor :credentials
43
42
 
44
- # An AwsResponse object describing the response. Returns nil until
45
- # #make_request has been called.
43
+ # @return [AwsResponse] An AwsResponse object describing the response. Returns nil until
44
+ # {#make_request} has been called.
46
45
  attr_reader :response
46
+ # @return [AwsRequestAuthorization]
47
+ # @!visibility private
47
48
  attr_reader :authorization # :nodoc:
48
49
 
49
50
  # AWS has some particular rules about how it likes it's form params encoded.
51
+ #
52
+ # @param [String] value
53
+ # @return [String] encoded value
50
54
  def self.aws_encode(value)
51
55
  value.to_s.gsub(/([^a-zA-Z0-9._~-]+)/n) do
52
56
  '%' + $1.unpack('H2' * $1.size).join('%').upcase
53
57
  end
54
58
  end
55
59
 
56
- # Create a new AwsRequest using the given HTTPClient object.
60
+ # Create a new {AwsRequest} using the given HTTPClient object.
61
+ #
62
+ # @param [HTTPClient] httpclient
57
63
  def initialize(httpclient)
58
64
  @httpclient = httpclient
59
65
  end
60
66
 
61
67
  # The full URL to the API endpoint the request will call.
68
+ #
69
+ # @return [String]
62
70
  def url
63
71
  File.join("https://#{service}.#{region}.amazonaws.com", path)
64
72
  end
@@ -2,14 +2,14 @@ require 'nokogiri'
2
2
 
3
3
  module Bisques
4
4
  # Created by an AwsRequest to represent the returned details. The original
5
- # request is stored in #request. The raw content is available in #content.
6
- # AWS returns XML, and a Nokogiri::XML instance is available in #doc.
5
+ # request is stored in {#request}. The raw content is available in {#content}.
6
+ # AWS returns XML, and a Nokogiri::XML instance is available in {#doc}.
7
7
  class AwsResponse
8
- # The original AwsRequest that created this response.
8
+ # @return [AwsRequest] The original AwsRequest that created this response.
9
9
  attr_reader :request
10
- # The raw response string from AWS
10
+ # @return [String] The raw response string from AWS
11
11
  attr_reader :content
12
- # The HTTP response. This can be used to get any headers or status codes.
12
+ # @return [#body,#status,#header] The HTTP response. This can be used to get any headers or status codes.
13
13
  attr_reader :http_response
14
14
 
15
15
  def initialize(request, http_response) # :nodoc:
@@ -18,17 +18,19 @@ module Bisques
18
18
  @content = @http_response.body
19
19
  end
20
20
 
21
- # A Nokogiri::XML document parsed from the #content.
21
+ # A Nokogiri::XML document parsed from the {#content}.
22
+ #
23
+ # @return [Nokogiri::XML] XML document
22
24
  def doc
23
25
  @doc ||= Nokogiri::XML(content).tap{|x|x.remove_namespaces!}
24
26
  end
25
27
 
26
- # Returns true if the request was successful.
28
+ # @return [Boolean] Returns true if the request was successful.
27
29
  def success?
28
30
  @http_response.ok?
29
31
  end
30
32
 
31
- # The request ID from AWS.
33
+ # @return [String] The request ID from AWS.
32
34
  def request_id
33
35
  @http_response.header['x-amzn-RequestId']
34
36
  end
@@ -5,25 +5,29 @@ require 'bisques/queue_listener'
5
5
  require 'digest/md5'
6
6
 
7
7
  module Bisques
8
+ class QueueDeletedRecentlyError << Bisques::Error
9
+ end
10
+
8
11
  # Bisques is a client for Amazon SQS. All of the API calls made to SQS are
9
12
  # called via methods on this class.
10
13
  #
11
- # === Example
14
+ # @example
12
15
  #
13
16
  # client = Bisques::Client.new('us-east-1', 'my_queues_', AwsCredentials.new(aws_key, aws_secret))
14
17
  # client.list_queues
15
18
  #
16
19
  class Client
17
- # The queue prefix when interacting with SQS. The client will only be able
20
+ # @return [String] The queue prefix when interacting with SQS. The client will only be able
18
21
  # to see queues whose name has this prefix.
19
22
  attr_accessor :queue_prefix
20
23
 
21
24
  include AwsConnection
22
25
 
23
- # Initialize a client object. The AWS region must be specified. For
24
- # example, 'us-east-1'. An optional queue prefix can be provided to
25
- # restrict the queues this client can see and interact with. AWS
26
- # credentials must be provided, or defaults set in AwsCredentials.
26
+ # Initialize a client object.
27
+ #
28
+ # @param [String] region the AWS region.
29
+ # @param [String] queue_prefix an optional prefix for all queue names for this instance.
30
+ # @param [AwsCredentials] credentials an instance of AwsCredentials. Uses AwsCredentials::default if not provided.
27
31
  def initialize(region, queue_prefix = nil, credentials = AwsCredentials.default)
28
32
  super(region, "sqs", credentials)
29
33
  @queue_prefix = queue_prefix
@@ -31,11 +35,20 @@ module Bisques
31
35
 
32
36
  # Returns a Queue object representing an SQS queue, creating it if it does
33
37
  # not already exist.
38
+ #
39
+ # @param [String] name
40
+ # @return [Queue]
41
+ # @raise [AwsActionError]
34
42
  def get_or_create_queue(name)
35
43
  get_queue(name) || create_queue(name, {})
36
44
  end
37
45
 
38
46
  # Creates a new SQS queue and returns a Queue object.
47
+ #
48
+ # @param [String] name
49
+ # @param [Hash] attributes
50
+ # @return [Queue]
51
+ # @raise [AwsActionError]
39
52
  def create_queue(name, attributes = {})
40
53
  response = action("CreateQueue", {"QueueName" => Queue.sanitize_name("#{queue_prefix}#{name}")}.merge(attributes))
41
54
 
@@ -44,14 +57,28 @@ module Bisques
44
57
  else
45
58
  raise "Could not create queue #{name}"
46
59
  end
60
+
61
+ rescue AwsActionError => error
62
+ if error.code == "AWS.SimpleQueueService.QueueDeletedRecently"
63
+ raise QueueDeletedRecentlyError, error.message
64
+ else
65
+ raise error
66
+ end
47
67
  end
48
68
 
49
69
  # Deletes an SQS queue at a given path.
70
+ # @param [String] queue_url
71
+ # @return [AwsResponse]
72
+ # @raise [AwsActionError]
50
73
  def delete_queue(queue_url)
51
74
  response = action("DeleteQueue", queue_url)
52
75
  end
53
76
 
54
- # Get an SQS queue by name. Returns a Queue object if the queue is found, otherwise nil.
77
+ # Get an SQS queue by name.
78
+ # @param [String] name
79
+ # @param [Hash] options
80
+ # @return [Queue,nil] Returns a Queue object if the queue is found, otherwise nil.
81
+ # @raise [AwsActionError]
55
82
  def get_queue(name, options = {})
56
83
  response = action("GetQueueUrl", {"QueueName" => Queue.sanitize_name("#{queue_prefix}#{name}")}.merge(options))
57
84
 
@@ -67,9 +94,12 @@ module Bisques
67
94
  # optional prefix can be supplied to restrict the queues found. This prefix
68
95
  # is additional to the client prefix.
69
96
  #
70
- # Example:
97
+ # @param [String] prefix option prefix to restrict the queues found.
98
+ # @return [Array<Queue>] queue objects found.
99
+ # @raise [AwsActionError]
100
+ #
101
+ # @example Delete all the queues
71
102
  #
72
- # # Delete all the queues
73
103
  # client.list_queues.each do |queue|
74
104
  # queue.delete
75
105
  # end
@@ -84,7 +114,10 @@ module Bisques
84
114
  # Get the attributes for a queue. Takes an array of attribute names.
85
115
  # Defaults to ["All"] which returns all the available attributes.
86
116
  #
87
- # This returns an AwsResponse object.
117
+ # @param [String] queue_url
118
+ # @param [Array<String>] attributes
119
+ # @return [AwsResponse]
120
+ # @raise [AwsActionError]
88
121
  def get_queue_attributes(queue_url, attributes = ["All"])
89
122
  attributes = attributes.map(&:to_s)
90
123
 
@@ -99,7 +132,14 @@ module Bisques
99
132
  # should be a string. An optional delay seconds argument can be added if
100
133
  # the message should not become visible immediately.
101
134
  #
102
- # Example:
135
+ # @param [String] queue_url
136
+ # @param [String] message_body
137
+ # @param [Fixnum] delay_seconds
138
+ # @return nil
139
+ # @raise [MessageHasWrongMd5Error]
140
+ # @raise [AwsActionError]
141
+ #
142
+ # @example
103
143
  #
104
144
  # client.send_message(queue.path, "test message")
105
145
  #
@@ -127,11 +167,20 @@ module Bisques
127
167
 
128
168
  # Delete a message from a queue. The message is deleted by the handle given
129
169
  # when the message is retrieved.
170
+ #
171
+ # @param [String] queue_url
172
+ # @param [String] receipt_handle
173
+ # @return [AwsResponse]
174
+ # @raise [AwsActionError]
130
175
  def delete_message(queue_url, receipt_handle)
131
- response = action("DeleteMessage", queue_url, {"ReceiptHandle" => receipt_handle})
176
+ action("DeleteMessage", queue_url, {"ReceiptHandle" => receipt_handle})
132
177
  end
133
178
 
134
179
  # Receive a message from a queue. Takes the queue url and an optional hash.
180
+ # @param [String] queue_url
181
+ # @param [Hash] options
182
+ # @return [AwsResponse]
183
+ # @raise [AwsActionError]
135
184
  def receive_message(queue_url, options = {})
136
185
  # validate_options(options, %w(AttributeName MaxNumberOfMessages VisibilityTimeout WaitTimeSeconds))
137
186
  action("ReceiveMessage", queue_url, options)
@@ -141,6 +190,12 @@ module Bisques
141
190
  # have retrieved a message and now want to keep it hidden for longer before
142
191
  # deleting it, or if you have a job and decide you cannot action it and
143
192
  # want to return it to the queue sooner.
193
+ #
194
+ # @param [String] queue_url
195
+ # @param [String] receipt_handle
196
+ # @param [Fixnum] visibility_timeout
197
+ # @return [AwsResponse]
198
+ # @raise [AwsActionError]
144
199
  def change_message_visibility(queue_url, receipt_handle, visibility_timeout)
145
200
  action("ChangeMessageVisibility", queue_url, {"ReceiptHandle" => receipt_handle, "VisibilityTimeout" => visibility_timeout})
146
201
  end
@@ -3,17 +3,23 @@ require 'json'
3
3
  module Bisques
4
4
  # A message received from an SQS queue.
5
5
  class Message
6
- # The queue this message originated from.
6
+ # @return [Queue] The queue this message originated from.
7
7
  attr_reader :queue
8
- # The AWS Id of the message.
8
+ # @return [String] The AWS Id of the message.
9
9
  attr_reader :id
10
- # A unique handle used to manipulate the message.
10
+ # @return [String] A unique handle used to manipulate the message.
11
11
  attr_reader :handle
12
- # The raw text body of the message.
12
+ # @return [String] The raw text body of the message.
13
13
  attr_reader :body
14
- # Hash of SQS attributes.
14
+ # @return [Hash] Hash of SQS attributes.
15
15
  attr_reader :attributes
16
16
 
17
+ # @api
18
+ # @param [Queue] queue
19
+ # @param [String] id
20
+ # @param [String] handle
21
+ # @param [String] body
22
+ # @param [Hash] attributes
17
23
  def initialize(queue, id, handle, body, attributes = {}) #:nodoc:
18
24
  @queue, @id, @handle, @body, @attributes = queue, id, handle, body, attributes
19
25
  end
@@ -21,15 +27,17 @@ module Bisques
21
27
  # The deserialized object in the message. This method is used to retrieve
22
28
  # the contents that Queue#post_message placed there.
23
29
  #
24
- # Example:
30
+ # @example
25
31
  #
26
32
  # queue.post_message([1,2,3])
27
- # queue.retrieve.object => [1,2,3]
33
+ # queue.retrieve.object == [1,2,3]
28
34
  #
29
35
  def object
30
36
  @object ||= JSON.parse(body)
31
37
  end
32
38
 
39
+ # @return (see Queue#delete_message)
40
+ # @raise (see Queue#delete_message)
33
41
  # Delete the message from the queue. This should be called after the
34
42
  # message has been received and processed. If not then after a timeout the
35
43
  # message will get added back to the queue.
@@ -37,6 +45,8 @@ module Bisques
37
45
  queue.delete_message(handle)
38
46
  end
39
47
 
48
+ # @return (see Queue#return_message)
49
+ # @raise (see Queue#return_message)
40
50
  # Return the message to the queue immediately. If a client has taken a
41
51
  # message and cannot process it for any reason it can put the message back
42
52
  # faster than the default timeout by calling this method.
data/lib/bisques/queue.rb CHANGED
@@ -11,9 +11,10 @@ module Bisques
11
11
  end
12
12
  class QueueNotFound < QueueError; end
13
13
 
14
-
14
+ # @!visibility private
15
15
  attr_reader :client # :nodoc:
16
16
 
17
+ # @!visibility private
17
18
  def self.sanitize_name(name)
18
19
  name = name.gsub(/[^_\w\d]/, "")
19
20
 
@@ -27,18 +28,21 @@ module Bisques
27
28
  name
28
29
  end
29
30
 
30
- # Queues are created by the Client passing the client itself and the url
31
+ # Queues are created by the {Client} passing the client itself and the url
31
32
  # for the queue.
33
+ #
34
+ # @param [Client] client
35
+ # @param [String] url
32
36
  def initialize(client, url)
33
37
  @client, @url = client, url
34
38
  end
35
39
 
36
- # The name of the queue derived from the URL.
40
+ # @return [String] The name of the queue derived from the URL.
37
41
  def name
38
42
  @url.split("/").last
39
43
  end
40
44
 
41
- # The path part of the queue URL
45
+ # @return [String] The path part of the queue URL
42
46
  def path
43
47
  Addressable::URI.parse(@url).path
44
48
  end
@@ -50,7 +54,7 @@ module Bisques
50
54
  def ==(queue)
51
55
  hash == queue.hash
52
56
  end
53
- def hash # :nodoc:
57
+ def hash
54
58
  @url.hash
55
59
  end
56
60
 
@@ -63,13 +67,16 @@ module Bisques
63
67
  # If more than one, or all, attributes are requested then a hash of
64
68
  # attribute names and values is returned.
65
69
  #
66
- # ==== Example with one attribute:
70
+ # @param [String] attributes
71
+ # @return [Object,Hash]
67
72
  #
68
- # queue.attributes(:ApproximateNumberOfMessages) => 10
73
+ # @example with one attribute
69
74
  #
70
- # ==== Example with multiple attributes:
75
+ # queue.attributes(:ApproximateNumberOfMessages) == 10
71
76
  #
72
- # queue.attributes(:ApproximateNumberOfMessages, :ApproximateNumberOfMessagesDelayed) => {:ApproximateNumberOfMessages => 10, :ApproximateNumberOfMessagesDelayed => 5}
77
+ # @example with multiple attributes
78
+ #
79
+ # queue.attributes(:ApproximateNumberOfMessages, :ApproximateNumberOfMessagesDelayed) == {:ApproximateNumberOfMessages => 10, :ApproximateNumberOfMessagesDelayed => 5}
73
80
  #
74
81
  def attributes(*attributes)
75
82
  return nil if attributes.blank?
@@ -92,18 +99,28 @@ module Bisques
92
99
  end
93
100
 
94
101
  # Delete the queue
102
+ # @return [AwsResponse]
103
+ # @raise [AwsActionError]
95
104
  def delete
96
105
  client.delete_queue(url)
97
106
  end
98
107
 
99
108
  # Post a message to the queue. The message must be serializable (i.e.
100
109
  # strings, numbers, arrays, hashes).
110
+ #
111
+ # @param [String,Fixnum,Array,Hash] object
112
+ # @raise [MessageHasWrongMd5Error]
113
+ # @raise [AwsActionError]
101
114
  def post_message(object)
102
115
  client.send_message(url, JSON.dump(object))
103
116
  end
104
117
 
105
118
  # Retrieve a message from the queue. Returns nil if no message is waiting
106
119
  # in the given poll time. Otherwise it returns a Message.
120
+ #
121
+ # @param [Fixnum] poll_time
122
+ # @return [Message,nil]
123
+ # @raise [AwsActionError]
107
124
  def retrieve(poll_time = 1)
108
125
  response = client.receive_message(url, {"WaitTimeSeconds" => poll_time, "MaxNumberOfMessages" => 1})
109
126
  raise QueueNotFound.new(self, "not found at #{url}") if response.http_response.status == 404
@@ -123,6 +140,10 @@ module Bisques
123
140
 
124
141
  # Retrieve a single message from the queue. This will block until a message
125
142
  # arrives. The message will be of the class Message.
143
+ #
144
+ # @param [Fixnum] poll_time
145
+ # @return [Message]
146
+ # @raise [AwsActionError]
126
147
  def retrieve_one(poll_time = 5)
127
148
  object = nil
128
149
  while object.nil?
@@ -134,6 +155,10 @@ module Bisques
134
155
  # Delete a message from the queue. This should be called to confirm that
135
156
  # the message has been processed. If it is not called then the message will
136
157
  # get put back on the queue after a timeout.
158
+ #
159
+ # @param [String] handle
160
+ # @return [Boolean] true if the message was deleted.
161
+ # @raise [AwsActionError]
137
162
  def delete_message(handle)
138
163
  response = client.delete_message(url, handle)
139
164
  response.success?
@@ -141,6 +166,10 @@ module Bisques
141
166
 
142
167
  # Return a message to the queue after receiving it. This would typically
143
168
  # happen if the receiver decided it couldn't process.
169
+ #
170
+ # @param [String] handle
171
+ # @return [AwsResponse]
172
+ # @raise [AwsActionError]
144
173
  def return_message(handle)
145
174
  client.change_message_visibility(url, handle, 0)
146
175
  end
@@ -4,17 +4,20 @@ require 'thread'
4
4
  module Bisques
5
5
  # Listen for messages on a queue and execute a block when they arrive.
6
6
  class QueueListener
7
+ # @param [Queue] queue the queue to listen on
8
+ # @param [Fixnum] poll_time the number of seconds to long poll during each iteration. Maximum is 20.
7
9
  def initialize(queue, poll_time = 5)
8
10
  @queue, @poll_time = queue, poll_time
9
11
  end
10
12
 
13
+ # @return [Boolean] returns true while the listener is active.
11
14
  def listening?
12
15
  @listening
13
16
  end
14
17
 
15
18
  # Listen for messages. This is asynchronous and returns immediately.
16
19
  #
17
- # Ex:
20
+ # @example
18
21
  #
19
22
  # queue = bisques.find_or_create_queue("my queue")
20
23
  # listener = QueuedListener.new(queue)
@@ -25,7 +28,8 @@ module Bisques
25
28
  #
26
29
  # while true; sleep 1; end # Process messages forever
27
30
  #
28
- # Note that the block you give to this method is executed in a new thread.
31
+ # @note Note that the block you give to this method is executed in a new thread.
32
+ # @yield [Message] a message received from the {Queue}
29
33
  #
30
34
  def listen(&block)
31
35
  return if @listening
@@ -39,7 +43,7 @@ module Bisques
39
43
  end
40
44
  end
41
45
 
42
- # Stop listening for messages
46
+ # Stop listening for messages.
43
47
  def stop
44
48
  @listening = false
45
49
  @thread.join if @thread
@@ -47,9 +51,9 @@ module Bisques
47
51
  end
48
52
 
49
53
  # Listen for messages on several queues at the same time. The interface for
50
- # objects of this class is identical to that of QueueListener.
54
+ # objects of this class is identical to that of {QueueListener}.
51
55
  #
52
- # Ex:
56
+ # @example
53
57
  #
54
58
  # queue_1 = bisques.find_or_create_queue("queue one")
55
59
  # queue_2 = bisques.find_or_create_queue("queue two")
@@ -61,15 +65,18 @@ module Bisques
61
65
  # while true; sleep 1; end # Process messages forever
62
66
  #
63
67
  class MultiQueueListener
68
+ # @param [Array<Queue>] queues
64
69
  def initialize(*queues)
65
70
  @queues = queues
66
71
  @listeners = []
67
72
  end
68
73
 
74
+ # (see QueueListener#listening?)
69
75
  def listening?
70
76
  @listeners.any?
71
77
  end
72
78
 
79
+ # (see QueueListener#listen)
73
80
  def listen(&block)
74
81
  return if @listeners.any?
75
82
  @listeners = @queues.map do |queue|
@@ -81,6 +88,7 @@ module Bisques
81
88
  end
82
89
  end
83
90
 
91
+ # (see QueueListener#stop)
84
92
  def stop
85
93
  @listeners.each(&:stop)
86
94
  @listeners = []
metadata CHANGED
@@ -1,96 +1,96 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bisques
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
4
  prerelease:
5
+ version: 1.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeremy Wells
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-31 00:00:00.000000000 Z
12
+ date: 2013-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httpclient
16
- prerelease: false
16
+ type: :runtime
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
22
  none: false
23
- type: :runtime
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
24
  requirements:
26
25
  - - ! '>='
27
26
  - !ruby/object:Gem::Version
28
27
  version: '0'
29
28
  none: false
29
+ prerelease: false
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: addressable
32
- prerelease: false
32
+ type: :runtime
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
37
  version: '0'
38
38
  none: false
39
- type: :runtime
40
39
  version_requirements: !ruby/object:Gem::Requirement
41
40
  requirements:
42
41
  - - ! '>='
43
42
  - !ruby/object:Gem::Version
44
43
  version: '0'
45
44
  none: false
45
+ prerelease: false
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: nokogiri
48
- prerelease: false
48
+ type: :runtime
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  none: false
55
- type: :runtime
56
55
  version_requirements: !ruby/object:Gem::Requirement
57
56
  requirements:
58
57
  - - ! '>='
59
58
  - !ruby/object:Gem::Version
60
59
  version: '0'
61
60
  none: false
61
+ prerelease: false
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: json
64
- prerelease: false
64
+ type: :runtime
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  none: false
71
- type: :runtime
72
71
  version_requirements: !ruby/object:Gem::Requirement
73
72
  requirements:
74
73
  - - ! '>='
75
74
  - !ruby/object:Gem::Version
76
75
  version: '0'
77
76
  none: false
77
+ prerelease: false
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: rspec
80
- prerelease: false
80
+ type: :development
81
81
  requirement: !ruby/object:Gem::Requirement
82
82
  requirements:
83
83
  - - ! '>='
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
86
  none: false
87
- type: :development
88
87
  version_requirements: !ruby/object:Gem::Requirement
89
88
  requirements:
90
89
  - - ! '>='
91
90
  - !ruby/object:Gem::Version
92
91
  version: '0'
93
92
  none: false
93
+ prerelease: false
94
94
  description: AWS SQS client
95
95
  email: jemmyw@gmail.com
96
96
  executables: []
@@ -99,6 +99,8 @@ extra_rdoc_files:
99
99
  - README.rdoc
100
100
  files:
101
101
  - README.rdoc
102
+ - LICENSE
103
+ - CHANGELOG
102
104
  - Rakefile
103
105
  - lib/bisques/aws_connection.rb
104
106
  - lib/bisques/aws_credentials.rb
@@ -122,17 +124,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
124
  requirements:
123
125
  - - ! '>='
124
126
  - !ruby/object:Gem::Version
127
+ segments:
128
+ - 0
129
+ hash: -1167259765523084286
125
130
  version: '0'
126
131
  none: false
127
132
  required_rubygems_version: !ruby/object:Gem::Requirement
128
133
  requirements:
129
134
  - - ! '>='
130
135
  - !ruby/object:Gem::Version
136
+ segments:
137
+ - 0
138
+ hash: -1167259765523084286
131
139
  version: '0'
132
140
  none: false
133
141
  requirements: []
134
142
  rubyforge_project:
135
- rubygems_version: 1.8.24
143
+ rubygems_version: 1.8.25
136
144
  signing_key:
137
145
  specification_version: 3
138
146
  summary: AWS SQS client