aws-sdk-v1 1.52.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 (560) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +7 -0
  3. data/LICENSE.txt +12 -0
  4. data/README.md +337 -0
  5. data/bin/aws-rb +179 -0
  6. data/ca-bundle.crt +3554 -0
  7. data/endpoints.json +1671 -0
  8. data/lib/aws-sdk-v1.rb +2 -0
  9. data/lib/aws-sdk.rb +1 -0
  10. data/lib/aws.rb +14 -0
  11. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +1070 -0
  12. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +372 -0
  13. data/lib/aws/api_config/CloudFront-2013-05-12.yml +2448 -0
  14. data/lib/aws/api_config/CloudFront-2013-08-26.yml +2599 -0
  15. data/lib/aws/api_config/CloudFront-2013-09-27.yml +2765 -0
  16. data/lib/aws/api_config/CloudFront-2013-11-11.yml +2886 -0
  17. data/lib/aws/api_config/CloudFront-2013-11-22.yml +2918 -0
  18. data/lib/aws/api_config/CloudFront-2014-01-31.yml +2934 -0
  19. data/lib/aws/api_config/CloudFront-2014-05-31.yml +3100 -0
  20. data/lib/aws/api_config/CloudSearch-2011-02-01.yml +681 -0
  21. data/lib/aws/api_config/CloudSearch-2013-01-01.yml +1164 -0
  22. data/lib/aws/api_config/CloudTrail-2013-11-01.yml +130 -0
  23. data/lib/aws/api_config/CloudWatch-2010-08-01.yml +433 -0
  24. data/lib/aws/api_config/DataPipeline-2012-10-29.yml +422 -0
  25. data/lib/aws/api_config/DirectConnect-2012-10-25.yml +735 -0
  26. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +1168 -0
  27. data/lib/aws/api_config/DynamoDB-2012-08-10.yml +2105 -0
  28. data/lib/aws/api_config/EC2-2013-08-15.yml +4708 -0
  29. data/lib/aws/api_config/EC2-2013-10-01.yml +4726 -0
  30. data/lib/aws/api_config/EC2-2013-10-15.yml +4651 -0
  31. data/lib/aws/api_config/EC2-2014-02-01.yml +4755 -0
  32. data/lib/aws/api_config/EC2-2014-05-01.yml +4812 -0
  33. data/lib/aws/api_config/ELB-2012-06-01.yml +766 -0
  34. data/lib/aws/api_config/EMR-2009-03-31.yml +972 -0
  35. data/lib/aws/api_config/ElastiCache-2013-06-15.yml +1188 -0
  36. data/lib/aws/api_config/ElastiCache-2014-03-24.yml +1375 -0
  37. data/lib/aws/api_config/ElastiCache-2014-07-15.yml +1385 -0
  38. data/lib/aws/api_config/ElasticBeanstalk-2010-12-01.yml +854 -0
  39. data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +3082 -0
  40. data/lib/aws/api_config/Glacier-2012-06-01.yml +649 -0
  41. data/lib/aws/api_config/IAM-2010-05-08.yml +1339 -0
  42. data/lib/aws/api_config/ImportExport-2010-06-01.yml +109 -0
  43. data/lib/aws/api_config/Kinesis-2013-12-02.yml +201 -0
  44. data/lib/aws/api_config/OpsWorks-2013-02-18.yml +2025 -0
  45. data/lib/aws/api_config/RDS-2013-05-15.yml +2464 -0
  46. data/lib/aws/api_config/RDS-2013-09-09.yml +2640 -0
  47. data/lib/aws/api_config/Redshift-2012-12-01.yml +2161 -0
  48. data/lib/aws/api_config/Route53-2012-12-12.yml +547 -0
  49. data/lib/aws/api_config/Route53-2013-04-01.yml +889 -0
  50. data/lib/aws/api_config/SNS-2010-03-31.yml +448 -0
  51. data/lib/aws/api_config/SQS-2012-11-05.yml +404 -0
  52. data/lib/aws/api_config/STS-2011-06-15.yml +151 -0
  53. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +306 -0
  54. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +346 -0
  55. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +2388 -0
  56. data/lib/aws/api_config/StorageGateway-2012-06-30.yml +748 -0
  57. data/lib/aws/api_config/StorageGateway-2013-06-30.yml +1025 -0
  58. data/lib/aws/api_config/Support-2013-04-15.yml +489 -0
  59. data/lib/aws/auto_scaling.rb +163 -0
  60. data/lib/aws/auto_scaling/activity.rb +102 -0
  61. data/lib/aws/auto_scaling/activity_collection.rb +81 -0
  62. data/lib/aws/auto_scaling/client.rb +48 -0
  63. data/lib/aws/auto_scaling/config.rb +18 -0
  64. data/lib/aws/auto_scaling/errors.rb +22 -0
  65. data/lib/aws/auto_scaling/group.rb +421 -0
  66. data/lib/aws/auto_scaling/group_collection.rb +96 -0
  67. data/lib/aws/auto_scaling/group_options.rb +155 -0
  68. data/lib/aws/auto_scaling/instance.rb +192 -0
  69. data/lib/aws/auto_scaling/instance_collection.rb +63 -0
  70. data/lib/aws/auto_scaling/launch_configuration.rb +162 -0
  71. data/lib/aws/auto_scaling/launch_configuration_collection.rb +160 -0
  72. data/lib/aws/auto_scaling/notification_configuration.rb +89 -0
  73. data/lib/aws/auto_scaling/notification_configuration_collection.rb +183 -0
  74. data/lib/aws/auto_scaling/scaling_policy.rb +142 -0
  75. data/lib/aws/auto_scaling/scaling_policy_collection.rb +72 -0
  76. data/lib/aws/auto_scaling/scaling_policy_options.rb +65 -0
  77. data/lib/aws/auto_scaling/scheduled_action.rb +141 -0
  78. data/lib/aws/auto_scaling/scheduled_action_collection.rb +202 -0
  79. data/lib/aws/auto_scaling/tag.rb +59 -0
  80. data/lib/aws/auto_scaling/tag_collection.rb +114 -0
  81. data/lib/aws/cloud_formation.rb +272 -0
  82. data/lib/aws/cloud_formation/client.rb +48 -0
  83. data/lib/aws/cloud_formation/config.rb +18 -0
  84. data/lib/aws/cloud_formation/errors.rb +22 -0
  85. data/lib/aws/cloud_formation/stack.rb +266 -0
  86. data/lib/aws/cloud_formation/stack_collection.rb +232 -0
  87. data/lib/aws/cloud_formation/stack_event.rb +73 -0
  88. data/lib/aws/cloud_formation/stack_event_collection.rb +47 -0
  89. data/lib/aws/cloud_formation/stack_options.rb +72 -0
  90. data/lib/aws/cloud_formation/stack_output.rb +53 -0
  91. data/lib/aws/cloud_formation/stack_resource.rb +117 -0
  92. data/lib/aws/cloud_formation/stack_resource_collection.rb +83 -0
  93. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +64 -0
  94. data/lib/aws/cloud_formation/stack_summary_collection.rb +123 -0
  95. data/lib/aws/cloud_front.rb +72 -0
  96. data/lib/aws/cloud_front/client.rb +57 -0
  97. data/lib/aws/cloud_front/config.rb +18 -0
  98. data/lib/aws/cloud_front/errors.rb +22 -0
  99. data/lib/aws/cloud_search.rb +73 -0
  100. data/lib/aws/cloud_search/client.rb +40 -0
  101. data/lib/aws/cloud_search/config.rb +18 -0
  102. data/lib/aws/cloud_search/errors.rb +22 -0
  103. data/lib/aws/cloud_trail.rb +72 -0
  104. data/lib/aws/cloud_trail/client.rb +35 -0
  105. data/lib/aws/cloud_trail/config.rb +18 -0
  106. data/lib/aws/cloud_trail/errors.rb +22 -0
  107. data/lib/aws/cloud_watch.rb +118 -0
  108. data/lib/aws/cloud_watch/alarm.rb +293 -0
  109. data/lib/aws/cloud_watch/alarm_collection.rb +153 -0
  110. data/lib/aws/cloud_watch/alarm_history_item.rb +50 -0
  111. data/lib/aws/cloud_watch/alarm_history_item_collection.rb +84 -0
  112. data/lib/aws/cloud_watch/client.rb +40 -0
  113. data/lib/aws/cloud_watch/config.rb +18 -0
  114. data/lib/aws/cloud_watch/errors.rb +22 -0
  115. data/lib/aws/cloud_watch/metric.rb +135 -0
  116. data/lib/aws/cloud_watch/metric_alarm_collection.rb +160 -0
  117. data/lib/aws/cloud_watch/metric_collection.rb +129 -0
  118. data/lib/aws/cloud_watch/metric_statistics.rb +69 -0
  119. data/lib/aws/core.rb +716 -0
  120. data/lib/aws/core/async_handle.rb +90 -0
  121. data/lib/aws/core/cacheable.rb +77 -0
  122. data/lib/aws/core/client.rb +787 -0
  123. data/lib/aws/core/collection.rb +263 -0
  124. data/lib/aws/core/collection/simple.rb +82 -0
  125. data/lib/aws/core/collection/with_limit_and_next_token.rb +71 -0
  126. data/lib/aws/core/collection/with_next_token.rb +97 -0
  127. data/lib/aws/core/configuration.rb +542 -0
  128. data/lib/aws/core/credential_providers.rb +639 -0
  129. data/lib/aws/core/data.rb +247 -0
  130. data/lib/aws/core/deprecations.rb +84 -0
  131. data/lib/aws/core/endpoints.rb +37 -0
  132. data/lib/aws/core/http/connection_pool.rb +369 -0
  133. data/lib/aws/core/http/curb_handler.rb +148 -0
  134. data/lib/aws/core/http/handler.rb +89 -0
  135. data/lib/aws/core/http/net_http_handler.rb +144 -0
  136. data/lib/aws/core/http/patch.rb +102 -0
  137. data/lib/aws/core/http/request.rb +259 -0
  138. data/lib/aws/core/http/response.rb +81 -0
  139. data/lib/aws/core/indifferent_hash.rb +88 -0
  140. data/lib/aws/core/inflection.rb +56 -0
  141. data/lib/aws/core/ini_parser.rb +42 -0
  142. data/lib/aws/core/json_client.rb +47 -0
  143. data/lib/aws/core/json_parser.rb +76 -0
  144. data/lib/aws/core/json_request_builder.rb +35 -0
  145. data/lib/aws/core/json_response_parser.rb +79 -0
  146. data/lib/aws/core/lazy_error_classes.rb +108 -0
  147. data/lib/aws/core/log_formatter.rb +428 -0
  148. data/lib/aws/core/managed_file.rb +32 -0
  149. data/lib/aws/core/meta_utils.rb +45 -0
  150. data/lib/aws/core/model.rb +62 -0
  151. data/lib/aws/core/naming.rb +30 -0
  152. data/lib/aws/core/option_grammar.rb +738 -0
  153. data/lib/aws/core/options/json_serializer.rb +82 -0
  154. data/lib/aws/core/options/validator.rb +155 -0
  155. data/lib/aws/core/options/xml_serializer.rb +118 -0
  156. data/lib/aws/core/page_result.rb +75 -0
  157. data/lib/aws/core/policy.rb +941 -0
  158. data/lib/aws/core/query_client.rb +41 -0
  159. data/lib/aws/core/query_error_parser.rb +24 -0
  160. data/lib/aws/core/query_request_builder.rb +47 -0
  161. data/lib/aws/core/query_response_parser.rb +35 -0
  162. data/lib/aws/core/region.rb +85 -0
  163. data/lib/aws/core/region_collection.rb +80 -0
  164. data/lib/aws/core/resource.rb +413 -0
  165. data/lib/aws/core/resource_cache.rb +40 -0
  166. data/lib/aws/core/response.rb +215 -0
  167. data/lib/aws/core/response_cache.rb +50 -0
  168. data/lib/aws/core/rest_error_parser.rb +24 -0
  169. data/lib/aws/core/rest_json_client.rb +40 -0
  170. data/lib/aws/core/rest_request_builder.rb +154 -0
  171. data/lib/aws/core/rest_response_parser.rb +66 -0
  172. data/lib/aws/core/rest_xml_client.rb +47 -0
  173. data/lib/aws/core/service_interface.rb +83 -0
  174. data/lib/aws/core/signers/base.rb +46 -0
  175. data/lib/aws/core/signers/cloud_front.rb +56 -0
  176. data/lib/aws/core/signers/s3.rb +159 -0
  177. data/lib/aws/core/signers/version_2.rb +72 -0
  178. data/lib/aws/core/signers/version_3.rb +86 -0
  179. data/lib/aws/core/signers/version_3_https.rb +61 -0
  180. data/lib/aws/core/signers/version_4.rb +228 -0
  181. data/lib/aws/core/signers/version_4/chunk_signed_stream.rb +191 -0
  182. data/lib/aws/core/uri_escape.rb +44 -0
  183. data/lib/aws/core/xml/frame.rb +245 -0
  184. data/lib/aws/core/xml/frame_stack.rb +85 -0
  185. data/lib/aws/core/xml/grammar.rb +307 -0
  186. data/lib/aws/core/xml/parser.rb +70 -0
  187. data/lib/aws/core/xml/root_frame.rb +65 -0
  188. data/lib/aws/core/xml/sax_handlers/libxml.rb +47 -0
  189. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +56 -0
  190. data/lib/aws/core/xml/sax_handlers/ox.rb +41 -0
  191. data/lib/aws/core/xml/sax_handlers/rexml.rb +47 -0
  192. data/lib/aws/core/xml/stub.rb +123 -0
  193. data/lib/aws/data_pipeline.rb +72 -0
  194. data/lib/aws/data_pipeline/client.rb +36 -0
  195. data/lib/aws/data_pipeline/config.rb +18 -0
  196. data/lib/aws/data_pipeline/errors.rb +20 -0
  197. data/lib/aws/direct_connect.rb +73 -0
  198. data/lib/aws/direct_connect/client.rb +36 -0
  199. data/lib/aws/direct_connect/config.rb +18 -0
  200. data/lib/aws/direct_connect/errors.rb +22 -0
  201. data/lib/aws/dynamo_db.rb +230 -0
  202. data/lib/aws/dynamo_db/attribute_collection.rb +456 -0
  203. data/lib/aws/dynamo_db/batch_get.rb +213 -0
  204. data/lib/aws/dynamo_db/batch_write.rb +254 -0
  205. data/lib/aws/dynamo_db/binary.rb +35 -0
  206. data/lib/aws/dynamo_db/client.rb +129 -0
  207. data/lib/aws/dynamo_db/client/v20111205.rb +1266 -0
  208. data/lib/aws/dynamo_db/client/v20120810.rb +1409 -0
  209. data/lib/aws/dynamo_db/client_v2.rb +44 -0
  210. data/lib/aws/dynamo_db/config.rb +24 -0
  211. data/lib/aws/dynamo_db/errors.rb +20 -0
  212. data/lib/aws/dynamo_db/expectations.rb +40 -0
  213. data/lib/aws/dynamo_db/item.rb +133 -0
  214. data/lib/aws/dynamo_db/item_collection.rb +856 -0
  215. data/lib/aws/dynamo_db/item_data.rb +31 -0
  216. data/lib/aws/dynamo_db/keys.rb +41 -0
  217. data/lib/aws/dynamo_db/primary_key_element.rb +48 -0
  218. data/lib/aws/dynamo_db/resource.rb +33 -0
  219. data/lib/aws/dynamo_db/table.rb +492 -0
  220. data/lib/aws/dynamo_db/table_collection.rb +165 -0
  221. data/lib/aws/dynamo_db/types.rb +111 -0
  222. data/lib/aws/ec2.rb +428 -0
  223. data/lib/aws/ec2/attachment.rb +135 -0
  224. data/lib/aws/ec2/attachment_collection.rb +54 -0
  225. data/lib/aws/ec2/availability_zone.rb +86 -0
  226. data/lib/aws/ec2/availability_zone_collection.rb +43 -0
  227. data/lib/aws/ec2/block_device_mappings.rb +53 -0
  228. data/lib/aws/ec2/client.rb +154 -0
  229. data/lib/aws/ec2/collection.rb +36 -0
  230. data/lib/aws/ec2/config.rb +21 -0
  231. data/lib/aws/ec2/customer_gateway.rb +90 -0
  232. data/lib/aws/ec2/customer_gateway_collection.rb +73 -0
  233. data/lib/aws/ec2/dhcp_options.rb +106 -0
  234. data/lib/aws/ec2/dhcp_options_collection.rb +87 -0
  235. data/lib/aws/ec2/elastic_ip.rb +209 -0
  236. data/lib/aws/ec2/elastic_ip_collection.rb +93 -0
  237. data/lib/aws/ec2/errors.rb +32 -0
  238. data/lib/aws/ec2/export_task.rb +120 -0
  239. data/lib/aws/ec2/export_task_collection.rb +67 -0
  240. data/lib/aws/ec2/filtered_collection.rb +87 -0
  241. data/lib/aws/ec2/has_permissions.rb +44 -0
  242. data/lib/aws/ec2/image.rb +270 -0
  243. data/lib/aws/ec2/image_collection.rb +219 -0
  244. data/lib/aws/ec2/instance.rb +803 -0
  245. data/lib/aws/ec2/instance_collection.rb +402 -0
  246. data/lib/aws/ec2/internet_gateway.rb +122 -0
  247. data/lib/aws/ec2/internet_gateway/attachment.rb +78 -0
  248. data/lib/aws/ec2/internet_gateway_collection.rb +54 -0
  249. data/lib/aws/ec2/key_pair.rb +82 -0
  250. data/lib/aws/ec2/key_pair_collection.rb +99 -0
  251. data/lib/aws/ec2/network_acl.rb +256 -0
  252. data/lib/aws/ec2/network_acl/association.rb +56 -0
  253. data/lib/aws/ec2/network_acl/entry.rb +147 -0
  254. data/lib/aws/ec2/network_acl_collection.rb +64 -0
  255. data/lib/aws/ec2/network_interface.rb +237 -0
  256. data/lib/aws/ec2/network_interface/attachment.rb +100 -0
  257. data/lib/aws/ec2/network_interface_collection.rb +103 -0
  258. data/lib/aws/ec2/permission_collection.rb +174 -0
  259. data/lib/aws/ec2/region.rb +106 -0
  260. data/lib/aws/ec2/region_collection.rb +51 -0
  261. data/lib/aws/ec2/reserved_instances.rb +57 -0
  262. data/lib/aws/ec2/reserved_instances_collection.rb +40 -0
  263. data/lib/aws/ec2/reserved_instances_offering.rb +60 -0
  264. data/lib/aws/ec2/reserved_instances_offering_collection.rb +45 -0
  265. data/lib/aws/ec2/resource.rb +161 -0
  266. data/lib/aws/ec2/resource_tag_collection.rb +211 -0
  267. data/lib/aws/ec2/route_table.rb +205 -0
  268. data/lib/aws/ec2/route_table/association.rb +119 -0
  269. data/lib/aws/ec2/route_table/route.rb +119 -0
  270. data/lib/aws/ec2/route_table_collection.rb +72 -0
  271. data/lib/aws/ec2/security_group.rb +482 -0
  272. data/lib/aws/ec2/security_group/ip_permission.rb +135 -0
  273. data/lib/aws/ec2/security_group/ip_permission_collection.rb +82 -0
  274. data/lib/aws/ec2/security_group_collection.rb +133 -0
  275. data/lib/aws/ec2/snapshot.rb +143 -0
  276. data/lib/aws/ec2/snapshot_collection.rb +131 -0
  277. data/lib/aws/ec2/subnet.rb +161 -0
  278. data/lib/aws/ec2/subnet_collection.rb +119 -0
  279. data/lib/aws/ec2/tag.rb +81 -0
  280. data/lib/aws/ec2/tag_collection.rb +107 -0
  281. data/lib/aws/ec2/tagged_collection.rb +67 -0
  282. data/lib/aws/ec2/tagged_item.rb +85 -0
  283. data/lib/aws/ec2/volume.rb +185 -0
  284. data/lib/aws/ec2/volume_collection.rb +102 -0
  285. data/lib/aws/ec2/vpc.rb +174 -0
  286. data/lib/aws/ec2/vpc_collection.rb +70 -0
  287. data/lib/aws/ec2/vpn_connection.rb +99 -0
  288. data/lib/aws/ec2/vpn_connection/telemetry.rb +49 -0
  289. data/lib/aws/ec2/vpn_connection_collection.rb +96 -0
  290. data/lib/aws/ec2/vpn_gateway.rb +123 -0
  291. data/lib/aws/ec2/vpn_gateway/attachment.rb +45 -0
  292. data/lib/aws/ec2/vpn_gateway_collection.rb +77 -0
  293. data/lib/aws/elastic_beanstalk.rb +49 -0
  294. data/lib/aws/elastic_beanstalk/client.rb +36 -0
  295. data/lib/aws/elastic_beanstalk/config.rb +18 -0
  296. data/lib/aws/elastic_beanstalk/errors.rb +22 -0
  297. data/lib/aws/elastic_transcoder.rb +29 -0
  298. data/lib/aws/elastic_transcoder/client.rb +48 -0
  299. data/lib/aws/elastic_transcoder/config.rb +18 -0
  300. data/lib/aws/elastic_transcoder/errors.rb +23 -0
  301. data/lib/aws/elasticache.rb +49 -0
  302. data/lib/aws/elasticache/client.rb +41 -0
  303. data/lib/aws/elasticache/config.rb +18 -0
  304. data/lib/aws/elasticache/errors.rb +22 -0
  305. data/lib/aws/elb.rb +66 -0
  306. data/lib/aws/elb/availability_zone_collection.rb +138 -0
  307. data/lib/aws/elb/backend_server_policy_collection.rb +139 -0
  308. data/lib/aws/elb/client.rb +35 -0
  309. data/lib/aws/elb/config.rb +18 -0
  310. data/lib/aws/elb/errors.rb +26 -0
  311. data/lib/aws/elb/instance_collection.rb +168 -0
  312. data/lib/aws/elb/listener.rb +190 -0
  313. data/lib/aws/elb/listener_collection.rb +113 -0
  314. data/lib/aws/elb/listener_opts.rb +45 -0
  315. data/lib/aws/elb/load_balancer.rb +280 -0
  316. data/lib/aws/elb/load_balancer_collection.rb +146 -0
  317. data/lib/aws/elb/load_balancer_policy.rb +93 -0
  318. data/lib/aws/elb/load_balancer_policy_collection.rb +208 -0
  319. data/lib/aws/emr.rb +87 -0
  320. data/lib/aws/emr/client.rb +35 -0
  321. data/lib/aws/emr/config.rb +18 -0
  322. data/lib/aws/emr/errors.rb +22 -0
  323. data/lib/aws/emr/instance_group.rb +138 -0
  324. data/lib/aws/emr/instance_group_collection.rb +82 -0
  325. data/lib/aws/emr/job_flow.rb +307 -0
  326. data/lib/aws/emr/job_flow_collection.rb +183 -0
  327. data/lib/aws/errors.rb +162 -0
  328. data/lib/aws/glacier.rb +79 -0
  329. data/lib/aws/glacier/archive.rb +56 -0
  330. data/lib/aws/glacier/archive_collection.rb +146 -0
  331. data/lib/aws/glacier/client.rb +49 -0
  332. data/lib/aws/glacier/config.rb +19 -0
  333. data/lib/aws/glacier/errors.rb +22 -0
  334. data/lib/aws/glacier/resource.rb +30 -0
  335. data/lib/aws/glacier/vault.rb +145 -0
  336. data/lib/aws/glacier/vault_collection.rb +75 -0
  337. data/lib/aws/glacier/vault_notification_configuration.rb +29 -0
  338. data/lib/aws/iam.rb +408 -0
  339. data/lib/aws/iam/access_key.rb +185 -0
  340. data/lib/aws/iam/access_key_collection.rb +128 -0
  341. data/lib/aws/iam/account_alias_collection.rb +79 -0
  342. data/lib/aws/iam/client.rb +49 -0
  343. data/lib/aws/iam/collection.rb +83 -0
  344. data/lib/aws/iam/config.rb +18 -0
  345. data/lib/aws/iam/errors.rb +22 -0
  346. data/lib/aws/iam/group.rb +111 -0
  347. data/lib/aws/iam/group_collection.rb +132 -0
  348. data/lib/aws/iam/group_policy_collection.rb +47 -0
  349. data/lib/aws/iam/group_user_collection.rb +84 -0
  350. data/lib/aws/iam/login_profile.rb +111 -0
  351. data/lib/aws/iam/mfa_device.rb +52 -0
  352. data/lib/aws/iam/mfa_device_collection.rb +127 -0
  353. data/lib/aws/iam/policy.rb +46 -0
  354. data/lib/aws/iam/policy_collection.rb +188 -0
  355. data/lib/aws/iam/resource.rb +62 -0
  356. data/lib/aws/iam/server_certificate.rb +148 -0
  357. data/lib/aws/iam/server_certificate_collection.rb +138 -0
  358. data/lib/aws/iam/signing_certificate.rb +186 -0
  359. data/lib/aws/iam/signing_certificate_collection.rb +131 -0
  360. data/lib/aws/iam/user.rb +200 -0
  361. data/lib/aws/iam/user_collection.rb +133 -0
  362. data/lib/aws/iam/user_group_collection.rb +98 -0
  363. data/lib/aws/iam/user_policy.rb +90 -0
  364. data/lib/aws/iam/user_policy_collection.rb +45 -0
  365. data/lib/aws/iam/virtual_mfa_device.rb +139 -0
  366. data/lib/aws/iam/virtual_mfa_device_collection.rb +73 -0
  367. data/lib/aws/import_export.rb +73 -0
  368. data/lib/aws/import_export/client.rb +35 -0
  369. data/lib/aws/import_export/config.rb +19 -0
  370. data/lib/aws/import_export/errors.rb +22 -0
  371. data/lib/aws/kinesis.rb +53 -0
  372. data/lib/aws/kinesis/client.rb +35 -0
  373. data/lib/aws/kinesis/config.rb +18 -0
  374. data/lib/aws/kinesis/errors.rb +20 -0
  375. data/lib/aws/ops_works.rb +29 -0
  376. data/lib/aws/ops_works/client.rb +35 -0
  377. data/lib/aws/ops_works/config.rb +18 -0
  378. data/lib/aws/ops_works/errors.rb +20 -0
  379. data/lib/aws/rails.rb +195 -0
  380. data/lib/aws/rds.rb +70 -0
  381. data/lib/aws/rds/client.rb +42 -0
  382. data/lib/aws/rds/config.rb +18 -0
  383. data/lib/aws/rds/db_instance.rb +215 -0
  384. data/lib/aws/rds/db_instance_collection.rb +75 -0
  385. data/lib/aws/rds/db_snapshot.rb +163 -0
  386. data/lib/aws/rds/db_snapshot_collection.rb +89 -0
  387. data/lib/aws/rds/errors.rb +22 -0
  388. data/lib/aws/record.rb +139 -0
  389. data/lib/aws/record/abstract_base.rb +689 -0
  390. data/lib/aws/record/attributes.rb +388 -0
  391. data/lib/aws/record/conversion.rb +38 -0
  392. data/lib/aws/record/dirty_tracking.rb +287 -0
  393. data/lib/aws/record/errors.rb +143 -0
  394. data/lib/aws/record/exceptions.rb +51 -0
  395. data/lib/aws/record/hash_model.rb +204 -0
  396. data/lib/aws/record/hash_model/attributes.rb +195 -0
  397. data/lib/aws/record/hash_model/finder_methods.rb +172 -0
  398. data/lib/aws/record/hash_model/scope.rb +108 -0
  399. data/lib/aws/record/model.rb +453 -0
  400. data/lib/aws/record/model/attributes.rb +377 -0
  401. data/lib/aws/record/model/finder_methods.rb +232 -0
  402. data/lib/aws/record/model/scope.rb +212 -0
  403. data/lib/aws/record/naming.rb +31 -0
  404. data/lib/aws/record/scope.rb +203 -0
  405. data/lib/aws/record/validations.rb +694 -0
  406. data/lib/aws/record/validator.rb +246 -0
  407. data/lib/aws/record/validators/acceptance.rb +49 -0
  408. data/lib/aws/record/validators/block.rb +36 -0
  409. data/lib/aws/record/validators/confirmation.rb +41 -0
  410. data/lib/aws/record/validators/count.rb +106 -0
  411. data/lib/aws/record/validators/exclusion.rb +41 -0
  412. data/lib/aws/record/validators/format.rb +55 -0
  413. data/lib/aws/record/validators/inclusion.rb +54 -0
  414. data/lib/aws/record/validators/length.rb +105 -0
  415. data/lib/aws/record/validators/method.rb +31 -0
  416. data/lib/aws/record/validators/numericality.rb +136 -0
  417. data/lib/aws/record/validators/presence.rb +43 -0
  418. data/lib/aws/redshift.rb +51 -0
  419. data/lib/aws/redshift/client.rb +35 -0
  420. data/lib/aws/redshift/config.rb +18 -0
  421. data/lib/aws/redshift/errors.rb +22 -0
  422. data/lib/aws/route_53.rb +86 -0
  423. data/lib/aws/route_53/change_batch.rb +161 -0
  424. data/lib/aws/route_53/change_info.rb +72 -0
  425. data/lib/aws/route_53/client.rb +38 -0
  426. data/lib/aws/route_53/config.rb +18 -0
  427. data/lib/aws/route_53/errors.rb +22 -0
  428. data/lib/aws/route_53/hosted_zone.rb +134 -0
  429. data/lib/aws/route_53/hosted_zone_collection.rb +101 -0
  430. data/lib/aws/route_53/resource_record_set.rb +251 -0
  431. data/lib/aws/route_53/resource_record_set_collection.rb +110 -0
  432. data/lib/aws/s3.rb +156 -0
  433. data/lib/aws/s3/access_control_list.rb +265 -0
  434. data/lib/aws/s3/acl_object.rb +264 -0
  435. data/lib/aws/s3/acl_options.rb +204 -0
  436. data/lib/aws/s3/bucket.rb +742 -0
  437. data/lib/aws/s3/bucket_collection.rb +162 -0
  438. data/lib/aws/s3/bucket_lifecycle_configuration.rb +473 -0
  439. data/lib/aws/s3/bucket_tag_collection.rb +111 -0
  440. data/lib/aws/s3/bucket_version_collection.rb +79 -0
  441. data/lib/aws/s3/cipher_io.rb +120 -0
  442. data/lib/aws/s3/client.rb +2067 -0
  443. data/lib/aws/s3/client/xml.rb +266 -0
  444. data/lib/aws/s3/config.rb +48 -0
  445. data/lib/aws/s3/cors_rule.rb +108 -0
  446. data/lib/aws/s3/cors_rule_collection.rb +194 -0
  447. data/lib/aws/s3/data_options.rb +191 -0
  448. data/lib/aws/s3/encryption_utils.rb +146 -0
  449. data/lib/aws/s3/errors.rb +94 -0
  450. data/lib/aws/s3/multipart_upload.rb +353 -0
  451. data/lib/aws/s3/multipart_upload_collection.rb +76 -0
  452. data/lib/aws/s3/object_collection.rb +353 -0
  453. data/lib/aws/s3/object_metadata.rb +103 -0
  454. data/lib/aws/s3/object_upload_collection.rb +77 -0
  455. data/lib/aws/s3/object_version.rb +154 -0
  456. data/lib/aws/s3/object_version_collection.rb +89 -0
  457. data/lib/aws/s3/paginated_collection.rb +75 -0
  458. data/lib/aws/s3/policy.rb +74 -0
  459. data/lib/aws/s3/prefix_and_delimiter_collection.rb +47 -0
  460. data/lib/aws/s3/prefixed_collection.rb +85 -0
  461. data/lib/aws/s3/presign_v4.rb +136 -0
  462. data/lib/aws/s3/presigned_post.rb +554 -0
  463. data/lib/aws/s3/request.rb +62 -0
  464. data/lib/aws/s3/s3_object.rb +1784 -0
  465. data/lib/aws/s3/tree.rb +116 -0
  466. data/lib/aws/s3/tree/branch_node.rb +68 -0
  467. data/lib/aws/s3/tree/child_collection.rb +104 -0
  468. data/lib/aws/s3/tree/leaf_node.rb +94 -0
  469. data/lib/aws/s3/tree/node.rb +22 -0
  470. data/lib/aws/s3/tree/parent.rb +87 -0
  471. data/lib/aws/s3/uploaded_part.rb +82 -0
  472. data/lib/aws/s3/uploaded_part_collection.rb +84 -0
  473. data/lib/aws/s3/website_configuration.rb +102 -0
  474. data/lib/aws/simple_db.rb +218 -0
  475. data/lib/aws/simple_db/attribute.rb +156 -0
  476. data/lib/aws/simple_db/attribute_collection.rb +240 -0
  477. data/lib/aws/simple_db/client.rb +67 -0
  478. data/lib/aws/simple_db/config.rb +20 -0
  479. data/lib/aws/simple_db/consistent_read_option.rb +42 -0
  480. data/lib/aws/simple_db/delete_attributes.rb +62 -0
  481. data/lib/aws/simple_db/domain.rb +123 -0
  482. data/lib/aws/simple_db/domain_collection.rb +86 -0
  483. data/lib/aws/simple_db/domain_metadata.rb +110 -0
  484. data/lib/aws/simple_db/errors.rb +55 -0
  485. data/lib/aws/simple_db/expect_condition_option.rb +45 -0
  486. data/lib/aws/simple_db/item.rb +93 -0
  487. data/lib/aws/simple_db/item_collection.rb +654 -0
  488. data/lib/aws/simple_db/item_data.rb +73 -0
  489. data/lib/aws/simple_db/put_attributes.rb +60 -0
  490. data/lib/aws/simple_email_service.rb +443 -0
  491. data/lib/aws/simple_email_service/client.rb +37 -0
  492. data/lib/aws/simple_email_service/config.rb +18 -0
  493. data/lib/aws/simple_email_service/email_address_collection.rb +69 -0
  494. data/lib/aws/simple_email_service/errors.rb +22 -0
  495. data/lib/aws/simple_email_service/identity.rb +230 -0
  496. data/lib/aws/simple_email_service/identity_collection.rb +81 -0
  497. data/lib/aws/simple_email_service/quotas.rb +66 -0
  498. data/lib/aws/simple_workflow.rb +227 -0
  499. data/lib/aws/simple_workflow/activity_task.rb +178 -0
  500. data/lib/aws/simple_workflow/activity_task_collection.rb +123 -0
  501. data/lib/aws/simple_workflow/activity_type.rb +131 -0
  502. data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
  503. data/lib/aws/simple_workflow/client.rb +69 -0
  504. data/lib/aws/simple_workflow/config.rb +18 -0
  505. data/lib/aws/simple_workflow/count.rb +49 -0
  506. data/lib/aws/simple_workflow/decision_task.rb +603 -0
  507. data/lib/aws/simple_workflow/decision_task_collection.rb +223 -0
  508. data/lib/aws/simple_workflow/domain.rb +122 -0
  509. data/lib/aws/simple_workflow/domain_collection.rb +169 -0
  510. data/lib/aws/simple_workflow/errors.rb +20 -0
  511. data/lib/aws/simple_workflow/history_event.rb +276 -0
  512. data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
  513. data/lib/aws/simple_workflow/option_formatters.rb +82 -0
  514. data/lib/aws/simple_workflow/resource.rb +94 -0
  515. data/lib/aws/simple_workflow/type.rb +89 -0
  516. data/lib/aws/simple_workflow/type_collection.rb +140 -0
  517. data/lib/aws/simple_workflow/workflow_execution.rb +384 -0
  518. data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
  519. data/lib/aws/simple_workflow/workflow_type.rb +177 -0
  520. data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
  521. data/lib/aws/sns.rb +76 -0
  522. data/lib/aws/sns/client.rb +35 -0
  523. data/lib/aws/sns/config.rb +18 -0
  524. data/lib/aws/sns/errors.rb +22 -0
  525. data/lib/aws/sns/has_delivery_policy.rb +68 -0
  526. data/lib/aws/sns/message.rb +204 -0
  527. data/lib/aws/sns/originators/from_auto_scaling.rb +68 -0
  528. data/lib/aws/sns/policy.rb +47 -0
  529. data/lib/aws/sns/subscription.rb +165 -0
  530. data/lib/aws/sns/subscription_collection.rb +78 -0
  531. data/lib/aws/sns/topic.rb +403 -0
  532. data/lib/aws/sns/topic_collection.rb +62 -0
  533. data/lib/aws/sns/topic_subscription_collection.rb +54 -0
  534. data/lib/aws/sqs.rb +80 -0
  535. data/lib/aws/sqs/client.rb +53 -0
  536. data/lib/aws/sqs/config.rb +20 -0
  537. data/lib/aws/sqs/errors.rb +125 -0
  538. data/lib/aws/sqs/policy.rb +48 -0
  539. data/lib/aws/sqs/queue.rb +856 -0
  540. data/lib/aws/sqs/queue_collection.rb +186 -0
  541. data/lib/aws/sqs/received_message.rb +190 -0
  542. data/lib/aws/sqs/received_sns_message.rb +116 -0
  543. data/lib/aws/storage_gateway.rb +72 -0
  544. data/lib/aws/storage_gateway/client.rb +42 -0
  545. data/lib/aws/storage_gateway/config.rb +18 -0
  546. data/lib/aws/storage_gateway/errors.rb +22 -0
  547. data/lib/aws/sts.rb +164 -0
  548. data/lib/aws/sts/client.rb +55 -0
  549. data/lib/aws/sts/config.rb +18 -0
  550. data/lib/aws/sts/errors.rb +22 -0
  551. data/lib/aws/sts/federated_session.rb +56 -0
  552. data/lib/aws/sts/policy.rb +30 -0
  553. data/lib/aws/sts/session.rb +48 -0
  554. data/lib/aws/support.rb +29 -0
  555. data/lib/aws/support/client.rb +35 -0
  556. data/lib/aws/support/config.rb +18 -0
  557. data/lib/aws/support/errors.rb +20 -0
  558. data/lib/aws/version.rb +17 -0
  559. data/rails/init.rb +15 -0
  560. metadata +634 -0
