true serialize for _children

This commit is contained in:
Emmanuel Garette 2013-09-02 21:29:41 +02:00
parent 84b7ec7b37
commit cc3a33ef4f
1 changed files with 17 additions and 10 deletions

View File

@ -98,7 +98,7 @@ class BaseOption(BaseInformation):
"""
__slots__ = ('_name', '_requires', '_properties', '_readonly',
'_consistencies', '_calc_properties', '_state_consistencies',
'_state_requires')
'_state_requires', '_stated')
def __init__(self, name, doc, requires, properties):
if not valid_name(name):
@ -200,15 +200,20 @@ class BaseOption(BaseInformation):
self._state_requires = new_value
def _impl_getstate(self, descr):
self._stated = True
self._impl_convert_consistencies(descr)
self._impl_convert_requires(descr)
def __getstate__(self, export=False):
try:
self._stated
except AttributeError:
raise SystemError(_('cannot serialize Option, only in OptionDescription'))
slots = set()
for subclass in self.__class__.__mro__:
if subclass is not object:
slots.update(subclass.__slots__)
slots -= frozenset(['_children', '_cache_paths', '__weakref__'])
slots -= frozenset(['_cache_paths', '__weakref__'])
states = {}
for slot in slots:
# remove variable if save variable converted in _state_xxxx variable
@ -814,7 +819,7 @@ class OptionDescription(BaseOption):
'_state_group_type', '_properties', '_children',
'_consistencies', '_calc_properties', '__weakref__',
'_readonly', '_impl_informations', '_state_requires',
'_state_consistencies')
'_state_consistencies', '_stated')
_opt_type = 'optiondescription'
def __init__(self, name, doc, children, requires=None, properties=None):
@ -1017,14 +1022,16 @@ class OptionDescription(BaseOption):
for option in self.impl_getchildren():
option._impl_getstate(descr)
def __getstate__(self, export=False):
if not export:
def __getstate__(self):
try:
del(self._stated)
except AttributeError:
# if cannot delete, _impl_getstate never launch
# launch it recursivement
# _stated prevent __getstate__ launch more than one time
# _stated is delete, if re-serialize, re-lauch _impl_getstate
self._impl_getstate()
states = super(OptionDescription, self).__getstate__(True)
states['_state_children'] = []
for option in self.impl_getchildren():
states['_state_children'].append(option.__getstate__(True))
return states
return super(OptionDescription, self).__getstate__()
def validate_requires_arg(requires, name):