reorganize modes

This commit is contained in:
Emmanuel Garette 2021-01-26 13:42:48 +01:00
parent cbd11a29c2
commit 8eb3b99f27
1 changed files with 34 additions and 52 deletions

View File

@ -38,13 +38,23 @@ class FamilyAnnotator:
self.objectspace = objectspace self.objectspace = objectspace
if not hasattr(self.objectspace.space, 'variables'): if not hasattr(self.objectspace.space, 'variables'):
return return
self.family_names()
self.remove_empty_families() self.remove_empty_families()
self.change_variable_mode() self.family_names()
self.change_family_mode() self.change_modes()
self.dynamic_families() self.dynamic_families()
self.convert_help() self.convert_help()
def remove_empty_families(self) -> None:
"""Remove all families without any variable
"""
for families in self.objectspace.space.variables.values():
removed_families = []
for family_name, family in families.family.items():
if not hasattr(family, 'variable') or len(family.variable) == 0:
removed_families.append(family_name)
for family_name in removed_families:
del families.family[family_name]
def family_names(self) -> None: def family_names(self) -> None:
"""Set doc, path, ... to family """Set doc, path, ... to family
""" """
@ -59,23 +69,14 @@ class FamilyAnnotator:
setattr(family, key, None) setattr(family, key, None)
family.name = normalize_family(family.name) family.name = normalize_family(family.name)
def remove_empty_families(self) -> None: def change_modes(self):
"""Remove all families without any variable
"""
for families in self.objectspace.space.variables.values():
removed_families = []
for family_name, family in families.family.items():
if not hasattr(family, 'variable') or len(family.variable) == 0:
removed_families.append(family_name)
for family_name in removed_families:
del families.family[family_name]
def change_variable_mode(self):
"""change the mode of variables """change the mode of variables
""" """
for variables in self.objectspace.space.variables.values(): for families in self.objectspace.space.variables.values():
for family in variables.family.values(): for family in families.family.values():
family_mode = family.mode family_mode = family.mode
# default is high level
new_family_mode = modes_level[-1]
for variable in family.variable.values(): for variable in family.variable.values():
if not isinstance(variable, self.objectspace.leadership): if not isinstance(variable, self.objectspace.leadership):
func = self._change_variabe_mode func = self._change_variabe_mode
@ -84,19 +85,28 @@ class FamilyAnnotator:
func(variable, func(variable,
family_mode, family_mode,
) )
if modes[new_family_mode] > modes[variable.mode]:
new_family_mode = variable.mode
# set the lower variable mode to family
family.mode = new_family_mode
def _change_variabe_mode(self, def _change_variabe_mode(self,
variable, variable,
family_mode: str, family_mode: str,
is_follower=False,
) -> None: ) -> None:
# auto_save or auto_freeze variable is set to 'basic' mode # auto_save or auto_freeze variable is set to 'basic' mode
# if its mode is not defined by the user # if its mode is not defined by the user
if 'mode' not in vars(variable) and \ if 'mode' not in vars(variable) and \
(variable.auto_save is True or variable.auto_freeze is True): (variable.auto_save is True or variable.auto_freeze is True):
variable.mode = modes_level[0] variable.mode = modes_level[0]
self._annotate_variable(variable, # mandatory variable without value is a basic variable
family_mode, if variable.mandatory is True and not hasattr(variable, 'default'):
) variable.mode = modes_level[0]
# none basic variable in high level family has to be in high level
if modes[variable.mode] < modes[family_mode] and \
(not is_follower or variable.mode != modes_level[0]):
variable.mode = family_mode
def _change_variable_mode_leader(self, def _change_variable_mode_leader(self,
leadership, leadership,
@ -113,10 +123,10 @@ class FamilyAnnotator:
xmlfiles = self.objectspace.display_xmlfiles(leadership.xmlfiles) xmlfiles = self.objectspace.display_xmlfiles(leadership.xmlfiles)
msg = f'leader/followers "{follower.name}" could not be auto_freeze in {xmlfiles}' msg = f'leader/followers "{follower.name}" could not be auto_freeze in {xmlfiles}'
raise DictConsistencyError(_(msg), 30) raise DictConsistencyError(_(msg), 30)
self._annotate_variable(follower, self._change_variabe_mode(follower,
family_mode, family_mode,
is_follower, is_follower,
) )
if leader_mode is None: if leader_mode is None:
leader_mode = leadership.variable[0].mode leader_mode = leadership.variable[0].mode
leadership.variable[0].mode = None leadership.variable[0].mode = None
@ -127,34 +137,6 @@ class FamilyAnnotator:
is_follower = True is_follower = True
leadership.mode = leader_mode leadership.mode = leader_mode
def _annotate_variable(self,
variable,
family_mode: str,
is_follower=False,
) -> None:
# mandatory variable without value is a basic variable
if variable.mandatory is True and not hasattr(variable, 'default'):
variable.mode = modes_level[0]
# none basic variable in high level family has to be in high level
if modes[variable.mode] < modes[family_mode] and \
(not is_follower or variable.mode != modes_level[0]):
variable.mode = family_mode
def change_family_mode(self):
"""change mode of a family
"""
for families in self.objectspace.space.variables.values():
for family in families.family.values():
# default is high level
mode = modes_level[-1]
# get de lower sub variable mode
for variable in family.variable.values():
variable_mode = variable.mode
if modes[mode] > modes[variable_mode]:
mode = variable_mode
# set the lower variable mode to family
family.mode = mode
def dynamic_families(self): def dynamic_families(self):
"""link dynamic families to object """link dynamic families to object
""" """