waz-storage 0.5.4 → 0.5.6
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/waz/blobs/blob_object.rb +13 -1
- data/lib/waz/blobs/service.rb +42 -41
- data/lib/waz/queues/message.rb +2 -1
- data/lib/waz/queues/queue.rb +10 -6
- data/lib/waz/queues/service.rb +27 -31
- data/lib/waz/storage/core_service.rb +42 -4
- data/lib/waz/storage/exceptions.rb +8 -0
- data/lib/waz/storage/version.rb +1 -1
- metadata +2 -2
@@ -80,11 +80,23 @@ module WAZ
|
|
80
80
|
self.class.service_instance.delete_blob(path)
|
81
81
|
end
|
82
82
|
|
83
|
+
# Copies the blob to the destination and returns
|
84
|
+
# the copied blob instance.
|
85
|
+
#
|
86
|
+
# destination should be formed as "container/blob"
|
87
|
+
def copy(destination)
|
88
|
+
self.class.service_instance.copy_blob(self.path, destination)
|
89
|
+
properties = self.class.service_instance.get_blob_properties(destination)
|
90
|
+
return BlobObject.new(:name => destination,
|
91
|
+
:url => self.class.service_instance.generate_request_uri(destination),
|
92
|
+
:content_type => properties[:content_type])
|
93
|
+
end
|
94
|
+
|
83
95
|
# Returns the blob path. This is specially important when simulating containers inside containers
|
84
96
|
# by enabling the API to point to the appropiated resource.
|
85
97
|
def path
|
86
98
|
url.gsub(/https?:\/\/[^\/]+\//i, '').scan(/([^&]+)/i).first().first()
|
87
|
-
end
|
99
|
+
end
|
88
100
|
end
|
89
101
|
end
|
90
102
|
end
|
data/lib/waz/blobs/service.rb
CHANGED
@@ -7,16 +7,12 @@ module WAZ
|
|
7
7
|
|
8
8
|
# Creates a container on the current Windows Azure Storage account.
|
9
9
|
def create_container(container_name)
|
10
|
-
|
11
|
-
request = generate_request("PUT", url)
|
12
|
-
request.execute()
|
10
|
+
execute :put, container_name
|
13
11
|
end
|
14
12
|
|
15
13
|
# Retrieves all the properties existing on the container.
|
16
14
|
def get_container_properties(container_name)
|
17
|
-
|
18
|
-
request = generate_request("GET", url)
|
19
|
-
request.execute().headers
|
15
|
+
execute(:get, container_name).headers
|
20
16
|
end
|
21
17
|
|
22
18
|
# Set the container properties (metadata).
|
@@ -24,18 +20,15 @@ module WAZ
|
|
24
20
|
# Remember that custom properties should be named as :x_ms_meta_{propertyName} in order
|
25
21
|
# to have Windows Azure to persist them.
|
26
22
|
def set_container_properties(container_name, properties = {})
|
27
|
-
|
28
|
-
request = generate_request("PUT", url, properties)
|
29
|
-
request.execute()
|
23
|
+
execute :put, container_name, { :comp => 'metadata' }, properties
|
30
24
|
end
|
31
25
|
|
32
26
|
# Retrieves the value of the :x_ms_prop_publicaccess header from the
|
33
27
|
# container properties indicating whether the container is publicly
|
34
28
|
# accessible or not.
|
35
29
|
def get_container_acl(container_name)
|
36
|
-
|
37
|
-
|
38
|
-
request.execute().headers[:x_ms_prop_publicaccess].downcase == true.to_s
|
30
|
+
headers = execute(:get, container_name, { :comp => 'acl' }).headers
|
31
|
+
headers[:x_ms_prop_publicaccess].downcase == true.to_s
|
39
32
|
end
|
40
33
|
|
41
34
|
# Sets the value of the :x_ms_prop_publicaccess header from the
|
@@ -44,16 +37,13 @@ module WAZ
|
|
44
37
|
#
|
45
38
|
# Default is _false_
|
46
39
|
def set_container_acl(container_name, public_available = false)
|
47
|
-
|
48
|
-
request = generate_request("PUT", url, "x-ms-prop-publicaccess" => public_available.to_s)
|
49
|
-
request.execute()
|
40
|
+
execute :put, container_name, { :comp => 'acl' }, { :x_ms_prop_publicaccess => public_available.to_s }
|
50
41
|
end
|
51
42
|
|
52
43
|
# Lists all the containers existing on the current storage account.
|
53
44
|
def list_containers(options = {})
|
54
|
-
|
55
|
-
|
56
|
-
doc = REXML::Document.new(request.execute())
|
45
|
+
content = execute(:get, nil, options.merge(:comp => 'list'))
|
46
|
+
doc = REXML::Document.new(content)
|
57
47
|
containers = []
|
58
48
|
REXML::XPath.each(doc, '//Container/') do |item|
|
59
49
|
containers << { :name => REXML::XPath.first(item, "Name").text,
|
@@ -65,16 +55,13 @@ module WAZ
|
|
65
55
|
|
66
56
|
# Deletes the given container from the Windows Azure Storage account.
|
67
57
|
def delete_container(container_name)
|
68
|
-
|
69
|
-
request = generate_request("DELETE", url)
|
70
|
-
request.execute()
|
58
|
+
execute :delete, container_name
|
71
59
|
end
|
72
60
|
|
73
61
|
# Lists all the blobs inside the given container.
|
74
62
|
def list_blobs(container_name)
|
75
|
-
|
76
|
-
|
77
|
-
doc = REXML::Document.new(request.execute())
|
63
|
+
content = execute(:get, container_name, { :comp => 'list' })
|
64
|
+
doc = REXML::Document.new(content)
|
78
65
|
containers = []
|
79
66
|
REXML::XPath.each(doc, '//Blob/') do |item|
|
80
67
|
containers << { :name => REXML::XPath.first(item, "Name").text,
|
@@ -92,37 +79,51 @@ module WAZ
|
|
92
79
|
#
|
93
80
|
# metadata is a hash that stores all the properties that you want to add to the blob when creating it.
|
94
81
|
def put_blob(path, payload, content_type = "application/octet-stream", metadata = {})
|
95
|
-
|
96
|
-
request = generate_request("PUT", url, metadata.merge("Content-Type" => content_type), payload)
|
97
|
-
request.execute()
|
82
|
+
execute :put, path, nil, metadata.merge("Content-Type" => content_type), payload
|
98
83
|
end
|
99
84
|
|
100
85
|
# Retrieves a blob (content + headers) from the current path.
|
101
|
-
def get_blob(path)
|
102
|
-
|
103
|
-
request = generate_request("GET", url)
|
104
|
-
request.execute()
|
86
|
+
def get_blob(path, options = {})
|
87
|
+
execute :get, path, options
|
105
88
|
end
|
106
89
|
|
107
90
|
# Deletes the blob existing on the current path.
|
108
91
|
def delete_blob(path)
|
109
|
-
|
110
|
-
request = generate_request("DELETE", url)
|
111
|
-
request.execute()
|
92
|
+
execute :delete, path
|
112
93
|
end
|
113
94
|
|
114
95
|
# Retrieves the properties associated with the blob at the given path.
|
115
|
-
def get_blob_properties(path)
|
116
|
-
|
117
|
-
request = generate_request("HEAD", url)
|
118
|
-
request.execute().headers
|
96
|
+
def get_blob_properties(path, options = {})
|
97
|
+
execute(:head, path, options).headers
|
119
98
|
end
|
120
99
|
|
121
100
|
# Sets the properties (metadata) associated to the blob at given path.
|
122
101
|
def set_blob_properties(path, properties ={})
|
123
|
-
|
124
|
-
|
125
|
-
|
102
|
+
execute :put, path, { :comp => 'metadata' }, properties
|
103
|
+
end
|
104
|
+
|
105
|
+
# Copies a blob within the same account (not necessarily to the same container)
|
106
|
+
def copy_blob(source_path, dest_path)
|
107
|
+
execute :put, dest_path, nil, { :x_ms_version => "2009-04-14", :x_ms_copy_source => canonicalize_message(source_path) }
|
108
|
+
end
|
109
|
+
|
110
|
+
# Adds a block to the block list of the given blob
|
111
|
+
def put_block(path, identifier, payload)
|
112
|
+
execute :put, path, { :comp => 'block', :blockid => identifier }, {'Content-Type' => "application/octet-stream"}, payload
|
113
|
+
end
|
114
|
+
|
115
|
+
# Retrieves the list of blocks associated with a single blob. The list is filtered (or not) by type of blob
|
116
|
+
def list_blocks(path, block_list_type = 'all')
|
117
|
+
raise WAZ::Storage::InvalidParameterValue , {:name => :bloclisttype, :values => ['all', 'uncommitted', 'committed']} unless (block_list_type or "") =~ /all|committed|uncommitted/i
|
118
|
+
content = execute(:get, path, {:comp => 'blocklist'}.merge(:blocklisttype => block_list_type.downcase), { :x_ms_version => "2009-04-14" })
|
119
|
+
doc = REXML::Document.new(content)
|
120
|
+
blocks = []
|
121
|
+
REXML::XPath.each(doc, '//Block/') do |item|
|
122
|
+
blocks << { :name => REXML::XPath.first(item, "Name").text,
|
123
|
+
:size => REXML::XPath.first(item, "Size").text,
|
124
|
+
:committed => item.parent.name == "CommittedBlocks" }
|
125
|
+
end
|
126
|
+
return blocks
|
126
127
|
end
|
127
128
|
end
|
128
129
|
end
|
data/lib/waz/queues/message.rb
CHANGED
@@ -33,7 +33,7 @@ module WAZ
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
attr_accessor :message_id, :message_text, :pop_receipt, :expiration_time, :insertion_time, :time_next_visible
|
36
|
+
attr_accessor :message_id, :message_text, :pop_receipt, :expiration_time, :insertion_time, :time_next_visible, :dequeue_count
|
37
37
|
|
38
38
|
# Creates an instance of Message class, this method is intended to be used internally from the
|
39
39
|
# Queue.
|
@@ -44,6 +44,7 @@ module WAZ
|
|
44
44
|
self.expiration_time = params[:expiration_time]
|
45
45
|
self.insertion_time = params[:insertion_time]
|
46
46
|
self.time_next_visible = params[:time_next_visible]
|
47
|
+
self.dequeue_count = params[:dequeue_count]
|
47
48
|
@queue_name = params[:queue_name]
|
48
49
|
end
|
49
50
|
|
data/lib/waz/queues/queue.rb
CHANGED
@@ -42,8 +42,11 @@ module WAZ
|
|
42
42
|
class << self
|
43
43
|
# Returns an array of the queues (WAZ::Queues::Queue) existing on the current
|
44
44
|
# Windows Azure Storage account.
|
45
|
-
|
46
|
-
|
45
|
+
#
|
46
|
+
# include_metadata defines if the metadata is retrieved along with queue data.
|
47
|
+
def list(include_metadata = false)
|
48
|
+
options = include_metadata ? { :include => 'metadata' } : {}
|
49
|
+
service_instance.list_queues(options).map do |queue|
|
47
50
|
WAZ::Queues::Queue.new(queue)
|
48
51
|
end
|
49
52
|
end
|
@@ -60,8 +63,8 @@ module WAZ
|
|
60
63
|
# return nil shilding the user from a ResourceNotFound exception.
|
61
64
|
def find(queue_name)
|
62
65
|
begin
|
63
|
-
service_instance.get_queue_metadata(queue_name)
|
64
|
-
WAZ::Queues::Queue.new(:name => queue_name, :url => service_instance.generate_request_uri(queue_name))
|
66
|
+
metadata = service_instance.get_queue_metadata(queue_name)
|
67
|
+
WAZ::Queues::Queue.new(:name => queue_name, :url => service_instance.generate_request_uri(queue_name), :metadata => metadata)
|
65
68
|
rescue RestClient::ResourceNotFound
|
66
69
|
return nil
|
67
70
|
end
|
@@ -76,13 +79,14 @@ module WAZ
|
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
79
|
-
attr_accessor :name, :url
|
82
|
+
attr_accessor :name, :url, :metadata
|
80
83
|
|
81
84
|
def initialize(options = {})
|
82
85
|
raise WAZ::Storage::InvalidOption, :name unless options.keys.include?(:name)
|
83
86
|
raise WAZ::Storage::InvalidOption, :url unless options.keys.include?(:url)
|
84
87
|
self.name = options[:name]
|
85
88
|
self.url = options[:url]
|
89
|
+
self.metadata = options[:metadata]
|
86
90
|
end
|
87
91
|
|
88
92
|
# Deletes the queue from the current storage account.
|
@@ -92,7 +96,7 @@ module WAZ
|
|
92
96
|
|
93
97
|
# Retrieves the metadata headers associated with the quere.
|
94
98
|
def metadata
|
95
|
-
self.class.service_instance.get_queue_metadata(self.name)
|
99
|
+
metadata ||= self.class.service_instance.get_queue_metadata(self.name)
|
96
100
|
end
|
97
101
|
|
98
102
|
# Sets the metadata given on the new_metadata, when overwrite passed different
|
data/lib/waz/queues/service.rb
CHANGED
@@ -6,15 +6,25 @@ module WAZ
|
|
6
6
|
include WAZ::Storage::SharedKeyCoreService
|
7
7
|
|
8
8
|
# Lists the queues on the given storage account.
|
9
|
+
#
|
10
|
+
# When the options :include => 'metadata' is passed it returns
|
11
|
+
# the corresponding metadata for each queue on the listing.
|
9
12
|
def list_queues(options ={})
|
10
|
-
|
11
|
-
|
12
|
-
doc = REXML::Document.new(request.execute())
|
13
|
+
content = execute(:get, nil, { :comp => 'list' }.merge!(options), { :x_ms_version => "2009-09-19" })
|
14
|
+
doc = REXML::Document.new(content)
|
13
15
|
queues = []
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
REXML::XPath.each(doc, '//Queue/') do |item|
|
18
|
+
metadata = {}
|
19
|
+
|
20
|
+
item.elements['Metadata'].elements.each do |element|
|
21
|
+
metadata.merge!(element.name.gsub(/-/, '_').downcase.to_sym => element.text)
|
22
|
+
end unless item.elements['Metadata'].nil?
|
23
|
+
|
24
|
+
queues << { :name => REXML::XPath.first(item, "Name").text,
|
25
|
+
:url => REXML::XPath.first(item, "Url").text,
|
26
|
+
:metadata => metadata}
|
27
|
+
end
|
18
28
|
return queues
|
19
29
|
end
|
20
30
|
|
@@ -22,9 +32,7 @@ module WAZ
|
|
22
32
|
# existing metadata and given metadata differ.
|
23
33
|
def create_queue(queue_name, metadata = {})
|
24
34
|
begin
|
25
|
-
|
26
|
-
request = generate_request("PUT", url, metadata)
|
27
|
-
request.execute()
|
35
|
+
execute :put, queue_name, nil, metadata.merge!(:x_ms_version => '2009-09-19')
|
28
36
|
rescue RestClient::RequestFailed
|
29
37
|
raise WAZ::Queues::QueueAlreadyExists, queue_name if $!.http_code == 409
|
30
38
|
end
|
@@ -32,23 +40,17 @@ module WAZ
|
|
32
40
|
|
33
41
|
# Deletes the given queue from the current storage account.
|
34
42
|
def delete_queue(queue_name)
|
35
|
-
|
36
|
-
request = generate_request("DELETE", url)
|
37
|
-
request.execute()
|
43
|
+
execute(:delete, queue_name, {}, {:x_ms_version => '2009-09-19'})
|
38
44
|
end
|
39
45
|
|
40
46
|
# Gets the given queue metadata.
|
41
47
|
def get_queue_metadata(queue_name)
|
42
|
-
|
43
|
-
request = generate_request("HEAD", url)
|
44
|
-
request.execute().headers
|
48
|
+
execute(:head, queue_name, { :comp => 'metadata'}, :x_ms_version => '2009-09-19').headers
|
45
49
|
end
|
46
50
|
|
47
51
|
# Sets the given queue metadata.
|
48
52
|
def set_queue_metadata(queue_name, metadata = {})
|
49
|
-
|
50
|
-
request = generate_request("PUT", url, metadata)
|
51
|
-
request.execute()
|
53
|
+
execute(:put, queue_name, { :comp => 'metadata' }, metadata.merge!(:x_ms_version => '2009-09-19'))
|
52
54
|
end
|
53
55
|
|
54
56
|
# Enqueues a message on the current queue.
|
@@ -56,10 +58,8 @@ module WAZ
|
|
56
58
|
# ttl Specifies the time-to-live interval for the message, in seconds. The maximum time-to-live allowed is 7 days. If this parameter
|
57
59
|
# is omitted, the default time-to-live is 7 days.
|
58
60
|
def enqueue(queue_name, message_payload, ttl = 604800)
|
59
|
-
url = generate_request_uri("#{queue_name}/messages", "messagettl" => ttl)
|
60
61
|
payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?><QueueMessage><MessageText>#{message_payload}</MessageText></QueueMessage>"
|
61
|
-
|
62
|
-
request.execute()
|
62
|
+
execute(:post, "#{queue_name}/messages", { :messagettl => ttl }, { 'Content-Type' => 'application/xml', :x_ms_version => "2009-09-19"}, payload)
|
63
63
|
end
|
64
64
|
|
65
65
|
# Locks N messages (1 default) from the given queue.
|
@@ -70,13 +70,13 @@ module WAZ
|
|
70
70
|
def get_messages(queue_name, options = {})
|
71
71
|
raise WAZ::Queues::OptionOutOfRange, {:name => :num_of_messages, :min => 1, :max => 32} if (options.keys.include?(:num_of_messages) && (options[:num_of_messages].to_i < 1 || options[:num_of_messages].to_i > 32))
|
72
72
|
raise WAZ::Queues::OptionOutOfRange, {:name => :visibility_timeout, :min => 1, :max => 7200} if (options.keys.include?(:visibility_timeout) && (options[:visibility_timeout].to_i < 1 || options[:visibility_timeout].to_i > 7200))
|
73
|
-
|
74
|
-
|
75
|
-
doc = REXML::Document.new(request.execute())
|
73
|
+
content = execute(:get, "#{queue_name}/messages", options, {:x_ms_version => "2009-09-19"})
|
74
|
+
doc = REXML::Document.new(content)
|
76
75
|
messages = []
|
77
76
|
REXML::XPath.each(doc, '//QueueMessage/') do |item|
|
78
77
|
message = { :message_id => REXML::XPath.first(item, "MessageId").text,
|
79
78
|
:message_text => REXML::XPath.first(item, "MessageText").text,
|
79
|
+
:dequeue_count => REXML::XPath.first(item, "DequeueCount").nil? ? nil : REXML::XPath.first(item, "DequeueCount").text.to_i,
|
80
80
|
:expiration_time => Time.httpdate(REXML::XPath.first(item, "ExpirationTime").text),
|
81
81
|
:insertion_time => Time.httpdate(REXML::XPath.first(item, "InsertionTime").text) }
|
82
82
|
|
@@ -98,16 +98,12 @@ module WAZ
|
|
98
98
|
# Deletes the given message from the queue, correlating the operation with the pop_receipt
|
99
99
|
# in order to avoid eventually inconsistent scenarios.
|
100
100
|
def delete_message(queue_name, message_id, pop_receipt)
|
101
|
-
|
102
|
-
request = generate_request("DELETE", url)
|
103
|
-
request.execute()
|
101
|
+
execute :delete, "#{queue_name}/messages/#{message_id}", { :pop_receipt => pop_receipt }
|
104
102
|
end
|
105
103
|
|
106
104
|
# Marks every message on the given queue for deletion.
|
107
105
|
def clear_queue(queue_name)
|
108
|
-
|
109
|
-
request = generate_request("DELETE", url)
|
110
|
-
request.execute()
|
106
|
+
execute :delete, "#{queue_name}/messages", {}, :x_ms_version => '2009-09-19'
|
111
107
|
end
|
112
108
|
end
|
113
109
|
end
|
@@ -19,7 +19,7 @@ module WAZ
|
|
19
19
|
def generate_request(verb, url, headers = {}, payload = nil)
|
20
20
|
http_headers = {}
|
21
21
|
headers.each{ |k, v| http_headers[k.to_s.gsub(/_/, '-')] = v} unless headers.nil?
|
22
|
-
request = RestClient::Request.new(:method => verb.downcase.to_sym, :url => url, :headers => http_headers, :payload => payload)
|
22
|
+
request = RestClient::Request.new(:method => verb.to_s.downcase.to_sym, :url => url, :headers => http_headers, :payload => payload)
|
23
23
|
request.headers["x-ms-Date"] = Time.new.httpdate
|
24
24
|
request.headers["Content-Length"] = (request.payload or "").length
|
25
25
|
request.headers["Authorization"] = "SharedKey #{account_name}:#{generate_signature(request)}"
|
@@ -56,15 +56,53 @@ module WAZ
|
|
56
56
|
# the canonicalized header line and the canonical form of the message, all of the joined by \n character. Encoded with
|
57
57
|
# Base64 and encrypted with SHA256 using the access_key as the seed.
|
58
58
|
def generate_signature(request)
|
59
|
-
|
59
|
+
return generate_signature20090919(request) if request.headers["x-ms-version"] == "2009-09-19"
|
60
|
+
signature = request.method.to_s.upcase + "\x0A" +
|
60
61
|
(request.headers["Content-MD5"] or "") + "\x0A" +
|
61
62
|
(request.headers["Content-Type"] or "") + "\x0A" +
|
62
63
|
(request.headers["Date"] or "")+ "\x0A" +
|
63
64
|
canonicalize_headers(request.headers) + "\x0A" +
|
64
65
|
canonicalize_message(request.url)
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
return Base64.encode64(HMAC::SHA256.new(Base64.decode64(self.access_key)).update(signature.toutf8).digest)
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def generate_signature20090919(request)
|
72
|
+
signature = request.method.to_s.upcase + "\x0A" +
|
73
|
+
(request.headers["Content-Encoding"] or "") + "\x0A" +
|
74
|
+
(request.headers["Content-Language"] or "") + "\x0A" +
|
75
|
+
(request.headers["Content-Length"] or "").to_s + "\x0A" +
|
76
|
+
(request.headers["Content-MD5"] or "") + "\x0A" +
|
77
|
+
(request.headers["Content-Type"] or "") + "\x0A" +
|
78
|
+
(request.headers["Date"] or "")+ "\x0A" +
|
79
|
+
(request.headers["If-Modified-Since"] or "")+ "\x0A" +
|
80
|
+
(request.headers["If-Match"] or "")+ "\x0A" +
|
81
|
+
(request.headers["If-None-Match"] or "")+ "\x0A" +
|
82
|
+
(request.headers["If-Unmodified-Since"] or "")+ "\x0A" +
|
83
|
+
(request.headers["Range"] or "")+ "\x0A" +
|
84
|
+
canonicalize_headers(request.headers) + "\x0A" +
|
85
|
+
canonicalize_message20090919(request.url)
|
86
|
+
|
87
|
+
return Base64.encode64(HMAC::SHA256.new(Base64.decode64(self.access_key)).update(signature.toutf8).digest)
|
88
|
+
end
|
89
|
+
|
90
|
+
def canonicalize_message20090919(url)
|
91
|
+
uri_component = url.gsub(/https?:\/\/[^\/]+\//i, '').gsub(/\?.*/i, '')
|
92
|
+
query_component = (url.scan(/\?(.*)/i).first() or []).first()
|
93
|
+
query_component = query_component.downcase.split('&').sort{|a, b| a <=> b}.map{ |p| p.split('=').join(':') }.join("\n") if query_component
|
94
|
+
canonicalized_message = "/#{self.account_name}/#{uri_component}"
|
95
|
+
canonicalized_message << "\n#{query_component}" if query_component
|
96
|
+
return canonicalized_message
|
97
|
+
end
|
98
|
+
|
99
|
+
# Generates a Windows Azure Storage call, it internally calls url generation method
|
100
|
+
# and the request generation message.
|
101
|
+
def execute(verb, path, query = {}, headers = {}, payload = nil)
|
102
|
+
url = generate_request_uri(path, query)
|
103
|
+
request = generate_request(verb, url, headers, payload)
|
104
|
+
request.execute()
|
105
|
+
end
|
68
106
|
end
|
69
107
|
end
|
70
108
|
end
|
@@ -21,5 +21,13 @@ module WAZ
|
|
21
21
|
super("You should establish connection before using the services, the connection configuration is required.")
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
# This exception if raised when the value given for an argument doesn't fall into the permitted values. For example
|
26
|
+
# if values on the blocklisttype aren't [all|uncommitted|committed]
|
27
|
+
class InvalidParameterValue < StorageException
|
28
|
+
def initialize(args = {})
|
29
|
+
super("The value supplied for the parameter #{args[:name]} is invalid. Permitted values are #{args[:values].join(',')}")
|
30
|
+
end
|
31
|
+
end
|
24
32
|
end
|
25
33
|
end
|
data/lib/waz/storage/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: waz-storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johnny G. Halife
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-30 00:00:00 -03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|