aws-sdk-core 2.0.48 → 2.1.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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/apis/autoscaling/2011-01-01/api-2.json +636 -33
  3. data/apis/cloudhsm/2014-05-30/api-2.json +3 -6
  4. data/apis/ec2/2014-10-01/api-2.json +10267 -0
  5. data/apis/ec2/2014-10-01/paginators-1.json +125 -0
  6. data/apis/ec2/2014-10-01/resources-1.json +2289 -0
  7. data/apis/ec2/2014-10-01/waiters-2.json +453 -0
  8. data/apis/ec2/2015-03-01/api-2.json +11245 -0
  9. data/apis/ec2/2015-03-01/paginators-1.json +125 -0
  10. data/apis/ec2/2015-03-01/resources-1.json +2479 -0
  11. data/apis/ec2/2015-03-01/waiters-2.json +458 -0
  12. data/apis/ec2/2015-04-15/api-2.json +182 -2
  13. data/apis/ecs/2014-11-13/api-2.json +316 -7
  14. data/apis/ecs/2014-11-13/paginators-1.json +40 -0
  15. data/apis/ecs/2014-11-13/waiters-2.json +93 -0
  16. data/apis/redshift/2012-12-01/waiters-2.json +19 -0
  17. data/apis/s3/2006-03-01/api-2.json +1 -2
  18. data/apis/sqs/2012-11-05/api-2.json +5 -6
  19. data/ca-bundle.crt +3554 -0
  20. data/lib/aws-sdk-core.rb +127 -44
  21. data/lib/aws-sdk-core/api/builder.rb +95 -0
  22. data/lib/aws-sdk-core/api/customizations.rb +152 -0
  23. data/lib/aws-sdk-core/api/docs/builder.rb +220 -0
  24. data/lib/aws-sdk-core/api/docs/client_type_documenter.rb +109 -0
  25. data/lib/aws-sdk-core/api/docs/docstring_provider.rb +66 -0
  26. data/lib/aws-sdk-core/api/docs/operation_documenter.rb +107 -0
  27. data/lib/aws-sdk-core/api/docs/param_formatter.rb +163 -0
  28. data/lib/aws-sdk-core/api/docs/request_syntax_example.rb +22 -0
  29. data/lib/aws-sdk-core/api/docs/response_structure_example.rb +91 -0
  30. data/lib/aws-sdk-core/api/docs/utils.rb +133 -0
  31. data/lib/aws-sdk-core/api/shape_map.rb +140 -0
  32. data/lib/aws-sdk-core/assume_role_credentials.rb +9 -6
  33. data/lib/aws-sdk-core/client.rb +9 -6
  34. data/lib/aws-sdk-core/client_stubs.rb +127 -133
  35. data/lib/aws-sdk-core/client_waiters.rb +1 -1
  36. data/lib/aws-sdk-core/credential_provider.rb +44 -0
  37. data/lib/aws-sdk-core/credential_provider_chain.rb +3 -2
  38. data/lib/aws-sdk-core/credentials.rb +5 -0
  39. data/lib/aws-sdk-core/deprecations.rb +69 -0
  40. data/lib/aws-sdk-core/dynamodb.rb +12 -0
  41. data/lib/aws-sdk-core/eager_loader.rb +31 -0
  42. data/lib/aws-sdk-core/ecs.rb +2 -0
  43. data/lib/aws-sdk-core/empty_structure.rb +1 -82
  44. data/lib/aws-sdk-core/endpoint_provider.rb +1 -1
  45. data/lib/aws-sdk-core/instance_profile_credentials.rb +9 -10
  46. data/lib/aws-sdk-core/json.rb +56 -0
  47. data/lib/aws-sdk-core/json/builder.rb +33 -34
  48. data/lib/aws-sdk-core/json/error_handler.rb +2 -2
  49. data/lib/aws-sdk-core/json/handler.rb +67 -0
  50. data/lib/aws-sdk-core/json/json_engine.rb +15 -0
  51. data/lib/aws-sdk-core/json/oj_engine.rb +15 -0
  52. data/lib/aws-sdk-core/json/parser.rb +30 -38
  53. data/lib/aws-sdk-core/pageable_response.rb +9 -12
  54. data/lib/aws-sdk-core/pager.rb +69 -0
  55. data/lib/aws-sdk-core/param_converter.rb +203 -0
  56. data/lib/aws-sdk-core/param_validator.rb +148 -0
  57. data/lib/aws-sdk-core/plugins/dynamodb_simple_attributes.rb +21 -18
  58. data/lib/aws-sdk-core/plugins/glacier_account_id.rb +9 -1
  59. data/lib/aws-sdk-core/plugins/glacier_checksums.rb +2 -3
  60. data/lib/aws-sdk-core/plugins/param_converter.rb +27 -0
  61. data/lib/aws-sdk-core/plugins/param_validator.rb +28 -0
  62. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +3 -7
  63. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +1 -2
  64. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +1 -1
  65. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +1 -1
  66. data/lib/aws-sdk-core/plugins/request_signer.rb +5 -5
  67. data/lib/aws-sdk-core/plugins/response_paging.rb +20 -11
  68. data/lib/aws-sdk-core/plugins/s3_get_bucket_location_fix.rb +1 -1
  69. data/lib/aws-sdk-core/plugins/s3_request_signer.rb +1 -2
  70. data/lib/aws-sdk-core/plugins/stub_responses.rb +25 -27
  71. data/lib/aws-sdk-core/query/ec2_param_builder.rb +29 -34
  72. data/lib/aws-sdk-core/query/handler.rb +32 -18
  73. data/lib/aws-sdk-core/query/param_builder.rb +45 -53
  74. data/lib/aws-sdk-core/refreshing_credentials.rb +3 -15
  75. data/lib/aws-sdk-core/rest/handler.rb +22 -0
  76. data/lib/aws-sdk-core/rest/request/body.rb +58 -0
  77. data/lib/aws-sdk-core/rest/request/builder.rb +50 -0
  78. data/lib/aws-sdk-core/rest/request/endpoint.rb +70 -0
  79. data/lib/aws-sdk-core/rest/request/headers.rb +48 -0
  80. data/lib/aws-sdk-core/rest/response/body.rb +43 -0
  81. data/lib/aws-sdk-core/rest/response/headers.rb +60 -0
  82. data/lib/aws-sdk-core/rest/response/parser.rb +47 -0
  83. data/lib/aws-sdk-core/rest/response/status_code.rb +24 -0
  84. data/lib/aws-sdk-core/shared_credentials.rb +11 -6
  85. data/lib/aws-sdk-core/signers/base.rb +1 -1
  86. data/lib/aws-sdk-core/signers/s3.rb +2 -3
  87. data/lib/aws-sdk-core/signers/v2.rb +7 -4
  88. data/lib/aws-sdk-core/signers/v4.rb +11 -22
  89. data/lib/aws-sdk-core/structure.rb +26 -145
  90. data/lib/aws-sdk-core/stubbing/data_applicator.rb +46 -0
  91. data/lib/aws-sdk-core/stubbing/empty_stub.rb +53 -0
  92. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +49 -0
  93. data/lib/aws-sdk-core/stubbing/protocols/json.rb +40 -0
  94. data/lib/aws-sdk-core/stubbing/protocols/query.rb +40 -0
  95. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +67 -0
  96. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +25 -0
  97. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +38 -0
  98. data/lib/aws-sdk-core/stubbing/stub_data.rb +34 -0
  99. data/lib/aws-sdk-core/version.rb +1 -1
  100. data/lib/aws-sdk-core/xml/builder.rb +58 -52
  101. data/lib/aws-sdk-core/xml/default_map.rb +10 -0
  102. data/lib/aws-sdk-core/xml/doc_builder.rb +86 -0
  103. data/lib/aws-sdk-core/xml/error_handler.rb +7 -2
  104. data/lib/aws-sdk-core/xml/parser.rb +4 -4
  105. data/lib/aws-sdk-core/xml/parser/frame.rb +75 -70
  106. data/lib/aws-sdk-core/xml/parser/stack.rb +4 -4
  107. data/lib/seahorse.rb +0 -11
  108. data/lib/seahorse/client/base.rb +3 -12
  109. data/lib/seahorse/client/http/request.rb +9 -5
  110. data/lib/seahorse/client/plugins/endpoint.rb +5 -56
  111. data/lib/seahorse/client/plugins/restful_bindings.rb +38 -31
  112. data/lib/seahorse/client/request_context.rb +2 -2
  113. data/lib/seahorse/client/response.rb +6 -5
  114. data/lib/seahorse/model/api.rb +18 -61
  115. data/lib/seahorse/model/operation.rb +24 -54
  116. data/lib/seahorse/model/shapes.rb +120 -364
  117. data/lib/seahorse/util.rb +2 -6
  118. metadata +56 -109
  119. data/apis/autoscaling/2011-01-01/docs-2.json +0 -1246
  120. data/apis/cloudformation/2010-05-15/docs-2.json +0 -725
  121. data/apis/cloudfront/2014-11-06/docs-2.json +0 -1125
  122. data/apis/cloudhsm/2014-05-30/docs-2.json +0 -472
  123. data/apis/cloudsearch/2013-01-01/docs-2.json +0 -865
  124. data/apis/cloudsearchdomain/2013-01-01/docs-2.json +0 -311
  125. data/apis/cloudtrail/2013-11-01/docs-2.json +0 -328
  126. data/apis/codedeploy/2014-10-06/docs-2.json +0 -1261
  127. data/apis/cognito-identity/2014-06-30/docs-2.json +0 -506
  128. data/apis/cognito-sync/2014-06-30/docs-2.json +0 -582
  129. data/apis/config/2014-10-17/docs-2.json +0 -513
  130. data/apis/config/2014-11-12/docs-2.json +0 -514
  131. data/apis/datapipeline/2012-10-29/docs-2.json +0 -607
  132. data/apis/directconnect/2012-10-25/docs-2.json +0 -494
  133. data/apis/ds/2015-04-16/docs-2.json +0 -753
  134. data/apis/dynamodb/2011-12-05/api-2.json +0 -949
  135. data/apis/dynamodb/2011-12-05/docs-2.json +0 -606
  136. data/apis/dynamodb/2011-12-05/paginators-1.json +0 -26
  137. data/apis/dynamodb/2011-12-05/waiters-2.json +0 -35
  138. data/apis/dynamodb/2012-08-10/docs-2.json +0 -977
  139. data/apis/ec2/2015-04-15/docs-2.json +0 -5368
  140. data/apis/ecs/2014-11-13/docs-2.json +0 -791
  141. data/apis/elasticache/2015-02-02/docs-2.json +0 -1390
  142. data/apis/elasticbeanstalk/2010-12-01/docs-2.json +0 -1114
  143. data/apis/elasticfilesystem/2015-02-01/docs-2.json +0 -414
  144. data/apis/elasticloadbalancing/2012-06-01/docs-2.json +0 -1078
  145. data/apis/elasticmapreduce/2009-03-31/docs-2.json +0 -969
  146. data/apis/elastictranscoder/2012-09-25/docs-2.json +0 -1152
  147. data/apis/email/2010-12-01/docs-2.json +0 -441
  148. data/apis/glacier/2012-06-01/docs-2.json +0 -575
  149. data/apis/iam/2010-05-08/docs-2.json +0 -2138
  150. data/apis/importexport/2010-06-01/docs-2.json +0 -432
  151. data/apis/kinesis/2013-12-02/docs-2.json +0 -424
  152. data/apis/kms/2014-11-01/docs-2.json +0 -628
  153. data/apis/lambda/2014-11-11/docs-2.json +0 -303
  154. data/apis/lambda/2015-03-31/docs-2.json +0 -490
  155. data/apis/logs/2014-03-28/docs-2.json +0 -599
  156. data/apis/machinelearning/2014-12-12/docs-2.json +0 -1034
  157. data/apis/monitoring/2010-08-01/docs-2.json +0 -514
  158. data/apis/opsworks/2013-02-18/docs-2.json +0 -1592
  159. data/apis/rds/2014-10-31/docs-2.json +0 -2074
  160. data/apis/redshift/2012-12-01/docs-2.json +0 -1890
  161. data/apis/route53/2013-04-01/docs-2.json +0 -1159
  162. data/apis/route53domains/2014-05-15/docs-2.json +0 -620
  163. data/apis/s3/2006-03-01/docs-2.json +0 -2213
  164. data/apis/sdb/2009-04-15/docs-2.json +0 -339
  165. data/apis/sns/2010-03-31/docs-2.json +0 -564
  166. data/apis/sqs/2012-11-05/docs-2.json +0 -503
  167. data/apis/ssm/2014-11-06/docs-2.json +0 -440
  168. data/apis/storagegateway/2013-06-30/docs-2.json +0 -1331
  169. data/apis/sts/2011-06-15/docs-2.json +0 -351
  170. data/apis/support/2013-04-15/docs-2.json +0 -680
  171. data/apis/swf/2012-01-25/docs-2.json +0 -1569
  172. data/apis/workspaces/2015-04-08/docs-2.json +0 -457
  173. data/lib/aws-sdk-core/api/customizer.rb +0 -75
  174. data/lib/aws-sdk-core/api/docstrings.rb +0 -38
  175. data/lib/aws-sdk-core/api/documenter.rb +0 -241
  176. data/lib/aws-sdk-core/api/operation_documenter.rb +0 -173
  177. data/lib/aws-sdk-core/api/operation_example.rb +0 -133
  178. data/lib/aws-sdk-core/api/service_customizations.rb +0 -140
  179. data/lib/aws-sdk-core/client_paging.rb +0 -31
  180. data/lib/aws-sdk-core/json/rest_handler.rb +0 -20
  181. data/lib/aws-sdk-core/json/rpc_body_handler.rb +0 -38
  182. data/lib/aws-sdk-core/json/rpc_headers_handler.rb +0 -34
  183. data/lib/aws-sdk-core/json/simple_body_handler.rb +0 -34
  184. data/lib/aws-sdk-core/paging/null_pager.rb +0 -20
  185. data/lib/aws-sdk-core/paging/null_provider.rb +0 -13
  186. data/lib/aws-sdk-core/paging/pager.rb +0 -70
  187. data/lib/aws-sdk-core/paging/provider.rb +0 -22
  188. data/lib/aws-sdk-core/rest_body_handler.rb +0 -111
  189. data/lib/aws-sdk-core/signers/handler.rb +0 -18
  190. data/lib/aws-sdk-core/xml/rest_handler.rb +0 -20
  191. data/lib/seahorse/client/param_converter.rb +0 -207
  192. data/lib/seahorse/client/param_validator.rb +0 -139
  193. data/lib/seahorse/client/plugins/json_simple.rb +0 -33
  194. data/lib/seahorse/client/plugins/param_conversion.rb +0 -29
  195. data/lib/seahorse/client/plugins/param_validation.rb +0 -30
  196. data/lib/seahorse/client/xml/builder.rb +0 -91
  197. data/lib/seahorse/model/shape_map.rb +0 -47
