better sqlalchemy integration

This commit is contained in:
Emmanuel Garette 2016-09-30 22:45:33 +02:00
parent 6fbc4accb9
commit 69de44bbb4
14 changed files with 492 additions and 251 deletions

View File

@ -82,7 +82,7 @@ def make_description4():
def test_mandatory_ro(): def test_mandatory_ro():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man001')
config.read_only() config.read_only()
prop = [] prop = []
try: try:
@ -94,21 +94,31 @@ def test_mandatory_ro():
config.str1 = 'yes' config.str1 = 'yes'
config.read_only() config.read_only()
assert config.str1 == 'yes' assert config.str1 == 'yes'
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_rw(): def test_mandatory_rw():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man002')
config.read_write() config.read_write()
#not mandatory in rw #not mandatory in rw
config.str1 config.str1
config.str1 = 'yes' config.str1 = 'yes'
assert config.str1 == 'yes' assert config.str1 == 'yes'
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_default(): def test_mandatory_default():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man003')
config.read_only() config.read_only()
#not mandatory in rw #not mandatory in rw
config.str config.str
@ -125,11 +135,16 @@ def test_mandatory_default():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_delete(): def test_mandatory_delete():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man004')
config.read_only() config.read_only()
config.str config.str
try: try:
@ -150,12 +165,17 @@ def test_mandatory_delete():
assert 'mandatory' in prop assert 'mandatory' in prop
del(config.str) del(config.str)
assert config.str1 == 'yes' assert config.str1 == 'yes'
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
#valeur vide : None, '', u'', ... #valeur vide : None, '', u'', ...
def test_mandatory_none(): def test_mandatory_none():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man005')
config.str1 = None config.str1 = None
assert config.getowner(config.unwrap_from_path('str1')) == 'user' assert config.getowner(config.unwrap_from_path('str1')) == 'user'
config.read_only() config.read_only()
@ -165,11 +185,16 @@ def test_mandatory_none():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_empty(): def test_mandatory_empty():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man006')
config.str1 = '' config.str1 = ''
assert config.getowner(config.unwrap_from_path('str1')) == 'user' assert config.getowner(config.unwrap_from_path('str1')) == 'user'
config.read_only() config.read_only()
@ -179,11 +204,16 @@ def test_mandatory_empty():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_multi_none(): def test_mandatory_multi_none():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man007')
config.str3 = [None] config.str3 = [None]
assert config.getowner(config.unwrap_from_path('str3')) == 'user' assert config.getowner(config.unwrap_from_path('str3')) == 'user'
config.read_only() config.read_only()
@ -203,11 +233,16 @@ def test_mandatory_multi_none():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_multi_empty(): def test_mandatory_multi_empty():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man008')
config.str3 = [] config.str3 = []
assert config.getowner(config.unwrap_from_path('str3')) == 'user' assert config.getowner(config.unwrap_from_path('str3')) == 'user'
config.read_only() config.read_only()
@ -239,11 +274,16 @@ def test_mandatory_multi_empty():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_multi_empty_allow_empty_list(): def test_mandatory_multi_empty_allow_empty_list():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man009')
config.str4 = [] config.str4 = []
assert config.getowner(config.unwrap_from_path('str4')) == 'user' assert config.getowner(config.unwrap_from_path('str4')) == 'user'
config.read_only() config.read_only()
@ -271,19 +311,29 @@ def test_mandatory_multi_empty_allow_empty_list():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert 'mandatory' in prop assert 'mandatory' in prop
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_multi_append(): def test_mandatory_multi_append():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man010')
config.str3 = ['yes'] config.str3 = ['yes']
config.read_write() config.read_write()
config.str3.append(None) config.str3.append(None)
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_disabled(): def test_mandatory_disabled():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man011')
setting = config.cfgimpl_get_settings() setting = config.cfgimpl_get_settings()
config.str1 config.str1
config.read_only() config.read_only()
@ -300,11 +350,16 @@ def test_mandatory_disabled():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert set(prop) == set(['disabled', 'mandatory']) assert set(prop) == set(['disabled', 'mandatory'])
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_unicode(): def test_mandatory_unicode():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man012')
config.unicode2 config.unicode2
config.read_only() config.read_only()
prop = [] prop = []
@ -322,11 +377,16 @@ def test_mandatory_unicode():
except PropertiesOptionError as err: except PropertiesOptionError as err:
prop = err.proptype prop = err.proptype
assert prop == ['mandatory'] assert prop == ['mandatory']
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_warnings_ro(): def test_mandatory_warnings_ro():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man013')
config.str = '' config.str = ''
config.read_only() config.read_only()
proc = [] proc = []
@ -341,11 +401,16 @@ def test_mandatory_warnings_ro():
config.read_only() config.read_only()
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
try:
delete_session('config', config.impl_getsessionid())
except ValueError:
pass
del(config)
def test_mandatory_warnings_rw(): def test_mandatory_warnings_rw():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man100')
config.str = '' config.str = ''
config.read_write() config.read_write()
config.str config.str
@ -354,7 +419,7 @@ def test_mandatory_warnings_rw():
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man100')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -362,7 +427,7 @@ def test_mandatory_warnings_rw():
def test_mandatory_warnings_disabled(): def test_mandatory_warnings_disabled():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man101')
config.str = '' config.str = ''
setting = config.cfgimpl_get_settings() setting = config.cfgimpl_get_settings()
config.read_write() config.read_write()
@ -372,7 +437,7 @@ def test_mandatory_warnings_disabled():
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man101')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -380,7 +445,7 @@ def test_mandatory_warnings_disabled():
def test_mandatory_warnings_hidden(): def test_mandatory_warnings_hidden():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man102')
config.str = '' config.str = ''
setting = config.cfgimpl_get_settings() setting = config.cfgimpl_get_settings()
config.read_write() config.read_write()
@ -391,7 +456,7 @@ def test_mandatory_warnings_hidden():
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man102')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -399,7 +464,7 @@ def test_mandatory_warnings_hidden():
def test_mandatory_warnings_frozen(): def test_mandatory_warnings_frozen():
descr = make_description() descr = make_description()
config = Config(descr) config = Config(descr, session_id='man103')
config.str = '' config.str = ''
setting = config.cfgimpl_get_settings() setting = config.cfgimpl_get_settings()
config.read_write() config.read_write()
@ -409,7 +474,7 @@ def test_mandatory_warnings_frozen():
config.read_only() config.read_only()
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man103')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -423,12 +488,12 @@ def test_mandatory_master():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man104')
config.read_only() config.read_only()
raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0') raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0')
raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0') raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man104')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -442,10 +507,10 @@ def test_mandatory_warnings_master():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man105')
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man105')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -458,7 +523,7 @@ def test_mandatory_master_empty():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man106')
config.read_write() config.read_write()
assert config.ip_admin_eth0.ip_admin_eth0 == [] assert config.ip_admin_eth0.ip_admin_eth0 == []
assert config.ip_admin_eth0.netmask_admin_eth0 == [] assert config.ip_admin_eth0.netmask_admin_eth0 == []
@ -489,7 +554,7 @@ def test_mandatory_master_empty():
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip'] assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
assert config.ip_admin_eth0.netmask_admin_eth0 == [None] assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man106')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -502,7 +567,7 @@ def test_mandatory_warnings_master_empty():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man107')
config.read_write() config.read_write()
config.ip_admin_eth0.ip_admin_eth0.append() config.ip_admin_eth0.ip_admin_eth0.append()
assert config.ip_admin_eth0.ip_admin_eth0 == [None] assert config.ip_admin_eth0.ip_admin_eth0 == [None]
@ -520,7 +585,7 @@ def test_mandatory_warnings_master_empty():
config.ip_admin_eth0.ip_admin_eth0 = ['ip'] config.ip_admin_eth0.ip_admin_eth0 = ['ip']
assert list(config.cfgimpl_get_values().mandatory_warnings()) == [] assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man107')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -533,7 +598,7 @@ def test_mandatory_slave():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man108')
config.read_only() config.read_only()
assert config.ip_admin_eth0.ip_admin_eth0 == [] assert config.ip_admin_eth0.ip_admin_eth0 == []
assert config.ip_admin_eth0.netmask_admin_eth0 == [] assert config.ip_admin_eth0.netmask_admin_eth0 == []
@ -556,7 +621,7 @@ def test_mandatory_slave():
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip'] assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip'] assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man108')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -569,7 +634,7 @@ def test_mandatory_warnings_slave():
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1.impl_set_group_type(groups.master) interface1.impl_set_group_type(groups.master)
o = OptionDescription('o', '', [interface1]) o = OptionDescription('o', '', [interface1])
config = Config(o) config = Config(o, session_id='man109')
config.read_only() config.read_only()
assert config.ip_admin_eth0.ip_admin_eth0 == [] assert config.ip_admin_eth0.ip_admin_eth0 == []
assert config.ip_admin_eth0.netmask_admin_eth0 == [] assert config.ip_admin_eth0.netmask_admin_eth0 == []
@ -579,7 +644,7 @@ def test_mandatory_warnings_slave():
config.ip_admin_eth0.ip_admin_eth0.append('ip') config.ip_admin_eth0.ip_admin_eth0.append('ip')
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.netmask_admin_eth0'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.netmask_admin_eth0']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man109')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -587,7 +652,7 @@ def test_mandatory_warnings_slave():
def test_mandatory_warnings_symlink(): def test_mandatory_warnings_symlink():
descr = make_description_sym() descr = make_description_sym()
config = Config(descr) config = Config(descr, session_id='man110')
config.str = '' config.str = ''
setting = config.cfgimpl_get_settings() setting = config.cfgimpl_get_settings()
config.read_write() config.read_write()
@ -597,7 +662,7 @@ def test_mandatory_warnings_symlink():
config.read_only() config.read_only()
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man110')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -605,7 +670,7 @@ def test_mandatory_warnings_symlink():
def test_mandatory_warnings_validate(): def test_mandatory_warnings_validate():
descr = make_description3() descr = make_description3()
config = Config(descr) config = Config(descr, session_id='man111')
config.str = '' config.str = ''
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())") raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1', 'int1'] assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1', 'int1']
@ -613,7 +678,7 @@ def test_mandatory_warnings_validate():
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())") raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str1', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str1', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man111')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -621,13 +686,13 @@ def test_mandatory_warnings_validate():
def test_mandatory_warnings_validate_empty(): def test_mandatory_warnings_validate_empty():
descr = make_description2() descr = make_description2()
config = Config(descr) config = Config(descr, session_id='man112')
config.str = '' config.str = ''
config.read_only() config.read_only()
raises(ConfigError, "list(config.cfgimpl_get_values().mandatory_warnings())") raises(ConfigError, "list(config.cfgimpl_get_values().mandatory_warnings())")
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1'] assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man112')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -635,7 +700,7 @@ def test_mandatory_warnings_validate_empty():
def test_mandatory_warnings_requires(): def test_mandatory_warnings_requires():
descr = make_description4() descr = make_description4()
config = Config(descr) config = Config(descr, session_id='man113')
config.str = '' config.str = ''
config.read_write() config.read_write()
config.str config.str
@ -646,7 +711,7 @@ def test_mandatory_warnings_requires():
config.str = 'yes' config.str = 'yes'
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man113')
except ValueError: except ValueError:
pass pass
del(config) del(config)
@ -655,13 +720,13 @@ def test_mandatory_warnings_requires():
def test_mandatory_od_disabled(): def test_mandatory_od_disabled():
descr = make_description() descr = make_description()
od = OptionDescription('od', '', [descr]) od = OptionDescription('od', '', [descr])
config = Config(od) config = Config(od, session_id='man114')
config.read_only() config.read_only()
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3'] assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3']
config.cfgimpl_get_settings()[descr].append('disabled') config.cfgimpl_get_settings()[descr].append('disabled')
assert list(config.cfgimpl_get_values().mandatory_warnings()) == [] assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
try: try:
delete_session('config', config.impl_getsessionid()) delete_session('config', 'man114')
except ValueError: except ValueError:
pass pass
del(config) del(config)

