| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- '''
- Created on 17 avr. 2018
- @author: olivier.massot
- '''
- import collections
- from cerberus.validator import Validator
- import yaml
- from yaml.parser import ParserError
- from core import constants
- CONFIG = {}
- _SCHEMA = {
- 'repertoire_defaut': {'type': 'string', 'required': True},
- 'repertoire_sortie': {'type': 'string', 'required': True},
- 'donnees': {
- 'type': 'dict',
- 'schema': {
- 'dict': {'type': 'dict', 'required': True},
- 'dt': {'type': 'dict', 'required': True},
- 'commun': {'type': 'dict', 'required': True},
- },
- 'required': True
- },
- 'mail': {'type': 'dict',
- 'schema': {
- 'dict': {
- 'type': 'dict',
- 'schema': {
- 'dest': {'type': 'string', 'required': True},
- 'objet': {'type': 'string', 'required': True},
- 'texte': {'type': 'string', 'required': True},
- },
- 'required': True
- },
- 'dt': {
- 'type': 'dict',
- 'schema': {
- 'dest': {'type': 'string'},
- 'objet': {'type': 'string'},
- 'texte': {'type': 'string'},
- },
- 'required': True
- }
- },
- 'required': True
- },
- 'modifiables': {'type': 'list', 'required': True}
- }
- class MissingConfigFile(Exception):
- """ Fichier de configuration manquant """
- pass
- class InvalidConfigFile(Exception):
- """ Fichier de configuration invalide """
- pass
- def deepupdate(d, u):
- for k, v in u.items():
- if isinstance(v, collections.Mapping):
- d[k] = deepupdate(d.get(k, {}), v)
- else:
- d[k] = v
- return d
- def load():
- # charge le fichier de configuration de base
- try:
- with open(constants.CONFIG_FILE_PATH, "rb") as f:
- baseconf = yaml.load(f)
- except FileNotFoundError:
- raise MissingConfigFile("Le fichier de configuration '{}' est introuvable".format(constants.CONFIG_FILE_PATH))
- except ParserError as e:
- raise InvalidConfigFile("Le fichier de configuration '{}' comporte des erreurs ({})".format(constants.CONFIG_FILE_PATH, e))
- deepupdate(CONFIG, baseconf)
- # surcharge la config avec la config utilisateur
- try:
- with open(constants.USER_DATA_PATH, "rb") as f:
- userconf = yaml.load(f)
- except FileNotFoundError:
- pass
- except ParserError as e:
- raise InvalidConfigFile("Le fichier de configuration '{}' comporte des erreurs ({})".format(constants.USER_DATA_PATH, e))
- userconf = patch1(userconf)
- userconf = {key: value for key, value in userconf.items() if value}
- deepupdate(CONFIG, userconf)
- # contrôle le schema de la config
- validator = Validator(_SCHEMA, allow_unknown=True)
- if not validator.validate(CONFIG):
- raise InvalidConfigFile("Erreur dans les fichiers de configuration: {}".format(validator.errors))
- def get(*keys):
- dataset = dict(CONFIG)
- for key in keys:
- dataset = dataset[key]
- return dataset
- def patch1(userconf):
- """ corrige le fichier de données utilisateur entre la verison 1.0 et 1.1 """
- if not "donnees" in userconf:
- userconf = {"donnees": {"commun": userconf}}
- return userconf
- if __name__ == "__main__":
- load()
- print(CONFIG)
|