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,67 @@
1
+ module Aws
2
+ module Json
3
+ class Handler < Seahorse::Client::Handler
4
+
5
+ CONTENT_TYPE = 'application/x-amz-json-%s'
6
+
7
+ # @param [Seahorse::Client::RequestContext] context
8
+ # @return [Seahorse::Client::Response]
9
+ def call(context)
10
+ build_request(context)
11
+ resp = @handler.call(context)
12
+ resp.on(200..299) { |resp| parse_response(resp) }
13
+ resp.on(200..599) { |resp| apply_request_id(context) }
14
+ resp
15
+ end
16
+
17
+ private
18
+
19
+ def build_request(context)
20
+ context.http_request.http_method = 'POST'
21
+ context.http_request.headers['Content-Type'] = content_type(context)
22
+ context.http_request.headers['X-Amz-Target'] = target(context)
23
+ context.http_request.body = build_body(context)
24
+ end
25
+
26
+ def build_body(context)
27
+ if simple_json?(context)
28
+ Json.dump(context.params)
29
+ else
30
+ Builder.new(context.operation.input).serialize(context.params)
31
+ end
32
+ end
33
+
34
+ def parse_response(response)
35
+ response.data = parse_body(response.context)
36
+ end
37
+
38
+ def parse_body(context)
39
+ if simple_json?(context)
40
+ Json.load(context.http_response.body_contents)
41
+ else
42
+ rules = context.operation.output
43
+ json = context.http_response.body_contents
44
+ Parser.new(rules).parse(json == '' ? '{}' : json)
45
+ end
46
+ end
47
+
48
+ def content_type(context)
49
+ CONTENT_TYPE % [context.config.api.metadata['jsonVersion']]
50
+ end
51
+
52
+ def target(context)
53
+ prefix = context.config.api.metadata['targetPrefix']
54
+ "#{prefix}.#{context.operation.name}"
55
+ end
56
+
57
+ def apply_request_id(context)
58
+ context[:request_id] = context.http_response.headers['x-amzn-requestid']
59
+ end
60
+
61
+ def simple_json?(context)
62
+ context.config.simple_json
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,15 @@
1
+ module Aws
2
+ module Json
3
+ class OjEngine
4
+
5
+ def self.load(json)
6
+ Oj.load(json)
7
+ end
8
+
9
+ def self.dump(value)
10
+ Oj.dump(value)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Aws
2
+ module Json
3
+ class JSONEngine
4
+
5
+ def self.load(json)
6
+ JSON.load(json)
7
+ end
8
+
9
+ def self.dump(value)
10
+ JSON.dump(value)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -5,67 +5,59 @@ module Aws
5
5
  module Json
6
6
  class Parser
7
7
 
8
- # @param [Seahorse::Model::Shapes::Shape] shape
8
+ include Seahorse::Model::Shapes
9
+
10
+ # @param [Seahorse::Model::ShapeRef] rules
11
+ def initialize(rules)
12
+ @rules = rules
13
+ end
14
+
9
15
  # @param [String<JSON>] json
10
- # @param [Hash, Array, nil] target
11
- # @return [Hash]
12
- def parse(shape, json, target = nil)
13
- parse_shape(shape, MultiJson.load(json, max_nesting: false), target)
16
+ def parse(json, target = nil)
17
+ parse_ref(@rules, Json.load(json), target)
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- # @param [Seahorse::Model::Shapes::Structure] structure
19
- # @param [Hash] values
20
- # @param [Hash, nil] target
21
- # @return [Struct]
22
- def structure(structure, values, target = nil)
23
- target = Structure.new(structure.member_names) if target.nil?
24
- values.each do |serialized_name, value|
25
- member_name, shape = structure.member_by_location_name(serialized_name)
26
- if shape
27
- target[member_name] = parse_shape(shape, value)
22
+ def structure(ref, values, target = nil)
23
+ shape = ref.shape
24
+ target = ref[:struct_class].new if target.nil?
25
+ values.each do |key, value|
26
+ member_name, member_ref = shape.member_by_location_name(key)
27
+ if member_ref
28
+ target[member_name] = parse_ref(member_ref, value)
28
29
  end
29
30
  end
30
31
  target
31
32
  end