@@ -0,0 +1,40 @@
1
+ module Aws
2
+ module Stubbing
3
+ module Protocols
4
+ class Json
5
+
6
+ def stub_data(api, operation, data)
7
+ resp = Seahorse::Client::Http::Response.new
8
+ resp.status_code = 200
9
+ resp.headers["Content-Type"] = content_type(api)
10
+ resp.headers["x-amzn-RequestId"] = "stubbed-request-id"
11
+ resp.body = build_body(operation, data)
12
+ resp
13
+ end
14
+
15
+ def stub_error(error_code)
16
+ http_resp = Seahorse::Client::Http::Response.new
17
+ http_resp.status_code = 400
18
+ http_resp.body = <<-JSON.strip
19
+ {
20
+ "code": #{error_code.inspect},
21
+ "message": "stubbed-response-error-message"
22
+ }
23
+ JSON
24
+ http_resp
25
+ end
26
+
27
+ private
28
+
29
+ def content_type(api)
30
+ "application/x-amz-json-#{api.metadata['jsonVerison']}"
31
+ end
32
+
33
+ def build_body(operation, data)
34
+ Aws::Json::Builder.new(operation.output).to_json(data)
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ module Aws
2
+ module Stubbing
3
+ module Protocols
4
+ class Query
5
+
6
+ def stub_data(api, operation, data)
7
+ resp = Seahorse::Client::Http::Response.new
8
+ resp.status_code = 200
9
+ resp.body = build_body(api, operation, data)
10
+ resp
11
+ end
12
+
13
+ def stub_error(error_code)
14
+ end
15
+
16
+ private
17
+
18
+ def build_body(api, operation, data)
19
+ xml = []
20
+ builder = Aws::Xml::DocBuilder.new(target: xml, indent: ' ')
21
+ builder.node(operation.name + 'Response', xmlns: xmlns(api)) do
22
+ if rules = operation.output
23
+ rules.location_name = operation.name + 'Result'
24
+ Xml::Builder.new(rules, target:xml, pad:' ').to_xml(data)
25
+ end
26
+ builder.node('ResponseMetadata') do
27
+ builder.node('RequestId', 'stubbed-request-id')
28
+ end
29
+ end
30
+ xml.join
31
+ end
32
+
33
+ def xmlns(api)
34
+ api.metadata['xmlNamespace']
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,67 @@
1
+ module Aws
2
+ module Stubbing
3
+ module Protocols
4
+ class Rest
5
+
6
+ include Seahorse::Model::Shapes
7
+
8
+ def stub_data(api, operation, data)
9
+ resp = new_http_response
10
+ apply_status_code(operation, resp, data)
11
+ apply_headers(operation, resp, data)
12
+ apply_body(api, operation, resp, data)
13
+ resp
14
+ end
15
+
16
+ private
17
+
18
+ def new_http_response
19
+ resp = Seahorse::Client::Http::Response.new
20
+ resp.status_code = 200
21
+ resp.headers["x-amzn-RequestId"] = "stubbed-request-id"
22
+ resp
23
+ end
24
+
25
+ def apply_status_code(operation, resp, data)
26
+ operation.output.shape.members.each do |member_name, member_ref|
27
+ if member_ref.location == 'statusCode'
28
+ resp.status_code = data[member_name] if data.key?(member_name)
29
+ end
30
+ end
31
+ end
32
+
33
+ def apply_headers(operation, resp, data)
34
+ Aws::Rest::Request::Headers.new(operation.output).apply(resp, data)
35
+ end
36
+
37
+ def apply_body(api, operation, resp, data)
38
+ resp.body = build_body(api, operation, data)
39
+ end
40
+
41
+ def build_body(api, operation, data)
42
+ rules = operation.output
43
+ if streaming?(rules)
44
+ data[rules[:payload]]
45
+ elsif rules[:payload]
46
+ body_for(api, operation, rules[:payload_member], data[rules[:payload]])
47
+ else
48
+ body_for(api, operation, rules, data)
49
+ end
50
+ end
51
+
52
+ def streaming?(ref)
53
+ if ref[:payload]
54
+ case ref[:payload_member].shape
55
+ when StringShape then true
56
+ when BlobShape then true
57
+ else false
58
+ end
59
+ else
60
+ false
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,25 @@
1
+ module Aws
2
+ module Stubbing
3
+ module Protocols
4
+ class RestJson < Rest
5
+
6
+ def body_for(_, _, rules, data)
7
+ Aws::Json::Builder.new(rules).serialize(data)
8
+ end
9
+
10
+ def stub_error(error_code)
11
+ http_resp = Seahorse::Client::Http::Response.new
12
+ http_resp.status_code = 400
13
+ http_resp.body = <<-JSON.strip
14
+ {
15
+ "code": #{error_code.inspect},
16
+ "message": "stubbed-response-error-message"
17
+ }
18
+ JSON
19
+ http_resp
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ module Aws
2
+ module Stubbing
3
+ module Protocols
4
+ class RestXml < Rest
5
+
6
+ include Seahorse::Model::Shapes
7
+
8
+ def body_for(api, operation, rules, data)
9
+ xml = []
10
+ builder = Aws::Xml::DocBuilder.new(target: xml, indent: ' ')
11
+ rules.location_name = operation.name + 'Result'
12
+ rules['xmlNamespace'] = { 'uri' => api.metadata['xmlNamespace'] }
13
+ Xml::Builder.new(rules, target:xml).to_xml(data)
14
+ xml.join
15
+ end
16
+
17
+ def stub_error(error_code)
18
+ http_resp = Seahorse::Client::Http::Response.new
19
+ http_resp.status_code = 400
20
+ http_resp.body = <<-XML.strip
21
+ <ErrorResponse>
22
+ <Error>
23
+ <Code>#{error_code}</Code>
24
+ <Message>stubbed-response-error-message</Message>
25
+ </Error>
26
+ </ErrorResponse>
27
+ XML
28
+ http_resp
29
+ end
30
+
31
+ def xmlns(api)
32
+ api.metadata['xmlNamespace']
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ module Aws
2
+ module Stubbing
3
+ class StubData
4
+
5
+ def initialize(operation)
6
+ @rules = operation.output
7
+ @pager = operation[:pager]
8
+ end
9
+
10
+ def stub(data = {})
11
+ stub = EmptyStub.new(@rules).stub
12
+ remove_paging_tokens(stub)
13
+ apply_data(data, stub)
14
+ stub
15
+ end
16
+
17
+ private
18
+
19
+ def remove_paging_tokens(stub)
20
+ if @pager
21
+ @pager.instance_variable_get("@tokens").keys.each do |path|
22
+ key = path.split(/\b/)[0]
23
+ stub[key] = nil
24
+ end
25
+ end
26
+ end
27
+
28
+ def apply_data(data, stub)
29
+ ParamValidator.new(@rules, validate_required:false).validate!(data)
30
+ DataApplicator.new(@rules).apply_data(data, stub)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module Aws
2
- VERSION = '2.0.48'
2
+ VERSION = '2.1.0'
3
3
  end
