Class: CloudQueues::Queue

Inherits:
Object
  • Object
show all
Defined in:
lib/cloud-queues/queue.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#clientObject (readonly)

Returns the value of attribute client.



6
7
8
# File 'lib/cloud-queues/queue.rb', line 6

def client
  @client
end

#default_ttlObject

Returns the value of attribute default_ttl.



4
5
6
# File 'lib/cloud-queues/queue.rb', line 4

def default_ttl
  @default_ttl
end

#nameObject (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(options = {})
  query = options[:limit] ? {limit: options[:limit]} : {}
  body = {
    ttl: options[:ttl] || options["ttl"] || @default_claim_ttl,
    grace: options[:grace] || options["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

#claimedObject



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 delete_messages(*ids)
  query = "?ids=#{ids.join(',')}"
  @client.request(method: :delete, path: "#{path}/messages", expects: 204, query: query) && true
end

#freeObject



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, options = {})
  options = options[:claim_id] ? {claim_id: options[:claim_id]} : {}
  msgs = @client.request(method: :get, path: "#{path}/messages/#{id}", query: options)
  process_message(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 messages(options = {})
  if options[:ids]
    raise ArgumentError.new "Only 20 or less message IDs may be specified" if options[:ids].count > 20
    allowed_query = %w[ids claim_id]
  else
    allowed_query = %w[marker limit echo include_claimed]
  end

  options = options.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 options[:ids]
    query = "?ids=#{options.delete(:ids).join(',')}"
    options.each_pair do |key, value|
      query << "&#{key}=#{CGI.escape(value)}"
    end
    options = query
  end

  response = @client.request_all(options.class == String ? nil : "messages",
                                 method: :get, path: "#{path}/messages", expects: [200, 204], query: options)
  return [] if response.status == 204
  if response.body.class == Hash
    return process_messages(response.body["messages"], response.body["links"])
  else
    return process_messages(response.body)
  end
end

#metadataObject



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 metadata=(new_data)
  @client.request(method: :put, path: "#{path}/metadata", body: new_data, expects: 204) && true
end

#newestObject



130
# File 'lib/cloud-queues/queue.rb', line 130

def newest; stat(:newest); end

#oldestObject



131
# File 'lib/cloud-queues/queue.rb', line 131

def oldest; stat(:oldest); end

#pathObject



133
134
135
# File 'lib/cloud-queues/queue.rb', line 133

def path
  "/queues/#{@name}"
end

#put(*msgs) ⇒ Object

Raises:

  • (ArgumentError)


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 |message|
    begin
      if message.class == Message
        message.to_hash
      elsif message[:body] or message["body"]
        {
          ttl: message[:ttl] || message["ttl"] || @default_ttl,
          body: message[:body] || message["body"],
        }
      else
        { ttl: @default_ttl, body: message }
      end
    rescue
      { ttl: @default_ttl, body: message }
    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

#statsObject



119
120
121
# File 'lib/cloud-queues/queue.rb', line 119

def stats
  @client.request(method: :get, path: "#{path}/stats").body
end

#totalObject



129
# File 'lib/cloud-queues/queue.rb', line 129

def total; stat(:total); end