# -*- coding: utf-8-*-
import yaml
import logging
import os
from . import constants
logger = logging.getLogger(__name__)
_config = {}
has_init = False
[文档]def reload():
"""
重新加载配置
"""
logger.info('配置文件发生变更,重新加载配置文件')
init()
[文档]def init():
global has_init
if os.path.isfile(constants.CONFIG_PATH):
logger.critical("错误:{} 应该是个目录,而不应该是个文件".format(constants.CONFIG_PATH))
if not os.path.exists(constants.CONFIG_PATH):
os.makedirs(constants.CONFIG_PATH)
if not os.path.exists(constants.getConfigPath()):
yes_no = input("配置文件{}不存在,要创建吗?(y/n)".format(constants.getConfigPath()))
if yes_no.lower() == 'y':
constants.newConfig()
doInit(constants.getConfigPath())
else:
doInit(constants.getDefaultConfigPath())
else:
doInit(constants.getConfigPath())
has_init = True
[文档]def doInit(config_file=constants.getDefaultConfigPath()):
# Create config dir if it does not exist yet
if not os.path.exists(constants.CONFIG_PATH):
try:
os.makedirs(constants.CONFIG_PATH)
except OSError:
logger.error("Could not create config dir: '%s'",
constants.CONFIG_PATH, exc_info=True)
raise
# Check if config dir is writable
if not os.access(constants.CONFIG_PATH, os.W_OK):
logger.critical("Config dir %s is not writable. Dingdang " +
"won't work correctly.",
constants.CONFIG_PATH)
global _config
# Read config
logger.debug("Trying to read config file: '%s'", config_file)
try:
with open(config_file, "r") as f:
_config = yaml.safe_load(f)
except Exception as e:
logger.error("配置文件 {} 读取失败: {}".format(config_file, e))
raise
[文档]def get_path(items, default=None):
global _config
curConfig = _config
if isinstance(items, str) and items[0] == '/':
items = items.split('/')[1:]
for key in items:
if key in curConfig:
curConfig = curConfig[key]
else:
logger.warning("/%s not specified in profile, defaulting to "
"'%s'", '/'.join(items), default)
return default
return curConfig
[文档]def has_path(items):
global _config
curConfig = _config
if isinstance(items, str) and items[0] == '/':
items = items.split('/')[1:]
else:
items = [items]
for key in items:
if key in curConfig:
curConfig = curConfig[key]
else:
return False
return True
[文档]def has(item):
"""
判断配置里是否包含某个配置项
:param item: 配置项名
:returns: True: 包含; False: 不包含
"""
return has_path(item)
[文档]def get(item='', default=None):
"""
获取某个配置的值
:param item: 配置项名。如果是多级配置,则以 "/a/b" 的形式提供
:param default: 默认值(可选)
:returns: 这个配置的值。如果没有该配置,则提供一个默认值
"""
global has_init
if not has_init:
init()
if not item:
return _config
if item[0] == '/':
return get_path(item, default)
try:
return _config[item]
except KeyError:
logger.warning("%s not specified in profile, defaulting to '%s'",
item, default)
return default
[文档]def getConfig():
"""
返回全部配置数据
:returns: 全部配置数据(字典类型)
"""
return _config
[文档]def getText():
if os.path.exists(constants.getConfigPath()):
with open(constants.getConfigPath(), 'r') as f:
return f.read()
return ''
[文档]def dump(configStr):
with open(constants.getConfigPath(), 'w') as f:
f.write(configStr)