aws-sdk-euca 1.8.5

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 (539) hide show
  1. data/.yardopts +5 -0
  2. data/LICENSE.txt +12 -0
  3. data/README.rdoc +189 -0
  4. data/ca-bundle.crt +3895 -0
  5. data/lib/aws-sdk-euca.rb +79 -0
  6. data/lib/aws-sdk.rb +79 -0
  7. data/lib/aws.rb +14 -0
  8. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +825 -0
  9. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +322 -0
  10. data/lib/aws/api_config/CloudFront-2012-05-05.yml +2102 -0
  11. data/lib/aws/api_config/CloudSearch-2011-02-01.yml +681 -0
  12. data/lib/aws/api_config/CloudWatch-2010-08-01.yml +433 -0
  13. data/lib/aws/api_config/DataPipeline-2012-10-29.yml +422 -0
  14. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +1160 -0
  15. data/lib/aws/api_config/EC2-2013-02-01.yml +4368 -0
  16. data/lib/aws/api_config/ELB-2012-06-01.yml +597 -0
  17. data/lib/aws/api_config/EMR-2009-03-31.yml +370 -0
  18. data/lib/aws/api_config/ElastiCache-2012-03-09.yml +777 -0
  19. data/lib/aws/api_config/ElastiCache-2012-11-15.yml +979 -0
  20. data/lib/aws/api_config/ElasticBeanstalk-2010-12-01.yml +823 -0
  21. data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +1036 -0
  22. data/lib/aws/api_config/Glacier-2012-06-01.yml +618 -0
  23. data/lib/aws/api_config/IAM-2010-05-08.yml +1222 -0
  24. data/lib/aws/api_config/ImportExport-2010-06-01.yml +109 -0
  25. data/lib/aws/api_config/OpsWorks-2013-02-18.yml +1463 -0
  26. data/lib/aws/api_config/RDS-2012-09-17.yml +1861 -0
  27. data/lib/aws/api_config/RDS-2013-02-12.yml +2377 -0
  28. data/lib/aws/api_config/Redshift-2012-12-01.yml +1149 -0
  29. data/lib/aws/api_config/Route53-2012-02-29.yml +380 -0
  30. data/lib/aws/api_config/Route53-2012-12-12.yml +547 -0
  31. data/lib/aws/api_config/SNS-2010-03-31.yml +249 -0
  32. data/lib/aws/api_config/SQS-2012-11-05.yml +317 -0
  33. data/lib/aws/api_config/STS-2011-06-15.yml +81 -0
  34. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +306 -0
  35. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +346 -0
  36. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +2358 -0
  37. data/lib/aws/api_config/StorageGateway-2012-06-30.yml +748 -0
  38. data/lib/aws/auto_scaling.rb +164 -0
  39. data/lib/aws/auto_scaling/activity.rb +102 -0
  40. data/lib/aws/auto_scaling/activity_collection.rb +82 -0
  41. data/lib/aws/auto_scaling/client.rb +521 -0
  42. data/lib/aws/auto_scaling/config.rb +18 -0
  43. data/lib/aws/auto_scaling/errors.rb +22 -0
  44. data/lib/aws/auto_scaling/group.rb +420 -0
  45. data/lib/aws/auto_scaling/group_collection.rb +96 -0
  46. data/lib/aws/auto_scaling/group_options.rb +146 -0
  47. data/lib/aws/auto_scaling/instance.rb +192 -0
  48. data/lib/aws/auto_scaling/instance_collection.rb +63 -0
  49. data/lib/aws/auto_scaling/launch_configuration.rb +158 -0
  50. data/lib/aws/auto_scaling/launch_configuration_collection.rb +154 -0
  51. data/lib/aws/auto_scaling/notification_configuration.rb +89 -0
  52. data/lib/aws/auto_scaling/notification_configuration_collection.rb +184 -0
  53. data/lib/aws/auto_scaling/request.rb +29 -0
  54. data/lib/aws/auto_scaling/scaling_policy.rb +142 -0
  55. data/lib/aws/auto_scaling/scaling_policy_collection.rb +72 -0
  56. data/lib/aws/auto_scaling/scaling_policy_options.rb +64 -0
  57. data/lib/aws/auto_scaling/scheduled_action.rb +145 -0
  58. data/lib/aws/auto_scaling/scheduled_action_collection.rb +195 -0
  59. data/lib/aws/auto_scaling/tag.rb +59 -0
  60. data/lib/aws/auto_scaling/tag_collection.rb +112 -0
  61. data/lib/aws/cloud_formation.rb +272 -0
  62. data/lib/aws/cloud_formation/client.rb +369 -0
  63. data/lib/aws/cloud_formation/config.rb +18 -0
  64. data/lib/aws/cloud_formation/errors.rb +22 -0
  65. data/lib/aws/cloud_formation/request.rb +29 -0
  66. data/lib/aws/cloud_formation/stack.rb +255 -0
  67. data/lib/aws/cloud_formation/stack_collection.rb +209 -0
  68. data/lib/aws/cloud_formation/stack_event.rb +75 -0
  69. data/lib/aws/cloud_formation/stack_event_collection.rb +47 -0
  70. data/lib/aws/cloud_formation/stack_options.rb +72 -0
  71. data/lib/aws/cloud_formation/stack_output.rb +53 -0
  72. data/lib/aws/cloud_formation/stack_resource.rb +117 -0
  73. data/lib/aws/cloud_formation/stack_resource_collection.rb +84 -0
  74. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +64 -0
  75. data/lib/aws/cloud_formation/stack_summary_collection.rb +123 -0
  76. data/lib/aws/cloud_front.rb +73 -0
  77. data/lib/aws/cloud_front/client.rb +1307 -0
  78. data/lib/aws/cloud_front/config.rb +18 -0
  79. data/lib/aws/cloud_front/errors.rb +22 -0
  80. data/lib/aws/cloud_front/request.rb +44 -0
  81. data/lib/aws/cloud_search.rb +74 -0
  82. data/lib/aws/cloud_search/client.rb +558 -0
  83. data/lib/aws/cloud_search/config.rb +18 -0
  84. data/lib/aws/cloud_search/errors.rb +22 -0
  85. data/lib/aws/cloud_search/request.rb +23 -0
  86. data/lib/aws/cloud_watch.rb +119 -0
  87. data/lib/aws/cloud_watch/alarm.rb +272 -0
  88. data/lib/aws/cloud_watch/alarm_collection.rb +153 -0
  89. data/lib/aws/cloud_watch/alarm_history_item.rb +50 -0
  90. data/lib/aws/cloud_watch/alarm_history_item_collection.rb +84 -0
  91. data/lib/aws/cloud_watch/client.rb +247 -0
  92. data/lib/aws/cloud_watch/config.rb +18 -0
  93. data/lib/aws/cloud_watch/errors.rb +22 -0
  94. data/lib/aws/cloud_watch/metric.rb +135 -0
  95. data/lib/aws/cloud_watch/metric_alarm_collection.rb +160 -0
  96. data/lib/aws/cloud_watch/metric_collection.rb +131 -0
  97. data/lib/aws/cloud_watch/metric_statistics.rb +69 -0
  98. data/lib/aws/cloud_watch/request.rb +23 -0
  99. data/lib/aws/core.rb +587 -0
  100. data/lib/aws/core/async_handle.rb +90 -0
  101. data/lib/aws/core/autoloader.rb +64 -0
  102. data/lib/aws/core/cacheable.rb +78 -0
  103. data/lib/aws/core/client.rb +691 -0
  104. data/lib/aws/core/collection.rb +267 -0
  105. data/lib/aws/core/collection/simple.rb +82 -0
  106. data/lib/aws/core/collection/with_limit_and_next_token.rb +71 -0
  107. data/lib/aws/core/collection/with_next_token.rb +97 -0
  108. data/lib/aws/core/configuration.rb +546 -0
  109. data/lib/aws/core/credential_providers.rb +461 -0
  110. data/lib/aws/core/data.rb +247 -0
  111. data/lib/aws/core/http/curb_handler.rb +155 -0
  112. data/lib/aws/core/http/handler.rb +89 -0
  113. data/lib/aws/core/http/net_http_handler.rb +128 -0
  114. data/lib/aws/core/http/request.rb +263 -0
  115. data/lib/aws/core/http/response.rb +81 -0
  116. data/lib/aws/core/indifferent_hash.rb +88 -0
  117. data/lib/aws/core/inflection.rb +56 -0
  118. data/lib/aws/core/json_client.rb +47 -0
  119. data/lib/aws/core/json_parser.rb +76 -0
  120. data/lib/aws/core/json_request_builder.rb +35 -0
  121. data/lib/aws/core/json_response_parser.rb +79 -0
  122. data/lib/aws/core/lazy_error_classes.rb +90 -0
  123. data/lib/aws/core/log_formatter.rb +462 -0
  124. data/lib/aws/core/managed_file.rb +32 -0
  125. data/lib/aws/core/meta_utils.rb +45 -0
  126. data/lib/aws/core/model.rb +57 -0
  127. data/lib/aws/core/naming.rb +30 -0
  128. data/lib/aws/core/option_grammar.rb +735 -0
  129. data/lib/aws/core/options/json_serializer.rb +82 -0
  130. data/lib/aws/core/options/validator.rb +155 -0
  131. data/lib/aws/core/options/xml_serializer.rb +118 -0
  132. data/lib/aws/core/page_result.rb +75 -0
  133. data/lib/aws/core/policy.rb +916 -0
  134. data/lib/aws/core/query_client.rb +41 -0
  135. data/lib/aws/core/query_error_parser.rb +24 -0
  136. data/lib/aws/core/query_request_builder.rb +47 -0
  137. data/lib/aws/core/query_response_parser.rb +35 -0
  138. data/lib/aws/core/resource.rb +413 -0
  139. data/lib/aws/core/resource_cache.rb +40 -0
  140. data/lib/aws/core/response.rb +208 -0
  141. data/lib/aws/core/response_cache.rb +50 -0
  142. data/lib/aws/core/rest_error_parser.rb +24 -0
  143. data/lib/aws/core/rest_json_client.rb +40 -0
  144. data/lib/aws/core/rest_request_builder.rb +146 -0
  145. data/lib/aws/core/rest_response_parser.rb +66 -0
  146. data/lib/aws/core/rest_xml_client.rb +47 -0
  147. data/lib/aws/core/service_interface.rb +61 -0
  148. data/lib/aws/core/signature/version_2.rb +56 -0
  149. data/lib/aws/core/signature/version_3.rb +77 -0
  150. data/lib/aws/core/signature/version_3_https.rb +54 -0
  151. data/lib/aws/core/signature/version_4.rb +135 -0
  152. data/lib/aws/core/signer.rb +46 -0
  153. data/lib/aws/core/uri_escape.rb +44 -0
  154. data/lib/aws/core/xml/frame.rb +244 -0
  155. data/lib/aws/core/xml/frame_stack.rb +85 -0
  156. data/lib/aws/core/xml/grammar.rb +307 -0
  157. data/lib/aws/core/xml/parser.rb +70 -0
  158. data/lib/aws/core/xml/root_frame.rb +65 -0
  159. data/lib/aws/core/xml/sax_handlers/libxml.rb +47 -0
  160. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +55 -0
  161. data/lib/aws/core/xml/sax_handlers/ox.rb +41 -0
  162. data/lib/aws/core/xml/sax_handlers/rexml.rb +43 -0
  163. data/lib/aws/core/xml/stub.rb +123 -0
  164. data/lib/aws/data_pipeline.rb +73 -0
  165. data/lib/aws/data_pipeline/client.rb +339 -0
  166. data/lib/aws/data_pipeline/config.rb +18 -0
  167. data/lib/aws/data_pipeline/errors.rb +20 -0
  168. data/lib/aws/data_pipeline/request.rb +26 -0
  169. data/lib/aws/dynamo_db.rb +206 -0
  170. data/lib/aws/dynamo_db/attribute_collection.rb +461 -0
  171. data/lib/aws/dynamo_db/batch_get.rb +213 -0
  172. data/lib/aws/dynamo_db/batch_write.rb +252 -0
  173. data/lib/aws/dynamo_db/binary.rb +35 -0
  174. data/lib/aws/dynamo_db/client.rb +904 -0
  175. data/lib/aws/dynamo_db/config.rb +24 -0
  176. data/lib/aws/dynamo_db/errors.rb +20 -0
  177. data/lib/aws/dynamo_db/expectations.rb +40 -0
  178. data/lib/aws/dynamo_db/item.rb +133 -0
  179. data/lib/aws/dynamo_db/item_collection.rb +852 -0
  180. data/lib/aws/dynamo_db/item_data.rb +31 -0
  181. data/lib/aws/dynamo_db/keys.rb +41 -0
  182. data/lib/aws/dynamo_db/primary_key_element.rb +48 -0
  183. data/lib/aws/dynamo_db/request.rb +26 -0
  184. data/lib/aws/dynamo_db/resource.rb +33 -0
  185. data/lib/aws/dynamo_db/table.rb +491 -0
  186. data/lib/aws/dynamo_db/table_collection.rb +165 -0
  187. data/lib/aws/dynamo_db/types.rb +111 -0
  188. data/lib/aws/ec2.rb +440 -0
  189. data/lib/aws/ec2/attachment.rb +140 -0
  190. data/lib/aws/ec2/attachment_collection.rb +54 -0
  191. data/lib/aws/ec2/availability_zone.rb +86 -0
  192. data/lib/aws/ec2/availability_zone_collection.rb +43 -0
  193. data/lib/aws/ec2/block_device_mappings.rb +53 -0
  194. data/lib/aws/ec2/client.rb +3621 -0
  195. data/lib/aws/ec2/collection.rb +36 -0
  196. data/lib/aws/ec2/config.rb +18 -0
  197. data/lib/aws/ec2/config_transform.rb +63 -0
  198. data/lib/aws/ec2/customer_gateway.rb +90 -0
  199. data/lib/aws/ec2/customer_gateway_collection.rb +73 -0
  200. data/lib/aws/ec2/dhcp_options.rb +106 -0
  201. data/lib/aws/ec2/dhcp_options_collection.rb +87 -0
  202. data/lib/aws/ec2/elastic_ip.rb +208 -0
  203. data/lib/aws/ec2/elastic_ip_collection.rb +97 -0
  204. data/lib/aws/ec2/errors.rb +32 -0
  205. data/lib/aws/ec2/export_task.rb +120 -0
  206. data/lib/aws/ec2/export_task_collection.rb +67 -0
  207. data/lib/aws/ec2/filtered_collection.rb +89 -0
  208. data/lib/aws/ec2/has_permissions.rb +44 -0
  209. data/lib/aws/ec2/image.rb +264 -0
  210. data/lib/aws/ec2/image_collection.rb +228 -0
  211. data/lib/aws/ec2/instance.rb +796 -0
  212. data/lib/aws/ec2/instance_collection.rb +372 -0
  213. data/lib/aws/ec2/internet_gateway.rb +122 -0
  214. data/lib/aws/ec2/internet_gateway/attachment.rb +78 -0
  215. data/lib/aws/ec2/internet_gateway_collection.rb +54 -0
  216. data/lib/aws/ec2/key_pair.rb +82 -0
  217. data/lib/aws/ec2/key_pair_collection.rb +99 -0
  218. data/lib/aws/ec2/network_acl.rb +256 -0
  219. data/lib/aws/ec2/network_acl/association.rb +56 -0
  220. data/lib/aws/ec2/network_acl/entry.rb +147 -0
  221. data/lib/aws/ec2/network_acl_collection.rb +64 -0
  222. data/lib/aws/ec2/network_interface.rb +228 -0
  223. data/lib/aws/ec2/network_interface/attachment.rb +100 -0
  224. data/lib/aws/ec2/network_interface_collection.rb +103 -0
  225. data/lib/aws/ec2/permission_collection.rb +174 -0
  226. data/lib/aws/ec2/region.rb +106 -0
  227. data/lib/aws/ec2/region_collection.rb +51 -0
  228. data/lib/aws/ec2/request.rb +21 -0
  229. data/lib/aws/ec2/reserved_instances.rb +56 -0
  230. data/lib/aws/ec2/reserved_instances_collection.rb +40 -0
  231. data/lib/aws/ec2/reserved_instances_offering.rb +60 -0
  232. data/lib/aws/ec2/reserved_instances_offering_collection.rb +39 -0
  233. data/lib/aws/ec2/resource.rb +161 -0
  234. data/lib/aws/ec2/resource_tag_collection.rb +211 -0
  235. data/lib/aws/ec2/route_table.rb +205 -0
  236. data/lib/aws/ec2/route_table/association.rb +119 -0
  237. data/lib/aws/ec2/route_table/route.rb +119 -0
  238. data/lib/aws/ec2/route_table_collection.rb +72 -0
  239. data/lib/aws/ec2/security_group.rb +484 -0
  240. data/lib/aws/ec2/security_group/ip_permission.rb +135 -0
  241. data/lib/aws/ec2/security_group/ip_permission_collection.rb +82 -0
  242. data/lib/aws/ec2/security_group_collection.rb +135 -0
  243. data/lib/aws/ec2/snapshot.rb +143 -0
  244. data/lib/aws/ec2/snapshot_collection.rb +132 -0
  245. data/lib/aws/ec2/subnet.rb +161 -0
  246. data/lib/aws/ec2/subnet_collection.rb +115 -0
  247. data/lib/aws/ec2/tag.rb +81 -0
  248. data/lib/aws/ec2/tag_collection.rb +107 -0
  249. data/lib/aws/ec2/tagged_collection.rb +53 -0
  250. data/lib/aws/ec2/tagged_item.rb +85 -0
  251. data/lib/aws/ec2/volume.rb +174 -0
  252. data/lib/aws/ec2/volume_collection.rb +101 -0
  253. data/lib/aws/ec2/vpc.rb +166 -0
  254. data/lib/aws/ec2/vpc_collection.rb +70 -0
  255. data/lib/aws/ec2/vpn_connection.rb +99 -0
  256. data/lib/aws/ec2/vpn_connection/telemetry.rb +49 -0
  257. data/lib/aws/ec2/vpn_connection_collection.rb +96 -0
  258. data/lib/aws/ec2/vpn_gateway.rb +123 -0
  259. data/lib/aws/ec2/vpn_gateway/attachment.rb +45 -0
  260. data/lib/aws/ec2/vpn_gateway_collection.rb +77 -0
  261. data/lib/aws/elastic_beanstalk.rb +50 -0
  262. data/lib/aws/elastic_beanstalk/client.rb +867 -0
  263. data/lib/aws/elastic_beanstalk/config.rb +18 -0
  264. data/lib/aws/elastic_beanstalk/errors.rb +22 -0
  265. data/lib/aws/elastic_beanstalk/request.rb +29 -0
  266. data/lib/aws/elastic_transcoder.rb +30 -0
  267. data/lib/aws/elastic_transcoder/client.rb +672 -0
  268. data/lib/aws/elastic_transcoder/config.rb +18 -0
  269. data/lib/aws/elastic_transcoder/errors.rb +23 -0
  270. data/lib/aws/elastic_transcoder/request.rb +30 -0
  271. data/lib/aws/elasticache.rb +50 -0
  272. data/lib/aws/elasticache/client.rb +920 -0
  273. data/lib/aws/elasticache/config.rb +18 -0
  274. data/lib/aws/elasticache/errors.rb +22 -0
  275. data/lib/aws/elasticache/request.rb +23 -0
  276. data/lib/aws/elb.rb +67 -0
  277. data/lib/aws/elb/availability_zone_collection.rb +138 -0
  278. data/lib/aws/elb/backend_server_policy_collection.rb +139 -0
  279. data/lib/aws/elb/client.rb +500 -0
  280. data/lib/aws/elb/config.rb +18 -0
  281. data/lib/aws/elb/errors.rb +26 -0
  282. data/lib/aws/elb/instance_collection.rb +173 -0
  283. data/lib/aws/elb/listener.rb +190 -0
  284. data/lib/aws/elb/listener_collection.rb +113 -0
  285. data/lib/aws/elb/listener_opts.rb +45 -0
  286. data/lib/aws/elb/load_balancer.rb +281 -0
  287. data/lib/aws/elb/load_balancer_collection.rb +134 -0
  288. data/lib/aws/elb/load_balancer_policy.rb +93 -0
  289. data/lib/aws/elb/load_balancer_policy_collection.rb +208 -0
  290. data/lib/aws/elb/request.rb +29 -0
  291. data/lib/aws/emr.rb +86 -0
  292. data/lib/aws/emr/client.rb +330 -0
  293. data/lib/aws/emr/config.rb +18 -0
  294. data/lib/aws/emr/errors.rb +22 -0
  295. data/lib/aws/emr/instance_group.rb +138 -0
  296. data/lib/aws/emr/instance_group_collection.rb +82 -0
  297. data/lib/aws/emr/job_flow.rb +306 -0
  298. data/lib/aws/emr/job_flow_collection.rb +185 -0
  299. data/lib/aws/emr/request.rb +23 -0
  300. data/lib/aws/errors.rb +162 -0
  301. data/lib/aws/glacier.rb +80 -0
  302. data/lib/aws/glacier/archive.rb +56 -0
  303. data/lib/aws/glacier/archive_collection.rb +146 -0
  304. data/lib/aws/glacier/client.rb +286 -0
  305. data/lib/aws/glacier/config.rb +19 -0
  306. data/lib/aws/glacier/errors.rb +22 -0
  307. data/lib/aws/glacier/request.rb +34 -0
  308. data/lib/aws/glacier/resource.rb +30 -0
  309. data/lib/aws/glacier/vault.rb +145 -0
  310. data/lib/aws/glacier/vault_collection.rb +75 -0
  311. data/lib/aws/glacier/vault_notification_configuration.rb +29 -0
  312. data/lib/aws/iam.rb +420 -0
  313. data/lib/aws/iam/access_key.rb +180 -0
  314. data/lib/aws/iam/access_key_collection.rb +128 -0
  315. data/lib/aws/iam/account_alias_collection.rb +79 -0
  316. data/lib/aws/iam/client.rb +1092 -0
  317. data/lib/aws/iam/collection.rb +83 -0
  318. data/lib/aws/iam/config.rb +18 -0
  319. data/lib/aws/iam/errors.rb +22 -0
  320. data/lib/aws/iam/group.rb +111 -0
  321. data/lib/aws/iam/group_collection.rb +132 -0
  322. data/lib/aws/iam/group_policy_collection.rb +47 -0
  323. data/lib/aws/iam/group_user_collection.rb +84 -0
  324. data/lib/aws/iam/login_profile.rb +99 -0
  325. data/lib/aws/iam/mfa_device.rb +52 -0
  326. data/lib/aws/iam/mfa_device_collection.rb +127 -0
  327. data/lib/aws/iam/policy.rb +46 -0
  328. data/lib/aws/iam/policy_collection.rb +188 -0
  329. data/lib/aws/iam/request.rb +29 -0
  330. data/lib/aws/iam/resource.rb +62 -0
  331. data/lib/aws/iam/server_certificate.rb +141 -0
  332. data/lib/aws/iam/server_certificate_collection.rb +138 -0
  333. data/lib/aws/iam/signing_certificate.rb +169 -0
  334. data/lib/aws/iam/signing_certificate_collection.rb +131 -0
  335. data/lib/aws/iam/user.rb +205 -0
  336. data/lib/aws/iam/user_collection.rb +133 -0
  337. data/lib/aws/iam/user_group_collection.rb +98 -0
  338. data/lib/aws/iam/user_policy.rb +90 -0
  339. data/lib/aws/iam/user_policy_collection.rb +45 -0
  340. data/lib/aws/iam/virtual_mfa_device.rb +139 -0
  341. data/lib/aws/iam/virtual_mfa_device_collection.rb +73 -0
  342. data/lib/aws/import_export.rb +73 -0
  343. data/lib/aws/import_export/client.rb +109 -0
  344. data/lib/aws/import_export/config.rb +19 -0
  345. data/lib/aws/import_export/errors.rb +22 -0
  346. data/lib/aws/import_export/request.rb +23 -0
  347. data/lib/aws/ops_works.rb +30 -0
  348. data/lib/aws/ops_works/client.rb +713 -0
  349. data/lib/aws/ops_works/config.rb +18 -0
  350. data/lib/aws/ops_works/errors.rb +20 -0
  351. data/lib/aws/ops_works/request.rb +27 -0
  352. data/lib/aws/rails.rb +195 -0
  353. data/lib/aws/rds.rb +71 -0
  354. data/lib/aws/rds/client.rb +2228 -0
  355. data/lib/aws/rds/config.rb +18 -0
  356. data/lib/aws/rds/db_instance.rb +205 -0
  357. data/lib/aws/rds/db_instance_collection.rb +75 -0
  358. data/lib/aws/rds/db_snapshot.rb +163 -0
  359. data/lib/aws/rds/db_snapshot_collection.rb +89 -0
  360. data/lib/aws/rds/errors.rb +22 -0
  361. data/lib/aws/rds/request.rb +23 -0
  362. data/lib/aws/record.rb +116 -0
  363. data/lib/aws/record/abstract_base.rb +701 -0
  364. data/lib/aws/record/attributes.rb +384 -0
  365. data/lib/aws/record/conversion.rb +38 -0
  366. data/lib/aws/record/dirty_tracking.rb +285 -0
  367. data/lib/aws/record/errors.rb +143 -0
  368. data/lib/aws/record/exceptions.rb +48 -0
  369. data/lib/aws/record/hash_model.rb +161 -0
  370. data/lib/aws/record/hash_model/attributes.rb +197 -0
  371. data/lib/aws/record/hash_model/finder_methods.rb +172 -0
  372. data/lib/aws/record/hash_model/scope.rb +108 -0
  373. data/lib/aws/record/model.rb +427 -0
  374. data/lib/aws/record/model/attributes.rb +379 -0
  375. data/lib/aws/record/model/finder_methods.rb +232 -0
  376. data/lib/aws/record/model/scope.rb +213 -0
  377. data/lib/aws/record/naming.rb +31 -0
  378. data/lib/aws/record/scope.rb +199 -0
  379. data/lib/aws/record/validations.rb +712 -0
  380. data/lib/aws/record/validator.rb +246 -0
  381. data/lib/aws/record/validators/acceptance.rb +51 -0
  382. data/lib/aws/record/validators/block.rb +38 -0
  383. data/lib/aws/record/validators/confirmation.rb +43 -0
  384. data/lib/aws/record/validators/count.rb +108 -0
  385. data/lib/aws/record/validators/exclusion.rb +43 -0
  386. data/lib/aws/record/validators/format.rb +57 -0
  387. data/lib/aws/record/validators/inclusion.rb +56 -0
  388. data/lib/aws/record/validators/length.rb +107 -0
  389. data/lib/aws/record/validators/method.rb +33 -0
  390. data/lib/aws/record/validators/numericality.rb +138 -0
  391. data/lib/aws/record/validators/presence.rb +45 -0
  392. data/lib/aws/redshift.rb +52 -0
  393. data/lib/aws/redshift/client.rb +1291 -0
  394. data/lib/aws/redshift/config.rb +18 -0
  395. data/lib/aws/redshift/errors.rb +22 -0
  396. data/lib/aws/redshift/request.rb +29 -0
  397. data/lib/aws/route_53.rb +87 -0
  398. data/lib/aws/route_53/change_batch.rb +159 -0
  399. data/lib/aws/route_53/change_info.rb +72 -0
  400. data/lib/aws/route_53/client.rb +387 -0
  401. data/lib/aws/route_53/config.rb +18 -0
  402. data/lib/aws/route_53/errors.rb +22 -0
  403. data/lib/aws/route_53/hosted_zone.rb +111 -0
  404. data/lib/aws/route_53/hosted_zone_collection.rb +100 -0
  405. data/lib/aws/route_53/request.rb +23 -0
  406. data/lib/aws/route_53/resource_record_set.rb +237 -0
  407. data/lib/aws/route_53/resource_record_set_collection.rb +110 -0
  408. data/lib/aws/s3.rb +155 -0
  409. data/lib/aws/s3/access_control_list.rb +257 -0
  410. data/lib/aws/s3/acl_object.rb +264 -0
  411. data/lib/aws/s3/acl_options.rb +204 -0
  412. data/lib/aws/s3/bucket.rb +742 -0
  413. data/lib/aws/s3/bucket_collection.rb +160 -0
  414. data/lib/aws/s3/bucket_lifecycle_configuration.rb +458 -0
  415. data/lib/aws/s3/bucket_tag_collection.rb +109 -0
  416. data/lib/aws/s3/bucket_version_collection.rb +77 -0
  417. data/lib/aws/s3/cipher_io.rb +119 -0
  418. data/lib/aws/s3/client.rb +1700 -0
  419. data/lib/aws/s3/client/xml.rb +231 -0
  420. data/lib/aws/s3/config.rb +36 -0
  421. data/lib/aws/s3/cors_rule.rb +106 -0
  422. data/lib/aws/s3/cors_rule_collection.rb +192 -0
  423. data/lib/aws/s3/data_options.rb +185 -0
  424. data/lib/aws/s3/encryption_utils.rb +139 -0
  425. data/lib/aws/s3/errors.rb +94 -0
  426. data/lib/aws/s3/multipart_upload.rb +320 -0
  427. data/lib/aws/s3/multipart_upload_collection.rb +68 -0
  428. data/lib/aws/s3/object_collection.rb +355 -0
  429. data/lib/aws/s3/object_metadata.rb +96 -0
  430. data/lib/aws/s3/object_upload_collection.rb +77 -0
  431. data/lib/aws/s3/object_version.rb +148 -0
  432. data/lib/aws/s3/object_version_collection.rb +89 -0
  433. data/lib/aws/s3/paginated_collection.rb +75 -0
  434. data/lib/aws/s3/policy.rb +74 -0
  435. data/lib/aws/s3/prefix_and_delimiter_collection.rb +47 -0
  436. data/lib/aws/s3/prefixed_collection.rb +81 -0
  437. data/lib/aws/s3/presigned_post.rb +555 -0
  438. data/lib/aws/s3/request.rb +201 -0
  439. data/lib/aws/s3/s3_object.rb +1690 -0
  440. data/lib/aws/s3/tree.rb +118 -0
  441. data/lib/aws/s3/tree/branch_node.rb +68 -0
  442. data/lib/aws/s3/tree/child_collection.rb +104 -0
  443. data/lib/aws/s3/tree/leaf_node.rb +94 -0
  444. data/lib/aws/s3/tree/node.rb +22 -0
  445. data/lib/aws/s3/tree/parent.rb +87 -0
  446. data/lib/aws/s3/uploaded_part.rb +80 -0
  447. data/lib/aws/s3/uploaded_part_collection.rb +84 -0
  448. data/lib/aws/s3/website_configuration.rb +102 -0
  449. data/lib/aws/simple_db.rb +219 -0
  450. data/lib/aws/simple_db/attribute.rb +154 -0
  451. data/lib/aws/simple_db/attribute_collection.rb +231 -0
  452. data/lib/aws/simple_db/client.rb +287 -0
  453. data/lib/aws/simple_db/config.rb +20 -0
  454. data/lib/aws/simple_db/consistent_read_option.rb +42 -0
  455. data/lib/aws/simple_db/delete_attributes.rb +62 -0
  456. data/lib/aws/simple_db/domain.rb +121 -0
  457. data/lib/aws/simple_db/domain_collection.rb +86 -0
  458. data/lib/aws/simple_db/domain_metadata.rb +110 -0
  459. data/lib/aws/simple_db/errors.rb +55 -0
  460. data/lib/aws/simple_db/expect_condition_option.rb +45 -0
  461. data/lib/aws/simple_db/item.rb +93 -0
  462. data/lib/aws/simple_db/item_collection.rb +649 -0
  463. data/lib/aws/simple_db/item_data.rb +73 -0
  464. data/lib/aws/simple_db/put_attributes.rb +60 -0
  465. data/lib/aws/simple_db/request.rb +23 -0
  466. data/lib/aws/simple_email_service.rb +428 -0
  467. data/lib/aws/simple_email_service/client.rb +276 -0
  468. data/lib/aws/simple_email_service/config.rb +19 -0
  469. data/lib/aws/simple_email_service/email_address_collection.rb +69 -0
  470. data/lib/aws/simple_email_service/errors.rb +22 -0
  471. data/lib/aws/simple_email_service/identity.rb +209 -0
  472. data/lib/aws/simple_email_service/identity_collection.rb +81 -0
  473. data/lib/aws/simple_email_service/quotas.rb +64 -0
  474. data/lib/aws/simple_email_service/request.rb +27 -0
  475. data/lib/aws/simple_workflow.rb +228 -0
  476. data/lib/aws/simple_workflow/activity_task.rb +173 -0
  477. data/lib/aws/simple_workflow/activity_task_collection.rb +123 -0
  478. data/lib/aws/simple_workflow/activity_type.rb +131 -0
  479. data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
  480. data/lib/aws/simple_workflow/client.rb +1204 -0
  481. data/lib/aws/simple_workflow/config.rb +18 -0
  482. data/lib/aws/simple_workflow/count.rb +49 -0
  483. data/lib/aws/simple_workflow/decision_task.rb +603 -0
  484. data/lib/aws/simple_workflow/decision_task_collection.rb +225 -0
  485. data/lib/aws/simple_workflow/domain.rb +122 -0
  486. data/lib/aws/simple_workflow/domain_collection.rb +169 -0
  487. data/lib/aws/simple_workflow/errors.rb +20 -0
  488. data/lib/aws/simple_workflow/history_event.rb +276 -0
  489. data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
  490. data/lib/aws/simple_workflow/option_formatters.rb +82 -0
  491. data/lib/aws/simple_workflow/request.rb +33 -0
  492. data/lib/aws/simple_workflow/resource.rb +94 -0
  493. data/lib/aws/simple_workflow/type.rb +89 -0
  494. data/lib/aws/simple_workflow/type_collection.rb +140 -0
  495. data/lib/aws/simple_workflow/workflow_execution.rb +386 -0
  496. data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
  497. data/lib/aws/simple_workflow/workflow_type.rb +177 -0
  498. data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
  499. data/lib/aws/sns.rb +76 -0
  500. data/lib/aws/sns/client.rb +266 -0
  501. data/lib/aws/sns/config.rb +18 -0
  502. data/lib/aws/sns/errors.rb +22 -0
  503. data/lib/aws/sns/has_delivery_policy.rb +68 -0
  504. data/lib/aws/sns/policy.rb +47 -0
  505. data/lib/aws/sns/request.rb +23 -0
  506. data/lib/aws/sns/subscription.rb +144 -0
  507. data/lib/aws/sns/subscription_collection.rb +78 -0
  508. data/lib/aws/sns/topic.rb +403 -0
  509. data/lib/aws/sns/topic_collection.rb +62 -0
  510. data/lib/aws/sns/topic_subscription_collection.rb +54 -0
  511. data/lib/aws/sqs.rb +81 -0
  512. data/lib/aws/sqs/client.rb +258 -0
  513. data/lib/aws/sqs/config.rb +18 -0
  514. data/lib/aws/sqs/errors.rb +101 -0
  515. data/lib/aws/sqs/policy.rb +48 -0
  516. data/lib/aws/sqs/queue.rb +764 -0
  517. data/lib/aws/sqs/queue_collection.rb +174 -0
  518. data/lib/aws/sqs/received_message.rb +181 -0
  519. data/lib/aws/sqs/received_sns_message.rb +116 -0
  520. data/lib/aws/sqs/request.rb +67 -0
  521. data/lib/aws/storage_gateway.rb +73 -0
  522. data/lib/aws/storage_gateway/client.rb +472 -0
  523. data/lib/aws/storage_gateway/config.rb +18 -0
  524. data/lib/aws/storage_gateway/errors.rb +22 -0
  525. data/lib/aws/storage_gateway/request.rb +28 -0
  526. data/lib/aws/sts.rb +163 -0
  527. data/lib/aws/sts/client.rb +157 -0
  528. data/lib/aws/sts/config.rb +18 -0
  529. data/lib/aws/sts/errors.rb +22 -0
  530. data/lib/aws/sts/federated_session.rb +56 -0
  531. data/lib/aws/sts/policy.rb +30 -0
  532. data/lib/aws/sts/request.rb +29 -0
  533. data/lib/aws/sts/session.rb +48 -0
  534. data/lib/aws/version.rb +18 -0
  535. data/lib/net/http/connection_pool.rb +226 -0
  536. data/lib/net/http/connection_pool/connection.rb +189 -0
  537. data/lib/net/http/connection_pool/session.rb +126 -0
  538. data/rails/init.rb +15 -0
  539. metadata +632 -0
