diff --git a/_modules/gcloud/connection.html b/_modules/gcloud/connection.html
index 956380a5c73b..5cff3ab5034a 100644
--- a/_modules/gcloud/connection.html
+++ b/_modules/gcloud/connection.html
@@ -108,6 +108,10 @@
self._credentials = credentials
+ @property
+[docs] def credentials(self):
+
return self._credentials
+
@property
[docs] def http(self):
"""A getter for the HTTP transport used in talking to the API.
diff --git a/_modules/gcloud/datastore/helpers.html b/_modules/gcloud/datastore/helpers.html
index 48e13c42f4f4..823191f25bf7 100644
--- a/_modules/gcloud/datastore/helpers.html
+++ b/_modules/gcloud/datastore/helpers.html
@@ -82,6 +82,7 @@
All API Docs
Source code for gcloud.datastore.helpers
"""Helper methods for dealing with Cloud Datastore's Protobuf API."""
+import calendar
from datetime import datetime
import pytz
@@ -119,7 +120,15 @@ Source code for gcloud.datastore.helpers
"""
if isinstance(val, datetime):
- name, value = 'timestamp_microseconds', time.mktime(val.timetuple())
+ name = 'timestamp_microseconds'
+ # If the datetime is naive (no timezone), consider that it was
+ # intended to be UTC and replace the tzinfo to that effect.
+ if not val.tzinfo:
+ val = val.replace(tzinfo=pytz.utc)
+ # Regardless of what timezone is on the value, convert it to UTC.
+ val = val.astimezone(pytz.utc)
+ # Convert the datetime to a microsecond timestamp.
+ value = long(calendar.timegm(val.timetuple()) * 1e6) + val.microsecond
elif isinstance(val, Key):
name, value = 'key', val.to_protobuf()
elif isinstance(val, bool):
@@ -151,8 +160,9 @@ Source code for gcloud.datastore.helpers
"""
if pb.value.HasField('timestamp_microseconds_value'):
- timestamp = pb.value.timestamp_microseconds_value / 1e6
- return datetime.fromtimestamp(timestamp).replace(tzinfo=pytz.utc)
+ microseconds = pb.value.timestamp_microseconds_value
+ return (datetime.utcfromtimestamp(0) +
+ datetime.timedelta(microseconds=microseconds))
elif pb.value.HasField('key_value'):
return Key.from_protobuf(pb.value.key_value)
diff --git a/_modules/gcloud/datastore/key.html b/_modules/gcloud/datastore/key.html
index f10bda075e02..593dd1c3852e 100644
--- a/_modules/gcloud/datastore/key.html
+++ b/_modules/gcloud/datastore/key.html
@@ -132,14 +132,18 @@ Source code for gcloud.datastore.key
[docs] def to_protobuf(self):
key = datastore_pb.Key()
-
# Apparently 's~' is a prefix for High-Replication and is necessary here.
-
# Another valid preflix is 'e~' indicating EU datacenters.
-
dataset_id = self.dataset().id()
-
if dataset_id:
-
if dataset_id[:2] not in ['s~', 'e~']:
-
dataset_id = 's~' + dataset_id
-
-
key.partition_id.dataset_id = dataset_id
+
# Technically a dataset is required to do anything with the key,
+
# but we shouldn't throw a cryptic error if one isn't provided
+
# in the initializer.
+
if self.dataset():
+
# Apparently 's~' is a prefix for High-Replication and is necessary here.
+
# Another valid preflix is 'e~' indicating EU datacenters.
+
dataset_id = self.dataset().id()
+
if dataset_id:
+
if dataset_id[:2] not in ['s~', 'e~']:
+
dataset_id = 's~' + dataset_id
+
+
key.partition_id.dataset_id = dataset_id
if self._namespace:
key.partition_id.namespace = self._namespace
diff --git a/_modules/gcloud/storage/connection.html b/_modules/gcloud/storage/connection.html
index 3b1ff518e545..4bf69c31c3fc 100644
--- a/_modules/gcloud/storage/connection.html
+++ b/_modules/gcloud/storage/connection.html
@@ -81,10 +81,18 @@
All API Docs
Source code for gcloud.storage.connection
+import base64
+import datetime
import httplib2
import json
+import time
import urllib
+from Crypto.Hash import SHA256
+from Crypto.PublicKey import RSA
+from Crypto.Signature import PKCS1_v1_5
+from OpenSSL import crypto
+import pytz
from gcloud import connection
from gcloud.storage import exceptions
@@ -140,6 +148,8 @@ Source code for gcloud.storage.connection
API_URL_TEMPLATE = '{api_base_url}/storage/{api_version}{path}'
"""A template used to craft the URL pointing toward a particular API call."""
+ API_ACCESS_ENDPOINT = 'https://storage.googleapis.com'
+
def __init__(self, project_name, *args, **kwargs):
"""
:type project_name: string
@@ -482,7 +492,86 @@ Source code for gcloud.storage.connection
if isinstance(bucket, string_type):
return Bucket(connection=self, name=bucket)
- raise TypeError('Invalid bucket: %s' % bucket)
+ raise TypeError('Invalid bucket: %s' % bucket)
+
+
[docs] def generate_signed_url(self, resource, expiration, method='GET', content_md5=None, content_type=None):
+
"""Generate a signed URL to provide query-string authentication to a resource.
+
+
:type resource: string
+
:param resource: A pointer to a specific resource
+
(typically, ``/bucket-name/path/to/key.txt``).
+
+
:type expiration: int, long, datetime.datetime, datetime.timedelta
+
:param expiration: When the signed URL should expire.
+
+
:type method: string
+
:param method: The HTTP verb that will be used when requesting the URL.
+
+
:type content_md5: string
+
:param content_md5: The MD5 hash of the object referenced by ``resource``.
+
+
:type content_type: string
+
:param content_type: The content type of the object referenced by
+
``resource``.
+
+
:rtype: string
+
:returns: A signed URL you can use to access the resource until expiration.
+
"""
+
+
# expiration can be an absolute timestamp (int, long),
+
# an absolute time (datetime.datetime),
+
# or a relative time (datetime.timedelta).
+
# We should convert all of these into an absolute timestamp.
+
+
# If it's a timedelta, add it to `now` in UTC.
+
if isinstance(expiration, datetime.timedelta):
+
now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
+
expiration = now + expiration
+
+
# If it's a datetime, convert to a timestamp.
+
if isinstance(expiration, datetime.datetime):
+
# Make sure the timezone on the value is UTC
+
# (either by converting or replacing the value).
+
if expiration.tzinfo:
+
expiration = expiration.astimezone(pytz.utc)
+
else:
+
expiration = expiration.replace(tzinfo=pytz.utc)
+
+
# Turn the datetime into a timestamp (seconds, not microseconds).
+
expiration = int(time.mktime(expiration.timetuple()))
+
+
if not isinstance(expiration, (int, long)):
+
raise ValueError('Expected an integer timestamp, datetime, or timedelta. '
+
'Got %s' % type(expiration))
+
+
# Generate the string to sign.
+
signature_string = '\n'.join([
+
method,
+
content_md5 or '',
+
content_type or '',
+
str(expiration),
+
resource])
+
+
# Take our PKCS12 (.p12) key and make it into a RSA key we can use...
+
pkcs12 = crypto.load_pkcs12(base64.b64decode(self.credentials.private_key), 'notasecret')
+
pem = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkcs12.get_privatekey())
+
pem_key = RSA.importKey(pem)
+
+
# Sign the string with the RSA key.
+
signer = PKCS1_v1_5.new(pem_key)
+
signature_hash = SHA256.new(signature_string)
+
signature_bytes = signer.sign(signature_hash)
+
signature = base64.b64encode(signature_bytes)
+
+
# Set the right query parameters.
+
query_params = {'GoogleAccessId': self.credentials.service_account_name,
+
'Expires': str(expiration),
+
'Signature': signature}
+
+
# Return the built URL.
+
return '{endpoint}{resource}?{querystring}'.format(
+
endpoint=self.API_ACCESS_ENDPOINT, resource=resource,
+
querystring=urllib.urlencode(query_params))
diff --git a/_modules/gcloud/storage/key.html b/_modules/gcloud/storage/key.html
index 9e64ae8db728..5eb342ccd5ca 100644
--- a/_modules/gcloud/storage/key.html
+++ b/_modules/gcloud/storage/key.html
@@ -147,6 +147,19 @@ Source code for gcloud.storage.key
return '<Key: %s, %s>' % (bucket_name, self.name)
+ @property
+[docs] def connection(self):
+
"""Getter property for the connection to use with this Key.
+
+
:rtype: :class:`gcloud.storage.connection.Connection` or None
+
:returns: The connection to use, or None if no connection is set.
+
"""
+
+
# TODO: If a bucket isn't defined, this is basically useless.
+
# Where do we throw an error?
+
if self.bucket and self.bucket.connection:
+
return self.bucket.connection
+
@property
[docs] def path(self):
"""Getter property for the URL path to this Key.
@@ -167,18 +180,31 @@
Source code for gcloud.storage.key
return '{storage_base_url}/{self.bucket.name}/{self.name}'.format(
storage_base_url='http://commondatastorage.googleapis.com', self=self)
-
@property
-
[docs] def connection(self):
-
"""Getter property for the connection to use with this Key.
+
[docs] def generate_signed_url(self, expiration, method='GET'):
+
"""Generates a signed URL for this key.
-
:rtype: :class:`gcloud.storage.connection.Connection` or None
-
:returns: The connection to use, or None if no connection is set.
+
If you have a key that you want to allow access to
+
for a set amount of time,
+
you can use this method to generate a URL
+
that is only valid within a certain time period.
+
+
This is particularly useful if you don't want publicly accessible keys,
+
but don't want to require users to explicitly log in.
+
+
:type expiration: int, long, datetime.datetime, datetime.timedelta
+
:param expiration: When the signed URL should expire.
+
+
:type method: string
+
:param method: The HTTP verb that will be used when requesting the URL.
+
+
:rtype: string
+
:returns: A signed URL you can use to access the resource until expiration.
"""
-
# TODO: If a bucket isn't defined, this is basically useless.
-
# Where do we throw an error?
-
if self.bucket and self.bucket.connection:
-
return self.bucket.connection
+
resource = '/{self.bucket.name}/{self.name}'.format(self=self)
+
return self.connection.generate_signed_url(resource=resource,
+
expiration=expiration,
+
method=method)
[docs] def exists(self):
"""Determines whether or not this key exists.
diff --git a/common-api.html b/common-api.html
index 59134a65da82..1310b78207fc 100644
--- a/common-api.html
+++ b/common-api.html
@@ -119,6 +119,11 @@
Cloud Common
- connection (gcloud.storage.key.Key attribute)
+ |
+
- connection() (gcloud.datastore.dataset.Dataset method)
@@ -299,6 +303,10 @@ C
- Credentials (class in gcloud.credentials)
+
+ - credentials (gcloud.connection.Connection attribute)
+
+
|
@@ -528,6 +536,16 @@ G
+ generate_signed_url() (gcloud.storage.connection.Connection method)
+
+
+
+
+ - (gcloud.storage.key.Key method)
+
+
+
+
get_acl() (gcloud.storage.bucket.Bucket method)
diff --git a/objects.inv b/objects.inv
index edd52106831c..550944b5f7c8 100644
Binary files a/objects.inv and b/objects.inv differ
diff --git a/searchindex.js b/searchindex.js
index 6c8db6e15062..141ec2af2836 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({envversion:42,terms:{represent:5,all:[5,7],concept:[5,7],partial:5,chain:7,messi:5,consum:[5,7],mykind:5,code:[5,0,4,7,2],per:[5,7],follow:[5,0,7,4],set_contents_from_filenam:7,disk:7,make_request:7,row:5,privat:[3,7,6,5],sorri:7,readabl:3,base_url:5,send:[5,7],granular:7,under:[5,0,7,6,3],instruct:[0,4],transaction_id:5,sourc:[0,1,2,4,5,6,7],rollback:5,string:[5,6,7],fals:[5,7],account:[5,6],defaultobjectacl:7,ident:7,allus:7,get_protobuf_attribute_and_valu:5,get_kei:7,appar:7,bucketacl:7,level:[6,7],button:3,list:[5,7],upload:7,fewer:7,factori:[5,7],"try":5,item:[5,7],add_ent:7,not_found_pag:7,librari:[5,6],set_contents_from_str:[2,7],sign:[0,7],jump:0,second:3,pass:[5,7],download:3,dataset_id:[5,4],get_bucket:7,click:3,proxi:7,even:7,index:7,what:7,get_for_service_account:6,defin:[5,7],section:3,abl:[5,0,1,7,3],gclouddatstor:5,current:[5,7],delet:[2,7,5],version:[5,7],hurdl:0,"new":[5,2,7,3],ever:7,method:[5,2,7,6,4],other_arg:7,metadata:7,intellectu:0,deriv:5,gener:[3,7,6,5],never:0,datastore_v1_pb2:5,get_value_from_protobuf:5,here:[3,7,5],bodi:7,shouldn:[5,7],explicitli:5,address:[3,7],path:[3,7,6,5],along:5,modifi:5,valu:[5,7],get_contents_to_filenam:7,box:3,search:[5,7],tire:3,host:7,jame:5,permit:7,new_bucket:7,typic:[3,7,5],mix:5,via:[5,7],extra:5,revok:7,appli:5,modul:4,prefer:3,apt:1,friendli:3,ask:7,"boolean":5,key_pb:5,txt:[2,7],establish:[5,7],from:[2,1,3,4,5,7],would:[5,7],visit:3,two:[0,7,5],todai:3,next:[3,7,4],websit:7,few:7,live:[5,0,4,2],call:[5,6,7],criteria:5,scope:[5,6],type:[5,6,7],until:5,more:[5,7],sort:[3,7],get_contents_as_str:[2,7],save_acl:7,relat:[5,7],lookup:[5,7],from_path:5,accept:[0,7,5],particular:[5,6,7],known:7,compani:[0,7],dataset1:5,content_typ:7,must:[5,7],none:[5,6,7],endpoint:7,retriev:[5,7],setup:1,work:[5,0,7,3],uniqu:[3,7,5],dev:1,other:[5,7],itself:5,whatev:5,get_items_from_respons:7,akin:[5,7],root:7,fetch:[5,3,4],def:7,overrid:[5,7],quickstart:3,give:[3,7],process:7,sudo:1,share:4,templat:[5,7],entity_dict:7,want:[0,1,3,4,5,7],everi:5,keep:[0,5],api_url_templ:[5,7],entitykind:5,alwai:[2,7,4],multipl:[5,7],turn:3,rather:[5,7],anoth:7,get:[5,6],grant_read:7,write:[0,7,2],how:4,anyon:4,configure_websit:7,conn:5,rewind:7,instead:[5,6,7],simpl:[7,6,4],collaps:5,map:5,resourc:7,protobuf:[5,7],overridden:7,to_protobuf:5,clone:[5,1],after:7,befor:[0,7,5],revoke_own:7,clear_default_object_acl:7,mutat:5,datastor:6,associ:7,demonstr:2,"short":7,classmethod:[5,6,7],notfounderror:7,correspond:[5,7],issu:0,inform:3,limited_queri:5,allow:[0,5],enter:5,order:[5,7],talk:[5,6],origin:[0,5],help:0,entity_from_dict:7,runqueri:5,over:[5,7],clear_acl:7,approv:7,becaus:5,revoke_writ:7,through:[0,7,2],api_request:7,add_auto_id_ent:5,still:[0,7],pointer:[5,7],paramet:[5,6,7],keyiter:7,snippet:5,style:7,group:7,primarili:0,glcouddatastor:5,cla:0,platform:6,persist:5,mail:[3,7,6,5],main:[5,7],might:[3,5],alter:5,wouldn:5,them:[5,4],"float":5,"return":[0,7,6,5],thei:[6,7],python:[5,3,1,4],timestamp:5,auth:[3,5],"break":7,httplib2:[5,6],now:[3,7,5],name:[5,3,7,4],anyth:7,didn:5,entity1:5,authent:[3,7,6,5],separ:5,get_connect:[2,7,6,5],each:[5,7],found:[5,7],updat:[5,7],side:[3,5],api_base_url:[5,6,7],mean:[5,4],recommend:5,domain:7,chunk:7,wasn:7,realli:[5,7],disable_websit:7,usernam:3,our:3,happen:[5,7],differ:[5,6,7],special:7,out:[0,4,7,2],upload_fil:7,pyopenssl:1,newli:7,content:[2,7,5],key_path:[5,7],reader:7,print:[2,7],correct:[5,7],red:3,get_head:7,insid:[5,7],advanc:[5,6,7],given:[5,6,7],reason:5,base:[5,6,7],mime:7,dictionari:[5,7],usual:5,put:[5,7],org:7,"byte":7,basi:7,precompil:1,get_all_bucket:[2,7],val:5,could:5,openssl:1,string_valu:5,filter:5,thing:[3,7,5],enforc:5,isn:[5,7],outsid:7,assign:5,first:[3,7,5],oper:[5,7],directli:[5,6,7],onc:[5,0,4,2],number:[5,7],unlik:5,alreadi:7,done:[5,7],wrapper:[6,7],blank:[5,7],owner:7,open:[0,7,3],hood:[5,6,7],size:7,datetim:5,otherkeykind:5,guess:7,"long":[3,7,5],breviti:7,script:[2,4],data:[5,6],interact:[2,7,4],perfectli:5,system:7,construct:[0,7,5],set_contents_from_fil:7,attach:[5,6,7],userinfo:5,statement:5,easier:5,store:[5,7],includ:[2,7,4],shell:[2,4],consol:[3,7,5],my_dataset:5,chunk_siz:7,namespac:5,copi:3,specifi:7,github:[0,1,4,2],pars:[5,7],than:[5,7],serv:5,kind:5,whenev:[5,7],provid:[5,6,7],remov:7,offici:[0,7,5],exampl:[5,2,4,7,3],project:5,has_more_data:7,were:5,toward:[5,7],initi:[3,5],result:[5,7],"function":5,sai:[3,7],get_contents_to_fil:7,arg:[5,7],beforehand:1,ani:[5,0,7,6,4],all_authent:7,packag:[2,1,4],have:[0,1,2,3,4,5,7],tabl:5,need:[5,0,7,6,3],seem:5,seek:7,option:[5,7],imagin:7,built:5,equival:[5,7],self:7,note:7,also:[5,7],builtin:5,without:[5,7],build:[5,7],which:[5,3,7,6,4],coworker1:7,get_next_chunk:7,singl:5,blue:3,begin:[5,7],sure:[5,0,7,3],"enum":7,buffer:7,object:[5,6,7],salli:5,regular:5,from_kei:5,plan:7,pair:7,make_publ:7,"class":[5,6,7],myentitykind:5,rollback_transact:5,don:[5,7],connectionerror:7,save_default_object_acl:7,url:[5,6,7],doc:7,clear:7,request:[0,7,5],rais:[5,7],doe:7,part:[5,7],determin:[5,7],databas:[3,5],my_str:5,upsert:5,awesom:0,serializ:5,text:7,sent:5,particularli:5,permiss:7,key_dict:7,find:7,setter:5,access:[5,0,6,3],do_some_work:5,coerc:5,execut:5,pretti:4,writer:7,start:5,get_ent:[5,7],configur:7,dict:[5,7],factor:7,bucket_dict:7,local:[5,7],fstat:7,get_rol:7,copy_kei:7,save_ent:5,express:5,revoke_read:7,soon:0,cannot:[5,7],googleapi:[5,6,7],increas:7,requir:[5,6],item_nam:5,googlecloudplatform:1,possibl:[5,7],yield:7,"public":7,remot:[5,7],stuff:7,contain:7,has_ent:7,storageerror:7,where:[3,7,5],v1beta2:[5,7],acl:7,set:[5,7],project_nam:[2,7],bucket_nam:7,bucket1:7,bucket2:7,mutabl:[5,7],see:[7,4],temporarili:5,get_query_param:7,is_parti:5,from_protobuf:5,grant_writ:7,servic:[5,6],analog:5,parent:5,pattern:5,someth:[3,7],filtered_queri:5,label:3,favor:5,won:[5,7],between:[5,7],"import":[5,2,4,7,3],bunch:[7,4],email:[5,7],attribut:[5,7],altern:7,kei:6,isol:5,myitemclass:7,entir:5,wrote:4,grant_own:7,come:[0,5],revoke_:7,addit:5,jumbl:5,howev:[5,6,7],scrutin:5,against:[5,6],etc:7,myiter:7,instanc:5,"__init__":[5,6,7],mani:3,whole:7,load:[5,7],simpli:5,technic:5,can:[0,1,2,4,5,7],instanti:[2,7,4],hyphen:3,ubuntu:1,walk:[2,7],header:7,rpc:5,duplic:5,coupl:0,delete_ent:5,empti:[5,7],compon:7,json:7,interpret:7,objectacl:7,basic:[5,6,7],popul:7,my_other_acl:7,valueerror:5,grant_:7,some_other_acl:7,mind:0,convert:[5,7],argument:[5,6,7],bulk:5,reload_default_object_acl:7,craft:[5,7],understand:[5,6,7],togeth:[5,7],func:7,"catch":7,private_key_path:[5,2,7,6,4],those:[5,7],"case":5,onli:[5,6,7],look:[5,0,4,7,3],plain:7,mount:7,properti:[0,7,5],delete_kei:7,mutation_pb:5,"while":7,match:[5,7],abov:0,error:5,full:7,create_bucket:[2,7],get_next_page_respons:7,helper:6,demo:[2,4],non:7,get_metadata:7,"default":[5,7],kwarg:[5,7],bulk_mut:5,notimplementederror:7,sever:[5,7],develop:7,build_api_url:[5,7],grant:7,belond:5,make:[3,7,5],belong:[5,7],has_metadata:7,same:[5,7],shorter:3,handl:[5,7],html:7,document:[0,6,7],infer:5,complet:[3,7,5],http:[3,7,6,5],context:5,nest:5,overriden:7,upon:5,effect:5,hand:3,capabl:[5,6,7],retriv:5,insert_auto_id:5,user:7,respons:[5,7],weird:3,run_queri:5,has_next_pag:7,appropri:[0,7],off:[3,7,5],com:[3,1,7,6,5],well:[5,7],person:[5,3,4],client:[0,7,3],default_object_acl:7,thi:[0,2,3,4,5,6,7],choos:3,everyth:1,left:[3,7],coworker2:7,identifi:[3,7,5],entri:[5,7],just:[5,2,4,7,3],hybrid:5,begin_transact:5,rest:[5,7],human:3,mysql:3,touch:7,patch_metadata:7,query_param:7,field:7,get_acl:7,point:[5,7],except:[3,5],shortcut:[5,2,7,4],add:5,is_valid:7,primit:7,els:[5,7],tell:3,save:[5,3,7,4],app:7,kick:3,take:[5,0,4,3],earli:7,applic:7,around:[6,7],format:5,read:[2,7,4],big:3,piec:7,api_vers:[5,7],know:5,world:5,password:3,recurs:7,you:[0,1,2,3,4,5,6,7],licens:0,insert:7,like:[3,7,5],specif:7,filenam:7,should:[5,0,7,6,2],manual:5,integ:5,integer_valu:5,from_dict:7,api:[5,6],necessari:5,either:[0,7,5],corpor:0,page:7,get_dataset:[5,3,6,4],"0x3769dc0":5,www:[5,6],right:[3,5],deal:5,simplifi:[6,7],some:5,back:5,crypto:1,intern:5,refresh:7,proper:[5,7],query_pb:5,server:7,transport:[5,6,7],libssl:1,get_default_object_acl:7,subclass:[5,6,7],cast:5,track:5,exit:5,testkind:5,refer:[5,7],machin:[5,7],who:7,run:[5,2,4],entity2:5,reload_acl:7,agreement:0,bucket2_nam:7,repositori:1,storagedataerror:7,immut:5,post:7,"throw":7,about:7,actual:[3,7,5],get_url:7,my_text_fil:7,nextpagetoken:7,manag:5,unsav:7,act:5,commit:5,disabl:7,id_or_nam:5,own:[5,0,4],reload_metadata:7,new_kei:[2,7],within:5,automat:[3,5],down:3,doesnt:7,been:[5,7],contributor:0,chang:[5,7],your:5,api_bas:5,dataset2:5,git:1,wai:[3,7],support:5,gcloud:6,submit:0,custom:7,avail:[5,7,4],lost:3,reli:5,low:7,cowork:7,individu:0,expect_json:7,fork:0,properli:5,form:5,tupl:[5,6,7],public_url:7,somehow:7,link:0,oauth:3,renam:3,role:7,"true":[5,7],reset:7,pull:0,oauth2:[5,6],bucket1_nam:7,consist:7,reload:[5,7],whether:7,maximum:5,troubl:1,getter:[5,6,7],limit:5,get_all_kei:[2,7],otherwis:7,quickli:[2,7,4],constant:7,creat:[5,6],"int":7,certain:5,"abstract":5,delete_bucket:7,doesn:7,repres:[5,7],exist:[5,7],file:[5,2,7,6,3],pip:[2,1,4],check:[2,7,6,4],probabl:[0,7],assembl:7,googl:[3,6,5],when:[3,7,6,5],intend:3,myexamplekind:4,main_page_suffix:7,valid:5,bool:[5,7],futur:7,test:2,mutuat:5,roll:5,refernec:7,my_other_kei:5,bucketiter:7,legal:0,assert:5,receiv:0,pycrypto:1,directori:7,client_email:[5,2,7,6,4],rule:[5,7],time:[3,5],far:5,fresh:7,scroll:3,keydataiter:7},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:classmethod","5":"py:exception","6":"py:data","7":"py:function"},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","classmethod","Python class method"],"5":["py","exception","Python exception"],"6":["py","data","Python data"],"7":["py","function","Python function"]},filenames:["index","getting-started","storage-quickstart","datastore-getting-started","datastore-quickstart","datastore-api","common-api","storage-api"],titles:["Google Cloud Python API","Getting started with gcloud","Cloud Storage in 10 seconds","Getting started with Cloud Datastore","Cloud Datastore in 10 seconds","Cloud Datastore","Cloud Common","Cloud Storage"],objects:{"gcloud.datastore.__init__":{SCOPE:[5,6,1,""],get_dataset:[5,7,1,""],get_connection:[5,7,1,""]},"gcloud.storage.key.Key":{patch_metadata:[7,2,1,""],reload_metadata:[7,2,1,""],exists:[7,2,1,""],get_metadata:[7,2,1,""],get_contents_as_string:[7,2,1,""],get_contents_to_filename:[7,2,1,""],get_acl:[7,2,1,""],has_metadata:[7,2,1,""],connection:[7,3,1,""],set_contents_from_filename:[7,2,1,""],CHUNK_SIZE:[7,3,1,""],save_acl:[7,2,1,""],set_contents_from_string:[7,2,1,""],public_url:[7,3,1,""],reload_acl:[7,2,1,""],clear_acl:[7,2,1,""],path:[7,3,1,""],set_contents_from_file:[7,2,1,""],get_contents_to_file:[7,2,1,""],from_dict:[7,4,1,""],make_public:[7,2,1,""],"delete":[7,2,1,""]},"gcloud.credentials.Credentials":{get_for_service_account:[6,4,1,""]},"gcloud.datastore.helpers":{get_value_from_protobuf:[5,7,1,""],get_protobuf_attribute_and_value:[5,7,1,""]},"gcloud.storage.iterator.KeyIterator":{get_items_from_response:[7,2,1,""]},"gcloud.storage.bucket.Bucket":{patch_metadata:[7,2,1,""],reload_metadata:[7,2,1,""],clear_acl:[7,2,1,""],get_metadata:[7,2,1,""],new_key:[7,2,1,""],get_default_object_acl:[7,2,1,""],get_acl:[7,2,1,""],has_metadata:[7,2,1,""],get_all_keys:[7,2,1,""],save_acl:[7,2,1,""],get_key:[7,2,1,""],reload_acl:[7,2,1,""],reload_default_object_acl:[7,2,1,""],delete_keys:[7,2,1,""],copy_key:[7,2,1,""],clear_default_object_acl:[7,2,1,""],path:[7,3,1,""],configure_website:[7,2,1,""],upload_file:[7,2,1,""],save_default_object_acl:[7,2,1,""],from_dict:[7,4,1,""],delete_key:[7,2,1,""],make_public:[7,2,1,""],disable_website:[7,2,1,""],"delete":[7,2,1,""]},"gcloud.storage.iterator.BucketIterator":{get_items_from_response:[7,2,1,""]},"gcloud.datastore.entity.Entity":{kind:[5,2,1,""],from_key:[5,4,1,""],dataset:[5,2,1,""],reload:[5,2,1,""],key:[5,2,1,""],from_protobuf:[5,4,1,""],save:[5,2,1,""],"delete":[5,2,1,""]},"gcloud.storage.acl.ACL.Role":{Owner:[7,3,1,""],Writer:[7,3,1,""],Reader:[7,3,1,""]},gcloud:{credentials:[6,0,0,"-"],connection:[6,0,0,"-"]},"gcloud.connection.Connection":{http:[6,3,1,""],API_BASE_URL:[6,3,1,""]},"gcloud.datastore.transaction":{Transaction:[5,1,1,""]},"gcloud.storage.connection":{Connection:[7,1,1,""]},"gcloud.storage":{iterator:[7,0,0,"-"],bucket:[7,0,0,"-"],acl:[7,0,0,"-"],connection:[7,0,0,"-"],key:[7,0,0,"-"],exceptions:[7,0,0,"-"],"__init__":[7,0,0,"-"]},"gcloud.storage.__init__":{get_connection:[7,7,1,""],get_bucket:[7,7,1,""]},"gcloud.connection":{Connection:[6,1,1,""]},"gcloud.storage.iterator":{KeyDataIterator:[7,1,1,""],BucketIterator:[7,1,1,""],KeyIterator:[7,1,1,""],Iterator:[7,1,1,""]},"gcloud.storage.acl":{DefaultObjectACL:[7,1,1,""],ACL:[7,1,1,""],ObjectACL:[7,1,1,""],BucketACL:[7,1,1,""]},"gcloud.storage.iterator.KeyDataIterator":{reset:[7,2,1,""],get_next_chunk:[7,2,1,""],has_more_data:[7,2,1,""],get_headers:[7,2,1,""],get_url:[7,2,1,""]},"gcloud.datastore.query.Query":{kind:[5,2,1,""],OPERATORS:[5,3,1,""],dataset:[5,2,1,""],filter:[5,2,1,""],limit:[5,2,1,""],to_protobuf:[5,2,1,""],fetch:[5,2,1,""]},"gcloud.storage.acl.BucketACL":{save:[7,2,1,""]},"gcloud.datastore.key.Key":{kind:[5,2,1,""],is_partial:[5,2,1,""],name:[5,2,1,""],parent:[5,2,1,""],id_or_name:[5,2,1,""],namespace:[5,2,1,""],dataset:[5,2,1,""],from_path:[5,4,1,""],from_protobuf:[5,4,1,""],path:[5,2,1,""],to_protobuf:[5,2,1,""],id:[5,2,1,""]},"gcloud.datastore.connection":{Connection:[5,1,1,""]},"gcloud.datastore.dataset":{Dataset:[5,1,1,""]},"gcloud.storage.acl.ACL.Entity":{grant_write:[7,2,1,""],revoke:[7,2,1,""],revoke_write:[7,2,1,""],grant:[7,2,1,""],revoke_read:[7,2,1,""],grant_read:[7,2,1,""],grant_owner:[7,2,1,""],revoke_owner:[7,2,1,""],get_roles:[7,2,1,""]},"gcloud.datastore.key":{Key:[5,1,1,""]},"gcloud.datastore":{transaction:[5,0,0,"-"],dataset:[5,0,0,"-"],connection:[5,0,0,"-"],helpers:[5,0,0,"-"],key:[5,0,0,"-"],query:[5,0,0,"-"],entity:[5,0,0,"-"],"__init__":[5,0,0,"-"]},"gcloud.datastore.dataset.Dataset":{transaction:[5,2,1,""],get_entities:[5,2,1,""],entity:[5,2,1,""],get_entity:[5,2,1,""],connection:[5,2,1,""],query:[5,2,1,""],id:[5,2,1,""]},"gcloud.storage.acl.DefaultObjectACL":{save:[7,2,1,""]},"gcloud.storage.connection.Connection":{get_all_buckets:[7,2,1,""],create_bucket:[7,2,1,""],build_api_url:[7,2,1,""],delete_bucket:[7,2,1,""],API_URL_TEMPLATE:[7,3,1,""],lookup:[7,2,1,""],api_request:[7,2,1,""],new_bucket:[7,2,1,""],get_bucket:[7,2,1,""],make_request:[7,2,1,""],API_VERSION:[7,3,1,""]},"gcloud.storage.bucket":{Bucket:[7,1,1,""]},"gcloud.storage.iterator.Iterator":{reset:[7,2,1,""],get_items_from_response:[7,2,1,""],get_next_page_response:[7,2,1,""],get_query_params:[7,2,1,""],has_next_page:[7,2,1,""]},"gcloud.datastore.connection.Connection":{delete_entity:[5,2,1,""],rollback_transaction:[5,2,1,""],transaction:[5,2,1,""],http:[5,3,1,""],build_api_url:[5,4,1,""],delete_entities:[5,2,1,""],save_entity:[5,2,1,""],run_query:[5,2,1,""],API_URL_TEMPLATE:[5,3,1,""],lookup:[5,2,1,""],mutation:[5,2,1,""],API_VERSION:[5,3,1,""],commit:[5,2,1,""],dataset:[5,2,1,""],API_BASE_URL:[5,3,1,""],begin_transaction:[5,2,1,""]},"gcloud.datastore.query":{Query:[5,1,1,""]},"gcloud.datastore.transaction.Transaction":{begin:[5,2,1,""],rollback:[5,2,1,""],add_auto_id_entity:[5,2,1,""],dataset:[5,2,1,""],connection:[5,2,1,""],mutation:[5,2,1,""],commit:[5,2,1,""],id:[5,2,1,""]},"gcloud.credentials":{Credentials:[6,1,1,""]},"gcloud.storage.acl.ACL":{domain:[7,2,1,""],group:[7,2,1,""],entity_from_dict:[7,2,1,""],all:[7,2,1,""],get_entities:[7,2,1,""],Entity:[7,1,1,""],get_entity:[7,2,1,""],has_entity:[7,2,1,""],user:[7,2,1,""],entity:[7,2,1,""],Role:[7,1,1,""],save:[7,2,1,""],all_authenticated:[7,2,1,""],add_entity:[7,2,1,""]},"gcloud.storage.exceptions":{StorageError:[7,5,1,""],NotFoundError:[7,5,1,""],ConnectionError:[7,5,1,""],StorageDataError:[7,5,1,""]},"gcloud.datastore.entity":{Entity:[5,1,1,""]},"gcloud.storage.acl.ObjectACL":{save:[7,2,1,""]},"gcloud.storage.key":{Key:[7,1,1,""]}},titleterms:{control:7,comput:0,creat:3,queri:[0,5],modul:0,some:3,dataset:[3,5],second:[2,4],api:[0,3],connect:[5,6,7],instal:[2,1,4],storag:[0,7,2],your:3,cloud:[0,2,3,4,5,6,7],entiti:5,project:3,engin:0,helper:5,start:[0,1,3],transact:5,gcloud:[5,1,7],except:7,access:7,how:0,add:3,librari:[2,4],credenti:6,contribut:0,kei:[5,7],get:[0,1,3],python:0,big:0,sql:0,datastor:[5,0,4,3],yourself:[2,4],data:3,googl:0,account:3,enabl:3,servic:[0,3],bucket:7,iter:7,"try":[2,4],common:[0,6]}})
\ No newline at end of file
+Search.setIndex({envversion:42,terms:{represent:5,all:[5,7],concept:[5,7],partial:5,chain:7,messi:5,consum:[5,7],mykind:5,code:[5,0,4,7,2],api_access_endpoint:7,subclass:[5,6,7],follow:[5,0,7,4],set_contents_from_filenam:7,disk:7,make_request:7,row:5,privat:[3,7,6,5],sorri:7,readabl:3,base_url:5,send:[5,7],granular:7,under:[5,0,7,6,3],transaction_id:5,sourc:[0,1,2,4,5,6,7],rollback:5,string:[5,6,7],refernec:7,fals:[5,7],account:[],defaultobjectacl:7,verb:7,"0x1d6adc0":[],get_protobuf_attribute_and_valu:5,get_kei:7,appar:7,bucketacl:7,expect_json:7,level:[6,7],button:3,list:[5,7],upload:7,fewer:7,correct:[5,7],"try":[],item:[5,7],add_ent:7,not_found_pag:7,submit:0,set_contents_from_str:[2,7],sign:[0,7],jump:0,second:[],pass:[5,7],download:3,dataset_id:[5,4],get_bucket:7,click:3,proxi:7,even:7,index:7,what:7,get_for_service_account:6,mutation_pb:5,section:3,abl:[5,0,1,7,3],gclouddatstor:5,current:[5,7],delet:[2,7,5],version:[5,7],hurdl:0,"new":[5,2,7,3],ever:7,method:[5,2,7,6,4],other_arg:7,metadata:7,intellectu:0,hash:7,deriv:5,gener:[3,7,6,5],never:0,datastore_v1_pb2:5,get_value_from_protobuf:5,here:[3,7,5],bodi:7,shouldn:[5,7],coerc:5,address:[3,7],path:[3,7,6,5],along:5,modifi:5,valu:[5,7],get_contents_to_filenam:7,box:3,search:[5,7],pretti:4,bucket2_nam:7,jame:5,amount:7,permit:7,new_bucket:7,typic:[3,7,5],via:[5,7],extra:5,revok:7,appli:5,modul:[],prefer:3,apt:1,friendli:3,put:[5,7],"boolean":5,key_pb:5,txt:[2,7],establish:[5,7],from:[2,1,3,4,5,7],would:[5,7],visit:3,two:[0,7,5],todai:3,next:[3,7,4],websit:7,few:7,live:[5,0,4,2],call:[5,6,7],recommend:5,scope:[5,6],basi:7,type:[5,6,7],until:[5,7],more:[5,7],sort:[3,7],get_contents_as_str:[2,7],save_acl:7,relat:[5,7],remot:[5,7],from_path:5,accept:[0,7,5],particular:[5,6,7],known:7,compani:[0,7],given:[5,6,7],content_typ:7,must:[5,7],none:[5,6,7],endpoint:7,retriev:[5,7],setup:1,work:[5,0,7,3],uniqu:[3,7,5],dev:1,fstat:7,kwarg:[5,7],whatev:5,whether:7,get_items_from_respons:7,akin:[5,7],root:7,fetch:[5,3,4],def:7,overrid:[5,7],quickstart:3,give:[3,7],process:7,sudo:1,share:4,templat:[5,7],entity_dict:7,want:[0,1,3,4,5,7],everi:5,string_valu:5,api_url_templ:[5,7],alwai:[2,7,4],multipl:[5,7],thing:[3,7,5],rather:[5,7],anoth:7,copy_kei:7,grant_read:7,snippet:5,how:[],anyon:4,configure_websit:7,rewind:7,instead:[5,6,7],simpl:[7,6,4],updat:[5,7],map:5,resourc:7,protobuf:[5,7],timedelta:7,to_protobuf:5,clone:[5,1],after:7,befor:[0,7,5],revoke_own:7,clear_default_object_acl:7,develop:7,datastor:[],data:[],demonstr:2,"short":7,classmethod:[5,6,7],grant:7,notfounderror:7,correspond:[5,7],issu:0,inform:3,limited_queri:5,allow:[0,7,5],enter:5,allus:7,order:[5,7],talk:[5,6],origin:[0,5],help:0,entity_from_dict:7,runqueri:5,over:[5,7],clear_acl:7,approv:7,becaus:5,revoke_writ:7,through:[0,7,2],api_request:7,left:[3,7],add_auto_id_ent:5,still:[0,7],pointer:[5,7],paramet:[5,6,7],keyiter:7,write:[0,7,2],style:7,group:7,reload_metadata:7,glcouddatastor:5,cla:0,platform:6,persist:5,mail:[3,7,6,5],main:[5,7],might:[3,5],alter:5,wouldn:5,them:[5,4],within:[5,7],"return":[0,7,6,5],thei:[6,7],python:[],timestamp:5,auth:[3,5],"break":7,httplib2:[5,6],now:[3,7,5],name:[5,3,7,4],anyth:7,didn:5,instruct:[0,4],authent:[3,7,6,5],separ:5,get_connect:[2,7,6,5],each:[5,7],found:[5,7],collaps:5,side:[3,5],api_base_url:[5,6,7],mean:[5,4],domain:7,chunk:7,wasn:7,realli:[5,7],disable_websit:7,our:3,happen:[5,7],special:7,out:[0,4,7,2],overridden:7,upload_fil:7,pyopenssl:1,newli:7,content:[2,7,5],key_path:[5,7],sever:[5,7],reader:7,print:[2,7],"0x2f31aa0":5,factori:[5,7],red:3,get_head:7,insid:[5,7],advanc:[5,6,7],differ:[5,6,7],reason:5,base:[5,6,7],mime:7,dictionari:[5,7],ask:7,org:7,"byte":7,md5:7,precompil:1,storageerror:7,wai:[3,7],could:5,openssl:1,keep:[0,5],filter:5,turn:3,enforc:5,isn:[5,7],outsid:7,assign:5,first:[3,7,5],oper:[5,7],main_page_suffix:7,directli:[5,6,7],onc:[5,0,4,2],number:[5,7],unlik:5,alreadi:7,done:[5,7],construct:[0,7,5],blank:[5,7],owner:7,open:[0,7,3],hood:[5,6,7],size:7,otherkeykind:5,guess:7,breviti:7,script:[2,4],associ:7,interact:[2,7,4],perfectli:5,system:7,wrapper:[6,7],set_contents_from_fil:7,attach:[5,6,7],userinfo:5,statement:5,store:[5,7],low:7,shell:[2,4],consol:[3,7,5],my_dataset:5,has_next_pag:7,namespac:5,copi:3,specifi:7,delete_kei:7,pars:[5,7],than:[5,7],serv:5,kind:5,whenev:[5,7],provid:[5,6,7],remov:7,project:[],has_more_data:7,were:5,toward:[5,7],is_parti:5,fork:0,sai:[3,7],abov:0,get_contents_to_fil:7,from_protobuf:5,beforehand:1,ani:[5,0,7,6,4],all_authent:7,compon:7,packag:[2,1,4],expir:7,have:[0,1,2,3,4,5,7],tabl:5,need:[5,0,7,6,3],seem:5,seek:7,option:[5,7],imagin:7,built:5,equival:[5,7],self:7,client:[0,7,3],note:7,mix:5,builtin:5,without:[5,7],build:[5,7],which:[5,3,7,6,4],tupl:[5,6,7],default_object_acl:7,get_next_chunk:7,public_url:7,singl:5,blue:3,begin:[5,7],sure:[5,0,7,3],"enum":7,usernam:3,object:[5,6,7],salli:5,grant_:7,regular:5,from_kei:5,plan:7,pair:7,make_publ:7,"class":[5,6,7],myentitykind:5,don:[5,7],connectionerror:7,save_default_object_acl:7,url:[5,6,7],doc:7,clear:7,request:[0,7,5],rais:[5,7],doe:7,part:[5,7],determin:[5,7],pattern:5,my_str:5,upsert:5,awesom:0,serializ:5,text:7,sent:5,particularli:[5,7],permiss:7,key_dict:7,find:7,setter:5,access:[],do_some_work:5,explicitli:[5,7],just:[5,2,4,7,3],tire:3,writer:7,start:[],get_ent:[5,7],configur:7,dict:[5,7],factor:7,bucket_dict:7,local:[5,7],offici:[0,7,5],get_rol:7,get:[],save_ent:5,express:5,revoke_read:7,soon:0,cannot:[5,7],rest:[5,7],increas:7,requir:[5,6,7],item_nam:5,consist:7,googlecloudplatform:1,belond:5,yield:7,"public":7,reload:[5,7],stuff:7,contain:7,has_ent:7,get_all_bucket:[2,7],where:[3,7,5],valid:[5,7],v1beta2:[5,7],user:7,set:[5,7],project_nam:[2,7],bucket_nam:7,bucket1:7,bucket2:7,mutabl:[5,7],see:[7,4],temporarili:5,get_query_param:7,result:[5,7],arg:[5,7],servic:[],analog:5,page:7,kei:[],databas:[3,5],someth:[3,7],filtered_queri:5,label:3,favor:5,won:[5,7],between:[5,7],"import":[5,2,4,7,3],bunch:[7,4],email:[5,7],attribut:[5,7],altern:7,parent:5,isol:5,myitemclass:7,entir:5,grant_own:7,pull:0,come:[0,5],revoke_:7,addit:5,howev:[5,6,7],scrutin:5,against:[5,6],etc:7,myiter:7,instanc:5,"__init__":[5,6,7],mani:3,whole:7,load:[5,7],simpli:5,technic:5,can:[0,1,2,4,5,7],instanti:[2,7,4],hyphen:3,ubuntu:1,period:7,walk:[2,7],header:7,rpc:5,duplic:5,coupl:0,delete_ent:5,empti:[5,7],github:[0,1,4,2],api_bas:5,json:7,interpret:7,objectacl:7,basic:[5,6,7],individu:0,popul:7,my_other_acl:7,valueerror:5,quickli:[2,7,4],some_other_acl:7,mind:0,getter:[5,6,7],convert:[5,7],argument:[5,6,7],bulk:5,reload_default_object_acl:7,craft:[5,7],understand:[5,6,7],togeth:[5,7],func:7,"catch":7,private_key_path:[5,2,7,6,4],those:[5,7],"case":5,ident:7,look:[5,0,4,7,3],plain:7,mount:7,properti:[0,7,5],easier:5,defin:[5,7],"while":7,kick:3,publicli:7,error:5,create_bucket:[2,7],get_next_page_respons:7,helper:[],demo:[2,4],non:7,get_metadata:7,itself:5,bulk_mut:5,notimplementederror:7,conn:5,mutat:5,build_api_url:[5,7],datetim:[5,7],rollback_transact:5,make:[3,7,5],belong:[5,7],has_metadata:7,same:[5,7],shorter:3,handl:[5,7],html:7,document:[0,6,7],infer:5,complet:[3,7,5],http:[3,7,6,5],context:5,referenc:7,nest:5,overriden:7,upon:5,effect:5,hand:3,capabl:[5,6,7],retriv:5,insert_auto_id:5,initi:[3,5],respons:[5,7],weird:3,run_queri:5,chunk_siz:7,appropri:[0,7],off:[3,7,5],com:[3,1,7,6,5],well:[5,7],person:[5,3,4],exampl:[5,2,4,7,3],coworker1:7,thi:[0,2,3,4,5,6,7],choos:3,everyth:1,usual:5,coworker2:7,identifi:[3,7,5],entri:[5,7],execut:5,when:[3,7,6,5],begin_transact:5,googleapi:[5,6,7],human:3,mysql:3,touch:7,patch_metadata:7,query_param:7,also:[5,7],get_acl:7,point:[5,7],except:[],shortcut:[5,2,7,4],add:[],is_valid:7,primit:7,els:[5,7],tell:3,save:[5,3,7,4],app:7,match:[5,7],take:[5,0,4,3],earli:7,applic:7,around:[6,7],format:5,read:[2,7,4],big:[],piec:7,api_vers:[5,7],know:5,world:5,password:3,recurs:7,mutuat:5,licens:0,insert:7,like:[3,7,5],specif:7,filenam:7,should:[5,0,7,6,2],manual:5,integ:5,integer_valu:5,from_dict:7,api:[],necessari:5,either:[0,7,5],corpor:0,manag:5,get_dataset:[5,3,6,4],www:[5,6],right:[3,5],deal:5,simplifi:[6,7],some:[],back:5,entity1:5,intern:5,refresh:7,proper:[5,7],query_pb:5,server:7,transport:[5,6,7],libssl:1,get_default_object_acl:7,per:[5,7],cast:5,buffer:7,exit:5,content_md5:7,testkind:5,onli:[5,6,7],refer:[5,7],machin:[5,7],who:7,run:[5,2,4],entity2:5,reload_acl:7,agreement:0,host:7,repositori:1,storagedataerror:7,immut:5,post:7,"throw":7,about:7,actual:[3,7,5],get_url:7,my_text_fil:7,nextpagetoken:7,acl:7,unsav:7,act:5,commit:5,disabl:7,id_or_nam:5,own:[5,0,4],primarili:0,new_kei:[2,7],"float":5,automat:[3,5],down:3,doesnt:7,been:[5,7],contributor:0,chang:[5,7],bool:[5,7],your:[],crypto:1,dataset1:5,dataset2:5,git:1,log:7,val:5,support:5,gcloud:[],"long":[3,7,5],custom:7,avail:[5,7,4],lost:3,reli:5,includ:[2,7,4],cowork:7,bucket1_nam:7,wrote:4,"function":5,properli:5,form:5,generate_signed_url:7,criteria:5,somehow:7,link:0,oauth:3,renam:3,role:7,"true":[5,7],reset:7,entitykind:5,oauth2:[5,6],full:7,possibl:[5,7],"default":[5,7],maximum:5,troubl:1,grant_writ:7,limit:5,get_all_kei:[2,7],otherwis:7,jumbl:5,constant:7,creat:[],"int":7,certain:[5,7],"abstract":5,delete_bucket:7,futur:7,doesn:7,repres:[5,7],exist:[5,7],file:[5,2,7,6,3],pip:[2,1,4],check:[2,7,6,4],probabl:[0,7],assembl:7,googl:[],hybrid:5,myexamplekind:4,field:7,other:[5,7],lookup:[5,7],librari:[],test:2,you:[0,1,2,3,4,5,6,7],roll:5,intend:3,my_other_kei:5,track:5,bucketiter:7,legal:0,assert:5,receiv:0,pycrypto:1,directori:7,client_email:[5,2,7,6,4],rule:[5,7],time:[3,7,5],far:5,fresh:7,scroll:3,keydataiter:7},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:function","5":"py:classmethod","6":"py:exception","7":"py:data"},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"],"5":["py","classmethod","Python class method"],"6":["py","exception","Python exception"],"7":["py","data","Python data"]},filenames:["index","getting-started","storage-quickstart","datastore-getting-started","datastore-quickstart","datastore-api","common-api","storage-api"],titles:["Google Cloud Python API","Getting started with gcloud","Cloud Storage in 10 seconds","Getting started with Cloud Datastore","Cloud Datastore in 10 seconds","Cloud Datastore","Cloud Common","Cloud Storage"],objects:{"gcloud.datastore.__init__":{SCOPE:[5,7,1,""],get_dataset:[5,4,1,""],get_connection:[5,4,1,""]},"gcloud.storage.key.Key":{patch_metadata:[7,2,1,""],reload_metadata:[7,2,1,""],exists:[7,2,1,""],get_metadata:[7,2,1,""],get_contents_as_string:[7,2,1,""],get_contents_to_filename:[7,2,1,""],get_acl:[7,2,1,""],has_metadata:[7,2,1,""],connection:[7,3,1,""],set_contents_from_filename:[7,2,1,""],CHUNK_SIZE:[7,3,1,""],set_contents_from_string:[7,2,1,""],save_acl:[7,2,1,""],generate_signed_url:[7,2,1,""],public_url:[7,3,1,""],reload_acl:[7,2,1,""],clear_acl:[7,2,1,""],path:[7,3,1,""],set_contents_from_file:[7,2,1,""],get_contents_to_file:[7,2,1,""],from_dict:[7,5,1,""],make_public:[7,2,1,""],"delete":[7,2,1,""]},"gcloud.credentials.Credentials":{get_for_service_account:[6,5,1,""]},"gcloud.datastore.helpers":{get_value_from_protobuf:[5,4,1,""],get_protobuf_attribute_and_value:[5,4,1,""]},"gcloud.storage.iterator.KeyIterator":{get_items_from_response:[7,2,1,""]},"gcloud.storage.bucket.Bucket":{patch_metadata:[7,2,1,""],reload_metadata:[7,2,1,""],copy_key:[7,2,1,""],get_metadata:[7,2,1,""],new_key:[7,2,1,""],get_default_object_acl:[7,2,1,""],get_acl:[7,2,1,""],has_metadata:[7,2,1,""],get_all_keys:[7,2,1,""],save_acl:[7,2,1,""],get_key:[7,2,1,""],reload_acl:[7,2,1,""],reload_default_object_acl:[7,2,1,""],delete_keys:[7,2,1,""],clear_acl:[7,2,1,""],clear_default_object_acl:[7,2,1,""],path:[7,3,1,""],configure_website:[7,2,1,""],upload_file:[7,2,1,""],save_default_object_acl:[7,2,1,""],from_dict:[7,5,1,""],delete_key:[7,2,1,""],make_public:[7,2,1,""],disable_website:[7,2,1,""],"delete":[7,2,1,""]},"gcloud.storage.acl.DefaultObjectACL":{save:[7,2,1,""]},"gcloud.storage.iterator.BucketIterator":{get_items_from_response:[7,2,1,""]},"gcloud.datastore.entity.Entity":{kind:[5,2,1,""],from_key:[5,5,1,""],dataset:[5,2,1,""],reload:[5,2,1,""],key:[5,2,1,""],from_protobuf:[5,5,1,""],save:[5,2,1,""],"delete":[5,2,1,""]},"gcloud.storage.acl.ACL.Role":{Owner:[7,3,1,""],Writer:[7,3,1,""],Reader:[7,3,1,""]},gcloud:{credentials:[6,0,0,"-"],connection:[6,0,0,"-"]},"gcloud.connection.Connection":{credentials:[6,3,1,""],http:[6,3,1,""],API_BASE_URL:[6,3,1,""]},"gcloud.storage.connection":{Connection:[7,1,1,""]},"gcloud.storage":{iterator:[7,0,0,"-"],bucket:[7,0,0,"-"],acl:[7,0,0,"-"],connection:[7,0,0,"-"],key:[7,0,0,"-"],exceptions:[7,0,0,"-"],"__init__":[7,0,0,"-"]},"gcloud.storage.__init__":{get_connection:[7,4,1,""],get_bucket:[7,4,1,""]},"gcloud.connection":{Connection:[6,1,1,""]},"gcloud.storage.iterator":{KeyDataIterator:[7,1,1,""],BucketIterator:[7,1,1,""],KeyIterator:[7,1,1,""],Iterator:[7,1,1,""]},"gcloud.storage.acl":{DefaultObjectACL:[7,1,1,""],ACL:[7,1,1,""],ObjectACL:[7,1,1,""],BucketACL:[7,1,1,""]},"gcloud.storage.iterator.KeyDataIterator":{reset:[7,2,1,""],get_next_chunk:[7,2,1,""],has_more_data:[7,2,1,""],get_headers:[7,2,1,""],get_url:[7,2,1,""]},"gcloud.datastore.query.Query":{kind:[5,2,1,""],OPERATORS:[5,3,1,""],dataset:[5,2,1,""],filter:[5,2,1,""],limit:[5,2,1,""],to_protobuf:[5,2,1,""],fetch:[5,2,1,""]},"gcloud.storage.acl.BucketACL":{save:[7,2,1,""]},"gcloud.datastore.key.Key":{kind:[5,2,1,""],is_partial:[5,2,1,""],name:[5,2,1,""],parent:[5,2,1,""],id_or_name:[5,2,1,""],namespace:[5,2,1,""],dataset:[5,2,1,""],from_path:[5,5,1,""],from_protobuf:[5,5,1,""],path:[5,2,1,""],to_protobuf:[5,2,1,""],id:[5,2,1,""]},"gcloud.datastore.connection":{Connection:[5,1,1,""]},"gcloud.datastore.dataset":{Dataset:[5,1,1,""]},"gcloud.storage.acl.ACL.Entity":{grant_write:[7,2,1,""],revoke:[7,2,1,""],revoke_write:[7,2,1,""],grant:[7,2,1,""],revoke_read:[7,2,1,""],grant_read:[7,2,1,""],grant_owner:[7,2,1,""],revoke_owner:[7,2,1,""],get_roles:[7,2,1,""]},"gcloud.datastore.key":{Key:[5,1,1,""]},"gcloud.datastore":{transaction:[5,0,0,"-"],dataset:[5,0,0,"-"],connection:[5,0,0,"-"],helpers:[5,0,0,"-"],key:[5,0,0,"-"],query:[5,0,0,"-"],entity:[5,0,0,"-"],"__init__":[5,0,0,"-"]},"gcloud.datastore.dataset.Dataset":{transaction:[5,2,1,""],get_entities:[5,2,1,""],entity:[5,2,1,""],get_entity:[5,2,1,""],connection:[5,2,1,""],query:[5,2,1,""],id:[5,2,1,""]},"gcloud.datastore.transaction":{Transaction:[5,1,1,""]},"gcloud.storage.connection.Connection":{get_all_buckets:[7,2,1,""],create_bucket:[7,2,1,""],build_api_url:[7,2,1,""],generate_signed_url:[7,2,1,""],delete_bucket:[7,2,1,""],lookup:[7,2,1,""],API_URL_TEMPLATE:[7,3,1,""],API_ACCESS_ENDPOINT:[7,3,1,""],api_request:[7,2,1,""],new_bucket:[7,2,1,""],get_bucket:[7,2,1,""],make_request:[7,2,1,""],API_VERSION:[7,3,1,""]},"gcloud.storage.bucket":{Bucket:[7,1,1,""]},"gcloud.storage.iterator.Iterator":{reset:[7,2,1,""],get_items_from_response:[7,2,1,""],get_next_page_response:[7,2,1,""],get_query_params:[7,2,1,""],has_next_page:[7,2,1,""]},"gcloud.datastore.connection.Connection":{delete_entity:[5,2,1,""],rollback_transaction:[5,2,1,""],transaction:[5,2,1,""],http:[5,3,1,""],build_api_url:[5,5,1,""],delete_entities:[5,2,1,""],save_entity:[5,2,1,""],run_query:[5,2,1,""],API_URL_TEMPLATE:[5,3,1,""],lookup:[5,2,1,""],mutation:[5,2,1,""],commit:[5,2,1,""],dataset:[5,2,1,""],API_BASE_URL:[5,3,1,""],API_VERSION:[5,3,1,""],begin_transaction:[5,2,1,""]},"gcloud.datastore.query":{Query:[5,1,1,""]},"gcloud.datastore.transaction.Transaction":{begin:[5,2,1,""],rollback:[5,2,1,""],add_auto_id_entity:[5,2,1,""],dataset:[5,2,1,""],connection:[5,2,1,""],mutation:[5,2,1,""],commit:[5,2,1,""],id:[5,2,1,""]},"gcloud.credentials":{Credentials:[6,1,1,""]},"gcloud.storage.acl.ACL":{domain:[7,2,1,""],group:[7,2,1,""],entity_from_dict:[7,2,1,""],all:[7,2,1,""],get_entities:[7,2,1,""],Entity:[7,1,1,""],get_entity:[7,2,1,""],has_entity:[7,2,1,""],user:[7,2,1,""],entity:[7,2,1,""],Role:[7,1,1,""],save:[7,2,1,""],all_authenticated:[7,2,1,""],add_entity:[7,2,1,""]},"gcloud.storage.exceptions":{StorageError:[7,6,1,""],NotFoundError:[7,6,1,""],ConnectionError:[7,6,1,""],StorageDataError:[7,6,1,""]},"gcloud.datastore.entity":{Entity:[5,1,1,""]},"gcloud.storage.acl.ObjectACL":{save:[7,2,1,""]},"gcloud.storage.key":{Key:[7,1,1,""]}},titleterms:{control:7,comput:0,helper:5,queri:[0,5],modul:0,some:3,dataset:[3,5],second:[2,4],api:[0,3],connect:[5,6,7],instal:[2,1,4],storag:[0,7,2],your:3,cloud:[0,2,3,4,5,6,7],entiti:5,"try":[2,4],engin:0,creat:3,how:0,bucket:7,transact:5,gcloud:[5,1,7],except:7,access:7,start:[0,1,3],add:3,librari:[2,4],contribut:0,kei:[5,7],get:[0,1,3],python:0,big:0,sql:0,datastor:[5,0,4,3],yourself:[2,4],data:3,googl:0,account:3,enabl:3,servic:[0,3],credenti:6,iter:7,project:3,common:[0,6]}})
\ No newline at end of file
diff --git a/storage-api.html b/storage-api.html
index 0bb1dab18689..77d719199352 100644
--- a/storage-api.html
+++ b/storage-api.html
@@ -251,6 +251,11 @@ Cloud Storage