add fill/auto with dynamic option

This commit is contained in:
Emmanuel Garette 2020-04-11 20:45:28 +02:00
parent b0b44d4ee1
commit 1cd8873e5b
6 changed files with 118 additions and 17 deletions

View File

@ -237,6 +237,7 @@ class ServiceAnnotator:
self.paths.add_variable('services',
path,
'service',
False,
variable,
)
return variable
@ -1116,7 +1117,11 @@ class SpaceAnnotator(object):
# if param.optional is True:
# param_option_indexes.append(fill_idx)
try:
param.text = self.paths.get_variable_path(param.text, namespace)
param.text, suffix = self.paths.get_variable_path(param.text,
namespace,
with_suffix=True)
if suffix:
param.suffix = suffix
except CreoleDictConsistencyError as err:
if param.optional is True:
param_option_indexes.append(fill_idx)

View File

@ -11,7 +11,7 @@ from tiramisu import (StrOption, OptionDescription, DynOptionDescription, PortOp
NetworkOption, NetmaskOption, DomainnameOption, BroadcastOption,
URLOption, EmailOption, FilenameOption, UsernameOption, DateOption,
PasswordOption, BoolOption, MACOption, Leadership, submulti,
Params, ParamSelfOption, ParamOption, ParamValue, Calculation, calc_value,
Params, ParamSelfOption, ParamOption, ParamDynOption, ParamValue, Calculation, calc_value,
groups, owners)
from tiramisu.error import ConfigError
@ -431,7 +431,7 @@ class Variable(Common):
transitive = False
else:
raise CreoleLoaderError(_('unknown transitive boolean {}').format(transitive))
value = [param.text, transitive]
value = [param.text, transitive, param.attrib.get('suffix')]
elif param.attrib['type'] == 'number':
value = int(param.text)
else:
@ -462,10 +462,21 @@ class Variable(Common):
if len(value) == 3:
for param in value[1]:
if isinstance(param[1], list):
option = self.storage.get(param[1][0]).get()
param_kwargs = {'notraisepropertyerror': param[1][1]}
if value[0] in FUNC_TO_DICT:
param_value = ParamOption(self.storage.get(param[1][0]).get(), notraisepropertyerror=param[1][1], todict=True)
param_kwargs['todict'] = True
if not param[1][2]:
param_value = ParamOption(option,
**param_kwargs,
)
else:
param_value = ParamOption(self.storage.get(param[1][0]).get(), notraisepropertyerror=param[1][1])
family = '.'.join(param[1][0].split('.', 3)[:2])
param_value = ParamDynOption(option,
param[1][2],
self.storage.get(family).get(),
**param_kwargs,
)
else:
param_value = ParamValue(param[1])
if not param[0]:

View File

