This commit is contained in:
Emmanuel Garette 2017-07-21 18:03:34 +02:00
parent be43c95ec0
commit ddaadb0701
19 changed files with 297 additions and 154 deletions

View File

@ -202,6 +202,7 @@ def test_config_impl_get_opt_by_path():
assert config.cfgimpl_get_description().impl_get_opt_by_path('bool') == boo assert config.cfgimpl_get_description().impl_get_opt_by_path('bool') == boo
assert config.cfgimpl_get_description().impl_get_opt_by_path('gc.dummy') == dummy assert config.cfgimpl_get_description().impl_get_opt_by_path('gc.dummy') == dummy
raises(AttributeError, "config.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')") raises(AttributeError, "config.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
raises(ConfigError, "config.gc.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
def test_information_display(): def test_information_display():

View File

@ -46,6 +46,10 @@ def return_wrong_list():
return ['---', ' '] return ['---', ' ']
def return_raise():
raise Exception('error')
def test_build_dyndescription(): def test_build_dyndescription():
st = StrOption('st', '') st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], callback=return_list) dod = DynOptionDescription('dod', '', [st], callback=return_list)
@ -57,6 +61,14 @@ def test_build_dyndescription():
assert str(cfg.dodval2) == "stval2 = None" assert str(cfg.dodval2) == "stval2 = None"
def test_build_dyndescription_raise():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], callback=return_raise)
od = OptionDescription('od', '', [dod])
cfg = Config(od)
raises(ConfigError, "str(cfg)")
def test_subpath_dyndescription(): def test_subpath_dyndescription():
st = StrOption('st', '') st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], callback=return_list) dod = DynOptionDescription('dod', '', [st], callback=return_list)
@ -221,6 +233,14 @@ def test_prop_dyndescription():
assert str(cfg.cfgimpl_get_settings()[dodval2]) == str([]) assert str(cfg.cfgimpl_get_settings()[dodval2]) == str([])
def test_prop_dyndescription_force_store_value():
st = StrOption('st', '', properties=('force_store_value',))
dod = DynOptionDescription('dod', '', [st], callback=return_list)
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
raises(ConfigError, "Config(od2)")
def test_callback_dyndescription(): def test_callback_dyndescription():
st = StrOption('st', '', callback=return_dynval) st = StrOption('st', '', callback=return_dynval)
dod = DynOptionDescription('dod', '', [st], callback=return_list) dod = DynOptionDescription('dod', '', [st], callback=return_list)

View File

