support multiple metaconfig and prefix

This commit is contained in:
Emmanuel Garette 2018-09-13 17:00:52 +02:00
parent 77a77dd01c
commit f6a9b88795
3 changed files with 58 additions and 32 deletions

View file

@ -711,12 +711,12 @@ def test_meta_properties_meta_copy():
conf2 = Config(interface1, session_id='conf2')
conf1.property.read_write()
conf2.property.read_write()
meta = MetaConfig([conf1, conf2])
meta = MetaConfig([conf1, conf2], session_id='meta1')
meta.property.read_write()
conf3 = meta.config('conf1').config.copy(session_id='conf3')
meta2 = conf3.config.meta()
assert meta != meta2
meta2 = conf3.config.metaconfig()
assert meta.config.name() == meta2.config.name()
assert meta.config('conf1').value.dict() == {'ip_admin_eth0': ['192.168.1.1']}
assert meta.config('conf2').value.dict() == {'ip_admin_eth0': ['192.168.1.1']}
@ -744,7 +744,7 @@ def test_meta_properties_meta_deepcopy():
meta.permissive.set(frozenset({'hidden'}))
meta.property.read_write()
meta2 = meta.config('conf1').config.deepcopy('conf3')
meta2 = meta.config('conf1').config.deepcopy(session_id='conf3')
assert meta != meta2
assert meta.permissive.get() == meta2.permissive.get()
@ -761,6 +761,22 @@ def test_meta_properties_meta_deepcopy():
assert meta2.config('conf3').value.dict() == {'ip_admin_eth0': ['192.168.1.1']}
def test_meta_properties_submeta_deepcopy():
ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True,
properties=('disabled',))
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
conf1 = Config(interface1, session_id='conf1')
conf1.property.read_write()
meta1 = MetaConfig([conf1], session_id='meta1')
meta2 = MetaConfig([meta1], session_id='meta2')
meta_copy = conf1.config.deepcopy(session_id='conf2',
metaconfig_prefix='copy_')
assert meta_copy.config.name() == 'copy_meta2'
assert meta_copy.config('copy_meta1').config.name() == 'copy_meta1'
assert meta_copy.config('copy_meta1').config('conf2').config.name() == 'conf2'
def test_meta_properties_meta_set_value():
ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',))

View file

@ -990,13 +990,15 @@ class TiramisuContextConfig(TiramisuContext):
def _c_deepcopy(self,
session_id=None,
persistent=False,
storage=None):
storage=None,
metaconfig_prefix=None):
return Config(self.config_bag.context.duplicate(session_id,
persistent=persistent,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
deep=True))
def _c_meta(self):
def _c_metaconfig(self):
return Config(self.config_bag.context.cfgimpl_get_meta())
def _m_new(self,

View file

@ -682,41 +682,49 @@ class _CommonConfig(SubConfig):
force_settings=None,
storage=None,
persistent=False,
metaconfig_prefix=None,
child=None,
deep=False):
if isinstance(self, KernelConfig):
config = KernelConfig(self._impl_descr,
_duplicate=True,
session_id=session_id,
force_values=force_values,
force_settings=force_settings,
persistent=persistent,
storage=storage)
duplicated_config = KernelConfig(self._impl_descr,
_duplicate=True,
session_id=session_id,
force_values=force_values,
force_settings=force_settings,
persistent=persistent,
storage=storage)
elif isinstance(self, KernelMetaConfig):
config = KernelMetaConfig([],
_duplicate=True,
optiondescription=self._impl_descr,
session_id=session_id,
force_values=force_values,
force_settings=force_settings,
persistent=persistent,
storage=storage)
if session_id is None and metaconfig_prefix is not None:
session_id = metaconfig_prefix + self.impl_getname()
duplicated_config = KernelMetaConfig([],
_duplicate=True,
optiondescription=self._impl_descr,
session_id=session_id,
force_values=force_values,
force_settings=force_settings,
persistent=persistent,
storage=storage)
else:
raise Exception('hu?')
config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation())
config.cfgimpl_get_settings()._p_.importation(self.cfgimpl_get_settings(
raise Exception(_('unknown type'))
duplicated_config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation())
duplicated_config.cfgimpl_get_settings()._p_.importation(self.cfgimpl_get_settings(
)._p_.exportation())
config.cfgimpl_get_settings()._pp_.importation(self.cfgimpl_get_settings(
duplicated_config.cfgimpl_get_settings()._pp_.importation(self.cfgimpl_get_settings(
)._pp_.exportation())
if child is not None:
duplicated_config._impl_children.append(child)
child._impl_meta = weakref.ref(duplicated_config)
if self._impl_meta:
if deep:
meta = self._impl_meta().duplicate(deep=deep, storage=storage, persistent=persistent)
meta._impl_children.append(config)
config._impl_meta = weakref.ref(meta)
config = meta
duplicated_config = self._impl_meta().duplicate(deep=deep,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
child=duplicated_config,
persistent=persistent)
else:
config._impl_meta = self._impl_meta
config._impl_meta()._impl_children.append(config)
return config
duplicated_config._impl_meta = self._impl_meta
self._impl_meta()._impl_children.append(duplicated_config)
return duplicated_config
# ____________________________________________________________