google-cloud-storage 1.37.0 → 1.38.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4978faf0cccd7a12e58085b8a5eb44a0bdfb54446c17e5c377ef66e443a93671
4
- data.tar.gz: 7487e0b96eabba4902ebc21992b651e08261523175d49c4477e820e941757be3
3
+ metadata.gz: 7377748053d6da28b196231e893002e4d80849cf558b5e983003926c19526a6c
4
+ data.tar.gz: b00e59073ea7230b4b654de40e6323766d6e36a562d765ad2545c8d154b16d2d
5
5
  SHA512:
6
- metadata.gz: 7e0728273ad8a402031e43930695f11c0f908c7379a2a80c28b68f6278034f8957a47f980161aa490ffa261e16559b699eabd5526f7304176167493e8bf1b7c0
7
- data.tar.gz: 3cebdabf2dbefc4f8f4a23f8c6df43b25770cda527c0fc502e7a2cd8ab9ac9cfa8a82a1fc108c28168becc6e9f9a624a5c588c5ef8657f1f83b2dfafecd9f413
6
+ metadata.gz: 65b18a6857817dd24246d287c3e51cabfb2ec61fffda26f3fc00462fd030e60c506a893ccc86a14cfc1034d882c6d488b5220e744ee2fe3316d55271c9fdaadc
7
+ data.tar.gz: fede3f8da08220a89dc1642fd1937cc75ea6b57ee9d210bd8a8dc4efcb5c11ff5dab0d2962c7c25f383cda4e9aa548fe8764c0ec06867abf46ca91d7fbbd33e3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Release History
2
2
 
