Add default values for conf
This commit is contained in:
parent
076f676f4f
commit
cbe843220a
4 changed files with 39 additions and 24 deletions
|
|
@ -12,9 +12,7 @@ logger = get_logger("ConfigFile")
|
|||
|
||||
|
||||
class ConfigFile:
|
||||
def __init__(
|
||||
self, path: Union[Path, str], ignore_missing_environment_variables: bool = False
|
||||
) -> None:
|
||||
def __init__(self, path: Union[Path, str]) -> None:
|
||||
if not isinstance(path, Path):
|
||||
path = Path(path)
|
||||
|
||||
|
|
@ -22,9 +20,6 @@ class ConfigFile:
|
|||
raise FileNotFoundError(path.absolute())
|
||||
|
||||
self._path = path
|
||||
self._ignore_missing_environment_variables = (
|
||||
ignore_missing_environment_variables
|
||||
)
|
||||
self._key_values: Dict[str, str] = {}
|
||||
|
||||
self._parse()
|
||||
|
|
@ -35,11 +30,6 @@ class ConfigFile:
|
|||
|
||||
matches = pattern.findall(lines)
|
||||
for key, *values in matches:
|
||||
if key in self._key_values:
|
||||
raise KeyError(
|
||||
f"Key `{key}` has been already defined and its value is `{self._key_values[key]}`"
|
||||
)
|
||||
|
||||
try:
|
||||
value = next(v for v in values if v)
|
||||
except StopIteration:
|
||||
|
|
@ -47,15 +37,29 @@ class ConfigFile:
|
|||
f"Cannot parse config file ({self._path.absolute()}), error at key `{key}`"
|
||||
)
|
||||
|
||||
already_exists = key in self._key_values
|
||||
if already_exists and not value.startswith(
|
||||
f"{ENVIRONMENT_VARIABLE_KEY_PREFIX}:"
|
||||
):
|
||||
raise KeyError(
|
||||
f"Key `{key}` has been already defined and its value is `{self._key_values[key]}`"
|
||||
)
|
||||
|
||||
if value.startswith(f"{ENVIRONMENT_VARIABLE_KEY_PREFIX}:"):
|
||||
_, value = value.split(":")
|
||||
if value not in os.environ:
|
||||
issue = f'The value of `{key}` contains the "{ENVIRONMENT_VARIABLE_KEY_PREFIX}` prefix but `{value}` is not defined as an environment variable'
|
||||
if self._ignore_missing_environment_variables:
|
||||
logger.warning(f"{issue}, defaulting to `None`")
|
||||
if already_exists:
|
||||
logger.warning(
|
||||
f"{issue}, using the default value defined above (`{self._key_values[key]}`)"
|
||||
)
|
||||
continue
|
||||
else:
|
||||
raise KeyError(issue)
|
||||
value = os.environ[value]
|
||||
raise KeyError(
|
||||
f"{issue} and no default value has been provided"
|
||||
)
|
||||
else:
|
||||
value = os.environ[value]
|
||||
|
||||
self._key_values[key] = value
|
||||
|
||||
|
|
@ -84,4 +88,4 @@ class ConfigFile:
|
|||
return self._key_values.items()
|
||||
|
||||
def __repr__(self):
|
||||
return f"{type(self).__name__}(\n path={self._path},\n ignore_missing_environment_variables={self._ignore_missing_environment_variables}\n) {{{self._key_values}}}"
|
||||
return f"{type(self).__name__}(path={self._path}) {self._key_values}"
|
||||
|
|
|
|||
2
tests/utilities/data/env-bad.conf
Normal file
2
tests/utilities/data/env-bad.conf
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
fourth_key = ENV:SOMETHING
|
||||
|
|
@ -3,3 +3,6 @@ first_key=test
|
|||
|
||||
second_key="ENV:alma"
|
||||
third_key = ENV:alma
|
||||
|
||||
fourth_key="this is a default value" # will fall back to this if ENV is not defined
|
||||
fourth_key = ENV:SOMETHING
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import os
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
|
@ -62,8 +63,6 @@ multiline
|
|||
assert c.whitespace == "hardly matters"
|
||||
|
||||
def test_env(self) -> None:
|
||||
import os
|
||||
|
||||
os.environ["alma"] = "12"
|
||||
c = ConfigFile(DATA_PATH / "env.conf")
|
||||
del os.environ["alma"]
|
||||
|
|
@ -72,13 +71,20 @@ multiline
|
|||
|
||||
def test_env_not_exists(self) -> None:
|
||||
with pytest.raises(KeyError):
|
||||
ConfigFile(DATA_PATH / "env.conf")
|
||||
ConfigFile(DATA_PATH / "env-bad.conf")
|
||||
|
||||
def test_env_not_exists_but_ignored(self) -> None:
|
||||
with pytest.raises(KeyError):
|
||||
ConfigFile(
|
||||
DATA_PATH / "env.conf", ignore_missing_environment_variables=True
|
||||
)
|
||||
def test_env_not_exists_fallback(self) -> None:
|
||||
os.environ["alma"] = "12"
|
||||
c = ConfigFile(DATA_PATH / "env.conf")
|
||||
assert c.fourth_key == "this is a default value"
|
||||
|
||||
def test_env_exists_ignore_fallback(self) -> None:
|
||||
os.environ["alma"] = "12"
|
||||
os.environ["SOMETHING"] = "hi"
|
||||
c = ConfigFile(DATA_PATH / "env.conf")
|
||||
del os.environ["SOMETHING"]
|
||||
|
||||
assert c.fourth_key == "hi"
|
||||
|
||||
def test_duplicate_key(self) -> None:
|
||||
with pytest.raises(KeyError):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue