fog-aws 3.32.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 +4 -4
- data/CHANGELOG.md +14 -0
- data/fog-aws.gemspec +2 -2
- data/lib/fog/aws/models/storage/file.rb +1 -1
- data/lib/fog/aws/parsers/storage/list_objects_v2.rb +66 -0
- data/lib/fog/aws/requests/storage/list_objects_v2.rb +129 -0
- data/lib/fog/aws/storage.rb +5 -0
- data/lib/fog/aws/version.rb +1 -1
- metadata +17 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e082ebe8e5a7cc585e85b6d2415306da6a2c0fec952ea3a62754dddfa82087d3
|
4
|
+
data.tar.gz: ac57b359e23b43ac11189ae93ee9f7eee31ac16b16d69ecc00f885b41f357105
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4e819ca80fc191bfd1a28888924a121f96e94e90315f2f62cc5b3c7702b810b9358ab6812c67c3d1dcf184ef673717030f3218a32f7c0e49a78c0cb4e89ebc8
|
7
|
+
data.tar.gz: 2959e61875371b8e0e06575855fa571669b477390c02c77515a1cba7c9f351b5ddd84865116d890b7a1be76ab91c5abf806aac5687345f167e1da2d9a396700f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
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
|
+
|
3
17
|
## [v3.32.0](https://github.com/fog/fog-aws/tree/v3.32.0) (2025-05-27)
|
4
18
|
|
5
19
|
[Full Changelog](https://github.com/fog/fog-aws/compare/v3.31.0...v3.32.0)
|
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', '~>
|
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', '
|
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| ['
|
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
|
data/lib/fog/aws/storage.rb
CHANGED
@@ -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
|
data/lib/fog/aws/version.rb
CHANGED
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.
|
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:
|
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:
|
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:
|
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.
|
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.
|
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.
|
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: []
|