Source code for acore_server_config.config.define.main
# -*- coding: utf-8 -*-
import dataclasses
import os
from config_patterns.patterns.multi_env_json.api import (
BaseEnvEnum,
BaseEnv,
BaseConfig,
)
from ...runtime import IS_LOCAL, IS_GITHUB_CI, IS_EC2, IS_CODEBUILD_CI
from ...compat import cached_property
[docs]class EnvEnum(BaseEnvEnum):
"""
In this project, we have three environment:
- sbx: represent the developer's local laptop, and the sandbox environment
the change you made on your local laptop can be applied to sandbox.
- tst: a long living integration test environment. before releasing to
production, the app has to be deployed to test environment for QA.
- prd: the production environment. can only be deployed from release branch.
"""
sbx = "sbx"
tst = "tst"
prd = "prd"
# You may have a long list of config field definition
# put them in different module and use Mixin class
from .server import Server, ServerMixin
[docs]@dataclasses.dataclass
class Env(
BaseEnv,
ServerMixin,
):
[docs] @classmethod
def from_dict(cls, data: dict):
data["servers"] = {
name: Server(
id="{}-{}".format(
data["env_name"],
name,
),
**dct,
)
for name, dct in data.get("servers", {}).items()
}
env = cls(**data)
return env
[docs]class Config(BaseConfig):
[docs] @classmethod
def get_current_env(cls) -> str: # pragma: no cover
# you can uncomment this line to force to use certain env
# from your local laptop to run application code, tests, ...
# return EnvEnum.sbx.value
if IS_LOCAL:
if "USER_ENV_NAME" in os.environ:
return os.environ["USER_ENV_NAME"]
return EnvEnum.sbx.value
elif IS_GITHUB_CI or IS_CODEBUILD_CI:
if "USER_ENV_NAME" in os.environ:
return os.environ["USER_ENV_NAME"]
return EnvEnum.sbx.value
elif IS_EC2:
if "USER_ENV_NAME" in os.environ:
return os.environ["USER_ENV_NAME"]
return EnvEnum.sbx.value
else:
raise NotImplementedError
@cached_property
def sbx(self) -> Env: # pragma: no cover
return self.get_env(env_name=EnvEnum.sbx)
@cached_property
def tst(self) -> Env: # pragma: no cover
return self.get_env(env_name=EnvEnum.tst)
@cached_property
def prd(self) -> Env: # pragma: no cover
return self.get_env(env_name=EnvEnum.prd)
@cached_property
def env(self) -> Env:
return self.get_env(env_name=self.get_current_env())