Skip to content
This repository has been archived by the owner on Nov 5, 2019. It is now read-only.

Moving locking logic into storage base class. #379

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions oauth2client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,21 +346,31 @@ class Storage(object):
such that multiple processes and threads can operate on a single
store.
"""
def __init__(self, lock=None):
"""Create a Storage instance.

Args:
lock: An optional threading.Lock-like object. Must implement at
least acquire() and release(). Does not need to be re-entrant.
"""
self._lock = lock

def acquire_lock(self):
"""Acquires any lock necessary to access this Storage.

This lock is not reentrant.
"""
pass
if self._lock is not None:
self._lock.acquire()

def release_lock(self):
"""Release the Storage lock.

Trying to release a lock that isn't held will result in a
RuntimeError.
RuntimeError in the case of a threading.Lock or multiprocessing.Lock.
"""
pass
if self._lock is not None:
self._lock.release()

def locked_get(self):
"""Retrieve credential.
Expand Down
2 changes: 2 additions & 0 deletions oauth2client/contrib/appengine.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,8 @@ def __init__(self, model, key_name, property_name, cache=None, user=None):
user: users.User object, optional. Can be used to grab user ID as a
key_name if no key name is specified.
"""
super(StorageByKeyName, self).__init__()

if key_name is None:
if user is None:
raise ValueError('StorageByKeyName called with no '
Expand Down
1 change: 1 addition & 0 deletions oauth2client/contrib/django_orm.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ def __init__(self, model_class, key_name, key_value, property_name):
property_name: string, name of the property that is an
CredentialsProperty
"""
super(Storage, self).__init__()
self.model_class = model_class
self.key_name = key_name
self.key_value = key_value
Expand Down
1 change: 1 addition & 0 deletions oauth2client/contrib/django_util/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class DjangoSessionStorage(client.Storage):
"""Storage implementation that uses Django sessions."""

def __init__(self, session):
super(DjangoSessionStorage, self).__init__()
self.session = session

def locked_get(self):
Expand Down
17 changes: 1 addition & 16 deletions oauth2client/contrib/keyring_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,24 +59,9 @@ def __init__(self, service_name, user_name):
credentials are stored.
user_name: string, The name of the user to store credentials for.
"""
super(Storage, self).__init__(lock=threading.Lock())
self._service_name = service_name
self._user_name = user_name
self._lock = threading.Lock()

def acquire_lock(self):
"""Acquires any lock necessary to access this Storage.

This lock is not reentrant.
"""
self._lock.acquire()

def release_lock(self):
"""Release the Storage lock.

Trying to release a lock that isn't held will result in a
RuntimeError.
"""
self._lock.release()

def locked_get(self):
"""Retrieve Credential from file.
Expand Down
17 changes: 1 addition & 16 deletions oauth2client/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,29 +36,14 @@ class Storage(BaseStorage):
"""Store and retrieve a single credential to and from a file."""

def __init__(self, filename):
super(Storage, self).__init__(lock=threading.Lock())
self._filename = filename
self._lock = threading.Lock()

def _validate_file(self):
if os.path.islink(self._filename):
raise CredentialsFileSymbolicLinkError(
'File: %s is a symbolic link.' % self._filename)

def acquire_lock(self):
"""Acquires any lock necessary to access this Storage.

This lock is not reentrant.
"""
self._lock.acquire()

def release_lock(self):
"""Release the Storage lock.

Trying to release a lock that isn't held will result in a
RuntimeError.
"""
self._lock.release()

def locked_get(self):
"""Retrieve Credential from file.

Expand Down