From e75426bc4cd847f3fb810d710d561811aa74298e Mon Sep 17 00:00:00 2001 From: Jonas L Date: Mon, 25 Jul 2022 21:30:15 +0200 Subject: [PATCH] refactor(shared): explode config into multiple files (#1987) --- shared/libretime_shared/config/__init__.py | 8 +++ .../{config.py => config/_base.py} | 65 +------------------ shared/libretime_shared/config/_models.py | 65 +++++++++++++++++++ 3 files changed, 75 insertions(+), 63 deletions(-) create mode 100644 shared/libretime_shared/config/__init__.py rename shared/libretime_shared/{config.py => config/_base.py} (65%) create mode 100644 shared/libretime_shared/config/_models.py diff --git a/shared/libretime_shared/config/__init__.py b/shared/libretime_shared/config/__init__.py new file mode 100644 index 000000000..782dba267 --- /dev/null +++ b/shared/libretime_shared/config/__init__.py @@ -0,0 +1,8 @@ +from ._base import DEFAULT_CONFIG_FILEPATH, DEFAULT_ENV_PREFIX, BaseConfig +from ._models import ( + DatabaseConfig, + GeneralConfig, + RabbitMQConfig, + StorageConfig, + no_trailing_slash_validator, +) diff --git a/shared/libretime_shared/config.py b/shared/libretime_shared/config/_base.py similarity index 65% rename from shared/libretime_shared/config.py rename to shared/libretime_shared/config/_base.py index 96d9234a0..ac9ba09cf 100644 --- a/shared/libretime_shared/config.py +++ b/shared/libretime_shared/config/_base.py @@ -1,19 +1,16 @@ import sys from os import environ from pathlib import Path -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Union from loguru import logger # pylint: disable=no-name-in-module -from pydantic import AnyHttpUrl, BaseModel, ValidationError, validator +from pydantic import BaseModel, ValidationError from pydantic.fields import ModelField from pydantic.utils import deep_update from yaml import YAMLError, safe_load -if TYPE_CHECKING: - from pydantic.typing import AnyClassMethod - DEFAULT_ENV_PREFIX = "LIBRETIME" DEFAULT_CONFIG_FILEPATH = Path("/etc/libretime/config.yml") @@ -105,61 +102,3 @@ class BaseConfig(BaseModel): logger.error(f"config file '{filepath}' is not a valid yaml file: {error}") return {} - - -def no_trailing_slash_validator(key: str) -> "AnyClassMethod": - # pylint: disable=unused-argument - def strip_trailing_slash(cls: Any, value: str) -> str: - return value.rstrip("/") - - return validator(key, pre=True, allow_reuse=True)(strip_trailing_slash) - - -# pylint: disable=too-few-public-methods -class GeneralConfig(BaseModel): - public_url: AnyHttpUrl - api_key: str - - # Validators - _public_url_no_trailing_slash = no_trailing_slash_validator("public_url") - - -# pylint: disable=too-few-public-methods -class StorageConfig(BaseModel): - path: str = "/srv/libretime" - - # Validators - _path_no_trailing_slash = no_trailing_slash_validator("path") - - -# pylint: disable=too-few-public-methods -class DatabaseConfig(BaseModel): - host: str = "localhost" - port: int = 5432 - name: str = "libretime" - user: str = "libretime" - password: str = "libretime" - - @property - def url(self) -> str: - return ( - f"postgresql://{self.user}:{self.password}" - f"@{self.host}:{self.port}/{self.name}" - ) - - -# pylint: disable=too-few-public-methods -class RabbitMQConfig(BaseModel): - host: str = "localhost" - port: int = 5672 - name: str = "libretime" - user: str = "libretime" - password: str = "libretime" - vhost: str = "/libretime" - - @property - def url(self) -> str: - return ( - f"amqp://{self.user}:{self.password}" - f"@{self.host}:{self.port}/{self.vhost}" - ) diff --git a/shared/libretime_shared/config/_models.py b/shared/libretime_shared/config/_models.py new file mode 100644 index 000000000..e4a2634ab --- /dev/null +++ b/shared/libretime_shared/config/_models.py @@ -0,0 +1,65 @@ +from typing import TYPE_CHECKING, Any + +# pylint: disable=no-name-in-module +from pydantic import AnyHttpUrl, BaseModel, validator + +if TYPE_CHECKING: + from pydantic.typing import AnyClassMethod + + +def no_trailing_slash_validator(key: str) -> "AnyClassMethod": + # pylint: disable=unused-argument + def strip_trailing_slash(cls: Any, value: str) -> str: + return value.rstrip("/") + + return validator(key, pre=True, allow_reuse=True)(strip_trailing_slash) + + +# pylint: disable=too-few-public-methods +class GeneralConfig(BaseModel): + public_url: AnyHttpUrl + api_key: str + + # Validators + _public_url_no_trailing_slash = no_trailing_slash_validator("public_url") + + +# pylint: disable=too-few-public-methods +class StorageConfig(BaseModel): + path: str = "/srv/libretime" + + # Validators + _path_no_trailing_slash = no_trailing_slash_validator("path") + + +# pylint: disable=too-few-public-methods +class DatabaseConfig(BaseModel): + host: str = "localhost" + port: int = 5432 + name: str = "libretime" + user: str = "libretime" + password: str = "libretime" + + @property + def url(self) -> str: + return ( + f"postgresql://{self.user}:{self.password}" + f"@{self.host}:{self.port}/{self.name}" + ) + + +# pylint: disable=too-few-public-methods +class RabbitMQConfig(BaseModel): + host: str = "localhost" + port: int = 5672 + name: str = "libretime" + user: str = "libretime" + password: str = "libretime" + vhost: str = "/libretime" + + @property + def url(self) -> str: + return ( + f"amqp://{self.user}:{self.password}" + f"@{self.host}:{self.port}/{self.vhost}" + )