@@ -1,89 +1,99 @@
1
- require 'builder'
2
1
  require 'base64'
3
2
 
4
3
  module Aws
5
4
  module Xml
6
5
  class Builder
7
6
 
8
- # @param [Seahorse::Model::Shapes::Structure] shape
9
- def initialize(shape)
10
- @shape = shape
11
- @xml = []
12
- @builder = ::Builder::XmlMarkup.new(target: @xml, indent: 2)
7
+ include Seahorse::Model::Shapes
8
+
9
+ def initialize(rules, options = {})
10
+ @rules = rules
11
+ @xml = options[:target] || []
12
+ indent = options[:indent] || ' '
13
+ pad = options[:pad] || ''
14
+ @builder = DocBuilder.new(target:@xml, indent:indent, pad:pad)
13
15
  end
14
16
 
15
- # @param [Hash] params
16
- # @return [String] Returns an XML doc string.
17
17
  def to_xml(params)
18
- structure(@shape.location_name, @shape, params)
18
+ structure(@rules.location_name, @rules, params)
19
19
  @xml.join
20
20
  end
21
+ alias serialize to_xml
21
22
 
22
23
  private
23
24
 
24
- def structure(name, shape, values)
25
+ def structure(name, ref, values)
25
26
  if values.empty?
26
- node(name, shape)
27
+ node(name, ref)
27
28
  else