@ -28,6 +28,11 @@ def make_description():
i6 = IntOption('i6', '', properties=('disabled',)) i6 = IntOption('i6', '', properties=('disabled',))
od1 = OptionDescription('od1', '', [i1, i2, i3, i4, i5, i6]) od1 = OptionDescription('od1', '', [i1, i2, i3, i4, i5, i6])
od2 = OptionDescription('od2', '', [od1]) od2 = OptionDescription('od2', '', [od1])
return od2
def make_metaconfig():
od2 = make_description()
conf1 = Config(od2, session_id='conf3') conf1 = Config(od2, session_id='conf3')
conf2 = Config(od2, session_id='conf4') conf2 = Config(od2, session_id='conf4')
meta = MetaConfig([conf1, conf2], session_id='meta') meta = MetaConfig([conf1, conf2], session_id='meta')
@ -40,7 +45,7 @@ def make_description():
#FIXME ne pas mettre 2 OD differents dans un meta #FIXME ne pas mettre 2 OD differents dans un meta
#FIXME serialization #FIXME serialization
def test_none(): def test_none():
meta = make_description() meta = make_metaconfig()
conf1, conf2 = meta.cfgimpl_get_children() conf1, conf2 = meta.cfgimpl_get_children()
assert conf1.od1.i3 is conf2.od1.i3 is None assert conf1.od1.i3 is conf2.od1.i3 is None
assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
@ -69,7 +74,7 @@ def test_none():
def test_default(): def test_default():
meta = make_description() meta = make_metaconfig()
conf1, conf2 = meta.cfgimpl_get_children() conf1, conf2 = meta.cfgimpl_get_children()
assert conf1.od1.i2 == conf2.od1.i2 == 1 assert conf1.od1.i2 == conf2.od1.i2 == 1
assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
@ -98,18 +103,19 @@ def test_default():
def test_contexts(): def test_contexts():
meta = make_description() meta = make_metaconfig()
conf1, conf2 = meta.cfgimpl_get_children() conf1, conf2 = meta.cfgimpl_get_children()
assert conf1.od1.i2 == conf2.od1.i2 == 1 assert conf1.od1.i2 == conf2.od1.i2 == 1
assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
meta.set_value('od1.i2', 6, only_config=True) errors = meta.set_value('od1.i2', 6, only_config=True)
assert meta.od1.i2 == 1 assert meta.od1.i2 == 1
assert conf1.od1.i2 == conf2.od1.i2 == 6 assert conf1.od1.i2 == conf2.od1.i2 == 6
assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.user assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.user
assert len(errors) == 0
def test_find(): def test_find():
meta = make_description() meta = make_metaconfig()
i2 = meta.unwrap_from_path('od1.i2') i2 = meta.unwrap_from_path('od1.i2')
assert [i2] == meta.find(byname='i2') assert [i2] == meta.find(byname='i2')
assert i2 == meta.find_first(byname='i2') assert i2 == meta.find_first(byname='i2')
@ -123,8 +129,11 @@ def test_group_error():
def test_meta_meta(): def test_meta_meta():
meta1 = make_description() meta1 = make_metaconfig()
meta2 = MetaConfig([meta1]) meta2 = MetaConfig([meta1])
assert str(meta1) == """(conf3)
(conf4)
[od1]"""
meta2.cfgimpl_get_settings().setowner(owners.meta) meta2.cfgimpl_get_settings().setowner(owners.meta)
conf1, conf2 = meta1.cfgimpl_get_children() conf1, conf2 = meta1.cfgimpl_get_children()
assert conf1.od1.i2 == conf2.od1.i2 == 1 assert conf1.od1.i2 == conf2.od1.i2 == 1
@ -156,14 +165,38 @@ def test_meta_meta():
assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
def test_meta_config_name():
od = make_description()
meta = MetaConfig(['name1', 'name2'], optiondescription=od)
assert len(meta.cfgimpl_get_children()) == 2
assert meta.name1
assert meta.name2
def test_meta_new_config():
meta = make_metaconfig()
assert len(meta.cfgimpl_get_children()) == 2
meta.new_config('newconf1')
assert len(meta.cfgimpl_get_children()) == 3
def test_meta_new_config_wrong_name():
meta = make_metaconfig()
assert len(meta.cfgimpl_get_children()) == 2
raises(ConflictError, "meta.new_config('conf4')")
assert len(meta.cfgimpl_get_children()) == 2
def test_meta_meta_set(): def test_meta_meta_set():
meta1 = make_description() meta1 = make_metaconfig()
meta2 = MetaConfig([meta1]) meta2 = MetaConfig([meta1])
meta2.cfgimpl_get_settings().setowner(owners.meta) meta2.cfgimpl_get_settings().setowner(owners.meta)
meta2.read_write() meta2.read_write()
conf1, conf2 = meta1.cfgimpl_get_children() conf1, conf2 = meta1.cfgimpl_get_children()
meta2.set_value('od1.i1', 7, only_config=True) errors1 = meta2.set_value('od1.i1', 7, only_config=True)
meta2.set_value('od1.i6', 7, only_config=True) errors2 = meta2.set_value('od1.i6', 7, only_config=True)
assert len(errors1) == 0
assert len(errors2) == 2
assert conf1.od1.i1 == conf2.od1.i1 == 7 assert conf1.od1.i1 == conf2.od1.i1 == 7
assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user
assert [conf1, conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children() assert [conf1, conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children()
@ -189,7 +222,7 @@ def test_not_meta():
conf3 = Config(od2) conf3 = Config(od2)
try: try:
conf4 = Config(od2, session_id='conf2') conf4 = Config(od2, session_id='conf2')
except ValueError: except ConflictError:
pass pass
else: else:
conf3, conf4 conf3, conf4
@ -199,7 +232,8 @@ def test_not_meta():
grp = GroupConfig([conf1, conf2]) grp = GroupConfig([conf1, conf2])
raises(ConfigError, 'grp.od1.i1') raises(ConfigError, 'grp.od1.i1')
conf1, conf2 = grp.cfgimpl_get_children() conf1, conf2 = grp.cfgimpl_get_children()
grp.set_value('od1.i1', 7) errors = grp.set_value('od1.i1', 7)
assert len(errors) == 0
assert grp.conf1.od1.i1 == conf2.od1.i1 == 7 assert grp.conf1.od1.i1 == conf2.od1.i1 == 7
assert grp.conf1.getowner(grp.conf1.unwrap_from_path('od1.i1')) is grp.conf2.getowner(grp.conf2.unwrap_from_path('od1.i1')) is owners.user assert grp.conf1.getowner(grp.conf1.unwrap_from_path('od1.i1')) is grp.conf2.getowner(grp.conf2.unwrap_from_path('od1.i1')) is owners.user
@ -211,6 +245,9 @@ def test_group_find_firsts():
conf1 = Config(od2, session_id='conf1') conf1 = Config(od2, session_id='conf1')
conf2 = Config(od2, session_id='conf2') conf2 = Config(od2, session_id='conf2')
grp = GroupConfig([conf1, conf2]) grp = GroupConfig([conf1, conf2])
assert str(grp) == """(conf1)
(conf2)
"""
assert [conf1, conf2] == grp.find_firsts(byname='i1').cfgimpl_get_children() assert [conf1, conf2] == grp.find_firsts(byname='i1').cfgimpl_get_children()
@ -222,13 +259,14 @@ def test_group_group():
conf2 = Config(od2, session_id='conf10') conf2 = Config(od2, session_id='conf10')
grp = GroupConfig([conf1, conf2], 'grp') grp = GroupConfig([conf1, conf2], 'grp')
grp2 = GroupConfig([grp]) grp2 = GroupConfig([grp])
grp2.set_value('od1.i1', 2) errors = grp2.set_value('od1.i1', 2)
assert grp2.grp.conf9.od1.i1 == 2 assert grp2.grp.conf9.od1.i1 == 2
assert grp2.grp.conf9.getowner(i1) == owners.user assert grp2.grp.conf9.getowner(i1) == owners.user
assert len(errors) == 0
def test_meta_path(): def test_meta_path():
meta = make_description() meta = make_metaconfig()
assert meta._impl_path is None assert meta._impl_path is None
assert meta.od1._impl_path == 'od1' assert meta.od1._impl_path == 'od1'
@ -265,6 +303,7 @@ def test_meta_master_slaves():
conf2 = Config(interface1, session_id='conf2') conf2 = Config(interface1, session_id='conf2')
meta = MetaConfig([conf1, conf2]) meta = MetaConfig([conf1, conf2])
meta.read_only() meta.read_only()
assert [conf1, conf2] == meta.find_firsts(byname='ip_admin_eth0').cfgimpl_get_children()
assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children() assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
meta.read_write() meta.read_write()
raises(AttributeError, "meta.find_firsts(byname='netmask_admin_eth0')") raises(AttributeError, "meta.find_firsts(byname='netmask_admin_eth0')")
@ -361,19 +400,22 @@ def test_meta_force_default():
assert meta.ip_admin_eth0 == [] assert meta.ip_admin_eth0 == []
assert meta.conf1.ip_admin_eth0 == [] assert meta.conf1.ip_admin_eth0 == []
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
meta.set_value('ip_admin_eth0', ['192.168.1.1']) errors = meta.set_value('ip_admin_eth0', ['192.168.1.1'])
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.1'] assert meta.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.1'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.1'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
meta.conf1.ip_admin_eth0 = ['192.168.1.2'] errors = meta.conf1.ip_admin_eth0 = ['192.168.1.2']
assert meta.ip_admin_eth0 == ['192.168.1.1'] assert meta.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.2'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.1'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
meta.set_value('ip_admin_eth0', ['192.168.1.3']) errors = meta.set_value('ip_admin_eth0', ['192.168.1.3'])
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.3'] assert meta.ip_admin_eth0 == ['192.168.1.3']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.2'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.3'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.3']
meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.4'] assert meta.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
@ -399,7 +441,8 @@ def test_meta_force_dont_change_value():
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
assert conf1.getowner(ip_admin_eth0) is owners.user assert conf1.getowner(ip_admin_eth0) is owners.user
assert conf2.getowner(ip_admin_eth0) is owners.default assert conf2.getowner(ip_admin_eth0) is owners.default
meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.4'] assert meta.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
@ -429,7 +472,8 @@ def test_meta_force_default_if_same():
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
assert conf1.getowner(ip_admin_eth0) is owners.user assert conf1.getowner(ip_admin_eth0) is owners.user
assert conf2.getowner(ip_admin_eth0) is owners.default assert conf2.getowner(ip_admin_eth0) is owners.default
meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.4'] assert meta.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
@ -441,7 +485,8 @@ def test_meta_force_default_if_same():
assert meta.conf2.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
assert conf1.getowner(ip_admin_eth0) is owners.user assert conf1.getowner(ip_admin_eth0) is owners.user
assert conf2.getowner(ip_admin_eth0) is owners.meta assert conf2.getowner(ip_admin_eth0) is owners.meta
meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.5'] assert meta.ip_admin_eth0 == ['192.168.1.5']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.3'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.5'] assert meta.conf2.ip_admin_eth0 == ['192.168.1.5']
@ -471,7 +516,8 @@ def test_meta_force_default_if_same_and_dont_change():
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
assert conf1.getowner(ip_admin_eth0) is owners.user assert conf1.getowner(ip_admin_eth0) is owners.user
assert conf2.getowner(ip_admin_eth0) is owners.default assert conf2.getowner(ip_admin_eth0) is owners.default
meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.4'] assert meta.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.4'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
@ -483,7 +529,8 @@ def test_meta_force_default_if_same_and_dont_change():
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
assert conf1.getowner(ip_admin_eth0) is owners.user assert conf1.getowner(ip_admin_eth0) is owners.user
assert conf2.getowner(ip_admin_eth0) is owners.user assert conf2.getowner(ip_admin_eth0) is owners.user
meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True) errors = meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True)
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.5'] assert meta.ip_admin_eth0 == ['192.168.1.5']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.3'] assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
assert meta.conf2.ip_admin_eth0 == [] assert meta.conf2.ip_admin_eth0 == []
@ -640,3 +687,33 @@ def test_meta_properties_meta_set_value():
ret = meta.set_value('ip_admin_eth0', '255.255.255.255', force_default_if_same=True) ret = meta.set_value('ip_admin_eth0', '255.255.255.255', force_default_if_same=True)
assert len(ret) == 1 assert len(ret) == 1
assert isinstance(ret[0], ValueError) assert isinstance(ret[0], ValueError)
def test_meta_reset():
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master)
conf1 = Config(interface1, session_id='conf1')
conf1.read_write()
conf2 = Config(interface1, session_id='conf2')
conf2.read_write()
meta = MetaConfig([conf1, conf2])
meta.read_write()
meta.cfgimpl_get_settings().setowner(owners.meta)
assert meta.ip_admin_eth0 == []
assert meta.conf1.ip_admin_eth0 == []
assert meta.conf2.ip_admin_eth0 == []
errors = meta.set_value('ip_admin_eth0', ['192.168.1.1'])
assert len(errors) == 0
assert meta.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
meta.conf1.ip_admin_eth0 = ['192.168.1.2']
assert meta.ip_admin_eth0 == ['192.168.1.1']
assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
meta.reset('ip_admin_eth0')
assert meta.ip_admin_eth0 == []
assert meta.conf1.ip_admin_eth0 == []
assert meta.conf2.ip_admin_eth0 == []

