kiwi-scp/src/kiwi/config.py

84 lines
2.2 KiB
Python
Raw Normal View History

2020-08-06 11:43:45 +00:00
import logging
2020-08-06 01:45:12 +00:00
import re
2020-08-06 12:34:25 +00:00
import os
2020-08-04 18:24:19 +00:00
import yaml
2020-08-06 11:43:45 +00:00
from .core import KIWI_ROOT, KIWI_CONF_NAME
2020-08-04 18:24:19 +00:00
2020-08-06 11:43:45 +00:00
###########
# CONSTANTS
2020-08-04 14:52:30 +00:00
2020-08-06 11:43:45 +00:00
DEFAULT_KIWI_CONF_NAME = KIWI_ROOT + "/default.kiwi.yml"
2020-08-06 01:45:12 +00:00
2020-08-04 14:52:30 +00:00
2020-08-06 11:43:45 +00:00
class Config:
__yml_content = {}
2020-08-06 01:45:12 +00:00
2020-08-06 11:43:45 +00:00
def __key_resolve(self, key):
2020-08-05 00:08:55 +00:00
# "a:b:c" => path = ['a', 'b'], key = 'c'
path = key.split(':')
2020-08-06 01:45:12 +00:00
path, key = path[:-1], path[-1]
2020-08-04 18:24:19 +00:00
2020-08-05 00:08:55 +00:00
# resolve path
2020-08-06 11:43:45 +00:00
container = self.__yml_content
2020-08-04 18:24:19 +00:00
for step in path:
2020-08-06 11:43:45 +00:00
container = container[step]
2020-08-04 18:24:19 +00:00
2020-08-06 11:43:45 +00:00
return container, key
2020-08-06 01:45:12 +00:00
2020-08-06 12:34:25 +00:00
def __getitem__(self, key):
container, key = self.__key_resolve(key)
return container[key]
2020-08-06 11:43:45 +00:00
def __setitem__(self, key, value):
container, key = self.__key_resolve(key)
container[key] = value
2020-08-06 01:45:12 +00:00
2020-08-06 12:34:25 +00:00
def __str__(self):
# dump yml content
yml_string = yaml.dump(self.__yml_content, default_flow_style=False, sort_keys=False)
# insert newline before every main key
yml_string = re.sub(r'^(\S)', r'\n\1', yml_string, flags=re.MULTILINE)
# extract header comment from default config
with open(DEFAULT_KIWI_CONF_NAME, 'r') as stream:
yml_header = stream.read().strip()
yml_header = re.sub(r'^[^#].*', r'', yml_header, flags=re.MULTILINE).strip()
yml_string = "{}\n{}".format(yml_header, yml_string)
return yml_string
2020-08-06 01:45:12 +00:00
2020-08-06 11:43:45 +00:00
def __update_from_file(self, filename):
with open(filename, 'r') as stream:
try:
self.__yml_content.update(yaml.safe_load(stream))
except yaml.YAMLError as exc:
logging.error(exc)
2020-08-04 18:24:19 +00:00
2020-08-06 12:34:25 +00:00
def __save_to_file(self, filename):
with open(filename, 'w') as stream:
stream.write(str(self))
2020-08-06 11:43:45 +00:00
@classmethod
def default(cls):
result = cls()
result.__update_from_file(DEFAULT_KIWI_CONF_NAME)
2020-08-06 01:45:12 +00:00
2020-08-06 11:43:45 +00:00
with open(KIWI_ROOT + "/version-tag", 'r') as stream:
result.__yml_content["version"] = stream.read().strip()
2020-08-06 01:45:12 +00:00
2020-08-06 11:43:45 +00:00
return result
2020-08-06 01:45:12 +00:00
2020-08-06 11:43:45 +00:00
@classmethod
def load(cls):
result = cls.default()
2020-08-06 12:34:25 +00:00
if os.path.isfile(KIWI_CONF_NAME):
result.__update_from_file(KIWI_CONF_NAME)
2020-08-04 18:24:19 +00:00
2020-08-06 11:43:45 +00:00
return result
2020-08-04 18:24:19 +00:00
2020-08-06 11:43:45 +00:00
def save(self):
2020-08-06 12:34:25 +00:00
self.__save_to_file(KIWI_CONF_NAME)