28
- node(name, shape, structure_attrs(shape, values)) do
29
- shape.members.each do |member_name, member_shape|
30
- unless values[member_name].nil?
31
- next if xml_attribute?(member_shape)
32
- mname = member_shape.location_name || member_name.to_s
33
- member(mname, member_shape, values[member_name])
34
- end
29
+ node(name, ref, structure_attrs(ref, values)) do
30
+ ref.shape.members.each do |member_name, member_ref|
31
+ next if values[member_name].nil?
32
+ next if xml_attribute?(member_ref)
33
+ member(member_ref.location_name, member_ref, values[member_name])
35
34
  end
36
35
  end
37
36
  end
38
37
  end
39
38
 
40
- def structure_attrs(shape, values)
41
- shape.members.inject({}) do |attrs, (member_name, member_shape)|
42
- if xml_attribute?(member_shape) && values.key?(member_name)
43
- attrs[member_shape.location_name] = values[member_name]
39
+ def structure_attrs(ref, values)
40
+ ref.shape.members.inject({}) do |attrs, (member_name, member_ref)|
41
+ if xml_attribute?(member_ref) && values.key?(member_name)
42
+ attrs[member_ref.location_name] = values[member_name]
44
43
  end
45
44
  attrs
46
45
  end
47
46
  end