View File

@ -215,7 +215,6 @@ def test_consistency_not_equal_submulti():
a = IntOption('a', '', multi=submulti) a = IntOption('a', '', multi=submulti)
b = IntOption('b', '', multi=submulti) b = IntOption('b', '', multi=submulti)
od = OptionDescription('a', '', [a, b]) od = OptionDescription('a', '', [a, b])
od.impl_set_group_type(groups.master)
raises(ConfigError, 'a.impl_add_consistency("not_equal", b)') raises(ConfigError, 'a.impl_add_consistency("not_equal", b)')
@ -250,6 +249,42 @@ def test_consistency_not_equal_masterslave():
raises(ValueError, "c.b[1] = 3") raises(ValueError, "c.b[1] = 3")
def test_consistency_not_equal_masterslave_error_multi1():
a = IPOption('a', '', multi=True)
b = NetmaskOption('b', '', multi=True)
c = NetmaskOption('c', '', multi=True)
od = OptionDescription('a', '', [a, b])
od.impl_set_group_type(groups.master)
od2 = OptionDescription('b', '', [od, c])
c.impl_add_consistency('ip_netmask', a)
raises(ConfigError, "Config(od2)")
def test_consistency_not_equal_masterslave_error_multi2():
a = IPOption('a', '', multi=True)
b = NetmaskOption('b', '', multi=True)
c = IPOption('c', '', multi=True)
od = OptionDescription('a', '', [a, b])
od.impl_set_group_type(groups.master)
od2 = OptionDescription('b', '', [od, c])
b.impl_add_consistency('ip_netmask', c)
raises(ConfigError, "Config(od2)")
def test_consistency_not_equal_masterslave_error_othermaster():
a = IPOption('a', '', multi=True)
b = NetmaskOption('b', '', multi=True)
c = IPOption('c', '', multi=True)
d = NetmaskOption('d', '', multi=True)
od = OptionDescription('a', '', [a, b])
od.impl_set_group_type(groups.master)
od2 = OptionDescription('c', '', [c, d])
od2.impl_set_group_type(groups.master)
od3 = OptionDescription('b', '', [od, od2])
d.impl_add_consistency('ip_netmask', a)
raises(ConfigError, "Config(od2)")
def test_consistency_not_equal_masterslaves_default(): def test_consistency_not_equal_masterslaves_default():
a = IntOption('a', '', multi=True) a = IntOption('a', '', multi=True)
b = IntOption('b', '', multi=True, default_multi=1) b = IntOption('b', '', multi=True, default_multi=1)

