google-cloud-storage 1.29.2 → 1.33.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.each_with_object({}) do |(k, v), memo|
216
- memo[k] = v.dup rescue value
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, :members, :condition
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}" unless condition.is_a? Condition
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
@@ -168,10 +168,10 @@ module Google
168
168
  # puts binding.role
169
169
  # end
170
170
  #
171
- def each
171
+ def each &block
172
172
  return enum_for :each unless block_given?
173
173
 
174
- @bindings.each { |binding| yield binding }
174
+ @bindings.each(&block)
175
175
  end
176
176
 
177
177
  ##
@@ -70,7 +70,9 @@ module Google
70
70
  # end
71
71
  #
72
72
  class Condition
73
- attr_reader :title, :description, :expression
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, expression:
88
+ def initialize title:, expression:, description: nil
87
89
  @title = String title
88
90
  @description = String description
89
91
  @expression = String expression
@@ -59,7 +59,8 @@ module Google
59
59
  # post.fields["x-goog-signature"] #=> "4893a0e...cd82"
60
60
  #
61
61
  class PostObject
62
- attr_reader :url, :fields
62
+ attr_reader :url
63
+ attr_reader :fields
63
64
 
64
65
  # @private
65
66
  def initialize url, fields
@@ -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, skip_lookup: false, user_project: nil
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, user_project: user_project
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
- # "payload": string_to_sign,
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, user_project: nil
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, bucket_gapi = nil, predefined_acl: nil,
110
- predefined_default_acl: nil, user_project: nil
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
- bucket_name, bucket_gapi,
118
- predefined_acl: predefined_acl,
119
- predefined_default_object_acl: predefined_default_acl,
120
- user_project: user_project(user_project)
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, user_project: nil
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, source, path = nil, acl: nil,
294
- cache_control: nil, content_disposition: nil,
295
- content_encoding: nil, content_language: nil,
296
- content_type: nil, custom_time: nil, crc32c: nil, md5: nil, metadata: nil,
297
- storage_class: nil, key: nil, kms_key: nil,
298
- temporary_hold: nil, event_based_hold: nil,
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
- { cache_control: cache_control, content_type: content_type, custom_time: custom_time,
302
- content_disposition: content_disposition, md5_hash: md5,
303
- content_encoding: content_encoding, crc32c: crc32c,
304
- content_language: content_language, metadata: metadata,
305
- storage_class: storage_class, temporary_hold: temporary_hold,
306
- event_based_hold: event_based_hold }.delete_if { |_k, v| v.nil? }
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
- bucket_name, file_obj,
313
- name: path, predefined_acl: acl, upload_source: source,
314
- content_encoding: content_encoding, content_type: content_type,
315
- kms_key_name: kms_key, user_project: user_project(user_project),
316
- options: key_options(key)
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, file_path, generation: nil, key: nil,
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, source_file_path,
336
- destination_bucket_name, destination_file_path,
337
- file_gapi = nil, source_key: nil, destination_key: nil,
338
- destination_kms_key: nil, acl: nil, generation: nil,
339
- token: nil, user_project: nil
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
- source_bucket_name, source_file_path,
344
- destination_bucket_name, destination_file_path,
345
- file_gapi,
346
- destination_kms_key_name: destination_kms_key,
347
- destination_predefined_acl: acl,
348
- source_generation: generation,
349
- rewrite_token: token,
350
- user_project: user_project(user_project),
351
- options: key_options
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, source_files, destination_path,
358
- destination_gapi, acl: nil, key: nil, user_project: nil
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
- compose_req = Google::Apis::StorageV1::ComposeRequest.new \
361
- source_objects: compose_file_source_objects(source_files),
362
- destination: destination_gapi
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
- bucket_name, destination_path,
367
- compose_req,
368
- destination_predefined_acl: acl,
369
- user_project: user_project(user_project),
370
- options: key_options(key)
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, file_path, file_gapi = nil,
400
- predefined_acl: nil, user_project: nil
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
- bucket_name, file_path, file_gapi,
405
- predefined_acl: predefined_acl,
406
- user_project: user_project(user_project)
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, file_path, generation: nil,
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