View File

@ -11,6 +11,9 @@ from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption,\
URLOption, FilenameOption URLOption, FilenameOption
print "FIXME slot pour un masterslaves !!"
def test_slots_option(): def test_slots_option():
c = ChoiceOption('a', '', ('a',)) c = ChoiceOption('a', '', ('a',))
raises(AttributeError, "c.x = 1") raises(AttributeError, "c.x = 1")

View File

@ -107,9 +107,9 @@ def _diff_opt(opt1, opt2):
else: else:
assert v[1] == val2[idx][1] assert v[1] == val2[idx][1]
elif attr == '_master_slaves': elif attr == '_master_slaves':
assert val1.master.impl_getname() == val2.master.impl_getname() assert val1._p_._sm_getmaster().impl_getname() == val2._p_._sm_getmaster().impl_getname()
sval1 = [opt.impl_getname() for opt in val1.slaves] sval1 = [opt.impl_getname() for opt in val1._p_._sm_getslaves()]
sval2 = [opt.impl_getname() for opt in val2.slaves] sval2 = [opt.impl_getname() for opt in val2._p_._sm_getslaves()]
assert sval1 == sval2 assert sval1 == sval2
elif attr == '_subdyn': elif attr == '_subdyn':
try: try:
@ -222,6 +222,10 @@ def test_diff_information_config():
_diff_conf(cfg, q) _diff_conf(cfg, q)
assert cfg.impl_get_information('info') == 'oh' assert cfg.impl_get_information('info') == 'oh'
assert q.impl_get_information('info') == 'oh' assert q.impl_get_information('info') == 'oh'
try:
delete_session('config', '29090938')
except ValueError:
pass
def test_diff_opt_multi(): def test_diff_opt_multi():
@ -353,6 +357,10 @@ def test_diff_opt_config():
q = loads(a) q = loads(a)
_diff_opts(cfg.cfgimpl_get_description(), q.cfgimpl_get_description()) _diff_opts(cfg.cfgimpl_get_description(), q.cfgimpl_get_description())
_diff_conf(cfg, q) _diff_conf(cfg, q)
try:
delete_session('config', '29090940')
except ValueError:
pass
def test_state_properties(): def test_state_properties():
@ -422,6 +430,9 @@ def test_state_metaconfig():
i1 = IntOption('i1', '') i1 = IntOption('i1', '')
od1 = OptionDescription('od1', '', [i1]) od1 = OptionDescription('od1', '', [i1])
od2 = OptionDescription('od2', '', [od1]) od2 = OptionDescription('od2', '', [od1])
try:
cfg = Config(od2, persistent=True, session_id='29090935')
except ValueError:
conf1 = Config(od2, session_id='29090935') conf1 = Config(od2, session_id='29090935')
conf1._impl_test = True conf1._impl_test = True
conf2 = Config(od2, session_id='29090936') conf2 = Config(od2, session_id='29090936')
@ -431,8 +442,6 @@ def test_state_metaconfig():
raises(ConfigError, "dumps(meta)") raises(ConfigError, "dumps(meta)")
try: try:
delete_session('config', '29090935') delete_session('config', '29090935')
delete_session('config', '29090936')
delete_session('config', '29090937')
except ValueError: except ValueError:
pass pass
@ -441,19 +450,20 @@ def test_state_groupconfig():
i1 = IntOption('i1', '') i1 = IntOption('i1', '')
od1 = OptionDescription('od1', '', [i1]) od1 = OptionDescription('od1', '', [i1])
od2 = OptionDescription('od2', '', [od1]) od2 = OptionDescription('od2', '', [od1])
conf1 = Config(od2, session_id='29090935') try:
cfg = Config(od2, persistent=True, session_id='29090938')
except ValueError:
conf1 = Config(od2, session_id='29090938')
conf1._impl_test = True conf1._impl_test = True
conf2 = Config(od2, session_id='29090936') conf2 = Config(od2, session_id='29090939')
conf2._impl_test = True conf2._impl_test = True
meta = GroupConfig([conf1, conf2], session_id='29090937') meta = GroupConfig([conf1, conf2], session_id='29090940')
meta._impl_test = True meta._impl_test = True
a = dumps(meta) a = dumps(meta)
q = loads(a) q = loads(a)
_diff_conf(meta, q) _diff_conf(meta, q)
try: try:
delete_session('config', '29090935') delete_session('config', '29090938')
delete_session('config', '29090936')
delete_session('config', '29090937')
except ValueError: except ValueError:
pass pass