View File

@ -5,7 +5,7 @@ do_autopath()
from py.test import raises from py.test import raises
from tiramisu.i18n import _ from tiramisu.i18n import _
from tiramisu.error import display_list from tiramisu.error import display_list, ConfigError
from tiramisu.setting import owners, groups from tiramisu.setting import owners, groups
from tiramisu.config import Config from tiramisu.config import Config
from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \ from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
@ -431,8 +431,11 @@ def test_append_properties():
assert tuple(option._properties) == tuple() assert tuple(option._properties) == tuple()
assert not 'test' in setting[option] assert not 'test' in setting[option]
setting[option].append('test') setting[option].append('test')
raises(ConfigError, "setting[option].append('force_store_value')")
raises(ConfigError, "setting.append('force_store_value')")
assert tuple(option._properties) == tuple() assert tuple(option._properties) == tuple()
assert 'test' in setting[option] assert 'test' in setting[option]
assert setting[option].get() == ('test',)
def test_reset_properties(): def test_reset_properties():

View File

@ -154,6 +154,65 @@ def test_permissive_option():
assert props == ['disabled'] assert props == ['disabled']
def test_permissive_option_cache():
descr = make_description()
u1 = descr.u1
config = Config(descr)
setting = config.cfgimpl_get_settings()
config.read_write()
setting.remove('expire')
props = []
try:
config.u1
except PropertiesOptionError as err:
props = err.proptype
assert props == ['disabled']
props = []
try:
config.u2
except PropertiesOptionError as err:
props = err.proptype
assert props == ['disabled']
setting.setpermissive(('disabled',), u1)
props = []
try:
config.u1
except PropertiesOptionError as err:
props = err.proptype
assert props == []
props = []
try:
config.u2
except PropertiesOptionError as err:
props = err.proptype
assert props == ['disabled']
setting.append('permissive')
config.u1
props = []
try:
config.u2
except PropertiesOptionError as err:
props = err.proptype
assert props == ['disabled']
setting.remove('permissive')
props = []
try:
config.u1
except PropertiesOptionError as err:
props = err.proptype
assert props == []
props = []
try:
config.u2
except PropertiesOptionError as err:
props = err.proptype
assert props == ['disabled']
def test_permissive_option_mandatory(): def test_permissive_option_mandatory():
descr = make_description() descr = make_description()
u1 = descr.u1 u1 = descr.u1

View File

