Source code for octomachinery.app.config

"""GitHub App/bot configuration."""

import os
from functools import lru_cache
from typing import Optional

import environ
import envparse

# pylint: disable=relative-beyond-top-level
from ..github.config.app import GitHubAppIntegrationConfig
# pylint: disable=relative-beyond-top-level
from .action.config import GitHubActionConfig
# pylint: disable=relative-beyond-top-level
from .runtime.config import RuntimeConfig
# pylint: disable=relative-beyond-top-level
from .server.config import WebServerConfig


[docs]@environ.config class BotAppConfig: """Bot app config. Construct it as follows:: >>> from octomachinery.app.config import BotAppConfig >>> config = BotAppConfig.from_dotenv() # for dev env >>> config = BotAppConfig.from_env() # for pure env >>> """ github = environ.group(GitHubAppIntegrationConfig) action = environ.group(GitHubActionConfig) server = environ.group(WebServerConfig) runtime = environ.group(RuntimeConfig)
[docs] @classmethod @lru_cache(maxsize=1) def from_dotenv( cls, *, app_name: Optional[str] = None, app_version: Optional[str] = None, app_url: Optional[str] = None, ): """Return an initialized dev config instance. Read .env into env vars before that. """ envparse.Env.read_envfile( '.env', # Making it relative to CWD, relative to caller if None ) return cls.from_env( app_name=app_name, app_version=app_version, app_url=app_url, )
[docs] @classmethod @lru_cache(maxsize=1) def from_env( cls, *, app_name: Optional[str] = None, app_version: Optional[str] = None, app_url: Optional[str] = None, ): """Return an initialized config instance.""" env_vars = dict(os.environ) if app_name is not None: env_vars['OCTOMACHINERY_APP_NAME'] = app_name if app_version is not None: env_vars['OCTOMACHINERY_APP_VERSION'] = app_version if app_url is not None: env_vars['OCTOMACHINERY_APP_URL'] = app_url return environ.to_config(cls, environ=env_vars)