gcloud 0.0.4 → 0.0.6
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.tar.gz.sig +0 -0
- data/CHANGELOG +4 -0
- data/Makefile +4 -0
- data/Manifest +760 -1
- data/bin/gcloud +7 -0
- data/bin/{gcutil → gcutil.symlink} +0 -0
- data/bin/gsutil-symlink +377 -0
- data/gcloud.gemspec +5 -5
- data/packages/gsutil/CHECKSUM +1 -0
- data/packages/gsutil/COPYING +202 -0
- data/packages/gsutil/LICENSE.third_party +295 -0
- data/packages/gsutil/MANIFEST.in +5 -0
- data/packages/gsutil/README +38 -0
- data/packages/gsutil/README.pkg +49 -0
- data/packages/gsutil/ReleaseNotes.txt +780 -0
- data/packages/gsutil/VERSION +1 -0
- data/packages/gsutil/boto/Changelog.rst +35 -0
- data/packages/gsutil/boto/LICENSE +18 -0
- data/packages/gsutil/boto/MANIFEST.in +12 -0
- data/packages/gsutil/boto/README.rst +163 -0
- data/packages/gsutil/boto/bin/asadmin +290 -0
- data/packages/gsutil/boto/bin/bundle_image +27 -0
- data/packages/gsutil/boto/bin/cfadmin +108 -0
- data/packages/gsutil/boto/bin/cq +89 -0
- data/packages/gsutil/boto/bin/cwutil +140 -0
- data/packages/gsutil/boto/bin/elbadmin +284 -0
- data/packages/gsutil/boto/bin/fetch_file +43 -0
- data/packages/gsutil/boto/bin/glacier +154 -0
- data/packages/gsutil/boto/bin/instance_events +145 -0
- data/packages/gsutil/boto/bin/kill_instance +35 -0
- data/packages/gsutil/boto/bin/launch_instance +252 -0
- data/packages/gsutil/boto/bin/list_instances +90 -0
- data/packages/gsutil/boto/bin/lss3 +77 -0
- data/packages/gsutil/boto/bin/mturk +465 -0
- data/packages/gsutil/boto/bin/pyami_sendmail +52 -0
- data/packages/gsutil/boto/bin/route53 +205 -0
- data/packages/gsutil/boto/bin/s3put +374 -0
- data/packages/gsutil/boto/bin/sdbadmin +194 -0
- data/packages/gsutil/boto/bin/taskadmin +116 -0
- data/packages/gsutil/boto/boto/__init__.py +793 -0
- data/packages/gsutil/boto/boto/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/auth.py +682 -0
- data/packages/gsutil/boto/boto/auth.pyc +0 -0
- data/packages/gsutil/boto/boto/auth_handler.py +58 -0
- data/packages/gsutil/boto/boto/auth_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/beanstalk/__init__.py +65 -0
- data/packages/gsutil/boto/boto/beanstalk/exception.py +64 -0
- data/packages/gsutil/boto/boto/beanstalk/layer1.py +1153 -0
- data/packages/gsutil/boto/boto/beanstalk/response.py +703 -0
- data/packages/gsutil/boto/boto/beanstalk/wrapper.py +29 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.py +22 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/cacerts/cacerts.txt +633 -0
- data/packages/gsutil/boto/boto/cloudformation/__init__.py +68 -0
- data/packages/gsutil/boto/boto/cloudformation/connection.py +364 -0
- data/packages/gsutil/boto/boto/cloudformation/stack.py +360 -0
- data/packages/gsutil/boto/boto/cloudformation/template.py +43 -0
- data/packages/gsutil/boto/boto/cloudfront/__init__.py +324 -0
- data/packages/gsutil/boto/boto/cloudfront/distribution.py +745 -0
- data/packages/gsutil/boto/boto/cloudfront/exception.py +26 -0
- data/packages/gsutil/boto/boto/cloudfront/identity.py +122 -0
- data/packages/gsutil/boto/boto/cloudfront/invalidation.py +216 -0
- data/packages/gsutil/boto/boto/cloudfront/logging.py +38 -0
- data/packages/gsutil/boto/boto/cloudfront/object.py +48 -0
- data/packages/gsutil/boto/boto/cloudfront/origin.py +150 -0
- data/packages/gsutil/boto/boto/cloudfront/signers.py +60 -0
- data/packages/gsutil/boto/boto/cloudsearch/__init__.py +45 -0
- data/packages/gsutil/boto/boto/cloudsearch/document.py +265 -0
- data/packages/gsutil/boto/boto/cloudsearch/domain.py +394 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer1.py +738 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer2.py +67 -0
- data/packages/gsutil/boto/boto/cloudsearch/optionstatus.py +248 -0
- data/packages/gsutil/boto/boto/cloudsearch/search.py +365 -0
- data/packages/gsutil/boto/boto/cloudsearch/sourceattribute.py +75 -0
- data/packages/gsutil/boto/boto/compat.py +28 -0
- data/packages/gsutil/boto/boto/compat.pyc +0 -0
- data/packages/gsutil/boto/boto/connection.py +1081 -0
- data/packages/gsutil/boto/boto/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/contrib/__init__.py +22 -0
- data/packages/gsutil/boto/boto/contrib/ymlmessage.py +52 -0
- data/packages/gsutil/boto/boto/core/README +58 -0
- data/packages/gsutil/boto/boto/core/__init__.py +23 -0
- data/packages/gsutil/boto/boto/core/auth.py +78 -0
- data/packages/gsutil/boto/boto/core/credentials.py +154 -0
- data/packages/gsutil/boto/boto/core/dictresponse.py +178 -0
- data/packages/gsutil/boto/boto/core/service.py +67 -0
- data/packages/gsutil/boto/boto/datapipeline/__init__.py +0 -0
- data/packages/gsutil/boto/boto/datapipeline/exceptions.py +42 -0
- data/packages/gsutil/boto/boto/datapipeline/layer1.py +546 -0
- data/packages/gsutil/boto/boto/dynamodb/__init__.py +66 -0
- data/packages/gsutil/boto/boto/dynamodb/batch.py +262 -0
- data/packages/gsutil/boto/boto/dynamodb/condition.py +170 -0
- data/packages/gsutil/boto/boto/dynamodb/exceptions.py +64 -0
- data/packages/gsutil/boto/boto/dynamodb/item.py +196 -0
- data/packages/gsutil/boto/boto/dynamodb/layer1.py +575 -0
- data/packages/gsutil/boto/boto/dynamodb/layer2.py +798 -0
- data/packages/gsutil/boto/boto/dynamodb/schema.py +112 -0
- data/packages/gsutil/boto/boto/dynamodb/table.py +540 -0
- data/packages/gsutil/boto/boto/dynamodb/types.py +326 -0
- data/packages/gsutil/boto/boto/ec2/__init__.py +96 -0
- data/packages/gsutil/boto/boto/ec2/address.py +103 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/__init__.py +781 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/activity.py +74 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/group.py +337 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/instance.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/launchconfig.py +209 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/policy.py +166 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/request.py +38 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/scheduled.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/tag.py +84 -0
- data/packages/gsutil/boto/boto/ec2/blockdevicemapping.py +141 -0
- data/packages/gsutil/boto/boto/ec2/bundleinstance.py +78 -0
- data/packages/gsutil/boto/boto/ec2/buyreservation.py +84 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/__init__.py +603 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/alarm.py +316 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/datapoint.py +40 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/dimension.py +38 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/listelement.py +31 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/metric.py +175 -0
- data/packages/gsutil/boto/boto/ec2/connection.py +3409 -0
- data/packages/gsutil/boto/boto/ec2/ec2object.py +107 -0
- data/packages/gsutil/boto/boto/ec2/elb/__init__.py +553 -0
- data/packages/gsutil/boto/boto/ec2/elb/healthcheck.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/instancestate.py +62 -0
- data/packages/gsutil/boto/boto/ec2/elb/listelement.py +36 -0
- data/packages/gsutil/boto/boto/ec2/elb/listener.py +75 -0
- data/packages/gsutil/boto/boto/ec2/elb/loadbalancer.py +324 -0
- data/packages/gsutil/boto/boto/ec2/elb/policies.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/securitygroup.py +38 -0
- data/packages/gsutil/boto/boto/ec2/group.py +39 -0
- data/packages/gsutil/boto/boto/ec2/image.py +350 -0
- data/packages/gsutil/boto/boto/ec2/instance.py +661 -0
- data/packages/gsutil/boto/boto/ec2/instanceinfo.py +51 -0
- data/packages/gsutil/boto/boto/ec2/instancestatus.py +207 -0
- data/packages/gsutil/boto/boto/ec2/keypair.py +113 -0
- data/packages/gsutil/boto/boto/ec2/launchspecification.py +105 -0
- data/packages/gsutil/boto/boto/ec2/networkinterface.py +247 -0
- data/packages/gsutil/boto/boto/ec2/placementgroup.py +51 -0
- data/packages/gsutil/boto/boto/ec2/regioninfo.py +34 -0
- data/packages/gsutil/boto/boto/ec2/reservedinstance.py +227 -0
- data/packages/gsutil/boto/boto/ec2/securitygroup.py +357 -0
- data/packages/gsutil/boto/boto/ec2/snapshot.py +170 -0
- data/packages/gsutil/boto/boto/ec2/spotdatafeedsubscription.py +63 -0
- data/packages/gsutil/boto/boto/ec2/spotinstancerequest.py +188 -0
- data/packages/gsutil/boto/boto/ec2/spotpricehistory.py +55 -0
- data/packages/gsutil/boto/boto/ec2/tag.py +87 -0
- data/packages/gsutil/boto/boto/ec2/vmtype.py +58 -0
- data/packages/gsutil/boto/boto/ec2/volume.py +293 -0
- data/packages/gsutil/boto/boto/ec2/volumestatus.py +200 -0
- data/packages/gsutil/boto/boto/ec2/zone.py +80 -0
- data/packages/gsutil/boto/boto/ecs/__init__.py +90 -0
- data/packages/gsutil/boto/boto/ecs/item.py +153 -0
- data/packages/gsutil/boto/boto/elasticache/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elasticache/layer1.py +1252 -0
- data/packages/gsutil/boto/boto/elastictranscoder/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elastictranscoder/exceptions.py +46 -0
- data/packages/gsutil/boto/boto/elastictranscoder/layer1.py +509 -0
- data/packages/gsutil/boto/boto/emr/__init__.py +73 -0
- data/packages/gsutil/boto/boto/emr/bootstrap_action.py +44 -0
- data/packages/gsutil/boto/boto/emr/connection.py +531 -0
- data/packages/gsutil/boto/boto/emr/emrobject.py +176 -0
- data/packages/gsutil/boto/boto/emr/instance_group.py +43 -0
- data/packages/gsutil/boto/boto/emr/step.py +281 -0
- data/packages/gsutil/boto/boto/exception.py +476 -0
- data/packages/gsutil/boto/boto/exception.pyc +0 -0
- data/packages/gsutil/boto/boto/file/README +49 -0
- data/packages/gsutil/boto/boto/file/__init__.py +28 -0
- data/packages/gsutil/boto/boto/file/bucket.py +112 -0
- data/packages/gsutil/boto/boto/file/connection.py +33 -0
- data/packages/gsutil/boto/boto/file/key.py +199 -0
- data/packages/gsutil/boto/boto/file/simpleresultset.py +30 -0
- data/packages/gsutil/boto/boto/fps/__init__.py +21 -0
- data/packages/gsutil/boto/boto/fps/connection.py +369 -0
- data/packages/gsutil/boto/boto/fps/exception.py +344 -0
- data/packages/gsutil/boto/boto/fps/response.py +175 -0
- data/packages/gsutil/boto/boto/glacier/__init__.py +57 -0
- data/packages/gsutil/boto/boto/glacier/concurrent.py +409 -0
- data/packages/gsutil/boto/boto/glacier/exceptions.py +58 -0
- data/packages/gsutil/boto/boto/glacier/job.py +152 -0
- data/packages/gsutil/boto/boto/glacier/layer1.py +637 -0
- data/packages/gsutil/boto/boto/glacier/layer2.py +93 -0
- data/packages/gsutil/boto/boto/glacier/response.py +48 -0
- data/packages/gsutil/boto/boto/glacier/utils.py +163 -0
- data/packages/gsutil/boto/boto/glacier/vault.py +387 -0
- data/packages/gsutil/boto/boto/glacier/writer.py +242 -0
- data/packages/gsutil/boto/boto/gs/__init__.py +22 -0
- data/packages/gsutil/boto/boto/gs/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/acl.py +304 -0
- data/packages/gsutil/boto/boto/gs/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucket.py +870 -0
- data/packages/gsutil/boto/boto/gs/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.py +64 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/connection.py +103 -0
- data/packages/gsutil/boto/boto/gs/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/cors.py +169 -0
- data/packages/gsutil/boto/boto/gs/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/key.py +704 -0
- data/packages/gsutil/boto/boto/gs/key.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.py +659 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/user.py +54 -0
- data/packages/gsutil/boto/boto/gs/user.pyc +0 -0
- data/packages/gsutil/boto/boto/handler.py +44 -0
- data/packages/gsutil/boto/boto/handler.pyc +0 -0
- data/packages/gsutil/boto/boto/https_connection.py +124 -0
- data/packages/gsutil/boto/boto/https_connection.pyc +0 -0
- data/packages/gsutil/boto/boto/iam/__init__.py +74 -0
- data/packages/gsutil/boto/boto/iam/connection.py +1317 -0
- data/packages/gsutil/boto/boto/iam/summarymap.py +42 -0
- data/packages/gsutil/boto/boto/jsonresponse.py +163 -0
- data/packages/gsutil/boto/boto/jsonresponse.pyc +0 -0
- data/packages/gsutil/boto/boto/manage/__init__.py +23 -0
- data/packages/gsutil/boto/boto/manage/cmdshell.py +241 -0
- data/packages/gsutil/boto/boto/manage/propget.py +64 -0
- data/packages/gsutil/boto/boto/manage/server.py +556 -0
- data/packages/gsutil/boto/boto/manage/task.py +175 -0
- data/packages/gsutil/boto/boto/manage/test_manage.py +34 -0
- data/packages/gsutil/boto/boto/manage/volume.py +420 -0
- data/packages/gsutil/boto/boto/mashups/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mashups/interactive.py +97 -0
- data/packages/gsutil/boto/boto/mashups/iobject.py +115 -0
- data/packages/gsutil/boto/boto/mashups/order.py +211 -0
- data/packages/gsutil/boto/boto/mashups/server.py +395 -0
- data/packages/gsutil/boto/boto/mturk/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mturk/connection.py +1027 -0
- data/packages/gsutil/boto/boto/mturk/layoutparam.py +55 -0
- data/packages/gsutil/boto/boto/mturk/notification.py +103 -0
- data/packages/gsutil/boto/boto/mturk/price.py +48 -0
- data/packages/gsutil/boto/boto/mturk/qualification.py +137 -0
- data/packages/gsutil/boto/boto/mturk/question.py +455 -0
- data/packages/gsutil/boto/boto/mws/__init__.py +21 -0
- data/packages/gsutil/boto/boto/mws/connection.py +813 -0
- data/packages/gsutil/boto/boto/mws/exception.py +75 -0
- data/packages/gsutil/boto/boto/mws/response.py +655 -0
- data/packages/gsutil/boto/boto/plugin.py +90 -0
- data/packages/gsutil/boto/boto/plugin.pyc +0 -0
- data/packages/gsutil/boto/boto/provider.py +337 -0
- data/packages/gsutil/boto/boto/provider.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/bootstrap.py +134 -0
- data/packages/gsutil/boto/boto/pyami/config.py +229 -0
- data/packages/gsutil/boto/boto/pyami/config.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/copybot.cfg +60 -0
- data/packages/gsutil/boto/boto/pyami/copybot.py +97 -0
- data/packages/gsutil/boto/boto/pyami/helloworld.py +28 -0
- data/packages/gsutil/boto/boto/pyami/installers/__init__.py +64 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/apache.py +43 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/ebs.py +238 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/installer.py +96 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/mysql.py +109 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/trac.py +139 -0
- data/packages/gsutil/boto/boto/pyami/launch_ami.py +178 -0
- data/packages/gsutil/boto/boto/pyami/scriptbase.py +44 -0
- data/packages/gsutil/boto/boto/pyami/startup.py +60 -0
- data/packages/gsutil/boto/boto/rds/__init__.py +1194 -0
- data/packages/gsutil/boto/boto/rds/dbinstance.py +357 -0
- data/packages/gsutil/boto/boto/rds/dbsecuritygroup.py +177 -0
- data/packages/gsutil/boto/boto/rds/dbsnapshot.py +108 -0
- data/packages/gsutil/boto/boto/rds/event.py +49 -0
- data/packages/gsutil/boto/boto/rds/parametergroup.py +201 -0
- data/packages/gsutil/boto/boto/rds/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/regioninfo.py +63 -0
- data/packages/gsutil/boto/boto/regioninfo.pyc +0 -0
- data/packages/gsutil/boto/boto/resultset.py +169 -0
- data/packages/gsutil/boto/boto/resultset.pyc +0 -0
- data/packages/gsutil/boto/boto/roboto/__init__.py +1 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryrequest.py +504 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryservice.py +121 -0
- data/packages/gsutil/boto/boto/roboto/param.py +147 -0
- data/packages/gsutil/boto/boto/route53/__init__.py +75 -0
- data/packages/gsutil/boto/boto/route53/connection.py +403 -0
- data/packages/gsutil/boto/boto/route53/exception.py +27 -0
- data/packages/gsutil/boto/boto/route53/hostedzone.py +56 -0
- data/packages/gsutil/boto/boto/route53/record.py +306 -0
- data/packages/gsutil/boto/boto/route53/status.py +42 -0
- data/packages/gsutil/boto/boto/route53/zone.py +412 -0
- data/packages/gsutil/boto/boto/s3/__init__.py +84 -0
- data/packages/gsutil/boto/boto/s3/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/acl.py +164 -0
- data/packages/gsutil/boto/boto/s3/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucket.py +1634 -0
- data/packages/gsutil/boto/boto/s3/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.py +139 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.py +83 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/connection.py +540 -0
- data/packages/gsutil/boto/boto/s3/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/cors.py +210 -0
- data/packages/gsutil/boto/boto/s3/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.py +55 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/key.py +1712 -0
- data/packages/gsutil/boto/boto/s3/key.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/keyfile.py +134 -0
- data/packages/gsutil/boto/boto/s3/keyfile.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.py +231 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multidelete.py +138 -0
- data/packages/gsutil/boto/boto/s3/multidelete.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multipart.py +315 -0
- data/packages/gsutil/boto/boto/s3/multipart.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/prefix.py +42 -0
- data/packages/gsutil/boto/boto/s3/prefix.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.py +339 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/tagging.py +71 -0
- data/packages/gsutil/boto/boto/s3/tagging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/user.py +49 -0
- data/packages/gsutil/boto/boto/s3/user.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/website.py +237 -0
- data/packages/gsutil/boto/boto/s3/website.pyc +0 -0
- data/packages/gsutil/boto/boto/sdb/__init__.py +67 -0
- data/packages/gsutil/boto/boto/sdb/connection.py +617 -0
- data/packages/gsutil/boto/boto/sdb/db/__init__.py +20 -0
- data/packages/gsutil/boto/boto/sdb/db/blob.py +75 -0
- data/packages/gsutil/boto/boto/sdb/db/key.py +59 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/__init__.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/sdbmanager.py +732 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/xmlmanager.py +517 -0
- data/packages/gsutil/boto/boto/sdb/db/model.py +294 -0
- data/packages/gsutil/boto/boto/sdb/db/property.py +703 -0
- data/packages/gsutil/boto/boto/sdb/db/query.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/sequence.py +226 -0
- data/packages/gsutil/boto/boto/sdb/db/test_db.py +231 -0
- data/packages/gsutil/boto/boto/sdb/domain.py +377 -0
- data/packages/gsutil/boto/boto/sdb/item.py +181 -0
- data/packages/gsutil/boto/boto/sdb/queryresultset.py +92 -0
- data/packages/gsutil/boto/boto/sdb/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/services/__init__.py +23 -0
- data/packages/gsutil/boto/boto/services/bs.py +179 -0
- data/packages/gsutil/boto/boto/services/message.py +58 -0
- data/packages/gsutil/boto/boto/services/result.py +136 -0
- data/packages/gsutil/boto/boto/services/service.py +161 -0
- data/packages/gsutil/boto/boto/services/servicedef.py +91 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.cfg +43 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.py +81 -0
- data/packages/gsutil/boto/boto/services/submit.py +88 -0
- data/packages/gsutil/boto/boto/ses/__init__.py +54 -0
- data/packages/gsutil/boto/boto/ses/connection.py +521 -0
- data/packages/gsutil/boto/boto/ses/exceptions.py +77 -0
- data/packages/gsutil/boto/boto/sns/__init__.py +78 -0
- data/packages/gsutil/boto/boto/sns/connection.py +431 -0
- data/packages/gsutil/boto/boto/sqs/__init__.py +56 -0
- data/packages/gsutil/boto/boto/sqs/attributes.py +46 -0
- data/packages/gsutil/boto/boto/sqs/batchresults.py +95 -0
- data/packages/gsutil/boto/boto/sqs/connection.py +417 -0
- data/packages/gsutil/boto/boto/sqs/jsonmessage.py +43 -0
- data/packages/gsutil/boto/boto/sqs/message.py +253 -0
- data/packages/gsutil/boto/boto/sqs/queue.py +478 -0
- data/packages/gsutil/boto/boto/sqs/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/storage_uri.py +835 -0
- data/packages/gsutil/boto/boto/storage_uri.pyc +0 -0
- data/packages/gsutil/boto/boto/sts/__init__.py +55 -0
- data/packages/gsutil/boto/boto/sts/connection.py +207 -0
- data/packages/gsutil/boto/boto/sts/credentials.py +215 -0
- data/packages/gsutil/boto/boto/swf/__init__.py +60 -0
- data/packages/gsutil/boto/boto/swf/exceptions.py +44 -0
- data/packages/gsutil/boto/boto/swf/layer1.py +1512 -0
- data/packages/gsutil/boto/boto/swf/layer1_decisions.py +287 -0
- data/packages/gsutil/boto/boto/swf/layer2.py +342 -0
- data/packages/gsutil/boto/boto/utils.py +927 -0
- data/packages/gsutil/boto/boto/utils.pyc +0 -0
- data/packages/gsutil/boto/boto/vpc/__init__.py +910 -0
- data/packages/gsutil/boto/boto/vpc/customergateway.py +54 -0
- data/packages/gsutil/boto/boto/vpc/dhcpoptions.py +72 -0
- data/packages/gsutil/boto/boto/vpc/internetgateway.py +72 -0
- data/packages/gsutil/boto/boto/vpc/routetable.py +109 -0
- data/packages/gsutil/boto/boto/vpc/subnet.py +57 -0
- data/packages/gsutil/boto/boto/vpc/vpc.py +54 -0
- data/packages/gsutil/boto/boto/vpc/vpnconnection.py +60 -0
- data/packages/gsutil/boto/boto/vpc/vpngateway.py +83 -0
- data/packages/gsutil/boto/docs/BotoCheatSheet.pdf +0 -0
- data/packages/gsutil/boto/docs/Makefile +89 -0
- data/packages/gsutil/boto/docs/make.bat +113 -0
- data/packages/gsutil/boto/docs/source/_templates/layout.html +3 -0
- data/packages/gsutil/boto/docs/source/autoscale_tut.rst +220 -0
- data/packages/gsutil/boto/docs/source/boto_config_tut.rst +125 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/boto.css_t +239 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/pygments.css +61 -0
- data/packages/gsutil/boto/docs/source/boto_theme/theme.conf +3 -0
- data/packages/gsutil/boto/docs/source/cloudfront_tut.rst +196 -0
- data/packages/gsutil/boto/docs/source/cloudsearch_tut.rst +411 -0
- data/packages/gsutil/boto/docs/source/cloudwatch_tut.rst +116 -0
- data/packages/gsutil/boto/docs/source/conf.py +32 -0
- data/packages/gsutil/boto/docs/source/contributing.rst +204 -0
- data/packages/gsutil/boto/docs/source/documentation.rst +59 -0
- data/packages/gsutil/boto/docs/source/dynamodb_tut.rst +339 -0
- data/packages/gsutil/boto/docs/source/ec2_tut.rst +86 -0
- data/packages/gsutil/boto/docs/source/elb_tut.rst +257 -0
- data/packages/gsutil/boto/docs/source/emr_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/index.rst +146 -0
- data/packages/gsutil/boto/docs/source/rds_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/ref/autoscale.rst +62 -0
- data/packages/gsutil/boto/docs/source/ref/beanstalk.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/boto.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/cloudformation.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/cloudfront.rst +68 -0
- data/packages/gsutil/boto/docs/source/ref/cloudsearch.rst +59 -0
- data/packages/gsutil/boto/docs/source/ref/cloudwatch.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/contrib.rst +32 -0
- data/packages/gsutil/boto/docs/source/ref/datapipeline.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/dynamodb.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ec2.rst +140 -0
- data/packages/gsutil/boto/docs/source/ref/ecs.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elasticache.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elastictranscoder.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/elb.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/emr.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/file.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/fps.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/glacier.rst +63 -0
- data/packages/gsutil/boto/docs/source/ref/gs.rst +72 -0
- data/packages/gsutil/boto/docs/source/ref/iam.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/index.rst +40 -0
- data/packages/gsutil/boto/docs/source/ref/manage.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/mturk.rst +54 -0
- data/packages/gsutil/boto/docs/source/ref/mws.rst +33 -0
- data/packages/gsutil/boto/docs/source/ref/pyami.rst +103 -0
- data/packages/gsutil/boto/docs/source/ref/rds.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/route53.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/s3.rst +111 -0
- data/packages/gsutil/boto/docs/source/ref/sdb.rst +45 -0
- data/packages/gsutil/boto/docs/source/ref/sdb_db.rst +83 -0
- data/packages/gsutil/boto/docs/source/ref/services.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ses.rst +21 -0
- data/packages/gsutil/boto/docs/source/ref/sns.rst +17 -0
- data/packages/gsutil/boto/docs/source/ref/sqs.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/sts.rst +25 -0
- data/packages/gsutil/boto/docs/source/ref/swf.rst +22 -0
- data/packages/gsutil/boto/docs/source/ref/vpc.rst +54 -0
- data/packages/gsutil/boto/docs/source/s3_tut.rst +450 -0
- data/packages/gsutil/boto/docs/source/security_groups.rst +82 -0
- data/packages/gsutil/boto/docs/source/ses_tut.rst +171 -0
- data/packages/gsutil/boto/docs/source/simpledb_tut.rst +188 -0
- data/packages/gsutil/boto/docs/source/sqs_tut.rst +246 -0
- data/packages/gsutil/boto/docs/source/vpc_tut.rst +100 -0
- data/packages/gsutil/boto/pylintrc +305 -0
- data/packages/gsutil/boto/requirements.txt +10 -0
- data/packages/gsutil/boto/setup.py +89 -0
- data/packages/gsutil/boto/tests/__init__.py +20 -0
- data/packages/gsutil/boto/tests/db/test_lists.py +96 -0
- data/packages/gsutil/boto/tests/db/test_password.py +128 -0
- data/packages/gsutil/boto/tests/db/test_query.py +152 -0
- data/packages/gsutil/boto/tests/db/test_sequence.py +109 -0
- data/packages/gsutil/boto/tests/devpay/__init__.py +0 -0
- data/packages/gsutil/boto/tests/devpay/test_s3.py +181 -0
- data/packages/gsutil/boto/tests/fps/__init__.py +0 -0
- data/packages/gsutil/boto/tests/fps/test.py +100 -0
- data/packages/gsutil/boto/tests/fps/test_verify_signature.py +12 -0
- data/packages/gsutil/boto/tests/integration/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/beanstalk/test_wrapper.py +209 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_connection.py +110 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/datapipeline/test_layer1.py +122 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer1.py +266 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer2.py +484 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_table.py +84 -0
- data/packages/gsutil/boto/tests/integration/ec2/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_connection.py +167 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_connection.py +277 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_connection.py +130 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_connection.py +192 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/test_connection.py +95 -0
- data/packages/gsutil/boto/tests/integration/elasticache/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elasticache/test_layer1.py +67 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_cert_verification.py +35 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_layer1.py +115 -0
- data/packages/gsutil/boto/tests/integration/emr/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/emr/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/__init__.py +22 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer1.py +44 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer2.py +45 -0
- data/packages/gsutil/boto/tests/integration/gs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/gs/cb_test_harness.py +71 -0
- data/packages/gsutil/boto/tests/integration/gs/test_basic.py +379 -0
- data/packages/gsutil/boto/tests/integration/gs/test_generation_conditionals.py +399 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_downloads.py +358 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_uploads.py +525 -0
- data/packages/gsutil/boto/tests/integration/gs/test_storage_uri.py +125 -0
- data/packages/gsutil/boto/tests/integration/gs/test_versioning.py +268 -0
- data/packages/gsutil/boto/tests/integration/gs/testcase.py +116 -0
- data/packages/gsutil/boto/tests/integration/gs/util.py +63 -0
- data/packages/gsutil/boto/tests/integration/iam/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/iam/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/mws/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/mws/test.py +100 -0
- data/packages/gsutil/boto/tests/integration/rds/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/rds/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/route53/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/test_zone.py +132 -0
- data/packages/gsutil/boto/tests/integration/s3/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/s3/mock_storage_service.py +589 -0
- data/packages/gsutil/boto/tests/integration/s3/other_cacerts.txt +70 -0
- data/packages/gsutil/boto/tests/integration/s3/test_bucket.py +263 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/s3/test_connection.py +245 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cors.py +78 -0
- data/packages/gsutil/boto/tests/integration/s3/test_encryption.py +115 -0
- data/packages/gsutil/boto/tests/integration/s3/test_https_cert_validation.py +141 -0
- data/packages/gsutil/boto/tests/integration/s3/test_key.py +375 -0
- data/packages/gsutil/boto/tests/integration/s3/test_mfa.py +95 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multidelete.py +181 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multipart.py +139 -0
- data/packages/gsutil/boto/tests/integration/s3/test_pool.py +246 -0
- data/packages/gsutil/boto/tests/integration/s3/test_versioning.py +158 -0
- data/packages/gsutil/boto/tests/integration/sdb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_connection.py +119 -0
- data/packages/gsutil/boto/tests/integration/ses/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ses/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ses/test_connection.py +38 -0
- data/packages/gsutil/boto/tests/integration/sns/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sns/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_connection.py +217 -0
- data/packages/gsutil/boto/tests/integration/sts/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sts/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sts/test_session_token.py +65 -0
- data/packages/gsutil/boto/tests/integration/swf/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/swf/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1.py +246 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1_workflow_execution.py +173 -0
- data/packages/gsutil/boto/tests/mturk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/mturk/_init_environment.py +28 -0
- data/packages/gsutil/boto/tests/mturk/all_tests.py +24 -0
- data/packages/gsutil/boto/tests/mturk/cleanup_tests.py +47 -0
- data/packages/gsutil/boto/tests/mturk/common.py +45 -0
- data/packages/gsutil/boto/tests/mturk/create_free_text_question_regex.doctest +100 -0
- data/packages/gsutil/boto/tests/mturk/create_hit.doctest +92 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_binary.doctest +94 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_external.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_from_hit_type.doctest +103 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_test.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_with_qualifications.py +16 -0
- data/packages/gsutil/boto/tests/mturk/hit_persistence.py +27 -0
- data/packages/gsutil/boto/tests/mturk/mocks.py +11 -0
- data/packages/gsutil/boto/tests/mturk/reviewable_hits.doctest +129 -0
- data/packages/gsutil/boto/tests/mturk/run-doctest.py +13 -0
- data/packages/gsutil/boto/tests/mturk/search_hits.doctest +16 -0
- data/packages/gsutil/boto/tests/mturk/selenium_support.py +61 -0
- data/packages/gsutil/boto/tests/mturk/support.py +7 -0
- data/packages/gsutil/boto/tests/mturk/test_disable_hit.py +11 -0
- data/packages/gsutil/boto/tests/test.py +59 -0
- data/packages/gsutil/boto/tests/unit/__init__.py +79 -0
- data/packages/gsutil/boto/tests/unit/auth/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/auth/test_sigv4.py +73 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/test_layer1.py +128 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_connection.py +605 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_stack.py +63 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_invalidation_list.py +113 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_signed_urls.py +354 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/__init__.py +1 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_connection.py +241 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_document.py +324 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_search.py +325 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_batch.py +103 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_layer2.py +119 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_types.py +82 -0
- data/packages/gsutil/boto/tests/unit/ec2/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/test_group.py +162 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_address.py +39 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_blockdevicemapping.py +79 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_connection.py +480 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_instance.py +243 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_networkinterface.py +140 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_volume.py +248 -0
- data/packages/gsutil/boto/tests/unit/emr/test_emr_responses.py +373 -0
- data/packages/gsutil/boto/tests/unit/glacier/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_concurrent.py +120 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_job.py +60 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer1.py +98 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer2.py +266 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_utils.py +116 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_vault.py +100 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_writer.py +185 -0
- data/packages/gsutil/boto/tests/unit/provider/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/provider/test_provider.py +176 -0
- data/packages/gsutil/boto/tests/unit/rds/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/rds/test_connection.py +131 -0
- data/packages/gsutil/boto/tests/unit/s3/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/s3/test_cors_configuration.py +77 -0
- data/packages/gsutil/boto/tests/unit/s3/test_key.py +75 -0
- data/packages/gsutil/boto/tests/unit/s3/test_keyfile.py +101 -0
- data/packages/gsutil/boto/tests/unit/s3/test_lifecycle.py +97 -0
- data/packages/gsutil/boto/tests/unit/s3/test_tagging.py +47 -0
- data/packages/gsutil/boto/tests/unit/s3/test_uri.py +257 -0
- data/packages/gsutil/boto/tests/unit/s3/test_website.py +188 -0
- data/packages/gsutil/boto/tests/unit/sns/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sns/test_connection.py +99 -0
- data/packages/gsutil/boto/tests/unit/sqs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_connection.py +98 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_queue.py +40 -0
- data/packages/gsutil/boto/tests/unit/sts/test_connection.py +74 -0
- data/packages/gsutil/boto/tests/unit/test_connection.py +60 -0
- data/packages/gsutil/boto/tests/unit/utils/test_utils.py +109 -0
- data/packages/gsutil/boto/tox.ini +8 -0
- data/packages/gsutil/gslib/README +5 -0
- data/packages/gsutil/gslib/__init__.py +22 -0
- data/packages/gsutil/gslib/__init__.pyc +0 -0
- data/packages/gsutil/gslib/addlhelp/__init__.py +15 -0
- data/packages/gsutil/gslib/addlhelp/acls.py +234 -0
- data/packages/gsutil/gslib/addlhelp/anon.py +57 -0
- data/packages/gsutil/gslib/addlhelp/command_opts.py +116 -0
- data/packages/gsutil/gslib/addlhelp/dev.py +139 -0
- data/packages/gsutil/gslib/addlhelp/metadata.py +186 -0
- data/packages/gsutil/gslib/addlhelp/naming.py +173 -0
- data/packages/gsutil/gslib/addlhelp/prod.py +160 -0
- data/packages/gsutil/gslib/addlhelp/projects.py +130 -0
- data/packages/gsutil/gslib/addlhelp/subdirs.py +110 -0
- data/packages/gsutil/gslib/addlhelp/support.py +86 -0
- data/packages/gsutil/gslib/addlhelp/versioning.py +242 -0
- data/packages/gsutil/gslib/addlhelp/wildcards.py +170 -0
- data/packages/gsutil/gslib/bucket_listing_ref.py +175 -0
- data/packages/gsutil/gslib/bucket_listing_ref.pyc +0 -0
- data/packages/gsutil/gslib/command.py +722 -0
- data/packages/gsutil/gslib/command.pyc +0 -0
- data/packages/gsutil/gslib/command_runner.py +101 -0
- data/packages/gsutil/gslib/command_runner.pyc +0 -0
- data/packages/gsutil/gslib/commands/__init__.py +15 -0
- data/packages/gsutil/gslib/commands/__init__.pyc +0 -0
- data/packages/gsutil/gslib/commands/cat.py +131 -0
- data/packages/gsutil/gslib/commands/cat.pyc +0 -0
- data/packages/gsutil/gslib/commands/chacl.py +532 -0
- data/packages/gsutil/gslib/commands/chacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/config.py +694 -0
- data/packages/gsutil/gslib/commands/config.pyc +0 -0
- data/packages/gsutil/gslib/commands/cp.py +1818 -0
- data/packages/gsutil/gslib/commands/cp.pyc +0 -0
- data/packages/gsutil/gslib/commands/disablelogging.py +101 -0
- data/packages/gsutil/gslib/commands/disablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/enablelogging.py +149 -0
- data/packages/gsutil/gslib/commands/enablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getacl.py +82 -0
- data/packages/gsutil/gslib/commands/getacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getcors.py +121 -0
- data/packages/gsutil/gslib/commands/getcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/getdefacl.py +86 -0
- data/packages/gsutil/gslib/commands/getdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getlogging.py +137 -0
- data/packages/gsutil/gslib/commands/getlogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getversioning.py +116 -0
- data/packages/gsutil/gslib/commands/getversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/getwebcfg.py +122 -0
- data/packages/gsutil/gslib/commands/getwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/help.py +218 -0
- data/packages/gsutil/gslib/commands/help.pyc +0 -0
- data/packages/gsutil/gslib/commands/ls.py +578 -0
- data/packages/gsutil/gslib/commands/ls.pyc +0 -0
- data/packages/gsutil/gslib/commands/mb.py +172 -0
- data/packages/gsutil/gslib/commands/mb.pyc +0 -0
- data/packages/gsutil/gslib/commands/mv.py +159 -0
- data/packages/gsutil/gslib/commands/mv.pyc +0 -0
- data/packages/gsutil/gslib/commands/perfdiag.py +903 -0
- data/packages/gsutil/gslib/commands/perfdiag.pyc +0 -0
- data/packages/gsutil/gslib/commands/rb.py +113 -0
- data/packages/gsutil/gslib/commands/rb.pyc +0 -0
- data/packages/gsutil/gslib/commands/rm.py +239 -0
- data/packages/gsutil/gslib/commands/rm.pyc +0 -0
- data/packages/gsutil/gslib/commands/setacl.py +138 -0
- data/packages/gsutil/gslib/commands/setacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setcors.py +145 -0
- data/packages/gsutil/gslib/commands/setcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/setdefacl.py +105 -0
- data/packages/gsutil/gslib/commands/setdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setmeta.py +428 -0
- data/packages/gsutil/gslib/commands/setmeta.pyc +0 -0
- data/packages/gsutil/gslib/commands/setversioning.py +114 -0
- data/packages/gsutil/gslib/commands/setversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/setwebcfg.py +190 -0
- data/packages/gsutil/gslib/commands/setwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/test.py +228 -0
- data/packages/gsutil/gslib/commands/test.pyc +0 -0
- data/packages/gsutil/gslib/commands/update.py +305 -0
- data/packages/gsutil/gslib/commands/update.pyc +0 -0
- data/packages/gsutil/gslib/commands/version.py +150 -0
- data/packages/gsutil/gslib/commands/version.pyc +0 -0
- data/packages/gsutil/gslib/exception.py +76 -0
- data/packages/gsutil/gslib/exception.pyc +0 -0
- data/packages/gsutil/gslib/help_provider.py +81 -0
- data/packages/gsutil/gslib/help_provider.pyc +0 -0
- data/packages/gsutil/gslib/name_expansion.py +550 -0
- data/packages/gsutil/gslib/name_expansion.pyc +0 -0
- data/packages/gsutil/gslib/no_op_auth_plugin.py +30 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.py +56 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.pyc +0 -0
- data/packages/gsutil/gslib/project_id.py +67 -0
- data/packages/gsutil/gslib/project_id.pyc +0 -0
- data/packages/gsutil/gslib/storage_uri_builder.py +56 -0
- data/packages/gsutil/gslib/storage_uri_builder.pyc +0 -0
- data/packages/gsutil/gslib/tests/__init__.py +15 -0
- data/packages/gsutil/gslib/tests/__init__.pyc +0 -0
- data/packages/gsutil/gslib/tests/test_chacl.py +236 -0
- data/packages/gsutil/gslib/tests/test_cp.py +267 -0
- data/packages/gsutil/gslib/tests/test_data/test.gif +0 -0
- data/packages/gsutil/gslib/tests/test_data/test.mp3 +0 -0
- data/packages/gsutil/gslib/tests/test_ls.py +66 -0
- data/packages/gsutil/gslib/tests/test_mv.py +69 -0
- data/packages/gsutil/gslib/tests/test_naming.py +989 -0
- data/packages/gsutil/gslib/tests/test_perfdiag.py +41 -0
- data/packages/gsutil/gslib/tests/test_plurality_checkable_iterator.py +67 -0
- data/packages/gsutil/gslib/tests/test_rm.py +143 -0
- data/packages/gsutil/gslib/tests/test_setacl.py +152 -0
- data/packages/gsutil/gslib/tests/test_setcors.py +168 -0
- data/packages/gsutil/gslib/tests/test_setmeta.py +91 -0
- data/packages/gsutil/gslib/tests/test_setversioning.py +44 -0
- data/packages/gsutil/gslib/tests/test_setwebcfg.py +63 -0
- data/packages/gsutil/gslib/tests/test_thread_pool.py +92 -0
- data/packages/gsutil/gslib/tests/test_wildcard_iterator.py +364 -0
- data/packages/gsutil/gslib/tests/testcase/__init__.py +18 -0
- data/packages/gsutil/gslib/tests/testcase/base.py +89 -0
- data/packages/gsutil/gslib/tests/testcase/integration_testcase.py +197 -0
- data/packages/gsutil/gslib/tests/testcase/unit_testcase.py +230 -0
- data/packages/gsutil/gslib/tests/util.py +125 -0
- data/packages/gsutil/gslib/tests/util.pyc +0 -0
- data/packages/gsutil/gslib/thread_pool.py +79 -0
- data/packages/gsutil/gslib/thread_pool.pyc +0 -0
- data/packages/gsutil/gslib/util.py +151 -0
- data/packages/gsutil/gslib/util.pyc +0 -0
- data/packages/gsutil/gslib/wildcard_iterator.py +492 -0
- data/packages/gsutil/gslib/wildcard_iterator.pyc +0 -0
- data/packages/gsutil/gsutil +377 -0
- data/packages/gsutil/gsutil.spec.in +75 -0
- data/packages/gsutil/oauth2_plugin/__init__.py +22 -0
- data/packages/gsutil/oauth2_plugin/__init__.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.py +642 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client_test.py +374 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.py +110 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.py +24 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.pyc +0 -0
- data/packages/gsutil/pkg_gen.sh +54 -0
- data/packages/gsutil/pkg_util.py +60 -0
- data/packages/gsutil/setup.py +141 -0
- data/packages/gsutil/third_party/__init__.py +0 -0
- data/packages/gsutil/third_party/__init__.pyc +0 -0
- data/packages/gsutil/third_party/fancy_urllib/README +21 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.py +398 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.pyc +0 -0
- data/tasks/rubygem.rake +3 -1
- metadata +770 -7
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright 2013 Google Inc. All Rights Reserved.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import gslib.tests.testcase as testcase
|
|
17
|
+
from gslib.tests.util import ObjectToURI as suri
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TestSetMeta(testcase.GsUtilIntegrationTestCase):
|
|
21
|
+
"""Integration tests for setmeta command."""
|
|
22
|
+
|
|
23
|
+
def test_initial_metadata(self):
|
|
24
|
+
objuri = suri(self.CreateObject(contents='foo'))
|
|
25
|
+
inpath = self.CreateTempFile()
|
|
26
|
+
ct = 'image/gif'
|
|
27
|
+
self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:%s' % ct,
|
|
28
|
+
'cp', inpath, objuri])
|
|
29
|
+
stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
|
30
|
+
self.assertIn('Content-Type:\t%s' % ct, stdout)
|
|
31
|
+
self.assertIn('x-goog-meta-xyz:\tabc', stdout)
|
|
32
|
+
|
|
33
|
+
def test_overwrite_existing(self):
|
|
34
|
+
objuri = suri(self.CreateObject(contents='foo'))
|
|
35
|
+
inpath = self.CreateTempFile()
|
|
36
|
+
self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:image/gif',
|
|
37
|
+
'cp', inpath, objuri])
|
|
38
|
+
self.RunGsUtil(['setmeta', '-n', '-h', 'Content-Type:text/html', '-h',
|
|
39
|
+
'x-goog-meta-xyz', objuri])
|
|
40
|
+
stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
|
41
|
+
self.assertIn('Content-Type:\ttext/html', stdout)
|
|
42
|
+
self.assertNotIn('xyz', stdout)
|
|
43
|
+
|
|
44
|
+
def test_missing_header(self):
|
|
45
|
+
stderr = self.RunGsUtil(['setmeta', '"Content-Type"', 'gs://foo/bar'],
|
|
46
|
+
expected_status=1, return_stderr=True)
|
|
47
|
+
self.assertIn('Fields being added must include values', stderr)
|
|
48
|
+
|
|
49
|
+
def test_minus_header_value(self):
|
|
50
|
+
stderr = self.RunGsUtil(['setmeta', '"-Content-Type:text/html"',
|
|
51
|
+
'gs://foo/bar'], expected_status=1,
|
|
52
|
+
return_stderr=True)
|
|
53
|
+
self.assertIn('Removal spec may not contain ":"', stderr)
|
|
54
|
+
|
|
55
|
+
def test_plus_and_minus(self):
|
|
56
|
+
stderr = self.RunGsUtil(['setmeta', ('"Content-Type:text/html",'
|
|
57
|
+
'"-Content-Type"'), 'gs://foo/bar'],
|
|
58
|
+
expected_status=1, return_stderr=True)
|
|
59
|
+
self.assertIn('Each header must appear at most once', stderr)
|
|
60
|
+
|
|
61
|
+
def test_non_ascii_custom_header(self):
|
|
62
|
+
stderr = self.RunGsUtil(['setmeta', '"x-goog-meta-soufflé:5"',
|
|
63
|
+
'gs://foo/bar'], expected_status=1,
|
|
64
|
+
return_stderr=True)
|
|
65
|
+
self.assertIn('Invalid non-ASCII header', stderr)
|
|
66
|
+
|
|
67
|
+
def test_disallowed_header(self):
|
|
68
|
+
stderr = self.RunGsUtil(['setmeta', '"Content-Length:5"',
|
|
69
|
+
'gs://foo/bar'], expected_status=1,
|
|
70
|
+
return_stderr=True)
|
|
71
|
+
self.assertIn('Invalid or disallowed header', stderr)
|
|
72
|
+
|
|
73
|
+
def test_deprecated_syntax(self):
|
|
74
|
+
objuri = suri(self.CreateObject(contents='foo'))
|
|
75
|
+
inpath = self.CreateTempFile()
|
|
76
|
+
self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:image/gif',
|
|
77
|
+
'cp', inpath, objuri])
|
|
78
|
+
|
|
79
|
+
stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
|
80
|
+
self.assertIn('Content-Type:\timage/gif', stdout)
|
|
81
|
+
self.assertIn('x-goog-meta-xyz:\tabc', stdout)
|
|
82
|
+
|
|
83
|
+
stderr = self.RunGsUtil(
|
|
84
|
+
['setmeta', '-n', '"Content-Type:text/html","-x-goog-meta-xyz"',
|
|
85
|
+
objuri],
|
|
86
|
+
return_stderr=True)
|
|
87
|
+
self.assertIn('WARNING: metadata spec syntax', stderr)
|
|
88
|
+
self.assertIn('is deprecated and will eventually be removed', stderr)
|
|
89
|
+
stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
|
90
|
+
self.assertIn('Content-Type:\ttext/html', stdout)
|
|
91
|
+
self.assertNotIn('xyz', stdout)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Copyright 2013 Google Inc. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import gslib.tests.testcase as testcase
|
|
16
|
+
from gslib.tests.util import ObjectToURI as suri
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TestSetVersioning(testcase.GsUtilIntegrationTestCase):
|
|
20
|
+
"""Integration tests for setversioning command."""
|
|
21
|
+
|
|
22
|
+
def test_off_default(self):
|
|
23
|
+
bucket_uri = self.CreateBucket()
|
|
24
|
+
stdout = self.RunGsUtil(['getversioning',
|
|
25
|
+
suri(bucket_uri)], return_stdout=True)
|
|
26
|
+
self.assertEqual(stdout.strip(), '%s: Suspended' % suri(bucket_uri))
|
|
27
|
+
|
|
28
|
+
def test_turning_on(self):
|
|
29
|
+
bucket_uri = self.CreateBucket()
|
|
30
|
+
self.RunGsUtil(['setversioning', 'on', suri(bucket_uri)])
|
|
31
|
+
stdout = self.RunGsUtil(['getversioning',
|
|
32
|
+
suri(bucket_uri)], return_stdout=True)
|
|
33
|
+
self.assertEqual(stdout.strip(), '%s: Enabled' % suri(bucket_uri))
|
|
34
|
+
|
|
35
|
+
def test_turning_off(self):
|
|
36
|
+
bucket_uri = self.CreateBucket()
|
|
37
|
+
self.RunGsUtil(['setversioning', 'on', suri(bucket_uri)])
|
|
38
|
+
stdout = self.RunGsUtil(['getversioning',
|
|
39
|
+
suri(bucket_uri)], return_stdout=True)
|
|
40
|
+
self.assertEqual(stdout.strip(), '%s: Enabled' % suri(bucket_uri))
|
|
41
|
+
self.RunGsUtil(['setversioning', 'off', suri(bucket_uri)])
|
|
42
|
+
stdout = self.RunGsUtil(['getversioning',
|
|
43
|
+
suri(bucket_uri)], return_stdout=True)
|
|
44
|
+
self.assertEqual(stdout.strip(), '%s: Suspended' % suri(bucket_uri))
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Copyright 2013 Google Inc. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from xml.dom.minidom import parseString
|
|
16
|
+
|
|
17
|
+
import gslib.tests.testcase as testcase
|
|
18
|
+
from gslib.tests.util import ObjectToURI as suri
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
WEBCFG_FULL = parseString(
|
|
22
|
+
'<WebsiteConfiguration><MainPageSuffix>main'
|
|
23
|
+
'</MainPageSuffix><NotFoundPage>404</NotFoundPage>'
|
|
24
|
+
'</WebsiteConfiguration>').toprettyxml()
|
|
25
|
+
|
|
26
|
+
WEBCFG_MAIN = parseString(
|
|
27
|
+
'<WebsiteConfiguration>'
|
|
28
|
+
'<MainPageSuffix>main</MainPageSuffix>'
|
|
29
|
+
'</WebsiteConfiguration>').toprettyxml()
|
|
30
|
+
|
|
31
|
+
WEBCFG_ERROR = parseString(
|
|
32
|
+
'<WebsiteConfiguration><NotFoundPage>'
|
|
33
|
+
'404</NotFoundPage></WebsiteConfiguration>').toprettyxml()
|
|
34
|
+
|
|
35
|
+
WEBCFG_EMPTY = parseString('<WebsiteConfiguration/>').toprettyxml()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TestSetWebCfg(testcase.GsUtilIntegrationTestCase):
|
|
39
|
+
"""Integration tests for setwebcfg command."""
|
|
40
|
+
|
|
41
|
+
def test_full(self):
|
|
42
|
+
bucket_uri = self.CreateBucket()
|
|
43
|
+
self.RunGsUtil(['setwebcfg', '-m', 'main', '-e', '404', suri(bucket_uri)])
|
|
44
|
+
stdout = self.RunGsUtil(['getwebcfg', suri(bucket_uri)], return_stdout=True)
|
|
45
|
+
self.assertEquals(stdout, WEBCFG_FULL)
|
|
46
|
+
|
|
47
|
+
def test_main(self):
|
|
48
|
+
bucket_uri = self.CreateBucket()
|
|
49
|
+
self.RunGsUtil(['setwebcfg', '-m', 'main', suri(bucket_uri)])
|
|
50
|
+
stdout = self.RunGsUtil(['getwebcfg', suri(bucket_uri)], return_stdout=True)
|
|
51
|
+
self.assertEquals(stdout, WEBCFG_MAIN)
|
|
52
|
+
|
|
53
|
+
def test_error(self):
|
|
54
|
+
bucket_uri = self.CreateBucket()
|
|
55
|
+
self.RunGsUtil(['setwebcfg', '-e', '404', suri(bucket_uri)])
|
|
56
|
+
stdout = self.RunGsUtil(['getwebcfg', suri(bucket_uri)], return_stdout=True)
|
|
57
|
+
self.assertEquals(stdout, WEBCFG_ERROR)
|
|
58
|
+
|
|
59
|
+
def test_empty(self):
|
|
60
|
+
bucket_uri = self.CreateBucket()
|
|
61
|
+
self.RunGsUtil(['setwebcfg', suri(bucket_uri)])
|
|
62
|
+
stdout = self.RunGsUtil(['getwebcfg', suri(bucket_uri)], return_stdout=True)
|
|
63
|
+
self.assertEquals(stdout, WEBCFG_EMPTY)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Copyright 2011 Google Inc. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
4
|
+
# copy of this software and associated documentation files (the
|
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
7
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
9
|
+
# lowing conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included
|
|
12
|
+
# in all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
15
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
16
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
17
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
18
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
20
|
+
# IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
"""Unit tests for gsutil thread pool."""
|
|
23
|
+
|
|
24
|
+
import threading
|
|
25
|
+
|
|
26
|
+
import gslib.tests.testcase as testcase
|
|
27
|
+
import gslib.thread_pool as thread_pool
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class GsutilThreadPoolTests(testcase.GsUtilUnitTestCase):
|
|
31
|
+
"""gsutil thread pool test suite."""
|
|
32
|
+
|
|
33
|
+
def _TestThreadPool(self, threads):
|
|
34
|
+
"""Tests pool with specified threads from end to end."""
|
|
35
|
+
pool = thread_pool.ThreadPool(threads)
|
|
36
|
+
|
|
37
|
+
self.actual_call_count = 0
|
|
38
|
+
expected_call_count = 10000
|
|
39
|
+
|
|
40
|
+
self.data = xrange(expected_call_count)
|
|
41
|
+
|
|
42
|
+
self.actual_result = 0
|
|
43
|
+
expected_result = sum(self.data)
|
|
44
|
+
|
|
45
|
+
stats_lock = threading.Lock()
|
|
46
|
+
|
|
47
|
+
def _Dummy(num):
|
|
48
|
+
stats_lock.acquire()
|
|
49
|
+
self.actual_call_count += 1
|
|
50
|
+
self.actual_result += num
|
|
51
|
+
stats_lock.release()
|
|
52
|
+
|
|
53
|
+
for data in xrange(expected_call_count):
|
|
54
|
+
pool.AddTask(_Dummy, data)
|
|
55
|
+
|
|
56
|
+
pool.WaitCompletion()
|
|
57
|
+
self.assertEqual(self.actual_call_count, expected_call_count)
|
|
58
|
+
|
|
59
|
+
self.assertEqual(self.actual_result, expected_result)
|
|
60
|
+
|
|
61
|
+
pool.Shutdown()
|
|
62
|
+
for thread in pool.threads:
|
|
63
|
+
self.assertFalse(thread.is_alive())
|
|
64
|
+
|
|
65
|
+
def testSingleThreadPool(self):
|
|
66
|
+
"""Tests thread pool with a single thread."""
|
|
67
|
+
self._TestThreadPool(1)
|
|
68
|
+
|
|
69
|
+
def testThirtyThreadPool(self):
|
|
70
|
+
"""Tests thread pool with 30 threads."""
|
|
71
|
+
self._TestThreadPool(30)
|
|
72
|
+
|
|
73
|
+
def testThreadPoolExceptionHandler(self):
|
|
74
|
+
"""Tests thread pool with exceptions."""
|
|
75
|
+
self.exception_raised = False
|
|
76
|
+
|
|
77
|
+
def _ExceptionHandler(e):
|
|
78
|
+
"""Verify an exception is raised and that it's the correct one."""
|
|
79
|
+
self.assertTrue(isinstance(e, TypeError))
|
|
80
|
+
self.assertEqual(e[0], 'gsutil')
|
|
81
|
+
self.exception_raised = True
|
|
82
|
+
|
|
83
|
+
pool = thread_pool.ThreadPool(1, exception_handler=_ExceptionHandler)
|
|
84
|
+
|
|
85
|
+
def _Dummy():
|
|
86
|
+
raise TypeError('gsutil')
|
|
87
|
+
|
|
88
|
+
pool.AddTask(_Dummy)
|
|
89
|
+
pool.WaitCompletion()
|
|
90
|
+
pool.Shutdown()
|
|
91
|
+
|
|
92
|
+
self.assertTrue(self.exception_raised)
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Copyright 2010 Google Inc. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
4
|
+
# copy of this software and associated documentation files (the
|
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
7
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
9
|
+
# lowing conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included
|
|
12
|
+
# in all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
15
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
16
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
17
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
18
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
20
|
+
# IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
"""Unit tests for gslib wildcard_iterator"""
|
|
23
|
+
|
|
24
|
+
import os.path
|
|
25
|
+
import tempfile
|
|
26
|
+
|
|
27
|
+
from boto import InvalidUriError
|
|
28
|
+
|
|
29
|
+
from gslib import wildcard_iterator
|
|
30
|
+
from gslib.project_id import ProjectIdHandler
|
|
31
|
+
import gslib.tests.testcase as testcase
|
|
32
|
+
from gslib.wildcard_iterator import ContainsWildcard
|
|
33
|
+
from gslib.tests.util import ObjectToURI as suri
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CloudWildcardIteratorTests(testcase.GsUtilUnitTestCase):
|
|
37
|
+
"""CloudWildcardIterator test suite"""
|
|
38
|
+
|
|
39
|
+
def setUp(self):
|
|
40
|
+
"""Creates 2 mock buckets, each containing 4 objects, including 1 nested."""
|
|
41
|
+
super(CloudWildcardIteratorTests, self).setUp()
|
|
42
|
+
self.immed_child_obj_names = ['abcd', 'abdd', 'ade$']
|
|
43
|
+
self.all_obj_names = ['abcd', 'abdd', 'ade$', 'nested1/nested2/xyz1',
|
|
44
|
+
'nested1/nested2/xyz2', 'nested1/nfile_abc']
|
|
45
|
+
|
|
46
|
+
self.base_bucket_uri = self.CreateBucket()
|
|
47
|
+
self.prefix_bucket_name = '%s_' % self.base_bucket_uri.bucket_name[:61]
|
|
48
|
+
self.base_uri_str = suri(self.base_bucket_uri)
|
|
49
|
+
self.base_uri_str = self.base_uri_str.replace(
|
|
50
|
+
self.base_bucket_uri.bucket_name, self.prefix_bucket_name)
|
|
51
|
+
|
|
52
|
+
self.test_bucket0_uri = self.CreateBucket(
|
|
53
|
+
bucket_name='%s0' % self.prefix_bucket_name)
|
|
54
|
+
self.test_bucket0_obj_uri_strs = set()
|
|
55
|
+
for obj_name in self.all_obj_names:
|
|
56
|
+
obj_uri = self.CreateObject(bucket_uri=self.test_bucket0_uri,
|
|
57
|
+
object_name=obj_name, contents='')
|
|
58
|
+
self.test_bucket0_obj_uri_strs.add(suri(obj_uri))
|
|
59
|
+
|
|
60
|
+
self.test_bucket1_uri = self.CreateBucket(
|
|
61
|
+
bucket_name='%s1' % self.prefix_bucket_name)
|
|
62
|
+
self.test_bucket1_obj_uri_strs = set()
|
|
63
|
+
for obj_name in self.all_obj_names:
|
|
64
|
+
obj_uri = self.CreateObject(bucket_uri=self.test_bucket1_uri,
|
|
65
|
+
object_name=obj_name, contents='')
|
|
66
|
+
self.test_bucket1_obj_uri_strs.add(suri(obj_uri))
|
|
67
|
+
|
|
68
|
+
def testNoOpObjectIterator(self):
|
|
69
|
+
"""Tests that bucket-only URI iterates just that one URI"""
|
|
70
|
+
results = list(
|
|
71
|
+
self._test_wildcard_iterator(self.test_bucket0_uri).IterUris())
|
|
72
|
+
self.assertEqual(1, len(results))
|
|
73
|
+
self.assertEqual(str(self.test_bucket0_uri), str(results[0]))
|
|
74
|
+
|
|
75
|
+
def testMatchingAllObjects(self):
|
|
76
|
+
"""Tests matching all objects, based on wildcard"""
|
|
77
|
+
actual_obj_uri_strs = set(
|
|
78
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
79
|
+
self.test_bucket0_uri.clone_replace_name('**')).IterUris())
|
|
80
|
+
self.assertEqual(self.test_bucket0_obj_uri_strs, actual_obj_uri_strs)
|
|
81
|
+
|
|
82
|
+
def testMatchingObjectSubset(self):
|
|
83
|
+
"""Tests matching a subset of objects, based on wildcard"""
|
|
84
|
+
exp_obj_uri_strs = set(
|
|
85
|
+
[str(self.test_bucket0_uri.clone_replace_name('abcd')),
|
|
86
|
+
str(self.test_bucket0_uri.clone_replace_name('abdd'))])
|
|
87
|
+
actual_obj_uri_strs = set(
|
|
88
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
89
|
+
self.test_bucket0_uri.clone_replace_name('ab??')).IterUris())
|
|
90
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
91
|
+
|
|
92
|
+
def testMatchingNonWildcardedUri(self):
|
|
93
|
+
"""Tests matching a single named object"""
|
|
94
|
+
exp_obj_uri_strs = set([str(self.test_bucket0_uri.clone_replace_name('abcd')
|
|
95
|
+
)])
|
|
96
|
+
actual_obj_uri_strs = set(
|
|
97
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
98
|
+
self.test_bucket0_uri.clone_replace_name('abcd')).IterUris())
|
|
99
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
100
|
+
|
|
101
|
+
def testWildcardedObjectUriWithVsWithoutPrefix(self):
|
|
102
|
+
"""Tests that wildcarding w/ and w/o server prefix get same result"""
|
|
103
|
+
# (It's just more efficient to query w/o a prefix; wildcard
|
|
104
|
+
# iterator will filter the matches either way.)
|
|
105
|
+
with_prefix_uri_strs = set(
|
|
106
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
107
|
+
self.test_bucket0_uri.clone_replace_name('abcd')).IterUris())
|
|
108
|
+
# By including a wildcard at the start of the string no prefix can be
|
|
109
|
+
# used in server request.
|
|
110
|
+
no_prefix_uri_strs = set(
|
|
111
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
112
|
+
self.test_bucket0_uri.clone_replace_name('?bcd')).IterUris())
|
|
113
|
+
self.assertEqual(with_prefix_uri_strs, no_prefix_uri_strs)
|
|
114
|
+
|
|
115
|
+
def testWildcardedObjectUriNestedSubdirMatch(self):
|
|
116
|
+
"""Tests wildcarding with a nested subdir"""
|
|
117
|
+
uri_strs = set()
|
|
118
|
+
prefixes = set()
|
|
119
|
+
for blr in self._test_wildcard_iterator(
|
|
120
|
+
self.test_bucket0_uri.clone_replace_name('*')):
|
|
121
|
+
if blr.HasPrefix():
|
|
122
|
+
prefixes.add(blr.GetPrefix().name)
|
|
123
|
+
else:
|
|
124
|
+
uri_strs.add(blr.GetUri().uri)
|
|
125
|
+
exp_obj_uri_strs = set([suri(self.test_bucket0_uri, x)
|
|
126
|
+
for x in self.immed_child_obj_names])
|
|
127
|
+
self.assertEqual(exp_obj_uri_strs, uri_strs)
|
|
128
|
+
self.assertEqual(1, len(prefixes))
|
|
129
|
+
self.assertTrue('nested1/' in prefixes)
|
|
130
|
+
|
|
131
|
+
def testWildcardedObjectUriNestedSubSubdirMatch(self):
|
|
132
|
+
"""Tests wildcarding with a nested sub-subdir"""
|
|
133
|
+
for final_char in ('', '/'):
|
|
134
|
+
uri_strs = set()
|
|
135
|
+
prefixes = set()
|
|
136
|
+
for blr in self._test_wildcard_iterator(
|
|
137
|
+
self.test_bucket0_uri.clone_replace_name('nested1/*%s' % final_char)):
|
|
138
|
+
if blr.HasPrefix():
|
|
139
|
+
prefixes.add(blr.GetPrefix().name)
|
|
140
|
+
else:
|
|
141
|
+
uri_strs.add(blr.GetUri().uri)
|
|
142
|
+
self.assertEqual(1, len(uri_strs))
|
|
143
|
+
self.assertEqual(1, len(prefixes))
|
|
144
|
+
self.assertTrue('nested1/nested2/' in prefixes)
|
|
145
|
+
|
|
146
|
+
def testWildcardPlusSubdirMatch(self):
|
|
147
|
+
"""Tests gs://bucket/*/subdir matching"""
|
|
148
|
+
actual_uri_strs = set()
|
|
149
|
+
actual_prefixes = set()
|
|
150
|
+
for blr in self._test_wildcard_iterator(
|
|
151
|
+
self.test_bucket0_uri.clone_replace_name('*/nested1')):
|
|
152
|
+
if blr.HasPrefix():
|
|
153
|
+
actual_prefixes.add(blr.GetPrefix().name)
|
|
154
|
+
else:
|
|
155
|
+
actual_uri_strs.add(blr.GetUri().uri)
|
|
156
|
+
expected_uri_strs = set()
|
|
157
|
+
expected_prefixes = set(['nested1/'])
|
|
158
|
+
self.assertEqual(expected_prefixes, actual_prefixes)
|
|
159
|
+
self.assertEqual(expected_uri_strs, actual_uri_strs)
|
|
160
|
+
|
|
161
|
+
def testWildcardPlusSubdirSubdirMatch(self):
|
|
162
|
+
"""Tests gs://bucket/*/subdir/* matching"""
|
|
163
|
+
actual_uri_strs = set()
|
|
164
|
+
actual_prefixes = set()
|
|
165
|
+
for blr in self._test_wildcard_iterator(
|
|
166
|
+
self.test_bucket0_uri.clone_replace_name('*/nested2/*')):
|
|
167
|
+
if blr.HasPrefix():
|
|
168
|
+
actual_prefixes.add(blr.GetPrefix().name)
|
|
169
|
+
else:
|
|
170
|
+
actual_uri_strs.add(blr.GetUri().uri)
|
|
171
|
+
expected_uri_strs = set([
|
|
172
|
+
self.test_bucket0_uri.clone_replace_name('nested1/nested2/xyz1').uri,
|
|
173
|
+
self.test_bucket0_uri.clone_replace_name('nested1/nested2/xyz2').uri])
|
|
174
|
+
expected_prefixes = set()
|
|
175
|
+
self.assertEqual(expected_prefixes, actual_prefixes)
|
|
176
|
+
self.assertEqual(expected_uri_strs, actual_uri_strs)
|
|
177
|
+
|
|
178
|
+
def testNoMatchingWildcardedObjectUri(self):
|
|
179
|
+
"""Tests that get back an empty iterator for non-matching wildcarded URI"""
|
|
180
|
+
res = list(self._test_wildcard_iterator(
|
|
181
|
+
self.test_bucket0_uri.clone_replace_name('*x0')).IterUris())
|
|
182
|
+
self.assertEqual(0, len(res))
|
|
183
|
+
|
|
184
|
+
def testWildcardedInvalidObjectUri(self):
|
|
185
|
+
"""Tests that we raise an exception for wildcarded invalid URI"""
|
|
186
|
+
try:
|
|
187
|
+
for unused_ in self._test_wildcard_iterator(
|
|
188
|
+
'badscheme://asdf').IterUris():
|
|
189
|
+
self.assertFalse('Expected InvalidUriError not raised.')
|
|
190
|
+
except InvalidUriError, e:
|
|
191
|
+
# Expected behavior.
|
|
192
|
+
self.assertTrue(e.message.find('Unrecognized scheme') != -1)
|
|
193
|
+
|
|
194
|
+
def testSingleMatchWildcardedBucketUri(self):
|
|
195
|
+
"""Tests matching a single bucket based on a wildcarded bucket URI"""
|
|
196
|
+
exp_obj_uri_strs = set([
|
|
197
|
+
suri(self.test_bucket1_uri) + self.test_bucket1_uri.delim])
|
|
198
|
+
actual_obj_uri_strs = set(
|
|
199
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
200
|
+
'%s*1' % self.base_uri_str).IterUris())
|
|
201
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
202
|
+
|
|
203
|
+
def testMultiMatchWildcardedBucketUri(self):
|
|
204
|
+
"""Tests matching a multiple buckets based on a wildcarded bucket URI"""
|
|
205
|
+
exp_obj_uri_strs = set([
|
|
206
|
+
suri(self.test_bucket0_uri) + self.test_bucket0_uri.delim,
|
|
207
|
+
suri(self.test_bucket1_uri) + self.test_bucket1_uri.delim])
|
|
208
|
+
actual_obj_uri_strs = set(
|
|
209
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
210
|
+
'%s*' % self.base_uri_str).IterUris())
|
|
211
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
212
|
+
|
|
213
|
+
def testWildcardBucketAndObjectUri(self):
|
|
214
|
+
"""Tests matching with both bucket and object wildcards"""
|
|
215
|
+
exp_obj_uri_strs = set([str(self.test_bucket0_uri.clone_replace_name(
|
|
216
|
+
'abcd'))])
|
|
217
|
+
actual_obj_uri_strs = set(
|
|
218
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
219
|
+
'%s0*/abc*' % self.base_uri_str).IterUris())
|
|
220
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
221
|
+
|
|
222
|
+
def testWildcardUpToFinalCharSubdirPlusObjectName(self):
|
|
223
|
+
"""Tests wildcard subd*r/obj name"""
|
|
224
|
+
exp_obj_uri_strs = set([str(self.test_bucket0_uri.clone_replace_name(
|
|
225
|
+
'nested1/nested2/xyz1'))])
|
|
226
|
+
actual_obj_uri_strs = set(
|
|
227
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
228
|
+
'%snested1/nest*2/xyz1' % self.test_bucket0_uri.uri).IterUris())
|
|
229
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
230
|
+
|
|
231
|
+
def testPostRecursiveWildcard(self):
|
|
232
|
+
"""Tests that wildcard containing ** followed by an additional wildcard works"""
|
|
233
|
+
exp_obj_uri_strs = set([str(self.test_bucket0_uri.clone_replace_name(
|
|
234
|
+
'nested1/nested2/xyz2'))])
|
|
235
|
+
actual_obj_uri_strs = set(
|
|
236
|
+
str(u) for u in self._test_wildcard_iterator(
|
|
237
|
+
'%s**/*y*2' % self.test_bucket0_uri.uri).IterUris())
|
|
238
|
+
self.assertEqual(exp_obj_uri_strs, actual_obj_uri_strs)
|
|
239
|
+
|
|
240
|
+
def testCallingGetKeyOnProviderOnlyWildcardIteration(self):
|
|
241
|
+
"""Tests that attempting iterating provider-only wildcard raises"""
|
|
242
|
+
try:
|
|
243
|
+
from gslib.bucket_listing_ref import BucketListingRefException
|
|
244
|
+
for iter_result in wildcard_iterator.wildcard_iterator(
|
|
245
|
+
'gs://', ProjectIdHandler(),
|
|
246
|
+
bucket_storage_uri_class=self.mock_bucket_storage_uri):
|
|
247
|
+
iter_result.GetKey()
|
|
248
|
+
self.fail('Expected BucketListingRefException not raised.')
|
|
249
|
+
except BucketListingRefException, e:
|
|
250
|
+
self.assertTrue(str(e).find(
|
|
251
|
+
'Attempt to call GetKey() on Key-less BucketListingRef') != -1)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
class FileIteratorTests(testcase.GsUtilUnitTestCase):
|
|
255
|
+
"""FileWildcardIterator test suite"""
|
|
256
|
+
|
|
257
|
+
def setUp(self):
|
|
258
|
+
"""
|
|
259
|
+
Creates a test dir containing 3 files and one nested subdirectory + file.
|
|
260
|
+
"""
|
|
261
|
+
super(FileIteratorTests, self).setUp()
|
|
262
|
+
|
|
263
|
+
self.test_dir = self.CreateTempDir(test_files=[
|
|
264
|
+
'abcd', 'abdd', 'ade$', ('dir1', 'dir2', 'zzz')])
|
|
265
|
+
|
|
266
|
+
self.root_files_uri_strs = set([
|
|
267
|
+
suri(self.test_dir, 'abcd'),
|
|
268
|
+
suri(self.test_dir, 'abdd'),
|
|
269
|
+
suri(self.test_dir, 'ade$')])
|
|
270
|
+
|
|
271
|
+
self.subdirs_uri_strs = set([suri(self.test_dir, 'dir1')])
|
|
272
|
+
|
|
273
|
+
self.nested_files_uri_strs = set([
|
|
274
|
+
suri(self.test_dir, 'dir1', 'dir2', 'zzz')])
|
|
275
|
+
|
|
276
|
+
self.immed_child_uri_strs = self.root_files_uri_strs | self.subdirs_uri_strs
|
|
277
|
+
self.all_file_uri_strs = (
|
|
278
|
+
self.root_files_uri_strs | self.nested_files_uri_strs)
|
|
279
|
+
|
|
280
|
+
def testContainsWildcard(self):
|
|
281
|
+
"""Tests ContainsWildcard call"""
|
|
282
|
+
self.assertTrue(ContainsWildcard('a*.txt'))
|
|
283
|
+
self.assertTrue(ContainsWildcard('a[0-9].txt'))
|
|
284
|
+
self.assertFalse(ContainsWildcard('0-9.txt'))
|
|
285
|
+
self.assertTrue(ContainsWildcard('?.txt'))
|
|
286
|
+
|
|
287
|
+
def testNoOpDirectoryIterator(self):
|
|
288
|
+
"""Tests that directory-only URI iterates just that one URI"""
|
|
289
|
+
results = list(
|
|
290
|
+
self._test_wildcard_iterator(suri(tempfile.tempdir)).IterUris())
|
|
291
|
+
self.assertEqual(1, len(results))
|
|
292
|
+
self.assertEqual(suri(tempfile.tempdir), str(results[0]))
|
|
293
|
+
|
|
294
|
+
def testMatchingAllFiles(self):
|
|
295
|
+
"""Tests matching all files, based on wildcard"""
|
|
296
|
+
uri = self._test_storage_uri(suri(self.test_dir, '*'))
|
|
297
|
+
actual_uri_strs = set(str(u) for u in
|
|
298
|
+
self._test_wildcard_iterator(uri).IterUris()
|
|
299
|
+
)
|
|
300
|
+
self.assertEqual(self.immed_child_uri_strs, actual_uri_strs)
|
|
301
|
+
|
|
302
|
+
def testMatchingFileSubset(self):
|
|
303
|
+
"""Tests matching a subset of files, based on wildcard"""
|
|
304
|
+
exp_uri_strs = set(
|
|
305
|
+
[suri(self.test_dir, 'abcd'), suri(self.test_dir, 'abdd')])
|
|
306
|
+
uri = self._test_storage_uri(suri(self.test_dir, 'ab??'))
|
|
307
|
+
actual_uri_strs = set(str(u) for u in
|
|
308
|
+
self._test_wildcard_iterator(uri).IterUris()
|
|
309
|
+
)
|
|
310
|
+
self.assertEqual(exp_uri_strs, actual_uri_strs)
|
|
311
|
+
|
|
312
|
+
def testMatchingNonWildcardedUri(self):
|
|
313
|
+
"""Tests matching a single named file"""
|
|
314
|
+
exp_uri_strs = set([suri(self.test_dir, 'abcd')])
|
|
315
|
+
uri = self._test_storage_uri(suri(self.test_dir, 'abcd'))
|
|
316
|
+
actual_uri_strs = set(
|
|
317
|
+
str(u) for u in self._test_wildcard_iterator(uri).IterUris())
|
|
318
|
+
self.assertEqual(exp_uri_strs, actual_uri_strs)
|
|
319
|
+
|
|
320
|
+
def testMatchingFilesIgnoringOtherRegexChars(self):
|
|
321
|
+
"""Tests ignoring non-wildcard regex chars (e.g., ^ and $)"""
|
|
322
|
+
|
|
323
|
+
exp_uri_strs = set([suri(self.test_dir, 'ade$')])
|
|
324
|
+
uri = self._test_storage_uri(suri(self.test_dir, 'ad*$'))
|
|
325
|
+
actual_uri_strs = set(
|
|
326
|
+
str(u) for u in self._test_wildcard_iterator(uri).IterUris())
|
|
327
|
+
self.assertEqual(exp_uri_strs, actual_uri_strs)
|
|
328
|
+
|
|
329
|
+
def testRecursiveDirectoryOnlyWildcarding(self):
|
|
330
|
+
"""Tests recursive expansion of directory-only '**' wildcard"""
|
|
331
|
+
uri = self._test_storage_uri(suri(self.test_dir, '**'))
|
|
332
|
+
actual_uri_strs = set(
|
|
333
|
+
str(u) for u in self._test_wildcard_iterator(uri).IterUris())
|
|
334
|
+
self.assertEqual(self.all_file_uri_strs, actual_uri_strs)
|
|
335
|
+
|
|
336
|
+
def testRecursiveDirectoryPlusFileWildcarding(self):
|
|
337
|
+
"""Tests recursive expansion of '**' directory plus '*' wildcard"""
|
|
338
|
+
uri = self._test_storage_uri(suri(self.test_dir, '**', '*'))
|
|
339
|
+
actual_uri_strs = set(
|
|
340
|
+
str(u) for u in self._test_wildcard_iterator(uri).IterUris())
|
|
341
|
+
self.assertEqual(self.all_file_uri_strs, actual_uri_strs)
|
|
342
|
+
|
|
343
|
+
def testInvalidRecursiveDirectoryWildcard(self):
|
|
344
|
+
"""Tests that wildcard containing '***' raises exception"""
|
|
345
|
+
try:
|
|
346
|
+
uri = self._test_storage_uri(suri(self.test_dir, '***', 'abcd'))
|
|
347
|
+
for unused_ in self._test_wildcard_iterator(uri).IterUris():
|
|
348
|
+
self.fail('Expected WildcardException not raised.')
|
|
349
|
+
except wildcard_iterator.WildcardException, e:
|
|
350
|
+
# Expected behavior.
|
|
351
|
+
self.assertTrue(str(e).find('more than 2 consecutive') != -1)
|
|
352
|
+
|
|
353
|
+
def testMissingDir(self):
|
|
354
|
+
"""Tests that wildcard gets empty iterator when directory doesn't exist"""
|
|
355
|
+
res = list(
|
|
356
|
+
self._test_wildcard_iterator(suri('no_such_dir', '*')).IterUris())
|
|
357
|
+
self.assertEqual(0, len(res))
|
|
358
|
+
|
|
359
|
+
def testExistingDirNoFileMatch(self):
|
|
360
|
+
"""Tests that wildcard returns empty iterator when there's no match"""
|
|
361
|
+
uri = self._test_storage_uri(
|
|
362
|
+
suri(self.test_dir, 'non_existent*'))
|
|
363
|
+
res = list(self._test_wildcard_iterator(uri).IterUris())
|
|
364
|
+
self.assertEqual(0, len(res))
|