aws-sdk-core 2.0.0.rc1

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 (417) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.simplecov +6 -0
  4. data/.travis.yml +12 -0
  5. data/.yardopts +11 -0
  6. data/Gemfile +26 -0
  7. data/LICENSE.txt +12 -0
  8. data/README.md +169 -0
  9. data/Rakefile +15 -0
  10. data/apis/AutoScaling-2011-01-01.json +1852 -0
  11. data/apis/CloudFormation-2010-05-15.json +981 -0
  12. data/apis/CloudFront-2012-05-05.json +3861 -0
  13. data/apis/CloudFront-2013-05-12.json +4593 -0
  14. data/apis/CloudFront-2013-08-26.json +4849 -0
  15. data/apis/CloudSearch-2011-02-01.json +2080 -0
  16. data/apis/CloudWatch-2010-08-01.json +1206 -0
  17. data/apis/DataPipeline-2012-10-29.json +901 -0
  18. data/apis/DirectConnect-2012-10-25.json +825 -0
  19. data/apis/DynamoDB-2011-12-05.json +2857 -0
  20. data/apis/DynamoDB-2012-08-10.json +3127 -0
  21. data/apis/EC2-2013-06-15.json +13600 -0
  22. data/apis/EC2-2013-10-01.json +14574 -0
  23. data/apis/EMR-2009-03-31.json +957 -0
  24. data/apis/ElastiCache-2012-11-15.json +2921 -0
  25. data/apis/ElastiCache-2013-06-15.json +3586 -0
  26. data/apis/ElasticBeanstalk-2010-12-01.json +2225 -0
  27. data/apis/ElasticLoadBalancing-2012-06-01.json +1215 -0
  28. data/apis/ElasticTranscoder-2012-09-25.json +3692 -0
  29. data/apis/Glacier-2012-06-01.json +1058 -0
  30. data/apis/IAM-2010-05-08.json +2863 -0
  31. data/apis/ImportExport-2010-06-01.json +328 -0
  32. data/apis/OpsWorks-2013-02-18.json +3546 -0
  33. data/apis/RDS-2013-01-10.json +6772 -0
  34. data/apis/RDS-2013-02-12.json +7151 -0
  35. data/apis/RDS-2013-05-15.json +7809 -0
  36. data/apis/Redshift-2012-12-01.json +4180 -0
  37. data/apis/Route53-2012-12-12.json +1018 -0
  38. data/apis/S3-2006-03-01.json +3787 -0
  39. data/apis/SDB-2009-04-15.json +539 -0
  40. data/apis/SES-2010-12-01.json +678 -0
  41. data/apis/SNS-2010-03-31.json +870 -0
  42. data/apis/SQS-2012-11-05.json +798 -0
  43. data/apis/STS-2011-06-15.json +352 -0
  44. data/apis/SWF-2012-01-25.json +5451 -0
  45. data/apis/StorageGateway-2012-06-30.json +1696 -0
  46. data/apis/Support-2013-04-15.json +794 -0
  47. data/apis/configuration/endpoints.json +1337 -0
  48. data/apis/source/autoscaling-2011-01-01.json +3215 -0
  49. data/apis/source/autoscaling-2011-01-01.paginators.json +52 -0
  50. data/apis/source/cloudformation-2010-05-15.json +1260 -0
  51. data/apis/source/cloudformation-2010-05-15.paginators.json +24 -0
  52. data/apis/source/cloudfront-2012-05-05.json +6588 -0
  53. data/apis/source/cloudfront-2012-05-05.paginators.json +28 -0
  54. data/apis/source/cloudfront-2013-05-12.json +7614 -0
  55. data/apis/source/cloudfront-2013-05-12.paginators.json +28 -0
  56. data/apis/source/cloudfront-2013-08-26.json +8016 -0
  57. data/apis/source/cloudfront-2013-08-26.paginators.json +28 -0
  58. data/apis/source/cloudsearch-2011-02-01.json +3585 -0
  59. data/apis/source/cloudsearch-2011-02-01.paginators.json +13 -0
  60. data/apis/source/datapipeline-2012-10-29.json +2144 -0
  61. data/apis/source/datapipeline-2012-10-29.paginators.json +25 -0
  62. data/apis/source/directconnect-2012-10-25.json +1271 -0
  63. data/apis/source/directconnect-2012-10-25.paginators.json +16 -0
  64. data/apis/source/dynamodb-2011-12-05.json +4380 -0
  65. data/apis/source/dynamodb-2011-12-05.paginators.json +24 -0
  66. data/apis/source/dynamodb-2012-08-10.json +4839 -0
  67. data/apis/source/dynamodb-2012-08-10.paginators.json +24 -0
  68. data/apis/source/ec2-2013-02-01.json +18820 -0
  69. data/apis/source/ec2-2013-02-01.paginators.json +115 -0
  70. data/apis/source/ec2-2013-06-15.json +18820 -0
  71. data/apis/source/ec2-2013-06-15.paginators.json +115 -0
  72. data/apis/source/ec2-2013-10-01.json +19885 -0
  73. data/apis/source/ec2-2013-10-01.paginators.json +115 -0
  74. data/apis/source/elasticache-2012-11-15.json +4403 -0
  75. data/apis/source/elasticache-2012-11-15.paginators.json +64 -0
  76. data/apis/source/elasticache-2013-06-15.json +5421 -0
  77. data/apis/source/elasticache-2013-06-15.paginators.json +64 -0
  78. data/apis/source/elasticbeanstalk-2010-12-01.json +3151 -0
  79. data/apis/source/elasticbeanstalk-2010-12-01.paginators.json +25 -0
  80. data/apis/source/elasticloadbalancing-2012-06-01.json +2041 -0
  81. data/apis/source/elasticloadbalancing-2012-06-01.paginators.json +18 -0
  82. data/apis/source/elasticmapreduce-2009-03-31.json +1478 -0
  83. data/apis/source/elasticmapreduce-2009-03-31.paginators.json +7 -0
  84. data/apis/source/elastictranscoder-2012-09-25.json +6148 -0
  85. data/apis/source/elastictranscoder-2012-09-25.paginators.json +20 -0
  86. data/apis/source/email-2010-12-01.json +892 -0
  87. data/apis/source/email-2010-12-01.paginators.json +13 -0
  88. data/apis/source/glacier-2012-06-01.json +3147 -0
  89. data/apis/source/glacier-2012-06-01.paginators.json +28 -0
  90. data/apis/source/iam-2010-05-08.json +5857 -0
  91. data/apis/source/iam-2010-05-08.paginators.json +116 -0
  92. data/apis/source/importexport-2010-06-01.json +876 -0
  93. data/apis/source/importexport-2010-06-01.paginators.json +10 -0
  94. data/apis/source/monitoring-2010-08-01.json +1910 -0
  95. data/apis/source/monitoring-2010-08-01.paginators.json +24 -0
  96. data/apis/source/opsworks-2013-02-18.json +5848 -0
  97. data/apis/source/opsworks-2013-02-18.paginators.json +46 -0
  98. data/apis/source/rds-2013-01-10.json +9283 -0
  99. data/apis/source/rds-2013-01-10.paginators.json +105 -0
  100. data/apis/source/rds-2013-02-12.json +9777 -0
  101. data/apis/source/rds-2013-02-12.paginators.json +105 -0
  102. data/apis/source/rds-2013-05-15.json +10618 -0
  103. data/apis/source/rds-2013-05-15.paginators.json +105 -0
  104. data/apis/source/redshift-2012-12-01.json +5742 -0
  105. data/apis/source/redshift-2012-12-01.paginators.json +74 -0
  106. data/apis/source/route53-2012-12-12.json +2067 -0
  107. data/apis/source/route53-2012-12-12.paginators.json +33 -0
  108. data/apis/source/s3-2006-03-01.json +4261 -0
  109. data/apis/source/s3-2006-03-01.paginators.json +46 -0
  110. data/apis/source/sdb-2009-04-15.json +1145 -0
  111. data/apis/source/sdb-2009-04-15.paginators.json +15 -0
  112. data/apis/source/sns-2010-03-31.json +2234 -0
  113. data/apis/source/sns-2010-03-31.paginators.json +19 -0
  114. data/apis/source/sqs-2012-11-05.json +1162 -0
  115. data/apis/source/sqs-2012-11-05.paginators.json +7 -0
  116. data/apis/source/storagegateway-2012-06-30.json +9487 -0
  117. data/apis/source/storagegateway-2012-06-30.paginators.json +28 -0
  118. data/apis/source/sts-2011-06-15.json +627 -0
  119. data/apis/source/support-2013-04-15.json +1261 -0
  120. data/apis/source/support-2013-04-15.paginators.json +31 -0
  121. data/apis/source/swf-2012-01-25.json +8744 -0
  122. data/apis/source/swf-2012-01-25.paginators.json +46 -0
  123. data/aws-sdk-core.gemspec +21 -0
  124. data/bin/aws.rb +156 -0
  125. data/doc-src/images/lastnode.png +0 -0
  126. data/doc-src/images/node.png +0 -0
  127. data/doc-src/images/vline.png +0 -0
  128. data/doc-src/plugins/apis.rb +205 -0
  129. data/doc-src/templates/default/fulldoc/html/css/common.css +90 -0
  130. data/doc-src/templates/default/fulldoc/html/js/tabs.js +21 -0
  131. data/doc-src/templates/default/fulldoc/html/setup.rb +61 -0
  132. data/doc-src/templates/default/layout/html/footer.erb +29 -0
  133. data/doc-src/templates/default/layout/html/setup.rb +3 -0
  134. data/features/autoscaling/client.feature +22 -0
  135. data/features/autoscaling/setup.rb +6 -0
  136. data/features/cloudformation/client.feature +18 -0
  137. data/features/cloudformation/setup.rb +6 -0
  138. data/features/cloudfront/client.feature +21 -0
  139. data/features/cloudfront/setup.rb +6 -0
  140. data/features/cloudsearch/client.feature +18 -0
  141. data/features/cloudsearch/setup.rb +6 -0
  142. data/features/cloudwatch/client.feature +21 -0
  143. data/features/cloudwatch/setup.rb +6 -0
  144. data/features/common/step_definitions.rb +65 -0
  145. data/features/datapipeline/client.feature +18 -0
  146. data/features/datapipeline/setup.rb +6 -0
  147. data/features/directconnect/client.feature +18 -0
  148. data/features/directconnect/setup.rb +6 -0
  149. data/features/dynamodb/client.feature +21 -0
  150. data/features/dynamodb/setup.rb +8 -0
  151. data/features/dynamodb/simplified.feature +32 -0
  152. data/features/dynamodb/step_definitions.rb +3 -0
  153. data/features/ec2/client.feature +21 -0
  154. data/features/ec2/setup.rb +6 -0
  155. data/features/ec2/step_definitions.rb +19 -0
  156. data/features/elasticache/client.feature +18 -0
  157. data/features/elasticache/setup.rb +6 -0
  158. data/features/elasticbeanstalk/client.feature +18 -0
  159. data/features/elasticbeanstalk/setup.rb +6 -0
  160. data/features/elasticloadbalancing/client.feature +18 -0
  161. data/features/elasticloadbalancing/setup.rb +6 -0
  162. data/features/elastictranscoder/client.feature +18 -0
  163. data/features/elastictranscoder/setup.rb +6 -0
  164. data/features/emr/client.feature +18 -0
  165. data/features/emr/setup.rb +6 -0
  166. data/features/env.rb +23 -0
  167. data/features/glacier/client.feature +28 -0
  168. data/features/glacier/setup.rb +16 -0
  169. data/features/glacier/step_definitions.rb +25 -0
  170. data/features/iam/client.feature +18 -0
  171. data/features/iam/setup.rb +6 -0
  172. data/features/importexport/client.feature +18 -0
  173. data/features/importexport/setup.rb +6 -0
  174. data/features/opsworks/client.feature +18 -0
  175. data/features/opsworks/setup.rb +6 -0
  176. data/features/rds/client.feature +18 -0
  177. data/features/rds/setup.rb +6 -0
  178. data/features/redshift/client.feature +18 -0
  179. data/features/redshift/setup.rb +6 -0
  180. data/features/route53/client.feature +18 -0
  181. data/features/route53/setup.rb +6 -0
  182. data/features/s3/buckets.feature +22 -0
  183. data/features/s3/objects.feature +18 -0
  184. data/features/s3/setup.rb +17 -0
  185. data/features/s3/step_definitions.rb +66 -0
  186. data/features/s3/test.png +0 -0
  187. data/features/sdb/client.feature +18 -0
  188. data/features/sdb/setup.rb +6 -0
  189. data/features/ses/client.feature +18 -0
  190. data/features/ses/setup.rb +6 -0
  191. data/features/sns/client.feature +18 -0
  192. data/features/sns/setup.rb +6 -0
  193. data/features/sqs/client.feature +23 -0
  194. data/features/sqs/setup.rb +10 -0
  195. data/features/sqs/step_definitions.rb +18 -0
  196. data/features/storagegateway/client.feature +18 -0
  197. data/features/storagegateway/setup.rb +6 -0
  198. data/features/sts/client.feature +18 -0
  199. data/features/sts/setup.rb +6 -0
  200. data/features/swf/client.feature +21 -0
  201. data/features/swf/setup.rb +6 -0
  202. data/integration-test-config.json.sample +3 -0
  203. data/lib/aws-sdk-core.rb +11 -0
  204. data/lib/aws.rb +175 -0
  205. data/lib/aws/api/base_translator.rb +72 -0
  206. data/lib/aws/api/doc_example.rb +116 -0
  207. data/lib/aws/api/documentor.rb +140 -0
  208. data/lib/aws/api/operation_translator.rb +77 -0
  209. data/lib/aws/api/service_namer.rb +40 -0
  210. data/lib/aws/api/service_translators/cloud_front.rb +19 -0
  211. data/lib/aws/api/service_translators/dynamo_db.rb +7 -0
  212. data/lib/aws/api/service_translators/glacier.rb +37 -0
  213. data/lib/aws/api/service_translators/import_export.rb +15 -0
  214. data/lib/aws/api/service_translators/route53.rb +23 -0
  215. data/lib/aws/api/service_translators/s3.rb +11 -0
  216. data/lib/aws/api/service_translators/sqs.rb +10 -0
  217. data/lib/aws/api/service_translators/swf.rb +7 -0
  218. data/lib/aws/api/shape_translator.rb +96 -0
  219. data/lib/aws/api/translator.rb +150 -0
  220. data/lib/aws/api/visitor.rb +32 -0
  221. data/lib/aws/credentials.rb +35 -0
  222. data/lib/aws/error_handler.rb +48 -0
  223. data/lib/aws/errors.rb +83 -0
  224. data/lib/aws/json/builder.rb +77 -0
  225. data/lib/aws/json/error_parser.rb +20 -0
  226. data/lib/aws/json/parser.rb +67 -0
  227. data/lib/aws/json/serializer.rb +15 -0
  228. data/lib/aws/plugins/credentials.rb +48 -0
  229. data/lib/aws/plugins/dynamodb_extended_retries.rb +22 -0
  230. data/lib/aws/plugins/glacier_api_version.rb +19 -0
  231. data/lib/aws/plugins/glacier_checksums.rb +100 -0
  232. data/lib/aws/plugins/global_configuration.rb +79 -0
  233. data/lib/aws/plugins/json_protocol.rb +30 -0
  234. data/lib/aws/plugins/json_rpc_headers.rb +34 -0
  235. data/lib/aws/plugins/query_protocol.rb +11 -0
  236. data/lib/aws/plugins/regional_endpoint.rb +37 -0
  237. data/lib/aws/plugins/retry_errors.rb +149 -0
  238. data/lib/aws/plugins/s3_bucket_dns.rb +78 -0
  239. data/lib/aws/plugins/s3_complete_multipart_upload_fix.rb +38 -0
  240. data/lib/aws/plugins/s3_get_bucket_location_fix.rb +21 -0
  241. data/lib/aws/plugins/s3_md5s.rb +61 -0
  242. data/lib/aws/plugins/s3_redirects.rb +38 -0
  243. data/lib/aws/plugins/s3_regional_endpoint.rb +19 -0
  244. data/lib/aws/plugins/s3_signer.rb +9 -0
  245. data/lib/aws/plugins/signature_v2.rb +9 -0
  246. data/lib/aws/plugins/signature_v3.rb +9 -0
  247. data/lib/aws/plugins/signature_v4.rb +29 -0
  248. data/lib/aws/plugins/sqs_queue_urls.rb +33 -0
  249. data/lib/aws/plugins/swf_read_timeouts.rb +23 -0
  250. data/lib/aws/plugins/user_agent.rb +32 -0
  251. data/lib/aws/plugins/xml_protocol.rb +11 -0
  252. data/lib/aws/query/builder.rb +102 -0
  253. data/lib/aws/query/param.rb +43 -0
  254. data/lib/aws/query/param_list.rb +91 -0
  255. data/lib/aws/query/serializer.rb +24 -0
  256. data/lib/aws/request_handler.rb +39 -0
  257. data/lib/aws/response_handler.rb +38 -0
  258. data/lib/aws/service.rb +237 -0
  259. data/lib/aws/signers/base.rb +29 -0
  260. data/lib/aws/signers/handler.rb +18 -0
  261. data/lib/aws/signers/s3.rb +162 -0
  262. data/lib/aws/signers/v2.rb +48 -0
  263. data/lib/aws/signers/v3.rb +34 -0
  264. data/lib/aws/signers/v4.rb +142 -0
  265. data/lib/aws/structure.rb +38 -0
  266. data/lib/aws/timestamp_formatter.rb +16 -0
  267. data/lib/aws/util.rb +38 -0
  268. data/lib/aws/version.rb +3 -0
  269. data/lib/aws/xml/builder.rb +134 -0
  270. data/lib/aws/xml/error_parser.rb +24 -0
  271. data/lib/aws/xml/parser.rb +147 -0
  272. data/lib/aws/xml/serializer.rb +16 -0
  273. data/spec/aws/credentials_spec.rb +39 -0
  274. data/spec/aws/iam_spec.rb +17 -0
  275. data/spec/aws/json/builder_spec.rb +183 -0
  276. data/spec/aws/json/parser_spec.rb +238 -0
  277. data/spec/aws/operations_spec.rb +145 -0
  278. data/spec/aws/plugins/credentials_spec.rb +76 -0
  279. data/spec/aws/plugins/global_configuration_spec.rb +56 -0
  280. data/spec/aws/plugins/region_endpoint_spec.rb +77 -0
  281. data/spec/aws/plugins/retry_errors_spec.rb +253 -0
  282. data/spec/aws/query/builder_spec.rb +361 -0
  283. data/spec/aws/query/param_list_spec.rb +80 -0
  284. data/spec/aws/query/param_spec.rb +59 -0
  285. data/spec/aws/service_spec.rb +247 -0
  286. data/spec/aws/signers/v4_spec.rb +141 -0
  287. data/spec/aws/structure_spec.rb +103 -0
  288. data/spec/aws/xml/builder_spec.rb +404 -0
  289. data/spec/aws/xml/parser_spec.rb +716 -0
  290. data/spec/aws_spec.rb +89 -0
  291. data/spec/fixtures/api/swf.json +100 -0
  292. data/spec/fixtures/operations/cloudfront/list_distributions.yml +195 -0
  293. data/spec/fixtures/operations/cloudfront/max_items.yml +12 -0
  294. data/spec/fixtures/operations/dynamodb/error_parsing.yml +13 -0
  295. data/spec/fixtures/operations/glacier/error_parsing.yml +10 -0
  296. data/spec/fixtures/operations/glacier/list_vaults.yml +24 -0
  297. data/spec/fixtures/operations/iam/result_wrapped_elements.yml +31 -0
  298. data/spec/fixtures/operations/s3/304_response.yml +12 -0
  299. data/spec/fixtures/operations/s3/400_response.yml +12 -0
  300. data/spec/fixtures/operations/s3/403_response.yml +12 -0
  301. data/spec/fixtures/operations/s3/404_response.yml +12 -0
  302. data/spec/fixtures/operations/s3/comlete_multipart_upload_error.yml +18 -0
  303. data/spec/fixtures/operations/s3/create_bucket_with_location_constraint.yml +25 -0
  304. data/spec/fixtures/operations/s3/create_bucket_without_location_constraint.yml +9 -0
  305. data/spec/fixtures/operations/s3/delete_objects.yml +54 -0
  306. data/spec/fixtures/operations/s3/error_parsing.yml +17 -0
  307. data/spec/fixtures/operations/s3/get_bucket_location.yml +17 -0
  308. data/spec/fixtures/operations/s3/get_bucket_location_classic.yml +17 -0
  309. data/spec/fixtures/operations/s3/head_bucket_with_dns_incompatible_name.yml +12 -0
  310. data/spec/fixtures/operations/s3/head_object.yml +50 -0
  311. data/spec/fixtures/operations/s3/list_buckets.yml +41 -0
  312. data/spec/fixtures/operations/s3/md5_checksum_disabled.yml +10 -0
  313. data/spec/fixtures/operations/s3/md5_checksum_enabled.yml +8 -0
  314. data/spec/fixtures/operations/swf/list_domains.yml +20 -0
  315. data/spec/spec_helper.rb +55 -0
  316. data/tasks/apis.rake +51 -0
  317. data/tasks/docs.rake +59 -0
  318. data/tasks/test.rake +39 -0
  319. data/vendor/seahorse/.gitignore +5 -0
  320. data/vendor/seahorse/.simplecov +4 -0
  321. data/vendor/seahorse/.yardopts +10 -0
  322. data/vendor/seahorse/Gemfile +20 -0
  323. data/vendor/seahorse/LICENSE.txt +12 -0
  324. data/vendor/seahorse/README.md +129 -0
  325. data/vendor/seahorse/Rakefile +7 -0
  326. data/vendor/seahorse/ca-bundle.crt +3554 -0
  327. data/vendor/seahorse/lib/seahorse.rb +6 -0
  328. data/vendor/seahorse/lib/seahorse/client.rb +61 -0
  329. data/vendor/seahorse/lib/seahorse/client/base.rb +239 -0
  330. data/vendor/seahorse/lib/seahorse/client/block_io.rb +39 -0
  331. data/vendor/seahorse/lib/seahorse/client/configuration.rb +197 -0
  332. data/vendor/seahorse/lib/seahorse/client/handler.rb +26 -0
  333. data/vendor/seahorse/lib/seahorse/client/handler_builder.rb +49 -0
  334. data/vendor/seahorse/lib/seahorse/client/handler_list.rb +250 -0
  335. data/vendor/seahorse/lib/seahorse/client/http/endpoint.rb +95 -0
  336. data/vendor/seahorse/lib/seahorse/client/http/headers.rb +94 -0
  337. data/vendor/seahorse/lib/seahorse/client/http/plain_string_io.rb +11 -0
  338. data/vendor/seahorse/lib/seahorse/client/http/request.rb +78 -0
  339. data/vendor/seahorse/lib/seahorse/client/http/response.rb +45 -0
  340. data/vendor/seahorse/lib/seahorse/client/logging/formatter.rb +319 -0
  341. data/vendor/seahorse/lib/seahorse/client/logging/handler.rb +35 -0
  342. data/vendor/seahorse/lib/seahorse/client/net_http/connection_pool.rb +339 -0
  343. data/vendor/seahorse/lib/seahorse/client/net_http/handler.rb +109 -0
  344. data/vendor/seahorse/lib/seahorse/client/param_converter.rb +202 -0
  345. data/vendor/seahorse/lib/seahorse/client/param_validator.rb +139 -0
  346. data/vendor/seahorse/lib/seahorse/client/plugin.rb +80 -0
  347. data/vendor/seahorse/lib/seahorse/client/plugin_list.rb +142 -0
  348. data/vendor/seahorse/lib/seahorse/client/plugins/api.rb +11 -0
  349. data/vendor/seahorse/lib/seahorse/client/plugins/content_length.rb +22 -0
  350. data/vendor/seahorse/lib/seahorse/client/plugins/endpoint.rb +36 -0
  351. data/vendor/seahorse/lib/seahorse/client/plugins/json_simple.rb +34 -0
  352. data/vendor/seahorse/lib/seahorse/client/plugins/logging.rb +37 -0
  353. data/vendor/seahorse/lib/seahorse/client/plugins/net_http.rb +26 -0
  354. data/vendor/seahorse/lib/seahorse/client/plugins/operation_methods.rb +48 -0
  355. data/vendor/seahorse/lib/seahorse/client/plugins/param_conversion.rb +29 -0
  356. data/vendor/seahorse/lib/seahorse/client/plugins/param_validation.rb +30 -0
  357. data/vendor/seahorse/lib/seahorse/client/plugins/raise_response_errors.rb +29 -0
  358. data/vendor/seahorse/lib/seahorse/client/plugins/restful_bindings.rb +205 -0
  359. data/vendor/seahorse/lib/seahorse/client/request.rb +62 -0
  360. data/vendor/seahorse/lib/seahorse/client/request_context.rb +68 -0
  361. data/vendor/seahorse/lib/seahorse/client/response.rb +106 -0
  362. data/vendor/seahorse/lib/seahorse/client/xml/builder.rb +92 -0
  363. data/vendor/seahorse/lib/seahorse/model.rb +38 -0
  364. data/vendor/seahorse/lib/seahorse/model/api.rb +39 -0
  365. data/vendor/seahorse/lib/seahorse/model/node.rb +102 -0
  366. data/vendor/seahorse/lib/seahorse/model/operation.rb +32 -0
  367. data/vendor/seahorse/lib/seahorse/model/operation_input.rb +30 -0
  368. data/vendor/seahorse/lib/seahorse/model/operations.rb +59 -0
  369. data/vendor/seahorse/lib/seahorse/model/property.rb +141 -0
  370. data/vendor/seahorse/lib/seahorse/model/shapes/shape.rb +229 -0
  371. data/vendor/seahorse/lib/seahorse/model/types.rb +8 -0
  372. data/vendor/seahorse/lib/seahorse/version.rb +3 -0
  373. data/vendor/seahorse/seahorse.gemspec +20 -0
  374. data/vendor/seahorse/spec/fixtures/plugin.rb +4 -0
  375. data/vendor/seahorse/spec/seahorse/client/base_spec.rb +308 -0
  376. data/vendor/seahorse/spec/seahorse/client/configuration_spec.rb +118 -0
  377. data/vendor/seahorse/spec/seahorse/client/handler_builder_spec.rb +159 -0
  378. data/vendor/seahorse/spec/seahorse/client/handler_list_spec.rb +243 -0
  379. data/vendor/seahorse/spec/seahorse/client/handler_spec.rb +40 -0
  380. data/vendor/seahorse/spec/seahorse/client/http/endpoint_spec.rb +168 -0
  381. data/vendor/seahorse/spec/seahorse/client/http/headers_spec.rb +213 -0
  382. data/vendor/seahorse/spec/seahorse/client/http/plain_string_io_spec.rb +23 -0
  383. data/vendor/seahorse/spec/seahorse/client/http/request_spec.rb +142 -0
  384. data/vendor/seahorse/spec/seahorse/client/http/response_spec.rb +77 -0
  385. data/vendor/seahorse/spec/seahorse/client/logging/formatter_spec.rb +197 -0
  386. data/vendor/seahorse/spec/seahorse/client/logging/handler_spec.rb +63 -0
  387. data/vendor/seahorse/spec/seahorse/client/net_http/connection_pool_spec.rb +10 -0
  388. data/vendor/seahorse/spec/seahorse/client/net_http/handler_spec.rb +232 -0
  389. data/vendor/seahorse/spec/seahorse/client/param_converter_spec.rb +318 -0
  390. data/vendor/seahorse/spec/seahorse/client/param_validator_spec.rb +271 -0
  391. data/vendor/seahorse/spec/seahorse/client/plugin_list_spec.rb +166 -0
  392. data/vendor/seahorse/spec/seahorse/client/plugin_spec.rb +118 -0
  393. data/vendor/seahorse/spec/seahorse/client/plugins/content_length_spec.rb +19 -0
  394. data/vendor/seahorse/spec/seahorse/client/plugins/endpoint_spec.rb +43 -0
  395. data/vendor/seahorse/spec/seahorse/client/plugins/logging_spec.rb +46 -0
  396. data/vendor/seahorse/spec/seahorse/client/plugins/net_http_spec.rb +71 -0
  397. data/vendor/seahorse/spec/seahorse/client/plugins/operation_methods_spec.rb +74 -0
  398. data/vendor/seahorse/spec/seahorse/client/plugins/restful_bindings/uri_path_builder_spec.rb +91 -0
  399. data/vendor/seahorse/spec/seahorse/client/request_context_spec.rb +105 -0
  400. data/vendor/seahorse/spec/seahorse/client/request_spec.rb +102 -0
  401. data/vendor/seahorse/spec/seahorse/client/response_spec.rb +171 -0
  402. data/vendor/seahorse/spec/seahorse/client/xml/builder/xml_doc_spec.rb +142 -0
  403. data/vendor/seahorse/spec/seahorse/client/xml/builder_spec.rb +10 -0
  404. data/vendor/seahorse/spec/seahorse/client_spec.rb +13 -0
  405. data/vendor/seahorse/spec/seahorse/model/api_spec.rb +72 -0
  406. data/vendor/seahorse/spec/seahorse/model/node_spec.rb +114 -0
  407. data/vendor/seahorse/spec/seahorse/model/operation_input_spec.rb +53 -0
  408. data/vendor/seahorse/spec/seahorse/model/operation_spec.rb +48 -0
  409. data/vendor/seahorse/spec/seahorse/model/operations_spec.rb +64 -0
  410. data/vendor/seahorse/spec/seahorse/model/property_spec.rb +136 -0
  411. data/vendor/seahorse/spec/seahorse/model/shapes/shape_spec.rb +105 -0
  412. data/vendor/seahorse/spec/seahorse/version_spec.rb +11 -0
  413. data/vendor/seahorse/spec/spec_helper.rb +34 -0
  414. data/vendor/seahorse/tasks/ca_bundle.rake +23 -0
  415. data/vendor/seahorse/tasks/docs.rake +11 -0
  416. data/vendor/seahorse/tasks/test.rake +26 -0
  417. metadata +614 -0
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ module Aws
4
+ module Plugins
5
+ describe GlobalConfiguration do
6
+
7
+ def plugin(&block)
8
+ Class.new(Seahorse::Client::Plugin, &block)
9
+ end
10
+
11
+ before(:each) do
12
+ api = Seahorse::Model::Api.new
13
+ api.metadata['service_class_name'] = 'Svc'
14
+ api.version = '2013-01-01'
15
+ Aws.add_service(:Svc, [api])
16
+ Aws::Svc.add_plugin(GlobalConfiguration)
17
+ Aws::Svc.add_plugin(plugin { option(:property, 'plugin-default') })
18
+ allow(Aws).to receive(:config).and_return({})
19
+ end
20
+
21
+ after(:each) do
22
+ # to silence warnings about Svc getting redefined each pass
23
+ Aws.send(:remove_const, :Svc)
24
+ end
25
+
26
+ it 'does not interfere with plugins and their defaults' do
27
+ expect(Aws.svc.config.property).to eq('plugin-default')
28
+ end
29
+
30
+ it 'gives priority to Aws.config over plugin defaults' do
31
+ Aws.config[:property] = 'aws-default'
32
+ expect(Aws.svc.config.property).to eq('aws-default')
33
+ end
34
+
35
+ it 'gives priority to Aws.config[:svc] over Aws.config' do
36
+ Aws.config[:property] = 'aws-default'
37
+ Aws.config[:svc] = { property: 'svc-default' }
38
+ expect(Aws.svc.config.property).to eq('svc-default')
39
+ end
40
+
41
+ it 'gives priority to constructor options over Aws.config' do
42
+ Aws.config[:property] = 'aws-default'
43
+ Aws.config[:svc] = { property: 'svc-default' }
44
+ expect(Aws.svc(property: 'arg').config.property).to eq('arg')
45
+ end
46
+
47
+ it 'ignores configuration for others services in Aws.config' do
48
+ Aws.config[:property] = 'aws-default'
49
+ Aws.config[:svc] = { property: 'svc-default' }
50
+ Aws.config[:s3] = { property: 's3-default' }
51
+ expect(Aws.svc.config.property).to eq('svc-default')
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ module Aws
4
+ module Plugins
5
+ describe RegionalEndpoint do
6
+
7
+ let(:env) { {} }
8
+
9
+ let(:client_class) {
10
+ Seahorse::Client.define(plugins: [RegionalEndpoint])
11
+ }
12
+
13
+ before do
14
+ stub_const("ENV", env)
15
+ end
16
+
17
+ describe 'region option' do
18
+
19
+ it 'adds a :region configuration option' do
20
+ expect(client_class.new(region: 'region').config.region).to eq('region')
21
+ end
22
+
23
+ it 'defaults to ENV["AWS_REGION"]' do
24
+ env['AWS_REGION'] = 'env-region'
25
+ expect(client_class.new.config.region).to eq('env-region')
26
+ end
27
+
28
+ it 'falls back to ENV["AMAZON_REGION"]' do
29
+ env['AMAZON_REGION'] = 'region-fallback'
30
+ expect(client_class.new.config.region).to eq('region-fallback')
31
+ end
32
+
33
+ it 'prefers AWS_REGION to AMAZON_REGION' do
34
+ env['AWS_REGION'] = 'aws-region'
35
+ env['AMAZON_REGION'] = 'amazon-region'
36
+ expect(client_class.new.config.region).to eq('aws-region')
37
+ end
38
+
39
+ it 'can be set directly, overriding the ENV["AWS_REGION"]' do
40
+ env['AWS_REGION'] = 'env-region'
41
+ expect(client_class.new(region:'cfg').config.region).to eq('cfg')
42
+ end
43
+
44
+ it 'raises an argument error when not set' do
45
+ client = Seahorse::Client.define
46
+ client.add_plugin(RegionalEndpoint)
47
+ expect { client.new }.to raise_error(Errors::MissingRegionError)
48
+ end
49
+
50
+ it 'raises an argument error when set to nil' do
51
+ client = Seahorse::Client.define
52
+ client.add_plugin(RegionalEndpoint)
53
+ expect { client.new(region:nil) }.to raise_error(Errors::MissingRegionError)
54
+ end
55
+
56
+ end
57
+
58
+ describe 'endpoint option' do
59
+
60
+ it 'defaults the endpoint to PREFIX.REGION.amazonaws.com' do
61
+ client_class.api.metadata['endpoint_prefix'] = 'PREFIX'
62
+ client = client_class.new(region: 'REGION')
63
+ expect(client.config.endpoint).to eq('PREFIX.REGION.amazonaws.com')
64
+ end
65
+
66
+ it 'uses the endpoint defined in metadata if present' do
67
+ client_class.api.metadata['regional_endpoints'] = {
68
+ 'region-name' => 'ENDPOINT'
69
+ }
70
+ client = client_class.new(region: 'region-name')
71
+ expect(client.config.endpoint).to eq('ENDPOINT')
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,253 @@
1
+ require 'spec_helper'
2
+
3
+ module Aws
4
+ module Plugins
5
+ describe RetryErrors do
6
+
7
+ it 'defaults config.retry_limit to 3' do
8
+ config = Seahorse::Client::Configuration.new
9
+ RetryErrors.new.add_options(config)
10
+ config = config.build!
11
+ expect(config.retry_limit).to eq(3)
12
+ end
13
+
14
+ describe 'ErrorInspector' do
15
+
16
+ def inspector(error, http_status_code = 404)
17
+ RetryErrors::ErrorInspector.new(error, http_status_code)
18
+ end
19
+
20
+ describe '#expired_credentials?' do
21
+
22
+ it 'returns true if the error code is InvalidClientTokenId' do
23
+ error = IAM::Errors::InvalidClientTokenId.new
24
+ expect(inspector(error).expired_credentials?).to be(true)
25
+ end
26
+
27
+ it 'returns true if the error code is UnrecognizedClientException' do
28
+ error = SWF::Errors::UnrecognizedClientException.new
29
+ expect(inspector(error).expired_credentials?).to be(true)
30
+ end
31
+
32
+ it 'returns true if the error code is InvalidAccessKeyId' do
33
+ error = S3::Errors::InvalidAccessKeyId.new
34
+ expect(inspector(error).expired_credentials?).to be(true)
35
+ end
36
+
37
+ it 'returns true if the error code is AuthFailure' do
38
+ error = EC2::Errors::AuthFailure.new
39
+ expect(inspector(error).expired_credentials?).to be(true)
40
+ end
41
+
42
+ it 'returns true if the error code matches /expired/' do
43
+ error = IAM::Errors::SomethingExpiredError.new
44
+ expect(inspector(error).expired_credentials?).to be(true)
45
+ end
46
+
47
+ it 'returns false for other errors' do
48
+ error = IAM::Errors::SomeRandomError.new
49
+ expect(inspector(error).expired_credentials?).to be(false)
50
+ end
51
+
52
+ end
53
+
54
+ describe '#throttling_error?' do
55
+
56
+ it 'returns true for Throttling' do
57
+ error = IAM::Errors::Throttling.new
58
+ expect(inspector(error).throttling_error?).to be(true)
59
+ end
60
+
61
+ it 'returns true for ThrottlingException' do
62
+ error = SWF::Errors::ThrottlingException.new
63
+ expect(inspector(error).throttling_error?).to be(true)
64
+ end
65
+
66
+ it 'returns true for RequestThrottled' do
67
+ error = SQS::Errors::RequestThrottled.new
68
+ expect(inspector(error).throttling_error?).to be(true)
69
+ end
70
+
71
+ it 'returns true for ProvisionedThroughputExceededException' do
72
+ error = DynamoDB::Errors::ProvisionedThroughputExceededException.new
73
+ expect(inspector(error).throttling_error?).to be(true)
74
+ end
75
+
76
+ it 'returns true for RequestLimitExceeded' do
77
+ error = EC2::Errors::RequestLimitExceeded.new
78
+ expect(inspector(error).throttling_error?).to be(true)
79
+ end
80
+
81
+ it 'returns true for BandwidthLimitExceeded' do
82
+ error = CloudSearch::Errors::BandwidthLimitExceeded.new
83
+ expect(inspector(error).throttling_error?).to be(true)
84
+ end
85
+
86
+ it 'returns true for error codes that match /throttl/' do
87
+ error = IAM::Errors::Throttled.new
88
+ expect(inspector(error).throttling_error?).to be(true)
89
+ end
90
+
91
+ it 'returns false for other errors' do
92
+ error = IAM::Errors::SomeRandomError.new
93
+ expect(inspector(error).throttling_error?).to be(false)
94
+ end
95
+
96
+ end
97
+
98
+ describe '#checksum?' do
99
+
100
+ it 'returns true if the error extends Errors::ChecksumError' do
101
+ error = Errors::ChecksumError.new
102
+ expect(inspector(error).checksum?).to be(true)
103
+ end
104
+
105
+ it 'returns true if the error is a crc32 error' do
106
+ error = DynamoDB::Errors::CRC32CheckFailed.new
107
+ expect(inspector(error).checksum?).to be(true)
108
+ end
109
+
110
+ it 'returns false if the error does not exend ChecksumError' do
111
+ error = double('error')
112
+ expect(inspector(error).checksum?).to be(false)
113
+ end
114
+
115
+ end
116
+
117
+ describe '#server?' do
118
+
119
+ it 'returns true if the error is a 500 level error' do
120
+ error = EC2::Errors::RandomError.new
121
+ expect(inspector(error, 500).server?).to be(true)
122
+ end
123
+
124
+ it 'returns false if the error is not a 500 level error' do
125
+ error = EC2::Errors::RandomError.new
126
+ expect(inspector(error, 404).server?).to be(false)
127
+ end
128
+
129
+ end
130
+
131
+ describe '#networking?' do
132
+
133
+ it 'returns true if the error code is RequestTimeout' do
134
+ error = S3::Errors::RequestTimeout.new
135
+ expect(inspector(error).networking?).to be(true)
136
+ end
137
+
138
+ it 'returns true if the http status code is 0' do
139
+ error = double('error')
140
+ expect(inspector(error, 0).networking?).to be(true)
141
+ end
142
+
143
+ it 'returns false if the http status code is not 0' do
144
+ error = double('error')
145
+ expect(inspector(error, 307).networking?).to be(false)
146
+ end
147
+
148
+ end
149
+ end
150
+
151
+ describe 'Handler' do
152
+
153
+ let(:credentials) { Credentials.new }
154
+
155
+ let(:config) {
156
+ cfg = Seahorse::Client::Configuration.new
157
+ cfg.add_option(:credentials, credentials)
158
+ RetryErrors.new.add_options(cfg)
159
+ cfg.build!
160
+ }
161
+
162
+ let(:resp) { Seahorse::Client::Response.new }
163
+
164
+ let(:handler) { RetryErrors::Handler.new }
165
+
166
+ before(:each) do
167
+ resp.context.config = config
168
+ resp.context.http_response.status_code = 400
169
+ end
170
+
171
+ def handle(send_handler = nil, &block)
172
+ allow(Kernel).to receive(:sleep)
173
+ handler.handler = send_handler || block
174
+ handler.call(resp.context)
175
+ end
176
+
177
+ it 'does not retry responses that have no error' do
178
+ resp.error = nil
179
+ send_handler = double('send-handler')
180
+ expect(send_handler).to receive(:call).once.and_return(resp)
181
+ handle(send_handler)
182
+ end
183
+
184
+ it 'reties 3 times for a total of 4 attemps' do
185
+ resp.error = EC2::Errors::RequestLimitExceeded.new
186
+ send_handler = double('send-handler')
187
+ expect(send_handler).to receive(:call).
188
+ exactly(4).times.
189
+ with(resp.context).
190
+ and_return(resp)
191
+ handle(send_handler)
192
+ end
193
+
194
+ it 'backs off exponentially between each retry attempt' do
195
+ expect(Kernel).to receive(:sleep).with(0.3).ordered
196
+ expect(Kernel).to receive(:sleep).with(0.6).ordered
197
+ expect(Kernel).to receive(:sleep).with(1.2).ordered
198
+ resp.error = EC2::Errors::RequestLimitExceeded.new
199
+ handle { |context| resp }
200
+ end
201
+
202
+ it 'increments the retry count on the context' do
203
+ resp.error = EC2::Errors::RequestLimitExceeded.new
204
+ handle { |context| resp }
205
+ expect(resp.context.retries).to eq(3)
206
+ end
207
+
208
+ it 'rewinds the request body before each retry attempt' do
209
+ body = resp.context.http_request.body
210
+ expect(body).to receive(:rewind).exactly(3).times
211
+ resp.error = EC2::Errors::RequestLimitExceeded.new
212
+ handle { |context| resp }
213
+ end
214
+
215
+ it 'truncates the response body before each retry attempt' do
216
+ body = double('truncatable-body', pos: 100, truncate: 0)
217
+ resp.context.http_response.body = body
218
+ expect(body).to receive(:truncate).with(0).exactly(3).times
219
+ resp.error = EC2::Errors::RequestLimitExceeded.new
220
+ handle { |context| resp }
221
+ end
222
+
223
+ it 'skips retry if un-truncatable response body has received data' do
224
+ resp.context.http_response.body = double('write-once-body', pos: 100)
225
+ resp.error = EC2::Errors::RequestLimitExceeded.new
226
+ handle { |context| resp }
227
+ expect(resp.context.retries).to eq(0)
228
+ end
229
+
230
+ it 'retries if creds expire and are refreshable' do
231
+ expect(credentials).to receive(:refresh!).exactly(3).times
232
+ resp.error = EC2::Errors::AuthFailure.new
233
+ handle { |context| resp }
234
+ expect(resp.context.retries).to eq(3)
235
+ end
236
+
237
+ it 'skips retry if creds expire and are not refreshable' do
238
+ resp.error = EC2::Errors::AuthFailure.new
239
+ handle { |context| resp }
240
+ expect(resp.context.retries).to eq(0)
241
+ end
242
+
243
+ it 'retries 500 level errors' do
244
+ resp.context.http_response.status_code = 500
245
+ resp.error = RuntimeError.new('random-runtime-error')
246
+ handle { |context| resp }
247
+ expect(resp.context.retries).to eq(3)
248
+ end
249
+
250
+ end
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,361 @@
1
+ require 'spec_helper'
2
+
3
+ module Aws
4
+ module Query
5
+ describe Builder do
6
+
7
+ let(:rules) {{
8
+ 'type' => 'input',
9
+ 'members' => {}
10
+ }}
11
+
12
+ def query_params(params = {})
13
+ shape = Seahorse::Model::Shapes::Shape.from_hash(rules)
14
+ Builder.to_query_params(shape, params).map do |param|
15
+ [param.name, param.value]
16
+ end
17
+ end
18
+
19
+ describe '#to_query_params' do
20
+
21
+ it 'returns a param list' do
22
+ list = Builder.to_query_params(rules, {})
23
+ expect(list).to be_kind_of(ParamList)
24
+ end
25
+
26
+ describe 'structures' do
27
+
28
+ it 'returns an empty list when there are no members' do
29
+ expect(query_params).to be_empty
30
+ end
31
+
32
+ it 'returns an empty list when there are no params' do
33
+ rules['members'] = { 'name' => { 'type' => 'string' } }
34
+ expect(query_params({})).to be_empty
35
+ end
36
+
37
+ it 'serializes params by name' do
38
+ rules['members'] = {
39
+ 'name' => { 'type' => 'string' },
40
+ 'age' => { 'type' => 'integer' }
41
+ }
42
+ expect(query_params(name: 'John', age: 40)).to eq([
43
+ ['age', '40'],
44
+ ['name', 'John'],
45
+ ])
46
+ end
47
+
48
+ it 'observes serialized name properties' do
49
+ rules['members'] = {
50
+ 'name' => { 'type' => 'string', 'serialized_name' => 'NAME' },
51
+ 'age' => { 'type' => 'integer', 'serialized_name' => 'AGE' }
52
+ }
53
+ expect(query_params(name: 'John', age: 40)).to eq([
54
+ ['AGE', '40'],
55
+ ['NAME', 'John'],
56
+ ])
57
+ end
58
+
59
+ it 'serializes nested params' do
60
+ rules['members'] = {
61
+ 'name' => { 'type' => 'string' },
62
+ 'config' => {
63
+ 'type' => 'structure',
64
+ 'members' => { 'enabled' => { 'type' => 'boolean' }
65
+ }
66
+ }
67
+ }
68
+ params = { name: 'John', config: { enabled: true } }
69
+ expect(query_params(params)).to eq([
70
+ ['config.enabled', 'true'],
71
+ ['name', 'John'],
72
+ ])
73
+ end
74
+
75
+ end
76
+
77
+ describe 'flattened lists' do
78
+
79
+ it 'numbers list members starting at 1' do
80
+ rules['members'] = {
81
+ 'items' => {
82
+ 'type' => 'flat_list',
83
+ 'members' => { 'type' => 'string' }
84
+ }
85
+ }
86
+ expect(query_params(items: %w(abc mno xyz))).to eq([
87
+ ['items.1', 'abc'],
88
+ ['items.2', 'mno'],
89
+ ['items.3', 'xyz'],
90
+ ])
91
+ end
92
+
93
+ it 'uses the list member serialized name as the param name' do
94
+ rules['members'] = {
95
+ 'config' => {
96
+ 'type' => 'structure',
97
+ 'members' => {
98
+ 'items' => {
99
+ 'type' => 'flat_list',
100
+ 'members' => {
101
+ 'type' => 'string',
102
+ 'serialized_name' => 'Item'
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ params = { config: { items: %w(abc mno xyz) } }
109
+ expect(query_params(params)).to eq([
110
+ ['config.Item.1', 'abc'],
111
+ ['config.Item.2', 'mno'],
112
+ ['config.Item.3', 'xyz'],
113
+ ])
114
+ end
115
+
116
+ it 'supports lists of complex types' do
117
+ rules['members'] = {
118
+ 'people' => {
119
+ 'type' => 'flat_list',
120
+ 'members' => {
121
+ 'type' => 'structure',
122
+ 'members' => {
123
+ 'name' => { 'type' => 'string' }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ params = { people: [ { name: 'John' }, { name: 'Jane' } ] }
129
+ expect(query_params(params)).to eq([
130
+ ['people.1.name', 'John'],
131
+ ['people.2.name', 'Jane'],
132
+ ])
133
+ end
134
+
135
+ end
136
+
137
+ describe 'non-flattened lists' do
138
+
139
+ it 'numbers list members starting at 1' do
140
+ rules['members'] = {
141
+ 'items' => {
142
+ 'type' => 'list',
143
+ 'members' => { 'type' => 'string' }
144
+ }
145
+ }
146
+ expect(query_params(items: %w(abc mno xyz))).to eq([
147
+ ['items.member.1', 'abc'],
148
+ ['items.member.2', 'mno'],
149
+ ['items.member.3', 'xyz'],
150
+ ])
151
+ end
152
+
153
+ it 'ignores the list member name' do
154
+ rules['members'] = {
155
+ 'config' => {
156
+ 'type' => 'structure',
157
+ 'members' => {
158
+ 'items' => {
159
+ 'type' => 'list',
160
+ 'members' => {
161
+ 'type' => 'string',
162
+ 'serialized_name' => 'Item' # has no effect
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ params = { config: { items: %w(abc mno xyz) } }
169
+ expect(query_params(params)).to eq([
170
+ ['config.items.member.1', 'abc'],
171
+ ['config.items.member.2', 'mno'],
172
+ ['config.items.member.3', 'xyz'],
173
+ ])
174
+ end
175
+
176
+ it 'supports lists of complex types' do
177
+ rules['members'] = {
178
+ 'people' => {
179
+ 'type' => 'list',
180
+ 'members' => {
181
+ 'type' => 'structure',
182
+ 'members' => {
183
+ 'name' => { 'type' => 'string' }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ params = { people: [ { name: 'John' }, { name: 'Jane' } ] }
189
+ expect(query_params(params)).to eq([
190
+ ['people.member.1.name', 'John'],
191
+ ['people.member.2.name', 'Jane'],
192
+ ])
193
+ end
194
+
195
+ end
196
+
197
+ describe 'flattened maps' do
198
+
199
+ it 'serializes hashes with keys and values' do
200
+ rules['members'] = {
201
+ 'attributes' => {
202
+ 'type' => 'flat_map',
203
+ 'keys' => { 'type' => 'string' },
204
+ 'members' => { 'type' => 'string' }
205
+ }
206
+ }
207
+ params = { attributes: { 'Size' => 'large', 'Color' => 'red' } }
208
+ expect(query_params(params)).to eq([
209
+ ['attributes.1.key', 'Size'],
210
+ ['attributes.1.value', 'large'],
211
+ ['attributes.2.key', 'Color'],
212
+ ['attributes.2.value', 'red'],
213
+ ])
214
+ end
215
+
216
+ it 'serializes hashes with keys and values' do
217
+ rules['members'] = {
218
+ 'attributes' => {
219
+ 'type' => 'flat_map',
220
+ 'keys' => { 'type' => 'string', 'serialized_name' => 'K' },
221
+ 'members' => { 'type' => 'string', 'serialized_name' => 'V' }
222
+ }
223
+ }
224
+ params = { attributes: { 'Size' => 'large', 'Color' => 'red' } }
225
+ expect(query_params(params)).to eq([
226
+ ['attributes.1.K', 'Size'],
227
+ ['attributes.1.V', 'large'],
228
+ ['attributes.2.K', 'Color'],
229
+ ['attributes.2.V', 'red'],
230
+ ])
231
+ end
232
+
233
+ end
234
+
235
+ describe 'non-flattened maps' do
236
+
237
+ it 'serializes hashes with keys and values' do
238
+ rules['members'] = {
239
+ 'attributes' => {
240
+ 'type' => 'map',
241
+ 'keys' => { 'type' => 'string' },
242
+ 'members' => { 'type' => 'string' }
243
+ }
244
+ }
245
+ params = { attributes: { 'Size' => 'large', 'Color' => 'red' } }
246
+ expect(query_params(params)).to eq([
247
+ ['attributes.entry.1.key', 'Size'],
248
+ ['attributes.entry.1.value', 'large'],
249
+ ['attributes.entry.2.key', 'Color'],
250
+ ['attributes.entry.2.value', 'red'],
251
+ ])
252
+ end
253
+
254
+ it 'serializes hashes with keys and values' do
255
+ rules['members'] = {
256
+ 'attributes' => {
257
+ 'type' => 'map',
258
+ 'keys' => { 'type' => 'string', 'serialized_name' => 'K' },
259
+ 'members' => { 'type' => 'string', 'serialized_name' => 'V' }
260
+ }
261
+ }
262
+ params = { attributes: { 'Size' => 'large', 'Color' => 'red' } }
263
+ expect(query_params(params)).to eq([
264
+ ['attributes.entry.1.K', 'Size'],
265
+ ['attributes.entry.1.V', 'large'],
266
+ ['attributes.entry.2.K', 'Color'],
267
+ ['attributes.entry.2.V', 'red'],
268
+ ])
269
+ end
270
+
271
+ end
272
+
273
+ describe 'scalars' do
274
+
275
+ it 'serializes integers' do
276
+ rules['members'] = {
277
+ 'count' => { 'type' => 'integer' }
278
+ }
279
+ expect(query_params(count: 123)).to eq([
280
+ ['count', '123'],
281
+ ])
282
+ end
283
+
284
+ it 'serializes floats' do
285
+ rules['members'] = {
286
+ 'price' => { 'type' => 'float' }
287
+ }
288
+ expect(query_params(price: 12.34)).to eq([
289
+ ['price', '12.34'],
290
+ ])
291
+ end
292
+
293
+ it 'serializes booleans' do
294
+ rules['members'] = {
295
+ 'hot' => { 'type' => 'boolean' },
296
+ 'cold' => { 'type' => 'boolean' }
297
+ }
298
+ expect(query_params(hot:true, cold:false)).to eq([
299
+ ['cold', 'false'],
300
+ ['hot', 'true'],
301
+ ])
302
+ end
303
+
304
+ it 'serializes is8601 timestamps' do
305
+ now = Time.now
306
+ rules['members'] = {
307
+ 'when' => { 'type' => 'iso8601_timestamp' }
308
+ }
309
+ expect(query_params(when:now)).to eq([
310
+ ['when', now.utc.iso8601]
311
+ ])
312
+ end
313
+
314
+ it 'can serializes timestamps as rfc8622 strings' do
315
+ now = Time.now
316
+ rules['members'] = {
317
+ 'when' => {
318
+ 'type' => 'rfc822_timestamp'
319
+ }
320
+ }
321
+ expect(query_params(when:now)).to eq([
322
+ ['when', now.utc.rfc822]
323
+ ])
324
+ end
325
+
326
+ it 'can serializes timestamps as unix timestamps' do
327
+ now = Time.now
328
+ rules['members'] = {
329
+ 'when' => {
330
+ 'type' => 'unix_timestamp'
331
+ }
332
+ }
333
+ expect(query_params(when:now)).to eq([
334
+ ['when', now.to_i.to_s]
335
+ ])
336
+ end
337
+
338
+ it 'raises an error when the timestamp format is not specified' do
339
+ now = Time.now
340
+ rules['members'] = {
341
+ 'when' => {
342
+ 'type' => 'timestamp',
343
+ }
344
+ }
345
+ expect { query_params(when:now) }.to raise_error(/invalid timestamp/)
346
+ end
347
+
348
+ it 'serializes blobs as base64 strings' do
349
+ rules['members'] = {
350
+ 'data' => { 'type' => 'blob' }
351
+ }
352
+ expect(query_params(data:'hello')).to eq([
353
+ ['data', 'aGVsbG8=']
354
+ ])
355
+ end
356
+
357
+ end
358
+ end
359
+ end
360
+ end
361
+ end