aws-sdk-s3 1.48.0 → 1.183.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.
Files changed (134) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1352 -0
  3. data/LICENSE.txt +202 -0
  4. data/VERSION +1 -0
  5. data/lib/aws-sdk-s3/access_grants_credentials.rb +57 -0
  6. data/lib/aws-sdk-s3/access_grants_credentials_provider.rb +250 -0
  7. data/lib/aws-sdk-s3/bucket.rb +1005 -106
  8. data/lib/aws-sdk-s3/bucket_acl.rb +65 -18
  9. data/lib/aws-sdk-s3/bucket_cors.rb +80 -18
  10. data/lib/aws-sdk-s3/bucket_lifecycle.rb +71 -20
  11. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +126 -21
  12. data/lib/aws-sdk-s3/bucket_logging.rb +68 -16
  13. data/lib/aws-sdk-s3/bucket_notification.rb +52 -20
  14. data/lib/aws-sdk-s3/bucket_policy.rb +108 -17
  15. data/lib/aws-sdk-s3/bucket_region_cache.rb +11 -5
  16. data/lib/aws-sdk-s3/bucket_request_payment.rb +60 -15
  17. data/lib/aws-sdk-s3/bucket_tagging.rb +71 -18
  18. data/lib/aws-sdk-s3/bucket_versioning.rb +133 -17
  19. data/lib/aws-sdk-s3/bucket_website.rb +78 -21
  20. data/lib/aws-sdk-s3/client.rb +14517 -941
  21. data/lib/aws-sdk-s3/client_api.rb +1296 -197
  22. data/lib/aws-sdk-s3/customizations/bucket.rb +56 -37
  23. data/lib/aws-sdk-s3/customizations/errors.rb +40 -0
  24. data/lib/aws-sdk-s3/customizations/multipart_upload.rb +2 -0
  25. data/lib/aws-sdk-s3/customizations/object.rb +288 -68
  26. data/lib/aws-sdk-s3/customizations/object_summary.rb +10 -0
  27. data/lib/aws-sdk-s3/customizations/object_version.rb +13 -0
  28. data/lib/aws-sdk-s3/customizations/types/list_object_versions_output.rb +2 -0
  29. data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
  30. data/lib/aws-sdk-s3/customizations.rb +27 -28
  31. data/lib/aws-sdk-s3/encryption/client.rb +28 -7
  32. data/lib/aws-sdk-s3/encryption/decrypt_handler.rb +71 -29
  33. data/lib/aws-sdk-s3/encryption/default_cipher_provider.rb +43 -5
  34. data/lib/aws-sdk-s3/encryption/default_key_provider.rb +2 -0
  35. data/lib/aws-sdk-s3/encryption/encrypt_handler.rb +13 -2
  36. data/lib/aws-sdk-s3/encryption/errors.rb +2 -0
  37. data/lib/aws-sdk-s3/encryption/io_auth_decrypter.rb +2 -0
  38. data/lib/aws-sdk-s3/encryption/io_decrypter.rb +11 -3
  39. data/lib/aws-sdk-s3/encryption/io_encrypter.rb +2 -0
  40. data/lib/aws-sdk-s3/encryption/key_provider.rb +2 -0
  41. data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +46 -11
  42. data/lib/aws-sdk-s3/encryption/materials.rb +8 -6
  43. data/lib/aws-sdk-s3/encryption/utils.rb +25 -0
  44. data/lib/aws-sdk-s3/encryption.rb +4 -0
  45. data/lib/aws-sdk-s3/encryptionV2/client.rb +570 -0
  46. data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +223 -0
  47. data/lib/aws-sdk-s3/encryptionV2/default_cipher_provider.rb +170 -0
  48. data/lib/aws-sdk-s3/encryptionV2/default_key_provider.rb +40 -0
  49. data/lib/aws-sdk-s3/encryptionV2/encrypt_handler.rb +65 -0
  50. data/lib/aws-sdk-s3/encryptionV2/errors.rb +37 -0
  51. data/lib/aws-sdk-s3/encryptionV2/io_auth_decrypter.rb +58 -0
  52. data/lib/aws-sdk-s3/encryptionV2/io_decrypter.rb +37 -0
  53. data/lib/aws-sdk-s3/encryptionV2/io_encrypter.rb +73 -0
  54. data/lib/aws-sdk-s3/encryptionV2/key_provider.rb +31 -0
  55. data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +173 -0
  56. data/lib/aws-sdk-s3/encryptionV2/materials.rb +60 -0
  57. data/lib/aws-sdk-s3/encryptionV2/utils.rb +103 -0
  58. data/lib/aws-sdk-s3/encryption_v2.rb +23 -0
  59. data/lib/aws-sdk-s3/endpoint_parameters.rb +181 -0
  60. data/lib/aws-sdk-s3/endpoint_provider.rb +716 -0
  61. data/lib/aws-sdk-s3/endpoints.rb +1434 -0
  62. data/lib/aws-sdk-s3/errors.rb +170 -1
  63. data/lib/aws-sdk-s3/event_streams.rb +8 -1
  64. data/lib/aws-sdk-s3/express_credentials.rb +55 -0
  65. data/lib/aws-sdk-s3/express_credentials_provider.rb +59 -0
  66. data/lib/aws-sdk-s3/file_downloader.rb +161 -46
  67. data/lib/aws-sdk-s3/file_part.rb +11 -6
  68. data/lib/aws-sdk-s3/file_uploader.rb +39 -18
  69. data/lib/aws-sdk-s3/legacy_signer.rb +17 -25
  70. data/lib/aws-sdk-s3/multipart_file_uploader.rb +104 -27
  71. data/lib/aws-sdk-s3/multipart_stream_uploader.rb +61 -21
  72. data/lib/aws-sdk-s3/multipart_upload.rb +342 -32
  73. data/lib/aws-sdk-s3/multipart_upload_error.rb +2 -0
  74. data/lib/aws-sdk-s3/multipart_upload_part.rb +384 -46
  75. data/lib/aws-sdk-s3/object.rb +2600 -231
  76. data/lib/aws-sdk-s3/object_acl.rb +103 -25
  77. data/lib/aws-sdk-s3/object_copier.rb +9 -5
  78. data/lib/aws-sdk-s3/object_multipart_copier.rb +48 -22
  79. data/lib/aws-sdk-s3/object_summary.rb +2174 -204
  80. data/lib/aws-sdk-s3/object_version.rb +539 -80
  81. data/lib/aws-sdk-s3/plugins/accelerate.rb +17 -64
  82. data/lib/aws-sdk-s3/plugins/access_grants.rb +178 -0
  83. data/lib/aws-sdk-s3/plugins/arn.rb +70 -0
  84. data/lib/aws-sdk-s3/plugins/bucket_dns.rb +7 -43
  85. data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +20 -3
  86. data/lib/aws-sdk-s3/plugins/checksum_algorithm.rb +31 -0
  87. data/lib/aws-sdk-s3/plugins/dualstack.rb +7 -50
  88. data/lib/aws-sdk-s3/plugins/endpoints.rb +86 -0
  89. data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +5 -4
  90. data/lib/aws-sdk-s3/plugins/express_session_auth.rb +88 -0
  91. data/lib/aws-sdk-s3/plugins/get_bucket_location_fix.rb +3 -1
  92. data/lib/aws-sdk-s3/plugins/http_200_errors.rb +62 -17
  93. data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +44 -0
  94. data/lib/aws-sdk-s3/plugins/location_constraint.rb +5 -1
  95. data/lib/aws-sdk-s3/plugins/md5s.rb +14 -70
  96. data/lib/aws-sdk-s3/plugins/redirects.rb +2 -0
  97. data/lib/aws-sdk-s3/plugins/s3_host_id.rb +2 -0
  98. data/lib/aws-sdk-s3/plugins/s3_signer.rb +63 -94
  99. data/lib/aws-sdk-s3/plugins/sse_cpk.rb +3 -1
  100. data/lib/aws-sdk-s3/plugins/streaming_retry.rb +139 -0
  101. data/lib/aws-sdk-s3/plugins/url_encoded_keys.rb +2 -0
  102. data/lib/aws-sdk-s3/presigned_post.rb +160 -99
  103. data/lib/aws-sdk-s3/presigner.rb +141 -62
  104. data/lib/aws-sdk-s3/resource.rb +156 -17
  105. data/lib/aws-sdk-s3/types.rb +13021 -4106
  106. data/lib/aws-sdk-s3/waiters.rb +67 -1
  107. data/lib/aws-sdk-s3.rb +46 -32
  108. data/sig/bucket.rbs +222 -0
  109. data/sig/bucket_acl.rbs +78 -0
  110. data/sig/bucket_cors.rbs +69 -0
  111. data/sig/bucket_lifecycle.rbs +88 -0
  112. data/sig/bucket_lifecycle_configuration.rbs +115 -0
  113. data/sig/bucket_logging.rbs +76 -0
  114. data/sig/bucket_notification.rbs +114 -0
  115. data/sig/bucket_policy.rbs +59 -0
  116. data/sig/bucket_request_payment.rbs +54 -0
  117. data/sig/bucket_tagging.rbs +65 -0
  118. data/sig/bucket_versioning.rbs +77 -0
  119. data/sig/bucket_website.rbs +93 -0
  120. data/sig/client.rbs +2472 -0
  121. data/sig/customizations/bucket.rbs +19 -0
  122. data/sig/customizations/object.rbs +38 -0
  123. data/sig/customizations/object_summary.rbs +35 -0
  124. data/sig/errors.rbs +42 -0
  125. data/sig/multipart_upload.rbs +120 -0
  126. data/sig/multipart_upload_part.rbs +109 -0
  127. data/sig/object.rbs +459 -0
  128. data/sig/object_acl.rbs +86 -0
  129. data/sig/object_summary.rbs +345 -0
  130. data/sig/object_version.rbs +143 -0
  131. data/sig/resource.rbs +134 -0
  132. data/sig/types.rbs +2712 -0
  133. data/sig/waiters.rbs +95 -0
  134. metadata +74 -15