@ -197,6 +197,7 @@ class CreoleObjSpace(object):
self.paths.add_variable(namespace,
name,
family.name,
False,
variable_obj,
)
return variable_obj
@ -423,7 +424,13 @@ class CreoleObjSpace(object):
if list(child) != []:
self.xml_parse_document(child, creoleobj, namespace, is_in_family)
def _fill_creoleobj_path_attribute(self, space, child, namespace, document, creoleobj): # pylint: disable=R0913
def _fill_creoleobj_path_attribute(self,
space,
child,
namespace,
document,
creoleobj,
): # pylint: disable=R0913
"""Fill self.paths attributes
"""
if not isinstance(space, self.help): # pylint: disable=E1101
@ -432,6 +439,7 @@ class CreoleObjSpace(object):
self.paths.add_variable(namespace,
child.attrib['name'],
family_name,
document.attrib.get('dynamic') != None,
creoleobj)
if child.attrib.get('redefine', 'False') == 'True':
if namespace == 'creole':
@ -655,8 +663,10 @@ class Path:
new_path = namespace + '.' + leader_family_name + '.' + leader_name + '.' + name
self.add_variable(namespace,
new_path,
family=dico['family'],
creoleobj=dico['creoleobj'])
dico['family'],
False,
dico['creoleobj'],
)
name = new_path
dico = self._get_variable(name)
if dico['leader'] != None:
@ -671,8 +681,9 @@ class Path:
def add_variable(self,
namespace: str,
name: str,
family: str=None,
creoleobj=None,
family: str,
is_dynamic: bool,
creoleobj,
) -> str: # pylint: disable=C0111
if namespace == 'creole' or '.' in name:
varname = name
@ -682,6 +693,7 @@ class Path:
family=family,
namespace=namespace,
leader=None,
is_dynamic=is_dynamic,
creoleobj=creoleobj)
def get_variable_name(self,
@ -717,22 +729,32 @@ class Path:
name: str,
current_namespace: str,
allow_source: str=False,
with_suffix: bool=False,
) -> str: # pylint: disable=C0111
if current_namespace is None: # pragma: no cover
raise CreoleOperationError('current_namespace must not be None')
dico = self._get_variable(name)
if with_suffix:
dico, suffix = self._get_variable(name,
with_suffix=True,
)
else:
dico = self._get_variable(name)
if not allow_source:
if dico['namespace'] not in ['creole', 'services'] and current_namespace != dico['namespace']:
raise CreoleDictConsistencyError(_('A variable located in the {} namespace '
'shall not be used in the {} namespace').format(
dico['namespace'], current_namespace))
if '.' in dico['name']:
return dico['name']
list_path = [dico['namespace'], dico['family']]
if dico['leader'] is not None:
list_path.append(dico['leader'])
list_path.append(dico['name'])
return '.'.join(list_path)
value = dico['name']
else:
list_path = [dico['namespace'], dico['family']]
if dico['leader'] is not None:
list_path.append(dico['leader'])
list_path.append(dico['name'])
value = '.'.join(list_path)
if with_suffix:
return value, suffix
return value
def path_is_defined(self,
name: str,
@ -741,10 +763,16 @@ class Path:
def _get_variable(self,
name: str,
with_suffix: bool=False,
) -> str:
if name not in self.variables:
if name.startswith('creole.'):
name = name.split('.')[-1]
if name not in self.variables:
for var_name, variable in self.variables.items():
if variable['is_dynamic'] and name.startswith(var_name):
return variable, name[len(var_name):]
raise CreoleDictConsistencyError(_('unknown option {}').format(name))
if with_suffix:
return self.variables[name], None
return self.variables[name]

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<rougail>
<variables>
<family name='general'>
<variable name='varname' type='string' description="No change" multi="True">
<value>val1</value>
<value>val2</value>
</variable>
</family>
<family name='dyn' dynamic="varname">
<variable name='vardyn' type='string' description="No change">
<value>val</value>
</variable>
</family>
<family name='new'>
<variable name='newvar' type='string' description="No change"/>
</family>
</variables>
<constraints>
<fill name="calc_val" target="newvar">
<param type="variable">vardynval1</param>
</fill>
</constraints>
</rougail>

View File

@ -0,0 +1 @@
{"creole.general.varname": ["val1", "val2"], "creole.dynval1.vardynval1": "val", "creole.dynval2.vardynval2": "val", "creole.new.newvar": null}

View File

@ -0,0 +1,31 @@
<?xml version='1.0' encoding='UTF-8'?>
<creole>
<family doc="" name="creole">
<family doc="general" name="general">
<property>normal</property>
<variable doc="No change" multi="True" name="varname" type="string">
<property>mandatory</property>
<property>normal</property>
<value>val1</value>
<value>val2</value>
</variable>
</family>
<family dynamic="creole.general.varname" doc="dyn" name="dyn">
<property>normal</property>
<variable doc="No change" multi="False" name="vardyn" type="string">
<property>mandatory</property>
<property>normal</property>
<value>val</value>
</variable>
</family>
<family doc="new" name="new">
<property>normal</property>
<variable doc="No change" multi="False" name="newvar" type="string">
<property>normal</property>
<value name="calc_val" type="calculation">
<param suffix="val1" transitive="False" type="variable">creole.dyn.vardyn</param>
</value>
</variable>
</family>
</family>
</creole>