View File

@ -258,7 +258,7 @@ class SubConfig(object):
return subpath return subpath
def getattr(self, name, force_permissive=False, validate=True, def getattr(self, name, force_permissive=False, validate=True,
_setting_properties=undefined, index=None, _setting_properties=undefined, _self_properties=undefined, index=None,
returns_raise=False): returns_raise=False):
""" """
attribute notation mechanism for accessing the value of an option attribute notation mechanism for accessing the value of an option
@ -277,6 +277,7 @@ class SubConfig(object):
return homeconfig.getattr(name, force_permissive=force_permissive, return homeconfig.getattr(name, force_permissive=force_permissive,
validate=validate, validate=validate,
_setting_properties=_setting_properties, _setting_properties=_setting_properties,
_self_properties=_self_properties,
index=index, returns_raise=returns_raise) index=index, returns_raise=returns_raise)
context = self._cfgimpl_get_context() context = self._cfgimpl_get_context()
option = self.cfgimpl_get_description().__getattr__(name, option = self.cfgimpl_get_description().__getattr__(name,
@ -287,7 +288,9 @@ class SubConfig(object):
option, path=subpath, option, path=subpath,
validate=validate, validate=validate,
force_permissive=force_permissive, force_permissive=force_permissive,
setting_properties=_setting_properties, index=index, setting_properties=_setting_properties,
self_properties=_self_properties,
index=index,
returns_raise=returns_raise) returns_raise=returns_raise)
elif isinstance(option, SymLinkOption): # pragma: no dynoptiondescription cover elif isinstance(option, SymLinkOption): # pragma: no dynoptiondescription cover
path = context.cfgimpl_get_description().impl_get_path_by_opt( path = context.cfgimpl_get_description().impl_get_path_by_opt(
@ -295,11 +298,13 @@ class SubConfig(object):
return context.getattr(path, validate=validate, return context.getattr(path, validate=validate,
force_permissive=force_permissive, force_permissive=force_permissive,
_setting_properties=_setting_properties, _setting_properties=_setting_properties,
_self_properties=_self_properties,
index=index, returns_raise=returns_raise) index=index, returns_raise=returns_raise)
elif option.impl_is_optiondescription(): elif option.impl_is_optiondescription():
props = self.cfgimpl_get_settings().validate_properties( props = self.cfgimpl_get_settings().validate_properties(
option, True, False, path=subpath, option, True, False, path=subpath,
force_permissive=force_permissive, force_permissive=force_permissive,
self_properties=_self_properties,
setting_properties=_setting_properties) setting_properties=_setting_properties)
if props: if props:
if returns_raise: if returns_raise:
@ -313,6 +318,7 @@ class SubConfig(object):
validate=validate, validate=validate,
force_permissive=force_permissive, force_permissive=force_permissive,
setting_properties=_setting_properties, setting_properties=_setting_properties,
self_properties=_self_properties,
index=index, returns_raise=returns_raise) index=index, returns_raise=returns_raise)
def find(self, bytype=None, byname=None, byvalue=undefined, type_='option', def find(self, bytype=None, byname=None, byvalue=undefined, type_='option',
@ -656,7 +662,8 @@ class _CommonConfig(SubConfig):
def duplicate(self): def duplicate(self):
config = Config(self._impl_descr) config = Config(self._impl_descr)
config.cfgimpl_get_values()._p_._values = self.cfgimpl_get_values()._p_._values session = self.cfgimpl_get_values()._p_.getsession()
config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation(session))
config.cfgimpl_get_settings()._p_._properties = self.cfgimpl_get_settings()._p_.get_modified_properties() config.cfgimpl_get_settings()._p_._properties = self.cfgimpl_get_settings()._p_.get_modified_properties()
config.cfgimpl_get_settings()._p_._permissives = self.cfgimpl_get_settings()._p_.get_modified_permissives() config.cfgimpl_get_settings()._p_._permissives = self.cfgimpl_get_settings()._p_.get_modified_permissives()
return config return config

View File

@ -29,6 +29,7 @@ from ..autolib import carry_out_calculation
from ..error import (ConfigError, ValueWarning, PropertiesOptionError, from ..error import (ConfigError, ValueWarning, PropertiesOptionError,
display_list) display_list)
from ..storage import get_storages_option from ..storage import get_storages_option
from . import MasterSlaves
StorageBase = get_storages_option('base') StorageBase = get_storages_option('base')
@ -99,7 +100,7 @@ class Base(StorageBase):
requires=None, multi=False, callback=None, requires=None, multi=False, callback=None,
callback_params=None, validator=None, validator_params=None, callback_params=None, validator=None, validator_params=None,
properties=None, warnings_only=False, extra=None, properties=None, warnings_only=False, extra=None,
allow_empty_list=undefined): allow_empty_list=undefined, session=None):
if not valid_name(name): # pragma: optional cover if not valid_name(name): # pragma: optional cover
raise ValueError(_("invalid name: {0} for option").format(name)) raise ValueError(_("invalid name: {0} for option").format(name))
if not multi and default_multi is not None: # pragma: optional cover if not multi and default_multi is not None: # pragma: optional cover
@ -138,9 +139,11 @@ class Base(StorageBase):
raise ValueError('conflict: properties already set in ' raise ValueError('conflict: properties already set in '
'requirement {0}'.format( 'requirement {0}'.format(
list(set_forbidden_properties))) list(set_forbidden_properties)))
if session is None:
session = self.getsession()
StorageBase.__init__(self, name, _multi, warnings_only, doc, extra, StorageBase.__init__(self, name, _multi, warnings_only, doc, extra,
calc_properties, requires, properties, calc_properties, requires, properties,
allow_empty_list) allow_empty_list, session=session)
if multi is not False and default is None: if multi is not False and default is None:
default = [] default = []
err = self.impl_validate(default, is_multi=is_multi) err = self.impl_validate(default, is_multi=is_multi)
@ -150,7 +153,7 @@ class Base(StorageBase):
##callback is False in optiondescription ##callback is False in optiondescription
if callback is not False: if callback is not False:
self.impl_set_callback(callback, callback_params, _init=True) self.impl_set_callback(callback, callback_params, _init=True)
self.commit() self.commit(session)
def impl_set_callback(self, callback, callback_params=None, _init=False): def impl_set_callback(self, callback, callback_params=None, _init=False):
if callback is None and callback_params is not None: # pragma: optional cover if callback is None and callback_params is not None: # pragma: optional cover
@ -342,9 +345,6 @@ class BaseOption(Base):
def _is_subdyn(self): def _is_subdyn(self):
return getattr(self, '_subdyn', None) is not None return getattr(self, '_subdyn', None) is not None
def impl_getproperties(self):
return self._properties
def _impl_valid_unicode(self, value): def _impl_valid_unicode(self, value):
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
if not isinstance(value, str): if not isinstance(value, str):
@ -590,10 +590,13 @@ class Option(OnlyOption):
return self._valid_consistency(current_opt, None, context, return self._valid_consistency(current_opt, None, context,
None, None) None, None)
def impl_is_dynsymlinkoption(self):
return False
def impl_is_master_slaves(self, type_='both'): def impl_is_master_slaves(self, type_='both'):
"""FIXME """FIXME
""" """
master_slaves = getattr(self, '_master_slaves', None) master_slaves = self.impl_get_master_slaves()
if master_slaves is not None: if master_slaves is not None:
if type_ in ('both', 'master') and \ if type_ in ('both', 'master') and \
master_slaves.is_master(self): master_slaves.is_master(self):
@ -604,7 +607,12 @@ class Option(OnlyOption):
return False return False
def impl_get_master_slaves(self): def impl_get_master_slaves(self):
return self._master_slaves masterslaves = self._get_master_slave()
if masterslaves is None:
return None
if not isinstance(masterslaves, MasterSlaves):
return MasterSlaves(masterslaves)
return masterslaves
def impl_getdoc(self): def impl_getdoc(self):
"accesses the Option's doc" "accesses the Option's doc"
@ -876,10 +884,11 @@ class SymLinkOption(OnlyOption):
raise ValueError(_('malformed symlinkoption ' raise ValueError(_('malformed symlinkoption '
'must be an option ' 'must be an option '
'for symlink {0}').format(name)) 'for symlink {0}').format(name))
session = self.getsession()
super(Base, self).__init__(name, undefined, undefined, undefined, super(Base, self).__init__(name, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
undefined, opt) undefined, opt, session=session)
self.commit() self.commit(session)
def __getattr__(self, name, context=undefined): def __getattr__(self, name, context=undefined):
if name in ('_opt', '_readonly', 'impl_getpath', '_name', if name in ('_opt', '_readonly', 'impl_getpath', '_name',
@ -964,3 +973,6 @@ class DynSymLinkOption(object):
force_submulti_index, force_submulti_index,
current_opt=self, current_opt=self,
is_multi=is_multi) is_multi=is_multi)
def impl_is_dynsymlinkoption(self):
return True

