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