@@ -1,14 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Aws
2
4
  module S3
3
5
  class Object
4
-
5
6
  alias size content_length
6
7
 
8
+ # Make the method redefinable
9
+ alias_method :copy_from, :copy_from
10
+
7
11
  # Copies another object to this object. Use `multipart_copy: true`
8
12
  # for large objects. This is required for objects that exceed 5GB.
9
13
  #
10
- # @param [S3::Object, S3::ObjectVersion, S3::ObjectSummary, String, Hash] source
11
- # Where to copy object data from. `source` must be one of the following:
14
+ # @param [S3::Object, S3::ObjectVersion, S3::ObjectSummary, String, Hash]
15
+ # source Where to copy object data from. `source` must be one of the
16
+ # following:
12
17
  #
13
18
  # * {Aws::S3::Object}
14
19
  # * {Aws::S3::ObjectSummary}
@@ -22,10 +27,14 @@ module Aws
22
27
  # necessary for objects larger than 5GB and can provide
23
28
  # performance improvements on large objects. Amazon S3 does
24
29
  # not accept multipart copies for objects smaller than 5MB.
30
+ # Object metadata such as Content-Type will be copied, however,
31
+ # Checksums are not copied.
25
32
  #
26
33
  # @option options [Integer] :content_length Only used when
