Add .env loading

This commit is contained in:
Zeva Rose 2022-10-27 17:46:11 -06:00
parent bb89107b93
commit d8f5aff799
3 changed files with 779 additions and 319 deletions

View file

@ -1,26 +1,53 @@
"""Load global config.""" """Load global config."""
from lib2to3.pgen2 import token
import os
from pathlib import Path from pathlib import Path
from typing import Union from typing import Union
from dotenv import load_dotenv
from yaml import load from yaml import load
from jarvis_core.util import Singleton from jarvis_core.util import Singleton, find_all
try: try:
from yaml import CLoader as Loader from yaml import CLoader as Loader
except ImportError: except ImportError:
from yaml import Loader from yaml import Loader
DEFAULT_YAML_PATH = Path("config.yaml")
DEFAULT_PATH = Path("config.yaml") DEFAULT_ENV_PATH = Path(".env")
class Config(Singleton): class Config(Singleton):
REQUIRED = [] REQUIRED = []
OPTIONAL = {} OPTIONAL = {}
ENV_REQUIRED = []
ENV_OPTIONAL = {}
@classmethod @classmethod
def from_yaml(cls, filepath: Union[Path, str] = DEFAULT_PATH) -> "Config": def _process_env(cls, **kwargs) -> dict:
"""Process environment variables into standard arguments"""
@classmethod
def from_env(cls, filepath: Union[Path, str] = DEFAULT_ENV_PATH) -> "Config":
"""Loag the environment config."""
if inst := cls.__dict__.get("inst"):
return inst
load_dotenv(filepath)
data = {}
for item in cls.ENV_REQUIRED:
data[item] = os.environ.get(item, None)
for item, default in cls.ENV_OPTIONAL.items():
data[item] = os.environ.get(item, default)
data = cls._process_env(**data)
return cls(**data)
@classmethod
def from_yaml(cls, filepath: Union[Path, str] = DEFAULT_YAML_PATH) -> "Config":
"""Load the yaml config file.""" """Load the yaml config file."""
if inst := cls.__dict__.get("inst"): if inst := cls.__dict__.get("inst"):
return inst return inst
@ -34,6 +61,13 @@ class Config(Singleton):
y = load(raw, Loader=Loader) y = load(raw, Loader=Loader)
return cls(**y) return cls(**y)
@classmethod
def load(cls) -> "Config":
if DEFAULT_ENV_PATH.exists():
return cls.from_env()
else:
return cls.from_yaml()
@classmethod @classmethod
def reload(cls) -> bool: def reload(cls) -> bool:
"""Reload the config.""" """Reload the config."""

1048
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "jarvis-core" name = "jarvis-core"
version = "0.14.0" version = "0.15.0"
description = "JARVIS core" description = "JARVIS core"
authors = ["Zevaryx <zevaryx@gmail.com>"] authors = ["Zevaryx <zevaryx@gmail.com>"]
@ -14,9 +14,13 @@ pytz = "^2022.1"
aiohttp = "^3.8.1" aiohttp = "^3.8.1"
rich = "^12.3.0" rich = "^12.3.0"
nanoid = "^2.0.0" nanoid = "^2.0.0"
python-dotenv = "^0.21.0"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "^7.1" pytest = "^7.1"
ipython = "^8.5.0"
rich = "^12.6.0"
black = {version = "^22.10.0", allow-prereleases = true}
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]