google-cloud-storage 1.29.1 → 1.32.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 +4 -4
- data/CHANGELOG.md +50 -0
- data/CONTRIBUTING.md +4 -5
- data/lib/google/cloud/storage/bucket.rb +242 -76
- data/lib/google/cloud/storage/bucket/acl.rb +12 -14
- data/lib/google/cloud/storage/bucket/cors.rb +4 -1
- data/lib/google/cloud/storage/bucket/lifecycle.rb +11 -11
- data/lib/google/cloud/storage/bucket/list.rb +3 -3
- data/lib/google/cloud/storage/credentials.rb +16 -14
- data/lib/google/cloud/storage/file.rb +223 -32
- data/lib/google/cloud/storage/file/acl.rb +181 -20
- data/lib/google/cloud/storage/file/list.rb +3 -3
- data/lib/google/cloud/storage/file/signer_v2.rb +2 -4
- data/lib/google/cloud/storage/file/signer_v4.rb +12 -10
- data/lib/google/cloud/storage/file/verifier.rb +2 -2
- data/lib/google/cloud/storage/hmac_key/list.rb +3 -3
- data/lib/google/cloud/storage/policy.rb +2 -2
- data/lib/google/cloud/storage/policy/binding.rb +5 -3
- data/lib/google/cloud/storage/policy/bindings.rb +2 -2
- data/lib/google/cloud/storage/policy/condition.rb +4 -2
- data/lib/google/cloud/storage/post_object.rb +2 -1
- data/lib/google/cloud/storage/project.rb +18 -6
- data/lib/google/cloud/storage/service.rb +193 -64
- data/lib/google/cloud/storage/version.rb +1 -1
- metadata +34 -14
@@ -212,8 +212,8 @@ module Google
|
|
212
212
|
def deep_dup
|
213
213
|
warn "DEPRECATED: Storage::PolicyV1#deep_dup"
|
214
214
|
dup.tap do |p|
|
215
|
-
roles_dup = p.roles.
|
216
|
-
|
215
|
+
roles_dup = p.roles.transform_values do |v|
|
216
|
+
v.dup rescue value
|
217
217
|
end
|
218
218
|
p.instance_variable_set :@roles, roles_dup
|
219
219
|
end
|
@@ -89,7 +89,9 @@ module Google
|
|
89
89
|
# end
|
90
90
|
#
|
91
91
|
class Binding
|
92
|
-
attr_reader :role
|
92
|
+
attr_reader :role
|
93
|
+
attr_reader :members
|
94
|
+
attr_reader :condition
|
93
95
|
|
94
96
|
##
|
95
97
|
# Creates a Binding object.
|
@@ -128,8 +130,8 @@ module Google
|
|
128
130
|
raise ArgumentError, "members is empty, must be provided" if @members.empty?
|
129
131
|
|
130
132
|
condition = Condition.new(**condition) if condition.is_a? Hash
|
131
|
-
if condition
|
132
|
-
raise ArgumentError, "expected Condition, not #{condition.inspect}"
|
133
|
+
if condition && !(condition.is_a? Condition)
|
134
|
+
raise ArgumentError, "expected Condition, not #{condition.inspect}"
|
133
135
|
end
|
134
136
|
@condition = condition
|
135
137
|
end
|
@@ -70,7 +70,9 @@ module Google
|
|
70
70
|
# end
|
71
71
|
#
|
72
72
|
class Condition
|
73
|
-
attr_reader :title
|
73
|
+
attr_reader :title
|
74
|
+
attr_reader :description
|
75
|
+
attr_reader :expression
|
74
76
|
|
75
77
|
##
|
76
78
|
# Creates a Condition object.
|
@@ -83,7 +85,7 @@ module Google
|
|
83
85
|
# one attributes, and statements are combined using logic operators,
|
84
86
|
# following CEL language specification. Required.
|
85
87
|
#
|
86
|
-
def initialize title:, description: nil
|
88
|
+
def initialize title:, expression:, description: nil
|
87
89
|
@title = String title
|
88
90
|
@description = String description
|
89
91
|
@expression = String expression
|
@@ -165,6 +165,11 @@ module Google
|
|
165
165
|
# without verifying the bucket resource exists on the Storage service.
|
166
166
|
# Calls made on this object will raise errors if the bucket resource
|
167
167
|
# does not exist. Default is `false`.
|
168
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
169
|
+
# on whether the bucket's current metageneration matches the given value.
|
170
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
171
|
+
# conditional on whether the bucket's current metageneration does not
|
172
|
+
# match the given value.
|
168
173
|
# @param [Boolean, String] user_project If this parameter is set to
|
169
174
|
# `true`, transit costs for operations on the requested bucket or a
|
170
175
|
# file it contains will be billed to the current project for this
|
@@ -208,12 +213,19 @@ module Google
|
|
208
213
|
# user_project: "my-other-project"
|
209
214
|
# files = bucket.files # Billed to "my-other-project"
|
210
215
|
#
|
211
|
-
def bucket bucket_name,
|
216
|
+
def bucket bucket_name,
|
217
|
+
skip_lookup: false,
|
218
|
+
if_metageneration_match: nil,
|
219
|
+
if_metageneration_not_match: nil,
|
220
|
+
user_project: nil
|
212
221
|
if skip_lookup
|
213
222
|
return Bucket.new_lazy bucket_name, service,
|
214
223
|
user_project: user_project
|
215
224
|
end
|
216
|
-
gapi = service.get_bucket bucket_name,
|
225
|
+
gapi = service.get_bucket bucket_name,
|
226
|
+
if_metageneration_match: if_metageneration_match,
|
227
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
228
|
+
user_project: user_project
|
217
229
|
Bucket.from_gapi gapi, service, user_project: user_project
|
218
230
|
rescue Google::Cloud::NotFoundError
|
219
231
|
nil
|
@@ -611,11 +623,11 @@ module Google
|
|
611
623
|
# scopes = ["https://www.googleapis.com/auth/iam"]
|
612
624
|
# iam_client.authorization = Google::Auth.get_application_default scopes
|
613
625
|
#
|
614
|
-
# request =
|
615
|
-
#
|
616
|
-
#
|
626
|
+
# request = Google::Apis::IamcredentialsV1::SignBlobRequest.new(
|
627
|
+
# payload: string_to_sign
|
628
|
+
# )
|
617
629
|
# resource = "projects/-/serviceAccounts/#{issuer}"
|
618
|
-
# response = iam_client.sign_service_account_blob resource, request
|
630
|
+
# response = iam_client.sign_service_account_blob resource, request
|
619
631
|
# response.signed_blob
|
620
632
|
# end
|
621
633
|
#
|
@@ -83,9 +83,14 @@ module Google
|
|
83
83
|
##
|
84
84
|
# Retrieves bucket by name.
|
85
85
|
# Returns Google::Apis::StorageV1::Bucket.
|
86
|
-
def get_bucket bucket_name,
|
86
|
+
def get_bucket bucket_name,
|
87
|
+
if_metageneration_match: nil,
|
88
|
+
if_metageneration_not_match: nil,
|
89
|
+
user_project: nil
|
87
90
|
execute do
|
88
91
|
service.get_bucket bucket_name,
|
92
|
+
if_metageneration_match: if_metageneration_match,
|
93
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
89
94
|
user_project: user_project(user_project)
|
90
95
|
end
|
91
96
|
end
|
@@ -106,26 +111,38 @@ module Google
|
|
106
111
|
|
107
112
|
##
|
108
113
|
# Updates a bucket, including its ACL metadata.
|
109
|
-
def patch_bucket bucket_name,
|
110
|
-
|
114
|
+
def patch_bucket bucket_name,
|
115
|
+
bucket_gapi = nil,
|
116
|
+
predefined_acl: nil,
|
117
|
+
predefined_default_acl: nil,
|
118
|
+
if_metageneration_match: nil,
|
119
|
+
if_metageneration_not_match: nil,
|
120
|
+
user_project: nil
|
111
121
|
bucket_gapi ||= Google::Apis::StorageV1::Bucket.new
|
112
122
|
bucket_gapi.acl = [] if predefined_acl
|
113
123
|
bucket_gapi.default_object_acl = [] if predefined_default_acl
|
114
124
|
|
115
125
|
execute do
|
116
|
-
service.patch_bucket
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
126
|
+
service.patch_bucket bucket_name,
|
127
|
+
bucket_gapi,
|
128
|
+
predefined_acl: predefined_acl,
|
129
|
+
predefined_default_object_acl: predefined_default_acl,
|
130
|
+
if_metageneration_match: if_metageneration_match,
|
131
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
132
|
+
user_project: user_project(user_project)
|
121
133
|
end
|
122
134
|
end
|
123
135
|
|
124
136
|
##
|
125
137
|
# Permanently deletes an empty bucket.
|
126
|
-
def delete_bucket bucket_name,
|
138
|
+
def delete_bucket bucket_name,
|
139
|
+
if_metageneration_match: nil,
|
140
|
+
if_metageneration_not_match: nil,
|
141
|
+
user_project: nil
|
127
142
|
execute do
|
128
143
|
service.delete_bucket bucket_name,
|
144
|
+
if_metageneration_match: if_metageneration_match,
|
145
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
129
146
|
user_project: user_project(user_project)
|
130
147
|
end
|
131
148
|
end
|
@@ -290,41 +307,83 @@ module Google
|
|
290
307
|
|
291
308
|
##
|
292
309
|
# Inserts a new file for the given bucket
|
293
|
-
def insert_file bucket_name,
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
310
|
+
def insert_file bucket_name,
|
311
|
+
source,
|
312
|
+
path = nil,
|
313
|
+
acl: nil,
|
314
|
+
cache_control: nil,
|
315
|
+
content_disposition: nil,
|
316
|
+
content_encoding: nil,
|
317
|
+
content_language: nil,
|
318
|
+
content_type: nil,
|
319
|
+
custom_time: nil,
|
320
|
+
crc32c: nil,
|
321
|
+
md5: nil,
|
322
|
+
metadata: nil,
|
323
|
+
storage_class: nil,
|
324
|
+
key: nil,
|
325
|
+
kms_key: nil,
|
326
|
+
temporary_hold: nil,
|
327
|
+
event_based_hold: nil,
|
328
|
+
if_generation_match: nil,
|
329
|
+
if_generation_not_match: nil,
|
330
|
+
if_metageneration_match: nil,
|
331
|
+
if_metageneration_not_match: nil,
|
299
332
|
user_project: nil
|
300
|
-
params =
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
333
|
+
params = {
|
334
|
+
cache_control: cache_control,
|
335
|
+
content_type: content_type,
|
336
|
+
custom_time: custom_time,
|
337
|
+
content_disposition: content_disposition,
|
338
|
+
md5_hash: md5,
|
339
|
+
content_encoding: content_encoding,
|
340
|
+
crc32c: crc32c,
|
341
|
+
content_language: content_language,
|
342
|
+
metadata: metadata,
|
343
|
+
storage_class: storage_class,
|
344
|
+
temporary_hold: temporary_hold,
|
345
|
+
event_based_hold: event_based_hold
|
346
|
+
}.delete_if { |_k, v| v.nil? }
|
307
347
|
file_obj = Google::Apis::StorageV1::Object.new(**params)
|
308
348
|
content_type ||= mime_type_for(path || Pathname(source).to_path)
|
309
349
|
|
310
350
|
execute do
|
311
|
-
service.insert_object
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
351
|
+
service.insert_object bucket_name,
|
352
|
+
file_obj,
|
353
|
+
name: path,
|
354
|
+
predefined_acl: acl,
|
355
|
+
upload_source: source,
|
356
|
+
content_encoding: content_encoding,
|
357
|
+
content_type: content_type,
|
358
|
+
if_generation_match: if_generation_match,
|
359
|
+
if_generation_not_match: if_generation_not_match,
|
360
|
+
if_metageneration_match: if_metageneration_match,
|
361
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
362
|
+
kms_key_name: kms_key,
|
363
|
+
user_project: user_project(user_project),
|
364
|
+
options: key_options(key)
|
317
365
|
end
|
318
366
|
end
|
319
367
|
|
320
368
|
##
|
321
369
|
# Retrieves an object or its metadata.
|
322
|
-
def get_file bucket_name,
|
370
|
+
def get_file bucket_name,
|
371
|
+
file_path,
|
372
|
+
generation: nil,
|
373
|
+
if_generation_match: nil,
|
374
|
+
if_generation_not_match: nil,
|
375
|
+
if_metageneration_match: nil,
|
376
|
+
if_metageneration_not_match: nil,
|
377
|
+
key: nil,
|
323
378
|
user_project: nil
|
324
379
|
execute do
|
325
380
|
service.get_object \
|
326
381
|
bucket_name, file_path,
|
327
382
|
generation: generation,
|
383
|
+
if_generation_match: if_generation_match,
|
384
|
+
if_generation_not_match: if_generation_not_match,
|
385
|
+
if_metageneration_match: if_metageneration_match,
|
386
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
328
387
|
user_project: user_project(user_project),
|
329
388
|
options: key_options(key)
|
330
389
|
end
|
@@ -332,42 +391,76 @@ module Google
|
|
332
391
|
|
333
392
|
## Rewrite a file from source bucket/object to a
|
334
393
|
# destination bucket/object.
|
335
|
-
def rewrite_file source_bucket_name,
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
394
|
+
def rewrite_file source_bucket_name,
|
395
|
+
source_file_path,
|
396
|
+
destination_bucket_name,
|
397
|
+
destination_file_path,
|
398
|
+
file_gapi = nil,
|
399
|
+
source_key: nil,
|
400
|
+
destination_key: nil,
|
401
|
+
destination_kms_key: nil,
|
402
|
+
acl: nil,
|
403
|
+
generation: nil,
|
404
|
+
if_generation_match: nil,
|
405
|
+
if_generation_not_match: nil,
|
406
|
+
if_metageneration_match: nil,
|
407
|
+
if_metageneration_not_match: nil,
|
408
|
+
if_source_generation_match: nil,
|
409
|
+
if_source_generation_not_match: nil,
|
410
|
+
if_source_metageneration_match: nil,
|
411
|
+
if_source_metageneration_not_match: nil,
|
412
|
+
token: nil,
|
413
|
+
user_project: nil
|
340
414
|
key_options = rewrite_key_options source_key, destination_key
|
341
415
|
execute do
|
342
|
-
service.rewrite_object
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
416
|
+
service.rewrite_object source_bucket_name,
|
417
|
+
source_file_path,
|
418
|
+
destination_bucket_name,
|
419
|
+
destination_file_path,
|
420
|
+
file_gapi,
|
421
|
+
destination_kms_key_name: destination_kms_key,
|
422
|
+
destination_predefined_acl: acl,
|
423
|
+
source_generation: generation,
|
424
|
+
if_generation_match: if_generation_match,
|
425
|
+
if_generation_not_match: if_generation_not_match,
|
426
|
+
if_metageneration_match: if_metageneration_match,
|
427
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
428
|
+
if_source_generation_match: if_source_generation_match,
|
429
|
+
if_source_generation_not_match: if_source_generation_not_match,
|
430
|
+
if_source_metageneration_match: if_source_metageneration_match,
|
431
|
+
if_source_metageneration_not_match: if_source_metageneration_not_match,
|
432
|
+
rewrite_token: token,
|
433
|
+
user_project: user_project(user_project),
|
434
|
+
options: key_options
|
352
435
|
end
|
353
436
|
end
|
354
437
|
|
355
438
|
## Copy a file from source bucket/object to a
|
356
439
|
# destination bucket/object.
|
357
|
-
def compose_file bucket_name,
|
358
|
-
|
440
|
+
def compose_file bucket_name,
|
441
|
+
source_files,
|
442
|
+
destination_path,
|
443
|
+
destination_gapi,
|
444
|
+
acl: nil,
|
445
|
+
key: nil,
|
446
|
+
if_source_generation_match: nil,
|
447
|
+
if_generation_match: nil,
|
448
|
+
if_metageneration_match: nil,
|
449
|
+
user_project: nil
|
359
450
|
|
360
|
-
|
361
|
-
|
362
|
-
|
451
|
+
source_objects = compose_file_source_objects source_files, if_source_generation_match
|
452
|
+
compose_req = Google::Apis::StorageV1::ComposeRequest.new source_objects: source_objects,
|
453
|
+
destination: destination_gapi
|
363
454
|
|
364
455
|
execute do
|
365
|
-
service.compose_object
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
456
|
+
service.compose_object bucket_name,
|
457
|
+
destination_path,
|
458
|
+
compose_req,
|
459
|
+
destination_predefined_acl: acl,
|
460
|
+
if_generation_match: if_generation_match,
|
461
|
+
if_metageneration_match: if_metageneration_match,
|
462
|
+
user_project: user_project(user_project),
|
463
|
+
options: key_options(key)
|
371
464
|
end
|
372
465
|
end
|
373
466
|
|
@@ -396,24 +489,48 @@ module Google
|
|
396
489
|
|
397
490
|
##
|
398
491
|
# Updates a file's metadata.
|
399
|
-
def patch_file bucket_name,
|
400
|
-
|
492
|
+
def patch_file bucket_name,
|
493
|
+
file_path,
|
494
|
+
file_gapi = nil,
|
495
|
+
generation: nil,
|
496
|
+
if_generation_match: nil,
|
497
|
+
if_generation_not_match: nil,
|
498
|
+
if_metageneration_match: nil,
|
499
|
+
if_metageneration_not_match: nil,
|
500
|
+
predefined_acl: nil,
|
501
|
+
user_project: nil
|
401
502
|
file_gapi ||= Google::Apis::StorageV1::Object.new
|
402
503
|
execute do
|
403
|
-
service.patch_object
|
404
|
-
|
405
|
-
|
406
|
-
|
504
|
+
service.patch_object bucket_name,
|
505
|
+
file_path,
|
506
|
+
file_gapi,
|
507
|
+
generation: generation,
|
508
|
+
if_generation_match: if_generation_match,
|
509
|
+
if_generation_not_match: if_generation_not_match,
|
510
|
+
if_metageneration_match: if_metageneration_match,
|
511
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
512
|
+
predefined_acl: predefined_acl,
|
513
|
+
user_project: user_project(user_project)
|
407
514
|
end
|
408
515
|
end
|
409
516
|
|
410
517
|
##
|
411
518
|
# Permanently deletes a file.
|
412
|
-
def delete_file bucket_name,
|
519
|
+
def delete_file bucket_name,
|
520
|
+
file_path,
|
521
|
+
generation: nil,
|
522
|
+
if_generation_match: nil,
|
523
|
+
if_generation_not_match: nil,
|
524
|
+
if_metageneration_match: nil,
|
525
|
+
if_metageneration_not_match: nil,
|
413
526
|
user_project: nil
|
414
527
|
execute do
|
415
528
|
service.delete_object bucket_name, file_path,
|
416
529
|
generation: generation,
|
530
|
+
if_generation_match: if_generation_match,
|
531
|
+
if_generation_not_match: if_generation_not_match,
|
532
|
+
if_metageneration_match: if_metageneration_match,
|
533
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
417
534
|
user_project: user_project(user_project)
|
418
535
|
end
|
419
536
|
end
|
@@ -615,8 +732,8 @@ module Google
|
|
615
732
|
"false" => "NONE" }[str_or_bool.to_s.downcase]
|
616
733
|
end
|
617
734
|
|
618
|
-
def compose_file_source_objects source_files
|
619
|
-
source_files.map do |file|
|
735
|
+
def compose_file_source_objects source_files, if_source_generation_match
|
736
|
+
source_objects = source_files.map do |file|
|
620
737
|
if file.is_a? Google::Cloud::Storage::File
|
621
738
|
Google::Apis::StorageV1::ComposeRequest::SourceObject.new \
|
622
739
|
name: file.name,
|
@@ -626,6 +743,18 @@ module Google
|
|
626
743
|
name: file
|
627
744
|
end
|
628
745
|
end
|
746
|
+
return source_objects unless if_source_generation_match
|
747
|
+
if source_files.count != if_source_generation_match.count
|
748
|
+
raise ArgumentError, "if provided, if_source_generation_match length must match sources length"
|
749
|
+
end
|
750
|
+
if_source_generation_match.each_with_index do |generation, i|
|
751
|
+
next unless generation
|
752
|
+
object_preconditions = Google::Apis::StorageV1::ComposeRequest::SourceObject::ObjectPreconditions.new(
|
753
|
+
if_generation_match: generation
|
754
|
+
)
|
755
|
+
source_objects[i].object_preconditions = object_preconditions
|
756
|
+
end
|
757
|
+
source_objects
|
629
758
|
end
|
630
759
|
|
631
760
|
def execute
|