Skip to content
This repository was archived by the owner on May 5, 2025. It is now read-only.

Commit 5ecdda3

Browse files
authored
Add support for custom read/write credentials path (#90)
1 parent d6aef1b commit 5ecdda3

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ python:
2323
- 2.7
2424
script:
2525
- tox
26-
- coverage run --source pancloud -m py.test
26+
- coverage run --source pancloud -m py.test --ignore=examples
2727
- coverage report -m
2828

2929
# safelist

pancloud/adapters/tinydb_adapter.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
class TinyDBStore(StorageAdapter):
1616

17-
def __init__(self):
17+
def __init__(self, **kwargs):
18+
self._storage_params = kwargs.get('storage_params') or {}
19+
self.dbfile = self._storage_params.get('dbfile')
1820
self.query = Query()
1921
self.db = self.init_store()
2022
self.lock = RLock()
@@ -35,17 +37,22 @@ def fetch_credential(self, credential=None, profile=None):
3537
return q.get(credential)
3638

3739
def init_store(self):
38-
path = os.path.join(
39-
os.path.expanduser('~'), '.config', 'pancloud',
40-
'credentials.json'
41-
)
42-
if not os.path.exists(os.path.dirname(path)):
40+
if self.dbfile:
41+
dbfile = self.dbfile
42+
elif os.getenv('PAN_CREDENTIALS_DBFILE'):
43+
dbfile = os.getenv('PAN_CREDENTIALS_DBFILE')
44+
else:
45+
dbfile = os.path.join(
46+
os.path.expanduser('~'), '.config', 'pancloud',
47+
'credentials.json'
48+
)
49+
if not os.path.exists(os.path.dirname(dbfile)):
4350
try:
44-
os.makedirs(os.path.dirname(path), 0o700)
51+
os.makedirs(os.path.dirname(dbfile), 0o700)
4552
except OSError as e:
4653
raise PanCloudError("{}".format(e))
4754
return TinyDB(
48-
path, sort_keys=True, indent=4,
55+
dbfile, sort_keys=True, indent=4,
4956
default_table='profiles'
5057
)
5158

pancloud/credentials.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ def __init__(self, access_token=None, auth_base_url=None, cache_token=True,
3232
client_id=None, client_secret=None, instance_id=None,
3333
profile=None, redirect_uri=None, region=None,
3434
refresh_token=None, scope=None, storage_adapter=None,
35-
token_url=None, token_revoke_url=None, **kwargs):
35+
storage_params=None, token_url=None, token_revoke_url=None,
36+
**kwargs):
3637
"""Persist Session() and credentials attributes.
3738
3839
Built on top of the ``Requests`` library, ``Credentials``
@@ -59,6 +60,7 @@ def __init__(self, access_token=None, auth_base_url=None, cache_token=True,
5960
region (str): Region. Defaults to ``None``.
6061
refresh_token (str): OAuth2 refresh token. Defaults to ``None``.
6162
scope (str): OAuth2 scope. Defaults to ``None``.
63+
storage_params (dict) = Storage adapter parameters. Defaults to ``None``.
6264
token_url (str): Refresh URL. Defaults to ``None``.
6365
token_revoke_url (str): Revoke URL. Defaults to ``None``.
6466
**kwargs: Supported :class:`~requests.Session` parameters.
@@ -78,7 +80,7 @@ def __init__(self, access_token=None, auth_base_url=None, cache_token=True,
7880
self.state = uuid.uuid4()
7981
self.adapter = storage_adapter or \
8082
'pancloud.adapters.tinydb_adapter.TinyDBStore'
81-
self.storage = self._init_adapter()
83+
self.storage = self._init_adapter(storage_params)
8284
self.token_lock = Lock()
8385
self.token_url = token_url or TOKEN_URL
8486
self.token_revoke_url = token_revoke_url or REVOKE_URL
@@ -149,7 +151,7 @@ def _credentials_found_in_envars():
149151
os.getenv('PAN_CLIENT_SECRET'),
150152
os.getenv('PAN_REFRESH_TOKEN')])
151153

152-
def _init_adapter(self):
154+
def _init_adapter(self, storage_params=None):
153155
module_path = self.adapter.rsplit('.', 1)[0]
154156
adapter = self.adapter.split('.')[-1]
155157
try:
@@ -163,7 +165,7 @@ def _init_adapter(self):
163165
except AttributeError:
164166
raise PanCloudError('Class not found: %s' % adapter)
165167

166-
return class_ # Returns 'TinyDBStore' as class
168+
return class_(storage_params=storage_params)
167169

168170
def _resolve_credential(self, credential):
169171
"""Resolve credential from envars or credentials store.
@@ -180,7 +182,7 @@ def _resolve_credential(self, credential):
180182
elif self._credentials_found_in_envars():
181183
return os.getenv('PAN_' + credential.upper())
182184
else:
183-
return self.storage().fetch_credential(
185+
return self.storage.fetch_credential(
184186
credential=credential, profile=self.profile)
185187

186188
def fetch_tokens(self, client_id=None, client_secret=None, code=None,
@@ -289,7 +291,7 @@ def remove_profile(self, profile):
289291
int: Result of operation.
290292
291293
"""
292-
return self.storage().remove_profile(profile=profile)
294+
return self.storage.remove_profile(profile=profile)
293295

294296
def refresh(self, timeout=None, access_token=None):
295297
"""Refresh access and refresh tokens.
@@ -391,7 +393,7 @@ def write_credentials(self):
391393
392394
"""
393395
c = self.get_credentials()
394-
return self.storage().write_credentials(
396+
return self.storage.write_credentials(
395397
credentials=c, profile=self.profile,
396398
cache_token=self.cache_token_
397399
)

0 commit comments

Comments
 (0)