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.
Files changed (131) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/LICENSE.txt +0 -0
  4. data/README.md +192 -0
  5. data/bin/mss-rb +178 -0
  6. data/ca-bundle.crt +3554 -0
  7. data/lib/mss/core/async_handle.rb +89 -0
  8. data/lib/mss/core/cacheable.rb +76 -0
  9. data/lib/mss/core/client.rb +786 -0
  10. data/lib/mss/core/collection/simple.rb +81 -0
  11. data/lib/mss/core/collection/with_limit_and_next_token.rb +70 -0
  12. data/lib/mss/core/collection/with_next_token.rb +96 -0
  13. data/lib/mss/core/collection.rb +262 -0
  14. data/lib/mss/core/configuration.rb +527 -0
  15. data/lib/mss/core/credential_providers.rb +653 -0
  16. data/lib/mss/core/data.rb +251 -0
  17. data/lib/mss/core/deprecations.rb +83 -0
  18. data/lib/mss/core/endpoints.rb +36 -0
  19. data/lib/mss/core/http/connection_pool.rb +374 -0
  20. data/lib/mss/core/http/curb_handler.rb +150 -0
  21. data/lib/mss/core/http/handler.rb +88 -0
  22. data/lib/mss/core/http/net_http_handler.rb +144 -0
  23. data/lib/mss/core/http/patch.rb +98 -0
  24. data/lib/mss/core/http/request.rb +258 -0
  25. data/lib/mss/core/http/response.rb +80 -0
  26. data/lib/mss/core/indifferent_hash.rb +87 -0
  27. data/lib/mss/core/inflection.rb +55 -0
  28. data/lib/mss/core/ini_parser.rb +41 -0
  29. data/lib/mss/core/json_client.rb +46 -0
  30. data/lib/mss/core/json_parser.rb +75 -0
  31. data/lib/mss/core/json_request_builder.rb +34 -0
  32. data/lib/mss/core/json_response_parser.rb +78 -0
  33. data/lib/mss/core/lazy_error_classes.rb +107 -0
  34. data/lib/mss/core/log_formatter.rb +426 -0
  35. data/lib/mss/core/managed_file.rb +31 -0
  36. data/lib/mss/core/meta_utils.rb +44 -0
  37. data/lib/mss/core/model.rb +61 -0
  38. data/lib/mss/core/naming.rb +29 -0
  39. data/lib/mss/core/option_grammar.rb +737 -0
  40. data/lib/mss/core/options/json_serializer.rb +81 -0
  41. data/lib/mss/core/options/validator.rb +154 -0
  42. data/lib/mss/core/options/xml_serializer.rb +117 -0
  43. data/lib/mss/core/page_result.rb +74 -0
  44. data/lib/mss/core/policy.rb +938 -0
  45. data/lib/mss/core/query_client.rb +40 -0
  46. data/lib/mss/core/query_error_parser.rb +23 -0
  47. data/lib/mss/core/query_request_builder.rb +46 -0
  48. data/lib/mss/core/query_response_parser.rb +34 -0
  49. data/lib/mss/core/region.rb +84 -0
  50. data/lib/mss/core/region_collection.rb +79 -0
  51. data/lib/mss/core/resource.rb +412 -0
  52. data/lib/mss/core/resource_cache.rb +39 -0
  53. data/lib/mss/core/response.rb +214 -0
  54. data/lib/mss/core/response_cache.rb +49 -0
  55. data/lib/mss/core/rest_error_parser.rb +23 -0
  56. data/lib/mss/core/rest_json_client.rb +39 -0
  57. data/lib/mss/core/rest_request_builder.rb +153 -0
  58. data/lib/mss/core/rest_response_parser.rb +65 -0
  59. data/lib/mss/core/rest_xml_client.rb +46 -0
  60. data/lib/mss/core/service_interface.rb +82 -0
  61. data/lib/mss/core/signers/base.rb +45 -0
  62. data/lib/mss/core/signers/cloud_front.rb +55 -0
  63. data/lib/mss/core/signers/s3.rb +158 -0
  64. data/lib/mss/core/signers/version_2.rb +71 -0
  65. data/lib/mss/core/signers/version_3.rb +85 -0
  66. data/lib/mss/core/signers/version_3_https.rb +60 -0
  67. data/lib/mss/core/signers/version_4/chunk_signed_stream.rb +190 -0
  68. data/lib/mss/core/signers/version_4.rb +227 -0
  69. data/lib/mss/core/uri_escape.rb +43 -0
  70. data/lib/mss/core/xml/frame.rb +245 -0
  71. data/lib/mss/core/xml/frame_stack.rb +84 -0
  72. data/lib/mss/core/xml/grammar.rb +306 -0
  73. data/lib/mss/core/xml/parser.rb +69 -0
  74. data/lib/mss/core/xml/root_frame.rb +64 -0
  75. data/lib/mss/core/xml/sax_handlers/libxml.rb +46 -0
  76. data/lib/mss/core/xml/sax_handlers/nokogiri.rb +55 -0
  77. data/lib/mss/core/xml/sax_handlers/ox.rb +40 -0
  78. data/lib/mss/core/xml/sax_handlers/rexml.rb +46 -0
  79. data/lib/mss/core/xml/stub.rb +122 -0
  80. data/lib/mss/core.rb +602 -0
  81. data/lib/mss/errors.rb +161 -0
  82. data/lib/mss/rails.rb +194 -0
  83. data/lib/mss/s3/access_control_list.rb +262 -0
  84. data/lib/mss/s3/acl_object.rb +263 -0
  85. data/lib/mss/s3/acl_options.rb +200 -0
  86. data/lib/mss/s3/bucket.rb +757 -0
  87. data/lib/mss/s3/bucket_collection.rb +161 -0
  88. data/lib/mss/s3/bucket_lifecycle_configuration.rb +472 -0
  89. data/lib/mss/s3/bucket_region_cache.rb +51 -0
  90. data/lib/mss/s3/bucket_tag_collection.rb +110 -0
  91. data/lib/mss/s3/bucket_version_collection.rb +78 -0
  92. data/lib/mss/s3/cipher_io.rb +119 -0
  93. data/lib/mss/s3/client/xml.rb +265 -0
  94. data/lib/mss/s3/client.rb +2076 -0
  95. data/lib/mss/s3/config.rb +60 -0
  96. data/lib/mss/s3/cors_rule.rb +107 -0
  97. data/lib/mss/s3/cors_rule_collection.rb +193 -0
  98. data/lib/mss/s3/data_options.rb +190 -0
  99. data/lib/mss/s3/encryption_utils.rb +145 -0
  100. data/lib/mss/s3/errors.rb +93 -0
  101. data/lib/mss/s3/multipart_upload.rb +353 -0
  102. data/lib/mss/s3/multipart_upload_collection.rb +75 -0
  103. data/lib/mss/s3/object_collection.rb +355 -0
  104. data/lib/mss/s3/object_metadata.rb +102 -0
  105. data/lib/mss/s3/object_upload_collection.rb +76 -0
  106. data/lib/mss/s3/object_version.rb +153 -0
  107. data/lib/mss/s3/object_version_collection.rb +88 -0
  108. data/lib/mss/s3/paginated_collection.rb +74 -0
  109. data/lib/mss/s3/policy.rb +73 -0
  110. data/lib/mss/s3/prefix_and_delimiter_collection.rb +46 -0
  111. data/lib/mss/s3/prefixed_collection.rb +84 -0
  112. data/lib/mss/s3/presign_v4.rb +135 -0
  113. data/lib/mss/s3/presigned_post.rb +574 -0
  114. data/lib/mss/s3/region_detection.rb +75 -0
  115. data/lib/mss/s3/request.rb +61 -0
  116. data/lib/mss/s3/s3_object.rb +1795 -0
  117. data/lib/mss/s3/tree/branch_node.rb +67 -0
  118. data/lib/mss/s3/tree/child_collection.rb +103 -0
  119. data/lib/mss/s3/tree/leaf_node.rb +93 -0
  120. data/lib/mss/s3/tree/node.rb +21 -0
  121. data/lib/mss/s3/tree/parent.rb +86 -0
  122. data/lib/mss/s3/tree.rb +115 -0
  123. data/lib/mss/s3/uploaded_part.rb +81 -0
  124. data/lib/mss/s3/uploaded_part_collection.rb +83 -0
  125. data/lib/mss/s3/website_configuration.rb +101 -0
  126. data/lib/mss/s3.rb +161 -0
  127. data/lib/mss/version.rb +16 -0
  128. data/lib/mss-sdk.rb +2 -0
  129. data/lib/mss.rb +14 -0
  130. data/rails/init.rb +14 -0
  131. metadata +201 -0
