From 9e33b2795ca55c37c302edc18aa1660791d67ac0 Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Wed, 10 Mar 2021 10:37:21 -0500 Subject: [PATCH] config: Add RTCredentials.idstr() method. Want to reuse this code for a query-report cache key. --- conservancy_beancount/config.py | 18 +++++++++++++----- tests/test_config.py | 12 ++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/conservancy_beancount/config.py b/conservancy_beancount/config.py index fd9f278..95d763e 100644 --- a/conservancy_beancount/config.py +++ b/conservancy_beancount/config.py @@ -65,6 +65,18 @@ class RTCredentials(NamedTuple): else: 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: _ENVIRON_DEFAULT_PATHS = { @@ -209,11 +221,7 @@ class Config: if cache_dir_path is None: cache_db = None else: - cache_name = '{}@{}.sqlite3'.format( - credentials.user, - urlparse.quote(str(credentials.server), ''), - ) - cache_path = cache_dir_path / cache_name + cache_path = cache_dir_path / f'{credentials.idstr()}.sqlite3' try: cache_path.touch(0o600) except OSError: diff --git a/tests/test_config.py b/tests/test_config.py index efa2ad8..d124ede 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -7,6 +7,7 @@ import contextlib import decimal +import itertools import operator import os import re @@ -140,6 +141,17 @@ def test_rt_credentials_from_all_sources_mixed(tmp_path): rt_credentials = config.rt_credentials() 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): pattern = '^{}/?$'.format(re.escape(credentials[0].rstrip('/') + '/REST/1.0')) assert re.match(pattern, client.url)