27
34
  # `:multipart_copy` is `true`. Passing this options avoids a HEAD
28
- # request to query the source object size.
35
+ # request to query the source object size but prevents object metadata
36
+ # from being copied. Raises an `ArgumentError` if
37
+ # this option is provided when `:multipart_copy` is `false` or not set.
29
38
  #
30
39
  # @option options [S3::Client] :copy_source_client Only used when
31
40
  # `:multipart_copy` is `true` and the source object is in a
@@ -37,6 +46,14 @@ module Aws
37
46
  # different region. You do not need to specify this option
38
47
  # if you have provided a `:source_client` or a `:content_length`.
39
48
  #
49
+ # @option options [Boolean] :use_source_parts (false) Only used when
50
+ # `:multipart_copy` is `true`. Use part sizes defined on the source
51
+ # object if any exist. If copying or moving an object that
52
+ # is already multipart, this does not re-part the object, instead
53
+ # re-using the part definitions on the original. That means the etag
54
+ # and any checksums will not change. This is especially useful if the
55
+ # source object has parts with varied sizes.
56
+ #
40
57
  # @example Basic object copy
41
58
  #
42
59
  # bucket = Aws::S3::Bucket.new('target-bucket')
@@ -59,11 +76,13 @@ module Aws
59
76
  # @see #copy_to
60
77
  #
61
78
  def copy_from(source, options = {})
62
- if Hash === source && source[:copy_source]
63
- # for backwards compatibility
64
- @client.copy_object(source.merge(bucket: bucket_name, key: key))
65
- else
66
- ObjectCopier.new(self, options).copy_from(source, options)
79
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
80
+ if Hash === source && source[:copy_source]
81
+ # for backwards compatibility
82
+ @client.copy_object(source.merge(bucket: bucket_name, key: key))
83
+ else
84
+ ObjectCopier.new(self, options).copy_from(source, options)
85
+ end
67
86
  end
68
87
  end
69
88
 
@@ -100,11 +119,14 @@ module Aws
100
119
  # object.copy_to('src-bucket/src-key', multipart_copy: true)
101
120
  #
102
121
  def copy_to(target, options = {})
103
- ObjectCopier.new(self, options).copy_to(target, options)
122
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
123
+ ObjectCopier.new(self, options).copy_to(target, options)
124
+ end
104
125
  end
105
126
 
106
- # Copies and deletes the current object. The object will only be
107
- # deleted if the copy operation succeeds.
127
+ # Copies and deletes the current object. The object will only be deleted
128
+ # if the copy operation succeeds.
129
+ #
108
130
  # @param (see Object#copy_to)
109
131
  # @option (see Object#copy_to)
110
132
  # @return [void]
@@ -129,10 +151,7 @@ module Aws
129
151
  client.config.credentials,
130
152
  client.config.region,
131
153
  bucket_name,
132
- {
133
- key: key,
134
- url: bucket.url,
135
- }.merge(options)
154
+ { key: key, url: bucket.url }.merge(options)
136
155
  )
137
156
  end
138
157
 
@@ -149,21 +168,35 @@ module Aws
149
168
  # obj.presigned_url(:put, acl: 'public-read')
150
169
  # #=> "https://bucket-name.s3.amazonaws.com/object-key?..."
151
170
  #
