aws-sdk-core 2.0.48 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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