google-cloud-storage 1.31.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 +19 -0
- data/lib/google/cloud/storage/bucket.rb +185 -34
- data/lib/google/cloud/storage/file.rb +216 -26
- data/lib/google/cloud/storage/file/acl.rb +176 -14
- data/lib/google/cloud/storage/file/verifier.rb +2 -2
- data/lib/google/cloud/storage/project.rb +14 -2
- data/lib/google/cloud/storage/service.rb +193 -64
- data/lib/google/cloud/storage/version.rb +1 -1
- metadata +14 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10f1fa9dd485d8891fa159b09b463fcf20d5320fd759f2dc92164c0a6f4647af
|
4
|
+
data.tar.gz: 1734495bde125925f45fdaf9a2c2a9da421d9cb38c5b7ac1e5785a869594c09f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 614c067fa9c914e07acf1473e36a78cb04fa6070ddd2d1d96fee3693a2b6cc650a9005af515cdcbb9e6db9c1816985656977934fb5f3fe75248730673dbda675
|
7
|
+
data.tar.gz: b3f43b0193147e89de327734384e3a3b3581abfe921e0efcfdfd094e0373a76fb719f079fde3c3e6351216d2b9150af3b1a7a46249d35f7e170168a41e28175f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 1.32.0 / 2021-06-22
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* Add sources_if_generation_match to Bucket#compose
|
8
|
+
* Add support for (meta)generation preconditions to File operations
|
9
|
+
* Add if_(meta)generation_match options to Bucket#compose
|
10
|
+
* Add if_(meta)generation_(not_)match options to Bucket#create_file
|
11
|
+
* Add if_(meta)generation_(not_)match options to Bucket#file
|
12
|
+
* Add if_(meta)generation_(not_)match options to File#delete.
|
13
|
+
* Add if_(meta)generation_(not_)match options to File#rewrite
|
14
|
+
* Add generation and if_(meta)generation_(not_)match options to File#update
|
15
|
+
* Add generation and if_(meta)generation_(not_)match options to File::Acl predefined_acl methods
|
16
|
+
|
17
|
+
#### Bug Fixes
|
18
|
+
|
19
|
+
* Expand googleauth dependency to support future 1.x versions
|
20
|
+
* Update File::Verifier to test for File#to_path
|
21
|
+
|
3
22
|
### 1.31.1 / 2021-05-19
|
4
23
|
|
5
24
|
#### Documentation
|
@@ -315,6 +315,9 @@ module Google
|
|
315
315
|
##
|
316
316
|
# Updates the destination bucket for the bucket's logs.
|
317
317
|
#
|
318
|
+
# To pass metageneration preconditions, call this method within a
|
319
|
+
# block passed to {#update}.
|
320
|
+
#
|
318
321
|
# @see https://cloud.google.com/storage/docs/access-logs Access Logs
|
319
322
|
#
|
320
323
|
# @param [String] logging_bucket The bucket to hold the logging output
|
@@ -344,6 +347,9 @@ module Google
|
|
344
347
|
# By default, the object prefix is the name of the bucket for which the
|
345
348
|
# logs are enabled.
|
346
349
|
#
|
350
|
+
# To pass metageneration preconditions, call this method within a
|
351
|
+
# block passed to {#update}.
|
352
|
+
#
|
347
353
|
# @see https://cloud.google.com/storage/docs/access-logs Access Logs
|
348
354
|
#
|
349
355
|
# @param [String] logging_prefix The logging object prefix.
|
@@ -377,6 +383,9 @@ module Google
|
|
377
383
|
# For more information, see [Storage
|
378
384
|
# Classes](https://cloud.google.com/storage/docs/storage-classes).
|
379
385
|
#
|
386
|
+
# To pass metageneration preconditions, call this method within a
|
387
|
+
# block passed to {#update}.
|
388
|
+
#
|
380
389
|
# @param [Symbol, String] new_storage_class Storage class of the bucket.
|
381
390
|
#
|
382
391
|
def storage_class= new_storage_class
|
@@ -400,6 +409,9 @@ module Google
|
|
400
409
|
# Versioning](https://cloud.google.com/storage/docs/object-versioning)
|
401
410
|
# is enabled for the bucket.
|
402
411
|
#
|
412
|
+
# To pass metageneration preconditions, call this method within a
|
413
|
+
# block passed to {#update}.
|
414
|
+
#
|
403
415
|
# @param [Boolean] new_versioning true if versioning is to be enabled
|
404
416
|
# for the bucket.
|
405
417
|
#
|
@@ -428,6 +440,9 @@ module Google
|
|
428
440
|
##
|
429
441
|
# Updates the main page suffix for a static website.
|
430
442
|
#
|
443
|
+
# To pass metageneration preconditions, call this method within a
|
444
|
+
# block passed to {#update}.
|
445
|
+
#
|
431
446
|
# @see https://cloud.google.com/storage/docs/website-configuration#step4
|
432
447
|
# How to Host a Static Website
|
433
448
|
#
|
@@ -467,6 +482,9 @@ module Google
|
|
467
482
|
##
|
468
483
|
# Updates the hash of user-provided labels.
|
469
484
|
#
|
485
|
+
# To pass metageneration preconditions, call this method within a
|
486
|
+
# block passed to {#update}.
|
487
|
+
#
|
470
488
|
# @param [Hash(String => String)] labels The user-provided labels.
|
471
489
|
#
|
472
490
|
def labels= labels
|
@@ -478,6 +496,9 @@ module Google
|
|
478
496
|
# Updates the page returned from a static website served from the bucket
|
479
497
|
# when a site visitor requests a resource that does not exist.
|
480
498
|
#
|
499
|
+
# To pass metageneration preconditions, call this method within a
|
500
|
+
# block passed to {#update}.
|
501
|
+
#
|
481
502
|
# @see https://cloud.google.com/storage/docs/website-configuration#step4
|
482
503
|
# How to Host a Static Website
|
483
504
|
#
|
@@ -509,6 +530,9 @@ module Google
|
|
509
530
|
# {Project#bucket} and {Project#buckets} to indicate the project to
|
510
531
|
# which the access costs should be billed.
|
511
532
|
#
|
533
|
+
# To pass metageneration preconditions, call this method within a
|
534
|
+
# block passed to {#update}.
|
535
|
+
#
|
512
536
|
# @param [Boolean] new_requester_pays When set to `true`, requester pays
|
513
537
|
# is enabled for the bucket.
|
514
538
|
#
|
@@ -557,6 +581,9 @@ module Google
|
|
557
581
|
# Set the Cloud KMS encryption key that will be used to protect files.
|
558
582
|
# For example: `projects/a/locations/b/keyRings/c/cryptoKeys/d`
|
559
583
|
#
|
584
|
+
# To pass metageneration preconditions, call this method within a
|
585
|
+
# block passed to {#update}.
|
586
|
+
#
|
560
587
|
# @param [String, nil] new_default_kms_key New Cloud KMS key name, or
|
561
588
|
# `nil` to delete the Cloud KMS encryption key.
|
562
589
|
#
|
@@ -617,6 +644,9 @@ module Google
|
|
617
644
|
# See also: {#lock_retention_policy!}, {#retention_period},
|
618
645
|
# {#retention_effective_at}, and {#retention_policy_locked?}.
|
619
646
|
#
|
647
|
+
# To pass metageneration preconditions, call this method within a
|
648
|
+
# block passed to {#update}.
|
649
|
+
#
|
620
650
|
# @param [Integer, nil] new_retention_period The retention period
|
621
651
|
# defined in seconds. The value must be between 0 and 100 years (in
|
622
652
|
# seconds), or `nil`.
|
@@ -715,6 +745,9 @@ module Google
|
|
715
745
|
#
|
716
746
|
# See {File#event_based_hold?} and {File#set_event_based_hold!}.
|
717
747
|
#
|
748
|
+
# To pass metageneration preconditions, call this method within a
|
749
|
+
# block passed to {#update}.
|
750
|
+
#
|
718
751
|
# @param [Boolean] new_default_event_based_hold The default event-based
|
719
752
|
# hold field for the bucket.
|
720
753
|
#
|
@@ -823,6 +856,9 @@ module Google
|
|
823
856
|
# Before enabling uniform bucket-level access please review [uniform bucket-level
|
824
857
|
# access](https://cloud.google.com/storage/docs/uniform-bucket-level-access).
|
825
858
|
#
|
859
|
+
# To pass metageneration preconditions, call this method within a
|
860
|
+
# block passed to {#update}.
|
861
|
+
#
|
826
862
|
# @param [Boolean] new_uniform_bucket_level_access When set to `true`, uniform bucket-level access is enabled in
|
827
863
|
# the bucket's IAM configuration.
|
828
864
|
#
|
@@ -905,6 +941,12 @@ module Google
|
|
905
941
|
# completely mutable and will be included in the request. (See
|
906
942
|
# {Bucket::Cors})
|
907
943
|
#
|
944
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
945
|
+
# on whether the bucket's current metageneration matches the given value.
|
946
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
947
|
+
# conditional on whether the bucket's current metageneration does not
|
948
|
+
# match the given value.
|
949
|
+
#
|
908
950
|
# @yield [bucket] a block yielding a delegate object for updating the
|
909
951
|
# file
|
910
952
|
#
|
@@ -936,14 +978,27 @@ module Google
|
|
936
978
|
# end
|
937
979
|
# end
|
938
980
|
#
|
939
|
-
|
981
|
+
# @example With a `if_metageneration_match` precondition:
|
982
|
+
# require "google/cloud/storage"
|
983
|
+
#
|
984
|
+
# storage = Google::Cloud::Storage.new
|
985
|
+
#
|
986
|
+
# bucket = storage.bucket "my-todo-app"
|
987
|
+
# bucket.update if_metageneration_match: 6 do |b|
|
988
|
+
# b.website_main = "index.html"
|
989
|
+
# end
|
990
|
+
#
|
991
|
+
def update if_metageneration_match: nil, if_metageneration_not_match: nil
|
940
992
|
updater = Updater.new @gapi
|
941
993
|
yield updater
|
942
994
|
# Add check for mutable cors
|
943
995
|
updater.check_for_changed_labels!
|
944
996
|
updater.check_for_mutable_cors!
|
945
997
|
updater.check_for_mutable_lifecycle!
|
946
|
-
|
998
|
+
return if updater.updates.empty?
|
999
|
+
patch_gapi! updater.updates,
|
1000
|
+
if_metageneration_match: if_metageneration_match,
|
1001
|
+
if_metageneration_not_match: if_metageneration_not_match
|
947
1002
|
end
|
948
1003
|
|
949
1004
|
##
|
@@ -953,6 +1008,12 @@ module Google
|
|
953
1008
|
# The API call to delete the bucket may be retried under certain
|
954
1009
|
# conditions. See {Google::Cloud#storage} to control this behavior.
|
955
1010
|
#
|
1011
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1012
|
+
# on whether the bucket's current metageneration matches the given value.
|
1013
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
1014
|
+
# conditional on whether the bucket's current metageneration does not
|
1015
|
+
# match the given value.
|
1016
|
+
#
|
956
1017
|
# @return [Boolean] Returns `true` if the bucket was deleted.
|
957
1018
|
#
|
958
1019
|
# @example
|
@@ -963,10 +1024,12 @@ module Google
|
|
963
1024
|
# bucket = storage.bucket "my-bucket"
|
964
1025
|
# bucket.delete
|
965
1026
|
#
|
966
|
-
def delete
|
1027
|
+
def delete if_metageneration_match: nil, if_metageneration_not_match: nil
|
967
1028
|
ensure_service!
|
968
|
-
service.delete_bucket name,
|
969
|
-
|
1029
|
+
service.delete_bucket name,
|
1030
|
+
if_metageneration_match: if_metageneration_match,
|
1031
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
1032
|
+
user_project: user_project
|
970
1033
|
end
|
971
1034
|
|
972
1035
|
##
|
@@ -1040,6 +1103,19 @@ module Google
|
|
1040
1103
|
# @param [String] path Name (path) of the file.
|
1041
1104
|
# @param [Integer] generation When present, selects a specific revision
|
1042
1105
|
# of this object. Default is the latest version.
|
1106
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
1107
|
+
# on whether the file's current generation matches the given value.
|
1108
|
+
# Setting to 0 makes the operation succeed only if there are no live
|
1109
|
+
# versions of the file.
|
1110
|
+
# @param [Integer] if_generation_not_match Makes the operation conditional
|
1111
|
+
# on whether the file's current generation does not match the given
|
1112
|
+
# value. If no live file exists, the precondition fails. Setting to 0
|
1113
|
+
# makes the operation succeed only if there is a live version of the file.
|
1114
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1115
|
+
# on whether the file's current metageneration matches the given value.
|
1116
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
1117
|
+
# conditional on whether the file's current metageneration does not
|
1118
|
+
# match the given value.
|
1043
1119
|
# @param [Boolean] skip_lookup Optionally create a Bucket object
|
1044
1120
|
# without verifying the bucket resource exists on the Storage service.
|
1045
1121
|
# Calls made on this object will raise errors if the bucket resource
|
@@ -1061,7 +1137,14 @@ module Google
|
|
1061
1137
|
# file = bucket.file "path/to/my-file.ext"
|
1062
1138
|
# puts file.name
|
1063
1139
|
#
|
1064
|
-
def file path,
|
1140
|
+
def file path,
|
1141
|
+
generation: nil,
|
1142
|
+
if_generation_match: nil,
|
1143
|
+
if_generation_not_match: nil,
|
1144
|
+
if_metageneration_match: nil,
|
1145
|
+
if_metageneration_not_match: nil,
|
1146
|
+
skip_lookup: nil,
|
1147
|
+
encryption_key: nil
|
1065
1148
|
ensure_service!
|
1066
1149
|
if skip_lookup
|
1067
1150
|
return File.new_lazy name, path, service,
|
@@ -1069,6 +1152,10 @@ module Google
|
|
1069
1152
|
user_project: user_project
|
1070
1153
|
end
|
1071
1154
|
gapi = service.get_file name, path, generation: generation,
|
1155
|
+
if_generation_match: if_generation_match,
|
1156
|
+
if_generation_not_match: if_generation_not_match,
|
1157
|
+
if_metageneration_match: if_metageneration_match,
|
1158
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
1072
1159
|
key: encryption_key,
|
1073
1160
|
user_project: user_project
|
1074
1161
|
File.from_gapi gapi, service, user_project: user_project
|
@@ -1179,6 +1266,19 @@ module Google
|
|
1179
1266
|
# the same location as the bucket.The Service Account associated with
|
1180
1267
|
# your project requires access to this encryption key. Do not provide
|
1181
1268
|
# if `encryption_key` is used.
|
1269
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
1270
|
+
# on whether the file's current generation matches the given value.
|
1271
|
+
# Setting to 0 makes the operation succeed only if there are no live
|
1272
|
+
# versions of the file.
|
1273
|
+
# @param [Integer] if_generation_not_match Makes the operation conditional
|
1274
|
+
# on whether the file's current generation does not match the given
|
1275
|
+
# value. If no live file exists, the precondition fails. Setting to 0
|
1276
|
+
# makes the operation succeed only if there is a live version of the file.
|
1277
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1278
|
+
# on whether the file's current metageneration matches the given value.
|
1279
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
1280
|
+
# conditional on whether the file's current metageneration does not
|
1281
|
+
# match the given value.
|
1182
1282
|
#
|
1183
1283
|
# @return [Google::Cloud::Storage::File]
|
1184
1284
|
#
|
@@ -1262,12 +1362,27 @@ module Google
|
|
1262
1362
|
# file.download "path/to/downloaded/gzipped.txt",
|
1263
1363
|
# skip_decompress: true
|
1264
1364
|
#
|
1265
|
-
def create_file file,
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1365
|
+
def create_file file,
|
1366
|
+
path = nil,
|
1367
|
+
acl: nil,
|
1368
|
+
cache_control: nil,
|
1369
|
+
content_disposition: nil,
|
1370
|
+
content_encoding: nil,
|
1371
|
+
content_language: nil,
|
1372
|
+
content_type: nil,
|
1373
|
+
custom_time: nil,
|
1374
|
+
crc32c: nil,
|
1375
|
+
md5: nil,
|
1376
|
+
metadata: nil,
|
1377
|
+
storage_class: nil,
|
1378
|
+
encryption_key: nil,
|
1379
|
+
kms_key: nil,
|
1380
|
+
temporary_hold: nil,
|
1381
|
+
event_based_hold: nil,
|
1382
|
+
if_generation_match: nil,
|
1383
|
+
if_generation_not_match: nil,
|
1384
|
+
if_metageneration_match: nil,
|
1385
|
+
if_metageneration_not_match: nil
|
1271
1386
|
ensure_service!
|
1272
1387
|
ensure_io_or_file_exists! file
|
1273
1388
|
path ||= file.path if file.respond_to? :path
|
@@ -1275,22 +1390,29 @@ module Google
|
|
1275
1390
|
raise ArgumentError, "must provide path" if path.nil?
|
1276
1391
|
|
1277
1392
|
|
1278
|
-
gapi = service.insert_file name,
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1393
|
+
gapi = service.insert_file name,
|
1394
|
+
file,
|
1395
|
+
path,
|
1396
|
+
acl: File::Acl.predefined_rule_for(acl),
|
1397
|
+
md5: md5,
|
1398
|
+
cache_control: cache_control,
|
1399
|
+
content_type: content_type,
|
1400
|
+
custom_time: custom_time,
|
1401
|
+
content_disposition: content_disposition,
|
1402
|
+
crc32c: crc32c,
|
1403
|
+
content_encoding: content_encoding,
|
1404
|
+
metadata: metadata,
|
1405
|
+
content_language: content_language,
|
1406
|
+
key: encryption_key,
|
1407
|
+
kms_key: kms_key,
|
1408
|
+
storage_class: storage_class_for(storage_class),
|
1409
|
+
temporary_hold: temporary_hold,
|
1410
|
+
event_based_hold: event_based_hold,
|
1411
|
+
if_generation_match: if_generation_match,
|
1412
|
+
if_generation_not_match: if_generation_not_match,
|
1413
|
+
if_metageneration_match: if_metageneration_match,
|
1414
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
1415
|
+
user_project: user_project
|
1294
1416
|
File.from_gapi gapi, service, user_project: user_project
|
1295
1417
|
end
|
1296
1418
|
alias upload_file create_file
|
@@ -1334,6 +1456,16 @@ module Google
|
|
1334
1456
|
# used. All source files must have been encrypted with the same key,
|
1335
1457
|
# and the resulting destination file will also be encrypted with the
|
1336
1458
|
# key.
|
1459
|
+
# @param [Array<Integer>] if_source_generation_match Makes the operation
|
1460
|
+
# conditional on whether the source files' current generations match the
|
1461
|
+
# given values. The list must match `sources` item-to-item.
|
1462
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
1463
|
+
# on whether the destination file's current generation matches the
|
1464
|
+
# given value. Setting to 0 makes the operation succeed only if there
|
1465
|
+
# are no live versions of the file.
|
1466
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1467
|
+
# on whether the destination file's current metageneration matches the
|
1468
|
+
# given value.
|
1337
1469
|
#
|
1338
1470
|
# @yield [file] A block yielding a delegate file object for setting the
|
1339
1471
|
# properties of the destination file.
|
@@ -1382,7 +1514,13 @@ module Google
|
|
1382
1514
|
#
|
1383
1515
|
# new_file = bucket.compose [file_1, file_2], "path/to/new-file.ext"
|
1384
1516
|
#
|
1385
|
-
def compose sources,
|
1517
|
+
def compose sources,
|
1518
|
+
destination,
|
1519
|
+
acl: nil,
|
1520
|
+
encryption_key: nil,
|
1521
|
+
if_source_generation_match: nil,
|
1522
|
+
if_generation_match: nil,
|
1523
|
+
if_metageneration_match: nil
|
1386
1524
|
ensure_service!
|
1387
1525
|
sources = Array sources
|
1388
1526
|
if sources.size < 2
|
@@ -1398,9 +1536,16 @@ module Google
|
|
1398
1536
|
end
|
1399
1537
|
|
1400
1538
|
acl_rule = File::Acl.predefined_rule_for acl
|
1401
|
-
gapi = service.compose_file name,
|
1402
|
-
|
1403
|
-
|
1539
|
+
gapi = service.compose_file name,
|
1540
|
+
sources,
|
1541
|
+
destination,
|
1542
|
+
destination_gapi,
|
1543
|
+
acl: acl_rule,
|
1544
|
+
key: encryption_key,
|
1545
|
+
if_source_generation_match: if_source_generation_match,
|
1546
|
+
if_generation_match: if_generation_match,
|
1547
|
+
if_metageneration_match: if_metageneration_match,
|
1548
|
+
user_project: user_project
|
1404
1549
|
File.from_gapi gapi, service, user_project: user_project
|
1405
1550
|
end
|
1406
1551
|
alias compose_file compose
|
@@ -2546,7 +2691,10 @@ module Google
|
|
2546
2691
|
reload!
|
2547
2692
|
end
|
2548
2693
|
|
2549
|
-
def patch_gapi!
|
2694
|
+
def patch_gapi! attributes,
|
2695
|
+
if_metageneration_match: nil,
|
2696
|
+
if_metageneration_not_match: nil
|
2697
|
+
attributes = Array(attributes)
|
2550
2698
|
attributes.flatten!
|
2551
2699
|
return if attributes.empty?
|
2552
2700
|
ensure_service!
|
@@ -2554,7 +2702,10 @@ module Google
|
|
2554
2702
|
[attr, @gapi.send(attr)]
|
2555
2703
|
end]
|
2556
2704
|
patch_gapi = API::Bucket.new(**patch_args)
|
2557
|
-
@gapi = service.patch_bucket name,
|
2705
|
+
@gapi = service.patch_bucket name,
|
2706
|
+
patch_gapi,
|
2707
|
+
if_metageneration_match: if_metageneration_match,
|
2708
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
2558
2709
|
user_project: user_project
|
2559
2710
|
@lazy = nil
|
2560
2711
|
self
|
@@ -260,6 +260,9 @@ module Google
|
|
260
260
|
# directive for the file data. If omitted, and the file is accessible
|
261
261
|
# to all anonymous users, the default will be `public, max-age=3600`.
|
262
262
|
#
|
263
|
+
# To pass generation and/or metageneration preconditions, call this
|
264
|
+
# method within a block passed to {#update}.
|
265
|
+
#
|
263
266
|
# @param [String] cache_control The Cache-Control directive.
|
264
267
|
#
|
265
268
|
def cache_control= cache_control
|
@@ -281,6 +284,9 @@ module Google
|
|
281
284
|
# Updates the [Content-Disposition](https://tools.ietf.org/html/rfc6266)
|
282
285
|
# of the file data.
|
283
286
|
#
|
287
|
+
# To pass generation and/or metageneration preconditions, call this
|
288
|
+
# method within a block passed to {#update}.
|
289
|
+
#
|
284
290
|
# @param [String] content_disposition The Content-Disposition of the
|
285
291
|
# file.
|
286
292
|
#
|
@@ -305,6 +311,9 @@ module Google
|
|
305
311
|
# ](https://tools.ietf.org/html/rfc7231#section-3.1.2.2) of the file
|
306
312
|
# data.
|
307
313
|
#
|
314
|
+
# To pass generation and/or metageneration preconditions, call this
|
315
|
+
# method within a block passed to {#update}.
|
316
|
+
#
|
308
317
|
# @param [String] content_encoding The Content-Encoding of the file.
|
309
318
|
#
|
310
319
|
def content_encoding= content_encoding
|
@@ -326,6 +335,9 @@ module Google
|
|
326
335
|
# Updates the [Content-Language](http://tools.ietf.org/html/bcp47) of
|
327
336
|
# the file data.
|
328
337
|
#
|
338
|
+
# To pass generation and/or metageneration preconditions, call this
|
339
|
+
# method within a block passed to {#update}.
|
340
|
+
#
|
329
341
|
# @param [String] content_language The Content-Language of the file.
|
330
342
|
#
|
331
343
|
def content_language= content_language
|
@@ -348,6 +360,9 @@ module Google
|
|
348
360
|
# [Content-Type](https://tools.ietf.org/html/rfc2616#section-14.17) of
|
349
361
|
# the file data.
|
350
362
|
#
|
363
|
+
# To pass generation and/or metageneration preconditions, call this
|
364
|
+
# method within a block passed to {#update}.
|
365
|
+
#
|
351
366
|
# @param [String] content_type The Content-Type of the file.
|
352
367
|
#
|
353
368
|
def content_type= content_type
|
@@ -370,6 +385,9 @@ module Google
|
|
370
385
|
# future. If custom_time must be unset, you must either perform a rewrite
|
371
386
|
# operation, or upload the data again and create a new file.
|
372
387
|
#
|
388
|
+
# To pass generation and/or metageneration preconditions, call this
|
389
|
+
# method within a block passed to {#update}.
|
390
|
+
#
|
373
391
|
# @param [DateTime] custom_time A custom time specified by the user
|
374
392
|
# for the file.
|
375
393
|
#
|
@@ -396,6 +414,9 @@ module Google
|
|
396
414
|
# string values that will returned with requests for the file as
|
397
415
|
# "x-goog-meta-" response headers.
|
398
416
|
#
|
417
|
+
# To pass generation and/or metageneration preconditions, call this
|
418
|
+
# method within a block passed to {#update}.
|
419
|
+
#
|
399
420
|
# @param [Hash(String => String)] metadata The user-provided metadata,
|
400
421
|
# in key/value pairs.
|
401
422
|
#
|
@@ -465,6 +486,9 @@ module Google
|
|
465
486
|
# The default value is the default storage class for the bucket. See
|
466
487
|
# {Bucket#storage_class}.
|
467
488
|
#
|
489
|
+
# To pass generation and/or metageneration preconditions, call this
|
490
|
+
# method within a block passed to {#update}.
|
491
|
+
#
|
468
492
|
# @param [Symbol, String] storage_class Storage class of the file.
|
469
493
|
#
|
470
494
|
def storage_class= storage_class
|
@@ -505,6 +529,9 @@ module Google
|
|
505
529
|
# removed, the file's `retention_expires_at` date is not changed. The
|
506
530
|
# default value is `false`.
|
507
531
|
#
|
532
|
+
# To pass generation and/or metageneration preconditions, call this
|
533
|
+
# method within a block passed to {#update}.
|
534
|
+
#
|
508
535
|
# See {#retention_expires_at}.
|
509
536
|
#
|
510
537
|
# @example
|
@@ -533,6 +560,9 @@ module Google
|
|
533
560
|
#
|
534
561
|
# See {#retention_expires_at}.
|
535
562
|
#
|
563
|
+
# To pass generation and/or metageneration preconditions, call this
|
564
|
+
# method within a block passed to {#update}.
|
565
|
+
#
|
536
566
|
# @example
|
537
567
|
# require "google/cloud/storage"
|
538
568
|
#
|
@@ -643,6 +673,9 @@ module Google
|
|
643
673
|
# holds released prior to the effective date of the new policy may
|
644
674
|
# have already been deleted by the user.
|
645
675
|
#
|
676
|
+
# To pass generation and/or metageneration preconditions, call this
|
677
|
+
# method within a block passed to {#update}.
|
678
|
+
#
|
646
679
|
# @example
|
647
680
|
# require "google/cloud/storage"
|
648
681
|
#
|
@@ -681,6 +714,9 @@ module Google
|
|
681
714
|
# {Bucket#default_event_based_hold?} and
|
682
715
|
# {Bucket#default_event_based_hold=}.
|
683
716
|
#
|
717
|
+
# To pass generation and/or metageneration preconditions, call this
|
718
|
+
# method within a block passed to {#update}.
|
719
|
+
#
|
684
720
|
# @example
|
685
721
|
# require "google/cloud/storage"
|
686
722
|
#
|
@@ -774,6 +810,22 @@ module Google
|
|
774
810
|
# accessible in the block is completely mutable and will be included in the
|
775
811
|
# request.
|
776
812
|
#
|
813
|
+
# @param [Integer] generation Select a specific revision of the file to
|
814
|
+
# update. The default is the latest version.
|
815
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
816
|
+
# on whether the file's current generation matches the given value.
|
817
|
+
# Setting to 0 makes the operation succeed only if there are no live
|
818
|
+
# versions of the file.
|
819
|
+
# @param [Integer] if_generation_not_match Makes the operation conditional
|
820
|
+
# on whether the file's current generation does not match the given
|
821
|
+
# value. If no live file exists, the precondition fails. Setting to 0
|
822
|
+
# makes the operation succeed only if there is a live version of the file.
|
823
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
824
|
+
# on whether the file's current metageneration matches the given value.
|
825
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
826
|
+
# conditional on whether the file's current metageneration does not
|
827
|
+
# match the given value.
|
828
|
+
#
|
777
829
|
# @yield [file] a block yielding a delegate object for updating the file
|
778
830
|
#
|
779
831
|
# @example
|
@@ -796,11 +848,34 @@ module Google
|
|
796
848
|
# f.metadata["score"] = "10"
|
797
849
|
# end
|
798
850
|
#
|
799
|
-
|
851
|
+
# @example With a `if_generation_match` precondition:
|
852
|
+
# require "google/cloud/storage"
|
853
|
+
#
|
854
|
+
# storage = Google::Cloud::Storage.new
|
855
|
+
#
|
856
|
+
# bucket = storage.bucket "my-bucket"
|
857
|
+
#
|
858
|
+
# file = bucket.file "path/to/my-file.ext"
|
859
|
+
#
|
860
|
+
# file.update if_generation_match: 1602263125261858 do |f|
|
861
|
+
# f.cache_control = "private, max-age=0, no-cache"
|
862
|
+
# end
|
863
|
+
#
|
864
|
+
def update generation: nil,
|
865
|
+
if_generation_match: nil,
|
866
|
+
if_generation_not_match: nil,
|
867
|
+
if_metageneration_match: nil,
|
868
|
+
if_metageneration_not_match: nil
|
800
869
|
updater = Updater.new gapi
|
801
870
|
yield updater
|
802
871
|
updater.check_for_changed_metadata!
|
803
|
-
|
872
|
+
return if updater.updates.empty?
|
873
|
+
update_gapi! updater.updates,
|
874
|
+
generation: generation,
|
875
|
+
if_generation_match: if_generation_match,
|
876
|
+
if_generation_not_match: if_generation_not_match,
|
877
|
+
if_metageneration_match: if_metageneration_match,
|
878
|
+
if_metageneration_not_match: if_metageneration_not_match
|
804
879
|
end
|
805
880
|
|
806
881
|
##
|
@@ -1138,6 +1213,27 @@ module Google
|
|
1138
1213
|
# access, and allUsers get READER access.
|
1139
1214
|
# @param [Integer] generation Select a specific revision of the file to
|
1140
1215
|
# rewrite. The default is the latest version.
|
1216
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
1217
|
+
# on whether the destination file's current generation matches the given value.
|
1218
|
+
# Setting to 0 makes the operation succeed only if there are no live
|
1219
|
+
# versions of the file.
|
1220
|
+
# @param [Integer] if_generation_not_match Makes the operation conditional
|
1221
|
+
# on whether the destination file's current generation does not match the given
|
1222
|
+
# value. If no live file exists, the precondition fails. Setting to 0
|
1223
|
+
# makes the operation succeed only if there is a live version of the file.
|
1224
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1225
|
+
# on whether the destination file's current metageneration matches the given value.
|
1226
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
1227
|
+
# conditional on whether the destination file's current metageneration does not
|
1228
|
+
# match the given value.
|
1229
|
+
# @param [Integer] if_source_generation_match Makes the operation conditional on
|
1230
|
+
# whether the source object's current generation matches the given value.
|
1231
|
+
# @param [Integer] if_source_generation_not_match Makes the operation conditional
|
1232
|
+
# on whether the source object's current generation does not match the given value.
|
1233
|
+
# @param [Integer] if_source_metageneration_match Makes the operation conditional
|
1234
|
+
# on whether the source object's current metageneration matches the given value.
|
1235
|
+
# @param [Integer] if_source_metageneration_not_match Makes the operation conditional
|
1236
|
+
# on whether the source object's current metageneration does not match the given value.
|
1141
1237
|
# @param [String] encryption_key Optional. The customer-supplied,
|
1142
1238
|
# AES-256 encryption key used to decrypt the file, if the existing
|
1143
1239
|
# file is encrypted.
|
@@ -1259,11 +1355,24 @@ module Google
|
|
1259
1355
|
# f.metadata["rewritten_from"] = "#{file.bucket}/#{file.name}"
|
1260
1356
|
# end
|
1261
1357
|
#
|
1262
|
-
def rewrite dest_bucket_or_path,
|
1263
|
-
|
1358
|
+
def rewrite dest_bucket_or_path,
|
1359
|
+
dest_path = nil,
|
1360
|
+
acl: nil,
|
1361
|
+
generation: nil,
|
1362
|
+
if_generation_match: nil,
|
1363
|
+
if_generation_not_match: nil,
|
1364
|
+
if_metageneration_match: nil,
|
1365
|
+
if_metageneration_not_match: nil,
|
1366
|
+
if_source_generation_match: nil,
|
1367
|
+
if_source_generation_not_match: nil,
|
1368
|
+
if_source_metageneration_match: nil,
|
1369
|
+
if_source_metageneration_not_match: nil,
|
1370
|
+
encryption_key: nil,
|
1371
|
+
new_encryption_key: nil,
|
1372
|
+
new_kms_key: nil,
|
1373
|
+
force_copy_metadata: nil
|
1264
1374
|
ensure_service!
|
1265
|
-
dest_bucket, dest_path = fix_rewrite_args dest_bucket_or_path,
|
1266
|
-
dest_path
|
1375
|
+
dest_bucket, dest_path = fix_rewrite_args dest_bucket_or_path, dest_path
|
1267
1376
|
|
1268
1377
|
update_gapi = nil
|
1269
1378
|
if block_given?
|
@@ -1276,9 +1385,21 @@ module Google
|
|
1276
1385
|
end
|
1277
1386
|
end
|
1278
1387
|
|
1279
|
-
new_gapi = rewrite_gapi bucket,
|
1280
|
-
|
1281
|
-
|
1388
|
+
new_gapi = rewrite_gapi bucket,
|
1389
|
+
name,
|
1390
|
+
update_gapi,
|
1391
|
+
new_bucket: dest_bucket,
|
1392
|
+
new_name: dest_path,
|
1393
|
+
acl: acl,
|
1394
|
+
generation: generation,
|
1395
|
+
if_generation_match: if_generation_match,
|
1396
|
+
if_generation_not_match: if_generation_not_match,
|
1397
|
+
if_metageneration_match: if_metageneration_match,
|
1398
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
1399
|
+
if_source_generation_match: if_source_generation_match,
|
1400
|
+
if_source_generation_not_match: if_source_generation_not_match,
|
1401
|
+
if_source_metageneration_match: if_source_metageneration_match,
|
1402
|
+
if_source_metageneration_not_match: if_source_metageneration_not_match,
|
1282
1403
|
encryption_key: encryption_key,
|
1283
1404
|
new_encryption_key: new_encryption_key,
|
1284
1405
|
new_kms_key: new_kms_key,
|
@@ -1375,6 +1496,20 @@ module Google
|
|
1375
1496
|
# {#generation}. The default behavior is to delete the latest version
|
1376
1497
|
# of the file (regardless of the version to which the file is set,
|
1377
1498
|
# which is the version returned by {#generation}.)
|
1499
|
+
# @param [Integer] if_generation_match Makes the operation conditional
|
1500
|
+
# on whether the file's current generation matches the given value.
|
1501
|
+
# Setting to 0 makes the operation succeed only if there are no live
|
1502
|
+
# versions of the file.
|
1503
|
+
# @param [Integer] if_generation_not_match Makes the operation conditional
|
1504
|
+
# on whether the file's current generation does not match the given
|
1505
|
+
# value. If no live file exists, the precondition fails. Setting to 0
|
1506
|
+
# makes the operation succeed only if there is a live version of the file.
|
1507
|
+
# @param [Integer] if_metageneration_match Makes the operation conditional
|
1508
|
+
# on whether the file's current metageneration matches the given value.
|
1509
|
+
# @param [Integer] if_metageneration_not_match Makes the operation
|
1510
|
+
# conditional on whether the file's current metageneration does not
|
1511
|
+
# match the given value.
|
1512
|
+
#
|
1378
1513
|
# @return [Boolean] Returns `true` if the file was deleted.
|
1379
1514
|
#
|
1380
1515
|
# @example
|
@@ -1407,11 +1542,21 @@ module Google
|
|
1407
1542
|
# file = bucket.file "path/to/my-file.ext"
|
1408
1543
|
# file.delete generation: 123456
|
1409
1544
|
#
|
1410
|
-
def delete generation: nil
|
1545
|
+
def delete generation: nil,
|
1546
|
+
if_generation_match: nil,
|
1547
|
+
if_generation_not_match: nil,
|
1548
|
+
if_metageneration_match: nil,
|
1549
|
+
if_metageneration_not_match: nil
|
1411
1550
|
generation = self.generation if generation == true
|
1412
1551
|
ensure_service!
|
1413
|
-
service.delete_file bucket,
|
1414
|
-
|
1552
|
+
service.delete_file bucket,
|
1553
|
+
name,
|
1554
|
+
generation: generation,
|
1555
|
+
if_generation_match: if_generation_match,
|
1556
|
+
if_generation_not_match: if_generation_not_match,
|
1557
|
+
if_metageneration_match: if_metageneration_match,
|
1558
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
1559
|
+
user_project: user_project
|
1415
1560
|
true
|
1416
1561
|
end
|
1417
1562
|
|
@@ -1865,7 +2010,13 @@ module Google
|
|
1865
2010
|
reload! generation: true
|
1866
2011
|
end
|
1867
2012
|
|
1868
|
-
def update_gapi!
|
2013
|
+
def update_gapi! attributes,
|
2014
|
+
generation: nil,
|
2015
|
+
if_generation_match: nil,
|
2016
|
+
if_generation_not_match: nil,
|
2017
|
+
if_metageneration_match: nil,
|
2018
|
+
if_metageneration_not_match: nil
|
2019
|
+
attributes = Array(attributes)
|
1869
2020
|
attributes.flatten!
|
1870
2021
|
return if attributes.empty?
|
1871
2022
|
update_gapi = self.class.gapi_from_attrs @gapi, attributes
|
@@ -1875,26 +2026,65 @@ module Google
|
|
1875
2026
|
|
1876
2027
|
rewrite_attrs = [:storage_class, :kms_key_name]
|
1877
2028
|
@gapi = if attributes.any? { |a| rewrite_attrs.include? a }
|
1878
|
-
rewrite_gapi
|
1879
|
-
|
2029
|
+
rewrite_gapi bucket,
|
2030
|
+
name,
|
2031
|
+
update_gapi,
|
2032
|
+
generation: generation,
|
2033
|
+
if_generation_match: if_generation_match,
|
2034
|
+
if_generation_not_match: if_generation_not_match,
|
2035
|
+
if_metageneration_match: if_metageneration_match,
|
2036
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
2037
|
+
user_project: user_project
|
1880
2038
|
else
|
1881
|
-
service.patch_file
|
1882
|
-
|
2039
|
+
service.patch_file bucket,
|
2040
|
+
name,
|
2041
|
+
update_gapi,
|
2042
|
+
generation: generation,
|
2043
|
+
if_generation_match: if_generation_match,
|
2044
|
+
if_generation_not_match: if_generation_not_match,
|
2045
|
+
if_metageneration_match: if_metageneration_match,
|
2046
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
2047
|
+
user_project: user_project
|
1883
2048
|
end
|
1884
2049
|
end
|
1885
2050
|
|
1886
|
-
def rewrite_gapi bucket,
|
1887
|
-
|
1888
|
-
|
1889
|
-
|
2051
|
+
def rewrite_gapi bucket,
|
2052
|
+
name,
|
2053
|
+
updated_gapi,
|
2054
|
+
new_bucket: nil,
|
2055
|
+
new_name: nil,
|
2056
|
+
acl: nil,
|
2057
|
+
generation: nil,
|
2058
|
+
if_generation_match: nil,
|
2059
|
+
if_generation_not_match: nil,
|
2060
|
+
if_metageneration_match: nil,
|
2061
|
+
if_metageneration_not_match: nil,
|
2062
|
+
if_source_generation_match: nil,
|
2063
|
+
if_source_generation_not_match: nil,
|
2064
|
+
if_source_metageneration_match: nil,
|
2065
|
+
if_source_metageneration_not_match: nil,
|
2066
|
+
encryption_key: nil,
|
2067
|
+
new_encryption_key: nil,
|
2068
|
+
new_kms_key: nil,
|
1890
2069
|
user_project: nil
|
1891
2070
|
new_bucket ||= bucket
|
1892
2071
|
new_name ||= name
|
1893
|
-
options = {
|
1894
|
-
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
2072
|
+
options = {
|
2073
|
+
acl: File::Acl.predefined_rule_for(acl),
|
2074
|
+
generation: generation,
|
2075
|
+
if_generation_match: if_generation_match,
|
2076
|
+
if_generation_not_match: if_generation_not_match,
|
2077
|
+
if_metageneration_match: if_metageneration_match,
|
2078
|
+
if_metageneration_not_match: if_metageneration_not_match,
|
2079
|
+
if_source_generation_match: if_source_generation_match,
|
2080
|
+
if_source_generation_not_match: if_source_generation_not_match,
|
2081
|
+
if_source_metageneration_match: if_source_metageneration_match,
|
2082
|
+
if_source_metageneration_not_match: if_source_metageneration_not_match,
|
2083
|
+
source_key: encryption_key,
|
2084
|
+
destination_key: new_encryption_key,
|
2085
|
+
destination_kms_key: new_kms_key,
|
2086
|
+
user_project: user_project
|
2087
|
+
}.delete_if { |_k, v| v.nil? }
|
1898
2088
|
|
1899
2089
|
resp = service.rewrite_file \
|
1900
2090
|
bucket, name, new_bucket, new_name, updated_gapi, **options
|