Spaces:
Sleeping
Sleeping
#!/usr/bin/python3 | |
# -*- coding: utf-8 -*- | |
import json | |
import os | |
from dotenv import load_dotenv | |
from dotenv.main import DotEnv | |
from toolbox.json.misc import traverse | |
class EnvironmentManager(object): | |
def __init__(self, path, env, override=False): | |
filename = os.path.join(path, '{}.env'.format(env)) | |
self.filename = filename | |
load_dotenv( | |
dotenv_path=filename, | |
override=override | |
) | |
self._environ = dict() | |
def open_dotenv(self, filename: str = None): | |
filename = filename or self.filename | |
dotenv = DotEnv( | |
dotenv_path=filename, | |
stream=None, | |
verbose=False, | |
interpolate=False, | |
override=False, | |
encoding="utf-8", | |
) | |
result = dotenv.dict() | |
return result | |
def get(self, key, default=None, dtype=str): | |
result = os.environ.get(key) | |
if result is None: | |
if default is None: | |
result = None | |
else: | |
result = default | |
else: | |
result = dtype(result) | |
self._environ[key] = result | |
return result | |
_DEFAULT_DTYPE_MAP = { | |
'int': int, | |
'float': float, | |
'str': str, | |
'json.loads': json.loads | |
} | |
class JsonConfig(object): | |
""" | |
将 json 中, 形如 `$float:threshold` 的值, 处理为: | |
从环境变量中查到 threshold, 再将其转换为 float 类型. | |
""" | |
def __init__(self, dtype_map: dict = None, environment: EnvironmentManager = None): | |
self.dtype_map = dtype_map or _DEFAULT_DTYPE_MAP | |
self.environment = environment or os.environ | |
def sanitize_by_filename(self, filename: str): | |
with open(filename, 'r', encoding='utf-8') as f: | |
js = json.load(f) | |
return self.sanitize_by_json(js) | |
def sanitize_by_json(self, js): | |
js = traverse( | |
js, | |
callback=self.sanitize, | |
environment=self.environment | |
) | |
return js | |
def sanitize(self, string, environment): | |
"""支持 $ 符开始的, 环境变量配置""" | |
if isinstance(string, str) and string.startswith('$'): | |
dtype, key = string[1:].split(':') | |
dtype = self.dtype_map[dtype] | |
value = environment.get(key) | |
if value is None: | |
raise AssertionError('environment not exist. key: {}'.format(key)) | |
value = dtype(value) | |
result = value | |
else: | |
result = string | |
return result | |
def demo1(): | |
import json | |
from project_settings import project_path | |
environment = EnvironmentManager( | |
path=os.path.join(project_path, 'server/callbot_server/dotenv'), | |
env='dev', | |
) | |
init_scenes = environment.get(key='init_scenes', dtype=json.loads) | |
print(init_scenes) | |
print(environment._environ) | |
return | |
if __name__ == '__main__': | |
demo1() | |