config: Add Config.config_file_path() method.
This commit is contained in:
parent
24813a9b81
commit
a156617b4d
2 changed files with 40 additions and 4 deletions
|
@ -69,6 +69,11 @@ class RTCredentials(NamedTuple):
|
||||||
|
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
|
_ENVIRON_DEFAULT_PATHS = {
|
||||||
|
'XDG_CACHE_HOME': Path('.cache'),
|
||||||
|
'XDG_CONFIG_HOME': Path('.config'),
|
||||||
|
}
|
||||||
|
|
||||||
def _dir_or_none(self, path: Path) -> Optional[Path]:
|
def _dir_or_none(self, path: Path) -> Optional[Path]:
|
||||||
try:
|
try:
|
||||||
path.mkdir(exist_ok=True)
|
path.mkdir(exist_ok=True)
|
||||||
|
@ -77,21 +82,29 @@ class Config:
|
||||||
else:
|
else:
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def cache_dir_path(self, name: str='conservancy_beancount') -> Optional[Path]:
|
def _path_from_environ(self, key: str, default: Optional[Path]=None) -> Path:
|
||||||
try:
|
try:
|
||||||
cache_root = Path(os.environ['XDG_CACHE_HOME'])
|
retval = Path(os.environ[key])
|
||||||
except (KeyError, ValueError):
|
except (KeyError, ValueError):
|
||||||
ok = False
|
ok = False
|
||||||
else:
|
else:
|
||||||
# Per the spec, non-absolute paths should be ignored.
|
# Per the spec, non-absolute paths should be ignored.
|
||||||
ok = cache_root.is_absolute()
|
ok = retval.is_absolute()
|
||||||
if not ok:
|
if not ok:
|
||||||
cache_root = Path.home() / '.cache'
|
retval = default or (Path.home() / self._ENVIRON_DEFAULT_PATHS[key])
|
||||||
|
return retval
|
||||||
|
|
||||||
|
def cache_dir_path(self, name: str='conservancy_beancount') -> Optional[Path]:
|
||||||
|
cache_root = self._path_from_environ('XDG_CACHE_HOME')
|
||||||
return (
|
return (
|
||||||
self._dir_or_none(cache_root)
|
self._dir_or_none(cache_root)
|
||||||
and self._dir_or_none(cache_root / name)
|
and self._dir_or_none(cache_root / name)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def config_file_path(self, name: str='conservancy_beancount') -> Path:
|
||||||
|
config_root = self._path_from_environ('XDG_CONFIG_HOME')
|
||||||
|
return Path(config_root, name, 'config.ini')
|
||||||
|
|
||||||
def payment_threshold(self) -> decimal.Decimal:
|
def payment_threshold(self) -> decimal.Decimal:
|
||||||
return decimal.Decimal(0)
|
return decimal.Decimal(0)
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ import decimal
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from . import testutil
|
from . import testutil
|
||||||
|
@ -294,3 +296,24 @@ def test_payment_threshold():
|
||||||
threshold = config_mod.Config().payment_threshold()
|
threshold = config_mod.Config().payment_threshold()
|
||||||
assert threshold == 0
|
assert threshold == 0
|
||||||
assert isinstance(threshold, (int, decimal.Decimal))
|
assert isinstance(threshold, (int, decimal.Decimal))
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('config_path', [
|
||||||
|
None,
|
||||||
|
'',
|
||||||
|
'nonexistent/relative/path',
|
||||||
|
])
|
||||||
|
def test_config_file_path(config_path):
|
||||||
|
expected = Path('~/.config/conservancy_beancount/config.ini').expanduser()
|
||||||
|
with update_environ(XDG_CONFIG_HOME=config_path):
|
||||||
|
config = config_mod.Config()
|
||||||
|
assert config.config_file_path() == expected
|
||||||
|
|
||||||
|
def test_config_file_path_respects_xdg_config_home():
|
||||||
|
with update_environ(XDG_CONFIG_HOME='/etc'):
|
||||||
|
config = config_mod.Config()
|
||||||
|
assert config.config_file_path() == Path('/etc/conservancy_beancount/config.ini')
|
||||||
|
|
||||||
|
def test_config_file_path_with_subdir():
|
||||||
|
expected = Path('~/.config/conftest/config.ini').expanduser()
|
||||||
|
config = config_mod.Config()
|
||||||
|
assert config.config_file_path('conftest') == expected
|
||||||
|
|
Loading…
Reference in a new issue