config: Add RTCredentials.idstr() method.
Want to reuse this code for a query-report cache key.
This commit is contained in:
parent
1c71d7c6e1
commit
9e33b2795c
2 changed files with 25 additions and 5 deletions
|
@ -65,6 +65,18 @@ class RTCredentials(NamedTuple):
|
||||||
else:
|
else:
|
||||||
return cls(**values)
|
return cls(**values)
|
||||||
|
|
||||||
|
def idstr(self) -> str:
|
||||||
|
"""Return a string unique to these credentials
|
||||||
|
|
||||||
|
This returns a string that incorporates the server URL and user.
|
||||||
|
The string will be unique across different credentials.
|
||||||
|
It's suitable for use as a cache key or filename.
|
||||||
|
"""
|
||||||
|
return '{}@{}'.format(
|
||||||
|
self.user or '',
|
||||||
|
urlparse.quote(self.server or '', ''),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
_ENVIRON_DEFAULT_PATHS = {
|
_ENVIRON_DEFAULT_PATHS = {
|
||||||
|
@ -209,11 +221,7 @@ class Config:
|
||||||
if cache_dir_path is None:
|
if cache_dir_path is None:
|
||||||
cache_db = None
|
cache_db = None
|
||||||
else:
|
else:
|
||||||
cache_name = '{}@{}.sqlite3'.format(
|
cache_path = cache_dir_path / f'{credentials.idstr()}.sqlite3'
|
||||||
credentials.user,
|
|
||||||
urlparse.quote(str(credentials.server), ''),
|
|
||||||
)
|
|
||||||
cache_path = cache_dir_path / cache_name
|
|
||||||
try:
|
try:
|
||||||
cache_path.touch(0o600)
|
cache_path.touch(0o600)
|
||||||
except OSError:
|
except OSError:
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
import decimal
|
import decimal
|
||||||
|
import itertools
|
||||||
import operator
|
import operator
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
@ -140,6 +141,17 @@ def test_rt_credentials_from_all_sources_mixed(tmp_path):
|
||||||
rt_credentials = config.rt_credentials()
|
rt_credentials = config.rt_credentials()
|
||||||
assert rt_credentials == (server, 'mixedup', 'mixed up', 'rt')
|
assert rt_credentials == (server, 'mixedup', 'mixed up', 'rt')
|
||||||
|
|
||||||
|
def test_rt_credentials_idstr():
|
||||||
|
actual = {
|
||||||
|
config_mod.RTCredentials(server, user).idstr()
|
||||||
|
for server, user in itertools.product(
|
||||||
|
[None, 'https://example.org/rt'],
|
||||||
|
[None, 'example'],
|
||||||
|
)}
|
||||||
|
assert len(actual) == 4
|
||||||
|
for idstr in actual:
|
||||||
|
assert '/' not in idstr
|
||||||
|
|
||||||
def check_rt_client_url(credentials, client):
|
def check_rt_client_url(credentials, client):
|
||||||
pattern = '^{}/?$'.format(re.escape(credentials[0].rstrip('/') + '/REST/1.0'))
|
pattern = '^{}/?$'.format(re.escape(credentials[0].rstrip('/') + '/REST/1.0'))
|
||||||
assert re.match(pattern, client.url)
|
assert re.match(pattern, client.url)
|
||||||
|
|
Loading…
Reference in a new issue