tumugi-plugin-google_cloud_storage 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -7
- data/CHANGELOG.md +37 -0
- data/lib/tumugi/plugin/google_cloud_storage/atomic_file.rb +3 -3
- data/lib/tumugi/plugin/google_cloud_storage/file_system.rb +46 -33
- data/lib/tumugi/plugin/target/google_cloud_storage_file.rb +2 -2
- data/tumugi-plugin-google_cloud_storage.gemspec +2 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d867db4d8e41e26c1aeccc2ae435882def2eaedf
|
4
|
+
data.tar.gz: 1e1a67c26142bf89ffb1c2c2f3b8c571031f835e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f167627c6079a672936b132ef4980b2d0d0db217d47c67e956a7a2b0b3f5714b6f8f10978ec848539bfc60205ad6f4d37870a7752573482c2d1d6125af939c1
|
7
|
+
data.tar.gz: 8e9f630ce8bfbd0c12ca2061e0593122e251bbed638b04ff2a1e0559f691c7b1dce2ec8021681062a4bc4b953422c1e81a0d29d1ca319c907a09763b3ace2501
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [0.2.0](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/tree/0.2.0) (2016-06-06)
|
4
|
+
[Full Changelog](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/compare/v0.1.0...0.2.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Change tumugi dependency version [\#14](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/14) ([hakobera](https://github.com/hakobera))
|
9
|
+
- Support custom filesystem for GoogleCloudStorageFileTarget [\#11](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/11) ([hakobera](https://github.com/hakobera))
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Remove unneeded log [\#16](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/16) ([hakobera](https://github.com/hakobera))
|
14
|
+
- Prepare release for 0.2.0 [\#15](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/15) ([hakobera](https://github.com/hakobera))
|
15
|
+
- Change test directory [\#13](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/13) ([hakobera](https://github.com/hakobera))
|
16
|
+
- Change ruby version on travis [\#12](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/12) ([hakobera](https://github.com/hakobera))
|
17
|
+
|
18
|
+
## [v0.1.0](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/tree/v0.1.0) (2016-05-30)
|
19
|
+
**Closed issues:**
|
20
|
+
|
21
|
+
- Release v0.1.0 [\#8](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/issues/8)
|
22
|
+
|
23
|
+
**Merged pull requests:**
|
24
|
+
|
25
|
+
- Preapre release for v0.1.0 [\#10](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/10) ([hakobera](https://github.com/hakobera))
|
26
|
+
- Support JSON private key file for authentication [\#9](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/9) ([hakobera](https://github.com/hakobera))
|
27
|
+
- Update README [\#7](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/7) ([hakobera](https://github.com/hakobera))
|
28
|
+
- Standardize Google API Call error handling [\#6](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/6) ([hakobera](https://github.com/hakobera))
|
29
|
+
- Fix railse\_if\_exist option not working when copy and move [\#5](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/5) ([hakobera](https://github.com/hakobera))
|
30
|
+
- Rename gem and namespace [\#4](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/4) ([hakobera](https://github.com/hakobera))
|
31
|
+
- Add tests [\#3](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/3) ([hakobera](https://github.com/hakobera))
|
32
|
+
- Update tumugi to v0.5.1 [\#2](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/2) ([hakobera](https://github.com/hakobera))
|
33
|
+
- Fix test failed on travis [\#1](https://github.com/tumugi/tumugi-plugin-google_cloud_storage/pull/1) ([hakobera](https://github.com/hakobera))
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
@@ -4,13 +4,13 @@ module Tumugi
|
|
4
4
|
module Plugin
|
5
5
|
module GoogleCloudStorage
|
6
6
|
class AtomicFile < Tumugi::AtomicFile
|
7
|
-
def initialize(path,
|
7
|
+
def initialize(path, fs)
|
8
8
|
super(path)
|
9
|
-
@
|
9
|
+
@fs = fs
|
10
10
|
end
|
11
11
|
|
12
12
|
def move_to_final_destination(temp_file)
|
13
|
-
@
|
13
|
+
@fs.upload(temp_file, path)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'json'
|
3
|
+
require 'googleauth/service_account'
|
3
4
|
require 'google/apis/storage_v1'
|
5
|
+
require 'google/apis/drive_v3'
|
4
6
|
require 'tumugi/file_system'
|
5
7
|
|
6
8
|
module Tumugi
|
@@ -10,7 +12,7 @@ module Tumugi
|
|
10
12
|
attr_reader :client
|
11
13
|
|
12
14
|
def initialize(config)
|
13
|
-
|
15
|
+
save_config(config)
|
14
16
|
end
|
15
17
|
|
16
18
|
#######################################################################
|
@@ -33,16 +35,16 @@ module Tumugi
|
|
33
35
|
raise Tumugi::FileSystemError.new("Cannot delete root of bucket at path '#{path}'") if root?(key)
|
34
36
|
|
35
37
|
if obj_exist?(bucket, key)
|
36
|
-
|
38
|
+
client.delete_object(bucket, key, options: request_options)
|
37
39
|
wait_until { !obj_exist?(bucket, key) }
|
38
40
|
true
|
39
41
|
elsif directory?(path)
|
40
42
|
raise Tumugi::FileSystemError.new("Path '#{path}' is a directory. Must use recursive delete") if !recursive
|
41
43
|
|
42
44
|
objs = entries(path).map(&:name)
|
43
|
-
|
45
|
+
client.batch do |client|
|
44
46
|
objs.each do |obj|
|
45
|
-
client.delete_object(bucket, obj)
|
47
|
+
client.delete_object(bucket, obj, options: request_options)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
wait_until { !directory?(path) }
|
@@ -80,7 +82,7 @@ module Tumugi
|
|
80
82
|
true
|
81
83
|
else
|
82
84
|
# Any objects with this prefix
|
83
|
-
objects =
|
85
|
+
objects = client.list_objects(bucket, prefix: obj, max_results: 20, options: request_options)
|
84
86
|
!!(objects.items && objects.items.size > 0)
|
85
87
|
end
|
86
88
|
end
|
@@ -95,7 +97,7 @@ module Tumugi
|
|
95
97
|
next_page_token = ''
|
96
98
|
|
97
99
|
until next_page_token.nil?
|
98
|
-
objects =
|
100
|
+
objects = client.list_objects(bucket, prefix: obj, page_token: next_page_token, options: request_options)
|
99
101
|
if objects && objects.items
|
100
102
|
results.concat(objects.items)
|
101
103
|
next_page_token = objects.next_page_token
|
@@ -120,7 +122,7 @@ module Tumugi
|
|
120
122
|
def upload(media, path, content_type: nil)
|
121
123
|
bucket, key = path_to_bucket_and_key(path)
|
122
124
|
obj = Google::Apis::StorageV1::Object.new(bucket: bucket, name: key)
|
123
|
-
|
125
|
+
client.insert_object(bucket, obj, upload_source: media, content_type: content_type, options: request_options)
|
124
126
|
wait_until { obj_exist?(bucket, key) }
|
125
127
|
rescue
|
126
128
|
process_error($!)
|
@@ -131,7 +133,7 @@ module Tumugi
|
|
131
133
|
if download_path.nil?
|
132
134
|
download_path = Tempfile.new('tumugi_gcs_file_system').path
|
133
135
|
end
|
134
|
-
|
136
|
+
client.get_object(bucket, key, download_dest: download_path, options: request_options)
|
135
137
|
wait_until { File.exist?(download_path) }
|
136
138
|
|
137
139
|
if block_given?
|
@@ -164,13 +166,13 @@ module Tumugi
|
|
164
166
|
copied_objs = []
|
165
167
|
entries(src_path).each do |entry|
|
166
168
|
suffix = entry.name[src_prefix.length..-1]
|
167
|
-
|
168
|
-
dest_bucket, dest_prefix + suffix)
|
169
|
+
client.copy_object(src_bucket, src_prefix + suffix,
|
170
|
+
dest_bucket, dest_prefix + suffix, options: request_options)
|
169
171
|
copied_objs << (dest_prefix + suffix)
|
170
172
|
end
|
171
173
|
wait_until { copied_objs.all? {|obj| obj_exist?(dest_bucket, obj)} }
|
172
174
|
else
|
173
|
-
|
175
|
+
client.copy_object(src_bucket, src_key, dest_bucket, dest_key, options: request_options)
|
174
176
|
wait_until { obj_exist?(dest_bucket, dest_key) }
|
175
177
|
end
|
176
178
|
rescue
|
@@ -186,7 +188,7 @@ module Tumugi
|
|
186
188
|
def create_bucket(bucket)
|
187
189
|
unless bucket_exist?(bucket)
|
188
190
|
b = Google::Apis::StorageV1::Bucket.new(name: bucket)
|
189
|
-
|
191
|
+
client.insert_bucket(@project_id, b, options: request_options)
|
190
192
|
true
|
191
193
|
else
|
192
194
|
false
|
@@ -197,7 +199,7 @@ module Tumugi
|
|
197
199
|
|
198
200
|
def remove_bucket(bucket)
|
199
201
|
if bucket_exist?(bucket)
|
200
|
-
|
202
|
+
client.delete_bucket(bucket, options: request_options)
|
201
203
|
true
|
202
204
|
else
|
203
205
|
false
|
@@ -207,7 +209,7 @@ module Tumugi
|
|
207
209
|
end
|
208
210
|
|
209
211
|
def bucket_exist?(bucket)
|
210
|
-
|
212
|
+
client.get_bucket(bucket, options: request_options)
|
211
213
|
true
|
212
214
|
rescue => e
|
213
215
|
return false if e.status_code == 404
|
@@ -217,7 +219,7 @@ module Tumugi
|
|
217
219
|
private
|
218
220
|
|
219
221
|
def obj_exist?(bucket, key)
|
220
|
-
|
222
|
+
client.get_object(bucket, key, options: request_options)
|
221
223
|
true
|
222
224
|
rescue => e
|
223
225
|
return false if e.status_code == 404
|
@@ -236,7 +238,7 @@ module Tumugi
|
|
236
238
|
end
|
237
239
|
end
|
238
240
|
|
239
|
-
def
|
241
|
+
def save_config(config)
|
240
242
|
if config.private_key_file.nil?
|
241
243
|
@project_id = config.project_id
|
242
244
|
client_email = config.client_email
|
@@ -247,28 +249,39 @@ module Tumugi
|
|
247
249
|
client_email = json['client_email']
|
248
250
|
private_key = json['private_key']
|
249
251
|
end
|
252
|
+
@key = {
|
253
|
+
client_email: client_email,
|
254
|
+
private_key: private_key
|
255
|
+
}
|
256
|
+
end
|
257
|
+
|
258
|
+
def client
|
259
|
+
return @cached_client if @cached_client && @cached_client_expiration > Time.now
|
250
260
|
|
251
|
-
|
252
|
-
scope =
|
253
|
-
|
254
|
-
if client_email and private_key
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
signing_key: OpenSSL::PKey.read(private_key))
|
261
|
-
# MEMO: signet-0.6.1 depend on Farady.default_connection
|
262
|
-
Faraday.default_connection.options.timeout = 60
|
263
|
-
auth.fetch_access_token!
|
261
|
+
client = Google::Apis::StorageV1::StorageService.new
|
262
|
+
scope = Google::Apis::StorageV1::AUTH_DEVSTORAGE_READ_WRITE
|
263
|
+
|
264
|
+
if @key[:client_email] and @key[:private_key]
|
265
|
+
options = {
|
266
|
+
json_key_io: StringIO.new(JSON.generate(@key)),
|
267
|
+
scope: scope
|
268
|
+
}
|
269
|
+
auth = Google::Auth::ServiceAccountCredentials.make_creds(options)
|
264
270
|
else
|
265
271
|
auth = Google::Auth.get_application_default([scope])
|
266
|
-
auth.fetch_access_token!
|
267
272
|
end
|
268
|
-
|
269
|
-
client = Google::Apis::StorageV1::StorageService.new
|
273
|
+
auth.fetch_access_token!
|
270
274
|
client.authorization = auth
|
271
|
-
|
275
|
+
|
276
|
+
@cached_client_expiration = Time.now + (auth.expires_in / 2)
|
277
|
+
@cached_client = client
|
278
|
+
end
|
279
|
+
|
280
|
+
def request_options
|
281
|
+
{
|
282
|
+
retries: 5,
|
283
|
+
timeout_sec: 60
|
284
|
+
}
|
272
285
|
end
|
273
286
|
|
274
287
|
def wait_until(&block)
|
@@ -12,11 +12,11 @@ module Tumugi
|
|
12
12
|
|
13
13
|
attr_reader :bucket, :key, :path
|
14
14
|
|
15
|
-
def initialize(bucket:, key:)
|
15
|
+
def initialize(bucket:, key:, fs: nil)
|
16
16
|
@bucket = bucket
|
17
17
|
@key = key
|
18
18
|
@path = "gs://#{File.join(bucket, key)}"
|
19
|
-
|
19
|
+
@fs = fs unless fs.nil?
|
20
20
|
end
|
21
21
|
|
22
22
|
def fs
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "tumugi-plugin-google_cloud_storage"
|
7
|
-
spec.version = "0.
|
7
|
+
spec.version = "0.2.0"
|
8
8
|
spec.authors = ["Kazuyuki Honda"]
|
9
9
|
spec.email = ["hakobera@gmail.com"]
|
10
10
|
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.required_ruby_version = '>= 2.1'
|
21
21
|
|
22
|
-
spec.add_runtime_dependency "tumugi", "
|
22
|
+
spec.add_runtime_dependency "tumugi", ">= 0.5.1"
|
23
23
|
spec.add_runtime_dependency "google-api-client", "~> 0.9.3"
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.11"
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tumugi-plugin-google_cloud_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuyuki Honda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tumugi
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.5.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.5.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -131,6 +131,7 @@ extra_rdoc_files: []
|
|
131
131
|
files:
|
132
132
|
- ".gitignore"
|
133
133
|
- ".travis.yml"
|
134
|
+
- CHANGELOG.md
|
134
135
|
- Gemfile
|
135
136
|
- README.md
|
136
137
|
- Rakefile
|