Add .delete() to all Storages.
Reviewed in http://codereview.appspot.com/5608049/.
diff --git a/oauth2client/appengine.py b/oauth2client/appengine.py
index e4169e9..f97ce69 100644
--- a/oauth2client/appengine.py
+++ b/oauth2client/appengine.py
@@ -263,6 +263,16 @@
if self._cache:
self._cache.set(self._key_name, credentials.to_json())
+ def locked_delete(self):
+ """Delete Credential from datastore."""
+
+ if self._cache:
+ self._cache.delete(self._key_name)
+
+ entity = self._model.get_by_key_name(self._key_name)
+ if entity is not None:
+ entity.delete()
+
class CredentialsModel(db.Model):
"""Storage for OAuth 2.0 Credentials
diff --git a/oauth2client/client.py b/oauth2client/client.py
index 2d60f5a..f492563 100644
--- a/oauth2client/client.py
+++ b/oauth2client/client.py
@@ -224,6 +224,13 @@
"""
_abstract()
+ def locked_delete(self):
+ """Delete a credential.
+
+ The Storage lock must be held when this is called.
+ """
+ _abstract()
+
def get(self):
"""Retrieve credential.
@@ -252,6 +259,21 @@
finally:
self.release_lock()
+ def delete(self):
+ """Delete credential.
+
+ Frees any resources associated with storing the credential.
+ The Storage lock must *not* be held when this is called.
+
+ Returns:
+ None
+ """
+ self.acquire_lock()
+ try:
+ return self.locked_delete()
+ finally:
+ self.release_lock()
+
class OAuth2Credentials(Credentials):
"""Credentials object for OAuth 2.0.
diff --git a/oauth2client/file.py b/oauth2client/file.py
index d71e888..1abc6d2 100644
--- a/oauth2client/file.py
+++ b/oauth2client/file.py
@@ -85,7 +85,6 @@
finally:
os.umask(old_umask)
-
def locked_put(self, credentials):
"""Write Credentials to file.
@@ -97,3 +96,12 @@
f = open(self._filename, 'wb')
f.write(credentials.to_json())
f.close()
+
+ def locked_delete(self):
+ """Delete Credentials file.
+
+ Args:
+ credentials: Credentials, the credentials to store.
+ """
+
+ os.unlink(self._filename)
diff --git a/oauth2client/multistore_file.py b/oauth2client/multistore_file.py
index d9b89c8..1f756c7 100644
--- a/oauth2client/multistore_file.py
+++ b/oauth2client/multistore_file.py
@@ -159,6 +159,17 @@
"""
self._multistore._update_credential(credentials, self._scope)
+ def locked_delete(self):
+ """Delete a credential.
+
+ The Storage lock must be held when this is called.
+
+ Args:
+ credentials: Credentials, the credentials to store.
+ """
+ self._multistore._delete_credential(self._client_id, self._user_agent,
+ self._scope)
+
def _create_file_if_needed(self):
"""Create an empty file if necessary.
@@ -344,6 +355,23 @@
self._data[key] = cred
self._write()
+ def _delete_credential(self, client_id, user_agent, scope):
+ """Delete a credential and write the multistore.
+
+ This must be called when the multistore is locked.
+
+ Args:
+ client_id: The client_id for the credential
+ user_agent: The user agent for the credential
+ scope: The scope(s) that this credential covers
+ """
+ key = (client_id, user_agent, scope)
+ try:
+ del self._data[key]
+ except KeyError:
+ pass
+ self._write()
+
def _get_storage(self, client_id, user_agent, scope):
"""Get a Storage object to get/set a credential.