152
- # @param [Symbol] http_method
153
- # The HTTP method to generate a presigned URL for. Valid values
154
- # are `:get`, `:put`, `:head`, and `:delete`.
171
+ # @example Pre-signed UploadPart PUT
172
+ #
173
+ # # the object uploaded using this URL will be publicly accessible
174
+ # obj.presigned_url(:upload_part, part_number: 1, upload_id: 'uploadIdToken')
175
+ # #=> "https://bucket-name.s3.amazonaws.com/object-key?..."
176
+ #
177
+ # @param [Symbol] method
178
+ # The S3 operation to generate a presigned URL for. Valid values
179
+ # are `:get`, `:put`, `:head`, `:delete`, `:create_multipart_upload`,
180
+ # `:list_multipart_uploads`, `:complete_multipart_upload`,
181
+ # `:abort_multipart_upload`, `:list_parts`, and `:upload_part`.
155
182
  #
156
183
  # @param [Hash] params
157
184
  # Additional request parameters to use when generating the pre-signed
158
185
  # URL. See the related documentation in {Client} for accepted
159
186
  # params.
160
187
  #
161
- # | HTTP Method | Client Method |
162
- # |---------------|------------------------|
163
- # | `:get` | {Client#get_object} |
164
- # | `:put` | {Client#put_object} |
165
- # | `:head` | {Client#head_object} |
166
- # | `:delete` | {Client#delete_object} |
188
+ # | Method | Client Method |
189
+ # |------------------------------|------------------------------------|
190
+ # | `:get` | {Client#get_object} |
191
+ # | `:put` | {Client#put_object} |
192
+ # | `:head` | {Client#head_object} |
193
+ # | `:delete` | {Client#delete_object} |
194
+ # | `:create_multipart_upload` | {Client#create_multipart_upload} |
195
+ # | `:list_multipart_uploads` | {Client#list_multipart_uploads} |
196
+ # | `:complete_multipart_upload` | {Client#complete_multipart_upload} |
197
+ # | `:abort_multipart_upload` | {Client#abort_multipart_upload} |
198
+ # | `:list_parts` | {Client#list_parts} |
199
+ # | `:upload_part` | {Client#upload_part} |
167
200
  #
168
201
  # @option params [Boolean] :virtual_host (false) When `true` the
169
202
  # presigned URL will use the bucket name as a virtual host.
@@ -184,12 +217,90 @@ module Aws
184
217
  #
185
218
  # @return [String]
186
219
  #
187
- def presigned_url(http_method, params = {})
220
+ def presigned_url(method, params = {})
188
221
  presigner = Presigner.new(client: client)
189
- presigner.presigned_url("#{http_method.downcase}_object", params.merge(
190
- bucket: bucket_name,
191
- key: key,
192
- ))
222
+
223
+ if %w(delete head get put).include?(method.to_s)
224
+ method = "#{method}_object".to_sym
225
+ end
226
+
227
+ presigner.presigned_url(
228
+ method.downcase,
229
+ params.merge(bucket: bucket_name, key: key)
230
+ )
231
+ end
232
+
233
+ # Allows you to create presigned URL requests for S3 operations. This
234
+ # method returns a tuple containing the URL and the signed X-amz-* headers
235
+ # to be used with the presigned url.
236
+ #
237
+ # @example Pre-signed GET URL, valid for one hour
238
+ #
239
+ # obj.presigned_request(:get, expires_in: 3600)
240
+ # #=> ["https://bucket-name.s3.amazonaws.com/object-key?...", {}]
241
+ #
242
+ # @example Pre-signed PUT with a canned ACL
243
+ #
244
+ # # the object uploaded using this URL will be publicly accessible
245
+ # obj.presigned_request(:put, acl: 'public-read')
246
+ # #=> ["https://bucket-name.s3.amazonaws.com/object-key?...",
247
+ # {"x-amz-acl"=>"public-read"}]
248
+ #
249
+ # @param [Symbol] method
250
+ # The S3 operation to generate a presigned request for. Valid values
251
+ # are `:get`, `:put`, `:head`, `:delete`, `:create_multipart_upload`,
252
+ # `:list_multipart_uploads`, `:complete_multipart_upload`,
253
+ # `:abort_multipart_upload`, `:list_parts`, and `:upload_part`.
254
+ #
255
+ # @param [Hash] params
256
+ # Additional request parameters to use when generating the pre-signed
257
+ # request. See the related documentation in {Client} for accepted
258
+ # params.
259
+ #
260
+ # | Method | Client Method |
261
+ # |------------------------------|------------------------------------|
262
+ # | `:get` | {Client#get_object} |
263
+ # | `:put` | {Client#put_object} |
264
+ # | `:head` | {Client#head_object} |
265
+ # | `:delete` | {Client#delete_object} |
266
+ # | `:create_multipart_upload` | {Client#create_multipart_upload} |
267
+ # | `:list_multipart_uploads` | {Client#list_multipart_uploads} |
268
+ # | `:complete_multipart_upload` | {Client#complete_multipart_upload} |
269
+ # | `:abort_multipart_upload` | {Client#abort_multipart_upload} |
270
+ # | `:list_parts` | {Client#list_parts} |
271
+ # | `:upload_part` | {Client#upload_part} |
272
+ #
273
+ # @option params [Boolean] :virtual_host (false) When `true` the
274
+ # presigned URL will use the bucket name as a virtual host.
275
+ #
276
+ # bucket = Aws::S3::Bucket.new('my.bucket.com')
277
+ # bucket.object('key').presigned_request(virtual_host: true)
278
+ # #=> ["http://my.bucket.com/key?...", {}]
279
+ #
280
+ # @option params [Integer] :expires_in (900) Number of seconds before
281
+ # the pre-signed URL expires. This may not exceed one week (604800
282
+ # seconds). Note that the pre-signed URL is also only valid as long as
283
+ # credentials used to sign it are. For example, when using IAM roles,
284
+ # temporary tokens generated for signing also have a default expiration
285
+ # which will affect the effective expiration of the pre-signed URL.
286
+ #
287
+ # @raise [ArgumentError] Raised if `:expires_in` exceeds one week
288
+ # (604800 seconds).
289
+ #
290
+ # @return [String, Hash] A tuple with a presigned URL and headers that
291
+ # should be included with the request.
292
+ #
293
+ def presigned_request(method, params = {})
294
+ presigner = Presigner.new(client: client)
295
+
296
+ if %w(delete head get put).include?(method.to_s)
297
+ method = "#{method}_object".to_sym
298
+ end
299
+
300
+ presigner.presigned_request(
301
+ method.downcase,
302
+ params.merge(bucket: bucket_name, key: key)
303
+ )
193
304
  end
