Add DictionaryStorage class for #319. #344
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
oauth2client.dictionary_storage module | ||
====================================== | ||
|
||
.. automodule:: oauth2client.dictionary_storage | ||
:members: | ||
:undoc-members: | ||
:show-inheritance: |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
oauth2client.locked_storage module | ||
================================== | ||
|
||
.. automodule:: oauth2client.locked_storage | ||
:members: | ||
:undoc-members: | ||
:show-inheritance: |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
# Copyright 2014 Google Inc. All rights reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
"""Dictionary storage for OAuth2 Credentials.""" | ||
|
||
from oauth2client.client import OAuth2Credentials | ||
from oauth2client.client import Storage | ||
|
||
|
||
class DictionaryStorage(Storage): | ||
"""Store and retrieve credentials to and from a dictionary-like object.""" | ||
|
||
def __init__(self, dictionary, key, lock=None): | ||
"""Construct a DictionaryStorage instance. | ||
|
||
Args: | ||
dictionary: A dictionary or dictionary-like object. | ||
key: A hashable or a function returning a hashable. The credentials | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
will be stored in ``dictionary[key]``. | ||
lock: An optional threading.Lock-like object. The lock will be | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
acquired before anything is written or read from the | ||
dictionary. | ||
""" | ||
super(DictionaryStorage, self).__init__(lock=lock) | ||
self._dictionary = dictionary | ||
self._key = key | ||
|
||
def _get_key(self): | ||
"""Return the key for storing the credentials. | ||
|
||
If self._key is a callable, it will return the result of calling | ||
self._key. | ||
""" | ||
if callable(self._key): | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
return self._key() | ||
else: | ||
return self._key | ||
|
||
def locked_get(self): | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
"""Retrieve the credentials from the dictionary, if they exist.""" | ||
key = self._get_key() | ||
serialized = self._dictionary.get(key) | ||
|
||
if serialized is None: | ||
return None | ||
|
||
credentials = OAuth2Credentials.from_json(serialized) | ||
credentials.set_store(self) | ||
|
||
return credentials | ||
|
||
def locked_put(self, credentials): | ||
"""Save the credentials to the dictionary.""" | ||
key = self._get_key() | ||
serialized = credentials.to_json() | ||
self._dictionary[key] = serialized | ||
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong. |
||
|
||
def locked_delete(self): | ||
"""Remove the credentials from the dictionary, if they exist.""" | ||
key = self._get_key() | ||
self._dictionary.pop(key, None) | ||
This comment was marked as spam.
Sorry, something went wrong. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# Copyright 2014 Google Inc. All rights reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
"""Unit tests for oauth2client.dictionary_storage""" | ||
|
||
import unittest | ||
|
||
from oauth2client import GOOGLE_TOKEN_URI | ||
from oauth2client.client import OAuth2Credentials | ||
from oauth2client.dictionary_storage import DictionaryStorage | ||
|
||
|
||
__author__ = 'jonwayne@google.com (Jon Wayne Parrott)' | ||
|
||
|
||
class DictionaryStorageTests(unittest.TestCase): | ||
|
||
def _generate_credentials(self, scopes=None): | ||
return OAuth2Credentials( | ||
'access_tokenz', | ||
'client_idz', | ||
'client_secretz', | ||
'refresh_tokenz', | ||
'3600', | ||
GOOGLE_TOKEN_URI, | ||
'Test', | ||
id_token={ | ||
'sub': '123', | ||
'email': 'user@example.com' | ||
}, | ||
scopes=scopes) | ||
|
||
def test_string_key(self): | ||
dictionary = {} | ||
key = 'credentials' | ||
credentials = self._generate_credentials() | ||
storage = DictionaryStorage(dictionary, key) | ||
|
||
storage.put(credentials) | ||
|
||
self.assertTrue(key in dictionary) | ||
|
||
retrieved = storage.get() | ||
|
||
self.assertEqual(retrieved.access_token, credentials.access_token) | ||
|
||
storage.delete() | ||
|
||
self.assertTrue(key not in dictionary) | ||
self.assertTrue(storage.get() is None) | ||
|
||
def test_function_key(self): | ||
dictionary = {} | ||
key = 'credentials' | ||
credentials = self._generate_credentials() | ||
storage = DictionaryStorage(dictionary, lambda: key) | ||
|
||
storage.put(credentials) | ||
|
||
self.assertTrue(key in dictionary) | ||
|
||
retrieved = storage.get() | ||
|
||
self.assertEqual(retrieved.access_token, credentials.access_token) | ||
|
||
storage.delete() | ||
|
||
self.assertTrue(key not in dictionary) | ||
self.assertTrue(storage.get() is None) | ||
|
||
|
||
if __name__ == '__main__': # pragma: NO COVER | ||
unittest.main() |
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
Sorry, something went wrong.