View File

@ -22,43 +22,36 @@
from ..i18n import _ from ..i18n import _
from ..setting import log, undefined, debug from ..setting import log, undefined, debug
from ..error import SlaveError, PropertiesOptionError from ..error import SlaveError, PropertiesOptionError
from .baseoption import DynSymLinkOption, SymLinkOption, Option from ..storage import get_storages_option
StorageMasterSlaves = get_storages_option('masterslaves')
class MasterSlaves(object): class MasterSlaves(object):
__slots__ = ('master', 'slaves') __slots__ = ('_p_')
def __init__(self, name, childs, validate=True): def __init__(self, name, childs=None, validate=True, add=True):
#if master (same name has group) is set #if master (same name has group) is set
#for collect all slaves #for collect all slaves
self.master = None if isinstance(name, StorageMasterSlaves):
slaves = [] self._p_ = name
for child in childs:
if isinstance(child, SymLinkOption): # pragma: optional cover
raise ValueError(_("master group {0} shall not have "
"a symlinkoption").format(name))
if not isinstance(child, Option): # pragma: optional cover
raise ValueError(_("master group {0} shall not have "
"a subgroup").format(name))
if not child.impl_is_multi(): # pragma: optional cover
raise ValueError(_("not allowed option {0} "
"in group {1}"
": this option is not a multi"
"").format(child.impl_getname(), name))
if child.impl_getname() == name:
self.master = child
else: else:
slaves = []
if childs[0].impl_getname() == name:
master = childs[0]
else:
raise ValueError(_('master group with wrong'
' master name for {0}'
).format(name))
for child in childs[1:]:
if child.impl_getdefault() != []: if child.impl_getdefault() != []:
raise ValueError(_("not allowed default value for option {0} " raise ValueError(_("not allowed default value for option {0} "
"in group {1}").format(child.impl_getname(), "in group {1}").format(child.impl_getname(),
name)) name))
slaves.append(child) slaves.append(child)
if self.master is None: # pragma: optional cover
raise ValueError(_('master group with wrong'
' master name for {0}'
).format(name))
if validate: if validate:
callback, callback_params = self.master.impl_get_callback() callback, callback_params = master.impl_get_callback()
if callback is not None and callback_params != {}: # pragma: optional cover if callback is not None and callback_params != {}: # pragma: optional cover
for key, callbacks in callback_params.items(): for key, callbacks in callback_params.items():
for callbk in callbacks: for callbk in callbacks:
@ -67,42 +60,43 @@ class MasterSlaves(object):
raise ValueError(_("callback of master's option shall " raise ValueError(_("callback of master's option shall "
"not refered a slave's ones")) "not refered a slave's ones"))
#everything is ok, store references #everything is ok, store references
self.slaves = tuple(slaves) self._p_ = StorageMasterSlaves(master, slaves)
if add:
for child in childs: for child in childs:
child._master_slaves = self child._set_master_slaves(self)
def is_master(self, opt): def is_master(self, opt):
return opt == self.master or (isinstance(opt, DynSymLinkOption) and master = self._p_._sm_getmaster().impl_getname()
opt._opt == self.master) return opt.impl_getname() == master or (opt.impl_is_dynsymlinkoption() and
opt._opt.impl_getname() == master)
def getmaster(self, opt): def getmaster(self, opt):
if isinstance(opt, DynSymLinkOption): master = self._p_._sm_getmaster()
if opt.impl_is_dynsymlinkoption():
suffix = opt.impl_getsuffix() suffix = opt.impl_getsuffix()
name = self.master.impl_getname() + suffix name = master.impl_getname() + suffix
base_path = opt._dyn.split('.')[0] + '.' base_path = opt._dyn.split('.')[0] + '.'
path = base_path + name path = base_path + name
master = self.master._impl_to_dyn(name, path) master = master._impl_to_dyn(name, path)
else: # pragma: no dynoptiondescription cover
master = self.master
return master return master
def getslaves(self, opt): def getslaves(self, opt):
if isinstance(opt, DynSymLinkOption): if opt.impl_is_dynsymlinkoption():
for slave in self.slaves: for slave in self._p_._sm_getslaves():
suffix = opt.impl_getsuffix() suffix = opt.impl_getsuffix()
name = slave.impl_getname() + suffix name = slave.impl_getname() + suffix
base_path = opt._dyn.split('.')[0] + '.' base_path = opt._dyn.split('.')[0] + '.'
path = base_path + name path = base_path + name
yield slave._impl_to_dyn(name, path) yield slave._impl_to_dyn(name, path)
else: # pragma: no dynoptiondescription cover else: # pragma: no dynoptiondescription cover
for slave in self.slaves: for slave in self._p_._sm_getslaves():
yield slave yield slave
def in_same_group(self, opt): def in_same_group(self, opt):
if isinstance(opt, DynSymLinkOption): if opt.impl_is_dynsymlinkoption():
return opt._opt == self.master or opt._opt in self.slaves return opt._opt == self._p_._sm_getmaster() or opt._opt in self._p_._sm_getslaves()
else: # pragma: no dynoptiondescription cover else: # pragma: no dynoptiondescription cover
return opt == self.master or opt in self.slaves return opt == self._p_._sm_getmaster() or opt in self._p_._sm_getslaves()
def reset(self, opt, values, setting_properties): def reset(self, opt, values, setting_properties):
for slave in self.getslaves(opt): for slave in self.getslaves(opt):

