Source code for timelinelib.general.config
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline. If not, see <http://www.gnu.org/licenses/>.
from configparser import DEFAULTSECT
from configparser import SafeConfigParser
from timelinelib.general.observer import Observable
[docs]class Config(Observable):
[docs] def __init__(self, item_dicts):
Observable.__init__(self)
self._config_parser = SafeConfigParser()
self._build(item_dicts)
[docs] def read(self, path):
self._config_parser.read(path, encoding="utf-8")
[docs] def write(self, path):
with open(path, "w", encoding="utf-8") as f:
self._config_parser.write(f)
def _build(self, item_dicts):
for item_dict in item_dicts:
self._build_item(Item(item_dict))
def _build_item(self, item):
def getter():
return item.get_decoder()(self._config_parser.get(
item.get_section(),
item.get_config_name()
))
def setter(value):
self._config_parser.set(
item.get_section(),
item.get_config_name(),
item.get_encoder()(value)
)
self._notify()
setattr(self, "get_%s" % item.get_name(), getter)
setattr(self, "set_%s" % item.get_name(), setter)
setter(item.get_default())
[docs]class Item:
[docs] def __init__(self, item_dict):
self._item_dict = item_dict
[docs] def get_name(self):
return self._item_dict["name"]
[docs] def get_config_name(self):
return self._item_dict.get("config_name", self.get_name())
[docs] def get_section(self):
return DEFAULTSECT
[docs] def get_default(self):
return self._item_dict["default"]
[docs] def get_encoder(self):
return {
"text": lambda x: x,
"integer": str,
"boolean": str,
}[self._get_data_type()]
[docs] def get_decoder(self):
return {
"text": lambda x: x,
"integer": int,
"boolean": self._string_to_bool,
}[self._get_data_type()]
def _get_data_type(self):
return self._item_dict.get("data_type", "text")
def _string_to_bool(self, string):
return {
"true": True,
"false": False,
}[string.lower()]