@ -324,6 +324,30 @@ def test_requires_transitive_hidden_disabled():
raises(RequirementError, 'c.ip_address_service_web') raises(RequirementError, 'c.ip_address_service_web')
def test_requires_transitive_hidden_disabled_multiple():
a = BoolOption('activate_service', '', True)
b = BoolOption('activate_service_web', '', True,
requires=[{'option': a, 'expected': False, 'action': 'hidden'},
{'option': a, 'expected': False, 'action': 'disabled'}])
d = IPOption('ip_address_service_web', '',
requires=[{'option': b, 'expected': False, 'action': 'mandatory'}])
od = OptionDescription('service', '', [a, b, d])
c = Config(od)
c.read_write()
c.activate_service
c.activate_service_web
c.ip_address_service_web
c.activate_service = False
#
props = []
try:
c.activate_service_web
except PropertiesOptionError as err:
props = err.proptype
assert set(props) == {'disabled', 'hidden'}
raises(RequirementError, 'c.ip_address_service_web')
def test_requires_not_transitive(): def test_requires_not_transitive():
a = BoolOption('activate_service', '', True) a = BoolOption('activate_service', '', True)
b = BoolOption('activate_service_web', '', True, b = BoolOption('activate_service_web', '', True,

View File

@ -35,7 +35,7 @@ from .value import Values, Multi
from .i18n import _ from .i18n import _
if sys.version_info[0] >= 3: # pragma: optional cover if sys.version_info[0] >= 3: # pragma: no cover
xrange = range xrange = range
@ -482,7 +482,7 @@ class SubConfig(object):
# if value and/or check_properties are set, need all avalaible option # if value and/or check_properties are set, need all avalaible option
# If first one has no good value or not good property check second one # If first one has no good value or not good property check second one
# and so on # and so on
only_first = first is True and byvalue is None and \ only_first = first is True and byvalue is undefined and \
check_properties is None check_properties is None
if only_path is not undefined: if only_path is not undefined:
options = [(only_path, only_option)] options = [(only_path, only_option)]
@ -752,7 +752,7 @@ class _CommonConfig(SubConfig):
self._impl_context = weakref.ref(self) self._impl_context = weakref.ref(self)
self._impl_settings.context = weakref.ref(self) self._impl_settings.context = weakref.ref(self)
self._impl_values.context = weakref.ref(self) self._impl_values.context = weakref.ref(self)
storage = get_storage('config', test=self._impl_test, **state['_storage']) storage = get_storage(test=self._impl_test, **state['_storage'])
self._impl_values._impl_setstate(storage) self._impl_values._impl_setstate(storage)
self._impl_settings._impl_setstate(storage) self._impl_settings._impl_setstate(storage)
self._impl_meta = None self._impl_meta = None
@ -836,8 +836,6 @@ class GroupConfig(_CommonConfig):
if not isinstance(child, _CommonConfig): if not isinstance(child, _CommonConfig):
raise ValueError(_("groupconfig's children must be Config, MetaConfig or GroupConfig")) raise ValueError(_("groupconfig's children must be Config, MetaConfig or GroupConfig"))
name_ = child._impl_name name_ = child._impl_name
if name_ is None:
raise ValueError(_('name must be set to config before creating groupconfig'))
names.append(name_) names.append(name_)
if len(names) != len(set(names)): if len(names) != len(set(names)):
for idx in xrange(1, len(names) + 1): for idx in xrange(1, len(names) + 1):
@ -923,16 +921,16 @@ class GroupConfig(_CommonConfig):
else: else:
return GroupConfig(self._find_return_results(ret, raise_if_not_found)) return GroupConfig(self._find_return_results(ret, raise_if_not_found))
def __repr__(self):
return object.__repr__(self)
def __str__(self): def __str__(self):
ret = '' ret = ''
for child in self._impl_children: for child in self._impl_children:
ret += '({0})\n'.format(child._impl_name) ret += '({0})\n'.format(child._impl_name)
ret += super(GroupConfig, self).__str__() if self._impl_descr is not None:
ret += super(GroupConfig, self).__str__()
return ret return ret
__repr__ = __str__
def getattr(self, name, force_permissive=False, validate=True, def getattr(self, name, force_permissive=False, validate=True,
_setting_properties=undefined, _self_properties=undefined, index=None, _setting_properties=undefined, _self_properties=undefined, index=None,
returns_raise=False): returns_raise=False):
@ -951,14 +949,14 @@ class MetaConfig(GroupConfig):
__slots__ = tuple() __slots__ = tuple()
def __init__(self, children, session_id=None, persistent=False, def __init__(self, children, session_id=None, persistent=False,
optiondescription=None): optiondescription=None, _force_store_values=True):
descr = None descr = None
if optiondescription is not None: if optiondescription is not None:
new_children = [] new_children = []
for child_session_id in children: for child_session_id in children:
#FIXME _force_store_values doit etre a true si inexistant ! #FIXME _force_store_values doit etre a true si inexistant !
new_children.append(Config(optiondescription, persistent=True, new_children.append(Config(optiondescription, persistent=persistent,
session_id=child_session_id, _force_store_values=False)) session_id=child_session_id, _force_store_values=_force_store_values))
children = new_children children = new_children
for child in children: for child in children:
if not isinstance(child, _CommonConfig): if not isinstance(child, _CommonConfig):
@ -1004,12 +1002,10 @@ class MetaConfig(GroupConfig):
else: else:
child_value = child.getattr(path) child_value = child.getattr(path)
if force_default or value == child_value: if force_default or value == child_value:
childret = child.cfgimpl_get_values().reset(opt, path=path, child.cfgimpl_get_values().reset(opt, path=path,
validate=False, validate=False,
_setting_properties=setting_properties, _setting_properties=setting_properties,
_commit=False) _commit=False)
if childret is not None:
ret.append(childret)
continue continue
if force_dont_change_value: if force_dont_change_value:
child_value = child.getattr(path, _setting_properties=setting_properties, child_value = child.getattr(path, _setting_properties=setting_properties,
@ -1018,7 +1014,7 @@ class MetaConfig(GroupConfig):
ret.append(child_value) ret.append(child_value)
elif value != child_value: elif value != child_value:
childret = child.setattr(path, child_value, _commit=False, not_raises=True) childret = child.setattr(path, child_value, _commit=False, not_raises=True)
if childret is not None: if childret is not None: # pragma: no cover
ret.append(childret) ret.append(childret)
setret = self.setattr(path, value, _commit=_commit, not_raises=True) setret = self.setattr(path, value, _commit=_commit, not_raises=True)
@ -1038,6 +1034,13 @@ class MetaConfig(GroupConfig):
validate=False, validate=False,
_setting_properties=setting_properties) _setting_properties=setting_properties)
def new_config(self, session_id=None, persistent=False): def new_config(self, session_id, persistent=False):
return Config(self._impl_descr, session_id=session_id, config = Config(self._impl_descr, session_id=session_id,
persistent=persistent) persistent=persistent)
if config._impl_name in [child._impl_name for child in self._impl_children]: # pragma: no cover
raise ConflictError(_('config name must be uniq in '
'groupconfig for {0}').format(config._impl_name))
config._impl_meta = weakref.ref(self)
self._impl_children.append(config)
return config

View File

@ -554,7 +554,7 @@ class Option(OnlyOption):
return opt_value return opt_value
else: else:
opt_value = None opt_value = None
else: else: # pragma: no cover
return opt_value return opt_value
elif index is None: elif index is None:
opt_value = opt.impl_getdefault() opt_value = opt.impl_getdefault()
@ -719,7 +719,7 @@ class Option(OnlyOption):
' must be a list').format( ' must be a list').format(
value, self.impl_get_display_name())) value, self.impl_get_display_name()))
for idx, val in enumerate(value): for idx, val in enumerate(value):
if isinstance(val, list): if isinstance(val, list): # pragma: no cover
return ValueError(_('invalid value "{}" for "{}" ' return ValueError(_('invalid value "{}" for "{}" '
'which must not be a list').format(val, 'which must not be a list').format(val,
self.impl_get_display_name())) self.impl_get_display_name()))