194
305
 
195
306
  # Returns the public (un-signed) URL for this object.
@@ -197,15 +308,22 @@ module Aws
197
308
  # s3.bucket('bucket-name').object('obj-key').public_url
198
309
  # #=> "https://bucket-name.s3.amazonaws.com/obj-key"
199
310
  #
200
- # To use virtual hosted bucket url (disables https):
311
+ # To use virtual hosted bucket url.
312
+ # Uses https unless secure: false is set. If the bucket
313
+ # name contains dots (.) then you will need to set secure: false.
201
314
  #
202
- # s3.bucket('my.bucket.com').object('key').public_url(virtual_host: true)
203
- # #=> "http://my.bucket.com/key"
315
+ # s3.bucket('my-bucket.com').object('key')
316
+ # .public_url(virtual_host: true)
317
+ # #=> "https://my-bucket.com/key"
204
318
  #
205
319
  # @option options [Boolean] :virtual_host (false) When `true`, the bucket
206
320
  # name will be used as the host name. This is useful when you have
207
321
  # a CNAME configured for the bucket.
208
322
  #
323
+ # @option options [Boolean] :secure (true) When `false`, http
324
+ # will be used with virtual_host. This is required when
325
+ # the bucket name has a dot (.) in it.
326
+ #
209
327
  # @return [String]
210
328
  def public_url(options = {})
211
329
  url = URI.parse(bucket.url(options))
@@ -216,11 +334,12 @@ module Aws
216
334
 
217
335
  # Uploads a stream in a streaming fashion to the current object in S3.
218
336
  #
219
- # # Passed chunks automatically split into multipart upload parts
220
- # # and the parts are uploaded in parallel. This allows for streaming uploads
221
- # # that never touch the disk.
337
+ # Passed chunks automatically split into multipart upload parts and the
338
+ # parts are uploaded in parallel. This allows for streaming uploads that
339
+ # never touch the disk.
222
340
  #
223
- # Note that this is known to have issues in JRuby until jruby-9.1.15.0, so avoid using this with older versions of JRuby.
341
+ # Note that this is known to have issues in JRuby until jruby-9.1.15.0,
342
+ # so avoid using this with older versions of JRuby.
224
343
  #
225
344
  # @example Streaming chunks of data
226
345
  # obj.upload_stream do |write_stream|
@@ -234,18 +353,20 @@ module Aws
234
353
  # obj.upload_stream do |write_stream|
235
354
  # IO.copy_stream(STDIN, write_stream)
236
355
  # end
356
+ # @param [Hash] options
357
+ # Additional options for {Client#create_multipart_upload},
358
+ # {Client#complete_multipart_upload},
359
+ # and {Client#upload_part} can be provided.
237
360
  #
238
- # @option options [Integer] :thread_count
239
- # The number of parallel multipart uploads
240
- # Default `:thread_count` is `10`.
361
+ # @option options [Integer] :thread_count (10) The number of parallel
362
+ # multipart uploads
241
363
  #
242
- # @option options [Boolean] :tempfile
243
- # Normally read data is stored in memory when building the parts in order to complete
244
- # the underlying multipart upload. By passing `:tempfile => true` data read will be
364
+ # @option options [Boolean] :tempfile (false) Normally read data is stored
365
+ # in memory when building the parts in order to complete the underlying
366
+ # multipart upload. By passing `:tempfile => true` data read will be
245
367
  # temporarily stored on disk reducing the memory footprint vastly.
246
- # Default `:tempfile` is `false`.
247
368
  #