32
33
 
33
- # @param [Seahorse::Model::Shapes::List] list
34
- # @param [Array] values
35
- # @param [Array, nil] target
36
- # @return [Array]
37
- def list(list, values, target = nil)
34
+ def list(ref, values, target = nil)
38
35
  target = [] if target.nil?
39
- values.each { |value| target << parse_shape(list.member, value) }
36
+ values.each do |value|
37
+ target << parse_ref(ref.shape.member, value)
38
+ end
40
39
  target
41
40
  end
42
41
 
43
- # @param [Seahorse::Model::Shapes::Map] map
44
- # @param [Hash] values
45
- # @return [Hash]
46
- def map(map, values, target = nil)
42
+ def map(ref, values, target = nil)
47
43
  target = {} if target.nil?
48
44
  values.each do |key, value|
49
- target[key] = parse_shape(map.value, value)
45
+ target[key] = parse_ref(ref.shape.value, value)
50
46
  end
51
47
  target
52
48
  end
53
49
 
54
- # @param [Seahorse::Model::Shapes::Shape] shape
55
- # @param [Object] value
56
- # @param [Hash, Array, nil] target
57
- # @return [Object]
58
- def parse_shape(shape, value, target = nil)
50
+ def parse_ref(ref, value, target = nil)
59
51
  if value.nil?
60
52
  nil
61
53
  else
62
- case shape
63
- when Seahorse::Model::Shapes::Structure then structure(shape, value, target)
64
- when Seahorse::Model::Shapes::List then list(shape, value, target)
65
- when Seahorse::Model::Shapes::Map then map(shape, value, target)
66
- when Seahorse::Model::Shapes::Timestamp then time(value)
67
- when Seahorse::Model::Shapes::Blob then Base64.decode64(value)
68
- when Seahorse::Model::Shapes::Boolean then value.to_s == 'true'
54
+ case ref.shape
55
+ when StructureShape then structure(ref, value, target)
56
+ when ListShape then list(ref, value, target)
57
+ when MapShape then map(ref, value, target)
58
+ when TimestampShape then time(value)
59
+ when BlobShape then Base64.decode64(value)
60
+ when BooleanShape then value.to_s == 'true'
69
61
  else value
70
62
  end
71
63
  end
@@ -30,25 +30,22 @@ module Aws
30
30
  # directly. The {Plugins::ResponsePaging} plugin automatically
31
31
  # decorates all responses with a {PageableResponse}.
32
32
  #
33
- class PageableResponse < Seahorse::Client::Response
33
+ module PageableResponse
34
34
 
35
- include Enumerable
36
-
37
- # @param [Seahorse::Client::Response] response
38
- # @param [Paging::Pager] pager
39
- def initialize(response, pager)
40
- @pager = pager
41
- super(context:response.context, data:response.data, error:response.error)
35
+ def self.included(base)
36
+ base.send(:include, Enumerable)
42
37
  end
43
38
 
44
39
  # @return [Paging::Pager]
45
- attr_reader :pager
40
+ attr_accessor :pager
46
41
 
47
42
  # Returns `true` if there are no more results. Calling {#next_page}
48
43
  # when this method returns `false` will raise an error.
49
44
  # @return [Boolean]
50
45
  def last_page?
51
- @last_page = !@pager.truncated?(self)
46
+ if @last_page.nil?
47
+ @last_page = !@pager.truncated?(self)
48
+ end
52
49
  @last_page
53
50
  end
54
51
 
@@ -64,7 +61,7 @@ module Aws
64
61
  if last_page?
65
62
  raise LastPageError.new(self)
66
63
  else
67
- PageableResponse.new(next_response(params), pager)
64
+ next_response(params)
68
65
  end
69
66
  end
70
67
 
@@ -117,7 +114,7 @@ module Aws
117
114
  # @return [Hash] Returns the hash of request parameters for the
118
115
  # next page, merging any given params.
119
116
  def next_page_params(params)
120
- context[:original_params].merge(@pager.next_tokens(self).merge(params))
117
+ context.params.merge(@pager.next_tokens(self).merge(params))
121
118
  end
122
119
 
123
120
  # Raised when calling {PageableResponse#next_page} on a pager that
