From f28288fbbaf259e0da24bfe4f7d2d369e8312192 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Wed, 24 Apr 2013 11:47:01 +0200 Subject: [PATCH] In make_dict check PropertyConfigError for OptionDescription Begin work's on MetaConfig --- tiramisu/config.py | 61 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/tiramisu/config.py b/tiramisu/config.py index 89c8442..d4742fd 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -299,8 +299,11 @@ class SubConfig(object): def _make_sub_dict(self, opt, path, pathsvalues, _currpath, flatten): if isinstance(opt, OptionDescription): - pathsvalues += getattr(self, path).make_dict(flatten, - _currpath + path.split('.')) + try: + pathsvalues += getattr(self, path).make_dict(flatten, + _currpath + path.split('.')) + except PropertiesOptionError: + pass # this just a hidden or disabled option else: try: value = self._getattr(opt._name) @@ -366,7 +369,7 @@ class Config(SubConfig): return None def _find(self, bytype, byname, byvalue, first, type_='option', - _subpath=None): + _subpath=None, check_properties=True): """ convenience method for finding an option that lives only in the subtree @@ -426,10 +429,12 @@ class Config(SubConfig): if not _filter_by_value(): continue #remove option with propertyerror, ... - try: - value = getattr(self, path) - except PropertiesOptionError: # a property restricts the access of the value - continue + if check_properties: + try: + value = getattr(self, path) + except PropertiesOptionError: + # a property restricts the access of the value + continue if not _filter_by_type(): continue #if not _filter_by_attrs(): @@ -450,6 +455,48 @@ class Config(SubConfig): return find_results +class MetaConfig(object): + __slots__ = ('_children') + + def __init__(self, children): + if not isinstance(children, list): + raise ValueError(_("metaconfig's children must be a list")) + descr = None + for child in children: + if not isinstance(child, Config): + raise ValueError(_("metaconfig's children must be Config, not {0}" + "".format(type(Config)))) + if descr is None: + descr = child.cfgimpl_get_description() + elif descr is child.cfgimpl_get_description(): + raise ValueError(_('all config in MetaConfig must have same ' + 'optiondescription')) + + self._children = children + + def _find(self, bytype, byname, byvalue, first, type_): + if type_ not in ('option', 'path'): + raise ValueError(_('unknown type_ type {0} for _find' + '').format(type_)) + #all children have same optiondescription, search in first one's + return self._children[0]._find(bytype, byname, byvalue, first=first, + type_=type_, check_properties=False) + + def find(self, bytype=None, byname=None, byvalue=None, type_='option'): + return self._find(bytype, byname, byvalue, type_, first=False) + + def find_first(self, bytype=None, byname=None, byvalue=None, + type_='option'): + return self._find(bytype, byname, byvalue, type_, first=True) + + def __setattr__(self, name, value): + for child in self._children: + try: + setattr(child, name, value) + except PropertiesOptionError: + pass + + def mandatory_warnings(config): """convenience function to trace Options that are mandatory and where no value has been set