@@ -0,0 +1,81 @@
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
+ require 'json'
14
+ require 'base64'
15
+
16
+ module MSS
17
+ module Core
18
+ module Options
19
+
20
+ # Given a hash of serialization rules, a JSONSerializer can convert
21
+ # a hash of request options into a JSON document. The request options
22
+ # are validated before returning JSON.
23
+ class JSONSerializer
24
+
25
+ # @param [Hash] rules A hash of option rules to validate against.
26
+ # @param [String,nil] payload_param
27
+ def initialize rules, payload_param
28
+ @payload_param = payload_param
29
+ @rules = @payload_param ? rules[@payload_param][:members] : rules
30
+ end
31
+
32
+ # @return [String] Returns the name of the API operation.
33
+ attr_reader :operation_name
34
+
35
+ # @return [String]
36
+ attr_reader :namespace
37
+
38
+ # @return [Hash]
39
+ attr_reader :rules
40
+
41
+ # @overload serialize!(request_options)
42
+ # @param [Hash] request_options A hash of already validated
43
+ # request options with normalized values.
44
+ # @return [String] Returns an string of the request parameters
45
+ # serialized into XML.
46
+ def serialize request_options
47
+ request_options = request_options[@payload_param] if @payload_param
48
+ data = normalize_keys(request_options, rules)
49
+ if rules.any?{|k,v| v[:location] == 'body' }
50
+ data = data.values.first
51
+ end
52
+ JSON.pretty_generate(data)
53
+ end
54
+
55
+ protected
56
+
57
+ def normalize_keys values, rules
58
+ values.inject({}) do |h,(k,v)|
59
+ child_rules = rules[k]
60
+ child_name = child_rules[:name] || Inflection.class_name(k.to_s)
61
+ h.merge(child_name => normalize_value(v, child_rules))
62
+ end
63
+ end
64
+
65
+ def normalize_value value, rules
66
+ case rules[:type]
67
+ when :hash then normalize_keys(value, rules[:members])
68
+ when :array then value.map{|v| normalize_value(v, rules[:members]) }
69
+ when :map
70
+ value.inject({}) do |h,(k,v)|
71
+ h.merge(k => normalize_value(v, rules[:members]))
72
+ end
73
+ when :blob then Base64.encode64(value.read).strip
74
+ else value
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,154 @@
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
+ module Core
15
+ module Options
16
+
17
+ # Given a hash of validation rules, a validator validate request
18
+ # options. Validations support:
19
+ #
20
+ # * rejecting unknown options
21
+ # * ensuring presence of required options
22
+ # * validating expected option types (e.g. hash, array, string,
23
+ # integer, etc).
24
+ #
25
+ # After validating, a hash of request options is returned with
26
+ # with normalized values (with converted types).
27
+ class Validator
28
+
29
+ # @param [Hash] rules A hash of option rules to validate against.
30
+ def initialize rules
31
+ @rules = rules
32
+ end
33
+
34
+ # @return [Hash]
35
+ attr_reader :rules
36
+
37
+ # @overload validate!(request_options)
38
+ # @param [Hash] request_options The hash of options to validate.
39
+ # @raise [ArgumentError] Raised when the options do not validate.
40
+ # @return [Hash]
41
+ def validate! request_options, rules = @rules
42
+
43
+ # Verify all required options are present.
44
+ rules.each_pair do |opt_name, opt_rules|
45
+ if opt_rules[:required]
46
+ unless request_options.key?(opt_name)
47
+ raise ArgumentError, "missing required option #{opt_name.inspect}"
48
+ end
49
+ end
50
+ end
51
+
52
+ request_options.inject({}) do |options, (opt_name, value)|
53
+
54
+ # Ensure this is a valid/accepted option
55
+ unless rules.key?(opt_name)
56
+ raise ArgumentError, "unexpected option #{opt_name.inspect}"
57
+ end
58
+
59
+ # Validate and convert the value
60
+ valid_value = validate_value(rules[opt_name], value, opt_name)
61
+
62
+ options.merge(opt_name => valid_value)
63
+
64
+ end
65
+ end
66
+
67
+ protected
68
+
69
+ # Proxies calls to the correct validation method based on the
70
+ # rules[:type].
71
+ def validate_value *args
72
+ send("validate_#{args.first[:type]}", *args)
73
+ end
74
+
75
+ # Ensures the value is a hash and validates the hash context.
76
+ def validate_hash rules, value, opt_name, context = nil
77
+ unless value.respond_to?(:to_hash)
78
+ format_error('hash value', opt_name, context)
79
+ end
80
+ validate!(value.to_hash, rules[:members])
81
+ end
82
+
83
+ def validate_map rules, value, opt_name, context = nil
84
+ unless value.respond_to?(:to_hash)
85
+ format_error('hash value', opt_name, context)
86
+ end
87
+ value.inject({}) do |values,(k,v)|
88
+ context = "member #{k.inspect} of :#{opt_name}"
89
+ values[k] = validate_value(rules[:members], v, opt_name, context)
90
+ values
91
+ end
92
+ end
93
+
94
+ # Ensures the value is an array (or at least enumerable) and
95
+ # that the yielded values are valid.
96
+ def validate_array rules, value, opt_name, context = nil
97
+ unless value.respond_to?(:each)
98
+ format_error('enumerable value', opt_name, context)
99
+ end
100
+ values = []
101
+ value.each do |v|
102
+ context = "member #{values.size} of :#{opt_name}"
103
+ values << validate_value(rules[:members], v, opt_name, context)
104
+ end
105
+ values
106
+ end
107
+
108
+ # Ensures the value is a string.
109
+ def validate_string rules, value, opt_name, context = nil
110
+
111
+ unless value.respond_to?(:to_str)
112
+ format_error('string value', opt_name, context)
113
+ end
114
+
115
+ rules[:lstrip] ?
116
+ value.to_str.sub(/^#{rules[:lstrip]}/, '') :
117
+ value.to_str
118
+ end
119
+
120
+ # Ensures the value is a boolean.
121
+ def validate_boolean rules, value, opt_name, context = nil
122
+ unless [true, false].include?(value)
123
+ format_error('true or false', opt_name, context)
124
+ end
125
+ value
126
+ end
127
+
128
+ # Ensures the value is an integer.
129
+ def validate_integer rules, value, opt_name, context = nil
130
+ unless value.respond_to?(:to_int)
131
+ format_error('integer value', opt_name, context)
132
+ end
133
+ value.to_int
134
+ end
135
+
136
+ # Ensures the value is a timestamp.
137
+ def validate_timestamp rules, value, opt_name, context = nil
138
+ # TODO : add validation to timestamps values
139
+ value.to_s
140
+ end
141
+
142
+ def validate_blob rules, value, opt_name, context = nil
143
+ value
144
+ end
145
+
146
+ def format_error description, opt_name, context
147
+ context = context || "option :#{opt_name}"
148
+ raise ArgumentError, "expected #{description} for #{context}"
149
+ end
150
+
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,117 @@
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
+ require 'nokogiri'
14
+
15
+ module MSS
16
+ module Core
17
+ module Options
18
+
19
+ # Given a hash of serialization rules, an XMLSerializer can convert
20
+ # a hash of request options into XML. The request options are
21
+ # validated before returning XML.
22
+ class XMLSerializer
23
+
24
+ # @param [String] namespace
25
+ # @param [String] operation_name
26
+ # @param [Hash] operation
27
+ def initialize namespace, operation_name, operation
28
+ @namespace = namespace
29
+ @operation_name = operation_name
30
+ @rules = operation[:inputs]
31
+ @http = operation[:http]
32
+ @validator = Validator.new(rules)
33
+ end
34
+
35
+ # @return [String] Returns the name of the API operation.
36
+ attr_reader :operation_name
37
+
38
+ # @return [String]
39
+ attr_reader :namespace
40
+
41
+ # @return [Hash]
42
+ attr_reader :rules
43
+
44
+ # @return [Hash,nil]
45
+ attr_reader :http
46
+
47
+ # @return [Validator]
48
+ attr_reader :validator
49
+
50
+ # @overload serialize!(request_options)
51
+ # @param [Hash] request_options A hash of already validated
52
+ # request options with normalized values.
53
+ # @return [String] Returns an string of the request parameters
54
+ # serialized into XML.
55
+ def serialize request_options
56
+ if http && http[:request_payload]
57
+ payload = http[:request_payload]
58
+ root_node_name = rules[payload][:name]
59
+ params = request_options[payload]
60
+ rules = self.rules[payload][:members]
61
+ else
62
+ root_node_name = "#{operation_name}Request"
63
+ params = request_options
64
+ rules = self.rules
65
+ end
66
+ xml = Nokogiri::XML::Builder.new
67
+ xml.send(root_node_name, :xmlns => namespace) do |xml|
68
+ hash_members_xml(params, rules, xml)
69
+ end
70
+ xml.doc.root.to_xml
71
+ end
72
+
73
+ protected
74
+
75
+ def to_xml builder, opt_name, rules, value
76
+
77
+ xml_name = rules[:name]
78
+ xml_name ||= opt_name.is_a?(String) ?
79
+ opt_name : Inflection.class_name(opt_name.to_s)
80
+
81
+ case value
82
+ when Hash
83
+
84
+ builder.send(xml_name) do |builder|
85
+ hash_members_xml(value, rules[:members], builder)
86
+ end
87
+
88
+ when Array
89
+ builder.send(xml_name) do
90
+ value.each do |member_value|
91
+ to_xml(builder, 'member', rules[:members], member_value)
92
+ end
93
+ end
94
+ else builder.send(xml_name, value)
95
+ end
96
+
97
+ end
98
+
99
+ def hash_members_xml hash, rules, builder
100
+ xml_ordered_members(rules).each do |member_name|
101
+ if hash.key?(member_name)
102
+ value = hash[member_name]
103
+ to_xml(builder, member_name, rules[member_name], value)
104
+ end
105
+ end
106
+ end
107
+
108
+ def xml_ordered_members members
109
+ members.inject([]) do |list,(member_name, member)|
110
+ list << [member[:position] || 0, member_name]
111
+ end.sort_by(&:first).map(&:last)
112
+ end
113
+
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,74 @@
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
+ module Core
15
+ class PageResult < Array
16
+
17
+ # @return [Collection] Returns the collection that was used to
18
+ # populated this page of results.
19
+ attr_reader :collection
20
+
21
+ # @return [Integer] Returns the maximum number of results per page.
22
+ # The final page in a collection may return fewer than `:per_page`
23
+ # items (e.g. `:per_page` is 10 and there are only 7 items).
24
+ attr_reader :per_page
25
+
26
+ # @return [String] An opaque token that can be passed the #page method
27
+ # of the collection that returned this page of results. This next
28
+ # token behaves as a pseudo offset. If `next_token` is `nil` then
29
+ # there are no more results for the collection.
30
+ attr_reader :next_token
31
+
32
+ # @param [Collection] collection The collection that was used to
33
+ # request this page of results. The collection should respond to
34
+ # #page and accept a :next_token option.
35
+ #
36
+ # @param [Array] items An array of result items that represent a
37
+ # page of results.
38
+ #
39
+ # @param [Integer] per_page The number of requested items for this
40
+ # page of results. If the count of items is smaller than `per_page`
41
+ # then this is the last page of results.
42
+ #
43
+ # @param [String] next_token (nil) A token that can be passed to the
44
+ #
45
+ def initialize collection, items, per_page, next_token
46
+ @collection = collection
47
+ @per_page = per_page
48
+ @next_token = next_token
49
+ super(items)
50
+ end
51
+
52
+ # @return [PageResult]
53
+ # @raise [RuntimeError] Raises a runtime error when called against
54
+ # a collection that has no more results (i.e. #last_page? == true).
55
+ def next_page
56
+ if last_page?
57
+ raise 'unable to get the next page, already at the last page'
58
+ end
59
+ collection.page(:per_page => per_page, :next_token => next_token)
60
+ end
61
+
62
+ # @return [Boolean] Returns `true` if this is the last page of results.
63
+ def last_page?
64
+ next_token.nil?
65
+ end
66
+
67
+ # @return [Boolean] Returns `true` if there are more pages of results.
68
+ def more?
69
+ !!next_token
70
+ end
71
+
72
+ end
73
+ end
74
+ end