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
|
Binary file
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
"""gsutil exceptions."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AbortException(StandardError):
|
|
26
|
+
"""Exception raised when a user aborts a command that needs to do cleanup."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, reason):
|
|
29
|
+
StandardError.__init__(self)
|
|
30
|
+
self.reason = reason
|
|
31
|
+
|
|
32
|
+
def __repr__(self):
|
|
33
|
+
return 'AbortException: %s' % self.reason
|
|
34
|
+
|
|
35
|
+
def __str__(self):
|
|
36
|
+
return 'AbortException: %s' % self.reason
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CommandException(StandardError):
|
|
40
|
+
"""Exception raised when a problem is encountered running a gsutil command.
|
|
41
|
+
|
|
42
|
+
This exception should be used to signal user errors or system failures
|
|
43
|
+
(like timeouts), not bugs (like an incorrect param value). For the
|
|
44
|
+
latter you should raise Exception so we can see where/how it happened
|
|
45
|
+
via gsutil -D (which will include a stack trace for raised Exceptions).
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, reason, informational=False):
|
|
49
|
+
"""Instantiate a CommandException.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
reason: Text describing the problem.
|
|
53
|
+
informational: Indicates reason should be printed as FYI, not a failure.
|
|
54
|
+
"""
|
|
55
|
+
StandardError.__init__(self)
|
|
56
|
+
self.reason = reason
|
|
57
|
+
self.informational = informational
|
|
58
|
+
|
|
59
|
+
def __repr__(self):
|
|
60
|
+
return 'CommandException: %s' % self.reason
|
|
61
|
+
|
|
62
|
+
def __str__(self):
|
|
63
|
+
return 'CommandException: %s' % self.reason
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ProjectIdException(StandardError):
|
|
67
|
+
|
|
68
|
+
def __init__(self, reason):
|
|
69
|
+
StandardError.__init__(self)
|
|
70
|
+
self.reason = reason
|
|
71
|
+
|
|
72
|
+
def __repr__(self):
|
|
73
|
+
return 'ProjectIdException: %s' % self.reason
|
|
74
|
+
|
|
75
|
+
def __str__(self):
|
|
76
|
+
return 'ProjectIdException: %s' % self.reason
|
|
Binary file
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Copyright 2012 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 gslib.exception import CommandException
|
|
16
|
+
|
|
17
|
+
class HelpType(object):
|
|
18
|
+
COMMAND_HELP = 'command_help'
|
|
19
|
+
ADDITIONAL_HELP = 'additional_help'
|
|
20
|
+
|
|
21
|
+
ALL_HELP_TYPES = [HelpType.COMMAND_HELP, HelpType.ADDITIONAL_HELP]
|
|
22
|
+
|
|
23
|
+
# help_spec key constants.
|
|
24
|
+
HELP_NAME = 'help_name'
|
|
25
|
+
HELP_NAME_ALIASES = 'help_name_aliases'
|
|
26
|
+
HELP_TYPE = 'help_type'
|
|
27
|
+
HELP_ONE_LINE_SUMMARY = 'help_one_line_summary'
|
|
28
|
+
HELP_TEXT = 'help_text'
|
|
29
|
+
|
|
30
|
+
# Constants enforced by SanityCheck
|
|
31
|
+
MAX_HELP_NAME_LEN = 15
|
|
32
|
+
MIN_ONE_LINE_SUMMARY_LEN = 10
|
|
33
|
+
MAX_ONE_LINE_SUMMARY_LEN = 80 - MAX_HELP_NAME_LEN
|
|
34
|
+
|
|
35
|
+
REQUIRED_SPEC_KEYS = [HELP_NAME, HELP_NAME_ALIASES, HELP_TYPE,
|
|
36
|
+
HELP_ONE_LINE_SUMMARY, HELP_TEXT]
|
|
37
|
+
|
|
38
|
+
class HelpProvider(object):
|
|
39
|
+
"""Interface for providing help."""
|
|
40
|
+
|
|
41
|
+
# Each subclass must define the following map.
|
|
42
|
+
help_spec = {
|
|
43
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
44
|
+
HELP_NAME : None,
|
|
45
|
+
# List of help name aliases.
|
|
46
|
+
HELP_NAME_ALIASES : None,
|
|
47
|
+
# HelpType.
|
|
48
|
+
HELP_TYPE : None,
|
|
49
|
+
# One line summary of this help.
|
|
50
|
+
HELP_ONE_LINE_SUMMARY : None,
|
|
51
|
+
# The full help text.
|
|
52
|
+
HELP_TEXT : None,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# This is a static helper instead of a class method because the help loader
|
|
56
|
+
# (gslib.commands.help._LoadHelpMaps()) operates on classes not instances.
|
|
57
|
+
def SanityCheck(help_provider, help_name_map):
|
|
58
|
+
"""Helper for checking that a HelpProvider has minimally adequate content."""
|
|
59
|
+
for k in REQUIRED_SPEC_KEYS:
|
|
60
|
+
if k not in help_provider.help_spec or help_provider.help_spec[k] is None:
|
|
61
|
+
raise CommandException('"%s" help implementation is missing %s '
|
|
62
|
+
'specification' % (help_provider.help_name, k))
|
|
63
|
+
# Sanity check the content.
|
|
64
|
+
assert (len(help_provider.help_spec[HELP_NAME]) > 1
|
|
65
|
+
and len(help_provider.help_spec[HELP_NAME]) < MAX_HELP_NAME_LEN)
|
|
66
|
+
for hna in help_provider.help_spec[HELP_NAME_ALIASES]:
|
|
67
|
+
assert len(hna) > 0
|
|
68
|
+
one_line_summary_len = len(help_provider.help_spec[HELP_ONE_LINE_SUMMARY])
|
|
69
|
+
assert (one_line_summary_len > MIN_ONE_LINE_SUMMARY_LEN
|
|
70
|
+
and one_line_summary_len < MAX_ONE_LINE_SUMMARY_LEN)
|
|
71
|
+
assert len(help_provider.help_spec[HELP_TEXT]) > 10
|
|
72
|
+
|
|
73
|
+
# Ensure there are no dupe help names or aliases across commands.
|
|
74
|
+
name_check_list = [help_provider.help_spec[HELP_NAME]]
|
|
75
|
+
name_check_list.extend(help_provider.help_spec[HELP_NAME_ALIASES])
|
|
76
|
+
for name_or_alias in name_check_list:
|
|
77
|
+
if help_name_map.has_key(name_or_alias):
|
|
78
|
+
raise CommandException(
|
|
79
|
+
'Duplicate help name/alias "%s" found while loading help from %s. '
|
|
80
|
+
'That name/alias was already taken by %s' % (name_or_alias,
|
|
81
|
+
help_provider.__module__, help_name_map[name_or_alias].__module__))
|
|
Binary file
|
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# Copyright 2012 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 copy
|
|
16
|
+
import threading
|
|
17
|
+
import wildcard_iterator
|
|
18
|
+
|
|
19
|
+
from bucket_listing_ref import BucketListingRef
|
|
20
|
+
from gslib.exception import CommandException
|
|
21
|
+
from gslib.plurality_checkable_iterator import PluralityCheckableIterator
|
|
22
|
+
from gslib.storage_uri_builder import StorageUriBuilder
|
|
23
|
+
from wildcard_iterator import ContainsWildcard
|
|
24
|
+
|
|
25
|
+
"""
|
|
26
|
+
Name expansion support for the various ways gsutil lets users refer to
|
|
27
|
+
collections of data (via explicit wildcarding as well as directory,
|
|
28
|
+
bucket, and bucket subdir implicit wildcarding). This class encapsulates
|
|
29
|
+
the various rules for determining how these expansions are done.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class NameExpansionResult(object):
|
|
34
|
+
"""
|
|
35
|
+
Holds one fully expanded result from iterating over NameExpansionIterator.
|
|
36
|
+
|
|
37
|
+
The member data in this class need to be pickleable because
|
|
38
|
+
NameExpansionResult instances are passed through Multiprocessing.Queue. In
|
|
39
|
+
particular, don't include any boto state like StorageUri, since that pulls
|
|
40
|
+
in a big tree of objects, some of which aren't pickleable (and even if
|
|
41
|
+
they were, pickling/unpickling such a large object tree would result in
|
|
42
|
+
significant overhead).
|
|
43
|
+
|
|
44
|
+
The state held in this object is needed for handling the various naming cases
|
|
45
|
+
(e.g., copying from a single source URI to a directory generates different
|
|
46
|
+
dest URI names than copying multiple URIs to a directory, to be consistent
|
|
47
|
+
with naming rules used by the Unix cp command). For more details see comments
|
|
48
|
+
in _NameExpansionIterator.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(self, src_uri_str, is_multi_src_request,
|
|
52
|
+
src_uri_expands_to_multi, names_container, expanded_uri_str,
|
|
53
|
+
have_existing_dst_container=None, is_latest=False):
|
|
54
|
+
"""
|
|
55
|
+
Args:
|
|
56
|
+
src_uri_str: string representation of StorageUri that was expanded.
|
|
57
|
+
is_multi_src_request: bool indicator whether src_uri_str expanded to more
|
|
58
|
+
than 1 BucketListingRef.
|
|
59
|
+
src_uri_expands_to_multi: bool indicator whether the current src_uri
|
|
60
|
+
expanded to more than 1 BucketListingRef.
|
|
61
|
+
names_container: Bool indicator whether src_uri names a container.
|
|
62
|
+
expanded_uri_str: string representation of StorageUri to which src_uri_str
|
|
63
|
+
expands.
|
|
64
|
+
have_existing_dst_container: bool indicator whether this is a copy
|
|
65
|
+
request to an existing bucket, bucket subdir, or directory. Default
|
|
66
|
+
None value should be used in cases where this is not needed (commands
|
|
67
|
+
other than cp).
|
|
68
|
+
is_latest: Bool indicating that the result represents the object's current
|
|
69
|
+
version.
|
|
70
|
+
"""
|
|
71
|
+
self.src_uri_str = src_uri_str
|
|
72
|
+
self.is_multi_src_request = is_multi_src_request
|
|
73
|
+
self.src_uri_expands_to_multi = src_uri_expands_to_multi
|
|
74
|
+
self.names_container = names_container
|
|
75
|
+
self.expanded_uri_str = expanded_uri_str
|
|
76
|
+
self.have_existing_dst_container = have_existing_dst_container
|
|
77
|
+
self.is_latest = is_latest
|
|
78
|
+
|
|
79
|
+
def __repr__(self):
|
|
80
|
+
return '%s' % self.expanded_uri_str
|
|
81
|
+
|
|
82
|
+
def IsEmpty(self):
|
|
83
|
+
"""Returns True if name expansion yielded no matches."""
|
|
84
|
+
return self.expanded_blr is None
|
|
85
|
+
|
|
86
|
+
def GetSrcUriStr(self):
|
|
87
|
+
"""Returns the string representation of the StorageUri that was expanded."""
|
|
88
|
+
return self.src_uri_str
|
|
89
|
+
|
|
90
|
+
def IsMultiSrcRequest(self):
|
|
91
|
+
"""
|
|
92
|
+
Returns bool indicator whether name expansion resulted in more than 0
|
|
93
|
+
BucketListingRef.
|
|
94
|
+
"""
|
|
95
|
+
return self.is_multi_src_request
|
|
96
|
+
|
|
97
|
+
def SrcUriExpandsToMulti(self):
|
|
98
|
+
"""
|
|
99
|
+
Returns bool indicator whether the current src_uri expanded to more than
|
|
100
|
+
1 BucketListingRef
|
|
101
|
+
"""
|
|
102
|
+
return self.src_uri_expands_to_multi
|
|
103
|
+
|
|
104
|
+
def NamesContainer(self):
|
|
105
|
+
"""
|
|
106
|
+
Returns bool indicator of whether src_uri names a directory, bucket, or
|
|
107
|
+
bucket subdir.
|
|
108
|
+
"""
|
|
109
|
+
return self.names_container
|
|
110
|
+
|
|
111
|
+
def GetExpandedUriStr(self):
|
|
112
|
+
"""
|
|
113
|
+
Returns the string representation of StorageUri to which src_uri_str
|
|
114
|
+
expands.
|
|
115
|
+
"""
|
|
116
|
+
return self.expanded_uri_str
|
|
117
|
+
|
|
118
|
+
def HaveExistingDstContainer(self):
|
|
119
|
+
"""Returns bool indicator whether this is a copy request to an
|
|
120
|
+
existing bucket, bucket subdir, or directory, or None if not
|
|
121
|
+
relevant."""
|
|
122
|
+
return self.have_existing_dst_container
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class _NameExpansionIterator(object):
|
|
126
|
+
"""
|
|
127
|
+
Iterates over all src_uris, expanding wildcards, object-less bucket names,
|
|
128
|
+
subdir bucket names, and directory names, generating a flat listing of all
|
|
129
|
+
the matching objects/files.
|
|
130
|
+
|
|
131
|
+
You should instantiate this object using the static factory function
|
|
132
|
+
NameExpansionIterator, because consumers of this iterator need the
|
|
133
|
+
PluralityCheckableIterator wrapper built by that function.
|
|
134
|
+
|
|
135
|
+
Yields:
|
|
136
|
+
gslib.name_expansion.NameExpansionResult.
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
CommandException: if errors encountered.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
def __init__(self, command_name, proj_id_handler, headers, debug,
|
|
143
|
+
bucket_storage_uri_class, uri_strs, recursion_requested,
|
|
144
|
+
have_existing_dst_container=None, flat=True,
|
|
145
|
+
all_versions=False, for_all_version_delete=False):
|
|
146
|
+
"""
|
|
147
|
+
Args:
|
|
148
|
+
command_name: name of command being run.
|
|
149
|
+
proj_id_handler: ProjectIdHandler to use for current command.
|
|
150
|
+
headers: Dictionary containing optional HTTP headers to pass to boto.
|
|
151
|
+
debug: Debug level to pass in to boto connection (range 0..3).
|
|
152
|
+
bucket_storage_uri_class: Class to instantiate for cloud StorageUris.
|
|
153
|
+
Settable for testing/mocking.
|
|
154
|
+
uri_strs: PluralityCheckableIterator of URI strings needing expansion.
|
|
155
|
+
recursion_requested: True if -R specified on command-line.
|
|
156
|
+
have_existing_dst_container: Bool indicator whether this is a copy
|
|
157
|
+
request to an existing bucket, bucket subdir, or directory. Default
|
|
158
|
+
None value should be used in cases where this is not needed (commands
|
|
159
|
+
other than cp).
|
|
160
|
+
flat: Bool indicating whether bucket listings should be flattened, i.e.,
|
|
161
|
+
so the mapped-to results contain objects spanning subdirectories.
|
|
162
|
+
all_versions: Bool indicating whether to iterate over all object versions.
|
|
163
|
+
for_all_version_delete: Bool indicating whether this is for an all-version
|
|
164
|
+
delete.
|
|
165
|
+
|
|
166
|
+
Examples of _NameExpansionIterator with flat=True:
|
|
167
|
+
- Calling with one of the uri_strs being 'gs://bucket' will enumerate all
|
|
168
|
+
top-level objects, as will 'gs://bucket/' and 'gs://bucket/*'.
|
|
169
|
+
- 'gs://bucket/**' will enumerate all objects in the bucket.
|
|
170
|
+
- 'gs://bucket/abc' will enumerate all next-level objects under directory
|
|
171
|
+
abc (i.e., not including subdirectories of abc) if gs://bucket/abc/*
|
|
172
|
+
matches any objects; otherwise it will enumerate the single name
|
|
173
|
+
gs://bucket/abc
|
|
174
|
+
- 'gs://bucket/abc/**' will enumerate all objects under abc or any of its
|
|
175
|
+
subdirectories.
|
|
176
|
+
- 'file:///tmp' will enumerate all files under /tmp, as will
|
|
177
|
+
'file:///tmp/*'
|
|
178
|
+
- 'file:///tmp/**' will enumerate all files under /tmp or any of its
|
|
179
|
+
subdirectories.
|
|
180
|
+
|
|
181
|
+
Example if flat=False: calling with gs://bucket/abc/* lists matching objects
|
|
182
|
+
or subdirs, but not sub-subdirs or objects beneath subdirs.
|
|
183
|
+
|
|
184
|
+
Note: In step-by-step comments below we give examples assuming there's a
|
|
185
|
+
gs://bucket with object paths:
|
|
186
|
+
abcd/o1.txt
|
|
187
|
+
abcd/o2.txt
|
|
188
|
+
xyz/o1.txt
|
|
189
|
+
xyz/o2.txt
|
|
190
|
+
and a directory file://dir with file paths:
|
|
191
|
+
dir/a.txt
|
|
192
|
+
dir/b.txt
|
|
193
|
+
dir/c/
|
|
194
|
+
"""
|
|
195
|
+
self.command_name = command_name
|
|
196
|
+
self.proj_id_handler = proj_id_handler
|
|
197
|
+
self.headers = headers
|
|
198
|
+
self.debug = debug
|
|
199
|
+
self.bucket_storage_uri_class = bucket_storage_uri_class
|
|
200
|
+
self.suri_builder = StorageUriBuilder(debug, bucket_storage_uri_class)
|
|
201
|
+
self.uri_strs = uri_strs
|
|
202
|
+
self.recursion_requested = recursion_requested
|
|
203
|
+
self.have_existing_dst_container = have_existing_dst_container
|
|
204
|
+
self.flat = flat
|
|
205
|
+
self.all_versions = all_versions
|
|
206
|
+
|
|
207
|
+
# Map holding wildcard strings to use for flat vs subdir-by-subdir listings.
|
|
208
|
+
# (A flat listing means show all objects expanded all the way down.)
|
|
209
|
+
self._flatness_wildcard = {True: '**', False: '*'}
|
|
210
|
+
|
|
211
|
+
def __iter__(self):
|
|
212
|
+
for uri_str in self.uri_strs:
|
|
213
|
+
# Step 1: Expand any explicitly specified wildcards. The output from this
|
|
214
|
+
# step is an iterator of BucketListingRef.
|
|
215
|
+
# Starting with gs://buck*/abc* this step would expand to gs://bucket/abcd
|
|
216
|
+
if ContainsWildcard(uri_str):
|
|
217
|
+
post_step1_iter = self._WildcardIterator(uri_str)
|
|
218
|
+
else:
|
|
219
|
+
suri = self.suri_builder.StorageUri(uri_str)
|
|
220
|
+
post_step1_iter = iter([BucketListingRef(suri)])
|
|
221
|
+
post_step1_iter = PluralityCheckableIterator(post_step1_iter)
|
|
222
|
+
|
|
223
|
+
# Step 2: Expand bucket subdirs and versions. The output from this
|
|
224
|
+
# step is an iterator of (names_container, BucketListingRef).
|
|
225
|
+
# Starting with gs://bucket/abcd this step would expand to:
|
|
226
|
+
# iter([(True, abcd/o1.txt), (True, abcd/o2.txt)]).
|
|
227
|
+
if self.flat and self.recursion_requested:
|
|
228
|
+
post_step2_iter = _ImplicitBucketSubdirIterator(self,
|
|
229
|
+
post_step1_iter, self.flat)
|
|
230
|
+
elif self.all_versions:
|
|
231
|
+
post_step2_iter = _AllVersionIterator(self, post_step1_iter,
|
|
232
|
+
headers=self.headers)
|
|
233
|
+
else:
|
|
234
|
+
post_step2_iter = _NonContainerTuplifyIterator(post_step1_iter)
|
|
235
|
+
post_step2_iter = PluralityCheckableIterator(post_step2_iter)
|
|
236
|
+
|
|
237
|
+
# Step 3. Expand directories and buckets. This step yields the iterated
|
|
238
|
+
# values. Starting with gs://bucket this step would expand to:
|
|
239
|
+
# [abcd/o1.txt, abcd/o2.txt, xyz/o1.txt, xyz/o2.txt]
|
|
240
|
+
# Starting with file://dir this step would expand to:
|
|
241
|
+
# [dir/a.txt, dir/b.txt, dir/c/]
|
|
242
|
+
exp_src_bucket_listing_refs = []
|
|
243
|
+
wc = self._flatness_wildcard[self.flat]
|
|
244
|
+
src_uri_expands_to_multi = (post_step1_iter.has_plurality()
|
|
245
|
+
or post_step2_iter.has_plurality())
|
|
246
|
+
is_multi_src_request = (self.uri_strs.has_plurality()
|
|
247
|
+
or src_uri_expands_to_multi)
|
|
248
|
+
|
|
249
|
+
if post_step2_iter.is_empty():
|
|
250
|
+
raise CommandException('No URIs matched: %s' % uri_str)
|
|
251
|
+
for (names_container, blr) in post_step2_iter:
|
|
252
|
+
if (not blr.GetUri().names_container()
|
|
253
|
+
and (self.flat or not blr.HasPrefix())):
|
|
254
|
+
yield NameExpansionResult(uri_str, is_multi_src_request,
|
|
255
|
+
src_uri_expands_to_multi, names_container,
|
|
256
|
+
blr.GetUriString(),
|
|
257
|
+
self.have_existing_dst_container,
|
|
258
|
+
is_latest=blr.IsLatest())
|
|
259
|
+
continue
|
|
260
|
+
if not self.recursion_requested:
|
|
261
|
+
if blr.GetUri().is_file_uri():
|
|
262
|
+
desc = 'directory'
|
|
263
|
+
else:
|
|
264
|
+
desc = 'bucket'
|
|
265
|
+
print 'Omitting %s "%s". (Did you mean to do %s -R?)' % (
|
|
266
|
+
desc, blr.GetUri(), self.command_name)
|
|
267
|
+
continue
|
|
268
|
+
if blr.GetUri().is_file_uri():
|
|
269
|
+
# Convert dir to implicit recursive wildcard.
|
|
270
|
+
uri_to_iterate = '%s/%s' % (blr.GetUriString(), wc)
|
|
271
|
+
else:
|
|
272
|
+
# Convert bucket to implicit recursive wildcard.
|
|
273
|
+
uri_to_iterate = blr.GetUri().clone_replace_name(wc)
|
|
274
|
+
wc_iter = PluralityCheckableIterator(
|
|
275
|
+
self._WildcardIterator(uri_to_iterate))
|
|
276
|
+
src_uri_expands_to_multi = (src_uri_expands_to_multi
|
|
277
|
+
or wc_iter.has_plurality())
|
|
278
|
+
is_multi_src_request = (self.uri_strs.has_plurality()
|
|
279
|
+
or src_uri_expands_to_multi)
|
|
280
|
+
for blr in wc_iter:
|
|
281
|
+
yield NameExpansionResult(uri_str, is_multi_src_request,
|
|
282
|
+
src_uri_expands_to_multi, True,
|
|
283
|
+
blr.GetUriString(),
|
|
284
|
+
self.have_existing_dst_container,
|
|
285
|
+
is_latest=blr.IsLatest())
|
|
286
|
+
|
|
287
|
+
def _WildcardIterator(self, uri_or_str):
|
|
288
|
+
"""
|
|
289
|
+
Helper to instantiate gslib.WildcardIterator. Args are same as
|
|
290
|
+
gslib.WildcardIterator interface, but this method fills in most of the
|
|
291
|
+
values from instance state.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
uri_or_str: StorageUri or URI string naming wildcard objects to iterate.
|
|
295
|
+
"""
|
|
296
|
+
return wildcard_iterator.wildcard_iterator(
|
|
297
|
+
uri_or_str, self.proj_id_handler,
|
|
298
|
+
bucket_storage_uri_class=self.bucket_storage_uri_class,
|
|
299
|
+
headers=self.headers, debug=self.debug,
|
|
300
|
+
all_versions=self.all_versions)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def NameExpansionIterator(command_name, proj_id_handler, headers, debug,
|
|
304
|
+
bucket_storage_uri_class, uri_strs,
|
|
305
|
+
recursion_requested,
|
|
306
|
+
have_existing_dst_container=None, flat=True,
|
|
307
|
+
all_versions=False,
|
|
308
|
+
for_all_version_delete=False):
|
|
309
|
+
"""
|
|
310
|
+
Static factory function for instantiating _NameExpansionIterator, which
|
|
311
|
+
wraps the resulting iterator in a PluralityCheckableIterator and checks
|
|
312
|
+
that it is non-empty. Also, allows uri_strs can be either an array or an
|
|
313
|
+
iterator.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
command_name: name of command being run.
|
|
317
|
+
proj_id_handler: ProjectIdHandler to use for current command.
|
|
318
|
+
headers: Dictionary containing optional HTTP headers to pass to boto.
|
|
319
|
+
debug: Debug level to pass in to boto connection (range 0..3).
|
|
320
|
+
bucket_storage_uri_class: Class to instantiate for cloud StorageUris.
|
|
321
|
+
Settable for testing/mocking.
|
|
322
|
+
uri_strs: PluralityCheckableIterator of URI strings needing expansion.
|
|
323
|
+
recursion_requested: True if -R specified on command-line.
|
|
324
|
+
have_existing_dst_container: Bool indicator whether this is a copy
|
|
325
|
+
request to an existing bucket, bucket subdir, or directory. Default
|
|
326
|
+
None value should be used in cases where this is not needed (commands
|
|
327
|
+
other than cp).
|
|
328
|
+
flat: Bool indicating whether bucket listings should be flattened, i.e.,
|
|
329
|
+
so the mapped-to results contain objects spanning subdirectories.
|
|
330
|
+
all_versions: Bool indicating whether to iterate over all object versions.
|
|
331
|
+
for_all_version_delete: Bool indicating whether this is for an all-version
|
|
332
|
+
delete.
|
|
333
|
+
|
|
334
|
+
Examples of ExpandWildcardsAndContainers with flat=True:
|
|
335
|
+
- Calling with one of the uri_strs being 'gs://bucket' will enumerate all
|
|
336
|
+
top-level objects, as will 'gs://bucket/' and 'gs://bucket/*'.
|
|
337
|
+
- 'gs://bucket/**' will enumerate all objects in the bucket.
|
|
338
|
+
- 'gs://bucket/abc' will enumerate all next-level objects under directory
|
|
339
|
+
abc (i.e., not including subdirectories of abc) if gs://bucket/abc/*
|
|
340
|
+
matches any objects; otherwise it will enumerate the single name
|
|
341
|
+
gs://bucket/abc
|
|
342
|
+
- 'gs://bucket/abc/**' will enumerate all objects under abc or any of its
|
|
343
|
+
subdirectories.
|
|
344
|
+
- 'file:///tmp' will enumerate all files under /tmp, as will
|
|
345
|
+
'file:///tmp/*'
|
|
346
|
+
- 'file:///tmp/**' will enumerate all files under /tmp or any of its
|
|
347
|
+
subdirectories.
|
|
348
|
+
|
|
349
|
+
Example if flat=False: calling with gs://bucket/abc/* lists matching objects
|
|
350
|
+
or subdirs, but not sub-subdirs or objects beneath subdirs.
|
|
351
|
+
|
|
352
|
+
Note: In step-by-step comments below we give examples assuming there's a
|
|
353
|
+
gs://bucket with object paths:
|
|
354
|
+
abcd/o1.txt
|
|
355
|
+
abcd/o2.txt
|
|
356
|
+
xyz/o1.txt
|
|
357
|
+
xyz/o2.txt
|
|
358
|
+
and a directory file://dir with file paths:
|
|
359
|
+
dir/a.txt
|
|
360
|
+
dir/b.txt
|
|
361
|
+
dir/c/
|
|
362
|
+
"""
|
|
363
|
+
uri_strs = PluralityCheckableIterator(uri_strs)
|
|
364
|
+
name_expansion_iterator = _NameExpansionIterator(
|
|
365
|
+
command_name, proj_id_handler, headers, debug, bucket_storage_uri_class,
|
|
366
|
+
uri_strs, recursion_requested, have_existing_dst_container, flat,
|
|
367
|
+
all_versions=all_versions, for_all_version_delete=for_all_version_delete)
|
|
368
|
+
name_expansion_iterator = PluralityCheckableIterator(name_expansion_iterator)
|
|
369
|
+
if name_expansion_iterator.is_empty():
|
|
370
|
+
raise CommandException('No URIs matched')
|
|
371
|
+
return name_expansion_iterator
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
class NameExpansionIteratorQueue(object):
|
|
375
|
+
"""
|
|
376
|
+
Wrapper around NameExpansionIterator that provides a Multiprocessing.Queue
|
|
377
|
+
facade.
|
|
378
|
+
|
|
379
|
+
Only a blocking get() function can be called, and the block and timeout
|
|
380
|
+
params on that function are ignored. All other class functions raise
|
|
381
|
+
NotImplementedError.
|
|
382
|
+
|
|
383
|
+
This class is thread safe.
|
|
384
|
+
"""
|
|
385
|
+
|
|
386
|
+
def __init__(self, name_expansion_iterator, final_value):
|
|
387
|
+
self.name_expansion_iterator = name_expansion_iterator
|
|
388
|
+
self.final_value = final_value
|
|
389
|
+
self.lock = threading.Lock()
|
|
390
|
+
|
|
391
|
+
def qsize(self):
|
|
392
|
+
raise NotImplementedError(
|
|
393
|
+
"NameExpansionIteratorQueue.qsize() not implemented")
|
|
394
|
+
|
|
395
|
+
def empty(self):
|
|
396
|
+
raise NotImplementedError(
|
|
397
|
+
"NameExpansionIteratorQueue.empty() not implemented")
|
|
398
|
+
|
|
399
|
+
def full(self):
|
|
400
|
+
raise NotImplementedError(
|
|
401
|
+
"NameExpansionIteratorQueue.full() not implemented")
|
|
402
|
+
|
|
403
|
+
def put(self, obj=None, block=None, timeout=None):
|
|
404
|
+
raise NotImplementedError(
|
|
405
|
+
"NameExpansionIteratorQueue.put() not implemented")
|
|
406
|
+
|
|
407
|
+
def put_nowait(self, obj):
|
|
408
|
+
raise NotImplementedError(
|
|
409
|
+
"NameExpansionIteratorQueue.put_nowait() not implemented")
|
|
410
|
+
|
|
411
|
+
def get(self, block=None, timeout=None):
|
|
412
|
+
self.lock.acquire()
|
|
413
|
+
try:
|
|
414
|
+
if self.name_expansion_iterator.is_empty():
|
|
415
|
+
return self.final_value
|
|
416
|
+
return self.name_expansion_iterator.next()
|
|
417
|
+
finally:
|
|
418
|
+
self.lock.release()
|
|
419
|
+
|
|
420
|
+
def get_nowait(self):
|
|
421
|
+
raise NotImplementedError(
|
|
422
|
+
"NameExpansionIteratorQueue.get_nowait() not implemented")
|
|
423
|
+
|
|
424
|
+
def get_no_wait(self):
|
|
425
|
+
raise NotImplementedError(
|
|
426
|
+
"NameExpansionIteratorQueue.get_no_wait() not implemented")
|
|
427
|
+
|
|
428
|
+
def close(self):
|
|
429
|
+
raise NotImplementedError(
|
|
430
|
+
"NameExpansionIteratorQueue.close() not implemented")
|
|
431
|
+
|
|
432
|
+
def join_thread(self):
|
|
433
|
+
raise NotImplementedError(
|
|
434
|
+
"NameExpansionIteratorQueue.join_thread() not implemented")
|
|
435
|
+
|
|
436
|
+
def cancel_join_thread(self):
|
|
437
|
+
raise NotImplementedError(
|
|
438
|
+
"NameExpansionIteratorQueue.cancel_join_thread() not implemented")
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
class _NonContainerTuplifyIterator(object):
|
|
442
|
+
"""
|
|
443
|
+
Iterator that produces the tuple (False, blr) for each iteration
|
|
444
|
+
of blr_iter. Used for cases where blr_iter iterates over a set of
|
|
445
|
+
BucketListingRefs known not to name containers.
|
|
446
|
+
"""
|
|
447
|
+
|
|
448
|
+
def __init__(self, blr_iter):
|
|
449
|
+
"""
|
|
450
|
+
Args:
|
|
451
|
+
blr_iter: iterator of BucketListingRef.
|
|
452
|
+
"""
|
|
453
|
+
self.blr_iter = blr_iter
|
|
454
|
+
|
|
455
|
+
def __iter__(self):
|
|
456
|
+
for blr in self.blr_iter:
|
|
457
|
+
yield (False, blr)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
class _ImplicitBucketSubdirIterator(object):
|
|
461
|
+
|
|
462
|
+
"""
|
|
463
|
+
Iterator wrapper that iterates over blr_iter, performing implicit bucket
|
|
464
|
+
subdir expansion.
|
|
465
|
+
|
|
466
|
+
Each iteration yields tuple (names_container, expanded BucketListingRefs)
|
|
467
|
+
where names_container is true if URI names a directory, bucket,
|
|
468
|
+
or bucket subdir (vs how StorageUri.names_container() doesn't
|
|
469
|
+
handle latter case).
|
|
470
|
+
|
|
471
|
+
For example, iterating over [BucketListingRef("gs://abc")] would expand to:
|
|
472
|
+
[BucketListingRef("gs://abc/o1"), BucketListingRef("gs://abc/o2")]
|
|
473
|
+
if those subdir objects exist, and [BucketListingRef("gs://abc") otherwise.
|
|
474
|
+
"""
|
|
475
|
+
|
|
476
|
+
def __init__(self, name_expansion_instance, blr_iter, flat):
|
|
477
|
+
"""
|
|
478
|
+
Args:
|
|
479
|
+
name_expansion_instance: calling instance of NameExpansion class.
|
|
480
|
+
blr_iter: iterator of BucketListingRef.
|
|
481
|
+
flat: bool indicating whether bucket listings should be flattened, i.e.,
|
|
482
|
+
so the mapped-to results contain objects spanning subdirectories.
|
|
483
|
+
"""
|
|
484
|
+
self.blr_iter = blr_iter
|
|
485
|
+
self.name_expansion_instance = name_expansion_instance
|
|
486
|
+
self.flat = flat
|
|
487
|
+
|
|
488
|
+
def __iter__(self):
|
|
489
|
+
for blr in self.blr_iter:
|
|
490
|
+
uri = blr.GetUri()
|
|
491
|
+
if uri.names_object():
|
|
492
|
+
# URI could be a bucket subdir.
|
|
493
|
+
implicit_subdir_iterator = PluralityCheckableIterator(
|
|
494
|
+
self.name_expansion_instance._WildcardIterator(
|
|
495
|
+
self.name_expansion_instance.suri_builder.StorageUri(
|
|
496
|
+
'%s/%s' % (uri.uri.rstrip('/'),
|
|
497
|
+
self.name_expansion_instance._flatness_wildcard[
|
|
498
|
+
self.flat]))))
|
|
499
|
+
if not implicit_subdir_iterator.is_empty():
|
|
500
|
+
for exp_blr in implicit_subdir_iterator:
|
|
501
|
+
yield (True, exp_blr)
|
|
502
|
+
else:
|
|
503
|
+
yield (False, blr)
|
|
504
|
+
else:
|
|
505
|
+
yield (False, blr)
|
|
506
|
+
|
|
507
|
+
class _AllVersionIterator(object):
|
|
508
|
+
"""
|
|
509
|
+
Iterator wrapper that iterates over blr_iter, performing implicit version
|
|
510
|
+
expansion.
|
|
511
|
+
|
|
512
|
+
Output behavior is identical to that in _ImplicitBucketSubdirIterator above.
|
|
513
|
+
|
|
514
|
+
For example, iterating over [BucketListingRef("gs://abc/o1")] would expand to:
|
|
515
|
+
[BucketListingRef("gs://abc/o1#1234"), BucketListingRef("gs://abc/o1#1235")]
|
|
516
|
+
"""
|
|
517
|
+
|
|
518
|
+
def __init__(self, name_expansion_instance, blr_iter, headers=None):
|
|
519
|
+
"""
|
|
520
|
+
Args:
|
|
521
|
+
name_expansion_instance: calling instance of NameExpansion class.
|
|
522
|
+
blr_iter: iterator of BucketListingRef.
|
|
523
|
+
flat: bool indicating whether bucket listings should be flattened, i.e.,
|
|
524
|
+
so the mapped-to results contain objects spanning subdirectories.
|
|
525
|
+
"""
|
|
526
|
+
self.blr_iter = blr_iter
|
|
527
|
+
self.name_expansion_instance = name_expansion_instance
|
|
528
|
+
self.headers = headers
|
|
529
|
+
|
|
530
|
+
def __iter__(self):
|
|
531
|
+
empty = True
|
|
532
|
+
for blr in self.blr_iter:
|
|
533
|
+
uri = blr.GetUri()
|
|
534
|
+
if not uri.names_object():
|
|
535
|
+
empty = False
|
|
536
|
+
yield (True, blr)
|
|
537
|
+
break
|
|
538
|
+
for key in uri.list_bucket(
|
|
539
|
+
prefix=uri.object_name, headers=self.headers, all_versions=True):
|
|
540
|
+
if key.name != uri.object_name:
|
|
541
|
+
# The desired entries will be alphabetically first in this listing.
|
|
542
|
+
break
|
|
543
|
+
version_blr = BucketListingRef(uri.clone_replace_key(key), key=key)
|
|
544
|
+
empty = False
|
|
545
|
+
yield (False, version_blr)
|
|
546
|
+
# If no version exists, yield the unversioned blr, and let the consuming
|
|
547
|
+
# operation fail. This mirrors behavior in _ImplicitBucketSubdirIterator.
|
|
548
|
+
if empty:
|
|
549
|
+
yield (False, blr)
|
|
550
|
+
|