Add default values for conf

This commit is contained in:
Andras Schmelczer 2022-07-01 22:42:31 +02:00
parent 40aee01119
commit 64b8717a1b
No known key found for this signature in database
GPG key ID: 0EA1BC97D0AB076E
4 changed files with 39 additions and 24 deletions

View file

@ -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}"

View file

@ -0,0 +1,2 @@
fourth_key = ENV:SOMETHING

View file

@ -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

View file

@ -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):