@@ -0,0 +1,69 @@
1
+ module Aws
2
+ # @api private
3
+ class Pager
4
+
5
+ def initialize(rules)
6
+ if rules['more_results']
7
+ @more_results = underscore(rules['more_results'])
8
+ end
9
+ if rules['limit_key']
10
+ @limit_key = underscore(rules['limit_key']).to_sym
11
+ end
12
+ map_tokens(rules)
13
+ end
14
+
15
+ # @return [Symbol, nil]
16
+ attr_reader :limit_key
17
+
18
+ # @param [Seahorse::Client::Response] response
19
+ # @return [Hash]
20
+ def next_tokens(response)
21
+ @tokens.each.with_object({}) do |(source, target), next_tokens|
22
+ value = JMESPath.search(source, response.data)
23
+ next_tokens[target.to_sym] = value unless empty_value?(value)
24
+ end
25
+ end
26
+
27
+ # @api private
28
+ def prev_tokens(response)
29
+ @tokens.each.with_object({}) do |(_, target), tokens|
30
+ value = JMESPath.search(target, response.context.params)
31
+ tokens[target.to_sym] = value unless empty_value?(value)
32
+ end
33
+ end
34
+
35
+ # @param [Seahorse::Client::Response] response
36
+ # @return [Boolean]
37
+ def truncated?(response)
38
+ if @more_results
39
+ JMESPath.search(@more_results, response.data)
40
+ else
41
+ next_tokens = self.next_tokens(response)
42
+ prev_tokens = self.prev_tokens(response)
43
+ !(next_tokens.empty? || next_tokens == prev_tokens)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def map_tokens(rules)
50
+ input = Array(rules['input_token'])
51
+ output = Array(rules['output_token'])
52
+ @tokens = {}
53
+ input.each.with_index do |key, n|
54
+ @tokens[underscore(output[n])] = underscore(key)
55
+ end
56
+ end
57
+
58
+ def underscore(str)
59
+ str.
60
+ gsub(' or ', '||').
61
+ gsub(/\w+/) { |part| Seahorse::Util.underscore(part) }
62
+ end
63
+
64
+ def empty_value?(value)
65
+ value.nil? || value == '' || value == [] || value == {}
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,203 @@
1
+ require 'stringio'
2
+ require 'date'
3
+ require 'time'
4
+ require 'tempfile'
5
+ require 'thread'
6
+
7
+ module Aws
8
+ # @api private
9
+ class ParamConverter
10
+
11
+ include Seahorse::Model::Shapes
12
+
13
+ @mutex = Mutex.new
14
+ @converters = Hash.new { |h,k| h[k] = {} }
15
+
16
+ def initialize(rules)
17
+ @rules = rules
18
+ end
19
+
20
+ # @param [Hash] params
21
+ # @return [Hash]
22
+ def convert(params)
23
+ structure(@rules, params)
24
+ end
25
+
26
+ private
27
+
28
+ def structure(ref, values)
29
+ values = c(ref, values)
30
+ if Struct === values || Hash === values
31
+ values.each_pair do |k, v|
32
+ unless v.nil?
33
+ if ref.shape.member?(k)
34
+ values[k] = member(ref.shape.member(k), v)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ values
40
+ end
41
+
42
+ def list(ref, values)
43
+ values = c(ref, values)
44
+ if values.is_a?(Array)
45
+ values.map { |v| member(ref.shape.member, v) }
46
+ else
47
+ values
48
+ end
49
+ end
50
+
51
+ def map(ref, values)
52
+ values = c(ref, values)
53
+ if values.is_a?(Hash)
54
+ values.each.with_object({}) do |(key, value), hash|
55
+ hash[member(ref.shape.key, key)] = member(ref.shape.value, value)
56
+ end
57
+ else
58
+ values
59
+ end
60
+ end
61
+
62
+ def member(ref, value)
63
+ case ref.shape
64
+ when StructureShape then structure(ref, value)
65
+ when ListShape then list(ref, value)
66
+ when MapShape then map(ref, value)
67
+ else c(ref, value)
68
+ end
69
+ end
70
+
71
+ def c(ref, value)
72
+ self.class.c(ref.shape.class, value)
73
+ end
74
+
75
+ class << self
76
+
77
+ def convert(shape, params)
78
+ new(shape).convert(params)
79
+ end
80
+
81
+ # Registers a new value converter. Converters run in the context
82
+ # of a shape and value class.
83
+ #
84
+ # # add a converter that stringifies integers
85
+ # shape_class = Seahorse::Model::Shapes::StringShape
86
+ # ParamConverter.add(shape_class, Integer) { |i| i.to_s }
87
+ #
88
+ # @param [Class<Model::Shapes::Shape>] shape_class
89
+ # @param [Class] value_class
90
+ # @param [#call] converter (nil) An object that responds to `#call`
91
+ # accepting a single argument. This function should perform
92
+ # the value conversion if possible, returning the result.
93
+ # If the conversion is not possible, the original value should
94
+ # be returned.
95
+ # @return [void]
96
+ def add(shape_class, value_class, converter = nil, &block)
97
+ @converters[shape_class][value_class] = converter || block
98
+ end
99
+
100
+ # @api private
101
+ def c(shape, value)
102
+ if converter = converter_for(shape, value)
103
+ converter.call(value)
104
+ else
105
+ value
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ def converter_for(shape_class, value)
112
+ unless @converters[shape_class].key?(value.class)
113
+ @mutex.synchronize {
114
+ unless @converters[shape_class].key?(value.class)
115
+ @converters[shape_class][value.class] = find(shape_class, value)
116
+ end
117
+ }
118
+ end
119
+ @converters[shape_class][value.class]
120
+ end
121
+
122
+ def find(shape_class, value)
123
+ converter = nil
124
+ each_base_class(shape_class) do |klass|
125
+ @converters[klass].each do |value_class, block|
126
+ if value_class === value
127
+ converter = block
128
+ break
129
+ end
130
+ end
131
+ break if converter
132
+ end
133
+ converter
134
+ end
135
+
136
+ def each_base_class(shape_class, &block)
137
+ shape_class.ancestors.each do |ancestor|
138
+ yield(ancestor) if @converters.key?(ancestor)
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ add(StructureShape, Hash) { |h| h.dup }
145
+ add(StructureShape, Struct)
146
+
147
+ add(MapShape, Hash) { |h| h.dup }
148
+ add(MapShape, Struct) do |s|
149
+ s.members.each.with_object({}) {|k,h| h[k] = s[k] }
150
+ end
151
+
152
+ add(ListShape, Array) { |a| a.dup }
153
+ add(ListShape, Enumerable) { |value| value.to_a }
154
+
155
+ add(StringShape, String)
156
+ add(StringShape, Symbol) { |sym| sym.to_s }
157
+
158
+ add(IntegerShape, Integer)
159
+ add(IntegerShape, Float) { |f| f.to_i }
160
+ add(IntegerShape, String) do |str|
161
+ begin
162
+ Integer(str)
163
+ rescue ArgumentError
164
+ str
165
+ end
166
+ end
167
+
168
+ add(FloatShape, Float)
169
+ add(FloatShape, Integer) { |i| i.to_f }
170
+ add(FloatShape, String) do |str|
171
+ begin
172
+ Float(str)
173
+ rescue ArgumentError
174
+ str
175
+ end
176
+ end
177
+
178
+ add(TimestampShape, Time)
179
+ add(TimestampShape, Date) { |d| d.to_time }
180
+ add(TimestampShape, DateTime) { |dt| dt.to_time }
181
+ add(TimestampShape, Integer) { |i| Time.at(i) }
182
+ add(TimestampShape, Float) { |f| Time.at(f) }
183
+ add(TimestampShape, String) do |str|
184
+ begin
185
+ Time.parse(str)
186
+ rescue ArgumentError
187
+ str
188
+ end
189
+ end
190
+
191
+ add(BooleanShape, TrueClass)
192
+ add(BooleanShape, FalseClass)
193
+ add(BooleanShape, String) do |str|
194
+ { 'true' => true, 'false' => false }[str]
195
+ end
196
+
197
+ add(BlobShape, IO)
198
+ add(BlobShape, Tempfile)
199
+ add(BlobShape, StringIO)
200
+ add(BlobShape, String)
201
+
202
+ end
203
+ end