azure-blob 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -2
- data/README.md +42 -16
- data/Rakefile +14 -0
- data/azure-blob.gemspec +2 -2
- data/lib/active_storage/service/azure_blob_service.rb +3 -3
- data/lib/azure_blob/blob.rb +7 -0
- data/lib/azure_blob/blob_list.rb +18 -0
- data/lib/azure_blob/block_list.rb +3 -1
- data/lib/azure_blob/canonicalized_headers.rb +1 -1
- data/lib/azure_blob/canonicalized_resource.rb +1 -1
- data/lib/azure_blob/client.rb +119 -2
- data/lib/azure_blob/http.rb +1 -1
- data/lib/azure_blob/metadata.rb +1 -1
- data/lib/azure_blob/signer.rb +4 -4
- data/lib/azure_blob/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7eab2543de0e2e4663211095fd459507761bf270038308464723270506f63ac5
|
4
|
+
data.tar.gz: 1c0b7016bf21df9c1134be50eb2555f14f9f4b76e9a8664e70e003cee5b04208
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f03e61001c0c41ed31661116d5f7ed5d5f95f91e8ded26d40aa72d446119e835c281d852904e00b02f68fd536d0451e4e71401410ab41ec68f7ff97fb030a88
|
7
|
+
data.tar.gz: b0b1beb93ad7b3950bddb41dfb6e04354e08b46e29f5f3db5d474ddd4964cd09d65776a1f57625d103d1e56e9a0d235579372c74a867fa2080beabcfc757395f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
## [0.
|
3
|
+
## [0.4.2] 2024-06-06
|
4
4
|
|
5
|
-
|
5
|
+
Documentation
|
6
|
+
|
7
|
+
## [0.4.1] 2024-05-27
|
8
|
+
|
9
|
+
First working release.
|
10
|
+
|
11
|
+
- Re-implemented the required parts of the azure-storage-blob API to make Active Storage work.
|
12
|
+
- Extracted the AzureStorage adapter from Rails.
|
data/README.md
CHANGED
@@ -2,9 +2,45 @@
|
|
2
2
|
|
3
3
|
This gem was built to replace azure-storage-blob (deprecated) in Active Storage, but was written to be Rails agnostic.
|
4
4
|
|
5
|
+
## Active Storage
|
6
|
+
|
7
|
+
## Migration
|
8
|
+
To migrate from azure-storage-blob to azure-blob:
|
9
|
+
|
10
|
+
1. Replace `azure-storage-blob` in your Gemfile with `azure-blob`
|
11
|
+
2. Run `bundle install`
|
12
|
+
3. Change the `AzureStorage` service to `AzureBlob` in your Active Storage config (`config/storage.yml`)
|
13
|
+
4. Restart or deploy the app.
|
14
|
+
|
15
|
+
|
16
|
+
## Standalone
|
17
|
+
|
18
|
+
Instantiate a client with your account name, an access key and the container name:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
client = AzureBlob::Client.new(
|
22
|
+
account_name: @account_name,
|
23
|
+
access_key: @access_key,
|
24
|
+
container: @container,
|
25
|
+
)
|
26
|
+
|
27
|
+
path = "some/new/file"
|
28
|
+
|
29
|
+
# Upload
|
30
|
+
client.create_block_blob(path, "Hello world!")
|
31
|
+
|
32
|
+
# Download
|
33
|
+
client.get_blob(path) #=> "Hello world!"
|
34
|
+
|
35
|
+
# Delete
|
36
|
+
client.delete_blob(path)
|
37
|
+
```
|
38
|
+
|
39
|
+
For the full list of methods: https://www.rubydoc.info/gems/azure-blob/AzureBlob/Client
|
40
|
+
|
5
41
|
## Contributing
|
6
42
|
|
7
|
-
###
|
43
|
+
### Dev environment
|
8
44
|
|
9
45
|
Ensure your version of Ruby fit the minimum version in `azure-blob.gemspec`
|
10
46
|
|
@@ -19,24 +55,14 @@ and setup those Env variables:
|
|
19
55
|
A dev environment setup is also supplied through Nix with [devenv](https://devenv.sh/).
|
20
56
|
|
21
57
|
To use the Nix environment:
|
22
|
-
1
|
23
|
-
2
|
24
|
-
3
|
25
|
-
4
|
58
|
+
1. install [devenv](https://devenv.sh/)
|
59
|
+
2. Copy `devenv.local.nix.example` to `devenv.local.nix`
|
60
|
+
3. Insert your azure credentials into `devenv.local.nix`
|
61
|
+
4. Start the shell with `devenv shell` or with [direnv](https://direnv.net/).
|
26
62
|
|
27
63
|
### Tests
|
28
64
|
|
29
|
-
`bin/rake test
|
30
|
-
|
31
|
-
# Active Storage
|
32
|
-
|
33
|
-
## Migration
|
34
|
-
To migrate from azure-storage-blob to azure-blob:
|
35
|
-
|
36
|
-
1- Replace `azure-storage-blob` in your Gemfile with `azure-blob`
|
37
|
-
2- Run `bundle install`
|
38
|
-
3- change the `AzureStorage` service to `AzureBlob` in your Active Storage config (`config/storage.yml`)
|
39
|
-
4- Restart or deploy the app.
|
65
|
+
`bin/rake test`
|
40
66
|
|
41
67
|
## License
|
42
68
|
|
data/Rakefile
CHANGED
@@ -2,7 +2,21 @@
|
|
2
2
|
|
3
3
|
require "bundler/gem_tasks"
|
4
4
|
require "minitest/test_task"
|
5
|
+
require 'azure_blob'
|
5
6
|
|
6
7
|
Minitest::TestTask.create
|
7
8
|
|
8
9
|
task default: %i[test]
|
10
|
+
|
11
|
+
task :flush_test_container do |t|
|
12
|
+
AzureBlob::Client.new(
|
13
|
+
account_name: ENV["AZURE_ACCOUNT_NAME"],
|
14
|
+
access_key: ENV["AZURE_ACCESS_KEY"],
|
15
|
+
container: ENV["AZURE_PRIVATE_CONTAINER"],
|
16
|
+
).delete_prefix ''
|
17
|
+
AzureBlob::Client.new(
|
18
|
+
account_name: ENV["AZURE_ACCOUNT_NAME"],
|
19
|
+
access_key: ENV["AZURE_ACCESS_KEY"],
|
20
|
+
container: ENV["AZURE_PUBLIC_CONTAINER"],
|
21
|
+
).delete_prefix ''
|
22
|
+
end
|
data/azure-blob.gemspec
CHANGED
@@ -9,13 +9,13 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = [ "joe@dupuis.io" ]
|
10
10
|
|
11
11
|
spec.summary = "Azure blob client"
|
12
|
-
spec.homepage = "https://github.com/
|
12
|
+
spec.homepage = "https://github.com/testdouble/azure-blob"
|
13
13
|
spec.license = "MIT"
|
14
14
|
spec.required_ruby_version = ">= 3.1"
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
17
|
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
-
spec.metadata["changelog_uri"] = "https://github.com/
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/testdouble/azure-blob/blob/main/CHANGELOG.md"
|
19
19
|
|
20
20
|
spec.add_dependency "rexml"
|
21
21
|
|
@@ -25,13 +25,13 @@
|
|
25
25
|
require "active_support/core_ext/numeric/bytes"
|
26
26
|
require "active_storage/service"
|
27
27
|
|
28
|
-
require
|
28
|
+
require "azure_blob"
|
29
29
|
|
30
30
|
module ActiveStorage
|
31
|
-
# = Active Storage \Azure
|
31
|
+
# = Active Storage \Azure Blob \Service
|
32
32
|
#
|
33
33
|
# Wraps the Microsoft Azure Storage Blob Service as an Active Storage service.
|
34
|
-
# See ActiveStorage::Service for
|
34
|
+
# See {ActiveStorage::Service}[https://api.rubyonrails.org/classes/ActiveStorage/Service.html] for more details.
|
35
35
|
class Service::AzureBlobService < Service
|
36
36
|
attr_reader :client, :container, :signer
|
37
37
|
|
data/lib/azure_blob/blob.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module AzureBlob
|
4
|
+
# AzureBlob::Blob holds the metada for a given Blob.
|
4
5
|
class Blob
|
6
|
+
# You should not instanciate this object directly,
|
7
|
+
# but obtain one when calling relevant methods of AzureBlob::Client.
|
8
|
+
#
|
9
|
+
# Expects a Net::HTTPResponse object from a
|
10
|
+
# HEAD or GET request to a blob uri.
|
5
11
|
def initialize(response)
|
6
12
|
@response = response
|
7
13
|
end
|
@@ -26,6 +32,7 @@ module AzureBlob
|
|
26
32
|
response.code == "200"
|
27
33
|
end
|
28
34
|
|
35
|
+
# Returns the custom Azure metada tagged on the blob.
|
29
36
|
def metadata
|
30
37
|
@metadata || response
|
31
38
|
.to_hash
|
data/lib/azure_blob/blob_list.rb
CHANGED
@@ -3,10 +3,28 @@
|
|
3
3
|
require "rexml"
|
4
4
|
|
5
5
|
module AzureBlob
|
6
|
+
# Enumerator class to lazily iterate over a list of Blob keys.
|
6
7
|
class BlobList
|
7
8
|
include REXML
|
8
9
|
include Enumerable
|
9
10
|
|
11
|
+
# You should not instanciate this object directly,
|
12
|
+
# but obtain one when calling relevant methods of AzureBlob::Client.
|
13
|
+
#
|
14
|
+
# Expects a callable object that takes an Azure API page marker as an
|
15
|
+
# argument and returns the raw body response of a call to the list blob endpoint.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# fetcher = ->(marker) do
|
20
|
+
# uri.query = URI.encode_www_form(
|
21
|
+
# marker: marker,
|
22
|
+
# ...
|
23
|
+
# )
|
24
|
+
# response = Http.new(uri, signer:).get
|
25
|
+
# end
|
26
|
+
# AzureBlob::BlobList.new(fetcher)
|
27
|
+
#
|
10
28
|
def initialize(fetcher)
|
11
29
|
@fetcher = fetcher
|
12
30
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "cgi"
|
2
2
|
|
3
3
|
module AzureBlob
|
4
|
-
class CanonicalizedResource
|
4
|
+
class CanonicalizedResource # :nodoc:
|
5
5
|
def initialize(uri, account_name, service_name: nil, url_safe: true)
|
6
6
|
# This next line is needed because CanonicalizedResource
|
7
7
|
# need to be escaped for auhthorization headers, but not SAS tokens
|
data/lib/azure_blob/client.rb
CHANGED
@@ -9,6 +9,8 @@ require "time"
|
|
9
9
|
require "base64"
|
10
10
|
|
11
11
|
module AzureBlob
|
12
|
+
# AzureBlob Client class. You interact with the Azure Blob api
|
13
|
+
# through an instance of this class.
|
12
14
|
class Client
|
13
15
|
def initialize(account_name:, access_key:, container:)
|
14
16
|
@account_name = account_name
|
@@ -16,6 +18,27 @@ module AzureBlob
|
|
16
18
|
@signer = Signer.new(account_name:, access_key:)
|
17
19
|
end
|
18
20
|
|
21
|
+
# Create a blob of type block. Will automatically split the the blob in multiple block and send the blob in pieces (blocks) if the blob is too big.
|
22
|
+
#
|
23
|
+
# When the blob is small enough this method will send the blob through {Put Blob}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob]
|
24
|
+
#
|
25
|
+
# If the blob is too big, the blob is split in blocks sent through a series of {Put Block}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-block] requests
|
26
|
+
# followed by a {Put Block List}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-list] to commit the block list.
|
27
|
+
#
|
28
|
+
# Takes a key (path), the content (String or IO object), and options.
|
29
|
+
#
|
30
|
+
# Options:
|
31
|
+
#
|
32
|
+
# [+:content_type+]
|
33
|
+
# Will be saved on the blob in Azure.
|
34
|
+
# [+:content_disposition+]
|
35
|
+
# Will be saved on the blob in Azure.
|
36
|
+
# [+:content_md5+]
|
37
|
+
# Will ensure integrity of the upload. The checksum must be a base64 digest. Can be produced with +OpenSSL::Digest::MD5.base64digest+.
|
38
|
+
# The checksum is only checked on a single upload! To verify checksum when uploading multiple blocks, call directly put_blob_block with
|
39
|
+
# a checksum for each block, then commit the blocks with commit_blob_blocks.
|
40
|
+
# [+:block_size+]
|
41
|
+
# Block size in bytes, can be used to force the method to split the upload in smaller chunk. Defaults to +AzureBlob::DEFAULT_BLOCK_SIZE+ and cannot be bigger than +AzureBlob::MAX_UPLOAD_SIZE+
|
19
42
|
def create_block_blob(key, content, options = {})
|
20
43
|
if content.size > (options[:block_size] || DEFAULT_BLOCK_SIZE)
|
21
44
|
put_blob_multiple(key, content, **options)
|
@@ -24,6 +47,18 @@ module AzureBlob
|
|
24
47
|
end
|
25
48
|
end
|
26
49
|
|
50
|
+
# Returns the full or partial content of the blob
|
51
|
+
#
|
52
|
+
# Calls to the {Get Blob}[https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob] endpoint.
|
53
|
+
#
|
54
|
+
# Takes a key (path) and options.
|
55
|
+
#
|
56
|
+
# Options:
|
57
|
+
#
|
58
|
+
# [+:start+]
|
59
|
+
# Starting point in bytes
|
60
|
+
# [+:end+]
|
61
|
+
# Ending point in bytes
|
27
62
|
def get_blob(key, options = {})
|
28
63
|
uri = generate_uri("#{container}/#{key}")
|
29
64
|
|
@@ -34,6 +69,15 @@ module AzureBlob
|
|
34
69
|
Http.new(uri, headers, signer:).get
|
35
70
|
end
|
36
71
|
|
72
|
+
# Delete a blob
|
73
|
+
#
|
74
|
+
# Calls to {Delete Blob}[https://learn.microsoft.com/en-us/rest/api/storageservices/delete-blob]
|
75
|
+
#
|
76
|
+
# Takes a key (path) and options.
|
77
|
+
#
|
78
|
+
# Options:
|
79
|
+
# [+:delete_snapshots+]
|
80
|
+
# Sets the value of the x-ms-delete-snapshots header. Default to +include+
|
37
81
|
def delete_blob(key, options = {})
|
38
82
|
uri = generate_uri("#{container}/#{key}")
|
39
83
|
|
@@ -44,11 +88,28 @@ module AzureBlob
|
|
44
88
|
Http.new(uri, headers, signer:).delete
|
45
89
|
end
|
46
90
|
|
91
|
+
# Delete all blobs prefixed by the given prefix.
|
92
|
+
#
|
93
|
+
# Calls to {List blobs}[https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs]
|
94
|
+
# followed to a series of calls to {Delete Blob}[https://learn.microsoft.com/en-us/rest/api/storageservices/delete-blob]
|
95
|
+
#
|
96
|
+
# Takes a prefix and options
|
97
|
+
#
|
98
|
+
# Look delete_blob for the list of options.
|
47
99
|
def delete_prefix(prefix, options = {})
|
48
100
|
results = list_blobs(prefix:)
|
49
101
|
results.each { |key| delete_blob(key) }
|
50
102
|
end
|
51
103
|
|
104
|
+
# Returns a BlobList containing a list of keys (paths)
|
105
|
+
#
|
106
|
+
# Calls to {List blobs}[https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs]
|
107
|
+
#
|
108
|
+
# Options:
|
109
|
+
# [+:prefix+]
|
110
|
+
# Prefix of the blobs to be listed. Defaults to listing everything in the container.
|
111
|
+
# [:+max_results+]
|
112
|
+
# Maximum number of results to return per page.
|
52
113
|
def list_blobs(options = {})
|
53
114
|
uri = generate_uri(container)
|
54
115
|
query = {
|
@@ -69,6 +130,11 @@ module AzureBlob
|
|
69
130
|
BlobList.new(fetcher)
|
70
131
|
end
|
71
132
|
|
133
|
+
# Returns a Blob object without the content.
|
134
|
+
#
|
135
|
+
# Calls to {Get Blob Properties}[https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-properties]
|
136
|
+
#
|
137
|
+
# This can be used to see if the blob exist or obtain metada such as content type, disposition, checksum or Azure custom metadata.
|
72
138
|
def get_blob_properties(key, options = {})
|
73
139
|
uri = generate_uri("#{container}/#{key}")
|
74
140
|
|
@@ -77,16 +143,37 @@ module AzureBlob
|
|
77
143
|
Blob.new(response)
|
78
144
|
end
|
79
145
|
|
146
|
+
# Return a URI object to a resource in the container. Takes a path.
|
147
|
+
#
|
148
|
+
# Example: +generate_uri("#{container}/#{key}")+
|
80
149
|
def generate_uri(path)
|
81
150
|
URI.parse(URI::DEFAULT_PARSER.escape(File.join(host, path)))
|
82
151
|
end
|
83
152
|
|
153
|
+
# Returns an SAS signed URI
|
154
|
+
#
|
155
|
+
# Takes a
|
156
|
+
# - key (path)
|
157
|
+
# - A permission string (+"r"+, +"rw"+)
|
158
|
+
# - expiry as a UTC iso8601 time string
|
159
|
+
# - options
|
84
160
|
def signed_uri(key, permissions:, expiry:, **options)
|
85
161
|
uri = generate_uri("#{container}/#{key}")
|
86
162
|
uri.query = signer.sas_token(uri, permissions:, expiry:, **options)
|
87
163
|
uri
|
88
164
|
end
|
89
165
|
|
166
|
+
# Creates a Blob of type append.
|
167
|
+
#
|
168
|
+
# Calls to {Put Blob}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob]
|
169
|
+
#
|
170
|
+
# You are expected to append blocks to the blob with append_blob_block after creating the blob.
|
171
|
+
# Options:
|
172
|
+
#
|
173
|
+
# [+:content_type+]
|
174
|
+
# Will be saved on the blob in Azure.
|
175
|
+
# [+:content_disposition+]
|
176
|
+
# Will be saved on the blob in Azure.
|
90
177
|
def create_append_blob(key, options = {})
|
91
178
|
uri = generate_uri("#{container}/#{key}")
|
92
179
|
|
@@ -101,6 +188,15 @@ module AzureBlob
|
|
101
188
|
Http.new(uri, headers, metadata: options[:metadata], signer:).put(nil)
|
102
189
|
end
|
103
190
|
|
191
|
+
# Append a block to an Append Blob
|
192
|
+
#
|
193
|
+
# Calls to {Append Block}[https://learn.microsoft.com/en-us/rest/api/storageservices/append-block]
|
194
|
+
#
|
195
|
+
# Options:
|
196
|
+
#
|
197
|
+
# [+:content_md5+]
|
198
|
+
# Will ensure integrity of the upload. The checksum must be a base64 digest. Can be produced with +OpenSSL::Digest::MD5.base64digest+.
|
199
|
+
# The checksum must be the checksum of the block not the blob.
|
104
200
|
def append_blob_block(key, content, options = {})
|
105
201
|
uri = generate_uri("#{container}/#{key}")
|
106
202
|
uri.query = URI.encode_www_form(comp: "appendblock")
|
@@ -114,6 +210,16 @@ module AzureBlob
|
|
114
210
|
Http.new(uri, headers, signer:).put(content)
|
115
211
|
end
|
116
212
|
|
213
|
+
# Uploads a block to a blob.
|
214
|
+
#
|
215
|
+
# Calls to {Put Block}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-block]
|
216
|
+
#
|
217
|
+
# Returns the id of the block. Required to commit the list of blocks to a blob.
|
218
|
+
#
|
219
|
+
# Options:
|
220
|
+
#
|
221
|
+
# [+:content_md5+]
|
222
|
+
# Must be the checksum for the block not the blob. The checksum must be a base64 digest. Can be produced with +OpenSSL::Digest::MD5.base64digest+.
|
117
223
|
def put_blob_block(key, index, content, options = {})
|
118
224
|
block_id = generate_block_id(index)
|
119
225
|
uri = generate_uri("#{container}/#{key}")
|
@@ -130,6 +236,17 @@ module AzureBlob
|
|
130
236
|
block_id
|
131
237
|
end
|
132
238
|
|
239
|
+
# Commits the list of blocks to a blob.
|
240
|
+
#
|
241
|
+
# Calls to {Put Block List}[https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-list]
|
242
|
+
#
|
243
|
+
# Takes a key (path) and an array of block ids
|
244
|
+
#
|
245
|
+
# Options:
|
246
|
+
#
|
247
|
+
# [+:content_md5+]
|
248
|
+
# This is the checksum for the whole blob. The checksum is saved on the blob, but it is not validated!
|
249
|
+
# Add a checksum for each block if you want Azure to validate integrity.
|
133
250
|
def commit_blob_blocks(key, block_ids, options = {})
|
134
251
|
block_list = BlockList.new(block_ids)
|
135
252
|
content = block_list.to_s
|
@@ -139,7 +256,7 @@ module AzureBlob
|
|
139
256
|
headers = {
|
140
257
|
"Content-Length": content.size,
|
141
258
|
"Content-Type": options[:content_type],
|
142
|
-
"
|
259
|
+
"x-ms-blob-content-md5": options[:content_md5],
|
143
260
|
"x-ms-blob-content-disposition": options[:content_disposition],
|
144
261
|
}
|
145
262
|
|
@@ -171,7 +288,7 @@ module AzureBlob
|
|
171
288
|
"x-ms-blob-type": "BlockBlob",
|
172
289
|
"Content-Length": content.size,
|
173
290
|
"Content-Type": options[:content_type],
|
174
|
-
"
|
291
|
+
"x-ms-blob-content-md5": options[:content_md5],
|
175
292
|
"x-ms-blob-content-disposition": options[:content_disposition],
|
176
293
|
}
|
177
294
|
|
data/lib/azure_blob/http.rb
CHANGED
data/lib/azure_blob/metadata.rb
CHANGED
data/lib/azure_blob/signer.rb
CHANGED
@@ -6,7 +6,7 @@ require_relative "canonicalized_headers"
|
|
6
6
|
require_relative "canonicalized_resource"
|
7
7
|
|
8
8
|
module AzureBlob
|
9
|
-
class Signer
|
9
|
+
class Signer # :nodoc:
|
10
10
|
def initialize(account_name:, access_key:)
|
11
11
|
@account_name = account_name
|
12
12
|
@access_key = Base64.decode64(access_key)
|
@@ -83,9 +83,9 @@ module AzureBlob
|
|
83
83
|
headers
|
84
84
|
end
|
85
85
|
|
86
|
-
module SAS
|
86
|
+
module SAS # :nodoc:
|
87
87
|
Version = "2024-05-04"
|
88
|
-
module Fields
|
88
|
+
module Fields # :nodoc:
|
89
89
|
Permissions = :sp
|
90
90
|
Version = :sv
|
91
91
|
Expiry = :se
|
@@ -94,7 +94,7 @@ module AzureBlob
|
|
94
94
|
Disposition = :rscd
|
95
95
|
Type = :rsct
|
96
96
|
end
|
97
|
-
module Resources
|
97
|
+
module Resources # :nodoc:
|
98
98
|
Blob = :b
|
99
99
|
end
|
100
100
|
end
|
data/lib/azure_blob/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: azure-blob
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joé Dupuis
|
@@ -57,13 +57,13 @@ files:
|
|
57
57
|
- lib/azure_blob/metadata.rb
|
58
58
|
- lib/azure_blob/signer.rb
|
59
59
|
- lib/azure_blob/version.rb
|
60
|
-
homepage: https://github.com/
|
60
|
+
homepage: https://github.com/testdouble/azure-blob
|
61
61
|
licenses:
|
62
62
|
- MIT
|
63
63
|
metadata:
|
64
|
-
homepage_uri: https://github.com/
|
65
|
-
source_code_uri: https://github.com/
|
66
|
-
changelog_uri: https://github.com/
|
64
|
+
homepage_uri: https://github.com/testdouble/azure-blob
|
65
|
+
source_code_uri: https://github.com/testdouble/azure-blob
|
66
|
+
changelog_uri: https://github.com/testdouble/azure-blob/blob/main/CHANGELOG.md
|
67
67
|
post_install_message:
|
68
68
|
rdoc_options: []
|
69
69
|
require_paths:
|