248
- # @option options [Integer] :part_size
369
+ # @option options [Integer] :part_size (5242880)
249
370
  # Define how big each part size but the last should be.
250
371
  # Default `:part_size` is `5 * 1024 * 1024`.
251
372
  #
@@ -258,15 +379,23 @@ module Aws
258
379
  # @return [Boolean] Returns `true` when the object is uploaded
259
380
  # without any errors.
260
381
  #
382
+ # @see Client#create_multipart_upload
383
+ # @see Client#complete_multipart_upload
384
+ # @see Client#upload_part
261
385
  def upload_stream(options = {}, &block)
262
386
  uploading_options = options.dup
263
387
  uploader = MultipartStreamUploader.new(
264
388
  client: client,
265
389
  thread_count: uploading_options.delete(:thread_count),
266
390
  tempfile: uploading_options.delete(:tempfile),
267
- part_size: uploading_options.delete(:part_size),
391
+ part_size: uploading_options.delete(:part_size)
268
392
  )
269
- uploader.upload(uploading_options.merge(bucket: bucket_name, key: key), &block)
393
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
394
+ uploader.upload(
395
+ uploading_options.merge(bucket: bucket_name, key: key),
396
+ &block
397
+ )
398
+ end
270
399
  true
271
400
  end
272
401
 
@@ -275,21 +404,55 @@ module Aws
275
404
  # # small files are uploaded in a single API call
276
405
  # obj.upload_file('/path/to/file')
277
406
  #
278
- # Files larger than `:multipart_threshold` are uploaded using the
279
- # Amazon S3 multipart upload APIs.
407
+ # Files larger than or equal to `:multipart_threshold` are uploaded
408
+ # using the Amazon S3 multipart upload APIs.
280
409
  #
281
410
  # # large files are automatically split into parts
282
411
  # # and the parts are uploaded in parallel
283
412
  # obj.upload_file('/path/to/very_large_file')
284
413
  #
285
- # @param [String,Pathname,File,Tempfile] source A file or path to a file
286
- # on the local file system that should be uploaded to this object.
287
- # If you pass an open file object, then it is your responsibility
288
- # to close the file object once the upload completes.
414
+ # The response of the S3 upload API is yielded if a block given.
415
+ #
416
+ # # API response will have etag value of the file
417
+ # obj.upload_file('/path/to/file') do |response|
418
+ # etag = response.etag
419
+ # end
420
+ #
421
+ # You can provide a callback to monitor progress of the upload:
289
422
  #
290
- # @option options [Integer] :multipart_threshold (15728640) Files larger
291
- # than `:multipart_threshold` are uploaded using the S3 multipart APIs.
292
- # Default threshold is 15MB.
423
+ # # bytes and totals are each an array with 1 entry per part
424
+ # progress = Proc.new do |bytes, totals|
425
+ # puts bytes.map.with_index { |b, i| "Part #{i+1}: #{b} / #{totals[i]}"}.join(' ') + "Total: #{100.0 * bytes.sum / totals.sum }%" }
426
+ # end
427
+ # obj.upload_file('/path/to/file', progress_callback: progress)
428
+ #
429
+ # @param [String, Pathname, File, Tempfile] source A file on the local
430
+ # file system that will be uploaded as this object. This can either be
431
+ # a String or Pathname to the file, an open File object, or an open
432
+ # Tempfile object. If you pass an open File or Tempfile object, then
433
+ # you are responsible for closing it after the upload completes. When
434
+ # using an open Tempfile, rewind it before uploading or else the object
435
+ # will be empty.
436
+ #
437
+ # @param [Hash] options
438
+ # Additional options for {Client#put_object}
439
+ # when file sizes below the multipart threshold. For files larger than
440
+ # the multipart threshold, options for {Client#create_multipart_upload},
441
+ # {Client#complete_multipart_upload},
442
+ # and {Client#upload_part} can be provided.
443
+ #
444
+ # @option options [Integer] :multipart_threshold (104857600) Files larger
445
+ # than or equal to `:multipart_threshold` are uploaded using the S3
446
+ # multipart APIs.
447
+ # Default threshold is 100MB.
448
+ #
449
+ # @option options [Integer] :thread_count (10) The number of parallel
450
+ # multipart uploads. This option is not used if the file is smaller than
451
+ # `:multipart_threshold`.
452
+ #
453
+ # @option options [Proc] :progress_callback
454
+ # A Proc that will be called when each chunk of the upload is sent.
455
+ # It will be invoked with [bytes_read], [total_sizes]
293
456
  #
294
457
  # @raise [MultipartUploadError] If an object is being uploaded in
295
458
  # parts, and the upload can not be completed, then the upload is
@@ -300,12 +463,23 @@ module Aws
300
463
  # @return [Boolean] Returns `true` when the object is uploaded
301
464
  # without any errors.
302
465
  #
466
+ # @see Client#put_object
467
+ # @see Client#create_multipart_upload
468
+ # @see Client#complete_multipart_upload
469
+ # @see Client#upload_part
303
470
  def upload_file(source, options = {})