48
47
 
49
- def list(name, shape, values)
50
- if flat?(shape)
48
+ def list(name, ref, values)
49
+ if ref['flattened']
51
50
  values.each do |value|
52
- member(name, shape.member, value)
51
+ member(ref.shape.member.location_name || name, ref.shape.member, value)
53
52
  end
54
53
  else
55
- node(name, shape) do
54
+ node(name, ref) do
56
55
  values.each do |value|
57
- mname = shape.member.location_name || 'member'
58
- member(mname, shape.member, value)
56
+ mname = ref.shape.member.location_name || 'member'
57
+ member(mname, ref.shape.member, value)
59
58
  end
60
59
  end
61
60
  end
62
61
  end
63
62
 
64
- def map(name, shape, hash)
65
- node(name, shape) do
63
+ def map(name, ref, hash)
64
+ key_ref = ref.shape.key
65
+ value_ref = ref.shape.value
66
+ node(name, ref) do
66
67
  hash.each do |key, value|
67
- node('entry', shape) do
68
- member(shape.key.location_name || 'key', shape.key, key)
69
- member(shape.value.location_name || 'value', shape.value, value)
68
+ node('entry', ref) do
69
+ member(key_ref.location_name || 'key', key_ref, key)
70
+ member(value_ref.location_name || 'value', value_ref, value)
70
71
  end
