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,71 @@
1
+ from boto import handler
2
+ import xml.sax
3
+
4
+
5
+ class Tag(object):
6
+ def __init__(self, key=None, value=None):
7
+ self.key = key
8
+ self.value = value
9
+
10
+ def startElement(self, name, attrs, connection):
11
+ return None
12
+
13
+ def endElement(self, name, value, connection):
14
+ if name == 'Key':
15
+ self.key = value
16
+ elif name == 'Value':
17
+ self.value = value
18
+
19
+ def to_xml(self):
20
+ return '<Tag><Key>%s</Key><Value>%s</Value></Tag>' % (
21
+ self.key, self.value)
22
+
23
+ def __eq__(self, other):
24
+ return (self.key == other.key and self.value == other.value)
25
+
26
+
27
+ class TagSet(list):
28
+ def startElement(self, name, attrs, connection):
29
+ if name == 'Tag':
30
+ tag = Tag()
31
+ self.append(tag)
32
+ return tag
33
+ return None
34
+
35
+ def endElement(self, name, value, connection):
36
+ setattr(self, name, value)
37
+
38
+ def add_tag(self, key, value):
39
+ tag = Tag(key, value)
40
+ self.append(tag)
41
+
42
+ def to_xml(self):
43
+ xml = '<TagSet>'
44
+ for tag in self:
45
+ xml += tag.to_xml()
46
+ xml += '</TagSet>'
47
+ return xml
48
+
49
+
50
+ class Tags(list):
51
+ """A container for the tags associated with a bucket."""
52
+
53
+ def startElement(self, name, attrs, connection):
54
+ if name == 'TagSet':
55
+ tag_set = TagSet()
56
+ self.append(tag_set)
57
+ return tag_set
58
+ return None
59
+
60
+ def endElement(self, name, value, connection):
61
+ setattr(self, name, value)
62
+
63
+ def to_xml(self):
64
+ xml = '<Tagging>'
65
+ for tag_set in self:
66
+ xml += tag_set.to_xml()
67
+ xml +='</Tagging>'
68
+ return xml
69
+
70
+ def add_tag_set(self, tag_set):
71
+ self.append(tag_set)
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
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
+ class User:
23
+ def __init__(self, parent=None, id='', display_name=''):
24
+ if parent:
25
+ parent.owner = self
26
+ self.type = None
27
+ self.id = id
28
+ self.display_name = display_name
29
+
30
+ def startElement(self, name, attrs, connection):
31
+ return None
32
+
33
+ def endElement(self, name, value, connection):
34
+ if name == 'DisplayName':
35
+ self.display_name = value
36
+ elif name == 'ID':
37
+ self.id = value
38
+ else:
39
+ setattr(self, name, value)
40
+
41
+ def to_xml(self, element_name='Owner'):
42
+ if self.type:
43
+ s = '<%s xsi:type="%s">' % (element_name, self.type)
44
+ else:
45
+ s = '<%s>' % element_name
46
+ s += '<ID>%s</ID>' % self.id
47
+ s += '<DisplayName>%s</DisplayName>' % self.display_name
48
+ s += '</%s>' % element_name
49
+ return s
@@ -0,0 +1,237 @@
1
+ # Copyright (c) 2013 Amazon.com, Inc. or its affiliates. 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
+
23
+ def tag(key, value):
24
+ start = '<%s>' % key
25
+ end = '</%s>' % key
26
+ return '%s%s%s' % (start, value, end)
27
+
28
+
29
+ class WebsiteConfiguration(object):
30
+ """
31
+ Website configuration for a bucket.
32
+
33
+ :ivar suffix: Suffix that is appended to a request that is for a
34
+ "directory" on the website endpoint (e.g. if the suffix is
35
+ index.html and you make a request to samplebucket/images/
36
+ the data that is returned will be for the object with the
37
+ key name images/index.html). The suffix must not be empty
38
+ and must not include a slash character.
39
+
40
+ :ivar error_key: The object key name to use when a 4xx class error
41
+ occurs. This key identifies the page that is returned when
42
+ such an error occurs.
43
+
44
+ :ivar redirect_all_requests_to: Describes the redirect behavior for every
45
+ request to this bucket's website endpoint. If this value is non None,
46
+ no other values are considered when configuring the website
47
+ configuration for the bucket. This is an instance of
48
+ ``RedirectLocation``.
49
+
50
+ :ivar routing_rules: ``RoutingRules`` object which specifies conditions
51
+ and redirects that apply when the conditions are met.
52
+
53
+ """
54
+ WEBSITE_SKELETON = """<?xml version="1.0" encoding="UTF-8"?>
55
+ <WebsiteConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
56
+ %(body)s
57
+ </WebsiteConfiguration>"""
58
+
59
+
60
+ def __init__(self, suffix=None, error_key=None,
61
+ redirect_all_requests_to=None, routing_rules=None):
62
+ self.suffix = suffix
63
+ self.error_key = error_key
64
+ self.redirect_all_requests_to = redirect_all_requests_to
65
+ self.routing_rules = routing_rules
66
+
67
+ def to_xml(self):
68
+ body_parts = []
69
+ if self.suffix is not None:
70
+ body_parts.append(tag('IndexDocument', tag('Suffix', self.suffix)))
71
+ if self.error_key is not None:
72
+ body_parts.append(tag('ErrorDocument', tag('Key', self.error_key)))
73
+ if self.redirect_all_requests_to is not None:
74
+ body_parts.append(self.redirect_all_requests_to.to_xml())
75
+ if self.routing_rules is not None:
76
+ body_parts.append(self.routing_rules.to_xml())
77
+ body = '\n'.join(body_parts)
78
+ return self.WEBSITE_SKELETON % {'body': body}
79
+
80
+
81
+ class RedirectLocation(object):
82
+ """Specify redirect behavior for every request to a bucket's endpoint.
83
+
84
+ :ivar hostname: Name of the host where requests will be redirected.
85
+
86
+ :ivar protocol: Protocol to use (http, https) when redirecting requests.
87
+ The default is the protocol that is used in the original request.
88
+
89
+ """
90
+
91
+ def __init__(self, hostname, protocol=None):
92
+ self.hostname = hostname
93
+ self.protocol = protocol
94
+
95
+ def to_xml(self):
96
+ inner_text = []
97
+ if self.hostname is not None:
98
+ inner_text.append(tag('HostName', self.hostname))
99
+ if self.protocol is not None:
100
+ inner_text.append(tag('Protocol', self.protocol))
101
+ return tag('RedirectAllRequestsTo', '\n'.join(inner_text))
102
+
103
+
104
+ class RoutingRules(object):
105
+ def __init__(self):
106
+ self._rules = []
107
+
108
+ def add_rule(self, rule):
109
+ """
110
+
111
+ :type rule: :class:`boto.s3.website.RoutingRule`
112
+ :param rule: A routing rule.
113
+
114
+ :return: This ``RoutingRules`` object is returned,
115
+ so that it can chain subsequent calls.
116
+
117
+ """
118
+ self._rules.append(rule)
119
+ return self
120
+
121
+ def to_xml(self):
122
+ inner_text = []
123
+ for rule in self._rules:
124
+ inner_text.append(rule.to_xml())
125
+ return tag('RoutingRules', '\n'.join(inner_text))
126
+
127
+
128
+ class RoutingRule(object):
129
+ """Represents a single routing rule.
130
+
131
+ There are convenience methods to making creating rules
132
+ more concise::
133
+
134
+ rule = RoutingRule.when(key_prefix='foo/').then_redirect('example.com')
135
+
136
+ :ivar condition: Describes condition that must be met for the
137
+ specified redirect to apply.
138
+
139
+ :ivar redirect: Specifies redirect behavior. You can redirect requests to
140
+ another host, to another page, or with another protocol. In the event
141
+ of an error, you can can specify a different error code to return.
142
+
143
+ """
144
+ def __init__(self, condition, redirect):
145
+ self.condition = condition
146
+ self.redirect = redirect
147
+
148
+ def to_xml(self):
149
+ return tag('RoutingRule',
150
+ self.condition.to_xml() + self.redirect.to_xml())
151
+
152
+ @classmethod
153
+ def when(cls, key_prefix=None, http_error_code=None):
154
+ return cls(Condition(key_prefix=key_prefix,
155
+ http_error_code=http_error_code), None)
156
+
157
+ def then_redirect(self, hostname=None, protocol=None, replace_key=None,
158
+ replace_key_prefix=None, http_redirect_code=None):
159
+ self.redirect = Redirect(
160
+ hostname=hostname, protocol=protocol,
161
+ replace_key=replace_key,
162
+ replace_key_prefix=replace_key_prefix,
163
+ http_redirect_code=http_redirect_code)
164
+ return self
165
+
166
+
167
+ class Condition(object):
168
+ """
169
+
170
+ :ivar key_prefix: The object key name prefix when the redirect is applied.
171
+ For example, to redirect requests for ExamplePage.html, the key prefix
172
+ will be ExamplePage.html. To redirect request for all pages with the
173
+ prefix docs/, the key prefix will be /docs, which identifies all
174
+ objects in the docs/ folder.
175
+
176
+ :ivar http_error_code: The HTTP error code when the redirect is applied. In
177
+ the event of an error, if the error code equals this value, then the
178
+ specified redirect is applied.
179
+
180
+ """
181
+ def __init__(self, key_prefix=None, http_error_code=None):
182
+ self.key_prefix = key_prefix
183
+ self.http_error_code = http_error_code
184
+
185
+ def to_xml(self):
186
+ inner_text = []
187
+ if self.key_prefix is not None:
188
+ inner_text.append(tag('KeyPrefixEquals', self.key_prefix))
189
+ if self.http_error_code is not None:
190
+ inner_text.append(
191
+ tag('HttpErrorCodeReturnedEquals',
192
+ self.http_error_code))
193
+ return tag('Condition', '\n'.join(inner_text))
194
+
195
+
196
+ class Redirect(object):
197
+ """
198
+
199
+ :ivar hostname: The host name to use in the redirect request.
200
+
201
+ :ivar protocol: The protocol to use in the redirect request. Can be either
202
+ 'http' or 'https'.
203
+
204
+ :ivar replace_key: The specific object key to use in the redirect request.
205
+ For example, redirect request to error.html.
206
+
207
+ :ivar replace_key_prefix: The object key prefix to use in the redirect
208
+ request. For example, to redirect requests for all pages with prefix
209
+ docs/ (objects in the docs/ folder) to documents/, you can set a
210
+ condition block with KeyPrefixEquals set to docs/ and in the Redirect
211
+ set ReplaceKeyPrefixWith to /documents.
212
+
213
+ :ivar http_redirect_code: The HTTP redirect code to use on the response.
214
+
215
+ """
216
+ def __init__(self, hostname=None, protocol=None, replace_key=None,
217
+ replace_key_prefix=None, http_redirect_code=None):
218
+ self.hostname = hostname
219
+ self.protocol = protocol
220
+ self.replace_key = replace_key
221
+ self.replace_key_prefix = replace_key_prefix
222
+ self.http_redirect_code = http_redirect_code
223
+
224
+ def to_xml(self):
225
+ inner_text = []
226
+ if self.hostname is not None:
227
+ inner_text.append(tag('HostName', self.hostname))
228
+ if self.protocol is not None:
229
+ inner_text.append(tag('Protocol', self.protocol))
230
+ if self.replace_key is not None:
231
+ inner_text.append(tag('ReplaceKeyWith', self.replace_key))
232
+ if self.replace_key_prefix is not None:
233
+ inner_text.append(tag('ReplaceKeyPrefixWith',
234
+ self.replace_key_prefix))
235
+ if self.http_redirect_code is not None:
236
+ inner_text.append(tag('HttpRedirectCode', self.http_redirect_code))
237
+ return tag('Redirect', '\n'.join(inner_text))
@@ -0,0 +1,67 @@
1
+ # Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
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
+
23
+ from .regioninfo import SDBRegionInfo
24
+
25
+
26
+ def regions():
27
+ """
28
+ Get all available regions for the SDB service.
29
+
30
+ :rtype: list
31
+ :return: A list of :class:`boto.sdb.regioninfo.RegionInfo` instances
32
+ """
33
+ return [SDBRegionInfo(name='us-east-1',
34
+ endpoint='sdb.amazonaws.com'),
35
+ SDBRegionInfo(name='eu-west-1',
36
+ endpoint='sdb.eu-west-1.amazonaws.com'),
37
+ SDBRegionInfo(name='us-west-1',
38
+ endpoint='sdb.us-west-1.amazonaws.com'),
39
+ SDBRegionInfo(name='sa-east-1',
40
+ endpoint='sdb.sa-east-1.amazonaws.com'),
41
+ SDBRegionInfo(name='us-west-2',
42
+ endpoint='sdb.us-west-2.amazonaws.com'),
43
+ SDBRegionInfo(name='ap-northeast-1',
44
+ endpoint='sdb.ap-northeast-1.amazonaws.com'),
45
+ SDBRegionInfo(name='ap-southeast-1',
46
+ endpoint='sdb.ap-southeast-1.amazonaws.com'),
47
+ SDBRegionInfo(name='ap-southeast-2',
48
+ endpoint='sdb.ap-southeast-2.amazonaws.com')
49
+ ]
50
+
51
+
52
+ def connect_to_region(region_name, **kw_params):
53
+ """
54
+ Given a valid region name, return a
55
+ :class:`boto.sdb.connection.SDBConnection`.
56
+
57
+ :type: str
58
+ :param region_name: The name of the region to connect to.
59
+
60
+ :rtype: :class:`boto.sdb.connection.SDBConnection` or ``None``
61
+ :return: A connection to the given region, or None if an invalid region
62
+ name is given
63
+ """
64
+ for region in regions():
65
+ if region.name == region_name:
66
+ return region.connect(**kw_params)
67
+ return None
@@ -0,0 +1,617 @@
1
+ # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
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
+ import xml.sax
23
+ import threading
24
+ import boto
25
+ from boto import handler
26
+ from boto.connection import AWSQueryConnection
27
+ from boto.sdb.domain import Domain, DomainMetaData
28
+ from boto.sdb.item import Item
29
+ from boto.sdb.regioninfo import SDBRegionInfo
30
+ from boto.exception import SDBResponseError
31
+
32
+ class ItemThread(threading.Thread):
33
+ """
34
+ A threaded :class:`Item <boto.sdb.item.Item>` retriever utility class.
35
+ Retrieved :class:`Item <boto.sdb.item.Item>` objects are stored in the
36
+ ``items`` instance variable after :py:meth:`run() <run>` is called.
37
+
38
+ .. tip:: The item retrieval will not start until
39
+ the :func:`run() <boto.sdb.connection.ItemThread.run>` method is called.
40
+ """
41
+ def __init__(self, name, domain_name, item_names):
42
+ """
43
+ :param str name: A thread name. Used for identification.
44
+ :param str domain_name: The name of a SimpleDB
45
+ :class:`Domain <boto.sdb.domain.Domain>`
46
+ :type item_names: string or list of strings
47
+ :param item_names: The name(s) of the items to retrieve from the specified
48
+ :class:`Domain <boto.sdb.domain.Domain>`.
49
+ :ivar list items: A list of items retrieved. Starts as empty list.
50
+ """
51
+ threading.Thread.__init__(self, name=name)
52
+ #print 'starting %s with %d items' % (name, len(item_names))
53
+ self.domain_name = domain_name
54
+ self.conn = SDBConnection()
55
+ self.item_names = item_names
56
+ self.items = []
57
+
58
+ def run(self):
59
+ """
60
+ Start the threaded retrieval of items. Populates the
61
+ ``items`` list with :class:`Item <boto.sdb.item.Item>` objects.
62
+ """
63
+ for item_name in self.item_names:
64
+ item = self.conn.get_attributes(self.domain_name, item_name)
65
+ self.items.append(item)
66
+
67
+ #boto.set_stream_logger('sdb')
68
+
69
+ class SDBConnection(AWSQueryConnection):
70
+ """
71
+ This class serves as a gateway to your SimpleDB region (defaults to
72
+ us-east-1). Methods within allow access to SimpleDB
73
+ :class:`Domain <boto.sdb.domain.Domain>` objects and their associated
74
+ :class:`Item <boto.sdb.item.Item>` objects.
75
+
76
+ .. tip::
77
+ While you may instantiate this class directly, it may be easier to
78
+ go through :py:func:`boto.connect_sdb`.
79
+ """
80
+ DefaultRegionName = 'us-east-1'
81
+ DefaultRegionEndpoint = 'sdb.us-east-1.amazonaws.com'
82
+ APIVersion = '2009-04-15'
83
+ ResponseError = SDBResponseError
84
+
85
+ def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,
86
+ is_secure=True, port=None, proxy=None, proxy_port=None,
87
+ proxy_user=None, proxy_pass=None, debug=0,
88
+ https_connection_factory=None, region=None, path='/',
89
+ converter=None, security_token=None, validate_certs=True):
90
+ """
91
+ For any keywords that aren't documented, refer to the parent class,
92
+ :py:class:`boto.connection.AWSAuthConnection`. You can avoid having
93
+ to worry about these keyword arguments by instantiating these objects
94
+ via :py:func:`boto.connect_sdb`.
95
+
96
+ :type region: :class:`boto.sdb.regioninfo.SDBRegionInfo`
97
+ :keyword region: Explicitly specify a region. Defaults to ``us-east-1``
98
+ if not specified. You may also specify the region in your ``boto.cfg``:
99
+
100
+ .. code-block:: cfg
101
+
102
+ [SDB]
103
+ region = eu-west-1
104
+
105
+ """
106
+ if not region:
107
+ region_name = boto.config.get('SDB', 'region', self.DefaultRegionName)
108
+ for reg in boto.sdb.regions():
109
+ if reg.name == region_name:
110
+ region = reg
111
+ break
112
+
113
+ self.region = region
114
+ AWSQueryConnection.__init__(self, aws_access_key_id,
115
+ aws_secret_access_key,
116
+ is_secure, port, proxy,
117
+ proxy_port, proxy_user, proxy_pass,
118
+ self.region.endpoint, debug,
119
+ https_connection_factory, path,
120
+ security_token=security_token,
121
+ validate_certs=validate_certs)
122
+ self.box_usage = 0.0
123
+ self.converter = converter
124
+ self.item_cls = Item
125
+
126
+ def _required_auth_capability(self):
127
+ return ['sdb']
128
+
129
+ def set_item_cls(self, cls):
130
+ """
131
+ While the default item class is :py:class:`boto.sdb.item.Item`, this
132
+ default may be overridden. Use this method to change a connection's
133
+ item class.
134
+
135
+ :param object cls: The new class to set as this connection's item
136
+ class. See the default item class for inspiration as to what your
137
+ replacement should/could look like.
138
+ """
139
+ self.item_cls = cls
140
+
141
+ def _build_name_value_list(self, params, attributes, replace=False,
142
+ label='Attribute'):
143
+ keys = sorted(attributes.keys())
144
+ i = 1
145
+ for key in keys:
146
+ value = attributes[key]
147
+ if isinstance(value, list):
148
+ for v in value:
149
+ params['%s.%d.Name' % (label, i)] = key
150
+ if self.converter:
151
+ v = self.converter.encode(v)
152
+ params['%s.%d.Value' % (label, i)] = v
153
+ if replace:
154
+ params['%s.%d.Replace' % (label, i)] = 'true'
155
+ i += 1
156
+ else:
157
+ params['%s.%d.Name' % (label, i)] = key
158
+ if self.converter:
159
+ value = self.converter.encode(value)
160
+ params['%s.%d.Value' % (label, i)] = value
161
+ if replace:
162
+ params['%s.%d.Replace' % (label, i)] = 'true'
163
+ i += 1
164
+
165
+ def _build_expected_value(self, params, expected_value):
166
+ params['Expected.1.Name'] = expected_value[0]
167
+ if expected_value[1] is True:
168
+ params['Expected.1.Exists'] = 'true'
169
+ elif expected_value[1] is False:
170
+ params['Expected.1.Exists'] = 'false'
171
+ else:
172
+ params['Expected.1.Value'] = expected_value[1]
173
+
174
+ def _build_batch_list(self, params, items, replace=False):
175
+ item_names = items.keys()
176
+ i = 0
177
+ for item_name in item_names:
178
+ params['Item.%d.ItemName' % i] = item_name
179
+ j = 0
180
+ item = items[item_name]
181
+ if item is not None:
182
+ attr_names = item.keys()
183
+ for attr_name in attr_names:
184
+ value = item[attr_name]
185
+ if isinstance(value, list):
186
+ for v in value:
187
+ if self.converter:
188
+ v = self.converter.encode(v)
189
+ params['Item.%d.Attribute.%d.Name' % (i, j)] = attr_name
190
+ params['Item.%d.Attribute.%d.Value' % (i, j)] = v
191
+ if replace:
192
+ params['Item.%d.Attribute.%d.Replace' % (i, j)] = 'true'
193
+ j += 1
194
+ else:
195
+ params['Item.%d.Attribute.%d.Name' % (i, j)] = attr_name
196
+ if self.converter:
197
+ value = self.converter.encode(value)
198
+ params['Item.%d.Attribute.%d.Value' % (i, j)] = value
199
+ if replace:
200
+ params['Item.%d.Attribute.%d.Replace' % (i, j)] = 'true'
201
+ j += 1
202
+ i += 1
203
+
204
+ def _build_name_list(self, params, attribute_names):
205
+ i = 1
206
+ attribute_names.sort()
207
+ for name in attribute_names:
208
+ params['Attribute.%d.Name' % i] = name
209
+ i += 1
210
+
211
+ def get_usage(self):
212
+ """
213
+ Returns the BoxUsage (in USD) accumulated on this specific SDBConnection
214
+ instance.
215
+
216
+ .. tip:: This can be out of date, and should only be treated as a
217
+ rough estimate. Also note that this estimate only applies to the
218
+ requests made on this specific connection instance. It is by
219
+ no means an account-wide estimate.
220
+
221
+ :rtype: float
222
+ :return: The accumulated BoxUsage of all requests made on the connection.
223
+ """
224
+ return self.box_usage
225
+
226
+ def print_usage(self):
227
+ """
228
+ Print the BoxUsage and approximate costs of all requests made on
229
+ this specific SDBConnection instance.
230
+
231
+ .. tip:: This can be out of date, and should only be treated as a
232
+ rough estimate. Also note that this estimate only applies to the
233
+ requests made on this specific connection instance. It is by
234
+ no means an account-wide estimate.
235
+ """
236
+ print 'Total Usage: %f compute seconds' % self.box_usage
237
+ cost = self.box_usage * 0.14
238
+ print 'Approximate Cost: $%f' % cost
239
+
240
+ def get_domain(self, domain_name, validate=True):
241
+ """
242
+ Retrieves a :py:class:`boto.sdb.domain.Domain` object whose name
243
+ matches ``domain_name``.
244
+
245
+ :param str domain_name: The name of the domain to retrieve
246
+ :keyword bool validate: When ``True``, check to see if the domain
247
+ actually exists. If ``False``, blindly return a
248
+ :py:class:`Domain <boto.sdb.domain.Domain>` object with the
249
+ specified name set.
250
+
251
+ :raises:
252
+ :py:class:`boto.exception.SDBResponseError` if ``validate`` is
253
+ ``True`` and no match could be found.
254
+
255
+ :rtype: :py:class:`boto.sdb.domain.Domain`
256
+ :return: The requested domain
257
+ """
258
+ domain = Domain(self, domain_name)
259
+ if validate:
260
+ self.select(domain, """select * from `%s` limit 1""" % domain_name)
261
+ return domain
262
+
263
+ def lookup(self, domain_name, validate=True):
264
+ """
265
+ Lookup an existing SimpleDB domain. This differs from
266
+ :py:meth:`get_domain` in that ``None`` is returned if ``validate`` is
267
+ ``True`` and no match was found (instead of raising an exception).
268
+
269
+ :param str domain_name: The name of the domain to retrieve
270
+
271
+ :param bool validate: If ``True``, a ``None`` value will be returned
272
+ if the specified domain can't be found. If ``False``, a
273
+ :py:class:`Domain <boto.sdb.domain.Domain>` object will be dumbly
274
+ returned, regardless of whether it actually exists.
275
+
276
+ :rtype: :class:`boto.sdb.domain.Domain` object or ``None``
277
+ :return: The Domain object or ``None`` if the domain does not exist.
278
+ """
279
+ try:
280
+ domain = self.get_domain(domain_name, validate)
281
+ except:
282
+ domain = None
283
+ return domain
284
+
285
+ def get_all_domains(self, max_domains=None, next_token=None):
286
+ """
287
+ Returns a :py:class:`boto.resultset.ResultSet` containing
288
+ all :py:class:`boto.sdb.domain.Domain` objects associated with
289
+ this connection's Access Key ID.
290
+
291
+ :keyword int max_domains: Limit the returned
292
+ :py:class:`ResultSet <boto.resultset.ResultSet>` to the specified
293
+ number of members.
294
+ :keyword str next_token: A token string that was returned in an
295
+ earlier call to this method as the ``next_token`` attribute
296
+ on the returned :py:class:`ResultSet <boto.resultset.ResultSet>`
297
+ object. This attribute is set if there are more than Domains than
298
+ the value specified in the ``max_domains`` keyword. Pass the
299
+ ``next_token`` value from you earlier query in this keyword to
300
+ get the next 'page' of domains.
301
+ """
302
+ params = {}
303
+ if max_domains:
304
+ params['MaxNumberOfDomains'] = max_domains
305
+ if next_token:
306
+ params['NextToken'] = next_token
307
+ return self.get_list('ListDomains', params, [('DomainName', Domain)])
308
+
309
+ def create_domain(self, domain_name):
310
+ """
311
+ Create a SimpleDB domain.
312
+
313
+ :type domain_name: string
314
+ :param domain_name: The name of the new domain
315
+
316
+ :rtype: :class:`boto.sdb.domain.Domain` object
317
+ :return: The newly created domain
318
+ """
319
+ params = {'DomainName':domain_name}
320
+ d = self.get_object('CreateDomain', params, Domain)
321
+ d.name = domain_name
322
+ return d
323
+
324
+ def get_domain_and_name(self, domain_or_name):
325
+ """
326
+ Given a ``str`` or :class:`boto.sdb.domain.Domain`, return a
327
+ ``tuple`` with the following members (in order):
328
+
329
+ * In instance of :class:`boto.sdb.domain.Domain` for the requested
330
+ domain
331
+ * The domain's name as a ``str``
332
+
333
+ :type domain_or_name: ``str`` or :class:`boto.sdb.domain.Domain`
334
+ :param domain_or_name: The domain or domain name to get the domain
335
+ and name for.
336
+
337
+ :raises: :class:`boto.exception.SDBResponseError` when an invalid
338
+ domain name is specified.
339
+
340
+ :rtype: tuple
341
+ :return: A ``tuple`` with contents outlined as per above.
342
+ """
343
+ if (isinstance(domain_or_name, Domain)):
344
+ return (domain_or_name, domain_or_name.name)
345
+ else:
346
+ return (self.get_domain(domain_or_name), domain_or_name)
347
+
348
+ def delete_domain(self, domain_or_name):
349
+ """
350
+ Delete a SimpleDB domain.
351
+
352
+ .. caution:: This will delete the domain and all items within the domain.
353
+
354
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
355
+ :param domain_or_name: Either the name of a domain or a Domain object
356
+
357
+ :rtype: bool
358
+ :return: True if successful
359
+
360
+ """
361
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
362
+ params = {'DomainName':domain_name}
363
+ return self.get_status('DeleteDomain', params)
364
+
365
+ def domain_metadata(self, domain_or_name):
366
+ """
367
+ Get the Metadata for a SimpleDB domain.
368
+
369
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
370
+ :param domain_or_name: Either the name of a domain or a Domain object
371
+
372
+ :rtype: :class:`boto.sdb.domain.DomainMetaData` object
373
+ :return: The newly created domain metadata object
374
+ """
375
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
376
+ params = {'DomainName':domain_name}
377
+ d = self.get_object('DomainMetadata', params, DomainMetaData)
378
+ d.domain = domain
379
+ return d
380
+
381
+ def put_attributes(self, domain_or_name, item_name, attributes,
382
+ replace=True, expected_value=None):
383
+ """
384
+ Store attributes for a given item in a domain.
385
+
386
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
387
+ :param domain_or_name: Either the name of a domain or a Domain object
388
+
389
+ :type item_name: string
390
+ :param item_name: The name of the item whose attributes are being
391
+ stored.
392
+
393
+ :type attribute_names: dict or dict-like object
394
+ :param attribute_names: The name/value pairs to store as attributes
395
+
396
+ :type expected_value: list
397
+ :param expected_value: If supplied, this is a list or tuple consisting
398
+ of a single attribute name and expected value. The list can be
399
+ of the form:
400
+
401
+ * ['name', 'value']
402
+
403
+ In which case the call will first verify that the attribute "name"
404
+ of this item has a value of "value". If it does, the delete
405
+ will proceed, otherwise a ConditionalCheckFailed error will be
406
+ returned. The list can also be of the form:
407
+
408
+ * ['name', True|False]
409
+
410
+ which will simply check for the existence (True) or
411
+ non-existence (False) of the attribute.
412
+
413
+ :type replace: bool
414
+ :param replace: Whether the attribute values passed in will replace
415
+ existing values or will be added as addition values.
416
+ Defaults to True.
417
+
418
+ :rtype: bool
419
+ :return: True if successful
420
+ """
421
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
422
+ params = {'DomainName' : domain_name,
423
+ 'ItemName' : item_name}
424
+ self._build_name_value_list(params, attributes, replace)
425
+ if expected_value:
426
+ self._build_expected_value(params, expected_value)
427
+ return self.get_status('PutAttributes', params)
428
+
429
+ def batch_put_attributes(self, domain_or_name, items, replace=True):
430
+ """
431
+ Store attributes for multiple items in a domain.
432
+
433
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
434
+ :param domain_or_name: Either the name of a domain or a Domain object
435
+
436
+ :type items: dict or dict-like object
437
+ :param items: A dictionary-like object. The keys of the dictionary are
438
+ the item names and the values are themselves dictionaries
439
+ of attribute names/values, exactly the same as the
440
+ attribute_names parameter of the scalar put_attributes
441
+ call.
442
+
443
+ :type replace: bool
444
+ :param replace: Whether the attribute values passed in will replace
445
+ existing values or will be added as addition values.
446
+ Defaults to True.
447
+
448
+ :rtype: bool
449
+ :return: True if successful
450
+ """
451
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
452
+ params = {'DomainName' : domain_name}
453
+ self._build_batch_list(params, items, replace)
454
+ return self.get_status('BatchPutAttributes', params, verb='POST')
455
+
456
+ def get_attributes(self, domain_or_name, item_name, attribute_names=None,
457
+ consistent_read=False, item=None):
458
+ """
459
+ Retrieve attributes for a given item in a domain.
460
+
461
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
462
+ :param domain_or_name: Either the name of a domain or a Domain object
463
+
464
+ :type item_name: string
465
+ :param item_name: The name of the item whose attributes are
466
+ being retrieved.
467
+
468
+ :type attribute_names: string or list of strings
469
+ :param attribute_names: An attribute name or list of attribute names.
470
+ This parameter is optional. If not supplied, all attributes will
471
+ be retrieved for the item.
472
+
473
+ :type consistent_read: bool
474
+ :param consistent_read: When set to true, ensures that the most recent
475
+ data is returned.
476
+
477
+ :type item: :class:`boto.sdb.item.Item`
478
+ :keyword item: Instead of instantiating a new Item object, you may
479
+ specify one to update.
480
+
481
+ :rtype: :class:`boto.sdb.item.Item`
482
+ :return: An Item with the requested attribute name/values set on it
483
+ """
484
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
485
+ params = {'DomainName' : domain_name,
486
+ 'ItemName' : item_name}
487
+ if consistent_read:
488
+ params['ConsistentRead'] = 'true'
489
+ if attribute_names:
490
+ if not isinstance(attribute_names, list):
491
+ attribute_names = [attribute_names]
492
+ self.build_list_params(params, attribute_names, 'AttributeName')
493
+ response = self.make_request('GetAttributes', params)
494
+ body = response.read()
495
+ if response.status == 200:
496
+ if item == None:
497
+ item = self.item_cls(domain, item_name)
498
+ h = handler.XmlHandler(item, self)
499
+ xml.sax.parseString(body, h)
500
+ return item
501
+ else:
502
+ raise SDBResponseError(response.status, response.reason, body)
503
+
504
+ def delete_attributes(self, domain_or_name, item_name, attr_names=None,
505
+ expected_value=None):
506
+ """
507
+ Delete attributes from a given item in a domain.
508
+
509
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
510
+ :param domain_or_name: Either the name of a domain or a Domain object
511
+
512
+ :type item_name: string
513
+ :param item_name: The name of the item whose attributes are being
514
+ deleted.
515
+
516
+ :type attributes: dict, list or :class:`boto.sdb.item.Item`
517
+ :param attributes: Either a list containing attribute names which
518
+ will cause all values associated with that attribute
519
+ name to be deleted or a dict or Item containing the
520
+ attribute names and keys and list of values to
521
+ delete as the value. If no value is supplied,
522
+ all attribute name/values for the item will be
523
+ deleted.
524
+
525
+ :type expected_value: list
526
+ :param expected_value: If supplied, this is a list or tuple consisting
527
+ of a single attribute name and expected value. The list can be
528
+ of the form:
529
+
530
+ * ['name', 'value']
531
+
532
+ In which case the call will first verify that the attribute "name"
533
+ of this item has a value of "value". If it does, the delete
534
+ will proceed, otherwise a ConditionalCheckFailed error will be
535
+ returned. The list can also be of the form:
536
+
537
+ * ['name', True|False]
538
+
539
+ which will simply check for the existence (True) or
540
+ non-existence (False) of the attribute.
541
+
542
+ :rtype: bool
543
+ :return: True if successful
544
+ """
545
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
546
+ params = {'DomainName':domain_name,
547
+ 'ItemName' : item_name}
548
+ if attr_names:
549
+ if isinstance(attr_names, list):
550
+ self._build_name_list(params, attr_names)
551
+ elif isinstance(attr_names, dict) or isinstance(attr_names, self.item_cls):
552
+ self._build_name_value_list(params, attr_names)
553
+ if expected_value:
554
+ self._build_expected_value(params, expected_value)
555
+ return self.get_status('DeleteAttributes', params)
556
+
557
+ def batch_delete_attributes(self, domain_or_name, items):
558
+ """
559
+ Delete multiple items in a domain.
560
+
561
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object.
562
+ :param domain_or_name: Either the name of a domain or a Domain object
563
+
564
+ :type items: dict or dict-like object
565
+ :param items: A dictionary-like object. The keys of the dictionary are
566
+ the item names and the values are either:
567
+
568
+ * dictionaries of attribute names/values, exactly the
569
+ same as the attribute_names parameter of the scalar
570
+ put_attributes call. The attribute name/value pairs
571
+ will only be deleted if they match the name/value
572
+ pairs passed in.
573
+ * None which means that all attributes associated
574
+ with the item should be deleted.
575
+
576
+ :return: True if successful
577
+ """
578
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
579
+ params = {'DomainName' : domain_name}
580
+ self._build_batch_list(params, items, False)
581
+ return self.get_status('BatchDeleteAttributes', params, verb='POST')
582
+
583
+ def select(self, domain_or_name, query='', next_token=None,
584
+ consistent_read=False):
585
+ """
586
+ Returns a set of Attributes for item names within domain_name that
587
+ match the query. The query must be expressed in using the SELECT
588
+ style syntax rather than the original SimpleDB query language.
589
+ Even though the select request does not require a domain object,
590
+ a domain object must be passed into this method so the Item objects
591
+ returned can point to the appropriate domain.
592
+
593
+ :type domain_or_name: string or :class:`boto.sdb.domain.Domain` object
594
+ :param domain_or_name: Either the name of a domain or a Domain object
595
+
596
+ :type query: string
597
+ :param query: The SimpleDB query to be performed.
598
+
599
+ :type consistent_read: bool
600
+ :param consistent_read: When set to true, ensures that the most recent
601
+ data is returned.
602
+
603
+ :rtype: ResultSet
604
+ :return: An iterator containing the results.
605
+ """
606
+ domain, domain_name = self.get_domain_and_name(domain_or_name)
607
+ params = {'SelectExpression' : query}
608
+ if consistent_read:
609
+ params['ConsistentRead'] = 'true'
610
+ if next_token:
611
+ params['NextToken'] = next_token
612
+ try:
613
+ return self.get_list('Select', params, [('Item', self.item_cls)],
614
+ parent=domain)
615
+ except SDBResponseError, e:
616
+ e.body = "Query: %s\n%s" % (query, e.body)
617
+ raise e