From 729b35d3720ac0f0e1b837eb6b27f44afed0f610 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Fri, 20 Dec 2019 11:02:26 +0100 Subject: [PATCH] leader/follower in template --- src/rougail/template.py | 100 +++++++++++++++------------------------- 1 file changed, 38 insertions(+), 62 deletions(-) diff --git a/src/rougail/template.py b/src/rougail/template.py index 087e5acf..0fcf0f95 100644 --- a/src/rougail/template.py +++ b/src/rougail/template.py @@ -33,6 +33,7 @@ from Cheetah.Template import Template as ChtTemplate from Cheetah.NameMapper import NotFound as CheetahNotFound from tiramisu import Config +from tiramisu.error import PropertiesOptionError from .config import patch_dir from .error import FileNotFound, TemplateError, TemplateDisabled @@ -42,7 +43,7 @@ from .i18n import _ log = logging.getLogger(__name__) log.addHandler(logging.NullHandler()) -class IsDefined(object): +class IsDefined: """ filtre permettant de ne pas lever d'exception au cas où la variable Creole n'est pas définie @@ -64,7 +65,7 @@ class IsDefined(object): return varname in self.context -class CreoleGet(object): +class CreoleGet: def __init__(self, context): self.context = context @@ -85,14 +86,14 @@ class CreoleGet(object): @classmethod def cl_compile(kls, *args, **kwargs): kwargs['compilerSettings'] = {'directiveStartToken' : '%', - 'cheetahVarStartToken' : '%%', - 'EOLSlurpToken' : '%', - 'PSPStartToken' : 'µ' * 10, - 'PSPEndToken' : 'µ' * 10, - 'commentStartToken' : 'µ' * 10, - 'commentEndToken' : 'µ' * 10, - 'multiLineCommentStartToken' : 'µ' * 10, - 'multiLineCommentEndToken' : 'µ' * 10} + 'cheetahVarStartToken' : '%%', + 'EOLSlurpToken' : '%', + 'PSPStartToken' : 'µ' * 10, + 'PSPEndToken' : 'µ' * 10, + 'commentStartToken' : 'µ' * 10, + 'commentEndToken' : 'µ' * 10, + 'multiLineCommentStartToken' : 'µ' * 10, + 'multiLineCommentEndToken' : 'µ' * 10} return kls.old_compile(*args, **kwargs) ChtTemplate.old_compile = ChtTemplate.compile ChtTemplate.compile = cl_compile @@ -123,7 +124,7 @@ class CheetahTemplate(ChtTemplate): }]) -class CreoleMaster(object): +class CreoleLeader: def __init__(self, value, slave=None, index=None): """ On rend la variable itérable pour pouvoir faire: @@ -148,8 +149,8 @@ class CreoleMaster(object): """ if name in self.slave: value = self.slave[name] - if isinstance(value, Exception): - raise value + if isinstance(value, PropertiesOptionError): + raise AttributeError() return value else: return getattr(self._value, name) @@ -160,7 +161,7 @@ class CreoleMaster(object): ret = {} for key, values in self.slave.items(): ret[key] = values[index] - return CreoleMaster(self._value[index], ret, index) + return CreoleLeader(self._value[index], ret, index) def __iter__(self): """Iterate over master.slave. @@ -171,7 +172,7 @@ class CreoleMaster(object): ret = {} for key, values in self.slave.items(): ret[key] = values[i] - yield CreoleMaster(self._value[i], ret, i) + yield CreoleLeader(self._value[i], ret, i) def __len__(self): """Delegate to master value @@ -179,7 +180,7 @@ class CreoleMaster(object): return len(self._value) def __repr__(self): - """Show CreoleMaster as dictionary. + """Show CreoleLeader as dictionary. The master value is stored under 'value' key. The slaves are stored under 'slave' key. @@ -218,31 +219,17 @@ class CreoleMaster(object): def __contains__(self, item): return item in self._value - def add_slave(self, name, value): - """Add a slave variable - - Minimal check on type and value of the slave in regards to the - master one. - - @param name: name of the slave variable - @type name: C{str} - @param value: value of the slave variable - """ + def add_slave(self, config, name, path): if isinstance(self._value, list): - if not isinstance(value, list): - raise TypeError - elif len(value) != len(self._value): - raise ValueError(_('length mismatch')) - new_value = [] - for val in value: - if isinstance(val, dict): - new_value.append(ValueError(val['err'])) - else: - new_value.append(val) - value = new_value - elif isinstance(value, list): - raise TypeError - self.slave[name] = value + values = [] + for idx in range(len(self._value)): + try: + values.append(config.option(path, idx).value.get()) + except PropertiesOptionError as err: + values.append(err) + else: + raise Exception('hu?') + self.slave[name] = values class CreoleTemplateEngine: @@ -265,36 +252,25 @@ class CreoleTemplateEngine: eos[func] = getattr(eosfunc, func) self.eosfunc = eos self.creole_variables_dict = {} - self.load_eole_variables(self.config.option('creole')) + self.load_eole_variables(self.config, self.config.option('creole')) - def load_eole_variables(self, optiondescription): + def load_eole_variables(self, config, optiondescription): # remplacement des variables EOLE for option in optiondescription.list('all'): if option.option.isoptiondescription(): if option.option.isleadership(): - print('leadership') -# raise Exception('a faire') + for idx, suboption in enumerate(option.list('all')): + if idx == 0: + leader = CreoleLeader(suboption.value.get()) + self.creole_variables_dict[suboption.option.name()] = leader + else: + leader.add_slave(config, + suboption.option.name(), + suboption.option.path()) else: - self.load_eole_variables(option) + self.load_eole_variables(config, option) else: self.creole_variables_dict[option.option.name()] = option.value.get() - #if varname.find('.') != -1: - # #support des groupes - # mastername, slavename = varname.split('.') - # if not mastername in self.creole_variables_dict or not \ - # isinstance(self.creole_variables_dict [mastername], - # CreoleMaster): - # # Create the master variable - # if mastername in values: - # self.creole_variables_dict[mastername] = CreoleMaster(values[mastername]) - # else: - # #only for CreoleLint - # self.creole_variables_dict[mastername] = CreoleMaster(value) - # #test only for CreoleLint - # if mastername != slavename: - # self.creole_variables_dict[mastername].add_slave(slavename, value) - #else: - # self.creole_variables_dict[varname] = value def patch_template(self, filename: str):