71
72
  end
72
73
  end
73
74
  end
74
75
 
75
- def member(name, shape, value)
76
- case shape.type
77
- when 'structure' then structure(name, shape, value)
78
- when 'list' then list(name, shape, value)
79
- when 'timestamp' then node(name, shape, shape.format_time(value, 'iso8601'))
80
- when 'blob' then node(name, shape, Base64.strict_encode64(value.read))
81
- when 'map' then map(name, shape, value)
76
+ def member(name, ref, value)
77
+ case ref.shape
78
+ when StructureShape then structure(name, ref, value)
79
+ when ListShape then list(name, ref, value)
80
+ when MapShape then map(name, ref, value)
81
+ when TimestampShape then node(name, ref, timestamp(value))
82
+ when BlobShape then node(name, ref, blob(value))
82
83
  else
83
- node(name, shape, value.to_s)
84
+ node(name, ref, value.to_s)
84
85
  end
85
86
  end
86
87
 
88
+ def blob(value)
89
+ value = value.read unless String === value
90
+ Base64.strict_encode64(value)
91
+ end
92
+
93
+ def timestamp(value)
94
+ value.utc.iso8601
95
+ end
96
+
87
97
  # The `args` list may contain:
88
98
  #
89
99
  # * [] - empty, no value or attributes