@@ -0,0 +1,689 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'set'
15
+
16
+ module AWS
17
+ module Record
18
+ module AbstractBase
19
+
20
+ def self.extended base
21
+
22
+ base.send(:extend, ClassMethods)
23
+ base.send(:include, InstanceMethods)
24
+ base.send(:include, DirtyTracking)
25
+ base.send(:extend, Validations)
26
+
27
+ # these 3 modules are for rails 3+ active model compatability
28
+ base.send(:extend, Naming)
29
+ base.send(:include, Naming)
30
+ base.send(:include, Conversion)
31
+
32
+ end
33
+
34
+ module InstanceMethods
35
+
36
+ # Constructs a new record.
37
+ #
38
+ # @param [Hash] attributes Attributes that should be bulk assigned
39
+ # to this record. You can also specify the shard (i.e. domain
40
+ # or table) this record should persist to via `:shard`).
41
+ #
42
+ # @option attributes [String] :shard The domain/table this record
43
+ # should persist to. If this is omitted, it will persist to the
44
+ # class default shard (which defaults to the class name).
45
+ #
46
+ # @return [Model,HashModel] Returns a new (non-persisted) record.
47
+ # Call {#save} to persist changes to AWS.
48
+ #
49
+ def initialize attributes = {}
50
+
51
+ attributes = attributes.dup
52
+
53
+ # supporting :domain for backwards compatability, :shard is prefered
54
+ @_shard = attributes.delete(:domain)
55
+ @_shard ||= attributes.delete('domain')
56
+ @_shard ||= attributes.delete(:shard)
57
+ @_shard ||= attributes.delete('shard')
58
+ @_shard = self.class.shard_name(@_shard)
59
+
60
+ @_data = {}
61
+ assign_default_values
62
+ bulk_assign(attributes)
63
+
64
+ end
65
+
66
+ # @return [String] Returns the name of the shard this record
67
+ # is persisted to or will be persisted to. Defaults to the
68
+ # domain/table named after this record class.
69
+ def shard
70
+ @_shard
71
+ end
72
+ alias_method :domain, :shard # for backwards compatability
73
+
74
+ # @return [Hash] A hash with attribute names as hash keys (strings) and
75
+ # attribute values (of mixed types) as hash values.
76
+ def attributes
77
+ attributes = Core::IndifferentHash.new
78
+ self.class.attributes.keys.inject(attributes) do |hash,attr_name|
79
+ hash.merge(attr_name => __send__(attr_name))
80
+ end
81
+ end
82
+
83
+ # Acts like {#update} but does not call {#save}.
84
+ #
85
+ # record.attributes = { :name => 'abc', :age => 20 }
86
+ #
87
+ # @param [Hash] attributes A hash of attributes to set on this record
88
+ # without calling save.
89
+ #
90
+ # @return [Hash] Returns the attribute hash that was passed in.
91
+ #
92
+ def attributes= attributes
93
+ bulk_assign(attributes)
94
+ end
95
+
96
+ # Persistence indicates if the record has been saved previously or not.
97
+ #
98
+ # @example
99
+ # @recipe = Recipe.new(:name => 'Buttermilk Pancackes')
100
+ # @recipe.persisted? #=> false
101
+ # @recipe.save!
102
+ # @recipe.persisted? #=> true
103
+ #
104
+ # @return [Boolean] Returns true if this record has been persisted.
105
+ def persisted?
106
+ !!@_persisted
107
+ end
108
+
109
+ # @return [Boolean] Returns true if this record has not been persisted
110
+ # to SimpleDB.
111
+ def new_record?
112
+ !persisted?
113
+ end
114
+
115
+ # @param [Hash] opts Pass :validate => false to skip validations
116
+ # @return [Boolean] Returns true if this record has no validation errors.
117
+ def valid? opts = {}
118
+ opts = {} if opts.nil?
119
+ opts = {:validate => true}.merge(opts)
120
+ run_validations if opts[:validate]
121
+ errors.empty?
122
+ end
123
+
124
+ def errors
125
+ @errors ||= Errors.new
126
+ end
127
+
128
+ # Creates new records, updates existing records.
129
+ # @param [Hash] opts Pass :validate => false to skip validations
130
+ # @return [Boolean] Returns true if the record saved without errors,
131
+ # false otherwise.
132
+ def save opts = {}
133
+ if valid?(opts)
134
+ persisted? ? update : create
135
+ clear_changes!
136
+ true
137
+ else
138
+ false
139
+ end
140
+ end
141
+
142
+ # Creates new records, updates exsting records. If there is a validation
143
+ # error then an exception is raised.
144
+ # @raise [InvalidRecordError] Raised when the record has validation
145
+ # errors and can not be saved.
146
+ # @return [true] Returns true after a successful save.
147
+ def save!
148
+ raise InvalidRecordError.new(self) unless save
149
+ true
150
+ end
151
+
152
+ # Bulk assigns the attributes and then saves the record.
153
+ # @param [Hash] attribute_hash A hash of attribute names (keys) and
154
+ # attribute values to assign to this record.
155
+ # @return (see #save)
156
+ def update_attributes attribute_hash
157
+ bulk_assign(attribute_hash)
158
+ save
159
+ end
160
+
161
+ # Bulk assigns the attributes and then saves the record. Raises
162
+ # an exception (AWS::Record::InvalidRecordError) if the record is not
163
+ # valid.
164
+ # @param (see #update_attributes)
165
+ # @return [true]
166
+ def update_attributes! attribute_hash
167
+ if update_attributes(attribute_hash)
168
+ true
169
+ else
170
+ raise InvalidRecordError.new(self)
171
+ end
172
+ end
173
+
174
+ # Deletes the record.
175
+ # @return [true]
176
+ def delete
177
+ if persisted?
178
+ if deleted?
179
+ raise 'unable to delete, this object has already been deleted'
180
+ else
181
+ delete_storage
182
+ @_deleted = true
183
+ end
184
+ else
185
+ raise 'unable to delete, this object has not been saved yet'
186
+ end
187
+ end
188
+ alias_method :destroy, :delete
189
+
190
+ # @return [Boolean] Returns true if this instance object has been deleted.
191
+ def deleted?
192
+ persisted? ? !!@_deleted : false
193
+ end
194
+
195
+ # If you define a custom setter, you use #[]= to set the value
196
+ # on the record.
197
+ #
198
+ # class Book < AWS::Record::Model
199
+ #
200
+ # string_attr :name
201
+ #
202
+ # # replace the default #author= method
203
+ # def author= name
204
+ # self['author'] = name.blank? ? 'Anonymous' : name
205
+ # end
206
+ #
207
+ # end
208
+ #
209
+ # @param [String,Symbol] The attribute name to set a value for
210
+ # @param attribute_value The value to assign.
211
+ protected
212
+ def []= attribute_name, new_value
213
+ self.class.attribute_for(attribute_name) do |attribute|
214
+
215
+ if_tracking_changes do
216
+ original_value = type_cast(attribute, attribute_was(attribute.name))
217
+ incoming_value = type_cast(attribute, new_value)
218
+ if original_value == incoming_value
219
+ clear_change!(attribute.name)
220
+ else
221
+ attribute_will_change!(attribute.name)
222
+ end
223
+ end
224
+
225
+ @_data[attribute.name] = new_value
226
+
227
+ end
228
+ end
229
+
230
+ # Returns the typecasted value for the named attribute.
231
+ #
232
+ # book = Book.new(:title => 'My Book')
233
+ # book['title'] #=> 'My Book'
234
+ # book.title #=> 'My Book'
235
+ #
236
+ # ### Intended Use
237
+ #
238
+ # This method's primary use is for getting/setting the value for
239
+ # an attribute inside a custom method:
240
+ #
241
+ # class Book < AWS::Record::Model
242
+ #
243
+ # string_attr :title
244
+ #
245
+ # def title
246
+ # self['title'] ? self['title'].upcase : nil
247
+ # end
248
+ #
249
+ # end
250
+ #
251
+ # book = Book.new(:title => 'My Book')
252
+ # book.title #=> 'MY BOOK'
253
+ #
254
+ # @param [String,Symbol] attribute_name The name of the attribute to fetch
255
+ # a value for.
256
+ # @return The current type-casted value for the named attribute.
257
+ protected
258
+ def [] attribute_name
259
+ self.class.attribute_for(attribute_name) do |attribute|
260
+ type_cast(attribute, @_data[attribute.name])
261
+ end
262
+ end
263
+
264
+ protected
265
+ def create
266
+ populate_id
267
+ touch_timestamps('created_at', 'updated_at')
268
+ increment_optimistic_lock_value
269
+ create_storage
270
+ @_persisted = true
271
+ end
272
+
273
+ private
274
+ def update
275
+ return unless changed?
276
+ touch_timestamps('updated_at')
277
+ increment_optimistic_lock_value
278
+ update_storage
279
+ end
280
+
281
+ protected
282
+ def touch_timestamps *attributes
283
+ now = Time.now
284
+ attributes.each do |attr_name|
285
+ if
286
+ self.class.attributes[attr_name] and
287
+ !attribute_changed?(attr_name)
288
+ # don't touch timestamps the user modified
289
+ then
290
+ __send__("#{attr_name}=", now)
291
+ end
292
+ end
293
+ end
294
+
295
+ protected
296
+ def increment_optimistic_lock_value
297
+ if_locks_optimistically do |lock_attr|
298
+ if value = self[lock_attr.name]
299
+ self[lock_attr.name] = value + 1
300
+ else
301
+ self[lock_attr.name] = 1
302
+ end
303
+ end
304
+ end
305
+
306
+ protected
307
+ def if_locks_optimistically &block
308
+ if opt_lock_attr = self.class.optimistic_locking_attr
309
+ yield(opt_lock_attr)
310
+ end
311
+ end
312
+
313
+ protected
314
+ def opt_lock_conditions
315
+ conditions = {}
316
+ if_locks_optimistically do |lock_attr|
317
+ if was = attribute_was(lock_attr.name)
318
+ conditions[:if] = { lock_attr.name => lock_attr.serialize(was) }
319
+ else
320
+ conditions[:unless_exists] = lock_attr.name
321
+ end
322
+ end
323
+ conditions
324
+ end
325
+
326
+ private
327
+ def assign_default_values
328
+ # populate default attribute values
329
+ ignore_changes do
330
+ self.class.attributes.values.each do |attribute|
331
+ default = attribute.default_value
332
+ begin
333
+ # copy default values down so methods like #gsub! don't
334
+ # modify the default values for other objects
335
+ @_data[attribute.name] = default.clone
336
+ rescue TypeError
337
+ @_data[attribute.name] = default
338
+ end
339
+ end
340
+ end
341
+ end
342
+
343
+ private
344
+ def bulk_assign hash
345
+ flatten_date_parts(hash).each_pair do |attr_name, attr_value|
346
+ __send__("#{attr_name}=", attr_value)
347
+ end
348
+ end
349
+
350
+ private
351
+ # Rails date and time select helpers split date and time
352
+ # attributes into multiple values for form submission.
353
+ # These attributes get named things like 'created_at(1i)'
354
+ # and represent year/month/day/hour/min/sec parts of
355
+ # the date/time.
356
+ #
357
+ # This method converts these attributes back into a single
358
+ # value and converts them to Date and DateTime objects.
359
+ def flatten_date_parts attributes
360
+
361
+ multi_attributes = Set.new
362
+
363
+ hash = attributes.inject({}) do |hash,(key,value)|
364
+ # collects attribuets like "created_at(1i)" into an array of parts
365
+ if key =~ /\(/
366
+ key, index = key.to_s.split(/\(|i\)/)
367
+ hash[key] ||= []
368
+ hash[key][index.to_i - 1] = value.to_i
369
+ multi_attributes << key
370
+ else
371
+ hash[key] = value
372
+ end
373
+ hash
374
+ end
375
+
376
+ # convert multiattribute values into date/time objects
377
+ multi_attributes.each do |key|
378
+
379
+ values = hash[key]
380
+
381
+ hash[key] = case values.size
382
+ when 0 then nil
383
+ when 2
384
+ now = Time.now
385
+ Time.local(now.year, now.month, now.day, values[0], values[1], 0, 0)
386
+ when 3 then Date.new(*values)
387
+ else DateTime.new(*values)
388
+ end
389
+
390
+ end
391
+
392
+ hash
393
+
394
+ end
395
+
396
+ private
397
+ def type_cast attribute, raw
398
+ if attribute.set?
399
+ values = Record.as_array(raw).inject([]) do |values,value|
400
+ values << attribute.type_cast(value)
401
+ values
402
+ end
403
+ Set.new(values.compact)
404
+ else
405
+ attribute.type_cast(raw)
406
+ end
407
+ end
408
+
409
+ private
410
+ def serialize_attributes
411
+
412
+ hash = {}
413
+ self.class.attributes.each_pair do |attribute_name,attribute|
414
+ value = serialize_attribute(attribute, @_data[attribute_name])
415
+ unless [nil, []].include?(value)
416
+ hash[attribute_name] = value
417
+ end
418
+ end
419
+
420
+ # simple db does not support persisting items without attribute values
421
+ raise EmptyRecordError.new(self) if hash.empty?
422
+
423
+ hash
424
+
425
+ end
426
+
427
+ private
428
+ def serialize_attribute attribute, raw_value
429
+ type_casted_value = type_cast(attribute, raw_value)
430
+ case type_casted_value
431
+ when nil then nil
432
+ when Set then type_casted_value.map{|v| attribute.serialize(v) }
433
+ else attribute.serialize(type_casted_value)
434
+ end
435
+ end
436
+
437
+ # @api private
438
+ protected
439
+ def hydrate id, data
440
+ # New objects are populated with default values, but we don't
441
+ # want these values to hang around when hydrating persisted values
442
+ # (those values may have been blanked out before save).
443
+ self.class.attributes.values.each do |attribute|
444
+ @_data[attribute.name] = nil
445
+ end
446
+
447
+ ignore_changes do
448
+ bulk_assign(deserialize_item_data(data))
449
+ end
450
+
451
+ @_persisted = true
452
+ end
453
+
454
+ protected
455
+ def create_storage
456
+ raise NotImplementedError
457
+ end
458
+
459
+ protected
460
+ def update_storage
461
+ raise NotImplementedError
462
+ end
463
+
464
+ protected
465
+ def delete_storage
466
+ raise NotImplementedError
467
+ end
468
+
469
+ end
470
+
471
+ module ClassMethods
472
+
473
+ # Allows you to override the default shard name for this class.
474
+ # The shard name defaults to the class name.
475
+ # @param [String] name
476
+ def set_shard_name name
477
+ @_shard_name = name
478
+ end
479
+ alias_method :set_domain_name, :set_shard_name
480
+ alias_method :shard_name=, :set_shard_name
481
+
482
+ # Returns the name of the shard this class will persist records
483
+ # into by default.
484
+ #
485
+ # @param [String] name Defaults to the name of this class.
486
+ # @return [String] Returns the full prefixed domain name for this class.
487
+ def shard_name name = nil
488
+ case name
489
+ when nil
490
+ @_shard_name || self.name
491
+ when AWS::DynamoDB::Table
492
+ name.name.gsub(/^#{Record::table_prefix}/, '')
493
+ when AWS::SimpleDB::Domain
494
+ name.name.gsub(/^#{Record::domain_prefix}/, '')
495
+ else name
496
+ end
497
+ end
498
+ alias_method :domain_name, :shard_name
499
+
500
+ # Adds a scoped finder to this class.
501
+ #
502
+ # class Book < AWS::Record::Model
503
+ # scope :top_10, order(:popularity, :desc).limit(10)
504
+ # end
505
+ #
506
+ # Book.top_10.to_a
507
+ # #=> [#<Book...>, #<Book...>]
508
+ #
509
+ # Book.top_10.first
510
+ # #=> #<Book...>
511
+ #
512
+ # You can also provide a block that accepts params for the scoped
513
+ # finder. This block should return a scope.
514
+ #
515
+ # class Book < AWS::Record::Model
516
+ # scope :by_author, lambda {|name| where(:author => name) }
517
+ # end
518
+ #
519
+ # # top 10 books by the author 'John Doe'
520
+ # Book.by_author('John Doe').top_10
521
+ #
522
+ # @param [Symbol] name The name of the scope. Scope names should be
523
+ # method-safe and should not conflict with any other class methods.
524
+ #
525
+ # @param [Scope] scope
526
+ #
527
+ def scope name, scope = nil, &block
528
+
529
+ method_definition = scope ? lambda { scope } : block
530
+
531
+ extend(Module.new { define_method(name, &method_definition) })
532
+
533
+ end
534
+
535
+ # Creates an object (or multiple if you pass an array of attributes).
536
+ # The {#save} method is called on the object(s) after construction.
537
+ # The object(s) are returned wether or not the object(s) are valid.
538
+ #
539
+ # class Book < AWS::Record::Model
540
+ # string_attr :title
541
+ # end
542
+ #
543
+ # book = Book.create(:title => "The big book of tests")
544
+ # book.persisted?
545
+ # #=> true
546
+ #
547
+ # books = Book.create([{:title => 'abc'}, {:title => 'xyz'}])
548
+ # books.each(&:persisted?)
549
+ # #=> [true, true]
550
+ #
551
+ def create attributes = {}
552
+ create_impl(attributes, :create, :save)
553
+ end
554
+
555
+ # Creates an object (or multiple if you pass an array of attributes).
556
+ # The {#save!} method is called on the object(s) after construction.
557
+ # If the object(s) are not valid, then an error is raised.
558
+ #
559
+ # class Book < AWS::Record::Model
560
+ # string_attr :title
561
+ # validates_presence_of :title
562
+ # end
563
+ #
564
+ # book = Book.create!(:title => "The big book of tests")
565
+ # book.persisted?
566
+ # #=> true
567
+ #
568
+ # book = Book.create!()
569
+ # #=> raises AWS::Record::InvalidRecordError
570
+ #
571
+ def create! attributes = {}
572
+ create_impl(attributes, :create!, :save!)
573
+ end
574
+
575
+ # @api private
576
+ def new_scope
577
+ self::Scope.new(self)
578
+ end
579
+
580
+ def optimistic_locking attribute_name = :version_id
581
+ attribute = integer_attr(attribute_name)
582
+ @optimistic_locking_attr = attribute
583
+ end
584
+
585
+ # @return [Boolean] Returns true if this class is configured to
586
+ # perform optimistic locking.
587
+ def optimistic_locking?
588
+ !!@optimistic_locking_attr
589
+ end
590
+
591
+ # @private
592
+ def optimistic_locking_attr
593
+ @optimistic_locking_attr
594
+ end
595
+
596
+ # @return [Hash<String,Attribute>] Returns a hash of all of the
597
+ # configured attributes for this class.
598
+ def attributes
599
+ @attributes ||= {}
600
+ end
601
+
602
+ # @api private
603
+ def attribute_for attribute_name, &block
604
+ unless attribute = attributes[attribute_name.to_s]
605
+ raise UndefinedAttributeError.new(attribute_name.to_s)
606
+ end
607
+ block_given? ? yield(attribute) : attribute
608
+ end
609
+
610
+ # @api private
611
+ def add_attribute attribute
612
+
613
+ attr_name = attribute.name
614
+
615
+ attributes[attr_name] = attribute
616
+
617
+ # setter
618
+ define_method("#{attr_name}=") do |value|
619
+ self[attr_name] = value
620
+ end
621
+
622
+ # getter
623
+ define_method(attr_name) do
624
+ self[attr_name]
625
+ end
626
+
627
+ # before type-cast getter
628
+ define_method("#{attr_name}_before_type_cast") do
629
+ @_data[attr_name]
630
+ end
631
+
632
+ # dirty tracking methods
633
+
634
+ define_method("#{attr_name}_changed?") do
635
+ attribute_changed?(attr_name)
636
+ end
637
+
638
+ define_method("#{attr_name}_change") do
639
+ attribute_change(attr_name)
640
+ end
641
+
642
+ define_method("#{attr_name}_was") do
643
+ attribute_was(attr_name)
644
+ end
645
+
646
+ define_method("#{attr_name}_will_change!") do
647
+ attribute_will_change!(attr_name)
648
+ end
649
+
650
+ define_method("reset_#{attr_name}!") do
651
+ reset_attribute!(attr_name)
652
+ end
653
+
654
+ attribute
655
+
656
+ end
657
+
658
+ # @api private
659
+ def remove_attribute(attribute)
660
+ send(:remove_method, attribute.name)
661
+ send(:remove_method, "#{attribute.name}=")
662
+ send(:remove_method, "#{attribute.name}_before_type_cast")
663
+ send(:remove_method, "#{attribute.name}_changed?")
664
+ send(:remove_method, "#{attribute.name}_change")
665
+ send(:remove_method, "#{attribute.name}_was")
666
+ send(:remove_method, "#{attribute.name}_will_change!")
667
+ send(:remove_method, "reset_#{attribute.name}!")
668
+ validators.each do |validator|
669
+ validator.attribute_names.delete(attribute.name)
670
+ end
671
+ attributes.delete(attribute.name)
672
+ end
673
+
674
+ private
675
+
676
+ def create_impl attributes = {}, create_method = :create, save_method = :save
677
+ if attributes.is_a?(Array)
678
+ attributes.map {|attr| send(create_method, attr) }
679
+ else
680
+ obj = new(attributes)
681
+ obj.send(save_method)
682
+ obj
683
+ end
684
+ end
685
+
686
+ end
687
+ end
688
+ end
689
+ end