fog-aws 3.31.0 → 3.33.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: d7794f67756d283af6606ff87f6b2b6599c3ed3b17cc6db10c536ae768640313
4
- data.tar.gz: 122cff38a7493c120d605514afabcd410de9e6d1be041e50ff4ff1c3f6c8fcc1
3
+ metadata.gz: e082ebe8e5a7cc585e85b6d2415306da6a2c0fec952ea3a62754dddfa82087d3
4
+ data.tar.gz: ac57b359e23b43ac11189ae93ee9f7eee31ac16b16d69ecc00f885b41f357105
5
5
  SHA512:
6
- metadata.gz: 28ce47b3633913750148f26382218dd1ff7f168cead3972427efcf034597bf57bd029dc6c1ac132b718699ae7f1eaeb34d7b405256df5785027dd2acffdf3301
7
- data.tar.gz: ff37460e9621a6f86141c9770e6f1c56ca8fd0d7abb5e4d5d67b621663d46bdabd3fbee384e15f6b32ff518a0127b14cfb45a780adeb296a3f365c5674e1bc66
6
+ metadata.gz: b4e819ca80fc191bfd1a28888924a121f96e94e90315f2f62cc5b3c7702b810b9358ab6812c67c3d1dcf184ef673717030f3218a32f7c0e49a78c0cb4e89ebc8
7
+ data.tar.gz: 2959e61875371b8e0e06575855fa571669b477390c02c77515a1cba7c9f351b5ddd84865116d890b7a1be76ab91c5abf806aac5687345f167e1da2d9a396700f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## v3.33.0 (2025-08-27)
4
+
5
+ Closed issues:
6
+
7
+ - Add support for ListObjectsV2 [\#741](https://github.com/fog/fog-aws/issues/741)
8
+
9
+
10
+ Merged pull requests:
11
+
12
+ - Update base64 requirement from ~\> 0.2.0 to \>= 0.2, \< 0.4 [\#743](https://github.com/fog/fog-aws/pull/743) ([dependabot[bot]](https://github.com/apps/dependabot))
13
+ - Fix #741 Added list objects v2 api support [\#744](https://github.com/fog/fog-aws/pull/744)
14
+ - Update rubyzip requirement from ~\> 2.4.1 to ~\> 3.0.0 [\#746](https://github.com/fog/fog-aws/pull/746) ([dependabot[bot]](https://github.com/apps/dependabot))
15
+ - storage headers should be rejected in a case-insensitive way [\#747](https://github.com/fog/fog-aws/pull/747)
16
+
17
+ ## [v3.32.0](https://github.com/fog/fog-aws/tree/v3.32.0) (2025-05-27)
18
+
19
+ [Full Changelog](https://github.com/fog/fog-aws/compare/v3.31.0...v3.32.0)
20
+
21
+ **Closed issues:**
22
+
23
+ - Add ability to specify s3 restore object tier in post\_object\_restore [\#740](https://github.com/fog/fog-aws/issues/740)
24
+
25
+ **Merged pull requests:**
26
+
27
+ - Add ability to specify s3 restore object tier in post\_object\_restore [\#742](https://github.com/fog/fog-aws/pull/742) ([Ankk98](https://github.com/Ankk98))
28
+
29
+ ## [v3.31.0](https://github.com/fog/fog-aws/tree/v3.31.0) (2025-04-21)
30
+
31
+ [Full Changelog](https://github.com/fog/fog-aws/compare/v3.30.0...v3.31.0)
32
+
33
+ **Closed issues:**
34
+
35
+ - Compute.describe\_instance\_status\(\) fails [\#734](https://github.com/fog/fog-aws/issues/734)
36
+
37
+ **Merged pull requests:**
38
+
39
+ - Fix Compute.describe\_instance\_status parser [\#735](https://github.com/fog/fog-aws/pull/735) ([kitherill](https://github.com/kitherill))
40
+ - Update rubyzip requirement from ~\> 2.3.0 to ~\> 2.4.1 [\#733](https://github.com/fog/fog-aws/pull/733) ([dependabot[bot]](https://github.com/apps/dependabot))
41
+
3
42
  ## [v3.30.0](https://github.com/fog/fog-aws/tree/v3.30.0) (2024-12-17)
4
43
 
5
44
  [Full Changelog](https://github.com/fog/fog-aws/compare/v3.29.0...v3.30.0)
@@ -22,18 +61,6 @@
22
61
 
23
62
  - fallback to excon 1.0+ error retry error settings [\#728](https://github.com/fog/fog-aws/pull/728) ([geemus](https://github.com/geemus))
24
63
 
25
- ## [v3.28.0](https://github.com/fog/fog-aws/tree/v3.28.0) (2024-10-14)
26
-
27
- [Full Changelog](https://github.com/fog/fog-aws/compare/v3.27.0...v3.28.0)
28
-
29
- **Closed issues:**
30
-
31
- - SES needs to support AWS SigV4 [\#726](https://github.com/fog/fog-aws/issues/726)
32
-
33
- **Merged pull requests:**
34
-
35
- - Update SES to use AWS SigV4 [\#727](https://github.com/fog/fog-aws/pull/727) ([ohookins](https://github.com/ohookins))
36
-
37
64
 
38
65
 
39
66
  \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
data/fog-aws.gemspec CHANGED
@@ -25,10 +25,10 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'bundler'
26
26
  spec.add_development_dependency 'github_changelog_generator', '~> 1.16'
27
27
  spec.add_development_dependency 'rake', '>= 12.3.3'
28
- spec.add_development_dependency 'rubyzip', '~> 2.4.1'
28
+ spec.add_development_dependency 'rubyzip', '~> 3.0.0'
29
29
  spec.add_development_dependency 'shindo', '~> 0.3'
30
30
 
31
- spec.add_dependency 'base64', '~> 0.2.0'
31
+ spec.add_dependency 'base64', '>= 0.2', '< 0.4'
32
32
  spec.add_dependency 'fog-core', '~> 2.6'
33
33
  spec.add_dependency 'fog-json', '~> 1.1'
34
34
  spec.add_dependency 'fog-xml', '~> 0.1'
@@ -281,7 +281,7 @@ module Fog
281
281
  merge_attributes(data.body)
282
282
  else
283
283
  data = service.put_object(directory.key, key, body, options)
284
- merge_attributes(data.headers.reject {|key, value| ['Connection', 'Content-Length', 'Content-Type'].include?(key)})
284
+ merge_attributes(data.headers.reject {|key, value| ['connection', 'content-length', 'content-type'].include?(key.downcase)})
285
285
  end
286
286
  self.etag = self.etag.gsub('"','') if self.etag
287
287
  self.content_length = Fog::Storage.get_body_size(body)
@@ -0,0 +1,66 @@
1
+ module Fog
2
+ module Parsers
3
+ module AWS
4
+ module Storage
5
+ class ListObjectsV2 < Fog::Parsers::Base
6
+ # Initialize parser state
7
+ def initialize
8
+ super
9
+ @common_prefix = {}
10
+ @object = { 'Owner' => {} }
11
+ reset
12
+ end
13
+
14
+ def reset
15
+ @object = { 'Owner' => {} }
16
+ @response = { 'Contents' => [], 'CommonPrefixes' => [] }
17
+ end
18
+
19
+ def start_element(name, attrs = [])
20
+ super
21
+ case name
22
+ when 'CommonPrefixes'
23
+ @in_common_prefixes = true
24
+ end
25
+ end
26
+
27
+ def end_element(name)
28
+ case name
29
+ when 'CommonPrefixes'
30
+ @in_common_prefixes = false
31
+ when 'Contents'
32
+ @response['Contents'] << @object
33
+ @object = { 'Owner' => {} }
34
+ when 'DisplayName', 'ID'
35
+ @object['Owner'][name] = value
36
+ when 'ETag'
37
+ @object[name] = value.gsub('"', '') if value != nil
38
+ when 'IsTruncated'
39
+ if value == 'true'
40
+ @response['IsTruncated'] = true
41
+ else
42
+ @response['IsTruncated'] = false
43
+ end
44
+ when 'LastModified'
45
+ @object['LastModified'] = Time.parse(value)
46
+ when 'ContinuationToken', 'NextContinuationToken', 'Name', 'StartAfter'
47
+ @response[name] = value
48
+ when 'MaxKeys', 'KeyCount'
49
+ @response[name] = value.to_i
50
+ when 'Prefix'
51
+ if @in_common_prefixes
52
+ @response['CommonPrefixes'] << value
53
+ else
54
+ @response[name] = value
55
+ end
56
+ when 'Size'
57
+ @object['Size'] = value.to_i
58
+ when 'Delimiter', 'Key', 'StorageClass'
59
+ @object[name] = value
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,129 @@
1
+ module Fog
2
+ module AWS
3
+ class Storage
4
+ class Real
5
+ require 'fog/aws/parsers/storage/list_objects_v2'
6
+
7
+ # List information about objects in an S3 bucket using ListObjectsV2
8
+ #
9
+ # @param bucket_name [String] name of bucket to list object keys from
10
+ # @param options [Hash] config arguments for list. Defaults to {}.
11
+ # @option options delimiter [String] causes keys with the same string between the prefix
12
+ # value and the first occurrence of delimiter to be rolled up
13
+ # @option options continuation-token [String] continuation token from a previous request
14
+ # @option options fetch-owner [Boolean] specifies whether to return owner information
15
+ # @option options max-keys [Integer] limits number of object keys returned
16
+ # @option options prefix [String] limits object keys to those beginning with its value
17
+ # @option options start-after [String] starts listing after this specified key
18
+ #
19
+ # @return [Excon::Response] response:
20
+ # * body [Hash]:
21
+ # * Delimiter [String] - Delimiter specified for query
22
+ # * IsTruncated [Boolean] - Whether or not the listing is truncated
23
+ # * ContinuationToken [String] - Token specified in the request
24
+ # * NextContinuationToken [String] - Token to use in subsequent requests
25
+ # * KeyCount [Integer] - Number of keys returned
26
+ # * MaxKeys [Integer] - Maximum number of keys specified for query
27
+ # * Name [String] - Name of the bucket
28
+ # * Prefix [String] - Prefix specified for query
29
+ # * StartAfter [String] - StartAfter specified in the request
30
+ # * CommonPrefixes [Array] - Array of strings for common prefixes
31
+ # * Contents [Array]:
32
+ # * ETag [String] - Etag of object
33
+ # * Key [String] - Name of object
34
+ # * LastModified [String] - Timestamp of last modification of object
35
+ # * Owner [Hash]:
36
+ # * DisplayName [String] - Display name of object owner
37
+ # * ID [String] - Id of object owner
38
+ # * Size [Integer] - Size of object
39
+ # * StorageClass [String] - Storage class of object
40
+ #
41
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html
42
+
43
+ def list_objects_v2(bucket_name, options = {})
44
+ unless bucket_name
45
+ raise ArgumentError.new('bucket_name is required')
46
+ end
47
+
48
+ # Add list-type=2 to indicate ListObjectsV2
49
+ options = options.merge('list-type' => '2')
50
+
51
+ request({
52
+ :expects => 200,
53
+ :headers => {},
54
+ :bucket_name => bucket_name,
55
+ :idempotent => true,
56
+ :method => 'GET',
57
+ :parser => Fog::Parsers::AWS::Storage::ListObjectsV2.new,
58
+ :query => options
59
+ })
60
+ end
61
+ end
62
+
63
+ class Mock # :nodoc:all
64
+ def list_objects_v2(bucket_name, options = {})
65
+ prefix = options['prefix']
66
+ continuation_token = options['continuation-token']
67
+ delimiter = options['delimiter']
68
+ max_keys = options['max-keys']
69
+ start_after = options['start-after']
70
+ fetch_owner = options['fetch-owner']
71
+ common_prefixes = []
72
+
73
+ unless bucket_name
74
+ raise ArgumentError.new('bucket_name is required')
75
+ end
76
+
77
+ response = Excon::Response.new
78
+ if bucket = self.data[:buckets][bucket_name]
79
+ contents = bucket[:objects].values.map(&:first).sort {|x,y| x['Key'] <=> y['Key']}.reject do |object|
80
+ (prefix && object['Key'][0...prefix.length] != prefix) ||
81
+ (start_after && object['Key'] <= start_after) ||
82
+ (continuation_token && object['Key'] <= continuation_token) ||
83
+ (delimiter && object['Key'][(prefix ? prefix.length : 0)..-1].include?(delimiter) \
84
+ && common_prefixes << object['Key'].sub(/^(#{prefix}[^#{delimiter}]+.).*/, '\1')) ||
85
+ object.key?(:delete_marker)
86
+ end.map do |object|
87
+ data = object.reject {|key, value| !['ETag', 'Key', 'StorageClass'].include?(key)}
88
+ data.merge!({
89
+ 'LastModified' => Time.parse(object['Last-Modified']),
90
+ 'Owner' => fetch_owner ? bucket['Owner'] : nil,
91
+ 'Size' => object['Content-Length'].to_i
92
+ })
93
+ data
94
+ end
95
+
96
+ max_keys = max_keys || 1000
97
+ size = [max_keys, 1000].min
98
+ truncated_contents = contents[0...size]
99
+ next_token = truncated_contents.size != contents.size ? truncated_contents.last['Key'] : nil
100
+
101
+ response.status = 200
102
+ common_prefixes_uniq = common_prefixes.uniq
103
+ response.body = {
104
+ 'CommonPrefixes' => common_prefixes_uniq,
105
+ 'Contents' => truncated_contents,
106
+ 'IsTruncated' => truncated_contents.size != contents.size,
107
+ 'ContinuationToken' => continuation_token,
108
+ 'NextContinuationToken' => next_token,
109
+ 'KeyCount' => truncated_contents.size + common_prefixes_uniq.size,
110
+ 'MaxKeys' => max_keys,
111
+ 'Name' => bucket['Name'],
112
+ 'Prefix' => prefix,
113
+ 'StartAfter' => start_after
114
+ }
115
+ if max_keys && max_keys < response.body['Contents'].length
116
+ response.body['IsTruncated'] = true
117
+ response.body['Contents'] = response.body['Contents'][0...max_keys]
118
+ response.body['KeyCount'] = response.body['Contents'].size + response.body['CommonPrefixes'].size
119
+ end
120
+ else
121
+ response.status = 404
122
+ raise(Excon::Errors.status_error({:expects => 200}, response))
123
+ end
124
+ response
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -6,7 +6,9 @@ module Fog
6
6
  #
7
7
  # @param bucket_name [String] Name of bucket containing object
8
8
  # @param object_name [String] Name of object to restore
9
- # @option days [Integer] Number of days to restore object for. Defaults to 100000 (a very long time)
9
+ # @param options [Hash] Optional parameters
10
+ # @option options [Integer] :days Number of days to restore object for. Defaults to 100000 (a very long time)
11
+ # @option options [String] :tier Glacier retrieval tier. Can be 'Standard', 'Bulk', or 'Expedited'
10
12
  #
11
13
  # @return [Excon::Response] response:
12
14
  # * status [Integer] 200 (OK) Object is previously restored
@@ -15,11 +17,24 @@ module Fog
15
17
  #
16
18
  # @see http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html
17
19
  #
18
- def post_object_restore(bucket_name, object_name, days = 100000)
20
+ def post_object_restore(bucket_name, object_name, options = {})
19
21
  raise ArgumentError.new('bucket_name is required') unless bucket_name
20
22
  raise ArgumentError.new('object_name is required') unless object_name
21
23
 
22
- data = '<RestoreRequest xmlns="http://s3.amazonaws.com/doc/2006-3-01"><Days>' + days.to_s + '</Days></RestoreRequest>'
24
+ unless options.is_a?(Hash)
25
+ Fog::Logger.deprecation("post_object_restore with a bare days parameter is deprecated, use post_object_restore(bucket_name, object_name, :days => days) instead [light_black](#{caller.first})[/]")
26
+ options = { :days => options }
27
+ end
28
+
29
+ days = options[:days] || 100000
30
+ tier = options[:tier]
31
+
32
+ data = '<RestoreRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/">'
33
+ data += '<Days>' + days.to_s + '</Days>'
34
+ if tier
35
+ data += '<GlacierJobParameters><Tier>' + tier + '</Tier></GlacierJobParameters>'
36
+ end
37
+ data += '</RestoreRequest>'
23
38
 
24
39
  headers = {}
25
40
  headers['Content-MD5'] = Base64.encode64(OpenSSL::Digest::MD5.digest(data)).strip
@@ -39,7 +54,12 @@ module Fog
39
54
  end
40
55
 
41
56
  class Mock # :nodoc:all
42
- def post_object_restore(bucket_name, object_name, days = 100000)
57
+ def post_object_restore(bucket_name, object_name, options = {})
58
+ unless options.is_a?(Hash)
59
+ Fog::Logger.deprecation("post_object_restore with a bare days parameter is deprecated, use post_object_restore(bucket_name, object_name, :days => days) instead [light_black](#{caller.first})[/]")
60
+ options = { :days => options }
61
+ end
62
+
43
63
  response = get_object(bucket_name, object_name)
44
64
  response.body = nil
45
65
  response
@@ -26,9 +26,12 @@ module Fog
26
26
 
27
27
  VALID_QUERY_KEYS = %w[
28
28
  acl
29
+ continuation-token
29
30
  cors
30
31
  delete
32
+ fetch-owner
31
33
  lifecycle
34
+ list-type
32
35
  location
33
36
  logging
34
37
  notification
@@ -42,6 +45,7 @@ module Fog
42
45
  response-content-type
43
46
  response-expires
44
47
  restore
48
+ start-after
45
49
  tagging
46
50
  torrent
47
51
  uploadId
@@ -102,6 +106,7 @@ module Fog
102
106
  request :head_object_url
103
107
  request :initiate_multipart_upload
104
108
  request :list_multipart_uploads
109
+ request :list_objects_v2
105
110
  request :list_parts
106
111
  request :post_object_hidden_fields
107
112
  request :post_object_restore
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AWS
3
- VERSION = '3.31.0'.freeze
3
+ VERSION = '3.33.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.31.0
4
+ version: 3.33.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
8
8
  - Wesley Beary
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2025-04-21 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
@@ -59,14 +58,14 @@ dependencies:
59
58
  requirements:
60
59
  - - "~>"
61
60
  - !ruby/object:Gem::Version
62
- version: 2.4.1
61
+ version: 3.0.0
63
62
  type: :development
64
63
  prerelease: false
65
64
  version_requirements: !ruby/object:Gem::Requirement
66
65
  requirements:
67
66
  - - "~>"
68
67
  - !ruby/object:Gem::Version
69
- version: 2.4.1
68
+ version: 3.0.0
70
69
  - !ruby/object:Gem::Dependency
71
70
  name: shindo
72
71
  requirement: !ruby/object:Gem::Requirement
@@ -85,16 +84,22 @@ dependencies:
85
84
  name: base64
86
85
  requirement: !ruby/object:Gem::Requirement
87
86
  requirements:
88
- - - "~>"
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0.2'
90
+ - - "<"
89
91
  - !ruby/object:Gem::Version
90
- version: 0.2.0
92
+ version: '0.4'
91
93
  type: :runtime
92
94
  prerelease: false
93
95
  version_requirements: !ruby/object:Gem::Requirement
94
96
  requirements:
95
- - - "~>"
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0.2'
100
+ - - "<"
96
101
  - !ruby/object:Gem::Version
97
- version: 0.2.0
102
+ version: '0.4'
98
103
  - !ruby/object:Gem::Dependency
99
104
  name: fog-core
100
105
  requirement: !ruby/object:Gem::Requirement
@@ -748,6 +753,7 @@ files:
748
753
  - lib/fog/aws/parsers/storage/get_service.rb
749
754
  - lib/fog/aws/parsers/storage/initiate_multipart_upload.rb
750
755
  - lib/fog/aws/parsers/storage/list_multipart_uploads.rb
756
+ - lib/fog/aws/parsers/storage/list_objects_v2.rb
751
757
  - lib/fog/aws/parsers/storage/list_parts.rb
752
758
  - lib/fog/aws/parsers/storage/upload_part_copy_object.rb
753
759
  - lib/fog/aws/parsers/sts/assume_role.rb
@@ -1420,6 +1426,7 @@ files:
1420
1426
  - lib/fog/aws/requests/storage/head_object_url.rb
1421
1427
  - lib/fog/aws/requests/storage/initiate_multipart_upload.rb
1422
1428
  - lib/fog/aws/requests/storage/list_multipart_uploads.rb
1429
+ - lib/fog/aws/requests/storage/list_objects_v2.rb
1423
1430
  - lib/fog/aws/requests/storage/list_parts.rb
1424
1431
  - lib/fog/aws/requests/storage/post_object_hidden_fields.rb
1425
1432
  - lib/fog/aws/requests/storage/post_object_restore.rb
@@ -1464,7 +1471,6 @@ licenses:
1464
1471
  - MIT
1465
1472
  metadata:
1466
1473
  changelog_uri: https://github.com/fog/fog-aws/blob/master/CHANGELOG.md
1467
- post_install_message:
1468
1474
  rdoc_options: []
1469
1475
  require_paths:
1470
1476
  - lib
@@ -1479,8 +1485,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1479
1485
  - !ruby/object:Gem::Version
1480
1486
  version: '0'
1481
1487
  requirements: []
1482
- rubygems_version: 3.5.18
1483
- signing_key:
1488
+ rubygems_version: 3.7.1
1484
1489
  specification_version: 4
1485
1490
  summary: Module for the 'fog' gem to support Amazon Web Services.
1486
1491
  test_files: []