@@ -0,0 +1,213 @@
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
+ module AWS
15
+ module Record
16
+ class Model
17
+
18
+ # The primary interface for finding records with {AWS::Record::Model}.
19
+ #
20
+ # == Getting a Scope Object
21
+ #
22
+ # You should normally never need to construct a Scope object directly.
23
+ # Scope objects are returned from the AWS::Record::Model finder methods
24
+ # (e.g. +shard+, +where+, +order+, +limit+, etc).
25
+ #
26
+ # books = Book.where(:author => 'John Doe')
27
+ # books.class #=> AWS::Record::Scope, not Array
28
+ #
29
+ # Scopes are also returned from methods defined with the +scope+ method.
30
+ #
31
+ # == Chaining Scopes
32
+ #
33
+ # Scope objects represent a request, but do not actualy make a request
34
+ # until required. This allows you to chain requests
35
+ #
36
+ # # no request made by the following 2 statements
37
+ # books = Book.where(:author => 'John Doe')
38
+ # books = books.limit(10)
39
+ #
40
+ # books.each do |book|
41
+ # # yields up to 10 books
42
+ # end
43
+ #
44
+ # Each of the following methods returns a scope that can be chained.
45
+ #
46
+ # * {#shard}
47
+ # * {#where}
48
+ # * {#order}
49
+ # * {#limit}
50
+ #
51
+ # == Terminating Scopes
52
+ #
53
+ # To terminate a scope you can enumerate it or call #first.
54
+ #
55
+ # # terminate a scope by enumerating
56
+ # Book.limit(10).each {|book| ... }
57
+ #
58
+ # # terminate a scope by getting the first value
59
+ # Book.where('author' => 'John Doe').first
60
+ #
61
+ class Scope < Record::Scope
62
+
63
+ # @private
64
+ def initialize base_class, options = {}
65
+ super
66
+ @options[:where] ||= []
67
+ end
68
+
69
+ def new attributes = {}
70
+
71
+ attributes = attributes.dup
72
+
73
+ @options[:where].each do |conditions|
74
+ if conditions.size == 1 and conditions.first.is_a?(Hash)
75
+ attributes.merge!(conditions.first)
76
+ end
77
+ end
78
+
79
+ super(attributes)
80
+
81
+ end
82
+
83
+ # Applies conditions to the scope that limit which records are returned.
84
+ # Only those matching all given conditions will be returned.
85
+ #
86
+ # @overload where(conditions_hash)
87
+ # Specify a hash of conditions to query with. Multiple conditions
88
+ # are joined together with AND.
89
+ #
90
+ # Book.where(:author => 'John Doe', :softcover => true)
91
+ # # where `author` = `John Doe` AND `softcover` = `1`
92
+ #
93
+ # @param [Hash] conditions
94
+ #
95
+ # @overload where(conditions_string, *values)
96
+ # A sql-like query fragment with optional placeholders and values.
97
+ # Placeholders are replaced with properly quoted values.
98
+ #
99
+ # Book.where('author = ?', 'John Doe')
100
+ #
101
+ # @param [String] conditions_string A sql-like where string with
102
+ # question mark placeholders. For each placeholder there should
103
+ # be a value that will be quoted into that position.
104
+ # @param [String] *values A value that should be quoted into the
105
+ # corresponding (by position) placeholder.
106
+ #
107
+ # @return [Scope] Returns a new scope with the passed conditions applied.
108
+ def where *conditions
109
+ if conditions.empty?
110
+ raise ArgumentError, 'missing required condition'
111
+ end
112
+ _with(:where => @options[:where] + [conditions])
113
+ end
114
+
115
+ # Specifies how to sort records returned.
116
+ #
117
+ # # enumerate books, starting with the most recently published ones
118
+ # Book.order(:published_at, :desc).each do |book|
119
+ # # ...
120
+ # end
121
+ #
122
+ # Only one order may be applied. If order is specified more than
123
+ # once the last one in the chain takes precedence:
124
+ #
125
+ #
126
+ # # books returned by this scope will be ordered by :published_at
127
+ # # and not :author.
128
+ # Book.where(:read => false).order(:author).order(:published_at)
129
+ #
130
+ # @param [String,Symbol] attribute_name The attribute to sort by.
131
+ # @param [:asc, :desc] order (:asc) The direct to sort.
132
+ def order attribute_name, order = :asc
133
+ _with(:order => [attribute_name, order])
134
+ end
135
+
136
+ # @private
137
+ private
138
+ def _each_object &block
139
+
140
+ items = _item_collection
141
+
142
+ items.select.each do |item_data|
143
+ obj = base_class.new(:shard => _shard)
144
+ obj.send(:hydrate, item_data.name, item_data.attributes)
145
+ yield(obj)
146
+ end
147
+
148
+ end
149
+
150
+ # Merges another scope with this scope. Conditions are added together
151
+ # and the limit and order parts replace those in this scope (if set).
152
+ # @param [Scope] scope A scope to merge with this one.
153
+ # @return [Scope] Returns a new scope with merged conditions and
154
+ # overriden order and limit.
155
+ # @private
156
+ private
157
+ def _merge_scope scope
158
+ merged = self
159
+ scope.instance_variable_get('@options').each_pair do |opt_name,opt_value|
160
+ unless [nil, []].include?(opt_value)
161
+ if opt_name == :where
162
+ opt_value.each do |condition|
163
+ merged = merged.where(*condition)
164
+ end
165
+ else
166
+ merged = merged.send(opt_name, *opt_value)
167
+ end
168
+ end
169
+ end
170
+ merged
171
+ end
172
+
173
+ # Consumes a hash of options (e.g. +:where+, +:order+ and +:limit+) and
174
+ # builds them onto the current scope, returning a new one.
175
+ # @param [Hash] options
176
+ # @option options :where
177
+ # @option options :order
178
+ # @option options [Integer] :limit
179
+ # @return [Scope] Returns a new scope with the hash of scope
180
+ # options applied.
181
+ # @private
182
+ private
183
+ def _handle_options options
184
+ scope = self
185
+ options.each_pair do |method, args|
186
+ if method == :where and args.is_a?(Hash)
187
+ # splatting a hash turns it into an array, bad juju
188
+ scope = scope.send(method, args)
189
+ else
190
+ scope = scope.send(method, *args)
191
+ end
192
+ end
193
+ scope
194
+ end
195
+
196
+ # Converts this scope object into an AWS::SimpleDB::ItemCollection
197
+ # @return [SimpleDB::ItemCollection]
198
+ # @private
199
+ private
200
+ def _item_collection
201
+ items = base_class.sdb_domain(_shard).items
202
+ items = items.order(*@options[:order]) if @options[:order]
203
+ items = items.limit(*@options[:limit]) if @options[:limit]
204
+ @options[:where].each do |where_condition|
205
+ items = items.where(*where_condition)
206
+ end
207
+ items
208
+ end
209
+
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,31 @@
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
+ module AWS
15
+ module Record
16
+
17
+ # @private
18
+ module Naming
19
+
20
+ # This method should only ever get called in a Rails 3+ context
21
+ # where active model and active support have been loaded. Rails 2
22
+ # does not call model name on object.
23
+ # @private
24
+ def model_name
25
+ @_model_name ||=
26
+ ActiveModel::Name.new(self.kind_of?(Class) ? self : self.class)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,199 @@
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
+ module AWS
15
+ module Record
16
+
17
+ # Base class for {AWS::Record::Model::Scope} and
18
+ # {AWS::Record::HashModel::Scope}.
19
+ class Scope
20
+
21
+ include Enumerable
22
+
23
+ # @param base_class A class that extends {AWS::Record::AbstractBase}.
24
+ # @param [Hash] options
25
+ # @option options :
26
+ # @private
27
+ def initialize base_class, options = {}
28
+
29
+ @base_class = base_class
30
+
31
+ @options = options.dup
32
+
33
+ # backwards compat
34
+ @options[:shard] = @options.delete(:domain) if @options[:domain]
35
+
36
+ end
37
+
38
+ # @return [Class] Returns the AWS::Record::Model extending class that
39
+ # this scope will find records for.
40
+ attr_reader :base_class
41
+
42
+ def new attributes = {}
43
+
44
+ attributes = attributes.dup
45
+ attributes[:shard] ||= attributes.delete(:shard)
46
+ attributes[:shard] ||= attributes.delete('shard')
47
+ # for backwards compatability, domain is accepted
48
+ attributes[:shard] ||= attributes.delete('domain')
49
+ attributes[:shard] ||= attributes.delete(:domain)
50
+ attributes[:shard] ||= _shard
51
+
52
+ base_class.new(attributes)
53
+
54
+ end
55
+ alias_method :build, :new
56
+
57
+ # @param [String] shard_name
58
+ # @return [Scope] Returns a scope that specifies which shard
59
+ # (i.e. SimpleDB domain) should be used.
60
+ def shard shard_name
61
+ _with(:shard => shard_name)
62
+ end
63
+ alias_method :domain, :shard
64
+
65
+ # @overload find(id)
66
+ # Finds and returns a single record by id. If no record is found
67
+ # with the given +id+, then a RecordNotFound error will be raised.
68
+ # @param [String] id ID of the record to find.
69
+ # @return Returns the record.
70
+ #
71
+ # @overload find(:first, options = {})
72
+ # Returns the first record found. If no records were matched then
73
+ # nil will be returned (raises no exceptions).
74
+ # @param [Symbol] mode (:first)
75
+ # @return [Object,nil] Returns the first record or nil if no
76
+ # records matched the conditions.
77
+ #
78
+ # @overload find(:all, options = {})
79
+ # Returns an enumerable Scope object that represents all matching
80
+ # records. No request is made to AWS until the scope is enumerated.
81
+ #
82
+ # Book.find(:all, :limit => 100).each do |book|
83
+ # # ...
84
+ # end
85
+ #
86
+ # @param [Symbol] mode (:all)
87
+ # @return [Scope] Returns an enumerable scope object.
88
+ #
89
+ def find id_or_mode, options = {}
90
+
91
+ scope = _handle_options(options)
92
+
93
+ case
94
+ when id_or_mode == :all then scope
95
+ when id_or_mode == :first then scope.limit(1).to_a.first
96
+ else
97
+ base_class.find_by_id(id_or_mode, :shard => scope._shard)
98
+ end
99
+
100
+ end
101
+
102
+ # @return [Integer] Returns the number of records that match the
103
+ # current scoped finder.
104
+ def count options = {}
105
+ if scope = _handle_options(options) and scope != self
106
+ scope.count
107
+ else
108
+ _item_collection.count
109
+ end
110
+ end
111
+ alias_method :size, :count
112
+
113
+ # @return Returns the first record found, returns
114
+ # nil if the domain/table is empty.
115
+ def first options = {}
116
+ _handle_options(options).find(:first)
117
+ end
118
+
119
+ # Limits the maximum number of total records to return when finding
120
+ # or counting. Returns a scope, does not make a request.
121
+ #
122
+ # books = Book.limit(100)
123
+ #
124
+ # @param [Integer] limit The maximum number of records to return.
125
+ # @return [Scope] Returns a new scope that has the applied limit.
126
+ def limit limit
127
+ _with(:limit => limit)
128
+ end
129
+
130
+ # Yields once for each record matching the request made by this scope.
131
+ #
132
+ # books = Book.where(:author => 'me').order(:price, :asc).limit(10)
133
+ #
134
+ # books.each do |book|
135
+ # puts book.attributes.to_yaml
136
+ # end
137
+ #
138
+ # @yieldparam [Object] record
139
+ def each &block
140
+ if block_given?
141
+ _each_object(&block)
142
+ else
143
+ to_enum(:"_each_object")
144
+ end
145
+ end
146
+
147
+ protected
148
+ def _shard
149
+ @options[:shard] || base_class.shard_name
150
+ end
151
+ alias_method :domain, :shard
152
+
153
+ # @private
154
+ private
155
+ def _each_object &block
156
+ raise NotImplementedError
157
+ end
158
+
159
+ # @private
160
+ private
161
+ def _with options
162
+ self.class.new(base_class, @options.merge(options))
163
+ end
164
+
165
+ # @private
166
+ private
167
+ def method_missing scope_name, *args
168
+ # @todo only proxy named scope methods
169
+ _merge_scope(base_class.send(scope_name, *args))
170
+ end
171
+
172
+ # Merges the one scope with the current scope, returning a 3rd.
173
+ # @param [Scope] scope
174
+ # @return [Scope]
175
+ # @private
176
+ private
177
+ def _merge_scope scope
178
+ raise NotImplementedError
179
+ end
180
+
181
+ # Consumes a hash of options (e.g. +:shard+, +:limit) and returns
182
+ # a new scope with those applied.
183
+ # @return [Scope]
184
+ # @private
185
+ private
186
+ def _handle_options options
187
+ raise NotImplementedError
188
+ end
189
+
190
+ # @private
191
+ private
192
+ def _item_collection
193
+ raise NotImplementedError
194
+ end
195
+
196
+ end
197
+
198
+ end
199
+ end
@@ -0,0 +1,712 @@
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 'aws/record/validators/acceptance'
15
+ require 'aws/record/validators/block'
16
+ require 'aws/record/validators/confirmation'
17
+ require 'aws/record/validators/count'
18
+ require 'aws/record/validators/exclusion'
19
+ require 'aws/record/validators/format'
20
+ require 'aws/record/validators/inclusion'
21
+ require 'aws/record/validators/length'
22
+ require 'aws/record/validators/numericality'
23
+ require 'aws/record/validators/presence'
24
+ require 'aws/record/validators/method'
25
+
26
+ module AWS
27
+ module Record
28
+
29
+ # Validation methods to be used with subclasses of AWS::Record::Model.
30
+ #
31
+ # = General Usage
32
+ #
33
+ # All standard validation methods follow the same basic usage.
34
+ # Call the validation method followed by one more attribute names
35
+ # and then an optional hash of modifiers.
36
+ #
37
+ # class Book < AWS::Record::Model
38
+ #
39
+ # # ...
40
+ #
41
+ # validates_presence_of :title, :author
42
+ #
43
+ # validates_length_of :summary,
44
+ # :max => 500,
45
+ # :allow_nil => true,
46
+ # :allow_blank => true
47
+ #
48
+ # end
49
+ #
50
+ # = Conditional Validations
51
+ #
52
+ # Sometimes you only want to validate an attribute under certain
53
+ # conditions. To make this simple, all validation methods accept the
54
+ # following 3 options:
55
+ #
56
+ # * +:on+
57
+ # * +:if+
58
+ # * +:unless+
59
+ #
60
+ # You may mix and match all 3 of the above options.
61
+ #
62
+ # === Validate on :create or :update
63
+ #
64
+ # By default validations are run on create and update, but you can
65
+ # specify them to run for only create (initial save) or updates.
66
+ #
67
+ # validates_presence_of :created_at, :on => :create
68
+ #
69
+ # validates_presence_of :updated_at, :on => :update
70
+ #
71
+ # === Validate :if or :unless
72
+ #
73
+ # Sometimes you have more complex requirements to determine if/when a
74
+ # validation should run. +:if+ and +:unless+: both accept either
75
+ # a method name or proc.
76
+ #
77
+ # class Person
78
+ #
79
+ # # ...
80
+ #
81
+ # validates_presence_of :job_title, :if => :employee?
82
+ #
83
+ # validates_presence_of :nickname, :if => lambda {|person|
84
+ # person.is_family? or person.is_friend? }
85
+ #
86
+ # end
87
+ #
88
+ # = Validating Virtual (Non-persisted) Attributes
89
+ #
90
+ # All of the validators can be used with configured attributes, but they
91
+ # can also be used with any attribute that has a setter and a getter.
92
+ #
93
+ # Class Book < AWS::Record::Model
94
+ #
95
+ # attr_accessor :title
96
+ #
97
+ # validates_presence_of :title
98
+ #
99
+ # end
100
+ #
101
+ module Validations
102
+
103
+ def self.extended base
104
+
105
+ base.send(:define_method, :run_validations) do
106
+ errors.clear!
107
+ self.class.send(:validators).each do |validator|
108
+ validator.validate(self)
109
+ end
110
+ end
111
+
112
+ base.send(:private, :run_validations)
113
+
114
+ end
115
+
116
+ # Registers a validation method.
117
+ #
118
+ # validate :ensure_age_is_greater_than_shoe_size
119
+ #
120
+ # def ensure_age_is_greater_than_shoe_size
121
+ # unless age > shoe_size
122
+ # errors.add(:age, 'should be greater than your shoe size')
123
+ # end
124
+ # end
125
+ #
126
+ # You can also pass a list of method names that should be called during
127
+ # validation.
128
+ #
129
+ # validate :some_complex_validation, :some_other_validation
130
+ #
131
+ # As with most other validation methods you can also pass a hash of
132
+ # options that affect when the named validation methods get called.
133
+ #
134
+ # validate :my_custom_validation, :unless => :new_record?
135
+ #
136
+ # @overload validate(*method_names, options = {})
137
+ # @param [Array<Symbol>] method_names A list of methods to call
138
+ # during validation.
139
+ # @param [Hash] options
140
+ # @option options [Symbol] :on (:save) When this validation is run.
141
+ # Valid values include:
142
+ # * +:save+
143
+ # * +:create+
144
+ # * +:update+
145
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
146
+ # to call. The validation will only be run if the return value is
147
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
148
+ # +:if => lambda{|book| book.in_stock? }+).
149
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
150
+ # proc to call. The validation will *not* be run if the return value
151
+ # is of the method/proc is false.
152
+ def validate *args
153
+ validators << MethodValidator.new(self, *args)
154
+ end
155
+
156
+ # This validation method is primariliy intended for ensuring a form
157
+ # checkbox (like an EULA agreement or terms of service acknowledgement)
158
+ # is checked.
159
+ #
160
+ # class User < AWS::Record::Model
161
+ # boolean_attr :terms_of_service
162
+ # validates_acceptance_of :terms_of_service
163
+ # end
164
+ #
165
+ # === Virtual Attributes
166
+ #
167
+ # If you choose to validate the acceptance of a non-existant attribute
168
+ # then a setter and a getter will be added automtically for you.
169
+ #
170
+ # class User < AWS::Record::Model
171
+ # validates_acceptance_of :terms_of_service
172
+ # end
173
+ #
174
+ # user = User.new
175
+ # user.respond_to?(:terms_of_service) #=> true
176
+ # user.respond_to?(:terms_of_service=) #=> true
177
+ #
178
+ # === Accepted Values
179
+ #
180
+ # The default behavior for +validates_acceptance_of+ is to add
181
+ # an error when the value is '1' or +true+. Also note, this validation
182
+ # method defaults +:allow_nil+ to true.
183
+ #
184
+ # * +nil+ implies the field was omitted from the form and therefore
185
+ # should not be validated
186
+ #
187
+ # class User < AWS::Record::Model
188
+ # validates_acceptance_of :terms_of_service
189
+ # end
190
+ #
191
+ # u = User.new
192
+ # u.terms_of_service #=> nil
193
+ # u.valid? #=> true
194
+ #
195
+ # * '1' is the default value for most checkbox form helpers, and #
196
+ # therefore indicates an accepted value.
197
+ #
198
+ # * +true+ is how boolean attributes typecast '1'. This is helpful
199
+ # when you have your checkbox post its value to a +:boolean_attr+.
200
+ #
201
+ # === Multi-Valued Attributes
202
+ #
203
+ # This validator works only with single-valued attributes. If you need
204
+ # to validate that all of the values in a set are true, then use
205
+ # {#validates_inclusion_of}.
206
+ #
207
+ # @note Most validators default :allow_nil to false, this one defaults to true
208
+ # @note This validator should not be used with multi-valued attributes
209
+ #
210
+ # @overload validates_acceptance_of(*attributes, options = {}, &block)
211
+ # @param attributes A list of attribute names to validate.
212
+ # @param [Hash] options
213
+ # @option options [mixed] :accpet Specify an additional accepted value.
214
+ #
215
+ # validates_acceptance_of :agree, :accept => 'yes'
216
+ #
217
+ # @option options [String] :message A custom error message. The default
218
+ # +:message+ is "must be accepted".
219
+ # @option options [Boolean] :allow_nil (true) Skip validation if the
220
+ # attribute value is +nil+.
221
+ # @option options [Boolean] :allow_blank (true) Skip validation if the
222
+ # attribute value is +blank+.
223
+ # @option options [Symbol] :on (:save) When this validation is run.
224
+ # Valid values include:
225
+ # * +:save+
226
+ # * +:create+
227
+ # * +:update+
228
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
229
+ # to call. The validation will only be run if the return value is
230
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
231
+ # +:if => lambda{|book| book.in_stock? }+).
232
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
233
+ # proc to call. The validation will *not* be run if the return value
234
+ # is of the method/proc is false.
235
+ def validates_acceptance_of *args
236
+ validators << AcceptanceValidator.new(self, *args)
237
+ end
238
+
239
+ # Intended primarily for validating a form field was entered correctly
240
+ # by requiring it twice:
241
+ #
242
+ # Model:
243
+ # class User < AWS::Record::Model
244
+ # validates_confirmation_of :password, :if => :password_changed?
245
+ # end
246
+ #
247
+ # View:
248
+ # <%= password_field "user", "password" %>
249
+ # <%= password_field "user", "password_confirmation" %>
250
+ #
251
+ # === Confirmation Value Accessors
252
+ #
253
+ # If your model does not have accessors for the confirmation value
254
+ # then they will be automatically added. In the example above
255
+ # the user class would have an +attr_accessor+ for
256
+ # +:password_confirmation+.
257
+ #
258
+ # === Conditional Validation
259
+ #
260
+ # Mostly commonly you only need to validate confirmation of an
261
+ # attribute when it has changed. It is therefore suggested to
262
+ # pass an +:if+ condition reflecting this:
263
+ #
264
+ # validates_confirmation_of :password, :if => :password_changed?
265
+ #
266
+ # === Multi-Valued Attributes
267
+ #
268
+ # This validator works only with single-valued attributes.
269
+ # It should not be used on attributes that have array or set values.
270
+ #
271
+ # @note This validation method does not accept the +:allow_nil+ or the
272
+ # +:allow_blank+ options.
273
+ #
274
+ # @overload validates_confirmation_of(*attributes, options = {}, &block)
275
+ # @param attributes A list of attribute names to validate.
276
+ # @param [Hash] options
277
+ # @option options [String] :message A custom error message. The default
278
+ # +:message+ is "doesn't match confirmation".
279
+ # @option options [Symbol] :on (:save) When this validation is run.
280
+ # Valid values include:
281
+ # * +:save+
282
+ # * +:create+
283
+ # * +:update+
284
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
285
+ # to call. The validation will only be run if the return value is
286
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
287
+ # +:if => lambda{|book| book.in_stock? }+).
288
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
289
+ # proc to call. The validation will *not* be run if the return value
290
+ # is of the method/proc is false.
291
+ def validates_confirmation_of *args
292
+ validators << ConfirmationValidator.new(self, *args)
293
+ end
294
+
295
+ # Validates the number of values for a given attribute.
296
+ #
297
+ # === Length vs Count
298
+ #
299
+ # +validates_count_of+ validates the number of attribute values,
300
+ # whereas +validates_length_of: validates the length of each
301
+ # attribute value instead.
302
+ #
303
+ # If you need to ensure each attribute value is a given length see
304
+ # {#validates_length_of} instead.
305
+ #
306
+ # === Examples
307
+ #
308
+ # You can validate there are a certain number of values:
309
+ #
310
+ # validates_count_of :parents, :exactly => 2
311
+ #
312
+ # You can also specify a range:
313
+ #
314
+ # validates_count_of :tags, :within => (2..10)
315
+ #
316
+ # You can also specify min and max value seperately:
317
+ #
318
+ # validates_count_of :tags, :minimum => 2, :maximum => 10
319
+ #
320
+ # === +nil+ Values
321
+ #
322
+ # If you are validating an array or set that contains +nil+ values,
323
+ # the +nil+ values are counted normally as 1 each.
324
+ #
325
+ # If you are validating a non-enuemrable attribute that only
326
+ # contains a single nil or other scalar value, then nil is
327
+ # counted as 0.
328
+ #
329
+ # === Singular Attributes
330
+ #
331
+ # This validator is intended to for validating attributes that have
332
+ # an array or set of values. If used on an attribute that
333
+ # returns a scalar value (like +nil+ or a string), the count will
334
+ # always be 0 (for +nil+) or 1 (for everything else).
335
+ #
336
+ # It is therefore recomended to use +:validates_presence_of+ in
337
+ # place of +:validates_count_of+ when working with single-valued
338
+ # attributes.
339
+ #
340
+ # @overload validates_count_of(*attributes, options = {}, &block)
341
+ # @param attributes A list of attribute names to validate.
342
+ # @param [Hash] options
343
+ # @option options [Integer] :exactly The exact number of values the
344
+ # attribute should have. If this validation option fails the
345
+ # error message specified by +:wrong_number+ will be added.
346
+ # @option options [Range] :within An range of number of values to
347
+ # accept. If the attribute has a number of values outside this range
348
+ # then the +:too_many+ or +:too_few+ error message will be added.
349
+ # @option options [Integer] :minimum The minimum number of values
350
+ # the attribute should have. If it has fewer, the +:too_few+ error
351
+ # message will be added.
352
+ # @option options [Integer] :maximum The maximum number of values
353
+ # the attribute should have. If it has more, the +:too_many+ error
354
+ # message will be added.
355
+ # @option options [String] :too_many An error message added
356
+ # when the attribute has too many values. Defaults to
357
+ # <code>"has too many values (maximum is %{maximum})"</code>
358
+ # @option options [String] :too_few An error message added
359
+ # when the attribute has too few values. Defaults to
360
+ # <code>"has too few values (minimum is %{minimum})"</code>
361
+ # @option options [String] :wrong_number An error message
362
+ # added when the number of attribute values does not match
363
+ # the +:exactly+ option. Defaults to <code>"has the wrong
364
+ # number of values (should have exactly %{exactly}"</code>
365
+ # @option options [Symbol] :on (:save) When this validation is run.
366
+ # Valid values include:
367
+ # * +:save+
368
+ # * +:create+
369
+ # * +:update+
370
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
371
+ # to call. The validation will only be run if the return value is
372
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
373
+ # +:if => lambda{|book| book.in_stock? }+).
374
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
375
+ # proc to call. The validation will *not* be run if the return value
376
+ # is of the method/proc is false.
377
+ def validates_count_of *args
378
+ validators << CountValidator.new(self, *args)
379
+ end
380
+
381
+ # Adds a block validator that is called during record validation.
382
+ #
383
+ # class ExampleClass < AWS::Record::Model
384
+ #
385
+ # string_attr :name
386
+ #
387
+ # validates_each(:name) do |record, attribute_name, value|
388
+ # if value == 'John Doe'
389
+ # record.errors.add(attr_name, 'may not be an alias')
390
+ # end
391
+ # end
392
+ #
393
+ # end
394
+ #
395
+ # @overload validates_each(*attributes, options = {}, &block)
396
+ # @param attributes A list of attribute names to validate.
397
+ # @param [Hash] options
398
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
399
+ # attribute value is +nil+.
400
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
401
+ # attribute value is +blank+.
402
+ # @option options [Symbol] :on (:save) When this validation is run.
403
+ # Valid values include:
404
+ # * +:save+
405
+ # * +:create+
406
+ # * +:update+
407
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
408
+ # to call. The validation will only be run if the return value is
409
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
410
+ # +:if => lambda{|book| book.in_stock? }+).
411
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
412
+ # proc to call. The validation will *not* be run if the return value
413
+ # is of the method/proc is false.
414
+ def validates_each *attributes, &block
415
+ unless block_given?
416
+ raise ArgumentError, 'missing required block for validates_each'
417
+ end
418
+ validators << BlockValidator.new(self, *attributes, &block)
419
+ end
420
+
421
+ # Validates that the attribute value is not included in the given
422
+ # enumerable.
423
+ #
424
+ # validates_exlusion_of :username, :in => %w(admin administrator)
425
+ #
426
+ # === Multi-Valued Attributes
427
+ #
428
+ # You may use this with multi-valued attributes the same way you use it
429
+ # with single-valued attributes:
430
+ #
431
+ # class Product < AWS::Record::Model
432
+ #
433
+ # string_attr :tags, :set => true
434
+ #
435
+ # validates_exlusion_of :tags, :in => four_letter_words
436
+ #
437
+ # end
438
+ #
439
+ # @overload validates_exclusion_of(*attributes, options = {}, &block)
440
+ # @param attributes A list of attribute names to validate.
441
+ # @param [Hash] options
442
+ # @option options [required, Enumerable] :in An enumerable object to
443
+ # ensure the value is not in.
444
+ # @option options [String] :message A custom error message. The default
445
+ # +:message+ is "is reserved".
446
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
447
+ # attribute value is +nil+.
448
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
449
+ # attribute value is +blank+.
450
+ # @option options [Symbol] :on (:save) When this validation is run.
451
+ # Valid values include:
452
+ # * +:save+
453
+ # * +:create+
454
+ # * +:update+
455
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
456
+ # to call. The validation will only be run if the return value is
457
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
458
+ # +:if => lambda{|book| book.in_stock? }+).
459
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
460
+ # proc to call. The validation will *not* be run if the return value
461
+ # is of the method/proc is false.
462
+ def validates_exclusion_of *args
463
+ validators << ExclusionValidator.new(self, *args)
464
+ end
465
+
466
+ # Validates the attribute's value matches the given regular exression.
467
+ #
468
+ # validates_format_of :year, :with => /^\d{4}$/
469
+ #
470
+ # You can also perform a not-match using +:without+ instead of +:with+.
471
+ #
472
+ # validates_format_of :username, :without => /\d/
473
+ #
474
+ # === Multi-Valued Attributes
475
+ #
476
+ # You may use this with multi-valued attributes the same way you use it
477
+ # with single-valued attributes:
478
+ #
479
+ # class Product < AWS::Record::Model
480
+ #
481
+ # string_attr :tags, :set => true
482
+ #
483
+ # validates_format_of :tags, :with => /^\w{2,10}$/
484
+ #
485
+ # end
486
+ #
487
+ # @overload validates_format_of(*attributes, options = {}, &block)
488
+ # @param attributes A list of attribute names to validate.
489
+ # @param [Hash] options
490
+ # @option options [Regexp] :with If the value matches the given
491
+ # regex, an error will not be added.
492
+ # @option options [Regexp] :without If the value matches the given
493
+ # regex, an error will be added.
494
+ # must match, or an error is added.
495
+ # @option options [String] :message A custom error message. The default
496
+ # +:message+ is "is reserved".
497
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
498
+ # attribute value is +nil+.
499
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
500
+ # attribute value is +blank+.
501
+ # @option options [Symbol] :on (:save) When this validation is run.
502
+ # Valid values include:
503
+ # * +:save+
504
+ # * +:create+
505
+ # * +:update+
506
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
507
+ # to call. The validation will only be run if the return value is
508
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
509
+ # +:if => lambda{|book| book.in_stock? }+).
510
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
511
+ # proc to call. The validation will *not* be run if the return value
512
+ # is of the method/proc is false.
513
+ def validates_format_of *args
514
+ validators << FormatValidator.new(self, *args)
515
+ end
516
+
517
+ # Validates that the attribute value is included in the given enumerable
518
+ # object.
519
+ #
520
+ # class MultipleChoiceAnswer < AWS::Record::Model
521
+ # validates_inclusion_of :letter, :in => %w(a b c d e)
522
+ # end
523
+ #
524
+ # === Multi-Valued Attributes
525
+ #
526
+ # You may use this with multi-valued attributes the same way you use it
527
+ # with single-valued attributes.
528
+ #
529
+ # @overload validates_inclusion_of(*attributes, options = {}, &block)
530
+ # @param attributes A list of attribute names to validate.
531
+ # @param [Hash] options
532
+ # @option options [required, Enumerable] :in An enumerable object to
533
+ # check for the value in.
534
+ # @option options [String] :message A custom error message. The default
535
+ # +:message+ is "is not included in the list".
536
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
537
+ # attribute value is +nil+.
538
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
539
+ # attribute value is +blank+.
540
+ # @option options [Symbol] :on (:save) When this validation is run.
541
+ # Valid values include:
542
+ # * +:save+
543
+ # * +:create+
544
+ # * +:update+
545
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
546
+ # to call. The validation will only be run if the return value is
547
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
548
+ # +:if => lambda{|book| book.in_stock? }+).
549
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
550
+ # proc to call. The validation will *not* be run if the return value
551
+ # is of the method/proc is false.
552
+ def validates_inclusion_of *attributes
553
+ validators << InclusionValidator.new(self, *attributes)
554
+ end
555
+
556
+ # Validates the attribute values are of a specified length.
557
+ #
558
+ # validates_lenth_of :username, :within => 3..25
559
+ #
560
+ # === Length vs Count
561
+ #
562
+ # +validates_length_of+ validates the length of individual attribute
563
+ # values, whereas +validates_count_of: validates the number of
564
+ # attribute values.
565
+ #
566
+ # If you need to ensure there are certain number of values see
567
+ # {#validates_count_of} instead.
568
+ #
569
+ # @overload validates_length_of(*attributes, options = {}, &block)
570
+ # @param attributes A list of attribute names to validate.
571
+ # @param [Hash] options
572
+ # @option options [Enumerable] :within An enumerable object to
573
+ # ensure the length of the value falls within.
574
+ # @option options [Integer] :exactly The exact length a value must be.
575
+ # If this validation fails the error message specified by
576
+ # +:wrong_length+ will be added.
577
+ # @option options [Range] :within An enumerable object which must
578
+ # include the length of the attribute, or an error will be added.
579
+ # If the attribute has a length outside the range then the
580
+ # +:too_long+ or +:too_short+ error message will be added.
581
+ # @option options [Integer] :minimum The minimum length an attribute
582
+ # value should be. If it is shorter, the +:too_short+ error
583
+ # message will be added.
584
+ # @option options [Integer] :maximum The maximum length an attribute
585
+ # value should be. If it is longer, the +:too_long+ error
586
+ # message will be added.
587
+ # @option options [String] :too_long An error message added
588
+ # when the attribute value is too long. Defaults to
589
+ # <code>"is too long (maximum is %{maximum}
590
+ # characters)"</code>
591
+ # @option options [String] :too_short An error message added
592
+ # when the attribute value is too short. Defaults to
593
+ # <code>"is too short (minimum is %{minimum}
594
+ # characters)"</code>
595
+ # @option options [String] :wrong_length An error message
596
+ # added when the attribute has the incorrect length (as
597
+ # specified by +:exactly+). Defaults to <code>"is the wrong
598
+ # length (should be %{exactly} characters"</code>
599
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
600
+ # attribute value is +nil+.
601
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
602
+ # attribute value is +blank+.
603
+ # @option options [Symbol] :on (:save) When this validation is run.
604
+ # Valid values include:
605
+ # * +:save+
606
+ # * +:create+
607
+ # * +:update+
608
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
609
+ # to call. The validation will only be run if the return value is
610
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
611
+ # +:if => lambda{|book| book.in_stock? }+).
612
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
613
+ # proc to call. The validation will *not* be run if the return value
614
+ # is of the method/proc is false.
615
+ def validates_length_of *args
616
+ validators << LengthValidator.new(self, *args)
617
+ end
618
+
619
+ # Validates the attribute has a numeric value.
620
+ #
621
+ # validates_numericality_of :age, :only_integer => true
622
+ #
623
+ # === Multi-Valued Attributes
624
+ #
625
+ # You can validate multi-valued attributes using this the same way you
626
+ # validate single-valued attributes. Each value will be validated
627
+ # individually.
628
+ #
629
+ # @overload validates_numericality_of(*attributes, options = {}, &block)
630
+ # @param attributes A list of attribute names to validate.
631
+ # @param [Hash] options
632
+ # @option options [Boolean] :only_integer (false) Adds an error
633
+ # when valiating and the value is numeric, but it not a whole number.
634
+ # @option options [Integer] :equal_to When set the value must equal
635
+ # the given value exactly. May not be used with the greater/less
636
+ # options.
637
+ # @option options [Numeric] :greater_than Ensures the attribute
638
+ # is greater than the given number.
639
+ # @option options [Integer] :greater_than_or_equal_to Ensures the
640
+ # attribute is greater than or equal to the given number.
641
+ # @option options [Numeric] :less_than Ensures the attribute is less
642
+ # than the given value.
643
+ # @option options [Integer] :less_than_or_equal_to Ensures the value is
644
+ # less than or equal to the given number.
645
+ # @option options [Numeric] :even If true, the value may only be
646
+ # an even integer. This forces the +:only_integer+ to +true+.
647
+ # @option options [Numeric] :odd If true, the value may only be
648
+ # an odd integer. This forces the +:only_integer+ to +true+.
649
+ # @option options [String] :message A custom error message. The default
650
+ # +:message+ is "is not a number".
651
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
652
+ # attribute value is +nil+.
653
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
654
+ # attribute value is +blank+.
655
+ # @option options [Symbol] :on (:save) When this validation is run.
656
+ # Valid values include:
657
+ # * +:save+
658
+ # * +:create+
659
+ # * +:update+
660
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
661
+ # to call. The validation will only be run if the return value is
662
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
663
+ # +:if => lambda{|book| book.in_stock? }+).
664
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
665
+ # proc to call. The validation will *not* be run if the return value
666
+ # is of the method/proc is false.
667
+ def validates_numericality_of *args
668
+ validators << NumericalityValidator.new(self, *args)
669
+ end
670
+
671
+ # Validates the named attributes are not blank. For validation
672
+ # purposes, blank values include:
673
+ #
674
+ # * +nil+
675
+ # * empty string
676
+ # * anything that responds to #empty? with true
677
+ # * anything that responds to #blank? with true
678
+ #
679
+ # @overload validates_presence_of(*attributes, options = {}, &block)
680
+ # @param attributes A list of attribute names to validate.
681
+ # @param [Hash] options
682
+ # @option options [String] :message A custom error message. The default
683
+ # +:message+ is "may not be blank".
684
+ # @option options [Symbol] :on (:save) When this validation is run.
685
+ # Valid values include:
686
+ # * +:save+
687
+ # * +:create+
688
+ # * +:update+
689
+ # @option options [Boolean] :allow_nil (false) Skip validation if the
690
+ # attribute value is +nil+.
691
+ # @option options [Boolean] :allow_blank (false) Skip validation if the
692
+ # attribute value is +blank+.
693
+ # @option options [Symbol,String,Proc] :if Specifies a method or proc
694
+ # to call. The validation will only be run if the return value is
695
+ # of the method/proc is true (e.g. +:if => :name_changed?+ or
696
+ # +:if => lambda{|book| book.in_stock? }+).
697
+ # @option options [Symbol,String,Proc] :unless Specifies a method or
698
+ # proc to call. The validation will *not* be run if the return value
699
+ # is of the method/proc is false.
700
+ def validates_presence_of *args
701
+ validators << PresenceValidator.new(self, *args)
702
+ end
703
+
704
+ # @private
705
+ private
706
+ def validators
707
+ @validators ||= []
708
+ end
709
+
710
+ end
711
+ end
712
+ end