View File

@ -36,7 +36,7 @@ StorageOptionDescription = get_storages_option('optiondescription')
name_regexp = re.compile(r'^[a-zA-Z\d\-_]*$') name_regexp = re.compile(r'^[a-zA-Z\d\-_]*$')
import sys import sys
if sys.version_info[0] >= 3: # pragma: optional cover if sys.version_info[0] >= 3: # pragma: no cover
xrange = range xrange = range
del(sys) del(sys)
@ -141,18 +141,18 @@ class OptionDescription(BaseOption, StorageOptionDescription):
if func not in allowed_const_list and is_multi: if func not in allowed_const_list and is_multi:
is_masterslaves = option.impl_is_master_slaves() is_masterslaves = option.impl_is_master_slaves()
if not is_masterslaves: if not is_masterslaves:
raise ValueError(_('malformed consistency option "{0}" ' raise ConfigError(_('malformed consistency option "{0}" '
'must be a master/slaves').format( 'must be a master/slaves').format(
option.impl_getname())) option.impl_getname()))
masterslaves = option.impl_get_master_slaves() masterslaves = option.impl_get_master_slaves()
for opt in all_cons_opts: for opt in all_cons_opts:
if func not in allowed_const_list and is_multi: if func not in allowed_const_list and is_multi:
if not opt.impl_is_master_slaves(): if not opt.impl_is_master_slaves():
raise ValueError(_('malformed consistency option "{0}" ' raise ConfigError(_('malformed consistency option "{0}" '
'must not be a multi for "{1}"').format( 'must not be a multi for "{1}"').format(
option.impl_getname(), opt.impl_getname())) option.impl_getname(), opt.impl_getname()))
elif masterslaves != opt.impl_get_master_slaves(): elif masterslaves != opt.impl_get_master_slaves():
raise ValueError(_('malformed consistency option "{0}" ' raise ConfigError(_('malformed consistency option "{0}" '
'must be in same master/slaves for "{1}"').format( 'must be in same master/slaves for "{1}"').format(
option.impl_getname(), opt.impl_getname())) option.impl_getname(), opt.impl_getname()))
_consistencies.setdefault(opt, _consistencies.setdefault(opt,
@ -318,8 +318,6 @@ class OptionDescription(BaseOption, StorageOptionDescription):
values = carry_out_calculation(self, context=context, values = carry_out_calculation(self, context=context,
callback=callback, callback=callback,
callback_params=callback_params) callback_params=callback_params)
if isinstance(values, Exception):
raise values
if len(values) > len(set(values)): if len(values) > len(set(values)):
raise ConfigError(_('DynOptionDescription callback return not unique value')) raise ConfigError(_('DynOptionDescription callback return not unique value'))
for val in values: for val in values:
@ -327,16 +325,14 @@ class OptionDescription(BaseOption, StorageOptionDescription):
raise ValueError(_("invalid suffix: {0} for option").format(val)) raise ValueError(_("invalid suffix: {0} for option").format(val))
return values return values
def _impl_search_dynchild(self, name=undefined, context=undefined): def _impl_search_dynchild(self, name, context):
ret = [] ret = []
for child in self._impl_st_getchildren(context, only_dyn=True): for child in self._impl_st_getchildren(context, only_dyn=True):
cname = child.impl_getname() cname = child.impl_getname()
if name is undefined or name.startswith(cname): if name.startswith(cname):
path = cname path = cname
for value in child._impl_get_suffixes(context): for value in child._impl_get_suffixes(context):
if name is undefined: if name == cname + value:
ret.append(SynDynOptionDescription(child, cname + value, path + value, value))
elif name == cname + value:
return SynDynOptionDescription(child, name, path + value, value) return SynDynOptionDescription(child, name, path + value, value)
return ret return ret
@ -388,9 +384,6 @@ class DynOptionDescription(OptionDescription):
if isinstance(child, SymLinkOption): if isinstance(child, SymLinkOption):
raise ConfigError(_('cannot set symlinkoption in a ' raise ConfigError(_('cannot set symlinkoption in a '
'dynoptiondescription')) 'dynoptiondescription'))
if isinstance(child, SymLinkOption):
raise ConfigError(_('cannot set symlinkoption in a '
'dynoptiondescription'))
child._impl_setsubdyn(self) child._impl_setsubdyn(self)
self.impl_set_callback(callback, callback_params) self.impl_set_callback(callback, callback_params)

View File

@ -732,7 +732,7 @@ class Settings(object):
# transitive action, force expected # transitive action, force expected
value = expected[0] value = expected[0]
inverse = False inverse = False
else: else: # pragma: no cover
raise value raise value
else: else:
orig_value = value orig_value = value

View File

@ -49,7 +49,7 @@ class StorageType(object):
mod = None mod = None
def set(self, name): # pragma: optional cover def set(self, name): # pragma: optional cover
if self.storage_type is not None: if self.storage_type is not None: # pragma: no cover
if self.storage_type == name: if self.storage_type == name:
return return
raise ConfigError(_('storage_type is already set, cannot rebind it')) raise ConfigError(_('storage_type is already set, cannot rebind it'))
@ -65,7 +65,7 @@ class StorageType(object):
modulepath = '{0}.storage.{1}'.format(MODULE_PATH, self.storage_type) modulepath = '{0}.storage.{1}'.format(MODULE_PATH, self.storage_type)
try: try:
mod = __import__(modulepath) mod = __import__(modulepath)
except ImportError: except ImportError: # pragma: no cover
raise SystemError(_('cannot import the storage {0}').format( raise SystemError(_('cannot import the storage {0}').format(
self.default_storage)) self.default_storage))
for token in modulepath.split(".")[1:]: for token in modulepath.split(".")[1:]:
@ -81,7 +81,7 @@ default_validation = StorageType()
default_validation.set(DEFAULT_STORAGE) default_validation.set(DEFAULT_STORAGE)
def set_storage(type_, name, **kwargs): # pragma: optional cover def set_storage(type_, name): # pragma: optional cover
"""Change storage's configuration """Change storage's configuration
:params name: is the storage name. If storage is already set, cannot :params name: is the storage name. If storage is already set, cannot
@ -89,19 +89,8 @@ def set_storage(type_, name, **kwargs): # pragma: optional cover
Other attributes are differents according to the selected storage's name Other attributes are differents according to the selected storage's name
""" """
if type_ == 'option': storage_type.set(name)
storage_option_type.set(name) setting = storage_type.get().setting
setting = storage_option_type.get().setting
else:
storage_type.set(name)
setting = storage_type.get().setting
for option, value in kwargs.items():
try:
getattr(setting, option)
setattr(setting, option, value)
except AttributeError:
raise ValueError(_('option {0} not already exists in storage {1}'
'').format(option, name))
def _impl_getstate_setting(): def _impl_getstate_setting():
@ -113,16 +102,10 @@ def _impl_getstate_setting():
return state return state
def get_storage(type_, session_id, persistent, test): # pragma: optional cover def get_storage(session_id, persistent, test): # pragma: optional cover
"""all used when __setstate__ a Config """all used when __setstate__ a Config
""" """
#FIXME ca sert ??? return storage_type.get().Storage(session_id, persistent, test)
if type_ == 'option':
return storage_option_type.get().Storage(session_id, persistent, test)
elif type_ == 'config':
return storage_type.get().Storage(session_id, persistent, test)
else:
return default_validation.get().Storage(session_id, persistent, test)
def get_storages(context, session_id, persistent): def get_storages(context, session_id, persistent):

View File

@ -402,12 +402,6 @@ class StorageOptionDescription(StorageBase):
__slots__ = ('_children', '_cache_paths', '_cache_consistencies', __slots__ = ('_children', '_cache_paths', '_cache_consistencies',
'_group_type', '_state_group_type', '_cache_force_store_values') '_group_type', '_state_group_type', '_cache_force_store_values')
def __init__(self, name, multi, warnings_only, doc, extra):
super(StorageOptionDescription, self).__init__(name, multi,
warnings_only, doc,
None, undefined,
undefined, undefined)
def _add_children(self, child_names, children): def _add_children(self, child_names, children):
_setattr = object.__setattr__ _setattr = object.__setattr__
_setattr(self, '_children', (tuple(child_names), tuple(children))) _setattr(self, '_children', (tuple(child_names), tuple(children)))
@ -550,7 +544,7 @@ class StorageOptionDescription(StorageBase):
if _filter(path, option) is False: if _filter(path, option) is False:
continue continue
if only_first: if only_first:
return find_results[0] return find_results
return find_results return find_results
def _impl_st_getchildren(self, context, only_dyn=False): def _impl_st_getchildren(self, context, only_dyn=False):

View File

@ -36,9 +36,6 @@ class Properties(Cache):
def getproperties(self, path, default_properties): def getproperties(self, path, default_properties):
return self._properties.get(path, set(default_properties)) return self._properties.get(path, set(default_properties))
def hasproperties(self, path):
return path in self._properties
def reset_all_properties(self): def reset_all_properties(self):
self._properties.clear() self._properties.clear()

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# ____________________________________________________________ # ____________________________________________________________
from ...i18n import _ from ...i18n import _
from ...error import ConfigError from ...error import ConfigError, ConflictError
from ..util import SerializeObject from ..util import SerializeObject
@ -45,7 +45,7 @@ class Storage(object):
def __init__(self, session_id, persistent, test=False): def __init__(self, session_id, persistent, test=False):
if not test and session_id in _list_sessions: # pragma: optional cover if not test and session_id in _list_sessions: # pragma: optional cover
raise ValueError(_('session already used')) raise ConflictError(_('session already used'))
if persistent: # pragma: optional cover if persistent: # pragma: optional cover
raise ValueError(_('a dictionary cannot be persistent')) raise ValueError(_('a dictionary cannot be persistent'))
self.session_id = session_id self.session_id = session_id

View File

@ -85,12 +85,6 @@ class Values(Cache):
self._setvalue_info(3, idx, owner, values, index, vidx) self._setvalue_info(3, idx, owner, values, index, vidx)
self._values = tuple(values) self._values = tuple(values)
def getvalue(self, path, session, index=None):
"""get value for a path
return: only value, not the owner
"""
return self._getvalue(path, 2, index)
def hasvalue(self, path, index=None): def hasvalue(self, path, index=None):
"""if path has a value """if path has a value
return: boolean return: boolean

View File

@ -49,12 +49,6 @@ class Properties(Sqlite3DB):
else: else:
return set(self._sqlite_decode(value[0])) return set(self._sqlite_decode(value[0]))
def hasproperties(self, path):
path = self._sqlite_encode_path(path)
return self._storage.select("SELECT properties FROM property WHERE "
"path = ? AND session_id = ? LIMIT 1", (path, self._session_id)
) is not None
def reset_all_properties(self): def reset_all_properties(self):
self._storage.execute("DELETE FROM property WHERE session_id = ?", (self._session_id,)) self._storage.execute("DELETE FROM property WHERE session_id = ?", (self._session_id,))

View File

@ -72,16 +72,6 @@ class Values(Sqlite3DB):
self._session_id), self._session_id),
commit=commit) commit=commit)
def getvalue(self, path, session, index=None):
"""get value for an option
return: only value, not the owner
"""
path = self._sqlite_encode_path(path)
values = self._sqlite_select(path, index)
if values is None:
return values
return self._sqlite_decode(values[0])
def hasvalue(self, path, index=None): def hasvalue(self, path, index=None):
"""if opt has a value """if opt has a value
return: boolean return: boolean

