aws_sdk 3.1.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/lib/aws-sdk.rb +14 -0
- data/lib/aws.rb +49 -0
- data/lib/aws/api_config/AutoScaling-2011-01-01.yml +791 -0
- data/lib/aws/api_config/CloudFormation-2010-05-15.yml +303 -0
- data/lib/aws/api_config/DynamoDB-2011-12-05.yml +540 -0
- data/lib/aws/api_config/EC2-2011-12-15.yml +3638 -0
- data/lib/aws/api_config/EC2-2012-04-01.yml +3739 -0
- data/lib/aws/api_config/ELB-2011-08-15.yml +512 -0
- data/lib/aws/api_config/IAM-2010-05-08.yml +1221 -0
- data/lib/aws/api_config/SNS-2010-03-31.yml +248 -0
- data/lib/aws/api_config/SQS-2011-10-01.yml +314 -0
- data/lib/aws/api_config/STS-2011-06-15.yml +54 -0
- data/lib/aws/api_config/SimpleDB-2009-04-15.yml +305 -0
- data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +231 -0
- data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +721 -0
- data/lib/aws/auto_scaling.rb +162 -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 +765 -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 +150 -0
- data/lib/aws/auto_scaling/launch_configuration_collection.rb +144 -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 +23 -0
- data/lib/aws/auto_scaling/scaling_policy.rb +125 -0
- data/lib/aws/auto_scaling/scaling_policy_collection.rb +72 -0
- data/lib/aws/auto_scaling/scaling_policy_options.rb +61 -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 +270 -0
- data/lib/aws/cloud_formation/client.rb +339 -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 +256 -0
- data/lib/aws/cloud_formation/stack_collection.rb +206 -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 +72 -0
- data/lib/aws/cloud_formation/stack_summary.rb +71 -0
- data/lib/aws/cloud_formation/stack_summary_collection.rb +127 -0
- data/lib/aws/core.rb +474 -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 +541 -0
- data/lib/aws/core/client/query_json.rb +110 -0
- data/lib/aws/core/client/query_xml.rb +122 -0
- data/lib/aws/core/collection.rb +234 -0
- data/lib/aws/core/collection/limitable.rb +99 -0
- data/lib/aws/core/collection/simple.rb +90 -0
- data/lib/aws/core/configuration.rb +445 -0
- data/lib/aws/core/data.rb +242 -0
- data/lib/aws/core/default_signer.rb +67 -0
- data/lib/aws/core/http/curb_handler.rb +136 -0
- data/lib/aws/core/http/handler.rb +77 -0
- data/lib/aws/core/http/httparty_handler.rb +114 -0
- data/lib/aws/core/http/net_http_handler.rb +85 -0
- data/lib/aws/core/http/request.rb +250 -0
- data/lib/aws/core/http/response.rb +74 -0
- data/lib/aws/core/indifferent_hash.rb +88 -0
- data/lib/aws/core/inflection.rb +47 -0
- data/lib/aws/core/lazy_error_classes.rb +90 -0
- data/lib/aws/core/log_formatter.rb +454 -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 +700 -0
- data/lib/aws/core/page_result.rb +73 -0
- data/lib/aws/core/policy.rb +916 -0
- data/lib/aws/core/resource.rb +408 -0
- data/lib/aws/core/resource_cache.rb +40 -0
- data/lib/aws/core/response.rb +202 -0
- data/lib/aws/core/response_cache.rb +50 -0
- data/lib/aws/core/service_interface.rb +61 -0
- data/lib/aws/core/session_signer.rb +90 -0
- data/lib/aws/core/signature/version_2.rb +42 -0
- data/lib/aws/core/signature/version_3.rb +73 -0
- data/lib/aws/core/signature/version_3_http.rb +72 -0
- data/lib/aws/core/signature/version_4.rb +138 -0
- data/lib/aws/core/uri_escape.rb +42 -0
- data/lib/aws/core/xml/frame.rb +242 -0
- data/lib/aws/core/xml/frame_stack.rb +85 -0
- data/lib/aws/core/xml/grammar.rb +299 -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/dynamo_db.rb +213 -0
- data/lib/aws/dynamo_db/attribute_collection.rb +460 -0
- data/lib/aws/dynamo_db/batch_get.rb +206 -0
- data/lib/aws/dynamo_db/batch_write.rb +251 -0
- data/lib/aws/dynamo_db/client.rb +888 -0
- data/lib/aws/dynamo_db/config.rb +20 -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 +130 -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 +47 -0
- data/lib/aws/dynamo_db/request.rb +28 -0
- data/lib/aws/dynamo_db/resource.rb +33 -0
- data/lib/aws/dynamo_db/table.rb +489 -0
- data/lib/aws/dynamo_db/table_collection.rb +165 -0
- data/lib/aws/dynamo_db/types.rb +86 -0
- data/lib/aws/ec2.rb +431 -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 +87 -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 +4121 -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 +157 -0
- data/lib/aws/ec2/elastic_ip_collection.rb +97 -0
- data/lib/aws/ec2/errors.rb +32 -0
- data/lib/aws/ec2/filtered_collection.rb +90 -0
- data/lib/aws/ec2/has_permissions.rb +44 -0
- data/lib/aws/ec2/image.rb +254 -0
- data/lib/aws/ec2/image_collection.rb +228 -0
- data/lib/aws/ec2/instance.rb +669 -0
- data/lib/aws/ec2/instance_collection.rb +346 -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 +97 -0
- data/lib/aws/ec2/region_collection.rb +51 -0
- data/lib/aws/ec2/request.rb +22 -0
- data/lib/aws/ec2/reserved_instances.rb +53 -0
- data/lib/aws/ec2/reserved_instances_collection.rb +40 -0
- data/lib/aws/ec2/reserved_instances_offering.rb +58 -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 +113 -0
- data/lib/aws/ec2/route_table_collection.rb +72 -0
- data/lib/aws/ec2/security_group.rb +458 -0
- data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +63 -0
- data/lib/aws/ec2/security_group/ingress_ip_permission_collection.rb +61 -0
- data/lib/aws/ec2/security_group/ip_permission.rb +128 -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 +131 -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 +170 -0
- data/lib/aws/ec2/volume_collection.rb +97 -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/elb.rb +65 -0
- data/lib/aws/elb/availability_zone_collection.rb +138 -0
- data/lib/aws/elb/backend_server_policy_collection.rb +140 -0
- data/lib/aws/elb/client.rb +539 -0
- data/lib/aws/elb/config.rb +18 -0
- data/lib/aws/elb/errors.rb +26 -0
- data/lib/aws/elb/instance_collection.rb +174 -0
- data/lib/aws/elb/listener.rb +189 -0
- data/lib/aws/elb/listener_collection.rb +119 -0
- data/lib/aws/elb/listener_opts.rb +45 -0
- data/lib/aws/elb/load_balancer.rb +253 -0
- data/lib/aws/elb/load_balancer_collection.rb +113 -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 +23 -0
- data/lib/aws/errors.rb +122 -0
- data/lib/aws/iam.rb +418 -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 +1609 -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 +71 -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/rails.rb +195 -0
- data/lib/aws/record.rb +116 -0
- data/lib/aws/record/abstract_base.rb +645 -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 +182 -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 +694 -0
- data/lib/aws/record/validator.rb +237 -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/s3.rb +135 -0
- data/lib/aws/s3/access_control_list.rb +250 -0
- data/lib/aws/s3/acl_object.rb +264 -0
- data/lib/aws/s3/bucket.rb +393 -0
- data/lib/aws/s3/bucket_collection.rb +143 -0
- data/lib/aws/s3/bucket_lifecycle_configuration.rb +360 -0
- data/lib/aws/s3/bucket_version_collection.rb +77 -0
- data/lib/aws/s3/client.rb +1184 -0
- data/lib/aws/s3/client/xml.rb +177 -0
- data/lib/aws/s3/config.rb +26 -0
- data/lib/aws/s3/data_options.rb +100 -0
- data/lib/aws/s3/errors.rb +81 -0
- data/lib/aws/s3/multipart_upload.rb +317 -0
- data/lib/aws/s3/multipart_upload_collection.rb +68 -0
- data/lib/aws/s3/object_collection.rb +337 -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 +143 -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 +553 -0
- data/lib/aws/s3/request.rb +201 -0
- data/lib/aws/s3/s3_object.rb +1037 -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/simple_db.rb +217 -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 +349 -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 +113 -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 +426 -0
- data/lib/aws/simple_email_service/client.rb +286 -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 +91 -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 +29 -0
- data/lib/aws/simple_workflow.rb +226 -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 +1434 -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 +601 -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 +36 -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 +74 -0
- data/lib/aws/sns/client.rb +371 -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 +80 -0
- data/lib/aws/sns/topic.rb +403 -0
- data/lib/aws/sns/topic_collection.rb +67 -0
- data/lib/aws/sns/topic_subscription_collection.rb +55 -0
- data/lib/aws/sqs.rb +79 -0
- data/lib/aws/sqs/client.rb +360 -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 +725 -0
- data/lib/aws/sqs/queue_collection.rb +170 -0
- data/lib/aws/sqs/received_message.rb +181 -0
- data/lib/aws/sqs/received_sns_message.rb +112 -0
- data/lib/aws/sqs/request.rb +43 -0
- data/lib/aws/sts.rb +152 -0
- data/lib/aws/sts/client.rb +105 -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/net/http/connection_pool.rb +210 -0
- data/lib/net/http/connection_pool/connection.rb +132 -0
- data/lib/net/http/connection_pool/session.rb +93 -0
- data/lib/user.rb +49 -0
- metadata +433 -0
data/lib/aws/s3.rb
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Copyright 2011-2012 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/core'
|
|
15
|
+
require 'aws/s3/config'
|
|
16
|
+
|
|
17
|
+
module AWS
|
|
18
|
+
|
|
19
|
+
# Provides an expressive, object-oriented interface to Amazon S3.
|
|
20
|
+
#
|
|
21
|
+
# To use Amazon S3 you must first
|
|
22
|
+
# {sign up here}[http://aws.amazon.com/s3/].
|
|
23
|
+
#
|
|
24
|
+
# For more information about Amazon S3, see:
|
|
25
|
+
#
|
|
26
|
+
# * {Amazon S3}[http://aws.amazon.com/s3/]
|
|
27
|
+
# * {Amazon S3 Documentation}[http://aws.amazon.com/documentation/s3/]
|
|
28
|
+
#
|
|
29
|
+
# == Credentials
|
|
30
|
+
#
|
|
31
|
+
# You can setup default credentials for all AWS services via
|
|
32
|
+
# AWS.config:
|
|
33
|
+
#
|
|
34
|
+
# AWS.config(
|
|
35
|
+
# :access_key_id => 'YOUR_ACCESS_KEY_ID',
|
|
36
|
+
# :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
|
|
37
|
+
#
|
|
38
|
+
# Or you can set them directly on the S3 interface:
|
|
39
|
+
#
|
|
40
|
+
# s3 = AWS::S3.new(
|
|
41
|
+
# :access_key_id => 'YOUR_ACCESS_KEY_ID',
|
|
42
|
+
# :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
|
|
43
|
+
#
|
|
44
|
+
# == Buckets Keys and Objects
|
|
45
|
+
#
|
|
46
|
+
# S3 stores objects in buckets.
|
|
47
|
+
#
|
|
48
|
+
# To create a bucket:
|
|
49
|
+
#
|
|
50
|
+
# bucket = s3.buckets.create('mybucket')
|
|
51
|
+
#
|
|
52
|
+
# To get a bucket:
|
|
53
|
+
#
|
|
54
|
+
# bucket = s3.buckets[:mybucket]
|
|
55
|
+
# bucket = s3.buckets['mybucket']
|
|
56
|
+
#
|
|
57
|
+
# Listing buckets:
|
|
58
|
+
#
|
|
59
|
+
# s3.buckets.each do |bucket|
|
|
60
|
+
# puts bucket.name
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# See {Bucket} and {BucketCollection} for more information on working
|
|
64
|
+
# with S3 buckets.
|
|
65
|
+
#
|
|
66
|
+
# == Listing Objects
|
|
67
|
+
#
|
|
68
|
+
# Enumerating objects in a bucket:
|
|
69
|
+
#
|
|
70
|
+
# bucket.objects.each do |object|
|
|
71
|
+
# puts object.key #=> no data is fetched from s3, just a list of keys
|
|
72
|
+
# end
|
|
73
|
+
#
|
|
74
|
+
# You can limit the list of objects with a prefix, or explore the objects
|
|
75
|
+
# in a bucket as a tree. See {ObjectCollection} for more information.
|
|
76
|
+
#
|
|
77
|
+
# == Reading and Writing to S3
|
|
78
|
+
#
|
|
79
|
+
# Each object in a bucket has a unique key.
|
|
80
|
+
#
|
|
81
|
+
# photo = s3.buckets['mybucket'].objects['photo.jpg']
|
|
82
|
+
#
|
|
83
|
+
# Writing to an S3Object:
|
|
84
|
+
#
|
|
85
|
+
# photo.write(File.read('/some/photo.jpg'))
|
|
86
|
+
#
|
|
87
|
+
# Reading from an S3Object:
|
|
88
|
+
#
|
|
89
|
+
# File.open("/some/path/on/disk.jpg", "w") do |f|
|
|
90
|
+
# f.write(photo.read)
|
|
91
|
+
# end
|
|
92
|
+
#
|
|
93
|
+
# See {S3Object} for more information on reading and writing to S3.
|
|
94
|
+
#
|
|
95
|
+
class S3
|
|
96
|
+
|
|
97
|
+
AWS.register_autoloads(self) do
|
|
98
|
+
autoload :AccessControlList, 'access_control_list'
|
|
99
|
+
autoload :ACLObject, 'acl_object'
|
|
100
|
+
autoload :Bucket, 'bucket'
|
|
101
|
+
autoload :BucketCollection, 'bucket_collection'
|
|
102
|
+
autoload :BucketLifecycleConfiguration, 'bucket_lifecycle_configuration'
|
|
103
|
+
autoload :BucketVersionCollection, 'bucket_version_collection'
|
|
104
|
+
autoload :Client, 'client'
|
|
105
|
+
autoload :DataOptions, 'data_options'
|
|
106
|
+
autoload :Errors, 'errors'
|
|
107
|
+
autoload :MultipartUpload, 'multipart_upload'
|
|
108
|
+
autoload :MultipartUploadCollection, 'multipart_upload_collection'
|
|
109
|
+
autoload :ObjectCollection, 'object_collection'
|
|
110
|
+
autoload :ObjectMetadata, 'object_metadata'
|
|
111
|
+
autoload :ObjectUploadCollection, 'object_upload_collection'
|
|
112
|
+
autoload :ObjectVersion, 'object_version'
|
|
113
|
+
autoload :ObjectVersionCollection, 'object_version_collection'
|
|
114
|
+
autoload :PaginatedCollection, 'paginated_collection'
|
|
115
|
+
autoload :Policy, 'policy'
|
|
116
|
+
autoload :PrefixAndDelimiterCollection, 'prefix_and_delimiter_collection'
|
|
117
|
+
autoload :PrefixedCollection, 'prefixed_collection'
|
|
118
|
+
autoload :PresignedPost, 'presigned_post'
|
|
119
|
+
autoload :Request, 'request'
|
|
120
|
+
autoload :S3Object, 's3_object'
|
|
121
|
+
autoload :Tree, 'tree'
|
|
122
|
+
autoload :UploadedPart, 'uploaded_part'
|
|
123
|
+
autoload :UploadedPartCollection, 'uploaded_part_collection'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
include Core::ServiceInterface
|
|
127
|
+
|
|
128
|
+
# @return [BucketCollection] Returns a collection that represents all
|
|
129
|
+
# buckets in the account.
|
|
130
|
+
def buckets
|
|
131
|
+
BucketCollection.new(:config => @config)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Copyright 2011-2012 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 S3
|
|
16
|
+
|
|
17
|
+
# Represents an access control list for S3 objects and buckets. For example:
|
|
18
|
+
#
|
|
19
|
+
# acl = AccessControlList.new
|
|
20
|
+
# acl.grant(:full_control).
|
|
21
|
+
# to(:canonical_user_id => "8a6925ce4adf588a4f21c32aa379004fef")
|
|
22
|
+
# acl.to_xml # => '<AccessControlPolicy>...'
|
|
23
|
+
#
|
|
24
|
+
# You can also construct an AccessControlList from a hash:
|
|
25
|
+
#
|
|
26
|
+
# AccessControlList.new(
|
|
27
|
+
# :owner => { :id => "8a6925ce4adf588a4f21c32aa379004fef" },
|
|
28
|
+
# :grants => [{ :grantee => {
|
|
29
|
+
# :canonical_user_id => "8a6925ce4adf588a4f21c32aa379004fef",
|
|
30
|
+
# },
|
|
31
|
+
# :permission => :full_control }]
|
|
32
|
+
# )
|
|
33
|
+
#
|
|
34
|
+
# @see ACLObject
|
|
35
|
+
#
|
|
36
|
+
# @attr [AccessControlList::Owner] owner The owner of the access
|
|
37
|
+
# control list. You can set this as a hash, for example:
|
|
38
|
+
# acl.owner = { :id => '8a6925ce4adf588a4f21c32aa379004fef' }
|
|
39
|
+
# This attribute is required when setting an ACL.
|
|
40
|
+
#
|
|
41
|
+
# @attr [list of AccessControlList::Grant] grants The list of
|
|
42
|
+
# grants. You can set this as a list of hashes, for example:
|
|
43
|
+
# acl.grants = [{ :grantee => { :canonical_user_id =>
|
|
44
|
+
# "8a6925ce4adf588a4f21c32aa379004fef" },
|
|
45
|
+
# :permission => :full_control }]
|
|
46
|
+
class AccessControlList
|
|
47
|
+
|
|
48
|
+
# Represents an ACL owner. In the default ACL, this is the
|
|
49
|
+
# bucket owner.
|
|
50
|
+
#
|
|
51
|
+
# @attr [String] id The canonical user ID of the ACL owner.
|
|
52
|
+
# This attribute is required when setting an ACL.
|
|
53
|
+
#
|
|
54
|
+
# @attr [String] display_name The display name of the ACL
|
|
55
|
+
# owner. This value is ignored when setting an ACL.
|
|
56
|
+
class Owner
|
|
57
|
+
include ACLObject
|
|
58
|
+
|
|
59
|
+
string_attr "ID", :required => true
|
|
60
|
+
string_attr "DisplayName"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Represents a user who is granted some kind of permission
|
|
64
|
+
# through a Grant. There are three ways to specify a grantee:
|
|
65
|
+
#
|
|
66
|
+
# * You can specify the canonical user ID, for example. When
|
|
67
|
+
# you read an ACL from S3, all grantees will be identified
|
|
68
|
+
# this way, and the display_name attribute will also be provided.
|
|
69
|
+
#
|
|
70
|
+
# Grantee.new(:canonical_user_id => "8a6925ce4adf588a4f21c32aa379004fef")
|
|
71
|
+
#
|
|
72
|
+
# * You can specify the e-mail address of an AWS customer, for example:
|
|
73
|
+
# Grantee.new(:amazon_customer_email => 'foo@example.com')
|
|
74
|
+
#
|
|
75
|
+
# * You can specify a group URI, for example:
|
|
76
|
+
# Grantee.new(:group_uri => 'http://acs.amazonaws.com/groups/global/AllUsers')
|
|
77
|
+
# For more details about group URIs, see:
|
|
78
|
+
# http://docs.amazonwebservices.com/AmazonS3/latest/dev/ACLOverview.html
|
|
79
|
+
#
|
|
80
|
+
# When constructing a grantee, you must provide a value for
|
|
81
|
+
# exactly one of the following attributes:
|
|
82
|
+
#
|
|
83
|
+
# * +amazon_customer_email+
|
|
84
|
+
# * +canonical_user_id+
|
|
85
|
+
# * +group_uri+
|
|
86
|
+
#
|
|
87
|
+
# @attr [String] amazon_customer_email The e-mail address of
|
|
88
|
+
# an AWS customer.
|
|
89
|
+
#
|
|
90
|
+
# @attr [String] canonical_user_id The canonical user ID of an
|
|
91
|
+
# AWS customer.
|
|
92
|
+
#
|
|
93
|
+
# @attr [String] group_uri A URI that identifies a particular
|
|
94
|
+
# group of users.
|
|
95
|
+
#
|
|
96
|
+
# @attr [String] display_name The display name associated with
|
|
97
|
+
# the grantee. This is provided by S3 when reading an ACL.
|
|
98
|
+
class Grantee
|
|
99
|
+
include ACLObject
|
|
100
|
+
|
|
101
|
+
SIGNAL_ATTRIBUTES = [:amazon_customer_email,
|
|
102
|
+
:canonical_user_id,
|
|
103
|
+
:group_uri]
|
|
104
|
+
|
|
105
|
+
string_attr "EmailAddress", :method_name => "amazon_customer_email"
|
|
106
|
+
string_attr "ID", :method_name => "canonical_user_id"
|
|
107
|
+
string_attr "URI", :method_name => "group_uri"
|
|
108
|
+
string_attr "DisplayName"
|
|
109
|
+
|
|
110
|
+
# (see ACLObject#validate!)
|
|
111
|
+
def validate!
|
|
112
|
+
attr = signal_attribute
|
|
113
|
+
raise "missing amazon_customer_email, canonical_user_id, "+
|
|
114
|
+
"or group_uri" unless attr
|
|
115
|
+
raise "display_name is invalid with #{attr}" if
|
|
116
|
+
attr != :canonical_user_id and display_name
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @private
|
|
120
|
+
def stag
|
|
121
|
+
if attr = signal_attribute
|
|
122
|
+
super + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
|
|
123
|
+
" xsi:type=\"#{type_for_attr(attr)}\""
|
|
124
|
+
else
|
|
125
|
+
super
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# @private
|
|
130
|
+
def signal_attribute
|
|
131
|
+
SIGNAL_ATTRIBUTES.find { |att| send(att) }
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# @private
|
|
135
|
+
def type_for_attr(attr)
|
|
136
|
+
{ :amazon_customer_email => "AmazonCustomerByEmail",
|
|
137
|
+
:canonical_user_id => "CanonicalUser",
|
|
138
|
+
:group_uri => "Group" }[attr]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Represents the permission being granted in a Grant object.
|
|
144
|
+
# Typically you will not need to construct an instance of this
|
|
145
|
+
# class directly.
|
|
146
|
+
# @see Grant#permission
|
|
147
|
+
class Permission
|
|
148
|
+
include ACLObject
|
|
149
|
+
|
|
150
|
+
# The permission expressed as a symbol following Ruby
|
|
151
|
+
# conventions. For example, S3's FULL_CONTROL permission
|
|
152
|
+
# will be returned as +:full_control+.
|
|
153
|
+
attr_reader :name
|
|
154
|
+
|
|
155
|
+
# @private
|
|
156
|
+
def initialize(name)
|
|
157
|
+
raise "expected string or symbol" unless
|
|
158
|
+
name.respond_to?(:to_str) or name.respond_to?(:to_sym)
|
|
159
|
+
@name = name.to_sym
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def body_xml
|
|
163
|
+
name.to_s.upcase
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Represents a single grant in an ACL. Both +grantee+ and
|
|
169
|
+
# +permission+ are required for each grant when setting an
|
|
170
|
+
# ACL.
|
|
171
|
+
#
|
|
172
|
+
# See
|
|
173
|
+
# http://docs.amazonwebservices.com/AmazonS3/latest/dev/ACLOverview.html
|
|
174
|
+
# for more information on how grantees and permissions are
|
|
175
|
+
# interpreted by S3.
|
|
176
|
+
#
|
|
177
|
+
# @attr [Grantee] grantee The user or users who are granted
|
|
178
|
+
# access according to this grant. You can specify this as a
|
|
179
|
+
# hash:
|
|
180
|
+
# grant.grantee = { :amazon_customer_email => "foo@example.com" }
|
|
181
|
+
#
|
|
182
|
+
# @attr [Permission or Symbol] permission The type of
|
|
183
|
+
# permission that is granted by this grant. Valid values are:
|
|
184
|
+
# * +:read+
|
|
185
|
+
# * +:write+
|
|
186
|
+
# * +:read_acp+
|
|
187
|
+
# * +:write_acp+
|
|
188
|
+
# * +:full_control+
|
|
189
|
+
class Grant
|
|
190
|
+
|
|
191
|
+
include ACLObject
|
|
192
|
+
|
|
193
|
+
object_attr Grantee, :required => true
|
|
194
|
+
object_attr Permission, :required => true, :cast => Symbol
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
include ACLObject
|
|
199
|
+
|
|
200
|
+
# @private
|
|
201
|
+
def stag
|
|
202
|
+
super()+" xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\""
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# @private
|
|
206
|
+
def element_name
|
|
207
|
+
"AccessControlPolicy"
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
class GrantBuilder
|
|
211
|
+
|
|
212
|
+
# @private
|
|
213
|
+
def initialize(acl, grant)
|
|
214
|
+
@acl = acl
|
|
215
|
+
@grant = grant
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Specifies the grantee.
|
|
219
|
+
#
|
|
220
|
+
# @param [Grantee or Hash] grantee A Grantee object or hash;
|
|
221
|
+
# for example:
|
|
222
|
+
# acl.grant(:full_control).to(:amazon_customer_email => "foo@example.com")
|
|
223
|
+
def to(grantee)
|
|
224
|
+
@grant.grantee = grantee
|
|
225
|
+
@acl.grants << @grant
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Convenience method for constructing a new grant and adding
|
|
231
|
+
# it to the ACL. Example usage:
|
|
232
|
+
#
|
|
233
|
+
# acl.grants.size # => 0
|
|
234
|
+
# acl.grant(:full_control).
|
|
235
|
+
# to(:canonical_user_id => "8a6925ce4adf588a4f21c32aa379004fef")
|
|
236
|
+
# acl.grants.size # => 1
|
|
237
|
+
#
|
|
238
|
+
# @return [GrantBuilder]
|
|
239
|
+
def grant(permission)
|
|
240
|
+
GrantBuilder.new(self, Grant.new(:permission => permission))
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
object_attr Owner, :required => true
|
|
244
|
+
object_list_attr("AccessControlList", Grant,
|
|
245
|
+
:required => true, :method_name => :grants)
|
|
246
|
+
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
end
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Copyright 2011-2012 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 'rexml/text'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
class S3
|
|
18
|
+
|
|
19
|
+
# Common methods for AccessControlList and related objects.
|
|
20
|
+
module ACLObject
|
|
21
|
+
|
|
22
|
+
# @private
|
|
23
|
+
def initialize(opts = {}); end
|
|
24
|
+
|
|
25
|
+
# @private
|
|
26
|
+
def body_xml; ""; end
|
|
27
|
+
|
|
28
|
+
# @private
|
|
29
|
+
def stag
|
|
30
|
+
element_name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @private
|
|
34
|
+
def element_name
|
|
35
|
+
self.class.name[/::([^:]*)$/, 1]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns the XML representation of the object. Generally
|
|
39
|
+
# you'll want to call this on an AccessControlList object,
|
|
40
|
+
# which will yield an XML representation of the ACL that you
|
|
41
|
+
# can send to S3.
|
|
42
|
+
def to_s
|
|
43
|
+
if body_xml.empty?
|
|
44
|
+
"<#{stag}/>"
|
|
45
|
+
else
|
|
46
|
+
"<#{stag}>#{body_xml}</#{element_name}>"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# (see #to_s)
|
|
51
|
+
def to_xml
|
|
52
|
+
to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns true if and only if this object is valid according
|
|
56
|
+
# to S3's published ACL schema. In particular, this will
|
|
57
|
+
# check that all required attributes are provided and that
|
|
58
|
+
# they are of the correct type.
|
|
59
|
+
def valid?
|
|
60
|
+
validate!
|
|
61
|
+
rescue => e
|
|
62
|
+
false
|
|
63
|
+
else
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Raises an exception unless this object is valid according to
|
|
68
|
+
# S3's published ACL schema.
|
|
69
|
+
# @see #valid?
|
|
70
|
+
def validate!; end
|
|
71
|
+
|
|
72
|
+
# @private
|
|
73
|
+
def validate_input(name, value, context = nil)
|
|
74
|
+
send("validate_#{name}_input!", value, context)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# @private
|
|
78
|
+
module ClassMethods
|
|
79
|
+
|
|
80
|
+
def string_attr(element_name, options = {})
|
|
81
|
+
method_name = options[:method_name] ||
|
|
82
|
+
Core::Inflection.ruby_name(element_name)
|
|
83
|
+
|
|
84
|
+
attr_accessor(method_name)
|
|
85
|
+
setter_option(method_name)
|
|
86
|
+
string_input_validator(method_name)
|
|
87
|
+
validate_string(method_name) if options[:required]
|
|
88
|
+
body_xml_string_content(element_name, method_name)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def object_attr(klass, options = {})
|
|
92
|
+
base_name = klass.name[/::([^:]*)$/, 1]
|
|
93
|
+
method_name = Core::Inflection.ruby_name(base_name)
|
|
94
|
+
cast = options[:cast] || Hash
|
|
95
|
+
|
|
96
|
+
attr_reader(method_name)
|
|
97
|
+
setter_option(method_name)
|
|
98
|
+
object_setter(klass, method_name, cast)
|
|
99
|
+
object_input_validator(klass, base_name, method_name, cast)
|
|
100
|
+
validate_object(method_name) if options[:required]
|
|
101
|
+
body_xml_content(method_name)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def object_list_attr(list_element, klass, options = {})
|
|
105
|
+
base_name = klass.name[/::([^:]*)$/, 1]
|
|
106
|
+
method_name = Core::Inflection.ruby_name(options[:method_name].to_s || list_element)
|
|
107
|
+
default_value = nil
|
|
108
|
+
default_value = [] if options[:required]
|
|
109
|
+
|
|
110
|
+
attr_reader(method_name)
|
|
111
|
+
setter_option(method_name) { [] if options[:required] }
|
|
112
|
+
object_list_setter(klass, method_name)
|
|
113
|
+
object_list_input_validator(klass, base_name, method_name)
|
|
114
|
+
validate_list(method_name)
|
|
115
|
+
body_xml_list_content(list_element, method_name)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def setter_option(method_name)
|
|
119
|
+
Core::MetaUtils.class_extend_method(self, :initialize) do |*args|
|
|
120
|
+
opts = args.last || {}
|
|
121
|
+
instance_variable_set("@#{method_name}", yield) if block_given?
|
|
122
|
+
key = method_name.to_sym
|
|
123
|
+
|
|
124
|
+
if opts.has_key?(key)
|
|
125
|
+
value = opts[key]
|
|
126
|
+
validate_input(method_name, value, "for #{method_name} option")
|
|
127
|
+
self.send("#{method_name}=", value)
|
|
128
|
+
end
|
|
129
|
+
super(opts)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def string_input_validator(method_name)
|
|
134
|
+
input_validator(method_name) do |value, context|
|
|
135
|
+
raise ArgumentError.new("expected string"+context) unless
|
|
136
|
+
value.respond_to?(:to_str)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def object_input_validator(klass, base_name, method_name, cast)
|
|
141
|
+
input_validator(method_name) do |value, context|
|
|
142
|
+
if value.kind_of?(cast)
|
|
143
|
+
klass.new(value).validate!
|
|
144
|
+
else
|
|
145
|
+
raise ArgumentError.new("expected #{base_name} object or hash"+context) unless
|
|
146
|
+
value.nil? or value.kind_of? klass
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def object_list_input_validator(klass, base_name, method_name)
|
|
152
|
+
input_validator(method_name) do |value, context|
|
|
153
|
+
raise ArgumentError.new("expected array"+context) unless value.kind_of?(Array)
|
|
154
|
+
value.each do |member|
|
|
155
|
+
if member.kind_of?(Hash)
|
|
156
|
+
klass.new(member).validate!
|
|
157
|
+
else
|
|
158
|
+
raise ArgumentError.new("expected array#{context} "+
|
|
159
|
+
"to contain #{base_name} objects "+
|
|
160
|
+
"or hashes") unless
|
|
161
|
+
member.kind_of? klass
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def input_validator(method_name, &blk)
|
|
168
|
+
validator = "__validator__#{blk.object_id}"
|
|
169
|
+
Core::MetaUtils.class_extend_method(self, validator, &blk)
|
|
170
|
+
Core::MetaUtils.class_extend_method(self, "validate_#{method_name}_input!") do |*args|
|
|
171
|
+
(value, context) = args
|
|
172
|
+
context = " "+context if context
|
|
173
|
+
context ||= ""
|
|
174
|
+
send(validator, value, context)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def object_setter(klass, method_name, cast)
|
|
179
|
+
define_method("#{method_name}=") do |value|
|
|
180
|
+
validate_input(method_name, value)
|
|
181
|
+
if value.kind_of?(cast)
|
|
182
|
+
value = klass.new(value)
|
|
183
|
+
end
|
|
184
|
+
instance_variable_set("@#{method_name}", value)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def object_list_setter(klass, method_name)
|
|
189
|
+
define_method("#{method_name}=") do |value|
|
|
190
|
+
validate_input(method_name, value)
|
|
191
|
+
list = value.map do |member|
|
|
192
|
+
if member.kind_of?(Hash)
|
|
193
|
+
klass.new(member)
|
|
194
|
+
else
|
|
195
|
+
member
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
instance_variable_set("@#{method_name}", list)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def validate_string(method_name)
|
|
203
|
+
Core::MetaUtils.class_extend_method(self, :validate!) do
|
|
204
|
+
super()
|
|
205
|
+
raise "missing #{method_name}" unless send(method_name)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def validate_object(method_name)
|
|
210
|
+
Core::MetaUtils.class_extend_method(self, :validate!) do
|
|
211
|
+
super()
|
|
212
|
+
raise "missing #{method_name}" unless send(method_name)
|
|
213
|
+
send(method_name).validate!
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def validate_list(method_name)
|
|
218
|
+
Core::MetaUtils.class_extend_method(self, :validate!) do
|
|
219
|
+
super()
|
|
220
|
+
raise "missing #{method_name}" unless send(method_name)
|
|
221
|
+
send(method_name).each { |member| member.validate! }
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def body_xml_string_content(element_name, method_name)
|
|
226
|
+
add_xml_child(method_name) do |value|
|
|
227
|
+
normalized = REXML::Text.normalize(value.to_s)
|
|
228
|
+
"<#{element_name}>#{normalized}</#{element_name}>"
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def body_xml_content(method_name)
|
|
233
|
+
add_xml_child(method_name) { |value| value.to_s }
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def body_xml_list_content(list_element, method_name)
|
|
237
|
+
add_xml_child(method_name) do |list|
|
|
238
|
+
list_content = list.map { |member| member.to_s }.join
|
|
239
|
+
if list_content.empty?
|
|
240
|
+
"<#{list_element}/>"
|
|
241
|
+
else
|
|
242
|
+
"<#{list_element}>#{list_content}</#{list_element}>"
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def add_xml_child(method_name)
|
|
248
|
+
Core::MetaUtils.class_extend_method(self, :body_xml) do
|
|
249
|
+
xml = super()
|
|
250
|
+
value = send(method_name)
|
|
251
|
+
xml += yield(value) if value
|
|
252
|
+
xml
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def self.included(m)
|
|
259
|
+
m.extend(ClassMethods)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|