3
+ ### 1.38.0 (2022-07-31)
4
+
5
+ #### Features
6
+
7
+ * Add support for dual region gcs buckets ([#18862](https://github.com/googleapis/google-cloud-ruby/issues/18862))
8
+
3
9
  ### 1.37.0 (2022-06-30)
4
10
 
5
11
  #### Features
@@ -301,6 +301,20 @@ module Google
301
301
  @gapi.location_type
302
302
  end
303
303
 
304
+ ##
305
+ # Returns the list of regional locations for custom dual-region buckets.
306
+ #
307
+ # @return [String, nil] Returns nil if the property has not been set before creation,
308
+ # if the bucket's resource has not been loaded from the server,
309
+ # or if the bucket is not a dual-regions bucket.
310
+
311
+ # @see https://cloud.google.com/storage/docs/json_api/v1/buckets and
312
+ # https://cloud.google.com/storage/docs/locations
313
+ #
314
+ def data_locations
315
+ @gapi.custom_placement_config&.data_locations
316
+ end
317
+
304
318
  ##
305
319
  # The destination bucket name for the bucket's logs.
306
320
  #
@@ -290,9 +290,9 @@ module Google
290
290
  # access, and allUsers get READER access.
291
291
  # @param [String] location The location of the bucket. Optional.
292
292
  # If not passed, the default location, 'US', will be used.
293
- # If specifying a dual-region location, the regions can be specified
294
- # by joining them with a plus sign, for example 'US-CENTRAL1+US-WEST1'. See:
295
- # [Storage Locaitons](https://cloud.google.com/storage/docs/locations).
293
+ # If specifying a dual-region location, the `customPlacementConfig`
294
+ # property should be set in conjunction. See:
295
+ # [Storage Locations](https://cloud.google.com/storage/docs/locations).
296
296
  # @param [String] logging_bucket The destination bucket for the bucket's
297
297
  # logs. For more information, see [Access
298
298
  # Logs](https://cloud.google.com/storage/docs/access-logs).
@@ -367,6 +367,7 @@ module Google
367
367
  acl: nil,
368
368
  default_acl: nil,
369
369
  location: nil,
370
+ custom_placement_config: nil,
370
371
  storage_class: nil,
371
372
  logging_bucket: nil,
372
373
  logging_prefix: nil,
@@ -377,7 +378,8 @@ module Google
377
378
  user_project: nil
378
379
  params = {
379
380
  name: bucket_name,
380
- location: location
381
+ location: location,
382
+ custom_placement_config: custom_placement_config
381
383
  }.delete_if { |_, v| v.nil? }
382
384
  new_bucket = Google::Apis::StorageV1::Bucket.new(**params)
383
385
  storage_class = storage_class_for storage_class
@@ -488,7 +488,7 @@ module Google
488
488
  options = range_header options, range
489
489
 
490
490
  execute do
491
- service.get_object_with_response \
491
+ service.get_object \
492
492
  bucket_name, file_path,
493
493
  download_dest: target_path, generation: generation,
494
494
  user_project: user_project(user_project),
@@ -774,160 +774,4 @@ module Google
774
774
  end
775
775
  end
776
776
  end
777
-
778
- # rubocop:disable all
779
-
780
- # @private
781
- #
782
- # IMPORTANT: These monkey-patches of Apis::StorageV1::StorageService and
783
- # Apis::Core::DownloadCommand must be verified and updated (if needed) for
784
- # every upgrade of google-api-client.
785
- #
786
- # The purpose of these modifications is to provide access to response headers
787
- # (in particular, the Content-Encoding header) for the #download_file method,
788
- # above. If google-api-client is modified to expose response headers to its
789
- # clients, this code should be removed, and #download_file updated to use that
790
- # solution instead.
791
- #
792
- module Apis
793
- # @private
794
- module StorageV1
795
- # @private
796
- class StorageService
797
- # Returns a two-element array containing:
798
- # * The `result` that is the usual return type of #get_object.
799
- # * The `http_resp` from DownloadCommand#execute_once.
800
- def get_object_with_response(bucket, object, generation: nil, if_generation_match: nil, if_generation_not_match: nil, if_metageneration_match: nil, if_metageneration_not_match: nil, projection: nil, user_project: nil, fields: nil, quota_user: nil, user_ip: nil, download_dest: nil, options: nil, &block)
801
- if download_dest.nil?
802
- command = make_simple_command(:get, 'b/{bucket}/o/{object}', options)
803
- else
804
- command = make_download_command(:get, 'b/{bucket}/o/{object}', options)
805
- command.download_dest = download_dest
806
- end
807
- command.response_representation = Google::Apis::StorageV1::Object::Representation
808
- command.response_class = Google::Apis::StorageV1::Object
809
- command.params['bucket'] = bucket unless bucket.nil?
810
- command.params['object'] = object unless object.nil?
811
- command.query['generation'] = generation unless generation.nil?
812
- command.query['ifGenerationMatch'] = if_generation_match unless if_generation_match.nil?
813
- command.query['ifGenerationNotMatch'] = if_generation_not_match unless if_generation_not_match.nil?
814
- command.query['ifMetagenerationMatch'] = if_metageneration_match unless if_metageneration_match.nil?
815
- command.query['ifMetagenerationNotMatch'] = if_metageneration_not_match unless if_metageneration_not_match.nil?
816
- command.query['projection'] = projection unless projection.nil?
817
- command.query['userProject'] = user_project unless user_project.nil?
818
- command.query['fields'] = fields unless fields.nil?
819
- command.query['quotaUser'] = quota_user unless quota_user.nil?
820
- command.query['userIp'] = user_ip unless user_ip.nil?
821
- execute_or_queue_command_with_response(command, &block)
822
- end
823
-
824
- # Returns a two-element array containing:
825
- # * The `result` that is the usual return type of #execute_or_queue_command.
826
- # * The `http_resp` from DownloadCommand#execute_once.
827
- def execute_or_queue_command_with_response(command, &callback)
828
- batch_command = current_batch
829
- if batch_command
830
- raise "Can not combine services in a batch" if Thread.current[:google_api_batch_service] != self
831
- batch_command.add(command, &callback)
832
- nil
833
- else
834
- command.execute_with_response(client, &callback)
835
- end
836
- end
837
- end
838
- end
839
- # @private
840
- module Core
841
- # @private
842
- # Streaming/resumable media download support
843
- class DownloadCommand < ApiCommand
844
- # Returns a two-element array containing:
845
- # * The `result` that is the usual return type of #execute.
846
- # * The `http_resp` from #execute_once.
847
- def execute_with_response(client)
848
- prepare!
849
- begin
850
- Retriable.retriable tries: options.retries + 1,
851
- base_interval: 1,
852
- multiplier: 2,
853
- on: RETRIABLE_ERRORS do |try|
854
- # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
855
- # auth to be re-attempted without having to retry all sorts of other failures like
856
- # NotFound, etc
857
- auth_tries = (try == 1 && authorization_refreshable? ? 2 : 1)
858
- Retriable.retriable tries: auth_tries,
859
- on: [Google::Apis::AuthorizationError, Signet::AuthorizationError],
860
- on_retry: proc { |*| refresh_authorization } do
861
- execute_once_with_response(client).tap do |result|
862
- if block_given?
863
- yield result, nil
864
- end
865
- end
866
- end
867
- end
868
- rescue => e
869
- if block_given?
870
- yield nil, e
871
- else
872
- raise e
873
- end
874
- end
875
- ensure
876
- release!
877
- end
878
-
879
- # Returns a two-element array containing:
880
- # * The `result` that is the usual return type of #execute_once.
881
- # * The `http_resp`.
882
- def execute_once_with_response(client, &block)
883
- request_header = header.dup
884
- apply_request_options(request_header)
885
- download_offset = nil
886
-
887
- if @offset > 0
888
- logger.debug { sprintf('Resuming download from offset %d', @offset) }
889
- request_header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
890
- end
891
-
892
- http_res = client.get(url.to_s,
893
- query: query,
894
- header: request_header,
895
- follow_redirect: true) do |res, chunk|
896
- status = res.http_header.status_code.to_i
897
- next unless OK_STATUS.include?(status)
898
-
899
- download_offset ||= (status == 206 ? @offset : 0)
900
- download_offset += chunk.bytesize
901
-
902
- if download_offset - chunk.bytesize == @offset
903
- next_chunk = chunk
904
- else
905
- # Oh no! Requested a chunk, but received the entire content
906
- chunk_index = @offset - (download_offset - chunk.bytesize)
907
- next_chunk = chunk.byteslice(chunk_index..-1)
908
- next if next_chunk.nil?
909
- end
910
- # logger.debug { sprintf('Writing chunk (%d bytes, %d total)', chunk.length, bytes_read) }
911
- @download_io.write(next_chunk)
912
-
913
- @offset += next_chunk.bytesize
914
- end
915
-
916
- @download_io.flush
917
-
918
- if @close_io_on_finish
919
- result = nil
920
- else
921
- result = @download_io
922
- end
923
- check_status(http_res.status.to_i, http_res.header, http_res.body)
924
- success([result, http_res], &block)
925
- rescue => e
926
- @download_io.flush
927
- error(e, rethrow: true, &block)
928
- end
929
- end
930
- end
931
- end
932
- # rubocop:enable all
933
777
  end
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Storage
19
- VERSION = "1.37.0".freeze
19
+ VERSION = "1.38.0".freeze
20
20
  end
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-storage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.37.0
4
+ version: 1.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-30 00:00:00.000000000 Z
12
+ date: 2022-08-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.1'
48
+ version: 0.17.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0.1'
55
+ version: 0.17.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: googleauth
58
58
  requirement: !ruby/object:Gem::Requirement