View File

@ -73,21 +73,13 @@ class Values(object):
raise value raise value
else: else:
if isinstance(value, Multi): if isinstance(value, Multi):
if index is not None: new_value = []
value = value[index] for val in value:
if isinstance(value, SubMulti): if isinstance(val, SubMulti):
if submulti_index is not undefined: val = list(val)
value = value[submulti_index] new_value.append(val)
else: value = new_value
value = list(value) del new_value
else:
new_value = []
for val in value:
if isinstance(val, SubMulti):
val = list(val)
new_value.append(val)
value = new_value
del new_value
return value return value
# if value has callback and is not set # if value has callback and is not set
if opt.impl_has_callback(): if opt.impl_has_callback():
@ -230,12 +222,6 @@ class Values(object):
"enables us to use the pythonic dictionary-like access to values" "enables us to use the pythonic dictionary-like access to values"
return self._get_cached_value(opt) return self._get_cached_value(opt)
def getitem(self, opt, validate=True, force_permissive=False):
"""
"""
return self._get_cached_value(opt, validate=validate,
force_permissive=force_permissive)
def _get_cached_value(self, opt, path=None, validate=True, def _get_cached_value(self, opt, path=None, validate=True,
force_permissive=False, trusted_cached_properties=True, force_permissive=False, trusted_cached_properties=True,
validate_properties=True, validate_properties=True,
@ -411,8 +397,6 @@ class Values(object):
# user didn't change value, so not write # user didn't change value, so not write
# valid opt # valid opt
context = self._getcontext() context = self._getcontext()
if _setting_properties is undefined:
_setting_properties = context.cfgimpl_get_settings()._getproperties(read_write=False)
if 'validator' in _setting_properties: if 'validator' in _setting_properties:
session = context.cfgimpl_get_values()._p_.getsession() session = context.cfgimpl_get_values()._p_.getsession()
if opt._has_consistencies(): if opt._has_consistencies():
@ -476,12 +460,8 @@ class Values(object):
if valid_masterslave and opt.impl_is_master_slaves(): if valid_masterslave and opt.impl_is_master_slaves():
if session is None: if session is None:
session = self._p_.getsession() session = self._p_.getsession()
if index is not None: len_value = len(value)
len_value = index setitem = True
setitem = False
else:
len_value = len(value)
setitem = True
val = opt.impl_get_master_slaves().validate(self, opt, len_value, path, session, setitem=setitem) val = opt.impl_get_master_slaves().validate(self, opt, len_value, path, session, setitem=setitem)
if isinstance(val, Exception): if isinstance(val, Exception):
return val return val
@ -502,8 +482,6 @@ class Values(object):
context = self._getcontext() context = self._getcontext()
setting = context.cfgimpl_get_settings() setting = context.cfgimpl_get_settings()
self_properties = setting._getproperties(opt, path, read_write=False) self_properties = setting._getproperties(opt, path, read_write=False)
if 'frozen' in self_properties and 'force_default_on_freeze' in self_properties:
return False
if self._p_.getowner(path, owners.default, session, only_default=True) is not owners.default: if self._p_.getowner(path, owners.default, session, only_default=True) is not owners.default:
return False return False
if context.cfgimpl_get_meta() is not None: if context.cfgimpl_get_meta() is not None:
@ -834,8 +812,6 @@ class Multi(list):
session = context.cfgimpl_get_values()._p_.getsession() session = context.cfgimpl_get_values()._p_.getsession()
fake_context = context._gen_fake_values(session) fake_context = context._gen_fake_values(session)
fake_multi = Multi(list(self), weakref.ref(fake_context), self.opt, self.path) fake_multi = Multi(list(self), weakref.ref(fake_context), self.opt, self.path)
if isinstance(fake_multi, Exception):
raise fake_multi
fake_multi.append(value, validate=False, force=True, fake_multi.append(value, validate=False, force=True,
setitem=setitem) setitem=setitem)
self._validate(value, fake_context, index, True) self._validate(value, fake_context, index, True)