Class: CloudQueues::Queue
- Inherits:
-
Object
- Object
- CloudQueues::Queue
- Defined in:
- lib/cloud-queues/queue.rb
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#default_ttl ⇒ Object
Returns the value of attribute default_ttl.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
- #claim(options = {}) ⇒ Object
- #claimed ⇒ Object
- #delete! ⇒ Object
- #delete_messages(*ids) ⇒ Object
- #free ⇒ Object
- #get(id, options = {}) ⇒ Object
-
#initialize(client, name) ⇒ Queue
constructor
A new instance of Queue.
- #messages(options = {}) ⇒ Object
- #metadata ⇒ Object
- #metadata=(new_data) ⇒ Object
- #newest ⇒ Object
- #oldest ⇒ Object
- #path ⇒ Object
- #put(*msgs) ⇒ Object
- #stat(name) ⇒ Object
- #stats ⇒ Object
- #total ⇒ Object
Constructor Details
#initialize(client, name) ⇒ Queue
Returns a new instance of Queue.
8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/cloud-queues/queue.rb', line 8 def initialize(client, name) @client = client @name = name # TODO maybe make these defaults on the client or something, this isn't going # to always work out the way we want @default_ttl = 1209600 # 14 days, server max @default_claim_ttl = 43200 # 12 hours, server max @default_claim_grace = 300 # 5 minutes, arbitrary end |
Instance Attribute Details
#client ⇒ Object (readonly)
Returns the value of attribute client.
6 7 8 |
# File 'lib/cloud-queues/queue.rb', line 6 def client @client end |
#default_ttl ⇒ Object
Returns the value of attribute default_ttl.
4 5 6 |
# File 'lib/cloud-queues/queue.rb', line 4 def default_ttl @default_ttl end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
6 7 8 |
# File 'lib/cloud-queues/queue.rb', line 6 def name @name end |
Instance Method Details
#[](key) ⇒ Object
101 102 103 |
# File 'lib/cloud-queues/queue.rb', line 101 def [](key) [key] end |
#[]=(key, value) ⇒ Object
105 106 107 108 109 |
# File 'lib/cloud-queues/queue.rb', line 105 def []=(key, value) new_data = new_data[key] = value @client.request(method: :put, path: "#{path}/metadata", body: new_data, expects: 204) && true end |
#claim(options = {}) ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/cloud-queues/queue.rb', line 80 def claim( = {}) query = [:limit] ? {limit: [:limit]} : {} body = { ttl: [:ttl] || ["ttl"] || @default_claim_ttl, grace: [:grace] || ["grace"] || @default_claim_grace, } response = @client.request(method: :post, path: "#{path}/claims", body: body, query: query, expects: [201, 204]) return [] if response.status == 204 claim_id = URI.parse(response.get_header("Location")).path.split('/')[-1] process_claim(claim_id, response.body) end |
#claimed ⇒ Object
127 |
# File 'lib/cloud-queues/queue.rb', line 127 def claimed; stat(:claimed); end |
#delete! ⇒ Object
97 98 99 |
# File 'lib/cloud-queues/queue.rb', line 97 def delete! @client.request(method: :delete, path: "#{path}", expects: 204) && true end |
#delete_messages(*ids) ⇒ Object
92 93 94 95 |
# File 'lib/cloud-queues/queue.rb', line 92 def (*ids) query = "?ids=#{ids.join(',')}" @client.request(method: :delete, path: "#{path}/messages", expects: 204, query: query) && true end |
#free ⇒ Object
128 |
# File 'lib/cloud-queues/queue.rb', line 128 def free; stat(:free); end |
#get(id, options = {}) ⇒ Object
49 50 51 52 53 |
# File 'lib/cloud-queues/queue.rb', line 49 def get(id, = {}) = [:claim_id] ? {claim_id: [:claim_id]} : {} msgs = @client.request(method: :get, path: "#{path}/messages/#{id}", query: ) (msgs.body) end |
#messages(options = {}) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/cloud-queues/queue.rb', line 20 def ( = {}) if [:ids] raise ArgumentError.new "Only 20 or less message IDs may be specified" if [:ids].count > 20 allowed_query = %w[ids claim_id] else allowed_query = %w[marker limit echo include_claimed] end = .select { |opt| allowed_query.include?(opt.to_s) } # Excon likes to CGI.escape values in a query hash, so this has to be handled manually if [:ids] query = "?ids=#{.delete(:ids).join(',')}" .each_pair do |key, value| query << "&#{key}=#{CGI.escape(value)}" end = query end response = @client.request_all(.class == String ? nil : "messages", method: :get, path: "#{path}/messages", expects: [200, 204], query: ) return [] if response.status == 204 if response.body.class == Hash return (response.body["messages"], response.body["links"]) else return (response.body) end end |
#metadata ⇒ Object
111 112 113 |
# File 'lib/cloud-queues/queue.rb', line 111 def @client.request(method: :get, path: "#{path}/metadata").body end |
#metadata=(new_data) ⇒ Object
115 116 117 |
# File 'lib/cloud-queues/queue.rb', line 115 def (new_data) @client.request(method: :put, path: "#{path}/metadata", body: new_data, expects: 204) && true end |
#newest ⇒ Object
130 |
# File 'lib/cloud-queues/queue.rb', line 130 def newest; stat(:newest); end |
#oldest ⇒ Object
131 |
# File 'lib/cloud-queues/queue.rb', line 131 def oldest; stat(:oldest); end |
#path ⇒ Object
133 134 135 |
# File 'lib/cloud-queues/queue.rb', line 133 def path "/queues/#{@name}" end |
#put(*msgs) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/cloud-queues/queue.rb', line 55 def put(*msgs) raise ArgumentError.new("Only 10 or less messages may be given at once") if msgs.count > 10 msgs = msgs.map do || begin if .class == Message .to_hash elsif [:body] or ["body"] { ttl: [:ttl] || ["ttl"] || @default_ttl, body: [:body] || ["body"], } else { ttl: @default_ttl, body: } end rescue { ttl: @default_ttl, body: } end end # TODO this should probably do something with a body["partial"] == true response resources = @client.request(method: :post, path: "#{path}/messages", body: msgs, expects: 201).body["resources"] resources.map { |resource| URI.parse(resource).path.split('/')[-1] } end |
#stat(name) ⇒ Object
123 124 125 |
# File 'lib/cloud-queues/queue.rb', line 123 def stat(name) stats["messages"][name.to_s] end |
#stats ⇒ Object
119 120 121 |
# File 'lib/cloud-queues/queue.rb', line 119 def stats @client.request(method: :get, path: "#{path}/stats").body end |
#total ⇒ Object
129 |
# File 'lib/cloud-queues/queue.rb', line 129 def total; stat(:total); end |