View File

@ -55,9 +55,8 @@ class ChoiceOption(Option):
if not isinstance(values, tuple): # pragma: optional cover if not isinstance(values, tuple): # pragma: optional cover
raise TypeError(_('values must be a tuple or a function for {0}' raise TypeError(_('values must be a tuple or a function for {0}'
).format(name)) ).format(name))
_setattr = object.__setattr__ self.impl_set_choice_values_params(values, values_params)
_setattr(self, '_choice_values', values)
_setattr(self, '_choice_values_params', values_params)
super(ChoiceOption, self).__init__(name, doc, default=default, super(ChoiceOption, self).__init__(name, doc, default=default,
default_multi=default_multi, default_multi=default_multi,
callback=callback, callback=callback,
@ -79,9 +78,7 @@ class ChoiceOption(Option):
if context is None: if context is None:
values = [] values = []
else: else:
values_params = self._choice_values_params values_params = self.impl_get_choice_values_params()
if values_params is None:
values_params = {}
values = carry_out_calculation(current_opt, context=context, values = carry_out_calculation(current_opt, context=context,
callback=values, callback=values,
callback_params=values_params, callback_params=values_params,
@ -93,6 +90,7 @@ class ChoiceOption(Option):
'').format(self.impl_getname())) '').format(self.impl_getname()))
return values return values
def _validate(self, value, context=undefined, current_opt=undefined, def _validate(self, value, context=undefined, current_opt=undefined,
returns_raise=False): returns_raise=False):
values = self.impl_get_values(context, current_opt=current_opt, values = self.impl_get_values(context, current_opt=current_opt,

View File

@ -24,7 +24,7 @@ import re
from ..i18n import _ from ..i18n import _
from ..setting import groups, undefined, owners # , log from ..setting import groups, undefined, owners # , log
from .baseoption import BaseOption, SymLinkOption from .baseoption import BaseOption, SymLinkOption, Option
from . import MasterSlaves from . import MasterSlaves
from ..error import ConfigError, ConflictError from ..error import ConfigError, ConflictError
from ..storage import get_storages_option from ..storage import get_storages_option
@ -229,7 +229,20 @@ class OptionDescription(BaseOption, StorageOptionDescription):
if isinstance(group_type, groups.GroupType): if isinstance(group_type, groups.GroupType):
self._group_type = group_type self._group_type = group_type
if isinstance(group_type, groups.MasterGroupType): if isinstance(group_type, groups.MasterGroupType):
MasterSlaves(self.impl_getname(), self.impl_getchildren()) children = self.impl_getchildren()
for child in children:
if isinstance(child, SymLinkOption): # pragma: optional cover
raise ValueError(_("master group {0} shall not have "
"a symlinkoption").format(self.impl_getname()))
if not isinstance(child, Option): # pragma: optional cover
raise ValueError(_("master group {0} shall not have "
"a subgroup").format(self.impl_getname()))
if not child.impl_is_multi(): # pragma: optional cover
raise ValueError(_("not allowed option {0} "
"in group {1}"
": this option is not a multi"
"").format(child.impl_getname(), self.impl_getname()))
MasterSlaves(self.impl_getname(), children)
else: # pragma: optional cover else: # pragma: optional cover
raise ValueError(_('group_type: {0}' raise ValueError(_('group_type: {0}'
' not allowed').format(group_type)) ' not allowed').format(group_type))
@ -365,7 +378,6 @@ class DynOptionDescription(OptionDescription):
'dynoptiondescription')) 'dynoptiondescription'))
child._impl_setsubdyn(self) child._impl_setsubdyn(self)
self.impl_set_callback(callback, callback_params) self.impl_set_callback(callback, callback_params)
self.commit()
def _validate_callback(self, callback, callback_params): def _validate_callback(self, callback, callback_params):
if callback is None: if callback is None:

View File

@ -135,6 +135,8 @@ def get_storages_option(type_):
imp = storage_option_type.get() imp = storage_option_type.get()
if type_ == 'base': if type_ == 'base':
return imp.StorageBase return imp.StorageBase
elif type_ == 'masterslaves':
return imp.StorageMasterSlaves
else: else:
return imp.StorageOptionDescription return imp.StorageOptionDescription

View File

@ -25,7 +25,7 @@ use it. But if something goes wrong, you will lost your modifications.
from .value import Values from .value import Values
from .setting import Settings from .setting import Settings
from .storage import setting, Storage, list_sessions, delete_session from .storage import setting, Storage, list_sessions, delete_session
from .option import StorageBase, StorageOptionDescription from .option import StorageBase, StorageOptionDescription, StorageMasterSlaves
__all__ = (setting, Values, Settings, Storage, list_sessions, delete_session, __all__ = (setting, Values, Settings, Storage, list_sessions, delete_session,
StorageBase, StorageOptionDescription) StorageBase, StorageOptionDescription, StorageMasterSlaves)

View File

@ -65,7 +65,8 @@ class StorageBase(object):
) )
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties, def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
requires, properties, allow_empty_list, opt=undefined): requires, properties, allow_empty_list, opt=undefined,
session=None):
_setattr = object.__setattr__ _setattr = object.__setattr__
_setattr(self, '_name', name) _setattr(self, '_name', name)
if doc is not undefined: if doc is not undefined:
@ -164,6 +165,12 @@ class StorageBase(object):
val_call = tuple([callback, callback_params]) val_call = tuple([callback, callback_params])
self._val_call = (val, val_call) self._val_call = (val, val_call)
def impl_set_choice_values_params(self, values, values_params):
self._choice_values = values
if values_params is not None:
self._choice_values_params = values_params
def impl_get_callback(self): def impl_get_callback(self):
call = getattr(self, '_val_call', (None, None))[1] call = getattr(self, '_val_call', (None, None))[1]
if call is None: if call is None:
@ -174,6 +181,9 @@ class StorageBase(object):
ret_call = call ret_call = call
return ret_call return ret_call
def impl_get_choice_values_params(self):
return getattr(self, '_choice_values_params', {})
def impl_get_calc_properties(self): def impl_get_calc_properties(self):
return getattr(self, '_calc_properties', static_set) return getattr(self, '_calc_properties', static_set)
@ -259,6 +269,9 @@ class StorageBase(object):
if extra is not None: if extra is not None:
_setattr(self, '_extra', tuple([tuple(extra.keys()), tuple(extra.values())])) _setattr(self, '_extra', tuple([tuple(extra.keys()), tuple(extra.values())]))
def impl_getproperties(self):
return self._properties
def _impl_setsubdyn(self, subdyn): def _impl_setsubdyn(self, subdyn):
self._subdyn = subdyn self._subdyn = subdyn
@ -357,7 +370,16 @@ class StorageBase(object):
"accessing the default value for a multi" "accessing the default value for a multi"
return getattr(self, '_default_multi', None) return getattr(self, '_default_multi', None)
def commit(self): def _get_master_slave(self):
return getattr(self, '_master_slaves', None)
def _set_master_slaves(self, option):
self._master_slaves = option
def getsession(self):
pass
def commit(self, session):
pass pass
@ -549,3 +571,17 @@ class StorageOptionDescription(StorageBase):
raise AttributeError(_('unknown Option {0} ' raise AttributeError(_('unknown Option {0} '
'in OptionDescription {1}' 'in OptionDescription {1}'
'').format(name, self.impl_getname())) '').format(name, self.impl_getname()))
class StorageMasterSlaves(object):
__slots__ = ('master', 'slaves')
def __init__(self, master, slaves):
self.master = master
self.slaves = slaves
def _sm_getmaster(self):
return self.master
def _sm_getslaves(self):
return tuple(self.slaves)

