azure-storage-blob 1.0.0

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.
@@ -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: []