@@ -94,15 +104,15 @@ module Aws
94
104
  # Pass a block if you want to nest XML nodes inside. When doing this,
95
105
  # you may *not* pass a value to the `args` list.
96
106
  #
97
- def node(name, shape, *args, &block)
107
+ def node(name, ref, *args, &block)
98
108
  attrs = args.last.is_a?(Hash) ? args.pop : {}
99
- attrs = shape_attrs(shape).merge(attrs)
109
+ attrs = shape_attrs(ref).merge(attrs)
100
110
  args << attrs
101
- @builder.__send__(name, *args, &block)
111
+ @builder.node(name, *args, &block)
102
112
  end
103
113
 
104
- def shape_attrs(shape)
105
- if xmlns = shape.metadata('xmlNamespace')
114
+ def shape_attrs(ref)
115
+ if xmlns = ref['xmlNamespace']
106
116
  if prefix = xmlns['prefix']
107
117
  { 'xmlns:' + prefix => xmlns['uri'] }
108
118
  else
@@ -113,12 +123,8 @@ module Aws
113
123
  end
114
124
  end
115
125
 
116
- def xml_attribute?(shape)
117
- !!shape.metadata('xmlAttribute')
118
- end
119
-
120
- def flat?(shape)
121
- shape.metadata('flattened')
126
+ def xml_attribute?(ref)
127
+ !!ref['xmlAttribute']
122
128
  end