304
471
  uploading_options = options.dup
305
472
  uploader = FileUploader.new(
306
473
  multipart_threshold: uploading_options.delete(:multipart_threshold),
307
- client: client)
308
- uploader.upload(source, uploading_options.merge(bucket: bucket_name, key: key))
474
+ client: client
475
+ )
476
+ response = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
477
+ uploader.upload(
478
+ source,
479
+ uploading_options.merge(bucket: bucket_name, key: key)
480
+ )
481
+ end
482
+ yield response if block_given?
309
483
  true
310
484
  end
311
485
 
@@ -320,7 +494,20 @@ module Aws
320
494
  # # and the parts are downloaded in parallel
321
495
  # obj.download_file('/path/to/very_large_file')
322
496
  #
323
- # @param [String] destination Where to download the file to
497
+ # You can provide a callback to monitor progress of the download:
498
+ #
499
+ # # bytes and part_sizes are each an array with 1 entry per part
500
+ # # part_sizes may not be known until the first bytes are retrieved
501
+ # progress = Proc.new do |bytes, part_sizes, file_size|
502
+ # puts bytes.map.with_index { |b, i| "Part #{i+1}: #{b} / #{part_sizes[i]}"}.join(' ') + "Total: #{100.0 * bytes.sum / file_size}%" }
503
+ # end
504
+ # obj.download_file('/path/to/file', progress_callback: progress)
505
+ #
506
+ # @param [String] destination Where to download the file to.
507
+ #
508
+ # @param [Hash] options
509
+ # Additional options for {Client#get_object} and #{Client#head_object}
510
+ # may be provided.
324
511
  #
325
512
  # @option options [String] mode `auto`, `single_request`, `get_range`
326
513
  # `single_request` mode forces only 1 GET request is made in download,
@@ -328,23 +515,56 @@ module Aws
328
515
  # customizing each range size in multipart_download,
329
516
  # By default, `auto` mode is enabled, which performs multipart_download
330
517
  #
331
- # @option options [String] chunk_size required in get_range mode
518
+ # @option options [Integer] chunk_size required in get_range mode.
332
519
  #
333
- # @option options [String] thread_count Customize threads used in multipart
334
- # download, if not provided, 10 is default value
520
+ # @option options [Integer] thread_count (10) Customize threads used in
521
+ # the multipart download.
335
522
  #
336
- # @option options [String] version_id The object version id used to retrieve
337
- # the object, to know more about object versioning, see:
523
+ # @option options [String] version_id The object version id used to
524
+ # retrieve the object. For more about object versioning, see:
338
525
  # https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectVersioning.html
339
526
  #
340
- # @return [Boolean] Returns `true` when the file is downloaded
341
- # without any errors.
527
+ # @option options [String] checksum_mode (ENABLED) When `ENABLED` and
528
+ # the object has a stored checksum, it will be used to validate the
529
+ # download and will raise an `Aws::Errors::ChecksumError` if
530
+ # checksum validation fails. You may provide a `on_checksum_validated`
531
+ # callback if you need to verify that validation occurred and which
532
+ # algorithm was used. To disable checksum validation, set
533
+ # `checksum_mode` to "DISABLED".
534
+ #
535
+ # @option options [Callable] on_checksum_validated Called each time a
536
+ # request's checksum is validated with the checksum algorithm and the
537
+ # response. For multipart downloads, this will be called for each
538
+ # part that is downloaded and validated.
539
+ #
540
+ # @option options [Proc] :progress_callback
541
+ # A Proc that will be called when each chunk of the download is received.
542
+ # It will be invoked with [bytes_read], [part_sizes], file_size.
543
+ # When the object is downloaded as parts (rather than by ranges), the
544
+ # part_sizes will not be known ahead of time and will be nil in the
545
+ # callback until the first bytes in the part are received.
546
+ #
547
+ # @return [Boolean] Returns `true` when the file is downloaded without
548
+ # any errors.
549
+ #
550
+ # @see Client#get_object
551
+ # @see Client#head_object
342
552
  def download_file(destination, options = {})
343
553
  downloader = FileDownloader.new(client: client)
344
- downloader.download(
345
- destination, options.merge(bucket: bucket_name, key: key))
554
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
555
+ downloader.download(
556
+ destination,
557
+ options.merge(bucket: bucket_name, key: key)
558
+ )
559
+ end
346
560
  true
347
561
  end
562
+
563
+ class Collection < Aws::Resources::Collection
564
+ alias_method :delete, :batch_delete!
565
+ extend Aws::Deprecations
566
+ deprecated :delete, use: :batch_delete!
567
+ end
348
568
  end
349
569
  end
350
570
  end
@@ -1,9 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Aws
2
4
  module S3
3
5
  class ObjectSummary
4
6
 
5
7
  alias content_length size
6
8
 
9
+ # Make the method redefinable
10
+ alias_method :copy_from, :copy_from
11
+
7
12
  # @param (see Object#copy_from)
