mss-sdk 1.0.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 +7 -0
- data/.yardopts +9 -0
- data/LICENSE.txt +0 -0
- data/README.md +192 -0
- data/bin/mss-rb +178 -0
- data/ca-bundle.crt +3554 -0
- data/lib/mss/core/async_handle.rb +89 -0
- data/lib/mss/core/cacheable.rb +76 -0
- data/lib/mss/core/client.rb +786 -0
- data/lib/mss/core/collection/simple.rb +81 -0
- data/lib/mss/core/collection/with_limit_and_next_token.rb +70 -0
- data/lib/mss/core/collection/with_next_token.rb +96 -0
- data/lib/mss/core/collection.rb +262 -0
- data/lib/mss/core/configuration.rb +527 -0
- data/lib/mss/core/credential_providers.rb +653 -0
- data/lib/mss/core/data.rb +251 -0
- data/lib/mss/core/deprecations.rb +83 -0
- data/lib/mss/core/endpoints.rb +36 -0
- data/lib/mss/core/http/connection_pool.rb +374 -0
- data/lib/mss/core/http/curb_handler.rb +150 -0
- data/lib/mss/core/http/handler.rb +88 -0
- data/lib/mss/core/http/net_http_handler.rb +144 -0
- data/lib/mss/core/http/patch.rb +98 -0
- data/lib/mss/core/http/request.rb +258 -0
- data/lib/mss/core/http/response.rb +80 -0
- data/lib/mss/core/indifferent_hash.rb +87 -0
- data/lib/mss/core/inflection.rb +55 -0
- data/lib/mss/core/ini_parser.rb +41 -0
- data/lib/mss/core/json_client.rb +46 -0
- data/lib/mss/core/json_parser.rb +75 -0
- data/lib/mss/core/json_request_builder.rb +34 -0
- data/lib/mss/core/json_response_parser.rb +78 -0
- data/lib/mss/core/lazy_error_classes.rb +107 -0
- data/lib/mss/core/log_formatter.rb +426 -0
- data/lib/mss/core/managed_file.rb +31 -0
- data/lib/mss/core/meta_utils.rb +44 -0
- data/lib/mss/core/model.rb +61 -0
- data/lib/mss/core/naming.rb +29 -0
- data/lib/mss/core/option_grammar.rb +737 -0
- data/lib/mss/core/options/json_serializer.rb +81 -0
- data/lib/mss/core/options/validator.rb +154 -0
- data/lib/mss/core/options/xml_serializer.rb +117 -0
- data/lib/mss/core/page_result.rb +74 -0
- data/lib/mss/core/policy.rb +938 -0
- data/lib/mss/core/query_client.rb +40 -0
- data/lib/mss/core/query_error_parser.rb +23 -0
- data/lib/mss/core/query_request_builder.rb +46 -0
- data/lib/mss/core/query_response_parser.rb +34 -0
- data/lib/mss/core/region.rb +84 -0
- data/lib/mss/core/region_collection.rb +79 -0
- data/lib/mss/core/resource.rb +412 -0
- data/lib/mss/core/resource_cache.rb +39 -0
- data/lib/mss/core/response.rb +214 -0
- data/lib/mss/core/response_cache.rb +49 -0
- data/lib/mss/core/rest_error_parser.rb +23 -0
- data/lib/mss/core/rest_json_client.rb +39 -0
- data/lib/mss/core/rest_request_builder.rb +153 -0
- data/lib/mss/core/rest_response_parser.rb +65 -0
- data/lib/mss/core/rest_xml_client.rb +46 -0
- data/lib/mss/core/service_interface.rb +82 -0
- data/lib/mss/core/signers/base.rb +45 -0
- data/lib/mss/core/signers/cloud_front.rb +55 -0
- data/lib/mss/core/signers/s3.rb +158 -0
- data/lib/mss/core/signers/version_2.rb +71 -0
- data/lib/mss/core/signers/version_3.rb +85 -0
- data/lib/mss/core/signers/version_3_https.rb +60 -0
- data/lib/mss/core/signers/version_4/chunk_signed_stream.rb +190 -0
- data/lib/mss/core/signers/version_4.rb +227 -0
- data/lib/mss/core/uri_escape.rb +43 -0
- data/lib/mss/core/xml/frame.rb +245 -0
- data/lib/mss/core/xml/frame_stack.rb +84 -0
- data/lib/mss/core/xml/grammar.rb +306 -0
- data/lib/mss/core/xml/parser.rb +69 -0
- data/lib/mss/core/xml/root_frame.rb +64 -0
- data/lib/mss/core/xml/sax_handlers/libxml.rb +46 -0
- data/lib/mss/core/xml/sax_handlers/nokogiri.rb +55 -0
- data/lib/mss/core/xml/sax_handlers/ox.rb +40 -0
- data/lib/mss/core/xml/sax_handlers/rexml.rb +46 -0
- data/lib/mss/core/xml/stub.rb +122 -0
- data/lib/mss/core.rb +602 -0
- data/lib/mss/errors.rb +161 -0
- data/lib/mss/rails.rb +194 -0
- data/lib/mss/s3/access_control_list.rb +262 -0
- data/lib/mss/s3/acl_object.rb +263 -0
- data/lib/mss/s3/acl_options.rb +200 -0
- data/lib/mss/s3/bucket.rb +757 -0
- data/lib/mss/s3/bucket_collection.rb +161 -0
- data/lib/mss/s3/bucket_lifecycle_configuration.rb +472 -0
- data/lib/mss/s3/bucket_region_cache.rb +51 -0
- data/lib/mss/s3/bucket_tag_collection.rb +110 -0
- data/lib/mss/s3/bucket_version_collection.rb +78 -0
- data/lib/mss/s3/cipher_io.rb +119 -0
- data/lib/mss/s3/client/xml.rb +265 -0
- data/lib/mss/s3/client.rb +2076 -0
- data/lib/mss/s3/config.rb +60 -0
- data/lib/mss/s3/cors_rule.rb +107 -0
- data/lib/mss/s3/cors_rule_collection.rb +193 -0
- data/lib/mss/s3/data_options.rb +190 -0
- data/lib/mss/s3/encryption_utils.rb +145 -0
- data/lib/mss/s3/errors.rb +93 -0
- data/lib/mss/s3/multipart_upload.rb +353 -0
- data/lib/mss/s3/multipart_upload_collection.rb +75 -0
- data/lib/mss/s3/object_collection.rb +355 -0
- data/lib/mss/s3/object_metadata.rb +102 -0
- data/lib/mss/s3/object_upload_collection.rb +76 -0
- data/lib/mss/s3/object_version.rb +153 -0
- data/lib/mss/s3/object_version_collection.rb +88 -0
- data/lib/mss/s3/paginated_collection.rb +74 -0
- data/lib/mss/s3/policy.rb +73 -0
- data/lib/mss/s3/prefix_and_delimiter_collection.rb +46 -0
- data/lib/mss/s3/prefixed_collection.rb +84 -0
- data/lib/mss/s3/presign_v4.rb +135 -0
- data/lib/mss/s3/presigned_post.rb +574 -0
- data/lib/mss/s3/region_detection.rb +75 -0
- data/lib/mss/s3/request.rb +61 -0
- data/lib/mss/s3/s3_object.rb +1795 -0
- data/lib/mss/s3/tree/branch_node.rb +67 -0
- data/lib/mss/s3/tree/child_collection.rb +103 -0
- data/lib/mss/s3/tree/leaf_node.rb +93 -0
- data/lib/mss/s3/tree/node.rb +21 -0
- data/lib/mss/s3/tree/parent.rb +86 -0
- data/lib/mss/s3/tree.rb +115 -0
- data/lib/mss/s3/uploaded_part.rb +81 -0
- data/lib/mss/s3/uploaded_part_collection.rb +83 -0
- data/lib/mss/s3/website_configuration.rb +101 -0
- data/lib/mss/s3.rb +161 -0
- data/lib/mss/version.rb +16 -0
- data/lib/mss-sdk.rb +2 -0
- data/lib/mss.rb +14 -0
- data/rails/init.rb +14 -0
- metadata +201 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
class S3
|
15
|
+
|
16
|
+
# Manages tags for a single S3 {Bucket}.
|
17
|
+
#
|
18
|
+
# @example Setting a tag.
|
19
|
+
#
|
20
|
+
# bucket.tags['key'] = 'value'
|
21
|
+
#
|
22
|
+
# @example Getting a tag.
|
23
|
+
#
|
24
|
+
# bucket.tags['key']
|
25
|
+
# #=> 'value'
|
26
|
+
#
|
27
|
+
# @example Getting all tags
|
28
|
+
#
|
29
|
+
# bucket.tags.to_h
|
30
|
+
# #=> { 'key' => 'value', ... }
|
31
|
+
#
|
32
|
+
# @example Removing all tags
|
33
|
+
#
|
34
|
+
# bucket.tags.clear
|
35
|
+
#
|
36
|
+
class BucketTagCollection
|
37
|
+
|
38
|
+
include Core::Model
|
39
|
+
|
40
|
+
# @param [Bucket] bucket
|
41
|
+
# @param [Hash] options
|
42
|
+
def initialize bucket, options = {}
|
43
|
+
@bucket = bucket
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
# @return [Bucket]
|
48
|
+
attr_reader :bucket
|
49
|
+
|
50
|
+
# @param [String] key
|
51
|
+
# @return [String,nil] Returns the tag for the given key. If there
|
52
|
+
# Returns `nil` if the key does not exist.
|
53
|
+
def [] key
|
54
|
+
self.to_h[key]
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param [String] key
|
58
|
+
# @param [String] value
|
59
|
+
def []= key, value
|
60
|
+
self.set(self.to_h.merge(key => value))
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param [Hash<String,String>] tags A hash of tag keys and values.
|
64
|
+
# @return [nil]
|
65
|
+
def set tags
|
66
|
+
if tags.nil? or tags.empty?
|
67
|
+
self.clear
|
68
|
+
else
|
69
|
+
client.put_bucket_tagging(:bucket_name => bucket.name, :tags => tags)
|
70
|
+
end
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
|
74
|
+
# Removes all tags from the bucket.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
#
|
78
|
+
# bucket.tags.clear
|
79
|
+
# bucket.tags.to_h #=> {}
|
80
|
+
#
|
81
|
+
# @return [nil]
|
82
|
+
def clear
|
83
|
+
client.delete_bucket_tagging(:bucket_name => bucket.name)
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Hash]
|
88
|
+
def to_h
|
89
|
+
client.get_bucket_tagging(:bucket_name => bucket.name).data[:tags]
|
90
|
+
rescue MSS::S3::Errors::NoSuchTagSet
|
91
|
+
{}
|
92
|
+
end
|
93
|
+
alias_method :to_hash, :to_h
|
94
|
+
|
95
|
+
# @param [Hash] other
|
96
|
+
# @return [Boolean] Returns `true` if the tags for this bucket match
|
97
|
+
# the passed hash.
|
98
|
+
def eql? other
|
99
|
+
self.to_h == other
|
100
|
+
end
|
101
|
+
alias_method :==, :eql?
|
102
|
+
|
103
|
+
# @api private
|
104
|
+
def inspect
|
105
|
+
self.to_h.inspect
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
class S3
|
15
|
+
|
16
|
+
# A collection of versioned objects for the entire bucket.
|
17
|
+
#
|
18
|
+
# @see PrefixedCollection
|
19
|
+
class BucketVersionCollection
|
20
|
+
|
21
|
+
include PrefixAndDelimiterCollection
|
22
|
+
|
23
|
+
# @param [Bucket] bucket
|
24
|
+
def initialize bucket, options = {}
|
25
|
+
@bucket = bucket
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Bucket] The bucket this collection belongs to.
|
30
|
+
attr_reader :bucket
|
31
|
+
|
32
|
+
# @return [ObjectVersion] Returns the most recently created object
|
33
|
+
# version in the entire bucket.
|
34
|
+
def latest
|
35
|
+
first
|
36
|
+
#self.find{|version| true }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Yields once for each version in the bucket.
|
40
|
+
#
|
41
|
+
# @yield [object_version]
|
42
|
+
#
|
43
|
+
# @yieldparam [ObjectVersion] object_version
|
44
|
+
#
|
45
|
+
# @return nil
|
46
|
+
#
|
47
|
+
def each options = {}, █ super; end
|
48
|
+
|
49
|
+
# @api private
|
50
|
+
protected
|
51
|
+
def each_member_in_page(page, &block)
|
52
|
+
super
|
53
|
+
page.versions.each do |version|
|
54
|
+
object_version = ObjectVersion.new(bucket.objects[version.key],
|
55
|
+
version.version_id,
|
56
|
+
:delete_marker => version.delete_marker?,
|
57
|
+
:last_modified => version.last_modified)
|
58
|
+
yield(object_version)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# @api private
|
63
|
+
protected
|
64
|
+
def list_request(options)
|
65
|
+
client.list_object_versions(options)
|
66
|
+
end
|
67
|
+
|
68
|
+
# @api private
|
69
|
+
protected
|
70
|
+
def limit_param; :max_keys; end
|
71
|
+
|
72
|
+
# @api private
|
73
|
+
protected
|
74
|
+
def pagination_markers; super + [:version_id_marker]; end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
class S3
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
class CipherIO
|
18
|
+
|
19
|
+
def initialize cipher, stream, stream_size = nil
|
20
|
+
|
21
|
+
@stream = stream
|
22
|
+
@stream_size = stream_size
|
23
|
+
@orig_cipher = cipher.clone
|
24
|
+
|
25
|
+
reset_cipher
|
26
|
+
|
27
|
+
# add a #rewind method if the original stream can be rewound
|
28
|
+
if @stream.respond_to?(:rewind)
|
29
|
+
Core::MetaUtils.extend_method(self, :rewind) do
|
30
|
+
reset_cipher
|
31
|
+
@stream.rewind
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# add a #size method if the stream size is known
|
36
|
+
if stream_size
|
37
|
+
Core::MetaUtils.extend_method(self, :size) do
|
38
|
+
EncryptionUtils.get_encrypted_size(@stream_size)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [String] Returns the requested number of bytes. If no byte
|
45
|
+
# amount is given, it will return the entire body of encrypted data
|
46
|
+
def read bytes = nil, output_buffer = nil
|
47
|
+
data = if bytes
|
48
|
+
(@eof) ? nil : read_chunk(bytes)
|
49
|
+
else
|
50
|
+
(@eof) ? "" : read_all
|
51
|
+
end
|
52
|
+
output_buffer ? output_buffer.replace(data || '') : data
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Boolean] Returns `true` when the entire stream has been read.
|
56
|
+
def eof?
|
57
|
+
@eof
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
attr_reader :cipher
|
63
|
+
|
64
|
+
# Sets the CipherIO in a reset state without having to know anything
|
65
|
+
# about the cipher
|
66
|
+
def reset_cipher
|
67
|
+
@cipher = @orig_cipher.clone
|
68
|
+
@eof = false
|
69
|
+
@final = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [String] Returns an encrytped chunk
|
73
|
+
def read_chunk bytes
|
74
|
+
unless @final
|
75
|
+
# If given a number of bytes, read it out and work out encryption
|
76
|
+
# issues
|
77
|
+
chunk = @stream.read(bytes)
|
78
|
+
|
79
|
+
# If there is nothing, finish the encryption
|
80
|
+
if chunk and chunk.length > 0
|
81
|
+
handle_finish(bytes, cipher.update(chunk))
|
82
|
+
else
|
83
|
+
@eof = true
|
84
|
+
cipher.final
|
85
|
+
end
|
86
|
+
# Read as much as possible if not given a byte size
|
87
|
+
else
|
88
|
+
@eof = true
|
89
|
+
@final
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [String] Returns the entire encrypted data
|
94
|
+
def read_all
|
95
|
+
@eof = true
|
96
|
+
body = @stream.read()
|
97
|
+
data = (body and body.length > 0) ? cipher.update(body) : ""
|
98
|
+
data << cipher.final
|
99
|
+
end
|
100
|
+
|
101
|
+
# Figures out how much of the final block goes into the current chunk
|
102
|
+
# and adds it.
|
103
|
+
# @return [String] Returns the encrypted chunk with possible padding.
|
104
|
+
def handle_finish(bytes, chunk)
|
105
|
+
free_space = bytes - chunk.size
|
106
|
+
|
107
|
+
if free_space > 0
|
108
|
+
@final = cipher.final
|
109
|
+
chunk << @final[0..free_space-1]
|
110
|
+
@final = @final[free_space..@final.size-1]
|
111
|
+
@eof = true unless @final and @final.size > 0
|
112
|
+
end
|
113
|
+
|
114
|
+
chunk
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,265 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
class S3
|
15
|
+
class Client < Core::Client
|
16
|
+
|
17
|
+
# @api private
|
18
|
+
module XML
|
19
|
+
|
20
|
+
BaseGrammar = Core::XML::Grammar.new({}, :inflect_rename => true)
|
21
|
+
|
22
|
+
ListBuckets = BaseGrammar.customize do
|
23
|
+
element "Buckets" do
|
24
|
+
list "Bucket"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
GetBucketAcl = GetObjectAcl = BaseGrammar.customize do
|
29
|
+
element "AccessControlList" do
|
30
|
+
ignore
|
31
|
+
element "Grant" do
|
32
|
+
rename :grants
|
33
|
+
list
|
34
|
+
element "Grantee" do
|
35
|
+
element "ID" do
|
36
|
+
rename :canonical_user_id
|
37
|
+
end
|
38
|
+
end
|
39
|
+
element "Permission" do
|
40
|
+
symbol_value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
ListObjects = BaseGrammar.customize do
|
47
|
+
|
48
|
+
element("Name") { rename :bucket_name }
|
49
|
+
element("MaxKeys") { integer_value }
|
50
|
+
element("IsTruncated") { rename :truncated; boolean_value }
|
51
|
+
element("Delimiter") { force }
|
52
|
+
|
53
|
+
element("Contents") do
|
54
|
+
list
|
55
|
+
element("Owner") do
|
56
|
+
element("ID") { }
|
57
|
+
element("DisplayName") { }
|
58
|
+
end
|
59
|
+
element("Key") { }
|
60
|
+
element("Size") { }
|
61
|
+
element("StorageClass") { }
|
62
|
+
element("ETag") { rename :etag }
|
63
|
+
|
64
|
+
element("LastModified") { time_value }
|
65
|
+
end
|
66
|
+
|
67
|
+
element "CommonPrefixes" do
|
68
|
+
collect_values
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
GetBucketLogging = BaseGrammar.customize do
|
74
|
+
element("LoggingEnabled") do
|
75
|
+
element("TargetBucket") { }
|
76
|
+
element("TargetPrefix") { }
|
77
|
+
element("TargetGrants") do
|
78
|
+
list "Grant"
|
79
|
+
element("Grant") do
|
80
|
+
element("Grantee") do
|
81
|
+
element("EmailAddress") { }
|
82
|
+
element("ID") { }
|
83
|
+
element("URI") { }
|
84
|
+
end
|
85
|
+
element("Permission") { }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
GetBucketVersioning = BaseGrammar.customize do
|
92
|
+
default_value :status, :unversioned
|
93
|
+
element("Status") do
|
94
|
+
symbol_value
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
ListObjectVersions = BaseGrammar.customize do
|
99
|
+
|
100
|
+
element("MaxKeys") { integer_value }
|
101
|
+
element("IsTruncated") { rename :truncated; boolean_value }
|
102
|
+
element("NextKeyMarker") { force }
|
103
|
+
element("NextVersionIdMarker") { force }
|
104
|
+
|
105
|
+
%w(DeleteMarker Version).each do |element_name|
|
106
|
+
element(element_name) do
|
107
|
+
collect_values
|
108
|
+
rename(:versions)
|
109
|
+
element("IsLatest") { rename :latest; boolean_value }
|
110
|
+
element("LastModified") { datetime_value }
|
111
|
+
element("ETag") { rename :etag }
|
112
|
+
element("Size") { integer_value }
|
113
|
+
element("StorageClass") { symbol_value }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
element "DeleteMarker" do
|
118
|
+
default_value(:delete_marker, true)
|
119
|
+
default_value(:version, false)
|
120
|
+
end
|
121
|
+
|
122
|
+
element "Version" do
|
123
|
+
default_value(:delete_marker, false)
|
124
|
+
default_value(:version, true)
|
125
|
+
end
|
126
|
+
|
127
|
+
element "CommonPrefixes" do
|
128
|
+
collect_values
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
InitiateMultipartUpload = BaseGrammar.customize do
|
134
|
+
element("UploadId") { force }
|
135
|
+
end
|
136
|
+
|
137
|
+
ListMultipartUploads = BaseGrammar.customize do
|
138
|
+
|
139
|
+
element("IsTruncated") { rename :truncated; boolean_value }
|
140
|
+
element("MaxUploads") { integer_value }
|
141
|
+
element("NextKeyMarker") { force }
|
142
|
+
element("NextUploadIdMarker") { force }
|
143
|
+
element("Upload") do
|
144
|
+
collect_values
|
145
|
+
rename :uploads
|
146
|
+
element("StorageClass") { symbol_value }
|
147
|
+
element("Initiated") { datetime_value }
|
148
|
+
end
|
149
|
+
|
150
|
+
element "CommonPrefixes" do
|
151
|
+
collect_values
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
DeleteObjects = BaseGrammar.customize do
|
157
|
+
element("Deleted") do
|
158
|
+
element("DeleteMarker") { boolean_value }
|
159
|
+
list
|
160
|
+
end
|
161
|
+
element("Error") { list; rename(:errors) }
|
162
|
+
end
|
163
|
+
|
164
|
+
CompleteMultipartUpload = BaseGrammar.customize
|
165
|
+
|
166
|
+
ListParts = BaseGrammar.customize do
|
167
|
+
element("StorageClass") { symbol_value }
|
168
|
+
element("IsTruncated") { rename :truncated; boolean_value }
|
169
|
+
element("MaxParts") { integer_value }
|
170
|
+
element("PartNumberMarker") { integer_value }
|
171
|
+
element("NextPartNumberMarker") { integer_value }
|
172
|
+
element("Part") do
|
173
|
+
collect_values
|
174
|
+
rename :parts
|
175
|
+
element("PartNumber") { integer_value }
|
176
|
+
element("LastModified") { datetime_value }
|
177
|
+
element("Size") { integer_value }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
GetBucketLifecycleConfiguration = BaseGrammar.customize do
|
182
|
+
element("Rule") do
|
183
|
+
list
|
184
|
+
rename(:rules)
|
185
|
+
element("Expiration") do
|
186
|
+
element("Days") { integer_value }
|
187
|
+
element("Date") { datetime_value }
|
188
|
+
end
|
189
|
+
element("Transition") do
|
190
|
+
element("StorageClass") { }
|
191
|
+
element("Days") { integer_value }
|
192
|
+
element("Date") { datetime_value }
|
193
|
+
end
|
194
|
+
element("NoncurrentVersionTransition") do
|
195
|
+
element("NoncurrentDays") { integer_value }
|
196
|
+
element("StorageClass") { string_value }
|
197
|
+
end
|
198
|
+
element("NoncurrentVersionDays") do
|
199
|
+
element("NoncurrentDays") { integer_value }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
GetBucketCors = BaseGrammar.customize do
|
205
|
+
element "CORSRule" do
|
206
|
+
list
|
207
|
+
rename :rules
|
208
|
+
element "AllowedMethod" do
|
209
|
+
list
|
210
|
+
rename :allowed_methods
|
211
|
+
end
|
212
|
+
element "AllowedOrigin" do
|
213
|
+
list
|
214
|
+
rename :allowed_origins
|
215
|
+
end
|
216
|
+
element "AllowedHeader" do
|
217
|
+
list
|
218
|
+
rename :allowed_headers
|
219
|
+
end
|
220
|
+
element "MaxAgeSeconds" do
|
221
|
+
integer
|
222
|
+
end
|
223
|
+
element "ExposeHeader" do
|
224
|
+
list
|
225
|
+
rename :expose_headers
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
GetBucketTagging = BaseGrammar.customize do
|
231
|
+
element "TagSet" do
|
232
|
+
ignore
|
233
|
+
element "Tag" do
|
234
|
+
map_entry("Key", "Value")
|
235
|
+
rename :tags
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
GetBucketWebsite = BaseGrammar.customize do
|
241
|
+
element "IndexDocument" do
|
242
|
+
element "Suffix"
|
243
|
+
end
|
244
|
+
element "ErrorDocument" do
|
245
|
+
element "Key"
|
246
|
+
end
|
247
|
+
element "RoutingRules" do
|
248
|
+
list("RoutingRule")
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
CopyPart = BaseGrammar.customize do
|
253
|
+
element "ETag" do
|
254
|
+
rename :etag
|
255
|
+
end
|
256
|
+
element "LastModified" do
|
257
|
+
datetime_value
|
258
|
+
rename :last_modified
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|