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.
Files changed (768) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +4 -0
  3. data/Makefile +4 -0
  4. data/Manifest +760 -1
  5. data/bin/gcloud +7 -0
  6. data/bin/{gcutil → gcutil.symlink} +0 -0
  7. data/bin/gsutil-symlink +377 -0
  8. data/gcloud.gemspec +5 -5
  9. data/packages/gsutil/CHECKSUM +1 -0
  10. data/packages/gsutil/COPYING +202 -0
  11. data/packages/gsutil/LICENSE.third_party +295 -0
  12. data/packages/gsutil/MANIFEST.in +5 -0
  13. data/packages/gsutil/README +38 -0
  14. data/packages/gsutil/README.pkg +49 -0
  15. data/packages/gsutil/ReleaseNotes.txt +780 -0
  16. data/packages/gsutil/VERSION +1 -0
  17. data/packages/gsutil/boto/Changelog.rst +35 -0
  18. data/packages/gsutil/boto/LICENSE +18 -0
  19. data/packages/gsutil/boto/MANIFEST.in +12 -0
  20. data/packages/gsutil/boto/README.rst +163 -0
  21. data/packages/gsutil/boto/bin/asadmin +290 -0
  22. data/packages/gsutil/boto/bin/bundle_image +27 -0
  23. data/packages/gsutil/boto/bin/cfadmin +108 -0
  24. data/packages/gsutil/boto/bin/cq +89 -0
  25. data/packages/gsutil/boto/bin/cwutil +140 -0
  26. data/packages/gsutil/boto/bin/elbadmin +284 -0
  27. data/packages/gsutil/boto/bin/fetch_file +43 -0
  28. data/packages/gsutil/boto/bin/glacier +154 -0
  29. data/packages/gsutil/boto/bin/instance_events +145 -0
  30. data/packages/gsutil/boto/bin/kill_instance +35 -0
  31. data/packages/gsutil/boto/bin/launch_instance +252 -0
  32. data/packages/gsutil/boto/bin/list_instances +90 -0
  33. data/packages/gsutil/boto/bin/lss3 +77 -0
  34. data/packages/gsutil/boto/bin/mturk +465 -0
  35. data/packages/gsutil/boto/bin/pyami_sendmail +52 -0
  36. data/packages/gsutil/boto/bin/route53 +205 -0
  37. data/packages/gsutil/boto/bin/s3put +374 -0
  38. data/packages/gsutil/boto/bin/sdbadmin +194 -0
  39. data/packages/gsutil/boto/bin/taskadmin +116 -0
  40. data/packages/gsutil/boto/boto/__init__.py +793 -0
  41. data/packages/gsutil/boto/boto/__init__.pyc +0 -0
  42. data/packages/gsutil/boto/boto/auth.py +682 -0
  43. data/packages/gsutil/boto/boto/auth.pyc +0 -0
  44. data/packages/gsutil/boto/boto/auth_handler.py +58 -0
  45. data/packages/gsutil/boto/boto/auth_handler.pyc +0 -0
  46. data/packages/gsutil/boto/boto/beanstalk/__init__.py +65 -0
  47. data/packages/gsutil/boto/boto/beanstalk/exception.py +64 -0
  48. data/packages/gsutil/boto/boto/beanstalk/layer1.py +1153 -0
  49. data/packages/gsutil/boto/boto/beanstalk/response.py +703 -0
  50. data/packages/gsutil/boto/boto/beanstalk/wrapper.py +29 -0
  51. data/packages/gsutil/boto/boto/cacerts/__init__.py +22 -0
  52. data/packages/gsutil/boto/boto/cacerts/__init__.pyc +0 -0
  53. data/packages/gsutil/boto/boto/cacerts/cacerts.txt +633 -0
  54. data/packages/gsutil/boto/boto/cloudformation/__init__.py +68 -0
  55. data/packages/gsutil/boto/boto/cloudformation/connection.py +364 -0
  56. data/packages/gsutil/boto/boto/cloudformation/stack.py +360 -0
  57. data/packages/gsutil/boto/boto/cloudformation/template.py +43 -0
  58. data/packages/gsutil/boto/boto/cloudfront/__init__.py +324 -0
  59. data/packages/gsutil/boto/boto/cloudfront/distribution.py +745 -0
  60. data/packages/gsutil/boto/boto/cloudfront/exception.py +26 -0
  61. data/packages/gsutil/boto/boto/cloudfront/identity.py +122 -0
  62. data/packages/gsutil/boto/boto/cloudfront/invalidation.py +216 -0
  63. data/packages/gsutil/boto/boto/cloudfront/logging.py +38 -0
  64. data/packages/gsutil/boto/boto/cloudfront/object.py +48 -0
  65. data/packages/gsutil/boto/boto/cloudfront/origin.py +150 -0
  66. data/packages/gsutil/boto/boto/cloudfront/signers.py +60 -0
  67. data/packages/gsutil/boto/boto/cloudsearch/__init__.py +45 -0
  68. data/packages/gsutil/boto/boto/cloudsearch/document.py +265 -0
  69. data/packages/gsutil/boto/boto/cloudsearch/domain.py +394 -0
  70. data/packages/gsutil/boto/boto/cloudsearch/layer1.py +738 -0
  71. data/packages/gsutil/boto/boto/cloudsearch/layer2.py +67 -0
  72. data/packages/gsutil/boto/boto/cloudsearch/optionstatus.py +248 -0
  73. data/packages/gsutil/boto/boto/cloudsearch/search.py +365 -0
  74. data/packages/gsutil/boto/boto/cloudsearch/sourceattribute.py +75 -0
  75. data/packages/gsutil/boto/boto/compat.py +28 -0
  76. data/packages/gsutil/boto/boto/compat.pyc +0 -0
  77. data/packages/gsutil/boto/boto/connection.py +1081 -0
  78. data/packages/gsutil/boto/boto/connection.pyc +0 -0
  79. data/packages/gsutil/boto/boto/contrib/__init__.py +22 -0
  80. data/packages/gsutil/boto/boto/contrib/ymlmessage.py +52 -0
  81. data/packages/gsutil/boto/boto/core/README +58 -0
  82. data/packages/gsutil/boto/boto/core/__init__.py +23 -0
  83. data/packages/gsutil/boto/boto/core/auth.py +78 -0
  84. data/packages/gsutil/boto/boto/core/credentials.py +154 -0
  85. data/packages/gsutil/boto/boto/core/dictresponse.py +178 -0
  86. data/packages/gsutil/boto/boto/core/service.py +67 -0
  87. data/packages/gsutil/boto/boto/datapipeline/__init__.py +0 -0
  88. data/packages/gsutil/boto/boto/datapipeline/exceptions.py +42 -0
  89. data/packages/gsutil/boto/boto/datapipeline/layer1.py +546 -0
  90. data/packages/gsutil/boto/boto/dynamodb/__init__.py +66 -0
  91. data/packages/gsutil/boto/boto/dynamodb/batch.py +262 -0
  92. data/packages/gsutil/boto/boto/dynamodb/condition.py +170 -0
  93. data/packages/gsutil/boto/boto/dynamodb/exceptions.py +64 -0
  94. data/packages/gsutil/boto/boto/dynamodb/item.py +196 -0
  95. data/packages/gsutil/boto/boto/dynamodb/layer1.py +575 -0
  96. data/packages/gsutil/boto/boto/dynamodb/layer2.py +798 -0
  97. data/packages/gsutil/boto/boto/dynamodb/schema.py +112 -0
  98. data/packages/gsutil/boto/boto/dynamodb/table.py +540 -0
  99. data/packages/gsutil/boto/boto/dynamodb/types.py +326 -0
  100. data/packages/gsutil/boto/boto/ec2/__init__.py +96 -0
  101. data/packages/gsutil/boto/boto/ec2/address.py +103 -0
  102. data/packages/gsutil/boto/boto/ec2/autoscale/__init__.py +781 -0
  103. data/packages/gsutil/boto/boto/ec2/autoscale/activity.py +74 -0
  104. data/packages/gsutil/boto/boto/ec2/autoscale/group.py +337 -0
  105. data/packages/gsutil/boto/boto/ec2/autoscale/instance.py +60 -0
  106. data/packages/gsutil/boto/boto/ec2/autoscale/launchconfig.py +209 -0
  107. data/packages/gsutil/boto/boto/ec2/autoscale/policy.py +166 -0
  108. data/packages/gsutil/boto/boto/ec2/autoscale/request.py +38 -0
  109. data/packages/gsutil/boto/boto/ec2/autoscale/scheduled.py +60 -0
  110. data/packages/gsutil/boto/boto/ec2/autoscale/tag.py +84 -0
  111. data/packages/gsutil/boto/boto/ec2/blockdevicemapping.py +141 -0
  112. data/packages/gsutil/boto/boto/ec2/bundleinstance.py +78 -0
  113. data/packages/gsutil/boto/boto/ec2/buyreservation.py +84 -0
  114. data/packages/gsutil/boto/boto/ec2/cloudwatch/__init__.py +603 -0
  115. data/packages/gsutil/boto/boto/ec2/cloudwatch/alarm.py +316 -0
  116. data/packages/gsutil/boto/boto/ec2/cloudwatch/datapoint.py +40 -0
  117. data/packages/gsutil/boto/boto/ec2/cloudwatch/dimension.py +38 -0
  118. data/packages/gsutil/boto/boto/ec2/cloudwatch/listelement.py +31 -0
  119. data/packages/gsutil/boto/boto/ec2/cloudwatch/metric.py +175 -0
  120. data/packages/gsutil/boto/boto/ec2/connection.py +3409 -0
  121. data/packages/gsutil/boto/boto/ec2/ec2object.py +107 -0
  122. data/packages/gsutil/boto/boto/ec2/elb/__init__.py +553 -0
  123. data/packages/gsutil/boto/boto/ec2/elb/healthcheck.py +89 -0
  124. data/packages/gsutil/boto/boto/ec2/elb/instancestate.py +62 -0
  125. data/packages/gsutil/boto/boto/ec2/elb/listelement.py +36 -0
  126. data/packages/gsutil/boto/boto/ec2/elb/listener.py +75 -0
  127. data/packages/gsutil/boto/boto/ec2/elb/loadbalancer.py +324 -0
  128. data/packages/gsutil/boto/boto/ec2/elb/policies.py +89 -0
  129. data/packages/gsutil/boto/boto/ec2/elb/securitygroup.py +38 -0
  130. data/packages/gsutil/boto/boto/ec2/group.py +39 -0
  131. data/packages/gsutil/boto/boto/ec2/image.py +350 -0
  132. data/packages/gsutil/boto/boto/ec2/instance.py +661 -0
  133. data/packages/gsutil/boto/boto/ec2/instanceinfo.py +51 -0
  134. data/packages/gsutil/boto/boto/ec2/instancestatus.py +207 -0
  135. data/packages/gsutil/boto/boto/ec2/keypair.py +113 -0
  136. data/packages/gsutil/boto/boto/ec2/launchspecification.py +105 -0
  137. data/packages/gsutil/boto/boto/ec2/networkinterface.py +247 -0
  138. data/packages/gsutil/boto/boto/ec2/placementgroup.py +51 -0
  139. data/packages/gsutil/boto/boto/ec2/regioninfo.py +34 -0
  140. data/packages/gsutil/boto/boto/ec2/reservedinstance.py +227 -0
  141. data/packages/gsutil/boto/boto/ec2/securitygroup.py +357 -0
  142. data/packages/gsutil/boto/boto/ec2/snapshot.py +170 -0
  143. data/packages/gsutil/boto/boto/ec2/spotdatafeedsubscription.py +63 -0
  144. data/packages/gsutil/boto/boto/ec2/spotinstancerequest.py +188 -0
  145. data/packages/gsutil/boto/boto/ec2/spotpricehistory.py +55 -0
  146. data/packages/gsutil/boto/boto/ec2/tag.py +87 -0
  147. data/packages/gsutil/boto/boto/ec2/vmtype.py +58 -0
  148. data/packages/gsutil/boto/boto/ec2/volume.py +293 -0
  149. data/packages/gsutil/boto/boto/ec2/volumestatus.py +200 -0
  150. data/packages/gsutil/boto/boto/ec2/zone.py +80 -0
  151. data/packages/gsutil/boto/boto/ecs/__init__.py +90 -0
  152. data/packages/gsutil/boto/boto/ecs/item.py +153 -0
  153. data/packages/gsutil/boto/boto/elasticache/__init__.py +62 -0
  154. data/packages/gsutil/boto/boto/elasticache/layer1.py +1252 -0
  155. data/packages/gsutil/boto/boto/elastictranscoder/__init__.py +62 -0
  156. data/packages/gsutil/boto/boto/elastictranscoder/exceptions.py +46 -0
  157. data/packages/gsutil/boto/boto/elastictranscoder/layer1.py +509 -0
  158. data/packages/gsutil/boto/boto/emr/__init__.py +73 -0
  159. data/packages/gsutil/boto/boto/emr/bootstrap_action.py +44 -0
  160. data/packages/gsutil/boto/boto/emr/connection.py +531 -0
  161. data/packages/gsutil/boto/boto/emr/emrobject.py +176 -0
  162. data/packages/gsutil/boto/boto/emr/instance_group.py +43 -0
  163. data/packages/gsutil/boto/boto/emr/step.py +281 -0
  164. data/packages/gsutil/boto/boto/exception.py +476 -0
  165. data/packages/gsutil/boto/boto/exception.pyc +0 -0
  166. data/packages/gsutil/boto/boto/file/README +49 -0
  167. data/packages/gsutil/boto/boto/file/__init__.py +28 -0
  168. data/packages/gsutil/boto/boto/file/bucket.py +112 -0
  169. data/packages/gsutil/boto/boto/file/connection.py +33 -0
  170. data/packages/gsutil/boto/boto/file/key.py +199 -0
  171. data/packages/gsutil/boto/boto/file/simpleresultset.py +30 -0
  172. data/packages/gsutil/boto/boto/fps/__init__.py +21 -0
  173. data/packages/gsutil/boto/boto/fps/connection.py +369 -0
  174. data/packages/gsutil/boto/boto/fps/exception.py +344 -0
  175. data/packages/gsutil/boto/boto/fps/response.py +175 -0
  176. data/packages/gsutil/boto/boto/glacier/__init__.py +57 -0
  177. data/packages/gsutil/boto/boto/glacier/concurrent.py +409 -0
  178. data/packages/gsutil/boto/boto/glacier/exceptions.py +58 -0
  179. data/packages/gsutil/boto/boto/glacier/job.py +152 -0
  180. data/packages/gsutil/boto/boto/glacier/layer1.py +637 -0
  181. data/packages/gsutil/boto/boto/glacier/layer2.py +93 -0
  182. data/packages/gsutil/boto/boto/glacier/response.py +48 -0
  183. data/packages/gsutil/boto/boto/glacier/utils.py +163 -0
  184. data/packages/gsutil/boto/boto/glacier/vault.py +387 -0
  185. data/packages/gsutil/boto/boto/glacier/writer.py +242 -0
  186. data/packages/gsutil/boto/boto/gs/__init__.py +22 -0
  187. data/packages/gsutil/boto/boto/gs/__init__.pyc +0 -0
  188. data/packages/gsutil/boto/boto/gs/acl.py +304 -0
  189. data/packages/gsutil/boto/boto/gs/acl.pyc +0 -0
  190. data/packages/gsutil/boto/boto/gs/bucket.py +870 -0
  191. data/packages/gsutil/boto/boto/gs/bucket.pyc +0 -0
  192. data/packages/gsutil/boto/boto/gs/bucketlistresultset.py +64 -0
  193. data/packages/gsutil/boto/boto/gs/bucketlistresultset.pyc +0 -0
  194. data/packages/gsutil/boto/boto/gs/connection.py +103 -0
  195. data/packages/gsutil/boto/boto/gs/connection.pyc +0 -0
  196. data/packages/gsutil/boto/boto/gs/cors.py +169 -0
  197. data/packages/gsutil/boto/boto/gs/cors.pyc +0 -0
  198. data/packages/gsutil/boto/boto/gs/key.py +704 -0
  199. data/packages/gsutil/boto/boto/gs/key.pyc +0 -0
  200. data/packages/gsutil/boto/boto/gs/resumable_upload_handler.py +659 -0
  201. data/packages/gsutil/boto/boto/gs/resumable_upload_handler.pyc +0 -0
  202. data/packages/gsutil/boto/boto/gs/user.py +54 -0
  203. data/packages/gsutil/boto/boto/gs/user.pyc +0 -0
  204. data/packages/gsutil/boto/boto/handler.py +44 -0
  205. data/packages/gsutil/boto/boto/handler.pyc +0 -0
  206. data/packages/gsutil/boto/boto/https_connection.py +124 -0
  207. data/packages/gsutil/boto/boto/https_connection.pyc +0 -0
  208. data/packages/gsutil/boto/boto/iam/__init__.py +74 -0
  209. data/packages/gsutil/boto/boto/iam/connection.py +1317 -0
  210. data/packages/gsutil/boto/boto/iam/summarymap.py +42 -0
  211. data/packages/gsutil/boto/boto/jsonresponse.py +163 -0
  212. data/packages/gsutil/boto/boto/jsonresponse.pyc +0 -0
  213. data/packages/gsutil/boto/boto/manage/__init__.py +23 -0
  214. data/packages/gsutil/boto/boto/manage/cmdshell.py +241 -0
  215. data/packages/gsutil/boto/boto/manage/propget.py +64 -0
  216. data/packages/gsutil/boto/boto/manage/server.py +556 -0
  217. data/packages/gsutil/boto/boto/manage/task.py +175 -0
  218. data/packages/gsutil/boto/boto/manage/test_manage.py +34 -0
  219. data/packages/gsutil/boto/boto/manage/volume.py +420 -0
  220. data/packages/gsutil/boto/boto/mashups/__init__.py +23 -0
  221. data/packages/gsutil/boto/boto/mashups/interactive.py +97 -0
  222. data/packages/gsutil/boto/boto/mashups/iobject.py +115 -0
  223. data/packages/gsutil/boto/boto/mashups/order.py +211 -0
  224. data/packages/gsutil/boto/boto/mashups/server.py +395 -0
  225. data/packages/gsutil/boto/boto/mturk/__init__.py +23 -0
  226. data/packages/gsutil/boto/boto/mturk/connection.py +1027 -0
  227. data/packages/gsutil/boto/boto/mturk/layoutparam.py +55 -0
  228. data/packages/gsutil/boto/boto/mturk/notification.py +103 -0
  229. data/packages/gsutil/boto/boto/mturk/price.py +48 -0
  230. data/packages/gsutil/boto/boto/mturk/qualification.py +137 -0
  231. data/packages/gsutil/boto/boto/mturk/question.py +455 -0
  232. data/packages/gsutil/boto/boto/mws/__init__.py +21 -0
  233. data/packages/gsutil/boto/boto/mws/connection.py +813 -0
  234. data/packages/gsutil/boto/boto/mws/exception.py +75 -0
  235. data/packages/gsutil/boto/boto/mws/response.py +655 -0
  236. data/packages/gsutil/boto/boto/plugin.py +90 -0
  237. data/packages/gsutil/boto/boto/plugin.pyc +0 -0
  238. data/packages/gsutil/boto/boto/provider.py +337 -0
  239. data/packages/gsutil/boto/boto/provider.pyc +0 -0
  240. data/packages/gsutil/boto/boto/pyami/__init__.py +22 -0
  241. data/packages/gsutil/boto/boto/pyami/__init__.pyc +0 -0
  242. data/packages/gsutil/boto/boto/pyami/bootstrap.py +134 -0
  243. data/packages/gsutil/boto/boto/pyami/config.py +229 -0
  244. data/packages/gsutil/boto/boto/pyami/config.pyc +0 -0
  245. data/packages/gsutil/boto/boto/pyami/copybot.cfg +60 -0
  246. data/packages/gsutil/boto/boto/pyami/copybot.py +97 -0
  247. data/packages/gsutil/boto/boto/pyami/helloworld.py +28 -0
  248. data/packages/gsutil/boto/boto/pyami/installers/__init__.py +64 -0
  249. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/__init__.py +22 -0
  250. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/apache.py +43 -0
  251. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/ebs.py +238 -0
  252. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/installer.py +96 -0
  253. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/mysql.py +109 -0
  254. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/trac.py +139 -0
  255. data/packages/gsutil/boto/boto/pyami/launch_ami.py +178 -0
  256. data/packages/gsutil/boto/boto/pyami/scriptbase.py +44 -0
  257. data/packages/gsutil/boto/boto/pyami/startup.py +60 -0
  258. data/packages/gsutil/boto/boto/rds/__init__.py +1194 -0
  259. data/packages/gsutil/boto/boto/rds/dbinstance.py +357 -0
  260. data/packages/gsutil/boto/boto/rds/dbsecuritygroup.py +177 -0
  261. data/packages/gsutil/boto/boto/rds/dbsnapshot.py +108 -0
  262. data/packages/gsutil/boto/boto/rds/event.py +49 -0
  263. data/packages/gsutil/boto/boto/rds/parametergroup.py +201 -0
  264. data/packages/gsutil/boto/boto/rds/regioninfo.py +32 -0
  265. data/packages/gsutil/boto/boto/regioninfo.py +63 -0
  266. data/packages/gsutil/boto/boto/regioninfo.pyc +0 -0
  267. data/packages/gsutil/boto/boto/resultset.py +169 -0
  268. data/packages/gsutil/boto/boto/resultset.pyc +0 -0
  269. data/packages/gsutil/boto/boto/roboto/__init__.py +1 -0
  270. data/packages/gsutil/boto/boto/roboto/awsqueryrequest.py +504 -0
  271. data/packages/gsutil/boto/boto/roboto/awsqueryservice.py +121 -0
  272. data/packages/gsutil/boto/boto/roboto/param.py +147 -0
  273. data/packages/gsutil/boto/boto/route53/__init__.py +75 -0
  274. data/packages/gsutil/boto/boto/route53/connection.py +403 -0
  275. data/packages/gsutil/boto/boto/route53/exception.py +27 -0
  276. data/packages/gsutil/boto/boto/route53/hostedzone.py +56 -0
  277. data/packages/gsutil/boto/boto/route53/record.py +306 -0
  278. data/packages/gsutil/boto/boto/route53/status.py +42 -0
  279. data/packages/gsutil/boto/boto/route53/zone.py +412 -0
  280. data/packages/gsutil/boto/boto/s3/__init__.py +84 -0
  281. data/packages/gsutil/boto/boto/s3/__init__.pyc +0 -0
  282. data/packages/gsutil/boto/boto/s3/acl.py +164 -0
  283. data/packages/gsutil/boto/boto/s3/acl.pyc +0 -0
  284. data/packages/gsutil/boto/boto/s3/bucket.py +1634 -0
  285. data/packages/gsutil/boto/boto/s3/bucket.pyc +0 -0
  286. data/packages/gsutil/boto/boto/s3/bucketlistresultset.py +139 -0
  287. data/packages/gsutil/boto/boto/s3/bucketlistresultset.pyc +0 -0
  288. data/packages/gsutil/boto/boto/s3/bucketlogging.py +83 -0
  289. data/packages/gsutil/boto/boto/s3/bucketlogging.pyc +0 -0
  290. data/packages/gsutil/boto/boto/s3/connection.py +540 -0
  291. data/packages/gsutil/boto/boto/s3/connection.pyc +0 -0
  292. data/packages/gsutil/boto/boto/s3/cors.py +210 -0
  293. data/packages/gsutil/boto/boto/s3/cors.pyc +0 -0
  294. data/packages/gsutil/boto/boto/s3/deletemarker.py +55 -0
  295. data/packages/gsutil/boto/boto/s3/deletemarker.pyc +0 -0
  296. data/packages/gsutil/boto/boto/s3/key.py +1712 -0
  297. data/packages/gsutil/boto/boto/s3/key.pyc +0 -0
  298. data/packages/gsutil/boto/boto/s3/keyfile.py +134 -0
  299. data/packages/gsutil/boto/boto/s3/keyfile.pyc +0 -0
  300. data/packages/gsutil/boto/boto/s3/lifecycle.py +231 -0
  301. data/packages/gsutil/boto/boto/s3/lifecycle.pyc +0 -0
  302. data/packages/gsutil/boto/boto/s3/multidelete.py +138 -0
  303. data/packages/gsutil/boto/boto/s3/multidelete.pyc +0 -0
  304. data/packages/gsutil/boto/boto/s3/multipart.py +315 -0
  305. data/packages/gsutil/boto/boto/s3/multipart.pyc +0 -0
  306. data/packages/gsutil/boto/boto/s3/prefix.py +42 -0
  307. data/packages/gsutil/boto/boto/s3/prefix.pyc +0 -0
  308. data/packages/gsutil/boto/boto/s3/resumable_download_handler.py +339 -0
  309. data/packages/gsutil/boto/boto/s3/resumable_download_handler.pyc +0 -0
  310. data/packages/gsutil/boto/boto/s3/tagging.py +71 -0
  311. data/packages/gsutil/boto/boto/s3/tagging.pyc +0 -0
  312. data/packages/gsutil/boto/boto/s3/user.py +49 -0
  313. data/packages/gsutil/boto/boto/s3/user.pyc +0 -0
  314. data/packages/gsutil/boto/boto/s3/website.py +237 -0
  315. data/packages/gsutil/boto/boto/s3/website.pyc +0 -0
  316. data/packages/gsutil/boto/boto/sdb/__init__.py +67 -0
  317. data/packages/gsutil/boto/boto/sdb/connection.py +617 -0
  318. data/packages/gsutil/boto/boto/sdb/db/__init__.py +20 -0
  319. data/packages/gsutil/boto/boto/sdb/db/blob.py +75 -0
  320. data/packages/gsutil/boto/boto/sdb/db/key.py +59 -0
  321. data/packages/gsutil/boto/boto/sdb/db/manager/__init__.py +85 -0
  322. data/packages/gsutil/boto/boto/sdb/db/manager/sdbmanager.py +732 -0
  323. data/packages/gsutil/boto/boto/sdb/db/manager/xmlmanager.py +517 -0
  324. data/packages/gsutil/boto/boto/sdb/db/model.py +294 -0
  325. data/packages/gsutil/boto/boto/sdb/db/property.py +703 -0
  326. data/packages/gsutil/boto/boto/sdb/db/query.py +85 -0
  327. data/packages/gsutil/boto/boto/sdb/db/sequence.py +226 -0
  328. data/packages/gsutil/boto/boto/sdb/db/test_db.py +231 -0
  329. data/packages/gsutil/boto/boto/sdb/domain.py +377 -0
  330. data/packages/gsutil/boto/boto/sdb/item.py +181 -0
  331. data/packages/gsutil/boto/boto/sdb/queryresultset.py +92 -0
  332. data/packages/gsutil/boto/boto/sdb/regioninfo.py +32 -0
  333. data/packages/gsutil/boto/boto/services/__init__.py +23 -0
  334. data/packages/gsutil/boto/boto/services/bs.py +179 -0
  335. data/packages/gsutil/boto/boto/services/message.py +58 -0
  336. data/packages/gsutil/boto/boto/services/result.py +136 -0
  337. data/packages/gsutil/boto/boto/services/service.py +161 -0
  338. data/packages/gsutil/boto/boto/services/servicedef.py +91 -0
  339. data/packages/gsutil/boto/boto/services/sonofmmm.cfg +43 -0
  340. data/packages/gsutil/boto/boto/services/sonofmmm.py +81 -0
  341. data/packages/gsutil/boto/boto/services/submit.py +88 -0
  342. data/packages/gsutil/boto/boto/ses/__init__.py +54 -0
  343. data/packages/gsutil/boto/boto/ses/connection.py +521 -0
  344. data/packages/gsutil/boto/boto/ses/exceptions.py +77 -0
  345. data/packages/gsutil/boto/boto/sns/__init__.py +78 -0
  346. data/packages/gsutil/boto/boto/sns/connection.py +431 -0
  347. data/packages/gsutil/boto/boto/sqs/__init__.py +56 -0
  348. data/packages/gsutil/boto/boto/sqs/attributes.py +46 -0
  349. data/packages/gsutil/boto/boto/sqs/batchresults.py +95 -0
  350. data/packages/gsutil/boto/boto/sqs/connection.py +417 -0
  351. data/packages/gsutil/boto/boto/sqs/jsonmessage.py +43 -0
  352. data/packages/gsutil/boto/boto/sqs/message.py +253 -0
  353. data/packages/gsutil/boto/boto/sqs/queue.py +478 -0
  354. data/packages/gsutil/boto/boto/sqs/regioninfo.py +32 -0
  355. data/packages/gsutil/boto/boto/storage_uri.py +835 -0
  356. data/packages/gsutil/boto/boto/storage_uri.pyc +0 -0
  357. data/packages/gsutil/boto/boto/sts/__init__.py +55 -0
  358. data/packages/gsutil/boto/boto/sts/connection.py +207 -0
  359. data/packages/gsutil/boto/boto/sts/credentials.py +215 -0
  360. data/packages/gsutil/boto/boto/swf/__init__.py +60 -0
  361. data/packages/gsutil/boto/boto/swf/exceptions.py +44 -0
  362. data/packages/gsutil/boto/boto/swf/layer1.py +1512 -0
  363. data/packages/gsutil/boto/boto/swf/layer1_decisions.py +287 -0
  364. data/packages/gsutil/boto/boto/swf/layer2.py +342 -0
  365. data/packages/gsutil/boto/boto/utils.py +927 -0
  366. data/packages/gsutil/boto/boto/utils.pyc +0 -0
  367. data/packages/gsutil/boto/boto/vpc/__init__.py +910 -0
  368. data/packages/gsutil/boto/boto/vpc/customergateway.py +54 -0
  369. data/packages/gsutil/boto/boto/vpc/dhcpoptions.py +72 -0
  370. data/packages/gsutil/boto/boto/vpc/internetgateway.py +72 -0
  371. data/packages/gsutil/boto/boto/vpc/routetable.py +109 -0
  372. data/packages/gsutil/boto/boto/vpc/subnet.py +57 -0
  373. data/packages/gsutil/boto/boto/vpc/vpc.py +54 -0
  374. data/packages/gsutil/boto/boto/vpc/vpnconnection.py +60 -0
  375. data/packages/gsutil/boto/boto/vpc/vpngateway.py +83 -0
  376. data/packages/gsutil/boto/docs/BotoCheatSheet.pdf +0 -0
  377. data/packages/gsutil/boto/docs/Makefile +89 -0
  378. data/packages/gsutil/boto/docs/make.bat +113 -0
  379. data/packages/gsutil/boto/docs/source/_templates/layout.html +3 -0
  380. data/packages/gsutil/boto/docs/source/autoscale_tut.rst +220 -0
  381. data/packages/gsutil/boto/docs/source/boto_config_tut.rst +125 -0
  382. data/packages/gsutil/boto/docs/source/boto_theme/static/boto.css_t +239 -0
  383. data/packages/gsutil/boto/docs/source/boto_theme/static/pygments.css +61 -0
  384. data/packages/gsutil/boto/docs/source/boto_theme/theme.conf +3 -0
  385. data/packages/gsutil/boto/docs/source/cloudfront_tut.rst +196 -0
  386. data/packages/gsutil/boto/docs/source/cloudsearch_tut.rst +411 -0
  387. data/packages/gsutil/boto/docs/source/cloudwatch_tut.rst +116 -0
  388. data/packages/gsutil/boto/docs/source/conf.py +32 -0
  389. data/packages/gsutil/boto/docs/source/contributing.rst +204 -0
  390. data/packages/gsutil/boto/docs/source/documentation.rst +59 -0
  391. data/packages/gsutil/boto/docs/source/dynamodb_tut.rst +339 -0
  392. data/packages/gsutil/boto/docs/source/ec2_tut.rst +86 -0
  393. data/packages/gsutil/boto/docs/source/elb_tut.rst +257 -0
  394. data/packages/gsutil/boto/docs/source/emr_tut.rst +108 -0
  395. data/packages/gsutil/boto/docs/source/index.rst +146 -0
  396. data/packages/gsutil/boto/docs/source/rds_tut.rst +108 -0
  397. data/packages/gsutil/boto/docs/source/ref/autoscale.rst +62 -0
  398. data/packages/gsutil/boto/docs/source/ref/beanstalk.rst +26 -0
  399. data/packages/gsutil/boto/docs/source/ref/boto.rst +47 -0
  400. data/packages/gsutil/boto/docs/source/ref/cloudformation.rst +34 -0
  401. data/packages/gsutil/boto/docs/source/ref/cloudfront.rst +68 -0
  402. data/packages/gsutil/boto/docs/source/ref/cloudsearch.rst +59 -0
  403. data/packages/gsutil/boto/docs/source/ref/cloudwatch.rst +27 -0
  404. data/packages/gsutil/boto/docs/source/ref/contrib.rst +32 -0
  405. data/packages/gsutil/boto/docs/source/ref/datapipeline.rst +26 -0
  406. data/packages/gsutil/boto/docs/source/ref/dynamodb.rst +61 -0
  407. data/packages/gsutil/boto/docs/source/ref/ec2.rst +140 -0
  408. data/packages/gsutil/boto/docs/source/ref/ecs.rst +19 -0
  409. data/packages/gsutil/boto/docs/source/ref/elasticache.rst +19 -0
  410. data/packages/gsutil/boto/docs/source/ref/elastictranscoder.rst +26 -0
  411. data/packages/gsutil/boto/docs/source/ref/elb.rst +47 -0
  412. data/packages/gsutil/boto/docs/source/ref/emr.rst +34 -0
  413. data/packages/gsutil/boto/docs/source/ref/file.rst +34 -0
  414. data/packages/gsutil/boto/docs/source/ref/fps.rst +19 -0
  415. data/packages/gsutil/boto/docs/source/ref/glacier.rst +63 -0
  416. data/packages/gsutil/boto/docs/source/ref/gs.rst +72 -0
  417. data/packages/gsutil/boto/docs/source/ref/iam.rst +27 -0
  418. data/packages/gsutil/boto/docs/source/ref/index.rst +40 -0
  419. data/packages/gsutil/boto/docs/source/ref/manage.rst +47 -0
  420. data/packages/gsutil/boto/docs/source/ref/mturk.rst +54 -0
  421. data/packages/gsutil/boto/docs/source/ref/mws.rst +33 -0
  422. data/packages/gsutil/boto/docs/source/ref/pyami.rst +103 -0
  423. data/packages/gsutil/boto/docs/source/ref/rds.rst +47 -0
  424. data/packages/gsutil/boto/docs/source/ref/route53.rst +34 -0
  425. data/packages/gsutil/boto/docs/source/ref/s3.rst +111 -0
  426. data/packages/gsutil/boto/docs/source/ref/sdb.rst +45 -0
  427. data/packages/gsutil/boto/docs/source/ref/sdb_db.rst +83 -0
  428. data/packages/gsutil/boto/docs/source/ref/services.rst +61 -0
  429. data/packages/gsutil/boto/docs/source/ref/ses.rst +21 -0
  430. data/packages/gsutil/boto/docs/source/ref/sns.rst +17 -0
  431. data/packages/gsutil/boto/docs/source/ref/sqs.rst +61 -0
  432. data/packages/gsutil/boto/docs/source/ref/sts.rst +25 -0
  433. data/packages/gsutil/boto/docs/source/ref/swf.rst +22 -0
  434. data/packages/gsutil/boto/docs/source/ref/vpc.rst +54 -0
  435. data/packages/gsutil/boto/docs/source/s3_tut.rst +450 -0
  436. data/packages/gsutil/boto/docs/source/security_groups.rst +82 -0
  437. data/packages/gsutil/boto/docs/source/ses_tut.rst +171 -0
  438. data/packages/gsutil/boto/docs/source/simpledb_tut.rst +188 -0
  439. data/packages/gsutil/boto/docs/source/sqs_tut.rst +246 -0
  440. data/packages/gsutil/boto/docs/source/vpc_tut.rst +100 -0
  441. data/packages/gsutil/boto/pylintrc +305 -0
  442. data/packages/gsutil/boto/requirements.txt +10 -0
  443. data/packages/gsutil/boto/setup.py +89 -0
  444. data/packages/gsutil/boto/tests/__init__.py +20 -0
  445. data/packages/gsutil/boto/tests/db/test_lists.py +96 -0
  446. data/packages/gsutil/boto/tests/db/test_password.py +128 -0
  447. data/packages/gsutil/boto/tests/db/test_query.py +152 -0
  448. data/packages/gsutil/boto/tests/db/test_sequence.py +109 -0
  449. data/packages/gsutil/boto/tests/devpay/__init__.py +0 -0
  450. data/packages/gsutil/boto/tests/devpay/test_s3.py +181 -0
  451. data/packages/gsutil/boto/tests/fps/__init__.py +0 -0
  452. data/packages/gsutil/boto/tests/fps/test.py +100 -0
  453. data/packages/gsutil/boto/tests/fps/test_verify_signature.py +12 -0
  454. data/packages/gsutil/boto/tests/integration/__init__.py +0 -0
  455. data/packages/gsutil/boto/tests/integration/beanstalk/test_wrapper.py +209 -0
  456. data/packages/gsutil/boto/tests/integration/cloudformation/__init__.py +21 -0
  457. data/packages/gsutil/boto/tests/integration/cloudformation/test_cert_verification.py +40 -0
  458. data/packages/gsutil/boto/tests/integration/cloudformation/test_connection.py +110 -0
  459. data/packages/gsutil/boto/tests/integration/cloudsearch/__init__.py +21 -0
  460. data/packages/gsutil/boto/tests/integration/cloudsearch/test_cert_verification.py +40 -0
  461. data/packages/gsutil/boto/tests/integration/datapipeline/test_layer1.py +122 -0
  462. data/packages/gsutil/boto/tests/integration/dynamodb/__init__.py +20 -0
  463. data/packages/gsutil/boto/tests/integration/dynamodb/test_cert_verification.py +40 -0
  464. data/packages/gsutil/boto/tests/integration/dynamodb/test_layer1.py +266 -0
  465. data/packages/gsutil/boto/tests/integration/dynamodb/test_layer2.py +484 -0
  466. data/packages/gsutil/boto/tests/integration/dynamodb/test_table.py +84 -0
  467. data/packages/gsutil/boto/tests/integration/ec2/__init__.py +20 -0
  468. data/packages/gsutil/boto/tests/integration/ec2/autoscale/__init__.py +21 -0
  469. data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_cert_verification.py +40 -0
  470. data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_connection.py +167 -0
  471. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/__init__.py +20 -0
  472. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_cert_verification.py +40 -0
  473. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_connection.py +277 -0
  474. data/packages/gsutil/boto/tests/integration/ec2/elb/__init__.py +20 -0
  475. data/packages/gsutil/boto/tests/integration/ec2/elb/test_cert_verification.py +40 -0
  476. data/packages/gsutil/boto/tests/integration/ec2/elb/test_connection.py +130 -0
  477. data/packages/gsutil/boto/tests/integration/ec2/test_cert_verification.py +40 -0
  478. data/packages/gsutil/boto/tests/integration/ec2/test_connection.py +192 -0
  479. data/packages/gsutil/boto/tests/integration/ec2/vpc/__init__.py +0 -0
  480. data/packages/gsutil/boto/tests/integration/ec2/vpc/test_connection.py +95 -0
  481. data/packages/gsutil/boto/tests/integration/elasticache/__init__.py +0 -0
  482. data/packages/gsutil/boto/tests/integration/elasticache/test_layer1.py +67 -0
  483. data/packages/gsutil/boto/tests/integration/elastictranscoder/__init__.py +0 -0
  484. data/packages/gsutil/boto/tests/integration/elastictranscoder/test_cert_verification.py +35 -0
  485. data/packages/gsutil/boto/tests/integration/elastictranscoder/test_layer1.py +115 -0
  486. data/packages/gsutil/boto/tests/integration/emr/__init__.py +20 -0
  487. data/packages/gsutil/boto/tests/integration/emr/test_cert_verification.py +40 -0
  488. data/packages/gsutil/boto/tests/integration/glacier/__init__.py +22 -0
  489. data/packages/gsutil/boto/tests/integration/glacier/test_cert_verification.py +40 -0
  490. data/packages/gsutil/boto/tests/integration/glacier/test_layer1.py +44 -0
  491. data/packages/gsutil/boto/tests/integration/glacier/test_layer2.py +45 -0
  492. data/packages/gsutil/boto/tests/integration/gs/__init__.py +0 -0
  493. data/packages/gsutil/boto/tests/integration/gs/cb_test_harness.py +71 -0
  494. data/packages/gsutil/boto/tests/integration/gs/test_basic.py +379 -0
  495. data/packages/gsutil/boto/tests/integration/gs/test_generation_conditionals.py +399 -0
  496. data/packages/gsutil/boto/tests/integration/gs/test_resumable_downloads.py +358 -0
  497. data/packages/gsutil/boto/tests/integration/gs/test_resumable_uploads.py +525 -0
  498. data/packages/gsutil/boto/tests/integration/gs/test_storage_uri.py +125 -0
  499. data/packages/gsutil/boto/tests/integration/gs/test_versioning.py +268 -0
  500. data/packages/gsutil/boto/tests/integration/gs/testcase.py +116 -0
  501. data/packages/gsutil/boto/tests/integration/gs/util.py +63 -0
  502. data/packages/gsutil/boto/tests/integration/iam/__init__.py +20 -0
  503. data/packages/gsutil/boto/tests/integration/iam/test_cert_verification.py +40 -0
  504. data/packages/gsutil/boto/tests/integration/mws/__init__.py +0 -0
  505. data/packages/gsutil/boto/tests/integration/mws/test.py +100 -0
  506. data/packages/gsutil/boto/tests/integration/rds/__init__.py +21 -0
  507. data/packages/gsutil/boto/tests/integration/rds/test_cert_verification.py +40 -0
  508. data/packages/gsutil/boto/tests/integration/route53/__init__.py +20 -0
  509. data/packages/gsutil/boto/tests/integration/route53/test_cert_verification.py +40 -0
  510. data/packages/gsutil/boto/tests/integration/route53/test_zone.py +132 -0
  511. data/packages/gsutil/boto/tests/integration/s3/__init__.py +20 -0
  512. data/packages/gsutil/boto/tests/integration/s3/mock_storage_service.py +589 -0
  513. data/packages/gsutil/boto/tests/integration/s3/other_cacerts.txt +70 -0
  514. data/packages/gsutil/boto/tests/integration/s3/test_bucket.py +263 -0
  515. data/packages/gsutil/boto/tests/integration/s3/test_cert_verification.py +40 -0
  516. data/packages/gsutil/boto/tests/integration/s3/test_connection.py +245 -0
  517. data/packages/gsutil/boto/tests/integration/s3/test_cors.py +78 -0
  518. data/packages/gsutil/boto/tests/integration/s3/test_encryption.py +115 -0
  519. data/packages/gsutil/boto/tests/integration/s3/test_https_cert_validation.py +141 -0
  520. data/packages/gsutil/boto/tests/integration/s3/test_key.py +375 -0
  521. data/packages/gsutil/boto/tests/integration/s3/test_mfa.py +95 -0
  522. data/packages/gsutil/boto/tests/integration/s3/test_multidelete.py +181 -0
  523. data/packages/gsutil/boto/tests/integration/s3/test_multipart.py +139 -0
  524. data/packages/gsutil/boto/tests/integration/s3/test_pool.py +246 -0
  525. data/packages/gsutil/boto/tests/integration/s3/test_versioning.py +158 -0
  526. data/packages/gsutil/boto/tests/integration/sdb/__init__.py +20 -0
  527. data/packages/gsutil/boto/tests/integration/sdb/test_cert_verification.py +40 -0
  528. data/packages/gsutil/boto/tests/integration/sdb/test_connection.py +119 -0
  529. data/packages/gsutil/boto/tests/integration/ses/__init__.py +0 -0
  530. data/packages/gsutil/boto/tests/integration/ses/test_cert_verification.py +40 -0
  531. data/packages/gsutil/boto/tests/integration/ses/test_connection.py +38 -0
  532. data/packages/gsutil/boto/tests/integration/sns/__init__.py +20 -0
  533. data/packages/gsutil/boto/tests/integration/sns/test_cert_verification.py +40 -0
  534. data/packages/gsutil/boto/tests/integration/sqs/__init__.py +20 -0
  535. data/packages/gsutil/boto/tests/integration/sqs/test_cert_verification.py +40 -0
  536. data/packages/gsutil/boto/tests/integration/sqs/test_connection.py +217 -0
  537. data/packages/gsutil/boto/tests/integration/sts/__init__.py +20 -0
  538. data/packages/gsutil/boto/tests/integration/sts/test_cert_verification.py +40 -0
  539. data/packages/gsutil/boto/tests/integration/sts/test_session_token.py +65 -0
  540. data/packages/gsutil/boto/tests/integration/swf/__init__.py +0 -0
  541. data/packages/gsutil/boto/tests/integration/swf/test_cert_verification.py +40 -0
  542. data/packages/gsutil/boto/tests/integration/swf/test_layer1.py +246 -0
  543. data/packages/gsutil/boto/tests/integration/swf/test_layer1_workflow_execution.py +173 -0
  544. data/packages/gsutil/boto/tests/mturk/__init__.py +0 -0
  545. data/packages/gsutil/boto/tests/mturk/_init_environment.py +28 -0
  546. data/packages/gsutil/boto/tests/mturk/all_tests.py +24 -0
  547. data/packages/gsutil/boto/tests/mturk/cleanup_tests.py +47 -0
  548. data/packages/gsutil/boto/tests/mturk/common.py +45 -0
  549. data/packages/gsutil/boto/tests/mturk/create_free_text_question_regex.doctest +100 -0
  550. data/packages/gsutil/boto/tests/mturk/create_hit.doctest +92 -0
  551. data/packages/gsutil/boto/tests/mturk/create_hit_binary.doctest +94 -0
  552. data/packages/gsutil/boto/tests/mturk/create_hit_external.py +21 -0
  553. data/packages/gsutil/boto/tests/mturk/create_hit_from_hit_type.doctest +103 -0
  554. data/packages/gsutil/boto/tests/mturk/create_hit_test.py +21 -0
  555. data/packages/gsutil/boto/tests/mturk/create_hit_with_qualifications.py +16 -0
  556. data/packages/gsutil/boto/tests/mturk/hit_persistence.py +27 -0
  557. data/packages/gsutil/boto/tests/mturk/mocks.py +11 -0
  558. data/packages/gsutil/boto/tests/mturk/reviewable_hits.doctest +129 -0
  559. data/packages/gsutil/boto/tests/mturk/run-doctest.py +13 -0
  560. data/packages/gsutil/boto/tests/mturk/search_hits.doctest +16 -0
  561. data/packages/gsutil/boto/tests/mturk/selenium_support.py +61 -0
  562. data/packages/gsutil/boto/tests/mturk/support.py +7 -0
  563. data/packages/gsutil/boto/tests/mturk/test_disable_hit.py +11 -0
  564. data/packages/gsutil/boto/tests/test.py +59 -0
  565. data/packages/gsutil/boto/tests/unit/__init__.py +79 -0
  566. data/packages/gsutil/boto/tests/unit/auth/__init__.py +0 -0
  567. data/packages/gsutil/boto/tests/unit/auth/test_sigv4.py +73 -0
  568. data/packages/gsutil/boto/tests/unit/beanstalk/__init__.py +0 -0
  569. data/packages/gsutil/boto/tests/unit/beanstalk/test_layer1.py +128 -0
  570. data/packages/gsutil/boto/tests/unit/cloudformation/__init__.py +0 -0
  571. data/packages/gsutil/boto/tests/unit/cloudformation/test_connection.py +605 -0
  572. data/packages/gsutil/boto/tests/unit/cloudformation/test_stack.py +63 -0
  573. data/packages/gsutil/boto/tests/unit/cloudfront/__init__.py +0 -0
  574. data/packages/gsutil/boto/tests/unit/cloudfront/test_invalidation_list.py +113 -0
  575. data/packages/gsutil/boto/tests/unit/cloudfront/test_signed_urls.py +354 -0
  576. data/packages/gsutil/boto/tests/unit/cloudsearch/__init__.py +1 -0
  577. data/packages/gsutil/boto/tests/unit/cloudsearch/test_connection.py +241 -0
  578. data/packages/gsutil/boto/tests/unit/cloudsearch/test_document.py +324 -0
  579. data/packages/gsutil/boto/tests/unit/cloudsearch/test_search.py +325 -0
  580. data/packages/gsutil/boto/tests/unit/dynamodb/__init__.py +0 -0
  581. data/packages/gsutil/boto/tests/unit/dynamodb/test_batch.py +103 -0
  582. data/packages/gsutil/boto/tests/unit/dynamodb/test_layer2.py +119 -0
  583. data/packages/gsutil/boto/tests/unit/dynamodb/test_types.py +82 -0
  584. data/packages/gsutil/boto/tests/unit/ec2/__init__.py +0 -0
  585. data/packages/gsutil/boto/tests/unit/ec2/autoscale/__init__.py +0 -0
  586. data/packages/gsutil/boto/tests/unit/ec2/autoscale/test_group.py +162 -0
  587. data/packages/gsutil/boto/tests/unit/ec2/test_address.py +39 -0
  588. data/packages/gsutil/boto/tests/unit/ec2/test_blockdevicemapping.py +79 -0
  589. data/packages/gsutil/boto/tests/unit/ec2/test_connection.py +480 -0
  590. data/packages/gsutil/boto/tests/unit/ec2/test_instance.py +243 -0
  591. data/packages/gsutil/boto/tests/unit/ec2/test_networkinterface.py +140 -0
  592. data/packages/gsutil/boto/tests/unit/ec2/test_volume.py +248 -0
  593. data/packages/gsutil/boto/tests/unit/emr/test_emr_responses.py +373 -0
  594. data/packages/gsutil/boto/tests/unit/glacier/__init__.py +0 -0
  595. data/packages/gsutil/boto/tests/unit/glacier/test_concurrent.py +120 -0
  596. data/packages/gsutil/boto/tests/unit/glacier/test_job.py +60 -0
  597. data/packages/gsutil/boto/tests/unit/glacier/test_layer1.py +98 -0
  598. data/packages/gsutil/boto/tests/unit/glacier/test_layer2.py +266 -0
  599. data/packages/gsutil/boto/tests/unit/glacier/test_utils.py +116 -0
  600. data/packages/gsutil/boto/tests/unit/glacier/test_vault.py +100 -0
  601. data/packages/gsutil/boto/tests/unit/glacier/test_writer.py +185 -0
  602. data/packages/gsutil/boto/tests/unit/provider/__init__.py +0 -0
  603. data/packages/gsutil/boto/tests/unit/provider/test_provider.py +176 -0
  604. data/packages/gsutil/boto/tests/unit/rds/__init__.py +0 -0
  605. data/packages/gsutil/boto/tests/unit/rds/test_connection.py +131 -0
  606. data/packages/gsutil/boto/tests/unit/s3/__init__.py +0 -0
  607. data/packages/gsutil/boto/tests/unit/s3/test_cors_configuration.py +77 -0
  608. data/packages/gsutil/boto/tests/unit/s3/test_key.py +75 -0
  609. data/packages/gsutil/boto/tests/unit/s3/test_keyfile.py +101 -0
  610. data/packages/gsutil/boto/tests/unit/s3/test_lifecycle.py +97 -0
  611. data/packages/gsutil/boto/tests/unit/s3/test_tagging.py +47 -0
  612. data/packages/gsutil/boto/tests/unit/s3/test_uri.py +257 -0
  613. data/packages/gsutil/boto/tests/unit/s3/test_website.py +188 -0
  614. data/packages/gsutil/boto/tests/unit/sns/__init__.py +0 -0
  615. data/packages/gsutil/boto/tests/unit/sns/test_connection.py +99 -0
  616. data/packages/gsutil/boto/tests/unit/sqs/__init__.py +0 -0
  617. data/packages/gsutil/boto/tests/unit/sqs/test_connection.py +98 -0
  618. data/packages/gsutil/boto/tests/unit/sqs/test_queue.py +40 -0
  619. data/packages/gsutil/boto/tests/unit/sts/test_connection.py +74 -0
  620. data/packages/gsutil/boto/tests/unit/test_connection.py +60 -0
  621. data/packages/gsutil/boto/tests/unit/utils/test_utils.py +109 -0
  622. data/packages/gsutil/boto/tox.ini +8 -0
  623. data/packages/gsutil/gslib/README +5 -0
  624. data/packages/gsutil/gslib/__init__.py +22 -0
  625. data/packages/gsutil/gslib/__init__.pyc +0 -0
  626. data/packages/gsutil/gslib/addlhelp/__init__.py +15 -0
  627. data/packages/gsutil/gslib/addlhelp/acls.py +234 -0
  628. data/packages/gsutil/gslib/addlhelp/anon.py +57 -0
  629. data/packages/gsutil/gslib/addlhelp/command_opts.py +116 -0
  630. data/packages/gsutil/gslib/addlhelp/dev.py +139 -0
  631. data/packages/gsutil/gslib/addlhelp/metadata.py +186 -0
  632. data/packages/gsutil/gslib/addlhelp/naming.py +173 -0
  633. data/packages/gsutil/gslib/addlhelp/prod.py +160 -0
  634. data/packages/gsutil/gslib/addlhelp/projects.py +130 -0
  635. data/packages/gsutil/gslib/addlhelp/subdirs.py +110 -0
  636. data/packages/gsutil/gslib/addlhelp/support.py +86 -0
  637. data/packages/gsutil/gslib/addlhelp/versioning.py +242 -0
  638. data/packages/gsutil/gslib/addlhelp/wildcards.py +170 -0
  639. data/packages/gsutil/gslib/bucket_listing_ref.py +175 -0
  640. data/packages/gsutil/gslib/bucket_listing_ref.pyc +0 -0
  641. data/packages/gsutil/gslib/command.py +722 -0
  642. data/packages/gsutil/gslib/command.pyc +0 -0
  643. data/packages/gsutil/gslib/command_runner.py +101 -0
  644. data/packages/gsutil/gslib/command_runner.pyc +0 -0
  645. data/packages/gsutil/gslib/commands/__init__.py +15 -0
  646. data/packages/gsutil/gslib/commands/__init__.pyc +0 -0
  647. data/packages/gsutil/gslib/commands/cat.py +131 -0
  648. data/packages/gsutil/gslib/commands/cat.pyc +0 -0
  649. data/packages/gsutil/gslib/commands/chacl.py +532 -0
  650. data/packages/gsutil/gslib/commands/chacl.pyc +0 -0
  651. data/packages/gsutil/gslib/commands/config.py +694 -0
  652. data/packages/gsutil/gslib/commands/config.pyc +0 -0
  653. data/packages/gsutil/gslib/commands/cp.py +1818 -0
  654. data/packages/gsutil/gslib/commands/cp.pyc +0 -0
  655. data/packages/gsutil/gslib/commands/disablelogging.py +101 -0
  656. data/packages/gsutil/gslib/commands/disablelogging.pyc +0 -0
  657. data/packages/gsutil/gslib/commands/enablelogging.py +149 -0
  658. data/packages/gsutil/gslib/commands/enablelogging.pyc +0 -0
  659. data/packages/gsutil/gslib/commands/getacl.py +82 -0
  660. data/packages/gsutil/gslib/commands/getacl.pyc +0 -0
  661. data/packages/gsutil/gslib/commands/getcors.py +121 -0
  662. data/packages/gsutil/gslib/commands/getcors.pyc +0 -0
  663. data/packages/gsutil/gslib/commands/getdefacl.py +86 -0
  664. data/packages/gsutil/gslib/commands/getdefacl.pyc +0 -0
  665. data/packages/gsutil/gslib/commands/getlogging.py +137 -0
  666. data/packages/gsutil/gslib/commands/getlogging.pyc +0 -0
  667. data/packages/gsutil/gslib/commands/getversioning.py +116 -0
  668. data/packages/gsutil/gslib/commands/getversioning.pyc +0 -0
  669. data/packages/gsutil/gslib/commands/getwebcfg.py +122 -0
  670. data/packages/gsutil/gslib/commands/getwebcfg.pyc +0 -0
  671. data/packages/gsutil/gslib/commands/help.py +218 -0
  672. data/packages/gsutil/gslib/commands/help.pyc +0 -0
  673. data/packages/gsutil/gslib/commands/ls.py +578 -0
  674. data/packages/gsutil/gslib/commands/ls.pyc +0 -0
  675. data/packages/gsutil/gslib/commands/mb.py +172 -0
  676. data/packages/gsutil/gslib/commands/mb.pyc +0 -0
  677. data/packages/gsutil/gslib/commands/mv.py +159 -0
  678. data/packages/gsutil/gslib/commands/mv.pyc +0 -0
  679. data/packages/gsutil/gslib/commands/perfdiag.py +903 -0
  680. data/packages/gsutil/gslib/commands/perfdiag.pyc +0 -0
  681. data/packages/gsutil/gslib/commands/rb.py +113 -0
  682. data/packages/gsutil/gslib/commands/rb.pyc +0 -0
  683. data/packages/gsutil/gslib/commands/rm.py +239 -0
  684. data/packages/gsutil/gslib/commands/rm.pyc +0 -0
  685. data/packages/gsutil/gslib/commands/setacl.py +138 -0
  686. data/packages/gsutil/gslib/commands/setacl.pyc +0 -0
  687. data/packages/gsutil/gslib/commands/setcors.py +145 -0
  688. data/packages/gsutil/gslib/commands/setcors.pyc +0 -0
  689. data/packages/gsutil/gslib/commands/setdefacl.py +105 -0
  690. data/packages/gsutil/gslib/commands/setdefacl.pyc +0 -0
  691. data/packages/gsutil/gslib/commands/setmeta.py +428 -0
  692. data/packages/gsutil/gslib/commands/setmeta.pyc +0 -0
  693. data/packages/gsutil/gslib/commands/setversioning.py +114 -0
  694. data/packages/gsutil/gslib/commands/setversioning.pyc +0 -0
  695. data/packages/gsutil/gslib/commands/setwebcfg.py +190 -0
  696. data/packages/gsutil/gslib/commands/setwebcfg.pyc +0 -0
  697. data/packages/gsutil/gslib/commands/test.py +228 -0
  698. data/packages/gsutil/gslib/commands/test.pyc +0 -0
  699. data/packages/gsutil/gslib/commands/update.py +305 -0
  700. data/packages/gsutil/gslib/commands/update.pyc +0 -0
  701. data/packages/gsutil/gslib/commands/version.py +150 -0
  702. data/packages/gsutil/gslib/commands/version.pyc +0 -0
  703. data/packages/gsutil/gslib/exception.py +76 -0
  704. data/packages/gsutil/gslib/exception.pyc +0 -0
  705. data/packages/gsutil/gslib/help_provider.py +81 -0
  706. data/packages/gsutil/gslib/help_provider.pyc +0 -0
  707. data/packages/gsutil/gslib/name_expansion.py +550 -0
  708. data/packages/gsutil/gslib/name_expansion.pyc +0 -0
  709. data/packages/gsutil/gslib/no_op_auth_plugin.py +30 -0
  710. data/packages/gsutil/gslib/plurality_checkable_iterator.py +56 -0
  711. data/packages/gsutil/gslib/plurality_checkable_iterator.pyc +0 -0
  712. data/packages/gsutil/gslib/project_id.py +67 -0
  713. data/packages/gsutil/gslib/project_id.pyc +0 -0
  714. data/packages/gsutil/gslib/storage_uri_builder.py +56 -0
  715. data/packages/gsutil/gslib/storage_uri_builder.pyc +0 -0
  716. data/packages/gsutil/gslib/tests/__init__.py +15 -0
  717. data/packages/gsutil/gslib/tests/__init__.pyc +0 -0
  718. data/packages/gsutil/gslib/tests/test_chacl.py +236 -0
  719. data/packages/gsutil/gslib/tests/test_cp.py +267 -0
  720. data/packages/gsutil/gslib/tests/test_data/test.gif +0 -0
  721. data/packages/gsutil/gslib/tests/test_data/test.mp3 +0 -0
  722. data/packages/gsutil/gslib/tests/test_ls.py +66 -0
  723. data/packages/gsutil/gslib/tests/test_mv.py +69 -0
  724. data/packages/gsutil/gslib/tests/test_naming.py +989 -0
  725. data/packages/gsutil/gslib/tests/test_perfdiag.py +41 -0
  726. data/packages/gsutil/gslib/tests/test_plurality_checkable_iterator.py +67 -0
  727. data/packages/gsutil/gslib/tests/test_rm.py +143 -0
  728. data/packages/gsutil/gslib/tests/test_setacl.py +152 -0
  729. data/packages/gsutil/gslib/tests/test_setcors.py +168 -0
  730. data/packages/gsutil/gslib/tests/test_setmeta.py +91 -0
  731. data/packages/gsutil/gslib/tests/test_setversioning.py +44 -0
  732. data/packages/gsutil/gslib/tests/test_setwebcfg.py +63 -0
  733. data/packages/gsutil/gslib/tests/test_thread_pool.py +92 -0
  734. data/packages/gsutil/gslib/tests/test_wildcard_iterator.py +364 -0
  735. data/packages/gsutil/gslib/tests/testcase/__init__.py +18 -0
  736. data/packages/gsutil/gslib/tests/testcase/base.py +89 -0
  737. data/packages/gsutil/gslib/tests/testcase/integration_testcase.py +197 -0
  738. data/packages/gsutil/gslib/tests/testcase/unit_testcase.py +230 -0
  739. data/packages/gsutil/gslib/tests/util.py +125 -0
  740. data/packages/gsutil/gslib/tests/util.pyc +0 -0
  741. data/packages/gsutil/gslib/thread_pool.py +79 -0
  742. data/packages/gsutil/gslib/thread_pool.pyc +0 -0
  743. data/packages/gsutil/gslib/util.py +151 -0
  744. data/packages/gsutil/gslib/util.pyc +0 -0
  745. data/packages/gsutil/gslib/wildcard_iterator.py +492 -0
  746. data/packages/gsutil/gslib/wildcard_iterator.pyc +0 -0
  747. data/packages/gsutil/gsutil +377 -0
  748. data/packages/gsutil/gsutil.spec.in +75 -0
  749. data/packages/gsutil/oauth2_plugin/__init__.py +22 -0
  750. data/packages/gsutil/oauth2_plugin/__init__.pyc +0 -0
  751. data/packages/gsutil/oauth2_plugin/oauth2_client.py +642 -0
  752. data/packages/gsutil/oauth2_plugin/oauth2_client.pyc +0 -0
  753. data/packages/gsutil/oauth2_plugin/oauth2_client_test.py +374 -0
  754. data/packages/gsutil/oauth2_plugin/oauth2_helper.py +110 -0
  755. data/packages/gsutil/oauth2_plugin/oauth2_helper.pyc +0 -0
  756. data/packages/gsutil/oauth2_plugin/oauth2_plugin.py +24 -0
  757. data/packages/gsutil/oauth2_plugin/oauth2_plugin.pyc +0 -0
  758. data/packages/gsutil/pkg_gen.sh +54 -0
  759. data/packages/gsutil/pkg_util.py +60 -0
  760. data/packages/gsutil/setup.py +141 -0
  761. data/packages/gsutil/third_party/__init__.py +0 -0
  762. data/packages/gsutil/third_party/__init__.pyc +0 -0
  763. data/packages/gsutil/third_party/fancy_urllib/README +21 -0
  764. data/packages/gsutil/third_party/fancy_urllib/__init__.py +398 -0
  765. data/packages/gsutil/third_party/fancy_urllib/__init__.pyc +0 -0
  766. data/tasks/rubygem.rake +3 -1
  767. metadata +770 -7
  768. metadata.gz.sig +0 -0