8
13
  # @options (see Object#copy_from)
9
14
  # @return (see Object#copy_from)
@@ -75,6 +80,11 @@ module Aws
75
80
  object.download_file(destination, options)
76
81
  end
77
82
 
83
+ class Collection < Aws::Resources::Collection
84
+ alias_method :delete, :batch_delete!
85
+ extend Aws::Deprecations
86
+ deprecated :delete, use: :batch_delete!
87
+ end
78
88
  end
79
89
  end
80
90
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ class ObjectVersion
6
+ class Collection < Aws::Resources::Collection
7
+ alias_method :delete, :batch_delete!
8
+ extend Aws::Deprecations
9
+ deprecated :delete, use: :batch_delete!
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Aws::S3::Types::ListObjectVersionsOutput
2
4
 
3
5
  # TODO : Remove this customization once the resource code
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ module Types
6
+ # This error is not modeled.
7
+ #
8
+ # The bucket you are attempting to access must be addressed using the
9
+ # specified endpoint. Please send all future requests to this endpoint.
10
+ #
11
+ # @!attribute [rw] endpoint
12
+ # @return [String]
13
+ #
14
+ # @!attribute [rw] bucket
15
+ # @return [String]
16
+ #
17
+ # @!attribute [rw] message
18
+ # @return [String]
19
+ #
20
+ class PermanentRedirect < Struct.new(:endpoint, :bucket, :region, :message)
21
+ SENSITIVE = []
22
+ include Aws::Structure
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,31 +1,30 @@
1
- # utility classes
2
- require 'aws-sdk-s3/bucket_region_cache'
3
- require 'aws-sdk-s3/encryption'
4
- require 'aws-sdk-s3/file_part'
5
- require 'aws-sdk-s3/file_uploader'
6
- require 'aws-sdk-s3/file_downloader'
7
- require 'aws-sdk-s3/legacy_signer'
8
- require 'aws-sdk-s3/multipart_file_uploader'
9
- require 'aws-sdk-s3/multipart_stream_uploader'
10
- require 'aws-sdk-s3/multipart_upload_error'
11
- require 'aws-sdk-s3/object_copier'
12
- require 'aws-sdk-s3/object_multipart_copier'
13
- require 'aws-sdk-s3/presigned_post'
14
- require 'aws-sdk-s3/presigner'
1
+ # frozen_string_literal: true
15
2
 
16
- # customizations to generated classes
17
- require 'aws-sdk-s3/customizations/bucket'
18
- require 'aws-sdk-s3/customizations/object'
19
- require 'aws-sdk-s3/customizations/object_summary'
20
- require 'aws-sdk-s3/customizations/multipart_upload'
21
- require 'aws-sdk-s3/customizations/types/list_object_versions_output'
3
+ module Aws
4
+ module S3
5
+ # utility classes
6
+ autoload :BucketRegionCache, 'aws-sdk-s3/bucket_region_cache'
7
+ autoload :Encryption, 'aws-sdk-s3/encryption'
8
+ autoload :EncryptionV2, 'aws-sdk-s3/encryption_v2'
9
+ autoload :FilePart, 'aws-sdk-s3/file_part'
10
+ autoload :FileUploader, 'aws-sdk-s3/file_uploader'
11
+ autoload :FileDownloader, 'aws-sdk-s3/file_downloader'
12
+ autoload :LegacySigner, 'aws-sdk-s3/legacy_signer'
13
+ autoload :MultipartFileUploader, 'aws-sdk-s3/multipart_file_uploader'
14
+ autoload :MultipartStreamUploader, 'aws-sdk-s3/multipart_stream_uploader'
15
+ autoload :MultipartUploadError, 'aws-sdk-s3/multipart_upload_error'
16
+ autoload :ObjectCopier, 'aws-sdk-s3/object_copier'
17
+ autoload :ObjectMultipartCopier, 'aws-sdk-s3/object_multipart_copier'
18
+ autoload :PresignedPost, 'aws-sdk-s3/presigned_post'
19
+ autoload :Presigner, 'aws-sdk-s3/presigner'
22
20
 
23
- [
24
- Aws::S3::Object::Collection,
25
- Aws::S3::ObjectSummary::Collection,
26
- Aws::S3::ObjectVersion::Collection,
27
- ].each do |klass|
28
- klass.send(:alias_method, :delete, :batch_delete!)
29
- klass.send(:extend, Aws::Deprecations)
30
- klass.send(:deprecated, :delete, use: :batch_delete!)
21
+ # s3 express session auth
22
+ autoload :ExpressCredentials, 'aws-sdk-s3/express_credentials'
23
+ autoload :ExpressCredentialsProvider, 'aws-sdk-s3/express_credentials_provider'
24
+
25
+ # s3 access grants auth
26
+
27
+ autoload :AccessGrantsCredentials, 'aws-sdk-s3/access_grants_credentials'
28
+ autoload :AccessGrantsCredentialsProvider, 'aws-sdk-s3/access_grants_credentials_provider'
29
+ end
31
30
  end