View File

@ -25,7 +25,7 @@ use it. But if something goes wrong, you will lost your modifications.
from .value import Values from .value import Values
from .setting import Settings from .setting import Settings
from .storage import Storage, list_sessions, delete_session, storage_setting from .storage import Storage, list_sessions, delete_session, storage_setting
from .option import StorageBase, StorageOptionDescription from .option import StorageBase, StorageOptionDescription, StorageMasterSlaves
from .util import load from .util import load
@ -33,5 +33,5 @@ load()
__all__ = (storage_setting, Values, Settings, Storage, list_sessions, delete_session, __all__ = (storage_setting, Values, Settings, Storage, list_sessions, delete_session,
StorageBase, StorageOptionDescription) StorageBase, StorageOptionDescription, StorageMasterSlaves)
# Base, OptionDescription) # Base, OptionDescription)

View File

@ -40,8 +40,9 @@ def load_requires(collection_type, proxy):
return None return None
ret = [] ret = []
requires = getattr(obj, proxy.value_attr) requires = getattr(obj, proxy.value_attr)
session = util.Session()
for require in requires: for require in requires:
option = util.session.query(_Base).filter_by(id=require.option).first() option = session.query(_Base).filter_by(id=require.option).first()
ret.append(tuple([option, require.expected, require.action, require.inverse, require.transitive, require.same_action])) ret.append(tuple([option, require.expected, require.action, require.inverse, require.transitive, require.same_action]))
return tuple(ret) return tuple(ret)
@ -128,11 +129,12 @@ class _PropertyOption(SqlAlchemyBase):
class _Information(SqlAlchemyBase): class _Information(SqlAlchemyBase):
__tablename__ = 'information' __tablename__ = 'information'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
option = Column(Integer, ForeignKey('baseoption.id'), nullable=False) option = Column(String, index=True, nullable=False)
key = Column(String) key = Column(String)
value = Column(PickleType) value = Column(PickleType)
def __init__(self, key, value): def __init__(self, option, key, value):
self.option = option
self.key = key self.key = key
self.value = value self.value = value
@ -146,11 +148,12 @@ def load_callback_parm(collection_type, proxy):
return None return None
ret = [] ret = []
requires = getattr(obj, proxy.value_attr) requires = getattr(obj, proxy.value_attr)
session = util.Session()
for require in requires: for require in requires:
if require.value is not None: if require.value is not None:
ret.append(require.value) ret.append(require.value)
else: else:
option = util.session.query(_Base).filter_by(id=require.option).first() option = session.query(_Base).filter_by(id=require.option).first()
ret.append((option, require.force_permissive)) ret.append((option, require.force_permissive))
return tuple(ret) return tuple(ret)
@ -239,20 +242,20 @@ class _Base(SqlAlchemyBase):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
_name = Column(String) _name = Column(String)
#FIXME not autoload #FIXME not autoload
_infos = relationship("_Information", # _infos = relationship("_Information",
collection_class=attribute_mapped_collection('key'), # collection_class=attribute_mapped_collection('key'),
cascade="all, delete-orphan") # cascade="all, delete-orphan")
_informations = association_proxy("_infos", "value") # _informations = association_proxy("_infos", "value")
_default = Column(PickleType) _default = Column(PickleType)
_default_multi = Column(PickleType) _default_multi = Column(PickleType)
_subdyn = Column(Integer) _subdyn = Column(Integer)
_dyn = Column(String) _dyn = Column(String)
_opt = Column(Integer) _opt = Column(Integer)
_master_slaves = Column(Integer)
_choice_values = Column(PickleType) _choice_values = Column(PickleType)
_cho_params = relationship('_CallbackParam', _cho_params = relationship('_CallbackParam',
collection_class= collection_class=attribute_mapped_collection('key'))
attribute_mapped_collection('key')) _choice_values_params = association_proxy("_cho_params", "params",
_choice_params = association_proxy("_cho_params", "params",
getset_factory=load_callback_parm) getset_factory=load_callback_parm)
_reqs = relationship("_Require", collection_class=list) _reqs = relationship("_Require", collection_class=list)
_requires = association_proxy("_reqs", "requires", getset_factory=load_requires) _requires = association_proxy("_reqs", "requires", getset_factory=load_requires)
@ -260,14 +263,12 @@ class _Base(SqlAlchemyBase):
###### ######
_callback = Column(PickleType) _callback = Column(PickleType)
_call_params = relationship('_CallbackParam', _call_params = relationship('_CallbackParam',
collection_class= collection_class=attribute_mapped_collection('key'))
attribute_mapped_collection('key'))
_callback_params = association_proxy("_call_params", "params", _callback_params = association_proxy("_call_params", "params",
getset_factory=load_callback_parm) getset_factory=load_callback_parm)
_validator = Column(PickleType) _validator = Column(PickleType)
_val_params = relationship('_CallbackParam', _val_params = relationship('_CallbackParam',
collection_class= collection_class=attribute_mapped_collection('key'))
attribute_mapped_collection('key'))
_validator_params = association_proxy("_val_params", "params", _validator_params = association_proxy("_val_params", "params",
getset_factory=load_callback_parm) getset_factory=load_callback_parm)
###### ######
@ -282,10 +283,10 @@ class _Base(SqlAlchemyBase):
_consistencies = relationship('_Consistency', secondary=consistency_table, _consistencies = relationship('_Consistency', secondary=consistency_table,
backref=backref('options', backref=backref('options',
enable_typechecks=False)) enable_typechecks=False))
_type = Column(String(50))
_stated = Column(Boolean) _stated = Column(Boolean)
_type = Column(String(50))
__mapper_args__ = { __mapper_args__ = {
'polymorphic_identity': 'option', 'polymorphic_identity': 'optionsql',
'polymorphic_on': _type 'polymorphic_on': _type
} }
_extra = Column(PickleType) _extra = Column(PickleType)
@ -293,10 +294,8 @@ class _Base(SqlAlchemyBase):
_group_type = Column(String) _group_type = Column(String)
_is_build_cache = Column(Boolean, default=False) _is_build_cache = Column(Boolean, default=False)
#def __init__(self):
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties, def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
requires, properties, allow_empty_list, opt=undefined): requires, properties, allow_empty_list, opt=undefined, session=None):
util.session.add(self)
self._name = name self._name = name
if multi is not undefined: if multi is not undefined:
self._multi = multi self._multi = multi
@ -316,14 +315,19 @@ class _Base(SqlAlchemyBase):
self._requires = requires self._requires = requires
if properties is not undefined: if properties is not undefined:
self._properties = properties self._properties = properties
session.add(self)
def commit(self): def getsession(self):
util.session.commit() return util.Session()
def commit(self, session):
session.commit()
del(session)
def _add_consistency(self, func, all_cons_opts, params): def _add_consistency(self, func, all_cons_opts, params):
_Consistency(func, all_cons_opts, params) _Consistency(func, all_cons_opts, params)
def _set_default_values(self, default, default_multi): def _set_default_values(self, default, default_multi, is_multi):
self._default = default self._default = default
if self.impl_is_multi() and default_multi is not None: if self.impl_is_multi() and default_multi is not None:
err = self._validate(default_multi) err = self._validate(default_multi)
@ -344,6 +348,9 @@ class _Base(SqlAlchemyBase):
return (None, {}) return (None, {})
return ret, self._callback_params return ret, self._callback_params
def impl_get_choice_values_params(self):
return self._choice_values_params
def impl_get_validator(self): def impl_get_validator(self):
ret = self._validator ret = self._validator
if ret is None: if ret is None:
@ -351,16 +358,30 @@ class _Base(SqlAlchemyBase):
return ret, self._validator_params return ret, self._validator_params
def _impl_getsubdyn(self): def _impl_getsubdyn(self):
return util.session.query(_Base).filter_by(id=self._subdyn).first() session = self.getsession()
return session.query(_Base).filter_by(id=self._subdyn).first()
def _impl_getopt(self): def _impl_getopt(self):
return util.session.query(_Base).filter_by(id=self._opt).first() session = self.getsession()
return session.query(_Base).filter_by(id=self._opt).first()
def impl_getname(self): def impl_getname(self):
return self._name return self._name
def impl_getrequires(self): def impl_getrequires(self):
return self._requires session = self.getsession()
requires = session.query(_Require).filter_by(requires_id=self.id).all()
for require in requires:
_ret = []
for req in require.requires:
_ret.append((session.query(_Base).filter_by(id=req.option).first(),
req.expected,
req.action,
req.inverse,
req.transitive,
req.same_action))
yield(_ret)
def impl_getdefault(self): def impl_getdefault(self):
ret = self._default ret = self._default
@ -381,10 +402,11 @@ class _Base(SqlAlchemyBase):
self._opt = opt.id self._opt = opt.id
def _impl_setsubdyn(self, subdyn): def _impl_setsubdyn(self, subdyn):
session = self.getsession()
self._subdyn = subdyn.id self._subdyn = subdyn.id
self.commit() self.commit(session)
def _set_readonly(self): def _set_readonly(self, has_extra):
self._readonly = True self._readonly = True
def _set_callback(self, callback, callback_params): def _set_callback(self, callback, callback_params):
@ -392,6 +414,11 @@ class _Base(SqlAlchemyBase):
if callback_params is not None: if callback_params is not None:
self._callback_params = callback_params self._callback_params = callback_params
def impl_set_choice_values_params(self, values, values_params):
self._choice_values = values
if values_params is not None:
self._choice_values_params = values_params
def _set_validator(self, validator, validator_params): def _set_validator(self, validator, validator_params):
self._validator = validator self._validator = validator
if validator_params is not None: if validator_params is not None:
@ -419,27 +446,39 @@ class _Base(SqlAlchemyBase):
return self._warnings_only return self._warnings_only
def impl_get_calc_properties(self): def impl_get_calc_properties(self):
try: session = self.getsession()
return self._calc_properties return session.query(_CalcProperties).filter_by(require=self.id).all()
except AttributeError: #try:
return frozenset() # return self._calc_properties
#except AttributeError:
# return frozenset()
# information # information
def impl_set_information(self, key, value): def impl_set_information(self, key, value):
self._informations[key] = value session = self.getsession()
# self._informations[key] = value
val = session.query(_Information).filter_by(
option=self.id, key=key).first()
if val is None:
session.add(_Information(self.id, key, value))
else:
val.value = value
session.commit()
def impl_get_information(self, key, default=undefined): def impl_get_information(self, key, default=undefined):
"""retrieves one information's item """retrieves one information's item
:param key: the item string (ex: "help") :param key: the item string (ex: "help")
""" """
session = self.getsession()
val = session.query(_Information).filter_by(
option=self.id, key=key).first()
if not val:
if default is not undefined: if default is not undefined:
return self._informations.get(key, default) return default
try:
return self._informations[key]
except KeyError: # pragma: optional cover
raise ValueError(_("information's item not found: {0}").format( raise ValueError(_("information's item not found: {0}").format(
key)) key))
return val.value
def _impl_getattributes(self): def _impl_getattributes(self):
slots = set() slots = set()
@ -448,6 +487,20 @@ class _Base(SqlAlchemyBase):
slots.add(column.key) slots.add(column.key)
return slots return slots
def impl_getproperties(self):
session = self.getsession()
return session.query(_PropertyOption).filter_by(option=self.id).all()
def _set_master_slaves(self, option):
session = self.getsession()
opt = session.query(_Base).filter_by(id=self.id).first()
opt._master_slaves = option.id
self.commit(session)
def _get_master_slave(self):
session = self.getsession()
return session.query(StorageMasterSlaves).filter_by(id=self._master_slaves).first()
class Cache(SqlAlchemyBase): class Cache(SqlAlchemyBase):
__tablename__ = 'cache' __tablename__ = 'cache'
@ -477,19 +530,24 @@ class Cache(SqlAlchemyBase):
class StorageOptionDescription(object): class StorageOptionDescription(object):
def impl_already_build_caches(self): def impl_already_build_caches(self):
return self._is_build_cache cache = self._is_build_cache
if cache is None:
cache = False
return cache
def impl_get_opt_by_path(self, path): def impl_get_opt_by_path(self, path):
ret = util.session.query(Cache).filter_by(descr=self.id, path=path).first() session = self.getsession()
ret = session.query(Cache).filter_by(descr=self.id, path=path).first()
if ret is None: if ret is None:
raise AttributeError(_('no option for path {0}').format(path)) raise AttributeError(_('no option for path {0}').format(path))
return util.session.query(_Base).filter_by(id=ret.option).first() return session.query(_Base).filter_by(id=ret.option).first()
def impl_get_path_by_opt(self, opt): def impl_get_path_by_opt(self, opt):
ret = util.session.query(Cache).filter_by(descr=self.id, session = self.getsession()
ret = session.query(Cache).filter_by(descr=self.id,
option=opt.id).first() option=opt.id).first()
if ret is None: if ret is None:
ret = util.session.query(Cache).filter_by(descr=self.id).first() ret = session.query(Cache).filter_by(descr=self.id).first()
if ret is None: if ret is None:
raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription')) raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription'))
raise AttributeError(_('no option {0} found').format(opt)) raise AttributeError(_('no option {0} found').format(opt))
@ -499,11 +557,12 @@ class StorageOptionDescription(object):
return getattr(groups, self._group_type) return getattr(groups, self._group_type)
def impl_build_cache_option(self, descr=None, _currpath=None, def impl_build_cache_option(self, descr=None, _currpath=None,
subdyn_path=None): subdyn_path=None, session=None):
if descr is None: if descr is None:
save = True save = True
descr = self descr = self
_currpath = [] _currpath = []
session = self.getsession()
else: else:
save = False save = False
for option in self._impl_getchildren(dyn=False): for option in self._impl_getchildren(dyn=False):
@ -512,23 +571,23 @@ class StorageOptionDescription(object):
sub = subdyn_path sub = subdyn_path
if option.impl_is_dynoptiondescription(): if option.impl_is_dynoptiondescription():
sub = '.'.join(_currpath) sub = '.'.join(_currpath)
util.session.add(Cache(descr, self, option, session.add(Cache(descr, self, option,
str('.'.join(_currpath + [attr])), str('.'.join(_currpath + [attr])),
sub)) sub))
_currpath.append(attr) _currpath.append(attr)
option.impl_build_cache_option(descr, option.impl_build_cache_option(descr,
_currpath, _currpath,
sub) sub, session)
_currpath.pop() _currpath.pop()
else: else:
if subdyn_path: if subdyn_path:
subdyn_path = '.'.join(_currpath) subdyn_path = '.'.join(_currpath)
util.session.add(Cache(descr, self, option, session.add(Cache(descr, self, option,
str('.'.join(_currpath + [attr])), str('.'.join(_currpath + [attr])),
subdyn_path)) subdyn_path))
if save: if save:
self._is_build_cache = True self._is_build_cache = True
util.session.commit() self.commit(session)
def impl_get_options_paths(self, bytype, byname, _subpath, only_first, def impl_get_options_paths(self, bytype, byname, _subpath, only_first,
context): context):
@ -546,7 +605,8 @@ class StorageOptionDescription(object):
_opt = option._impl_to_dyn(name + suffix, path) _opt = option._impl_to_dyn(name + suffix, path)
return (path, _opt) return (path, _opt)
sqlquery = util.session.query(Cache).filter_by(descr=self.id) session = self.getsession()
sqlquery = session.query(Cache).filter_by(descr=self.id)
if bytype is None: if bytype is None:
sqlquery = sqlquery.filter(and_(not_( sqlquery = sqlquery.filter(and_(not_(
Cache.opt_type == 'OptionDescription'), Cache.opt_type == 'OptionDescription'),
@ -575,7 +635,7 @@ class StorageOptionDescription(object):
#else: #else:
ret = [] ret = []
for opt in sqlquery.all(): for opt in sqlquery.all():
option = util.session.query(_Base).filter_by(id=opt.option).first() option = session.query(_Base).filter_by(id=opt.option).first()
if opt.is_subdyn: if opt.is_subdyn:
name = option.impl_getname() name = option.impl_getname()
if byname is not None: if byname is not None:
@ -616,21 +676,24 @@ class StorageOptionDescription(object):
return ret return ret
def _add_children(self, child_names, children): def _add_children(self, child_names, children):
session = self.getsession()
for child in children: for child in children:
util.session.add(_Parent(self, child)) session.add(_Parent(self, child))
self.commit(session)
def _impl_st_getchildren(self, context, only_dyn=False): def _impl_st_getchildren(self, context, only_dyn=False):
session = self.getsession()
if only_dyn is False or context is undefined: if only_dyn is False or context is undefined:
for child in util.session.query(_Parent).filter_by( for child in session.query(_Parent).filter_by(
parent_id=self.id).all(): parent_id=self.id).all():
yield(util.session.query(_Base).filter_by(id=child.child_id yield(session.query(_Base).filter_by(id=child.child_id
).first()) ).first())
else: else:
descr = context.cfgimpl_get_description().id descr = context.cfgimpl_get_description().id
for child in util.session.query(Cache).filter_by(descr=descr, for child in session.query(Cache).filter_by(descr=descr,
parent=self.id parent=self.id
).all(): ).all():
yield(util.session.query(_Base).filter_by(id=child.option).first()) yield(session.query(_Base).filter_by(id=child.option).first())
def _getattr(self, name, suffix=undefined, context=undefined, dyn=True): def _getattr(self, name, suffix=undefined, context=undefined, dyn=True):
error = False error = False
@ -640,14 +703,15 @@ class StorageOptionDescription(object):
raise ConfigError(_("suffix and context needed if " raise ConfigError(_("suffix and context needed if "
"it's a dyn option")) "it's a dyn option"))
if name.endswith(suffix): if name.endswith(suffix):
session = self.getsession()
oname = name[:-len(suffix)] oname = name[:-len(suffix)]
#child = self._children[1][self._children[0].index(oname)] #child = self._children[1][self._children[0].index(oname)]
child = util.session.query(_Parent).filter_by( child = session.query(_Parent).filter_by(
parent_id=self.id, child_name=oname).first() parent_id=self.id, child_name=oname).first()
if child is None: if child is None:
error = True error = True
else: else:
opt = util.session.query(_Base).filter_by( opt = session.query(_Base).filter_by(
id=child.child_id).first() id=child.child_id).first()
return self._impl_get_dynchild(opt, suffix) return self._impl_get_dynchild(opt, suffix)
else: else:
@ -655,7 +719,8 @@ class StorageOptionDescription(object):
except ValueError: # pragma: optional cover except ValueError: # pragma: optional cover
error = True error = True
else: else:
child = util.session.query(_Parent).filter_by(parent_id=self.id, session = self.getsession()
child = session.query(_Parent).filter_by(parent_id=self.id,
child_name=name child_name=name
).first() ).first()
if child is None: if child is None:
@ -664,7 +729,7 @@ class StorageOptionDescription(object):
return child return child
error = True error = True
if error is False: if error is False:
return util.session.query(_Base).filter_by(id=child.child_id return session.query(_Base).filter_by(id=child.child_id
).first() ).first()
if error: if error:
raise AttributeError(_('unknown Option {0} in OptionDescription {1}' raise AttributeError(_('unknown Option {0} in OptionDescription {1}'
@ -672,12 +737,13 @@ class StorageOptionDescription(object):
def _get_force_store_value(self): def _get_force_store_value(self):
#only option in current tree #only option in current tree
current_ids = tuple(chain(*util.session.query(Cache.option).filter_by( session = self.getsession()
current_ids = tuple(chain(*session.query(Cache.option).filter_by(
descr=self.id).all())) descr=self.id).all()))
for prop in util.session.query(_PropertyOption).filter( for prop in session.query(_PropertyOption).filter(
_PropertyOption.option.in_(current_ids), _PropertyOption.option.in_(current_ids),
_PropertyOption.name == 'force_store_value').all(): _PropertyOption.name == 'force_store_value').all():
opt = util.session.query(_Base).filter_by(id=prop.option).first() opt = session.query(_Base).filter_by(id=prop.option).first()
path = self.impl_get_path_by_opt(opt) path = self.impl_get_path_by_opt(opt)
yield (opt, path) yield (opt, path)
@ -686,3 +752,39 @@ class StorageBase(_Base):
@declared_attr @declared_attr
def __mapper_args__(self): def __mapper_args__(self):
return {'polymorphic_identity': self.__name__.lower()} return {'polymorphic_identity': self.__name__.lower()}
class _Slave(SqlAlchemyBase):
__tablename__ = 'slaves'
id = Column(Integer, primary_key=True)
master_id = Column(Integer, index=True, nullable=False)
slave_id = Column(Integer)
def __init__(self, master, slave):
self.master_id = master.id
self.slave_id = slave.id
class StorageMasterSlaves(SqlAlchemyBase):
__tablename__ = 'masterslaves2'
id = Column(Integer, primary_key=True)
master = Column(Integer)
def __init__(self, master, slaves):
session = util.Session()
self.master = master.id
session.add(self)
session.commit()
for slave in slaves:
sl = _Slave(self, slave)
session.add(sl)
session.commit()
def _sm_getslaves(self):
session = util.Session()
for slave in session.query(_Slave).filter_by(master_id=self.master).all():
yield(session.query(_Base).filter_by(id=slave.slave_id).first())
def _sm_getmaster(self):
session = util.Session()
return session.query(_Base).filter_by(id=self.master).first()