Add default values for conf

This commit is contained in:
Andras Schmelczer 2022-07-01 22:42:31 +02:00
parent 076f676f4f
commit cbe843220a
4 changed files with 39 additions and 24 deletions

View file

@ -12,9 +12,7 @@ logger = get_logger("ConfigFile")
class ConfigFile: class ConfigFile:
def __init__( def __init__(self, path: Union[Path, str]) -> None:
self, path: Union[Path, str], ignore_missing_environment_variables: bool = False
) -> None:
if not isinstance(path, Path): if not isinstance(path, Path):
path = Path(path) path = Path(path)
@ -22,9 +20,6 @@ class ConfigFile:
raise FileNotFoundError(path.absolute()) raise FileNotFoundError(path.absolute())
self._path = path self._path = path
self._ignore_missing_environment_variables = (
ignore_missing_environment_variables
)
self._key_values: Dict[str, str] = {} self._key_values: Dict[str, str] = {}
self._parse() self._parse()
@ -35,11 +30,6 @@ class ConfigFile:
matches = pattern.findall(lines) matches = pattern.findall(lines)
for key, *values in matches: 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: try:
value = next(v for v in values if v) value = next(v for v in values if v)
except StopIteration: except StopIteration:
@ -47,15 +37,29 @@ class ConfigFile:
f"Cannot parse config file ({self._path.absolute()}), error at key `{key}`" 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}:"): if value.startswith(f"{ENVIRONMENT_VARIABLE_KEY_PREFIX}:"):
_, value = value.split(":") _, value = value.split(":")
if value not in os.environ: 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' 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: if already_exists:
logger.warning(f"{issue}, defaulting to `None`") logger.warning(
f"{issue}, using the default value defined above (`{self._key_values[key]}`)"
)
continue
else: else:
raise KeyError(issue) raise KeyError(
value = os.environ[value] f"{issue} and no default value has been provided"
)
else:
value = os.environ[value]
self._key_values[key] = value self._key_values[key] = value
@ -84,4 +88,4 @@ class ConfigFile:
return self._key_values.items() return self._key_values.items()
def __repr__(self): 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" second_key="ENV:alma"
third_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 import unittest
from pathlib import Path from pathlib import Path
@ -62,8 +63,6 @@ multiline
assert c.whitespace == "hardly matters" assert c.whitespace == "hardly matters"
def test_env(self) -> None: def test_env(self) -> None:
import os
os.environ["alma"] = "12" os.environ["alma"] = "12"
c = ConfigFile(DATA_PATH / "env.conf") c = ConfigFile(DATA_PATH / "env.conf")
del os.environ["alma"] del os.environ["alma"]
@ -72,13 +71,20 @@ multiline
def test_env_not_exists(self) -> None: def test_env_not_exists(self) -> None:
with pytest.raises(KeyError): with pytest.raises(KeyError):
ConfigFile(DATA_PATH / "env.conf") ConfigFile(DATA_PATH / "env-bad.conf")
def test_env_not_exists_but_ignored(self) -> None: def test_env_not_exists_fallback(self) -> None:
with pytest.raises(KeyError): os.environ["alma"] = "12"
ConfigFile( c = ConfigFile(DATA_PATH / "env.conf")
DATA_PATH / "env.conf", ignore_missing_environment_variables=True 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: def test_duplicate_key(self) -> None:
with pytest.raises(KeyError): with pytest.raises(KeyError):