bucket_client 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.gitlab-ci.yml +70 -0
- data/.idea/bucket_client.iml +105 -0
- data/.idea/encodings.xml +4 -0
- data/.idea/misc.xml +7 -0
- data/.idea/modules.xml +8 -0
- data/.idea/runConfigurations/Integration_Test.xml +37 -0
- data/.idea/runConfigurations/Unit_Test.xml +37 -0
- data/.rspec +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +114 -0
- data/LICENSE.txt +21 -0
- data/README.md +870 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bucket_client.gemspec +46 -0
- data/integration/aws_blob_spec.rb +134 -0
- data/integration/aws_bucket_spec.rb +145 -0
- data/integration/azure_blob_spec.rb +132 -0
- data/integration/azure_bucket_spec.rb +132 -0
- data/integration/dev_blob_spec.rb +131 -0
- data/integration/dev_bucket_spec.rb +140 -0
- data/integration/do_blob_spec.rb +134 -0
- data/integration/do_bucket_spec.rb +144 -0
- data/integration/gcp_blob_spec.rb +132 -0
- data/integration/gcp_bucket_spec.rb +132 -0
- data/integration/img.jpg +0 -0
- data/lib/bucket_client.rb +66 -0
- data/lib/bucket_client/aws/aws_bucket.rb +85 -0
- data/lib/bucket_client/aws/aws_client.rb +195 -0
- data/lib/bucket_client/aws/aws_http_client.rb +32 -0
- data/lib/bucket_client/aws/aws_policy_factory.rb +26 -0
- data/lib/bucket_client/aws4_request_signer.rb +133 -0
- data/lib/bucket_client/azure/azure_bucket.rb +83 -0
- data/lib/bucket_client/azure/azure_client.rb +197 -0
- data/lib/bucket_client/bucket.rb +388 -0
- data/lib/bucket_client/bucket_operation_exception.rb +8 -0
- data/lib/bucket_client/client.rb +408 -0
- data/lib/bucket_client/dev/local_bucket.rb +84 -0
- data/lib/bucket_client/dev/local_client.rb +148 -0
- data/lib/bucket_client/digital_ocean/digital_ocean_acl_factory.rb +39 -0
- data/lib/bucket_client/digital_ocean/digital_ocean_bucket.rb +81 -0
- data/lib/bucket_client/digital_ocean/digital_ocean_client.rb +275 -0
- data/lib/bucket_client/digital_ocean/digital_ocean_http_client.rb +31 -0
- data/lib/bucket_client/gcp/gcp_bucket.rb +79 -0
- data/lib/bucket_client/gcp/gcp_client.rb +171 -0
- data/lib/bucket_client/operation_result.rb +33 -0
- data/lib/bucket_client/version.rb +3 -0
- metadata +246 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
module BucketClient
|
2
|
+
class DigitalOceanHttpClient
|
3
|
+
# @param [Client::AWS4RequestSigner] signer aws4 signer
|
4
|
+
# @param [String] region region of the service
|
5
|
+
# @param [KirinHttp::Client] http Http client to send http Message
|
6
|
+
def initialize(signer, region, http)
|
7
|
+
@signer = signer
|
8
|
+
@region = region
|
9
|
+
@http = http
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [Symbol] method
|
13
|
+
# @param [String] endpoint
|
14
|
+
# @param [Object] content
|
15
|
+
# @param [String] type
|
16
|
+
# @param [String] accept
|
17
|
+
# @param [Hash] headers
|
18
|
+
# @return [KirinHttp::Response]
|
19
|
+
def query(method, endpoint, content = nil, type = "application/xml", accept = nil, headers = {})
|
20
|
+
accept = type if accept.nil?
|
21
|
+
header = {
|
22
|
+
"Content-Type": type,
|
23
|
+
"Accept": accept
|
24
|
+
}.merge(headers)
|
25
|
+
message = KirinHttp::Message.new(endpoint, method, content, header)
|
26
|
+
message = @signer.sign message, "s3", @region
|
27
|
+
@http.send message
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module BucketClient
|
2
|
+
class GCPBucket < Bucket
|
3
|
+
attr_reader :key
|
4
|
+
|
5
|
+
# @param [GCPClient] parent
|
6
|
+
# @param [String] key
|
7
|
+
def initialize(parent, key)
|
8
|
+
@bucket_client = parent
|
9
|
+
@key = key
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_uri(key)
|
13
|
+
"https://storage.googleapis.com/#{@key}/#{key}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_blob_with_uri(uri)
|
17
|
+
@bucket_client.get_blob uri
|
18
|
+
end
|
19
|
+
|
20
|
+
def exist_blob_with_uri(uri)
|
21
|
+
@bucket_client.exist_blob(uri)
|
22
|
+
end
|
23
|
+
|
24
|
+
def put_blob_with_uri(payload, uri)
|
25
|
+
@bucket_client.put_blob payload, uri
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_blob_with_uri(payload, uri)
|
29
|
+
exist = exist_blob_with_uri uri
|
30
|
+
if exist
|
31
|
+
put_blob_with_uri payload, uri
|
32
|
+
else
|
33
|
+
OperationResult.new false, "Blob does not exist", nil, 400
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_blob_with_uri(uri)
|
38
|
+
@bucket_client.delete_blob(uri)
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_blob_if_exist_with_uri(uri)
|
42
|
+
@bucket_client.delete_blob_if_exist(uri)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_blob(key)
|
46
|
+
get_blob_with_uri(get_uri key)
|
47
|
+
end
|
48
|
+
|
49
|
+
def exist_blob(key)
|
50
|
+
exist_blob_with_uri(get_uri key)
|
51
|
+
end
|
52
|
+
|
53
|
+
def put_blob(payload, key)
|
54
|
+
put_blob_with_uri(payload, get_uri(key))
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_blob(payload, key)
|
58
|
+
exist = exist_blob key
|
59
|
+
if exist
|
60
|
+
OperationResult.new false, "Blob already exist", nil, 400
|
61
|
+
else
|
62
|
+
put_blob payload, key
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_blob(payload, key)
|
67
|
+
update_blob_with_uri(payload, get_uri(key))
|
68
|
+
end
|
69
|
+
|
70
|
+
def delete_blob(key)
|
71
|
+
delete_blob_with_uri(get_uri key)
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete_blob_if_exist(key)
|
75
|
+
delete_blob_if_exist_with_uri(get_uri key)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require "google/cloud/storage"
|
2
|
+
require "mimemagic"
|
3
|
+
require "bucket_client/operation_result"
|
4
|
+
require "bucket_client/gcp/gcp_bucket"
|
5
|
+
|
6
|
+
module BucketClient
|
7
|
+
class GCPClient < Client
|
8
|
+
def initialize(project_id, secret)
|
9
|
+
@client = Google::Cloud::Storage.new(project_id: project_id, keyfile: secret)
|
10
|
+
end
|
11
|
+
|
12
|
+
def exist_bucket(key)
|
13
|
+
!@client.bucket(key).nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_bucket!(key)
|
17
|
+
GCPBucket.new(self, key)
|
18
|
+
end
|
19
|
+
|
20
|
+
def put_bucket(key)
|
21
|
+
exist = exist_bucket key
|
22
|
+
if exist
|
23
|
+
bucket = get_bucket! key
|
24
|
+
OperationResult.new(true, "OK", bucket, 200)
|
25
|
+
else
|
26
|
+
create_bucket key
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_bucket(key)
|
31
|
+
begin
|
32
|
+
@client.create_bucket key
|
33
|
+
bucket = get_bucket! key
|
34
|
+
OperationResult.new(true, "OK", bucket, 200)
|
35
|
+
rescue StandardError => e
|
36
|
+
OperationResult.new(false, e.message, nil, 400)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_bucket(key)
|
41
|
+
exist = exist_bucket key
|
42
|
+
if exist
|
43
|
+
bucket = @client.bucket(key)
|
44
|
+
success = bucket.delete
|
45
|
+
message = success ? "Deleted" : "Failed to delete"
|
46
|
+
code = success ? 204 : 400
|
47
|
+
OperationResult.new(success, message, nil, code)
|
48
|
+
else
|
49
|
+
OperationResult.new(false, "Bucket does not exist", nil, 404)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete_bucket_if_exist(key)
|
54
|
+
exist = exist_bucket key
|
55
|
+
if exist
|
56
|
+
delete_bucket key
|
57
|
+
else
|
58
|
+
OperationResult.new(true, "Bucket already deleted", nil, 200)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_read_policy(key, access)
|
63
|
+
raise ArgumentError.new("Read Policy not accepted") if access != :public && access != :private
|
64
|
+
begin
|
65
|
+
bucket = @client.bucket key
|
66
|
+
modify_acl bucket, access
|
67
|
+
bucket.files.each do |file|
|
68
|
+
modify_acl file, access
|
69
|
+
end
|
70
|
+
OperationResult.new(true, "OK", nil, 200)
|
71
|
+
rescue StandardError => e
|
72
|
+
OperationResult.new(false, e.message, nil, 400)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def set_get_cors(key, cors)
|
77
|
+
begin
|
78
|
+
|
79
|
+
bucket = @client.bucket key
|
80
|
+
bucket.cors(&:clear)
|
81
|
+
bucket.cors {|rules| rules.add_rule cors, "GET"}
|
82
|
+
OperationResult.new(true, "OK", nil, 200)
|
83
|
+
rescue StandardError => e
|
84
|
+
OperationResult.new(false, e.message, nil, 400)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_blob(uri)
|
89
|
+
data = break_uri uri
|
90
|
+
begin
|
91
|
+
bucket = @client.bucket data[:bucket]
|
92
|
+
blob = bucket.file data[:blob]
|
93
|
+
bin = blob.download.read
|
94
|
+
OperationResult.new(true, "OK", bin, 200)
|
95
|
+
rescue StandardError => e
|
96
|
+
OperationResult.new(false, e.message, nil, 400)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def exist_blob(uri)
|
101
|
+
data = break_uri uri
|
102
|
+
bucket = @client.bucket data[:bucket]
|
103
|
+
bucket.file(data[:blob], skip_lookup: true).exists?
|
104
|
+
end
|
105
|
+
|
106
|
+
def put_blob(payload, uri)
|
107
|
+
mime = MimeMagic.by_magic payload
|
108
|
+
data = break_uri uri
|
109
|
+
begin
|
110
|
+
# @type [Google::Cloud::Storage::Bucket]
|
111
|
+
bucket = @client.bucket data[:bucket]
|
112
|
+
f = StringIO.new
|
113
|
+
f << payload
|
114
|
+
file = bucket.create_file f, data[:blob], cache_control: "no-cache", content_type: mime.type
|
115
|
+
OperationResult.new(true, "OK", file.public_url, 200)
|
116
|
+
rescue StandardError => e
|
117
|
+
OperationResult.new(false, e.message, nil, 400)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def update_blob(payload, uri)
|
122
|
+
exist = exist_blob uri
|
123
|
+
if exist
|
124
|
+
put_blob payload, uri
|
125
|
+
else
|
126
|
+
OperationResult.new(false, "Blob does not exist", nil, 404)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def delete_blob_if_exist(uri)
|
131
|
+
exist = exist_blob uri
|
132
|
+
if exist
|
133
|
+
delete_blob uri
|
134
|
+
else
|
135
|
+
OperationResult.new(true, "Blob already deleted", nil, 204)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def delete_blob(uri)
|
140
|
+
data = break_uri uri
|
141
|
+
begin
|
142
|
+
bucket = @client.bucket data[:bucket]
|
143
|
+
bucket.file(data[:blob], skip_lookup: true).delete
|
144
|
+
OperationResult.new(true, "Deleted Blob", nil, 204)
|
145
|
+
rescue StandardError => e
|
146
|
+
OperationResult.new(false, e.message, nil, 400)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
|
152
|
+
def break_uri(uri)
|
153
|
+
url = Addressable::URI.parse uri
|
154
|
+
fragments = url.path.split("/").select {|x| !x.nil? && !x.empty?}
|
155
|
+
bucket = fragments[0]
|
156
|
+
blob = fragments.drop(1).join "/"
|
157
|
+
{bucket: bucket, blob: blob}
|
158
|
+
end
|
159
|
+
|
160
|
+
def modify_acl(principal, access)
|
161
|
+
if access == :private
|
162
|
+
principal.acl.private!
|
163
|
+
principal.default_acl.private!
|
164
|
+
else
|
165
|
+
principal.acl.public!
|
166
|
+
principal.default_acl.public!
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class OperationResult
|
2
|
+
|
3
|
+
def initialize(success, message, value, code)
|
4
|
+
@success = success
|
5
|
+
@message = message
|
6
|
+
@value = value
|
7
|
+
@code = code
|
8
|
+
end
|
9
|
+
|
10
|
+
# Message from the server of the operation. Failure message will be here too
|
11
|
+
# @return [String]
|
12
|
+
def message
|
13
|
+
@message
|
14
|
+
end
|
15
|
+
|
16
|
+
# HTTP Status code of the operation.
|
17
|
+
# @return [Integer]
|
18
|
+
def code
|
19
|
+
@code
|
20
|
+
end
|
21
|
+
|
22
|
+
# Whether the operation was successful
|
23
|
+
# @return [Boolean]
|
24
|
+
def success
|
25
|
+
@success
|
26
|
+
end
|
27
|
+
|
28
|
+
# Value of the operation result if it has a value.
|
29
|
+
# Can be uri or byte array
|
30
|
+
def value
|
31
|
+
@value
|
32
|
+
end
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bucket_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- kirinnee
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-03-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: kirin_http
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mimemagic
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ox
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: azure-storage-blob
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: addressable
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.5'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.5'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: google-cloud-storage
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.17'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.17'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.17'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.17'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '10.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '3.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: dotenv
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: |-
|
154
|
+
Bucket Client is a ruby gem that allows programmers to interact with popular Blob Storage cloud
|
155
|
+
services. This intends to act as a layer of abstraction, much like ORM is to databases.
|
156
|
+
|
157
|
+
With this, you may easily change the blob storage provider or even defer them.
|
158
|
+
|
159
|
+
The supported cloud storage include:
|
160
|
+
- Google Cloud Platform Cloud Storage
|
161
|
+
- Amazon Web Service S3 Bucket
|
162
|
+
- Digital Ocean Spaces
|
163
|
+
- Azure Blob Storage (Microsoft).
|
164
|
+
email:
|
165
|
+
- kirinnee97@gmail.com
|
166
|
+
executables: []
|
167
|
+
extensions: []
|
168
|
+
extra_rdoc_files: []
|
169
|
+
files:
|
170
|
+
- ".env"
|
171
|
+
- ".gitignore"
|
172
|
+
- ".gitlab-ci.yml"
|
173
|
+
- ".idea/bucket_client.iml"
|
174
|
+
- ".idea/encodings.xml"
|
175
|
+
- ".idea/misc.xml"
|
176
|
+
- ".idea/modules.xml"
|
177
|
+
- ".idea/runConfigurations/Integration_Test.xml"
|
178
|
+
- ".idea/runConfigurations/Unit_Test.xml"
|
179
|
+
- ".idea/vcs.xml"
|
180
|
+
- ".rspec"
|
181
|
+
- CODE_OF_CONDUCT.md
|
182
|
+
- Gemfile
|
183
|
+
- Gemfile.lock
|
184
|
+
- LICENSE.txt
|
185
|
+
- README.md
|
186
|
+
- Rakefile
|
187
|
+
- bin/console
|
188
|
+
- bin/setup
|
189
|
+
- bucket_client.gemspec
|
190
|
+
- integration/aws_blob_spec.rb
|
191
|
+
- integration/aws_bucket_spec.rb
|
192
|
+
- integration/azure_blob_spec.rb
|
193
|
+
- integration/azure_bucket_spec.rb
|
194
|
+
- integration/dev_blob_spec.rb
|
195
|
+
- integration/dev_bucket_spec.rb
|
196
|
+
- integration/do_blob_spec.rb
|
197
|
+
- integration/do_bucket_spec.rb
|
198
|
+
- integration/gcp_blob_spec.rb
|
199
|
+
- integration/gcp_bucket_spec.rb
|
200
|
+
- integration/img.jpg
|
201
|
+
- lib/bucket_client.rb
|
202
|
+
- lib/bucket_client/aws/aws_bucket.rb
|
203
|
+
- lib/bucket_client/aws/aws_client.rb
|
204
|
+
- lib/bucket_client/aws/aws_http_client.rb
|
205
|
+
- lib/bucket_client/aws/aws_policy_factory.rb
|
206
|
+
- lib/bucket_client/aws4_request_signer.rb
|
207
|
+
- lib/bucket_client/azure/azure_bucket.rb
|
208
|
+
- lib/bucket_client/azure/azure_client.rb
|
209
|
+
- lib/bucket_client/bucket.rb
|
210
|
+
- lib/bucket_client/bucket_operation_exception.rb
|
211
|
+
- lib/bucket_client/client.rb
|
212
|
+
- lib/bucket_client/dev/local_bucket.rb
|
213
|
+
- lib/bucket_client/dev/local_client.rb
|
214
|
+
- lib/bucket_client/digital_ocean/digital_ocean_acl_factory.rb
|
215
|
+
- lib/bucket_client/digital_ocean/digital_ocean_bucket.rb
|
216
|
+
- lib/bucket_client/digital_ocean/digital_ocean_client.rb
|
217
|
+
- lib/bucket_client/digital_ocean/digital_ocean_http_client.rb
|
218
|
+
- lib/bucket_client/gcp/gcp_bucket.rb
|
219
|
+
- lib/bucket_client/gcp/gcp_client.rb
|
220
|
+
- lib/bucket_client/operation_result.rb
|
221
|
+
- lib/bucket_client/version.rb
|
222
|
+
homepage: https://gitlab.com/ruby-gem/bucket_client
|
223
|
+
licenses:
|
224
|
+
- MIT
|
225
|
+
metadata: {}
|
226
|
+
post_install_message:
|
227
|
+
rdoc_options: []
|
228
|
+
require_paths:
|
229
|
+
- lib
|
230
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
231
|
+
requirements:
|
232
|
+
- - ">="
|
233
|
+
- !ruby/object:Gem::Version
|
234
|
+
version: '0'
|
235
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
236
|
+
requirements:
|
237
|
+
- - ">="
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
240
|
+
requirements: []
|
241
|
+
rubygems_version: 3.0.1
|
242
|
+
signing_key:
|
243
|
+
specification_version: 4
|
244
|
+
summary: A gem that allows for ruby code to interact with cloud blob storage such
|
245
|
+
as AWS S3, GCP Cloud Storage and Azure Blob Storage
|
246
|
+
test_files: []
|