@@ -0,0 +1,32 @@
1
+ # Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
2
+ # Copyright (c) 2010, Eucalyptus Systems, Inc.
3
+ # All rights reserved.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a
6
+ # copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
9
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
10
+ # persons to whom the Software is furnished to do so, subject to the fol-
11
+ # lowing conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included
14
+ # in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
18
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
19
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
+ # IN THE SOFTWARE.
23
+ #
24
+
25
+ from boto.regioninfo import RegionInfo
26
+
27
+ class SQSRegionInfo(RegionInfo):
28
+
29
+ def __init__(self, connection=None, name=None, endpoint=None):
30
+ from boto.sqs.connection import SQSConnection
31
+ RegionInfo.__init__(self, connection, name, endpoint,
32
+ SQSConnection)
@@ -0,0 +1,835 @@
1
+ # Copyright 2010 Google Inc.
2
+ # Copyright (c) 2011, Nexenta Systems Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a
5
+ # copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
8
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
9
+ # persons to whom the Software is furnished to do so, subject to the fol-
10
+ # lowing conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included
13
+ # in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
18
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
+ # IN THE SOFTWARE.
22
+
23
+ import boto
24
+ import os
25
+ import sys
26
+ import textwrap
27
+ from boto.s3.deletemarker import DeleteMarker
28
+ from boto.exception import BotoClientError
29
+ from boto.exception import InvalidUriError
30
+
31
+
32
+ class StorageUri(object):
33
+ """
34
+ Base class for representing storage provider-independent bucket and
35
+ object name with a shorthand URI-like syntax.
36
+
37
+ This is an abstract class: the constructor cannot be called (throws an
38
+ exception if you try).
39
+ """
40
+
41
+ connection = None
42
+ # Optional args that can be set from one of the concrete subclass
43
+ # constructors, to change connection behavior (e.g., to override
44
+ # https_connection_factory).
45
+ connection_args = None
46
+
47
+ # Map of provider scheme ('s3' or 'gs') to AWSAuthConnection object. We
48
+ # maintain a pool here in addition to the connection pool implemented
49
+ # in AWSAuthConnection because the latter re-creates its connection pool
50
+ # every time that class is instantiated (so the current pool is used to
51
+ # avoid re-instantiating AWSAuthConnection).
52
+ provider_pool = {}
53
+
54
+ def __init__(self):
55
+ """Uncallable constructor on abstract base StorageUri class.
56
+ """
57
+ raise BotoClientError('Attempt to instantiate abstract StorageUri '
58
+ 'class')
59
+
60
+ def __repr__(self):
61
+ """Returns string representation of URI."""
62
+ return self.uri
63
+
64
+ def equals(self, uri):
65
+ """Returns true if two URIs are equal."""
66
+ return self.uri == uri.uri
67
+
68
+ def check_response(self, resp, level, uri):
69
+ if resp is None:
70
+ raise InvalidUriError('\n'.join(textwrap.wrap(
71
+ 'Attempt to get %s for "%s" failed. This can happen if '
72
+ 'the URI refers to a non-existent object or if you meant to '
73
+ 'operate on a directory (e.g., leaving off -R option on gsutil '
74
+ 'cp, mv, or ls of a bucket)' % (level, uri), 80)))
75
+
76
+ def _check_bucket_uri(self, function_name):
77
+ if issubclass(type(self), BucketStorageUri) and not self.bucket_name:
78
+ raise InvalidUriError(
79
+ '%s on bucket-less URI (%s)' % (function_name, self.uri))
80
+
81
+ def _check_object_uri(self, function_name):
82
+ if issubclass(type(self), BucketStorageUri) and not self.object_name:
83
+ raise InvalidUriError('%s on object-less URI (%s)' %
84
+ (function_name, self.uri))
85
+
86
+ def _warn_about_args(self, function_name, **args):
87
+ for arg in args:
88
+ if args[arg]:
89
+ sys.stderr.write(
90
+ 'Warning: %s ignores argument: %s=%s\n' %
91
+ (function_name, arg, str(args[arg])))
92
+
93
+ def connect(self, access_key_id=None, secret_access_key=None, **kwargs):
94
+ """
95
+ Opens a connection to appropriate provider, depending on provider
96
+ portion of URI. Requires Credentials defined in boto config file (see
97
+ boto/pyami/config.py).
98
+ @type storage_uri: StorageUri
99
+ @param storage_uri: StorageUri specifying a bucket or a bucket+object
100
+ @rtype: L{AWSAuthConnection<boto.gs.connection.AWSAuthConnection>}
101
+ @return: A connection to storage service provider of the given URI.
102
+ """
103
+ connection_args = dict(self.connection_args or ())
104
+ # Use OrdinaryCallingFormat instead of boto-default
105
+ # SubdomainCallingFormat because the latter changes the hostname
106
+ # that's checked during cert validation for HTTPS connections,
107
+ # which will fail cert validation (when cert validation is enabled).
108
+ # Note: the following import can't be moved up to the start of
109
+ # this file else it causes a config import failure when run from
110
+ # the resumable upload/download tests.
111
+ from boto.s3.connection import OrdinaryCallingFormat
112
+ connection_args['calling_format'] = OrdinaryCallingFormat()
113
+ if (hasattr(self, 'suppress_consec_slashes') and
114
+ 'suppress_consec_slashes' not in connection_args):
115
+ connection_args['suppress_consec_slashes'] = (
116
+ self.suppress_consec_slashes)
117
+ connection_args.update(kwargs)
118
+ if not self.connection:
119
+ if self.scheme in self.provider_pool:
120
+ self.connection = self.provider_pool[self.scheme]
121
+ elif self.scheme == 's3':
122
+ from boto.s3.connection import S3Connection
123
+ self.connection = S3Connection(access_key_id,
124
+ secret_access_key,
125
+ **connection_args)
126
+ self.provider_pool[self.scheme] = self.connection
127
+ elif self.scheme == 'gs':
128
+ from boto.gs.connection import GSConnection
129
+ self.connection = GSConnection(access_key_id,
130
+ secret_access_key,
131
+ **connection_args)
132
+ self.provider_pool[self.scheme] = self.connection
133
+ elif self.scheme == 'file':
134
+ from boto.file.connection import FileConnection
135
+ self.connection = FileConnection(self)
136
+ else:
137
+ raise InvalidUriError('Unrecognized scheme "%s"' %
138
+ self.scheme)
139
+ self.connection.debug = self.debug
140
+ return self.connection
141
+
142
+ def has_version(self):
143
+ return (issubclass(type(self), BucketStorageUri)
144
+ and ((self.version_id is not None)
145
+ or (self.generation is not None)))
146
+
147
+ def delete_key(self, validate=False, headers=None, version_id=None,
148
+ mfa_token=None):
149
+ self._check_object_uri('delete_key')
150
+ bucket = self.get_bucket(validate, headers)
151
+ return bucket.delete_key(self.object_name, headers, version_id,
152
+ mfa_token)
153
+
154
+ def list_bucket(self, prefix='', delimiter='', headers=None,
155
+ all_versions=False):
156
+ self._check_bucket_uri('list_bucket')
157
+ bucket = self.get_bucket(headers=headers)
158
+ if all_versions:
159
+ return (v for v in bucket.list_versions(
160
+ prefix=prefix, delimiter=delimiter, headers=headers)
161
+ if not isinstance(v, DeleteMarker))
162
+ else:
163
+ return bucket.list(prefix=prefix, delimiter=delimiter,
164
+ headers=headers)
165
+
166
+ def get_all_keys(self, validate=False, headers=None, prefix=None):
167
+ bucket = self.get_bucket(validate, headers)
168
+ return bucket.get_all_keys(headers)
169
+
170
+ def get_bucket(self, validate=False, headers=None):
171
+ self._check_bucket_uri('get_bucket')
172
+ conn = self.connect()
173
+ bucket = conn.get_bucket(self.bucket_name, validate, headers)
174
+ self.check_response(bucket, 'bucket', self.uri)
175
+ return bucket
176
+
177
+ def get_key(self, validate=False, headers=None, version_id=None):
178
+ self._check_object_uri('get_key')
179
+ bucket = self.get_bucket(validate, headers)
180
+ key = bucket.get_key(self.object_name, headers, version_id)
181
+ self.check_response(key, 'key', self.uri)
182
+ return key
183
+
184
+ def new_key(self, validate=False, headers=None):
185
+ self._check_object_uri('new_key')
186
+ bucket = self.get_bucket(validate, headers)
187
+ return bucket.new_key(self.object_name)
188
+
189
+ def get_contents_to_stream(self, fp, headers=None, version_id=None):
190
+ self._check_object_uri('get_key')
191
+ self._warn_about_args('get_key', validate=False)
192
+ key = self.get_key(None, headers)
193
+ self.check_response(key, 'key', self.uri)
194
+ return key.get_contents_to_file(fp, headers, version_id=version_id)
195
+
196
+ def get_contents_to_file(self, fp, headers=None, cb=None, num_cb=10,
197
+ torrent=False, version_id=None,
198
+ res_download_handler=None, response_headers=None):
199
+ self._check_object_uri('get_contents_to_file')
200
+ key = self.get_key(None, headers)
201
+ self.check_response(key, 'key', self.uri)
202
+ key.get_contents_to_file(fp, headers, cb, num_cb, torrent, version_id,
203
+ res_download_handler, response_headers)
204
+
205
+ def get_contents_as_string(self, validate=False, headers=None, cb=None,
206
+ num_cb=10, torrent=False, version_id=None):
207
+ self._check_object_uri('get_contents_as_string')
208
+ key = self.get_key(validate, headers)
209
+ self.check_response(key, 'key', self.uri)
210
+ return key.get_contents_as_string(headers, cb, num_cb, torrent,
211
+ version_id)
212
+
213
+ def acl_class(self):
214
+ conn = self.connect()
215
+ acl_class = conn.provider.acl_class
216
+ self.check_response(acl_class, 'acl_class', self.uri)
217
+ return acl_class
218
+
219
+ def canned_acls(self):
220
+ conn = self.connect()
221
+ canned_acls = conn.provider.canned_acls
222
+ self.check_response(canned_acls, 'canned_acls', self.uri)
223
+ return canned_acls
224
+
225
+
226
+ class BucketStorageUri(StorageUri):
227
+ """
228
+ StorageUri subclass that handles bucket storage providers.
229
+ Callers should instantiate this class by calling boto.storage_uri().
230
+ """
231
+
232
+ delim = '/'
233
+ capabilities = set([]) # A set of additional capabilities.
234
+
235
+ def __init__(self, scheme, bucket_name=None, object_name=None,
236
+ debug=0, connection_args=None, suppress_consec_slashes=True,
237
+ version_id=None, generation=None, is_latest=False):
238
+ """Instantiate a BucketStorageUri from scheme,bucket,object tuple.
239
+
240
+ @type scheme: string
241
+ @param scheme: URI scheme naming the storage provider (gs, s3, etc.)
242
+ @type bucket_name: string
243
+ @param bucket_name: bucket name
244
+ @type object_name: string
245
+ @param object_name: object name, excluding generation/version.
246
+ @type debug: int
247
+ @param debug: debug level to pass in to connection (range 0..2)
248
+ @type connection_args: map
249
+ @param connection_args: optional map containing args to be
250
+ passed to {S3,GS}Connection constructor (e.g., to override
251
+ https_connection_factory).
252
+ @param suppress_consec_slashes: If provided, controls whether
253
+ consecutive slashes will be suppressed in key paths.
254
+ @param version_id: Object version id (S3-specific).
255
+ @param generation: Object generation number (GCS-specific).
256
+ @param is_latest: boolean indicating that a versioned object is the
257
+ current version
258
+
259
+ After instantiation the components are available in the following
260
+ fields: scheme, bucket_name, object_name, version_id, generation,
261
+ is_latest, versionless_uri, version_specific_uri, uri.
262
+ Note: If instantiated without version info, the string representation
263
+ for a URI stays versionless; similarly, if instantiated with version
264
+ info, the string representation for a URI stays version-specific. If you
265
+ call one of the uri.set_contents_from_xyz() methods, a specific object
266
+ version will be created, and its version-specific URI string can be
267
+ retrieved from version_specific_uri even if the URI was instantiated
268
+ without version info.
269
+ """
270
+
271
+ self.scheme = scheme
272
+ self.bucket_name = bucket_name
273
+ self.object_name = object_name
274
+ self.debug = debug
275
+ if connection_args:
276
+ self.connection_args = connection_args
277
+ self.suppress_consec_slashes = suppress_consec_slashes
278
+ self.version_id = version_id
279
+ self.generation = generation and int(generation)
280
+ self.is_latest = is_latest
281
+ self.is_version_specific = bool(self.generation) or bool(version_id)
282
+ self._build_uri_strings()
283
+
284
+ def _build_uri_strings(self):
285
+ if self.bucket_name and self.object_name:
286
+ self.versionless_uri = '%s://%s/%s' % (self.scheme, self.bucket_name,
287
+ self.object_name)
288
+ if self.generation:
289
+ self.version_specific_uri = '%s#%s' % (self.versionless_uri,
290
+ self.generation)
291
+ elif self.version_id:
292
+ self.version_specific_uri = '%s#%s' % (
293
+ self.versionless_uri, self.version_id)
294
+ if self.is_version_specific:
295
+ self.uri = self.version_specific_uri
296
+ else:
297
+ self.uri = self.versionless_uri
298
+ elif self.bucket_name:
299
+ self.uri = ('%s://%s/' % (self.scheme, self.bucket_name))
300
+ else:
301
+ self.uri = ('%s://' % self.scheme)
302
+
303
+ def _update_from_key(self, key):
304
+ self._update_from_values(
305
+ getattr(key, 'version_id', None),
306
+ getattr(key, 'generation', None),
307
+ getattr(key, 'is_latest', None))
308
+
309
+ def _update_from_values(self, version_id, generation, is_latest):
310
+ self.version_id = version_id
311
+ self.generation = generation
312
+ self.is_latest = is_latest
313
+ self._build_uri_strings()
314
+
315
+ def get_key(self, validate=False, headers=None, version_id=None):
316
+ self._check_object_uri('get_key')
317
+ bucket = self.get_bucket(validate, headers)
318
+ if self.get_provider().name == 'aws':
319
+ key = bucket.get_key(self.object_name, headers,
320
+ version_id=(version_id or self.version_id))
321
+ elif self.get_provider().name == 'google':
322
+ key = bucket.get_key(self.object_name, headers,
323
+ generation=self.generation)
324
+ self.check_response(key, 'key', self.uri)
325
+ return key
326
+
327
+ def delete_key(self, validate=False, headers=None, version_id=None,
328
+ mfa_token=None):
329
+ self._check_object_uri('delete_key')
330
+ bucket = self.get_bucket(validate, headers)
331
+ if self.get_provider().name == 'aws':
332
+ version_id = version_id or self.version_id
333
+ return bucket.delete_key(self.object_name, headers, version_id,
334
+ mfa_token)
335
+ elif self.get_provider().name == 'google':
336
+ return bucket.delete_key(self.object_name, headers,
337
+ generation=self.generation)
338
+
339
+ def clone_replace_name(self, new_name):
340
+ """Instantiate a BucketStorageUri from the current BucketStorageUri,
341
+ but replacing the object_name.
342
+
343
+ @type new_name: string
344
+ @param new_name: new object name
345
+ """
346
+ self._check_bucket_uri('clone_replace_name')
347
+ return BucketStorageUri(
348
+ self.scheme, bucket_name=self.bucket_name, object_name=new_name,
349
+ debug=self.debug,
350
+ suppress_consec_slashes=self.suppress_consec_slashes)
351
+
352
+ def clone_replace_key(self, key):
353
+ """Instantiate a BucketStorageUri from the current BucketStorageUri, by
354
+ replacing the object name with the object name and other metadata found
355
+ in the given Key object (including generation).
356
+
357
+ @type key: Key
358
+ @param key: key for the new StorageUri to represent
359
+ """
360
+ self._check_bucket_uri('clone_replace_key')
361
+ version_id = None
362
+ generation = None
363
+ is_latest = False
364
+ if hasattr(key, 'version_id'):
365
+ version_id = key.version_id
366
+ if hasattr(key, 'generation'):
367
+ generation = key.generation
368
+ if hasattr(key, 'is_latest'):
369
+ is_latest = key.is_latest
370
+
371
+ return BucketStorageUri(
372
+ key.provider.get_provider_name(),
373
+ bucket_name=key.bucket.name,
374
+ object_name=key.name,
375
+ debug=self.debug,
376
+ suppress_consec_slashes=self.suppress_consec_slashes,
377
+ version_id=version_id,
378
+ generation=generation,
379
+ is_latest=is_latest)
380
+
381
+ def get_acl(self, validate=False, headers=None, version_id=None):
382
+ """returns a bucket's acl"""
383
+ self._check_bucket_uri('get_acl')
384
+ bucket = self.get_bucket(validate, headers)
385
+ # This works for both bucket- and object- level ACLs (former passes
386
+ # key_name=None):
387
+ key_name = self.object_name or ''
388
+ if self.get_provider().name == 'aws':
389
+ version_id = version_id or self.version_id
390
+ acl = bucket.get_acl(key_name, headers, version_id)
391
+ else:
392
+ acl = bucket.get_acl(key_name, headers, generation=self.generation)
393
+ self.check_response(acl, 'acl', self.uri)
394
+ return acl
395
+
396
+ def get_def_acl(self, validate=False, headers=None):
397
+ """returns a bucket's default object acl"""
398
+ self._check_bucket_uri('get_def_acl')
399
+ bucket = self.get_bucket(validate, headers)
400
+ acl = bucket.get_def_acl(headers)
401
+ self.check_response(acl, 'acl', self.uri)
402
+ return acl
403
+
404
+ def get_cors(self, validate=False, headers=None):
405
+ """returns a bucket's CORS XML"""
406
+ self._check_bucket_uri('get_cors')
407
+ bucket = self.get_bucket(validate, headers)
408
+ cors = bucket.get_cors(headers)
409
+ self.check_response(cors, 'cors', self.uri)
410
+ return cors
411
+
412
+ def set_cors(self, cors, validate=False, headers=None):
413
+ """sets or updates a bucket's CORS XML"""
414
+ self._check_bucket_uri('set_cors ')
415
+ bucket = self.get_bucket(validate, headers)
416
+ bucket.set_cors(cors.to_xml(), headers)
417
+
418
+ def get_location(self, validate=False, headers=None):
419
+ self._check_bucket_uri('get_location')
420
+ bucket = self.get_bucket(validate, headers)
421
+ return bucket.get_location()
422
+
423
+ def get_storage_class(self, validate=False, headers=None):
424
+ self._check_bucket_uri('get_storage_class')
425
+ # StorageClass is defined as a bucket param for GCS, but as a key
426
+ # param for S3.
427
+ if self.scheme != 'gs':
428
+ raise ValueError('get_storage_class() not supported for %s '
429
+ 'URIs.' % self.scheme)
430
+ bucket = self.get_bucket(validate, headers)
431
+ return bucket.get_storage_class()
432
+
433
+ def get_subresource(self, subresource, validate=False, headers=None,
434
+ version_id=None):
435
+ self._check_bucket_uri('get_subresource')
436
+ bucket = self.get_bucket(validate, headers)
437
+ return bucket.get_subresource(subresource, self.object_name, headers,
438
+ version_id)
439
+
440
+ def add_group_email_grant(self, permission, email_address, recursive=False,
441
+ validate=False, headers=None):
442
+ self._check_bucket_uri('add_group_email_grant')
443
+ if self.scheme != 'gs':
444
+ raise ValueError('add_group_email_grant() not supported for %s '
445
+ 'URIs.' % self.scheme)
446
+ if self.object_name:
447
+ if recursive:
448
+ raise ValueError('add_group_email_grant() on key-ful URI cannot '
449
+ 'specify recursive=True')
450
+ key = self.get_key(validate, headers)
451
+ self.check_response(key, 'key', self.uri)
452
+ key.add_group_email_grant(permission, email_address, headers)
453
+ elif self.bucket_name:
454
+ bucket = self.get_bucket(validate, headers)
455
+ bucket.add_group_email_grant(permission, email_address, recursive,
456
+ headers)
457
+ else:
458
+ raise InvalidUriError('add_group_email_grant() on bucket-less URI '
459
+ '%s' % self.uri)
460
+
461
+ def add_email_grant(self, permission, email_address, recursive=False,
462
+ validate=False, headers=None):
463
+ self._check_bucket_uri('add_email_grant')
464
+ if not self.object_name:
465
+ bucket = self.get_bucket(validate, headers)
466
+ bucket.add_email_grant(permission, email_address, recursive,
467
+ headers)
468
+ else:
469
+ key = self.get_key(validate, headers)
470
+ self.check_response(key, 'key', self.uri)
471
+ key.add_email_grant(permission, email_address)
472
+
473
+ def add_user_grant(self, permission, user_id, recursive=False,
474
+ validate=False, headers=None):
475
+ self._check_bucket_uri('add_user_grant')
476
+ if not self.object_name:
477
+ bucket = self.get_bucket(validate, headers)
478
+ bucket.add_user_grant(permission, user_id, recursive, headers)
479
+ else:
480
+ key = self.get_key(validate, headers)
481
+ self.check_response(key, 'key', self.uri)
482
+ key.add_user_grant(permission, user_id)
483
+
484
+ def list_grants(self, headers=None):
485
+ self._check_bucket_uri('list_grants ')
486
+ bucket = self.get_bucket(headers)
487
+ return bucket.list_grants(headers)
488
+
489
+ def is_file_uri(self):
490
+ """Returns True if this URI names a file or directory."""
491
+ return False
492
+
493
+ def is_cloud_uri(self):
494
+ """Returns True if this URI names a bucket or object."""
495
+ return True
496
+
497
+ def names_container(self):
498
+ """
499
+ Returns True if this URI names a directory or bucket. Will return
500
+ False for bucket subdirs; providing bucket subdir semantics needs to
501
+ be done by the caller (like gsutil does).
502
+ """
503
+ return bool(not self.object_name)
504
+
505
+ def names_singleton(self):
506
+ """Returns True if this URI names a file or object."""
507
+ return bool(self.object_name)
508
+
509
+ def names_directory(self):
510
+ """Returns True if this URI names a directory."""
511
+ return False
512
+
513
+ def names_provider(self):
514
+ """Returns True if this URI names a provider."""
515
+ return bool(not self.bucket_name)
516
+
517
+ def names_bucket(self):
518
+ """Returns True if this URI names a bucket."""
519
+ return bool(self.bucket_name) and bool(not self.object_name)
520
+
521
+ def names_file(self):
522
+ """Returns True if this URI names a file."""
523
+ return False
524
+
525
+ def names_object(self):
526
+ """Returns True if this URI names an object."""
527
+ return self.names_singleton()
528
+
529
+ def is_stream(self):
530
+ """Returns True if this URI represents input/output stream."""
531
+ return False
532
+
533
+ def create_bucket(self, headers=None, location='', policy=None,
534
+ storage_class=None):
535
+ self._check_bucket_uri('create_bucket ')
536
+ conn = self.connect()
537
+ # Pass storage_class param only if this is a GCS bucket. (In S3 the
538
+ # storage class is specified on the key object.)
539
+ if self.scheme == 'gs':
540
+ return conn.create_bucket(self.bucket_name, headers, location, policy,
541
+ storage_class)
542
+ else:
543
+ return conn.create_bucket(self.bucket_name, headers, location, policy)
544
+
545
+ def delete_bucket(self, headers=None):
546
+ self._check_bucket_uri('delete_bucket')
547
+ conn = self.connect()
548
+ return conn.delete_bucket(self.bucket_name, headers)
549
+
550
+ def get_all_buckets(self, headers=None):
551
+ conn = self.connect()
552
+ return conn.get_all_buckets(headers)
553
+
554
+ def get_provider(self):
555
+ conn = self.connect()
556
+ provider = conn.provider
557
+ self.check_response(provider, 'provider', self.uri)
558
+ return provider
559
+
560
+ def set_acl(self, acl_or_str, key_name='', validate=False, headers=None,
561
+ version_id=None, if_generation=None, if_metageneration=None):
562
+ """Sets or updates a bucket's ACL."""
563
+ self._check_bucket_uri('set_acl')
564
+ key_name = key_name or self.object_name or ''
565
+ bucket = self.get_bucket(validate, headers)
566
+ if self.generation:
567
+ bucket.set_acl(
568
+ acl_or_str, key_name, headers, generation=self.generation,
569
+ if_generation=if_generation, if_metageneration=if_metageneration)
570
+ else:
571
+ version_id = version_id or self.version_id
572
+ bucket.set_acl(acl_or_str, key_name, headers, version_id)
573
+
574
+ def set_xml_acl(self, xmlstring, key_name='', validate=False, headers=None,
575
+ version_id=None, if_generation=None, if_metageneration=None):
576
+ """Sets or updates a bucket's ACL with an XML string."""
577
+ self._check_bucket_uri('set_xml_acl')
578
+ key_name = key_name or self.object_name or ''
579
+ bucket = self.get_bucket(validate, headers)
580
+ if self.generation:
581
+ bucket.set_xml_acl(
582
+ xmlstring, key_name, headers, generation=self.generation,
583
+ if_generation=if_generation, if_metageneration=if_metageneration)
584
+ else:
585
+ version_id = version_id or self.version_id
586
+ bucket.set_xml_acl(xmlstring, key_name, headers,
587
+ version_id=version_id)
588
+
589
+ def set_def_xml_acl(self, xmlstring, validate=False, headers=None):
590
+ """Sets or updates a bucket's default object ACL with an XML string."""
591
+ self._check_bucket_uri('set_def_xml_acl')
592
+ self.get_bucket(validate, headers).set_def_xml_acl(xmlstring, headers)
593
+
594
+ def set_def_acl(self, acl_or_str, validate=False, headers=None,
595
+ version_id=None):
596
+ """Sets or updates a bucket's default object ACL."""
597
+ self._check_bucket_uri('set_def_acl')
598
+ self.get_bucket(validate, headers).set_def_acl(acl_or_str, headers)
599
+
600
+ def set_canned_acl(self, acl_str, validate=False, headers=None,
601
+ version_id=None):
602
+ """Sets or updates a bucket's acl to a predefined (canned) value."""
603
+ self._check_object_uri('set_canned_acl')
604
+ self._warn_about_args('set_canned_acl', version_id=version_id)
605
+ key = self.get_key(validate, headers)
606
+ self.check_response(key, 'key', self.uri)
607
+ key.set_canned_acl(acl_str, headers)
608
+
609
+ def set_def_canned_acl(self, acl_str, validate=False, headers=None,
610
+ version_id=None):
611
+ """Sets or updates a bucket's default object acl to a predefined
612
+ (canned) value."""
613
+ self._check_bucket_uri('set_def_canned_acl ')
614
+ key = self.get_key(validate, headers)
615
+ self.check_response(key, 'key', self.uri)
616
+ key.set_def_canned_acl(acl_str, headers, version_id)
617
+
618
+ def set_subresource(self, subresource, value, validate=False, headers=None,
619
+ version_id=None):
620
+ self._check_bucket_uri('set_subresource')
621
+ bucket = self.get_bucket(validate, headers)
622
+ bucket.set_subresource(subresource, value, self.object_name, headers,
623
+ version_id)
624
+
625
+ def set_contents_from_string(self, s, headers=None, replace=True,
626
+ cb=None, num_cb=10, policy=None, md5=None,
627
+ reduced_redundancy=False):
628
+ self._check_object_uri('set_contents_from_string')
629
+ key = self.new_key(headers=headers)
630
+ if self.scheme == 'gs':
631
+ if reduced_redundancy:
632
+ sys.stderr.write('Warning: GCS does not support '
633
+ 'reduced_redundancy; argument ignored by '
634
+ 'set_contents_from_string')
635
+ result = key.set_contents_from_string(
636
+ s, headers, replace, cb, num_cb, policy, md5)
637
+ else:
638
+ result = key.set_contents_from_string(
639
+ s, headers, replace, cb, num_cb, policy, md5,
640
+ reduced_redundancy)
641
+ self._update_from_key(key)
642
+ return result
643
+
644
+ def set_contents_from_file(self, fp, headers=None, replace=True, cb=None,
645
+ num_cb=10, policy=None, md5=None, size=None,
646
+ rewind=False, res_upload_handler=None):
647
+ self._check_object_uri('set_contents_from_file')
648
+ key = self.new_key(headers=headers)
649
+ if self.scheme == 'gs':
650
+ result = key.set_contents_from_file(
651
+ fp, headers, replace, cb, num_cb, policy, md5, size=size,
652
+ rewind=rewind, res_upload_handler=res_upload_handler)
653
+ if res_upload_handler:
654
+ self._update_from_values(None, res_upload_handler.generation,
655
+ None)
656
+ else:
657
+ self._warn_about_args('set_contents_from_file',
658
+ res_upload_handler=res_upload_handler)
659
+ result = key.set_contents_from_file(
660
+ fp, headers, replace, cb, num_cb, policy, md5, size=size,
661
+ rewind=rewind)
662
+ self._update_from_key(key)
663
+ return result
664
+
665
+ def set_contents_from_stream(self, fp, headers=None, replace=True, cb=None,
666
+ policy=None, reduced_redundancy=False):
667
+ self._check_object_uri('set_contents_from_stream')
668
+ dst_key = self.new_key(False, headers)
669
+ result = dst_key.set_contents_from_stream(
670
+ fp, headers, replace, cb, policy=policy,
671
+ reduced_redundancy=reduced_redundancy)
672
+ self._update_from_key(dst_key)
673
+ return result
674
+
675
+ def copy_key(self, src_bucket_name, src_key_name, metadata=None,
676
+ src_version_id=None, storage_class='STANDARD',
677
+ preserve_acl=False, encrypt_key=False, headers=None,
678
+ query_args=None, src_generation=None):
679
+ """Returns newly created key."""
680
+ self._check_object_uri('copy_key')
681
+ dst_bucket = self.get_bucket(validate=False, headers=headers)
682
+ if src_generation:
683
+ return dst_bucket.copy_key(new_key_name=self.object_name,
684
+ src_bucket_name=src_bucket_name,
685
+ src_key_name=src_key_name, metadata=metadata,
686
+ storage_class=storage_class, preserve_acl=preserve_acl,
687
+ encrypt_key=encrypt_key, headers=headers, query_args=query_args,
688
+ src_generation=src_generation)
689
+ else:
690
+ return dst_bucket.copy_key(new_key_name=self.object_name,
691
+ src_bucket_name=src_bucket_name, src_key_name=src_key_name,
692
+ metadata=metadata, src_version_id=src_version_id,
693
+ storage_class=storage_class, preserve_acl=preserve_acl,
694
+ encrypt_key=encrypt_key, headers=headers, query_args=query_args)
695
+
696
+ def enable_logging(self, target_bucket, target_prefix=None, validate=False,
697
+ headers=None, version_id=None):
698
+ self._check_bucket_uri('enable_logging')
699
+ bucket = self.get_bucket(validate, headers)
700
+ bucket.enable_logging(target_bucket, target_prefix, headers=headers)
701
+
702
+ def disable_logging(self, validate=False, headers=None, version_id=None):
703
+ self._check_bucket_uri('disable_logging')
704
+ bucket = self.get_bucket(validate, headers)
705
+ bucket.disable_logging(headers=headers)
706
+
707
+ def set_website_config(self, main_page_suffix=None, error_key=None,
708
+ validate=False, headers=None):
709
+ bucket = self.get_bucket(validate, headers)
710
+ if not (main_page_suffix or error_key):
711
+ bucket.delete_website_configuration(headers)
712
+ else:
713
+ bucket.configure_website(main_page_suffix, error_key, headers)
714
+
715
+ def get_website_config(self, validate=False, headers=None):
716
+ bucket = self.get_bucket(validate, headers)
717
+ return bucket.get_website_configuration_with_xml(headers)
718
+
719
+ def get_versioning_config(self, headers=None):
720
+ bucket = self.get_bucket(False, headers)
721
+ return bucket.get_versioning_status(headers)
722
+
723
+ def configure_versioning(self, enabled, headers=None):
724
+ self._check_bucket_uri('configure_versioning')
725
+ bucket = self.get_bucket(False, headers)
726
+ return bucket.configure_versioning(enabled, headers)
727
+
728
+ def set_metadata(self, metadata_plus, metadata_minus, preserve_acl,
729
+ headers=None):
730
+ return self.get_key(False).set_remote_metadata(metadata_plus,
731
+ metadata_minus,
732
+ preserve_acl,
733
+ headers=headers)
734
+
735
+ def exists(self, headers=None):
736
+ """Returns True if the object exists or False if it doesn't"""
737
+ if not self.object_name:
738
+ raise InvalidUriError('exists on object-less URI (%s)' % self.uri)
739
+ bucket = self.get_bucket()
740
+ key = bucket.get_key(self.object_name, headers=headers)
741
+ return bool(key)
742
+
743
+ class FileStorageUri(StorageUri):
744
+ """
745
+ StorageUri subclass that handles files in the local file system.
746
+ Callers should instantiate this class by calling boto.storage_uri().
747
+
748
+ See file/README about how we map StorageUri operations onto a file system.
749
+ """
750
+
751
+ delim = os.sep
752
+
753
+ def __init__(self, object_name, debug, is_stream=False):
754
+ """Instantiate a FileStorageUri from a path name.
755
+
756
+ @type object_name: string
757
+ @param object_name: object name
758
+ @type debug: boolean
759
+ @param debug: whether to enable debugging on this StorageUri
760
+
761
+ After instantiation the components are available in the following
762
+ fields: uri, scheme, bucket_name (always blank for this "anonymous"
763
+ bucket), object_name.
764
+ """
765
+
766
+ self.scheme = 'file'
767
+ self.bucket_name = ''
768
+ self.object_name = object_name
769
+ self.uri = 'file://' + object_name
770
+ self.debug = debug
771
+ self.stream = is_stream
772
+
773
+ def clone_replace_name(self, new_name):
774
+ """Instantiate a FileStorageUri from the current FileStorageUri,
775
+ but replacing the object_name.
776
+
777
+ @type new_name: string
778
+ @param new_name: new object name
779
+ """
780
+ return FileStorageUri(new_name, self.debug, self.stream)
781
+
782
+ def is_file_uri(self):
783
+ """Returns True if this URI names a file or directory."""
784
+ return True
785
+
786
+ def is_cloud_uri(self):
787
+ """Returns True if this URI names a bucket or object."""
788
+ return False
789
+
790
+ def names_container(self):
791
+ """Returns True if this URI names a directory or bucket."""
792
+ return self.names_directory()
793
+
794
+ def names_singleton(self):
795
+ """Returns True if this URI names a file (or stream) or object."""
796
+ return not self.names_container()
797
+
798
+ def names_directory(self):
799
+ """Returns True if this URI names a directory."""
800
+ if self.stream:
801
+ return False
802
+ return os.path.isdir(self.object_name)
803
+
804
+ def names_provider(self):
805
+ """Returns True if this URI names a provider."""
806
+ return False
807
+
808
+ def names_bucket(self):
809
+ """Returns True if this URI names a bucket."""
810
+ return False
811
+
812
+ def names_file(self):
813
+ """Returns True if this URI names a file."""
814
+ return self.names_singleton()
815
+
816
+ def names_object(self):
817
+ """Returns True if this URI names an object."""
818
+ return False
819
+
820
+ def is_stream(self):
821
+ """Returns True if this URI represents input/output stream.
822
+ """
823
+ return bool(self.stream)
824
+
825
+ def close(self):
826
+ """Closes the underlying file.
827
+ """
828
+ self.get_key().close()
829
+
830
+ def exists(self, _headers_not_used=None):
831
+ """Returns True if the file exists or False if it doesn't"""
832
+ # The _headers_not_used parameter is ignored. It is only there to ensure
833
+ # that this method's signature is identical to the exists method on the
834
+ # BucketStorageUri class.
835
+ return os.path.exists(self.object_name)