azure-storage-blob 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,323 @@
1
+ # frozen_string_literal: true
2
+
3
+ #-------------------------------------------------------------------------
4
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
5
+ #
6
+ # The MIT License(MIT)
7
+
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files(the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions :
14
+
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #--------------------------------------------------------------------------
26
+ require "base64"
27
+
28
+ module Azure::Storage
29
+ module Blob
30
+ module Serialization
31
+ include Azure::Storage::Common::Service::Serialization
32
+
33
+ def self.container_enumeration_results_from_xml(xml)
34
+ xml = slopify(xml)
35
+ expect_node("EnumerationResults", xml)
36
+
37
+ results = enumeration_results_from_xml(xml, Azure::Storage::Common::Service::EnumerationResults.new)
38
+
39
+ return results unless (xml > "Containers").any? && ((xml > "Containers") > "Container").any?
40
+
41
+ if xml.Containers.Container.count == 0
42
+ results.push(container_from_xml(xml.Containers.Container))
43
+ else
44
+ xml.Containers.Container.each { |container_node|
45
+ results.push(container_from_xml(container_node))
46
+ }
47
+ end
48
+
49
+ results
50
+ end
51
+
52
+ def self.container_from_xml(xml)
53
+ xml = slopify(xml)
54
+ expect_node("Container", xml)
55
+
56
+ Container::Container.new do |container|
57
+ container.name = xml.Name.text if (xml > "Name").any?
58
+ container.properties = container_properties_from_xml(xml.Properties) if (xml > "Properties").any?
59
+ container.metadata = metadata_from_xml(xml.Metadata) if (xml > "Metadata").any?
60
+ container.public_access_level = public_access_level_from_properties_xml(xml.Properties) if (xml > "Properties").any?
61
+ end
62
+ end
63
+
64
+ def self.container_from_headers(headers)
65
+ Container::Container.new do |container|
66
+ container.properties = container_properties_from_headers(headers)
67
+ container.public_access_level = public_access_level_from_headers(headers)
68
+ container.metadata = metadata_from_headers(headers)
69
+ end
70
+ end
71
+
72
+ def self.container_properties_from_xml(xml)
73
+ xml = slopify(xml)
74
+ expect_node("Properties", xml)
75
+
76
+ props = {}
77
+
78
+ props[:last_modified] = (xml > "Last-Modified").text if (xml > "Last-Modified").any?
79
+ props[:etag] = xml.Etag.text if (xml > "Etag").any?
80
+ props[:lease_status] = xml.LeaseStatus.text if (xml > "LeaseStatus").any?
81
+ props[:lease_state] = xml.LeaseState.text if (xml > "LeaseState").any?
82
+ props[:lease_duration] = xml.LeaseDuration.text if (xml > "LeaseDuration").any?
83
+
84
+ props
85
+ end
86
+
87
+ def self.container_properties_from_headers(headers)
88
+ props = {}
89
+
90
+ props[:last_modified] = headers["Last-Modified"]
91
+ props[:etag] = headers["Etag"]
92
+ props[:lease_status] = headers["x-ms-lease-status"]
93
+ props[:lease_state] = headers["x-ms-lease-state"]
94
+ props[:lease_duration] = headers["x-ms-lease-duration"]
95
+
96
+ props
97
+ end
98
+
99
+ def self.public_access_level_from_headers(headers)
100
+ headers["x-ms-blob-public-access"]
101
+ end
102
+
103
+ def self.public_access_level_from_properties_xml(xml)
104
+ (xml > "PublicAccess").any? ? xml.PublicAccess.text : nil
105
+ end
106
+
107
+ def self.blob_enumeration_results_from_xml(xml)
108
+ xml = slopify(xml)
109
+ expect_node("EnumerationResults", xml)
110
+
111
+ results = enumeration_results_from_xml(xml, Azure::Storage::Common::Service::EnumerationResults.new)
112
+
113
+ return results unless (xml > "Blobs").any?
114
+
115
+ if ((xml > "Blobs") > "Blob").any?
116
+ if xml.Blobs.Blob.count == 0
117
+ results.push(blob_from_xml(xml.Blobs.Blob))
118
+ else
119
+ xml.Blobs.Blob.each { |blob_node|
120
+ results.push(blob_from_xml(blob_node))
121
+ }
122
+ end
123
+ end
124
+
125
+ if ((xml > "Blobs") > "BlobPrefix").any?
126
+ if xml.Blobs.BlobPrefix.count == 0
127
+ results.push(blob_prefix_from_xml(xml.Blobs.BlobPrefix))
128
+ else
129
+ xml.Blobs.BlobPrefix.each { |blob_prefix|
130
+ results.push(blob_prefix_from_xml(blob_prefix))
131
+ }
132
+ end
133
+ end
134
+
135
+ results
136
+ end
137
+
138
+ def self.blob_prefix_from_xml(xml)
139
+ xml = slopify(xml)
140
+ expect_node("BlobPrefix", xml)
141
+
142
+ name = xml.Name.text if (xml > "Name").any?
143
+ name
144
+ end
145
+
146
+ def self.blob_from_xml(xml)
147
+ xml = slopify(xml)
148
+ expect_node("Blob", xml)
149
+
150
+ Blob.new do |blob|
151
+ blob.name = xml.Name.text if (xml > "Name").any?
152
+ blob.snapshot = xml.Snapshot.text if (xml > "Snapshot").any?
153
+
154
+ blob.metadata = metadata_from_xml(xml.Metadata) if (xml > "Metadata").any?
155
+ if (xml > "Properties").any?
156
+ blob.properties = blob_properties_from_xml(xml.Properties)
157
+ blob.encrypted = xml.Properties.ServerEncrypted.text == "true" if (xml.Properties > "ServerEncrypted").any?
158
+ end
159
+ end
160
+ end
161
+
162
+ def self.blob_from_headers(headers)
163
+ Blob.new do |blob|
164
+ blob.properties = blob_properties_from_headers(headers)
165
+ blob.metadata = metadata_from_headers(headers)
166
+ blob.encrypted = headers[Azure::Storage::Common::HeaderConstants::REQUEST_SERVER_ENCRYPTED] || headers[Azure::Storage::Common::HeaderConstants::SERVER_ENCRYPTED]
167
+ blob.encrypted = blob.encrypted.to_s == "true" unless blob.encrypted.nil?
168
+ end
169
+ end
170
+
171
+ def self.blob_properties_from_xml(xml)
172
+ xml = slopify(xml)
173
+ expect_node("Properties", xml)
174
+
175
+ props = {}
176
+
177
+ props[:last_modified] = (xml > "Last-Modified").text if (xml > "Last-Modified").any?
178
+ props[:etag] = xml.Etag.text if (xml > "Etag").any?
179
+ props[:lease_status] = xml.LeaseStatus.text if (xml > "LeaseStatus").any?
180
+ props[:lease_state] = xml.LeaseState.text if (xml > "LeaseState").any?
181
+ props[:lease_duration] = xml.LeaseDuration.text if (xml > "LeaseDuration").any?
182
+ props[:content_length] = (xml > "Content-Length").text.to_i if (xml > "Content-Length").any?
183
+ props[:content_type] = (xml > "Content-Type").text if (xml > "Content-Type").any?
184
+ props[:content_encoding] = (xml > "Content-Encoding").text if (xml > "Content-Encoding").any?
185
+ props[:content_language] = (xml > "Content-Language").text if (xml > "Content-Language").any?
186
+ props[:content_md5] = (xml > "Content-MD5").text if (xml > "Content-MD5").any?
187
+
188
+ props[:cache_control] = (xml > "Cache-Control").text if (xml > "Cache-Control").any?
189
+ props[:sequence_number] = (xml > "x-ms-blob-sequence-number").text.to_i if (xml > "x-ms-blob-sequence-number").any?
190
+ props[:blob_type] = xml.BlobType.text if (xml > "BlobType").any?
191
+ props[:copy_id] = xml.CopyId.text if (xml > "CopyId").any?
192
+ props[:copy_status] = xml.CopyStatus.text if (xml > "CopyStatus").any?
193
+ props[:copy_source] = xml.CopySource.text if (xml > "CopySource").any?
194
+ props[:copy_progress] = xml.CopyProgress.text if (xml > "CopyProgress").any?
195
+ props[:copy_completion_time] = xml.CopyCompletionTime.text if (xml > "CopyCompletionTime").any?
196
+ props[:copy_status_description] = xml.CopyStatusDescription.text if (xml > "CopyStatusDescription").any?
197
+ props[:incremental_copy] = xml.IncrementalCopy.text == "true" if (xml > "IncrementalCopy").any?
198
+
199
+ props
200
+ end
201
+
202
+ def self.blob_properties_from_headers(headers)
203
+ props = {}
204
+
205
+ props[:last_modified] = headers["Last-Modified"]
206
+ props[:etag] = headers["Etag"]
207
+ props[:lease_status] = headers["x-ms-lease-status"]
208
+ props[:lease_state] = headers["x-ms-lease-state"]
209
+ props[:lease_duration] = headers["x-ms-lease-duration"]
210
+
211
+ props[:content_length] = headers["x-ms-blob-content-length"] || headers["Content-Length"]
212
+ props[:content_length] = props[:content_length].to_i if props[:content_length]
213
+
214
+ props[:content_type] = headers["x-ms-blob-content-type"] || headers["Content-Type"]
215
+ props[:content_encoding] = headers["x-ms-blob-content-encoding"] || headers["Content-Encoding"]
216
+ props[:content_language] = headers["x-ms-blob-content-language"] || headers["Content-Language"]
217
+ props[:content_disposition] = headers["x-ms-blob-content-disposition"] || headers["Content-Disposition"]
218
+ props[:content_md5] = headers["x-ms-blob-content-md5"] || headers["Content-MD5"]
219
+ props[:range_md5] = headers["Content-MD5"] if headers["x-ms-blob-content-md5"] && headers["Content-MD5"]
220
+
221
+ props[:cache_control] = headers["x-ms-blob-cache-control"] || headers["Cache-Control"]
222
+ props[:sequence_number] = headers["x-ms-blob-sequence-number"].to_i if headers["x-ms-blob-sequence-number"]
223
+ props[:blob_type] = headers["x-ms-blob-type"]
224
+
225
+ props[:copy_id] = headers["x-ms-copy-id"]
226
+ props[:copy_status] = headers["x-ms-copy-status"]
227
+ props[:copy_source] = headers["x-ms-copy-source"]
228
+ props[:copy_progress] = headers["x-ms-copy-progress"]
229
+ props[:copy_completion_time] = headers["x-ms-copy-completion-time"]
230
+ props[:copy_status_description] = headers["x-ms-copy-status-description"]
231
+
232
+ props[:accept_ranges] = headers["Accept-Ranges"].to_i if headers["Accept-Ranges"]
233
+
234
+ props[:append_offset] = headers["x-ms-blob-append-offset"].to_i if headers["x-ms-blob-append-offset"]
235
+ props[:committed_count] = headers["x-ms-blob-committed-block-count"].to_i if headers["x-ms-blob-committed-block-count"]
236
+ props[:incremental_copy] = headers["x-ms-incremental-copy"].to_s == "true" if headers["x-ms-incremental-copy"]
237
+
238
+ props
239
+ end
240
+
241
+ def self.block_list_to_xml(block_list)
242
+ builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
243
+ xml.BlockList {
244
+ block_list.each { |block|
245
+ encoded_id = Base64.strict_encode64(block[0])
246
+ case block[1]
247
+ when :uncommitted
248
+ xml.Uncommitted encoded_id
249
+ when :committed
250
+ xml.Committed encoded_id
251
+ else
252
+ xml.Latest encoded_id
253
+ end
254
+ }
255
+ }
256
+ end
257
+ builder.to_xml
258
+ end
259
+
260
+ def self.block_list_from_xml(xml)
261
+ xml = slopify(xml)
262
+ expect_node("BlockList", xml)
263
+
264
+ block_list = {
265
+ committed: [],
266
+ uncommitted: []
267
+ }
268
+
269
+ if ((xml > "CommittedBlocks") > "Block").any?
270
+ if xml.CommittedBlocks.Block.count == 0
271
+ add_block(:committed, xml.CommittedBlocks.Block, block_list)
272
+ else
273
+ xml.CommittedBlocks.Block.each { |block_node|
274
+ add_block(:committed, block_node, block_list)
275
+ }
276
+ end
277
+ end
278
+
279
+ return block_list unless (xml > "UncommittedBlocks")
280
+
281
+ if ((xml > "UncommittedBlocks") > "Block").any?
282
+ if xml.UncommittedBlocks.Block.count == 0
283
+ add_block(:uncommitted, xml.UncommittedBlocks.Block, block_list)
284
+ else
285
+ xml.UncommittedBlocks.Block.each { |block_node|
286
+ add_block(:uncommitted, block_node, block_list)
287
+ }
288
+ end
289
+ end
290
+
291
+ block_list
292
+ end
293
+
294
+ def self.add_block(type, block_node, block_list)
295
+ block = Block.new do |b|
296
+ b.name = Base64.strict_decode64(block_node.Name.text) if (block_node > "Name").any?
297
+ b.size = block_node.Size.text.to_i if (block_node > "Size").any?
298
+ b.type = type
299
+ end
300
+ block_list[type].push block
301
+ end
302
+
303
+ def self.page_list_from_xml(xml)
304
+ xml = slopify(xml)
305
+ expect_node("PageList", xml)
306
+
307
+ page_list = []
308
+
309
+ return page_list unless (xml > "PageRange").any?
310
+
311
+ if xml.PageRange.count == 0
312
+ page_list.push [xml.PageRange.Start.text.to_i, xml.PageRange.End.text.to_i]
313
+ else
314
+ xml.PageRange.each { |page_range|
315
+ page_list.push [page_range.Start.text.to_i, page_range.End.text.to_i]
316
+ }
317
+ end
318
+
319
+ page_list
320
+ end
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ #-------------------------------------------------------------------------
4
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
5
+ #
6
+ # The MIT License(MIT)
7
+
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files(the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions :
14
+
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #--------------------------------------------------------------------------
26
+
27
+ module Azure
28
+ module Storage
29
+ module Blob
30
+ class Version
31
+ # Fields represent the parts defined in http://semver.org/
32
+ MAJOR = 1 unless defined? MAJOR
33
+ MINOR = 0 unless defined? MINOR
34
+ UPDATE = 0 unless defined? UPDATE
35
+
36
+ class << self
37
+ # @return [String]
38
+ def to_s
39
+ [MAJOR, MINOR, UPDATE].compact.join(".")
40
+ end
41
+
42
+ def to_uas
43
+ [MAJOR, MINOR, UPDATE].join(".")
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: azure-storage-blob
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Microsoft Corporation
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: azure-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.13
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.13
27
+ - !ruby/object:Gem::Dependency
28
+ name: azure-storage-common
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.6.8
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.6'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.6.8
61
+ - !ruby/object:Gem::Dependency
62
+ name: dotenv
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: minitest
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '5'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '5'
89
+ - !ruby/object:Gem::Dependency
90
+ name: minitest-reporters
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1'
103
+ - !ruby/object:Gem::Dependency
104
+ name: mocha
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '10.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '10.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: timecop
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.7'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.7'
145
+ - !ruby/object:Gem::Dependency
146
+ name: yard
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.9'
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.9.11
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '0.9'
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 0.9.11
165
+ description: Microsoft Azure Storage Blob Client Library for Ruby
166
+ email: ascl@microsoft.com
167
+ executables: []
168
+ extensions: []
169
+ extra_rdoc_files: []
170
+ files:
171
+ - blob/lib/azure/storage/blob.rb
172
+ - blob/lib/azure/storage/blob/append.rb
173
+ - blob/lib/azure/storage/blob/autoload.rb
174
+ - blob/lib/azure/storage/blob/blob.rb
175
+ - blob/lib/azure/storage/blob/blob_service.rb
176
+ - blob/lib/azure/storage/blob/block.rb
177
+ - blob/lib/azure/storage/blob/container.rb
178
+ - blob/lib/azure/storage/blob/default.rb
179
+ - blob/lib/azure/storage/blob/page.rb
180
+ - blob/lib/azure/storage/blob/serialization.rb
181
+ - blob/lib/azure/storage/blob/version.rb
182
+ homepage: http://github.com/azure/azure-storage-ruby
183
+ licenses:
184
+ - MIT
185
+ metadata: {}
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 1.9.3
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubyforge_project:
202
+ rubygems_version: 2.5.1
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: Official Ruby client library to consume Azure Storage Blob service
206
+ test_files: []