123
129
 
124
130
  end
@@ -0,0 +1,10 @@
1
+ module Aws
2
+ module Xml
3
+ # @api private
4
+ class DefaultMap < Hash
5
+
6
+ alias nil? empty?
7
+
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,86 @@
1
+ module Aws
2
+ module Xml
3
+ class DocBuilder
4
+
5
+ # @option options [#<<] :target ('')
6
+ # @option options [String] :pad ('')
7
+ # @option options [String] :indent ('')
8
+ def initialize(options = {})
9
+ @target = options[:target] || ''
10
+ @indent = options[:indent] || ''
11
+ @pad = options[:pad] || ''
12
+ @end_of_line = @indent == '' ? '' : "\n"
13
+ end
14
+
15
+ attr_reader :target
16
+
17
+ # @overload node(name, attributes = {})
18
+ # Adds a self closing element without any content.
19
+ #
20
+ # @overload node(name, value, attributes = {})
21
+ # Adds an element that opens and closes on the same line with
22
+ # simple text content.
23
+ #
24
+ # @overload node(name, attributes = {}, &block)
25
+ # Adds a wrapping element. Calling {#node} from inside
26
+ # the yielded block creates nested elements.
27
+ #
28
+ # @return [void]
29
+ #
30
+ def node(name, *args, &block)
31
+ attrs = args.last.is_a?(Hash) ? args.pop : {}
32
+ if block_given?
33
+ @target << open_el(name, attrs)
34
+ @target << @end_of_line
35
+ increase_pad { yield }
36
+ @target << @pad
37
+ @target << close_el(name)
38
+ elsif args.empty?
39
+ @target << empty_element(name, attrs)
40
+ else
41
+ @target << inline_element(name, args.first, attrs)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def empty_element(name, attrs)
48
+ "#{@pad}<#{name}#{attributes(attrs)}/>#{@end_of_line}"
49
+ end
50
+
51
+ def inline_element(name, value, attrs)
52
+ "#{open_el(name, attrs)}#{escape(value, :text)}#{close_el(name)}"
53
+ end
54
+
55
+ def open_el(name, attrs)
56
+ "#{@pad}<#{name}#{attributes(attrs)}>"
57
+ end
58
+
59
+ def close_el(name)
60
+ "</#{name}>#{@end_of_line}"
61
+ end
62
+
63
+ def escape(string, text_or_attr)
64
+ string.to_s.encode(:xml => text_or_attr)
65
+ end
66
+
67
+ def attributes(attr)
68
+ if attr.empty?
69
+ ''
70
+ else
71
+ ' ' + attr.map do |key, value|
72
+ "#{key}=#{escape(value, :attr)}"
73
+ end.join(' ')
74
+ end
75
+ end
76
+
77
+ def increase_pad(&block)
78
+ pre_increase = @pad
79
+ @pad = @pad + @indent
80
+ yield
81
+ @pad = pre_increase
82
+ end
83
+
84
+ end
85
+ end
86
+ end