convert tests
This commit is contained in:
parent
fc787d4dbb
commit
b5f785d62c
|
@ -1408,7 +1408,7 @@ def check_all(cfg, paths, path, meta, multi, default, default_multi, require, co
|
||||||
do('val2', 'val1')
|
do('val2', 'val1')
|
||||||
|
|
||||||
#FIXME devrait etre dans la config ca ...
|
#FIXME devrait etre dans la config ca ...
|
||||||
api.read_write()
|
api.property.read_write()
|
||||||
if req:
|
if req:
|
||||||
name = 'extraoptrequire'
|
name = 'extraoptrequire'
|
||||||
if symlink:
|
if symlink:
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
"""automatically sets the PYTHONPATH before running the unit tests
|
||||||
|
|
||||||
|
This is supposed to be used in development mode (i.e. testing from a fresh
|
||||||
|
checkout)
|
||||||
|
"""
|
||||||
|
|
||||||
|
from os.path import dirname, abspath, join, normpath
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def do_autopath():
|
||||||
|
HERE = dirname(abspath(__file__))
|
||||||
|
PATH = normpath(join(HERE, '..', 'tiramisu'))
|
||||||
|
if PATH not in sys.path:
|
||||||
|
sys.path.insert(1, PATH)
|
|
@ -0,0 +1,790 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from tiramisu import setting, value
|
||||||
|
setting.expires_time = 1
|
||||||
|
value.expires_time = 1
|
||||||
|
from tiramisu.option import BoolOption, IPOption, IntOption, StrOption, OptionDescription, MasterSlaves
|
||||||
|
from tiramisu.config import Config
|
||||||
|
from tiramisu.error import ConfigError, PropertiesOptionError
|
||||||
|
from tiramisu.setting import groups
|
||||||
|
from tiramisu import getapi, undefined
|
||||||
|
from tiramisu.api import TIRAMISU_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
from time import sleep, time
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
|
||||||
|
global incr
|
||||||
|
incr = 0
|
||||||
|
def return_incr():
|
||||||
|
global incr
|
||||||
|
incr += 1
|
||||||
|
return incr
|
||||||
|
|
||||||
|
|
||||||
|
def return_value(val):
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def make_description():
|
||||||
|
u1 = IntOption('u1', '', multi=True)
|
||||||
|
u2 = IntOption('u2', '')
|
||||||
|
u3 = IntOption('u3', '', multi=True)
|
||||||
|
return OptionDescription('od1', '', [u1, u2, u3])
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_config():
|
||||||
|
od1 = make_description()
|
||||||
|
assert od1.impl_already_build_caches() is False
|
||||||
|
c = Config(od1)
|
||||||
|
assert od1.impl_already_build_caches() is True
|
||||||
|
c
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.option('u2').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
#def test_get_cache():
|
||||||
|
# # force a value in cache, try if reget corrupted value
|
||||||
|
# od1 = make_description()
|
||||||
|
# c = Config(od1)
|
||||||
|
# api = getapi(c)
|
||||||
|
# values = c.cfgimpl_get_values()
|
||||||
|
# settings = c.cfgimpl_get_settings()
|
||||||
|
# ntime = time() + 1
|
||||||
|
# settings._p_.setcache('u1', set(['inject']), ntime, None)
|
||||||
|
# assert 'inject' in settings[od1.u1]
|
||||||
|
# values._p_.setcache('u1', 100, ntime, None)
|
||||||
|
# assert api.option('u1').value.get() == [100]
|
||||||
|
|
||||||
|
|
||||||
|
#def test_get_cache_no_expire():
|
||||||
|
# # force a value in cache, try if reget corrupted value
|
||||||
|
# od1 = make_description()
|
||||||
|
# c = Config(od1)
|
||||||
|
# api = getapi(c)
|
||||||
|
# values = c.cfgimpl_get_values()
|
||||||
|
# settings = c.cfgimpl_get_settings()
|
||||||
|
# settings._p_.setcache('u1', set(['inject2']), None, None)
|
||||||
|
# assert 'inject2' in settings[od1.u1]
|
||||||
|
# values._p_.setcache('u1', 200, None, None)
|
||||||
|
# assert api.option('u1').value.get() == [200]
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_reset():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
#when change a value
|
||||||
|
api.option('u1').value.get()
|
||||||
|
api.option('u2').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
api.option('u2').value.set(1)
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' not in values._p_.get_cached()
|
||||||
|
assert 'u2' not in settings._p_.get_cached()
|
||||||
|
#when remove a value
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.option('u2').value.reset()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' not in values._p_.get_cached()
|
||||||
|
assert 'u2' not in settings._p_.get_cached()
|
||||||
|
#when add/del property
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.option('u2').property.add('test')
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' not in values._p_.get_cached()
|
||||||
|
assert 'u2' not in settings._p_.get_cached()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.option('u2').property.pop('test')
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' not in values._p_.get_cached()
|
||||||
|
assert 'u2' not in settings._p_.get_cached()
|
||||||
|
#when enable/disabled property
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.property.add('test')
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.property.pop('test')
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_reset_multi():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
api.option('u3').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' in values._p_.get_cached()
|
||||||
|
assert 'u3' in settings._p_.get_cached()
|
||||||
|
#when change a value
|
||||||
|
api.option('u3').value.set([1])
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' not in values._p_.get_cached()
|
||||||
|
assert 'u3' not in settings._p_.get_cached()
|
||||||
|
#when append value
|
||||||
|
api.option('u1').value.get()
|
||||||
|
api.option('u3').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' in values._p_.get_cached()
|
||||||
|
assert 'u3' in settings._p_.get_cached()
|
||||||
|
api.option('u3').value.set([1, 1])
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' not in values._p_.get_cached()
|
||||||
|
assert 'u3' not in settings._p_.get_cached()
|
||||||
|
#when pop value
|
||||||
|
api.option('u1').value.get()
|
||||||
|
api.option('u3').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' in values._p_.get_cached()
|
||||||
|
assert 'u3' in settings._p_.get_cached()
|
||||||
|
api.option('u3').value.set([1])
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' not in values._p_.get_cached()
|
||||||
|
assert 'u3' not in settings._p_.get_cached()
|
||||||
|
#when remove a value
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
api.option('u3').value.reset()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u3' not in values._p_.get_cached()
|
||||||
|
assert 'u3' not in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
def test_reset_cache():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache()
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
sleep(1)
|
||||||
|
api.option('u1').value.get()
|
||||||
|
sleep(1)
|
||||||
|
api.option('u2').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache()
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
assert 'u2' not in values._p_.get_cached()
|
||||||
|
assert 'u2' not in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
#def test_reset_cache_subconfig():
|
||||||
|
# od1 = make_description()
|
||||||
|
# od2 = OptionDescription('od2', '', [od1])
|
||||||
|
# c = Config(od2)
|
||||||
|
# api = getapi(c)
|
||||||
|
# values = c.cfgimpl_get_values()
|
||||||
|
# api.option('od1.u1').value.get()
|
||||||
|
# assert 'od1.u1' in values._p_.get_cached()
|
||||||
|
# c.od1.cfgimpl_reset_cache()
|
||||||
|
# assert 'od1.u1' not in values._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
def test_reset_cache_only_expired():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache(True)
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
sleep(1)
|
||||||
|
api.option('u1').value.get()
|
||||||
|
sleep(1)
|
||||||
|
api.option('u2').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache(True)
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_not_expire():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.property.pop('expire')
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache(True)
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
sleep(1)
|
||||||
|
api.option('u2').value.get()
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
c.cfgimpl_reset_cache(True)
|
||||||
|
assert 'u1' in values._p_.get_cached()
|
||||||
|
assert 'u1' in settings._p_.get_cached()
|
||||||
|
assert 'u2' in values._p_.get_cached()
|
||||||
|
assert 'u2' in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_not_cache():
|
||||||
|
od1 = make_description()
|
||||||
|
c = Config(od1)
|
||||||
|
api = getapi(c)
|
||||||
|
values = c.cfgimpl_get_values()
|
||||||
|
settings = c.cfgimpl_get_settings()
|
||||||
|
api.property.pop('cache')
|
||||||
|
api.option('u1').value.get()
|
||||||
|
assert 'u1' not in values._p_.get_cached()
|
||||||
|
assert 'u1' not in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
#def test_reset_cache_only():
|
||||||
|
# od1 = make_description()
|
||||||
|
# c = Config(od1)
|
||||||
|
# api = getapi(c)
|
||||||
|
# values = c.cfgimpl_get_values()
|
||||||
|
# settings = c.cfgimpl_get_settings()
|
||||||
|
# api.option('u1').value.get()
|
||||||
|
# assert 'u1' in values._p_.get_cached()
|
||||||
|
# assert 'u1' in settings._p_.get_cached()
|
||||||
|
# c.cfgimpl_reset_cache(only=('values',))
|
||||||
|
# assert 'u1' not in values._p_.get_cached()
|
||||||
|
# assert 'u1' in settings._p_.get_cached()
|
||||||
|
# api.option('u1').value.get()
|
||||||
|
# assert 'u1' in values._p_.get_cached()
|
||||||
|
# assert 'u1' in settings._p_.get_cached()
|
||||||
|
# c.cfgimpl_reset_cache(only=('settings',))
|
||||||
|
# assert 'u1' in values._p_.get_cached()
|
||||||
|
# assert 'u1' not in settings._p_.get_cached()
|
||||||
|
|
||||||
|
|
||||||
|
#def test_force_cache():
|
||||||
|
# u1 = IntOption('u1', '', multi=True)
|
||||||
|
# u2 = IntOption('u2', '')
|
||||||
|
# u3 = IntOption('u3', '', multi=True)
|
||||||
|
# u4 = IntOption('u4', '', properties=('disabled',))
|
||||||
|
# od = OptionDescription('od1', '', [u1, u2, u3, u4])
|
||||||
|
# c = Config(od)
|
||||||
|
# api = getapi(c)
|
||||||
|
# api.property.read_write()
|
||||||
|
# api.property.pop('expire')
|
||||||
|
# api.property.pop('disabled')
|
||||||
|
#
|
||||||
|
# c.cfgimpl_get_values().force_cache()
|
||||||
|
# assert c.cfgimpl_get_values()._p_.get_cached() == {'u1': {None: ([], None)},
|
||||||
|
# 'u2': {None: (None, None)},
|
||||||
|
# 'u3': {None: ([], None)},
|
||||||
|
# 'u4': {None: (None, None)}}
|
||||||
|
# assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'u1': {None: (set(['empty']), None)},
|
||||||
|
# 'u2': {None: (set([]), None)},
|
||||||
|
# 'u3': {None: (set(['empty']), None)},
|
||||||
|
# 'u4': {None: (set(['disabled']), None)}}
|
||||||
|
# api.property.read_only()
|
||||||
|
#
|
||||||
|
# c.cfgimpl_get_values().force_cache()
|
||||||
|
# assert c.cfgimpl_get_values()._p_.get_cached() == {'u1': {None: ([], None)},
|
||||||
|
# 'u2': {None: (None, None)},
|
||||||
|
# 'u3': {None: ([], None)}}
|
||||||
|
# assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'empty', 'everything_frozen', 'frozen', 'mandatory', 'validator', 'warnings']), None)},
|
||||||
|
# 'u1': {None: (set(['empty']), None)},
|
||||||
|
# 'u2': {None: (set([]), None)},
|
||||||
|
# 'u3': {None: (set(['empty']), None)},
|
||||||
|
# 'u4': {None: (set(['disabled']), None)}}
|
||||||
|
#
|
||||||
|
# c.cfgimpl_get_settings().remove('cache')
|
||||||
|
# raises(ConfigError, "c.cfgimpl_get_values().force_cache()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_master_slave():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
maconfig = OptionDescription('toto', '', [interface1])
|
||||||
|
cfg = Config(maconfig)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {}
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2'])
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.get()
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()
|
||||||
|
cache = cfg.cfgimpl_get_values()._p_.get_cached()
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0'])
|
||||||
|
else:
|
||||||
|
assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
|
||||||
|
assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
|
||||||
|
assert cache['ip_admin_eth0.ip_admin_eth0'][None][0] == ['192.168.1.2']
|
||||||
|
#assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None])
|
||||||
|
#assert cache['ip_admin_eth0.netmask_admin_eth0'][None][0] == [None]
|
||||||
|
#assert cache['ip_admin_eth0.netmask_admin_eth0'][0][0] is None
|
||||||
|
cache = cfg.cfgimpl_get_settings()._p_.get_cached()
|
||||||
|
assert set(cache.keys()) == set([None, 'ip_admin_eth0', 'ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
|
||||||
|
assert set(cache['ip_admin_eth0'].keys()) == set([None])
|
||||||
|
assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0])
|
||||||
|
else:
|
||||||
|
assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([0])
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2', '192.168.1.1'])
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.get()
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get()
|
||||||
|
cache = cfg.cfgimpl_get_values()._p_.get_cached()
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0'])
|
||||||
|
else:
|
||||||
|
assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
|
||||||
|
assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
|
||||||
|
assert cache['ip_admin_eth0.ip_admin_eth0'][None][0] == ['192.168.1.2', '192.168.1.1']
|
||||||
|
#assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None])
|
||||||
|
#assert cache['ip_admin_eth0.netmask_admin_eth0'][None][0] == [None, None]
|
||||||
|
#assert cache['ip_admin_eth0.netmask_admin_eth0'][0][0] is None
|
||||||
|
#assert cache['ip_admin_eth0.netmask_admin_eth0'][1][0] is None
|
||||||
|
cache = cfg.cfgimpl_get_settings()._p_.get_cached()
|
||||||
|
assert set(cache.keys()) == set([None, 'ip_admin_eth0', 'ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
|
||||||
|
assert set(cache['ip_admin_eth0'].keys()) == set([None])
|
||||||
|
assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0, 1])
|
||||||
|
else:
|
||||||
|
assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([0, 1])
|
||||||
|
#DEL, insert, ...
|
||||||
|
|
||||||
|
|
||||||
|
def return_value(value=None):
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_callback():
|
||||||
|
val1 = StrOption('val1', "", 'val')
|
||||||
|
val2 = StrOption('val2', "", callback=return_value, callback_params={'': ((val1, False),)}, properties=('mandatory',))
|
||||||
|
val3 = StrOption('val3', "", callback=return_value, callback_params={'': ('yes',)})
|
||||||
|
val4 = StrOption('val4', "", callback=return_value, callback_params={'value': ((val1, False),)})
|
||||||
|
val5 = StrOption('val5', "", callback=return_value, callback_params={'value': ('yes',)}, multi=True)
|
||||||
|
maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5])
|
||||||
|
cfg = Config(maconfig)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.pop('expire')
|
||||||
|
api.option.make_dict()
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('val', None)},
|
||||||
|
'val2': {None: ('val', None)},
|
||||||
|
'val3': {None: ('yes', None)},
|
||||||
|
'val4': {None: ('val', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option('val1').value.set('new')
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val3': {None: ('yes', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('yes', None)},
|
||||||
|
'val4': {None: ('new', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option('val3').value.set('new2')
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val4': {None: ('new', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('new2', None)},
|
||||||
|
'val4': {None: ('new', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option('val4').value.set('new3')
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)},
|
||||||
|
# 'val4': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('new2', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)},
|
||||||
|
# 'val4': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('new2', None)},
|
||||||
|
'val4': {None: ('new3', None)},
|
||||||
|
'val5': {None: (['yes'], None)}}
|
||||||
|
api.option('val5').value.set([undefined, 'new4'])
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)},
|
||||||
|
# 'val4': {None: (set([]), None)},
|
||||||
|
# 'val5': {None: (set(['empty']), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('new2', None)},
|
||||||
|
'val4': {None: ('new3', None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
#assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)},
|
||||||
|
# 'val3': {None: (set([]), None)},
|
||||||
|
# 'val4': {None: (set([]), None)},
|
||||||
|
# 'val5': {None: (set(['empty']), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1': {None: ('new', None)},
|
||||||
|
'val2': {None: ('new', None)},
|
||||||
|
'val3': {None: ('new2', None)},
|
||||||
|
'val4': {None: ('new3', None)},
|
||||||
|
'val5': {None: (['yes', 'new4'], None)}}
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_master_and_slaves_master():
|
||||||
|
val1 = StrOption('val1', "", multi=True)
|
||||||
|
val2 = StrOption('val2', "", multi=True)
|
||||||
|
interface1 = MasterSlaves('val1', '', [val1, val2])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
maconfig = OptionDescription('rootconfig', '', [interface1])
|
||||||
|
cfg = Config(maconfig)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.pop('expire')
|
||||||
|
api.option.make_dict()
|
||||||
|
global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']
|
||||||
|
val1_props = []
|
||||||
|
val1_val1_props = ['empty']
|
||||||
|
val1_val2_props = []
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
global_props = set(global_props)
|
||||||
|
val1_props = set(val1_props)
|
||||||
|
val1_val1_props = set(val1_val1_props)
|
||||||
|
val1_val2_props = set(val1_val2_props)
|
||||||
|
else:
|
||||||
|
global_props = frozenset(global_props)
|
||||||
|
val1_props = frozenset(val1_props)
|
||||||
|
val1_val1_props = frozenset(val1_val1_props)
|
||||||
|
val1_val2_props = frozenset(val1_val2_props)
|
||||||
|
#None because no value
|
||||||
|
idx_val2 = None
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (global_props, None)},
|
||||||
|
'val1': {None: (val1_props, None)},
|
||||||
|
'val1.val1': {None: (val1_val1_props, None)},
|
||||||
|
'val1.val2': {idx_val2: (val1_val2_props, None)}}
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([], None)}, 'val1.val2': {None: ([], None)}}
|
||||||
|
else:
|
||||||
|
# len is 0 so don't get any value
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([], None)}}
|
||||||
|
#
|
||||||
|
api.option('val1.val1').value.set([undefined])
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'val1': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
api.option.make_dict()
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
val_val2 = [None]
|
||||||
|
val_val2_props = {None: (set(), None), 0: (set(), None)}
|
||||||
|
else:
|
||||||
|
#has value
|
||||||
|
idx_val2 = 0
|
||||||
|
val_val2 = None
|
||||||
|
val_val2_props = {idx_val2: (val1_val2_props, None)}
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (global_props, None)},
|
||||||
|
'val1': {None: (val1_props, None)},
|
||||||
|
'val1.val1': {None: (val1_val1_props, None)},
|
||||||
|
'val1.val2': val_val2_props}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([None], None)},
|
||||||
|
'val1.val2': {idx_val2: (val_val2, None)}}
|
||||||
|
api.option('val1.val1').value.set([undefined, undefined])
|
||||||
|
api.option.make_dict()
|
||||||
|
api.option('val1.val2', 1).value.set('oui')
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'val1': {None: (set([]), None)}}
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
api.option.make_dict()
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
val1_val2_props = {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)}
|
||||||
|
else:
|
||||||
|
val1_val2_props = {0: (frozenset([]), None), 1: (frozenset([]), None)}
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (global_props, None)},
|
||||||
|
'val1': {None: (val1_props, None)},
|
||||||
|
'val1.val1': {None: (val1_val1_props, None)},
|
||||||
|
'val1.val2': val1_val2_props}
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([None, None], None)},
|
||||||
|
'val1.val2': {None: ([None, 'oui'], None)}}
|
||||||
|
else:
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([None, None], None)},
|
||||||
|
'val1.val2': {0: (None, None), 1: ('oui', None)}}
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_master_callback():
|
||||||
|
val1 = StrOption('val1', "", multi=True)
|
||||||
|
val2 = StrOption('val2', "", multi=True, callback=return_value, callback_params={'value': ((val1, False),)})
|
||||||
|
interface1 = MasterSlaves('val1', '', [val1, val2])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
maconfig = OptionDescription('rootconfig', '', [interface1])
|
||||||
|
cfg = Config(maconfig)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.pop('expire')
|
||||||
|
api.option.make_dict()
|
||||||
|
global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']
|
||||||
|
val1_props = []
|
||||||
|
val1_val1_props = ['empty']
|
||||||
|
val1_val2_props = []
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
global_props = set(global_props)
|
||||||
|
val1_props = set(val1_props)
|
||||||
|
val1_val1_props = set(val1_val1_props)
|
||||||
|
val1_val2_props = set(val1_val2_props)
|
||||||
|
else:
|
||||||
|
global_props = frozenset(global_props)
|
||||||
|
val1_props = frozenset(val1_props)
|
||||||
|
val1_val1_props = frozenset(val1_val1_props)
|
||||||
|
val1_val2_props = frozenset(val1_val2_props)
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (global_props, None)},
|
||||||
|
'val1': {None: (val1_props, None)},
|
||||||
|
'val1.val1': {None: (val1_val1_props, None)},
|
||||||
|
'val1.val2': {None: (val1_val2_props, None)}}
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([], None)}, 'val1.val2': {None: ([], None)}}
|
||||||
|
else:
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([], None)}}
|
||||||
|
api.option('val1.val1').value.set([undefined])
|
||||||
|
assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'val1': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert cfg.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
api.option.make_dict()
|
||||||
|
#FIXMEassert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'val1': {None: (set([]), None)}}
|
||||||
|
#FIXMEassert cfg.cfgimpl_get_values()._p_.get_cached() == {'val1.val1': {None: ([None], None)},
|
||||||
|
# 'val1.val2': {None: ([None], None)}
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
#def test_cache_master_slave_different():
|
||||||
|
# b = IntOption('int', 'Test int option', default=[0], multi=True)
|
||||||
|
# c = StrOption('str', 'Test string option', multi=True)
|
||||||
|
# d = StrOption('str1', 'Test string option', requires=[{'option': c, 'expected': None, 'action': 'hidden', 'inverse': True}], multi=True)
|
||||||
|
# descr = MasterSlaves("int", "", [b, c, d])
|
||||||
|
# #descr.impl_set_group_type(groups.master)
|
||||||
|
# cfg = Config(descr)
|
||||||
|
# api = getapi(cfg)
|
||||||
|
# api.property.read_write()
|
||||||
|
# api.property.pop('expire')
|
||||||
|
# api.option.make_dict()
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached() == {'int': {None: ([0], None)},
|
||||||
|
# 'str': {None: ([None], None)},
|
||||||
|
# 'str1': {None: ([None], None)}}
|
||||||
|
# assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'int': {None: (set(['empty']), None)},
|
||||||
|
# 'str': {None: (set([]), None), 0: (set([]), None)},
|
||||||
|
# 'str1': {None: (set([]), None), 0: (set([]), None)}}
|
||||||
|
# api.option('int').value.set([0, 1])
|
||||||
|
# api.option.make_dict()
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached() == {'int': {None: ([0, 1], None)},
|
||||||
|
# 'str': {None: ([None, None], None)},
|
||||||
|
# 'str1': {None: ([None, None], None)}}
|
||||||
|
# assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'int': {None: (set(['empty']), None)},
|
||||||
|
# 'str': {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)},
|
||||||
|
# 'str1': {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)}}
|
||||||
|
#
|
||||||
|
# api.option('str', 1).value.set('1')
|
||||||
|
# api.option.make_dict()
|
||||||
|
# assert set(cfg.cfgimpl_get_values()._p_.get_cached().keys()) == set(['int', 'str', 'str1'])
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached()['int'] == {None: ([0, 1], None)}
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached()['str'] == {None: ([None, '1'], None)}
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached()['str1'][None][0][0] == None
|
||||||
|
# raises(PropertiesOptionError, "cfg.cfgimpl_get_values()._p_.get_cached()['str1'][None][0][1]")
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached()['str1'][None][1] == None
|
||||||
|
# assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
# 'int': {None: (set(['empty']), None)},
|
||||||
|
# 'str': {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)},
|
||||||
|
# 'str1': {None: (set([]), None), 0: (set([]), None), 1: (set(['hidden']), None)}}
|
||||||
|
# api.property.read_only()
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
# assert cfg.cfgimpl_get_settings()._p_.get_cached() == {}
|
||||||
|
# api.option.make_dict()
|
||||||
|
# assert cfg.cfgimpl_get_values()._p_.get_cached() == {'int': {None: ([0, 1], None)},
|
||||||
|
# 'str': {None: ([None, '1'], None)},
|
||||||
|
# 'str1': {None: ([None, None], None)}}
|
||||||
|
# assert cfg.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'everything_frozen', 'validator', 'warnings', 'empty', 'mandatory', ]), None)},
|
||||||
|
# 'int': {None: (set(['empty']), None)},
|
||||||
|
# 'str': {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)},
|
||||||
|
# 'str1': {None: (set([]), None), 0: (set([]), None), 1: (set(['hidden']), None)}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_requires():
|
||||||
|
a = BoolOption('activate_service', '', True)
|
||||||
|
b = IPOption('ip_address_service', '',
|
||||||
|
requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
|
||||||
|
od = OptionDescription('service', '', [a, b])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.pop('expire')
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {}
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
assert api.option('ip_address_service').value.get() == None
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'ip_address_service': {None: (None, None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'ip_address_service': {None: (None, None)},
|
||||||
|
'activate_service': {None: (True, None)}}
|
||||||
|
api.option('ip_address_service').value.set('1.1.1.1')
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'activate_service': {None: (True, None)}}
|
||||||
|
api.option.make_dict()
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'ip_address_service': {None: ('1.1.1.1', None)},
|
||||||
|
'activate_service': {None: (True, None)}}
|
||||||
|
api.option('activate_service').value.set(False)
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
api.option.make_dict()
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set(['disabled']), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'activate_service': {None: (False, None)}}
|
||||||
|
|
||||||
|
|
||||||
|
def test_cache_global_properties():
|
||||||
|
a = BoolOption('activate_service', '', True)
|
||||||
|
b = IPOption('ip_address_service', '',
|
||||||
|
requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
|
||||||
|
od = OptionDescription('service', '', [a, b])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.pop('expire')
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {}
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {}
|
||||||
|
assert api.option('ip_address_service').value.get() == None
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
assert c.cfgimpl_get_values()._p_.get_cached() == {'ip_address_service': {None: (None, None)}}
|
||||||
|
api.property.pop('disabled')
|
||||||
|
assert api.option('ip_address_service').value.get() == None
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
api.property.add('test')
|
||||||
|
assert api.option('ip_address_service').value.get() == None
|
||||||
|
assert c.cfgimpl_get_settings()._p_.get_cached() == {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings', 'test']), None)},
|
||||||
|
'activate_service': {None: (set([]), None)},
|
||||||
|
'ip_address_service': {None: (set([]), None)}}
|
||||||
|
|
||||||
|
|
||||||
|
def test_callback_value_incr():
|
||||||
|
val1 = IntOption('val1', "", callback=return_incr)
|
||||||
|
val2 = IntOption('val2', "", callback=return_value, callback_params={'value': ((val1, False),)})
|
||||||
|
maconfig = OptionDescription('rootconfig', '', [val1, val2])
|
||||||
|
cfg = Config(maconfig)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
assert api.option('val1').value.get() == 1
|
||||||
|
sleep(1)
|
||||||
|
assert api.option('val2').value.get() == 1
|
||||||
|
sleep(1)
|
||||||
|
assert api.option('val1').value.get() == 2
|
||||||
|
assert api.option('val2').value.get() == 2
|
|
@ -0,0 +1,199 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from tiramisu.setting import owners
|
||||||
|
from tiramisu.option import ChoiceOption, StrOption, OptionDescription
|
||||||
|
from tiramisu.config import Config
|
||||||
|
from tiramisu.error import ConfigError
|
||||||
|
from tiramisu import getapi, undefined
|
||||||
|
|
||||||
|
|
||||||
|
def return_val(val):
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def return_list():
|
||||||
|
return ['val1', 'val2']
|
||||||
|
|
||||||
|
|
||||||
|
def return_calc_list(val):
|
||||||
|
return [val]
|
||||||
|
|
||||||
|
|
||||||
|
def return_error():
|
||||||
|
raise Exception('test')
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption():
|
||||||
|
choice = ChoiceOption('choice', '', values=('val1', 'val2'))
|
||||||
|
odesc = OptionDescription('od', '', [choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('choice').owner.get() == owners.default
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('choice').value.set('val1')
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
assert not api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('choice').value.reset()
|
||||||
|
assert api.option('choice').owner.get() == owners.default
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set('no')")
|
||||||
|
assert api.option('choice').owner.get() == owners.default
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
assert api.option('choice').value.list() == ('val1', 'val2')
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_function():
|
||||||
|
choice = ChoiceOption('choice', '', values=return_list)
|
||||||
|
odesc = OptionDescription('od', '', [choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('choice').value.set('val1')
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
#
|
||||||
|
api.option('choice').value.reset()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set('no')")
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
assert api.option('choice').value.list() == ['val1', 'val2']
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_function_error():
|
||||||
|
choice = ChoiceOption('choice', '', values=return_error)
|
||||||
|
odesc = OptionDescription('od', '', [choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(ConfigError, "api.option('choice').value.set('val1')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_function():
|
||||||
|
choice = ChoiceOption('choice', "", values=return_calc_list, values_params={'': ('val1',)})
|
||||||
|
odesc = OptionDescription('od', '', [choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('choice').value.set('val1')
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
#
|
||||||
|
api.option('choice').value.reset()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set('no')")
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_opt_function():
|
||||||
|
str_ = StrOption('str', '', 'val1')
|
||||||
|
choice = ChoiceOption('choice',
|
||||||
|
"",
|
||||||
|
values=return_calc_list,
|
||||||
|
values_params={'': ((str_, False),)})
|
||||||
|
odesc = OptionDescription('od', '', [str_, choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('choice').value.set('val1')
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
#
|
||||||
|
api.option('choice').value.reset()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set('no')")
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_opt_function_propertyerror():
|
||||||
|
str_ = StrOption('str', '', 'val1', properties=('disabled',))
|
||||||
|
choice = ChoiceOption('choice',
|
||||||
|
"",
|
||||||
|
values=return_calc_list,
|
||||||
|
values_params={'': ((str_, False),)})
|
||||||
|
odesc = OptionDescription('od', '', [str_, choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(ConfigError, "api.option('choice').value.set('no')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_opt_multi_function():
|
||||||
|
str_ = StrOption('str', '', ['val1'], multi=True)
|
||||||
|
choice = ChoiceOption('choice',
|
||||||
|
"",
|
||||||
|
default_multi='val2',
|
||||||
|
values=return_val,
|
||||||
|
values_params={'': ((str_, False),)},
|
||||||
|
multi=True)
|
||||||
|
ch2 = ChoiceOption('ch2',
|
||||||
|
"",
|
||||||
|
default=['val2'],
|
||||||
|
values=return_val,
|
||||||
|
values_params={'': ((str_, False),)},
|
||||||
|
multi=True)
|
||||||
|
odesc = OptionDescription('od', '', [str_, choice, ch2])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
assert api.option('choice').value.get() == []
|
||||||
|
#
|
||||||
|
api.option('choice').value.set(['val1'])
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set([undefined])")
|
||||||
|
#
|
||||||
|
api.option('choice').value.set(['val1'])
|
||||||
|
assert api.option('choice').owner.get() == owner
|
||||||
|
#
|
||||||
|
api.option('choice').value.reset()
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('choice').value.set('no')")
|
||||||
|
assert api.option('choice').owner.isdefault()
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('ch2').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_invalid():
|
||||||
|
str_ = StrOption('str', '', ['val1'], multi=True)
|
||||||
|
str_
|
||||||
|
raises(ValueError,
|
||||||
|
"choice = ChoiceOption('choice', '', default_multi='val2', values=[1, 2, 3], \
|
||||||
|
values_params={'': ((str_, False),)}, multi=True)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_choiceoption_calc_not_list():
|
||||||
|
str_ = StrOption('str', '', 'val1')
|
||||||
|
choice = ChoiceOption('choice',
|
||||||
|
"",
|
||||||
|
default_multi='val2',
|
||||||
|
values=return_val,
|
||||||
|
values_params={'': ((str_, False),)},
|
||||||
|
multi=True)
|
||||||
|
odesc = OptionDescription('od', '', [str_, choice])
|
||||||
|
cfg = Config(odesc)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(ConfigError, "api.option('choice').value.set(['val1'])")
|
|
@ -0,0 +1,403 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""theses tests are much more to test that config, option description, vs...
|
||||||
|
**it's there** and answers via attribute access"""
|
||||||
|
from py.test import raises
|
||||||
|
import weakref
|
||||||
|
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from tiramisu.config import Config, SubConfig
|
||||||
|
from tiramisu.i18n import _
|
||||||
|
from tiramisu import Config, IntOption, FloatOption, StrOption, ChoiceOption, \
|
||||||
|
BoolOption, UnicodeOption, OptionDescription, getapi, undefined
|
||||||
|
from tiramisu.error import ConflictError, ConfigError, PropertiesOptionError, APIError
|
||||||
|
|
||||||
|
|
||||||
|
def make_description():
|
||||||
|
gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
objspaceoption = ChoiceOption('objspace', 'Object space',
|
||||||
|
('std', 'thunk'), 'std')
|
||||||
|
booloption = BoolOption('bool', 'Test boolean option', default=True)
|
||||||
|
intoption = IntOption('int', 'Test int option', default=0)
|
||||||
|
floatoption = FloatOption('float', 'Test float option', default=2.3)
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc", properties=('mandatory', ))
|
||||||
|
boolop = BoolOption('boolop', 'Test boolean option op', default=True, properties=('hidden',))
|
||||||
|
wantref_option = BoolOption('wantref', 'Test requires', default=False)
|
||||||
|
wantframework_option = BoolOption('wantframework', 'Test requires',
|
||||||
|
default=False)
|
||||||
|
|
||||||
|
gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
|
||||||
|
descr = OptionDescription('tiram', '', [gcgroup, booloption, objspaceoption,
|
||||||
|
wantref_option, stroption,
|
||||||
|
wantframework_option,
|
||||||
|
intoption, boolop])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_config():
|
||||||
|
"""making a :class:`tiramisu.config.Config()` object
|
||||||
|
and a :class:`tiramisu.option.OptionDescription()` object
|
||||||
|
"""
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
descr = OptionDescription('tiramisu', '', [gcdummy])
|
||||||
|
cfg = Config(descr)
|
||||||
|
api = getapi(cfg)
|
||||||
|
assert api.option('dummy').value.get() is False
|
||||||
|
dmo = cfg.unwrap_from_path('dummy')
|
||||||
|
assert dmo.impl_getname() == 'dummy'
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_config_name():
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
descr = OptionDescription('tiramisu', '', [gcdummy])
|
||||||
|
cfg = Config(descr, session_id='cfg')
|
||||||
|
cfg.impl_getname() == 'cfg'
|
||||||
|
raises(ValueError, "Config(descr, session_id='unvalid name')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_not_config():
|
||||||
|
assert raises(TypeError, "Config('str')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_path():
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
descr = OptionDescription('tiramisu', '', [gcdummy])
|
||||||
|
cfg = Config(descr)
|
||||||
|
assert cfg._impl_path is None
|
||||||
|
base = OptionDescription('config', '', [descr])
|
||||||
|
cfg = Config(base)
|
||||||
|
assert cfg._impl_path is None
|
||||||
|
assert cfg.getattr('tiramisu', None, validate_properties=False)._impl_path == 'tiramisu'
|
||||||
|
nbase = OptionDescription('baseconfig', '', [base])
|
||||||
|
cfg = Config(nbase)
|
||||||
|
assert cfg._impl_path is None
|
||||||
|
assert cfg.getattr('config', None, validate_properties=False)._impl_path == 'config'
|
||||||
|
assert cfg.getattr('config.tiramisu', None, validate_properties=False)._impl_path == 'config.tiramisu'
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_config_force_permissive():
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.property.read_write()
|
||||||
|
api.permissive.set(('hidden',))
|
||||||
|
raises(PropertiesOptionError, "api.option('boolop').value.get()")
|
||||||
|
assert api.forcepermissive.option('boolop').value.get() is True
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_config_in_a_tree():
|
||||||
|
"how options are organized into a tree, see :ref:`tree`"
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
#
|
||||||
|
api.option('bool').value.set(False)
|
||||||
|
#
|
||||||
|
assert api.option('gc.name').value.get() == 'ref'
|
||||||
|
api.option('gc.name').value.set('framework')
|
||||||
|
assert api.option('gc.name').value.get() == 'framework'
|
||||||
|
#
|
||||||
|
assert api.option('objspace').value.get() == 'std'
|
||||||
|
api.option('objspace').value.set('thunk')
|
||||||
|
assert api.option('objspace').value.get() == 'thunk'
|
||||||
|
#
|
||||||
|
assert api.option('gc.float').value.get() == 2.3
|
||||||
|
api.option('gc.float').value.set(3.4)
|
||||||
|
assert api.option('gc.float').value.get() == 3.4
|
||||||
|
#
|
||||||
|
assert api.option('int').value.get() == 0
|
||||||
|
api.option('int').value.set(123)
|
||||||
|
assert api.option('int').value.get() == 123
|
||||||
|
#
|
||||||
|
assert api.option('wantref').value.get() is False
|
||||||
|
api.option('wantref').value.set(True)
|
||||||
|
assert api.option('wantref').value.get() is True
|
||||||
|
#
|
||||||
|
assert api.option('str').value.get() == 'abc'
|
||||||
|
api.option('str').value.set('def')
|
||||||
|
assert api.option('str').value.get() == 'def'
|
||||||
|
#
|
||||||
|
raises(AttributeError, "api.option('gc.foo').value.get()")
|
||||||
|
##
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
assert api.option('bool').value.get() is True
|
||||||
|
assert api.option('gc.name').value.get() == 'ref'
|
||||||
|
assert api.option('wantframework').value.get() is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_cfgimpl_get_home_by_path():
|
||||||
|
" :meth:`tiramisu.config.SubConfig.cfgimpl_get_home_by_path()` to retrieve a path"
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.option('bool').value.set(False)
|
||||||
|
assert config.cfgimpl_get_home_by_path('gc.dummy', None)[1] == 'dummy'
|
||||||
|
assert config.cfgimpl_get_home_by_path('dummy', None)[1] == 'dummy'
|
||||||
|
|
||||||
|
|
||||||
|
def test_not_valid_properties():
|
||||||
|
raises(TypeError, "stroption = StrOption('str', 'Test string option', default='abc', properties=['mandatory',])")
|
||||||
|
|
||||||
|
|
||||||
|
def test_information_config():
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
string = 'some informations'
|
||||||
|
#
|
||||||
|
api.information.set('info', string)
|
||||||
|
assert api.information.get('info') == string
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.information.get('noinfo')")
|
||||||
|
assert api.information.get('noinfo', 'default') == 'default'
|
||||||
|
api.information.reset('info')
|
||||||
|
raises(ValueError, "api.information.get('info')")
|
||||||
|
raises(ValueError, "api.information.reset('noinfo')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_impl_get_path_by_opt():
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
dummy = api.option.get('gc.dummy')
|
||||||
|
boo = api.option.get('bool')
|
||||||
|
unknown = IntOption('test', '')
|
||||||
|
unknown
|
||||||
|
assert config.cfgimpl_get_description().impl_get_path_by_opt(boo) == 'bool'
|
||||||
|
assert config.cfgimpl_get_description().impl_get_path_by_opt(dummy) == 'gc.dummy'
|
||||||
|
raises(AttributeError, "config.cfgimpl_get_description().impl_get_path_by_opt(unknown)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_impl_get_path_by_opt_od():
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
dummy = api.option.get('gc.dummy')
|
||||||
|
dummy
|
||||||
|
raises(ConfigError, "config.getattr('gc', None).cfgimpl_get_description().impl_get_path_by_opt(dummy)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_impl_get_opt_by_path():
|
||||||
|
descr = make_description()
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
dummy = api.option.get('gc.dummy')
|
||||||
|
boo = api.option.get('bool')
|
||||||
|
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
|
||||||
|
raises(AttributeError, "config.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
|
||||||
|
raises(ConfigError, "config.getattr('gc', None).cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_information_display():
|
||||||
|
# g1 = IntOption('g1', '', 1)
|
||||||
|
# g2 = StrOption('g2', '', 'héhé')
|
||||||
|
# g3 = UnicodeOption('g3', '', u'héhé')
|
||||||
|
# g4 = BoolOption('g4', '', True)
|
||||||
|
# g5 = StrOption('g5', '')
|
||||||
|
# d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
|
||||||
|
# root = OptionDescription('root', '', [d1])
|
||||||
|
# config = Config(root)
|
||||||
|
# assert str(config.od) == """g1 = 1
|
||||||
|
#g2 = héhé
|
||||||
|
#g3 = héhé
|
||||||
|
#g4 = True
|
||||||
|
#g5 = None"""
|
||||||
|
# assert str(config) == '[od]'
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_modified_values():
|
||||||
|
g1 = IntOption('g1', '', 1)
|
||||||
|
g2 = StrOption('g2', '', 'héhé')
|
||||||
|
g3 = UnicodeOption('g3', '', u'héhé')
|
||||||
|
g4 = BoolOption('g4', '', True)
|
||||||
|
g5 = StrOption('g5', '')
|
||||||
|
g6 = StrOption('g6', '', multi=True)
|
||||||
|
d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5, g6])
|
||||||
|
root = OptionDescription('root', '', [d1])
|
||||||
|
config = Config(root)
|
||||||
|
api = getapi(config)
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {}
|
||||||
|
api.option('od.g5').value.set('yes')
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes')}
|
||||||
|
api.option('od.g4').value.set(True)
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g4': ('user', True)}
|
||||||
|
api.option('od.g4').value.reset()
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes')}
|
||||||
|
api.option('od.g6').value.set([undefined])
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g6': ('user', (None,))}
|
||||||
|
api.option('od.g6').value.set([])
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g6': ('user', tuple())}
|
||||||
|
api.option('od.g6').value.set(['3'])
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g6': ('user', ('3',))}
|
||||||
|
api.option('od.g6').value.set([])
|
||||||
|
assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g6': ('user', tuple())}
|
||||||
|
|
||||||
|
|
||||||
|
#def test_has_value():
|
||||||
|
# g1 = IntOption('g1', '', 1)
|
||||||
|
# g2 = StrOption('g2', '', 'héhé')
|
||||||
|
# g3 = UnicodeOption('g3', '', u'héhé')
|
||||||
|
# g4 = BoolOption('g4', '', True)
|
||||||
|
# g5 = StrOption('g5', '')
|
||||||
|
# d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
|
||||||
|
# root = OptionDescription('root', '', [d1])
|
||||||
|
# config = Config(root)
|
||||||
|
# api = getapi(config)
|
||||||
|
# assert not g5 in config.cfgimpl_get_values()
|
||||||
|
# api.option('od.g5').value.set('yes')
|
||||||
|
# assert g5 in config.cfgimpl_get_values()
|
||||||
|
|
||||||
|
|
||||||
|
#def test_values_not_setitem():
|
||||||
|
# g1 = IntOption('g1', '', 1)
|
||||||
|
# g2 = StrOption('g2', '', 'héhé')
|
||||||
|
# g3 = UnicodeOption('g3', '', u'héhé')
|
||||||
|
# g4 = BoolOption('g4', '', True)
|
||||||
|
# g5 = StrOption('g5', '')
|
||||||
|
# d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
|
||||||
|
# root = OptionDescription('root', '', [d1])
|
||||||
|
# config = Config(root)
|
||||||
|
# config
|
||||||
|
# raises(ConfigError, "config.cfgimpl_get_values()[g1] = 2")
|
||||||
|
|
||||||
|
|
||||||
|
def test_duplicated_option():
|
||||||
|
g1 = IntOption('g1', '', 1)
|
||||||
|
g1
|
||||||
|
#in same OptionDescription
|
||||||
|
raises(ConflictError, "d1 = OptionDescription('od', '', [g1, g1])")
|
||||||
|
|
||||||
|
|
||||||
|
def test_duplicated_option_diff_od():
|
||||||
|
g1 = IntOption('g1', '', 1)
|
||||||
|
d1 = OptionDescription('od1', '', [g1])
|
||||||
|
#in different OptionDescription
|
||||||
|
d2 = OptionDescription('od2', '', [g1, d1])
|
||||||
|
d2
|
||||||
|
raises(ConflictError, 'Config(d2)')
|
||||||
|
|
||||||
|
|
||||||
|
def test_cannot_assign_value_to_option_description():
|
||||||
|
descr = make_description()
|
||||||
|
cfg = Config(descr)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api
|
||||||
|
raises(APIError, "api.option('gc').value.set(3)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_multi():
|
||||||
|
i1 = IntOption('test1', '', multi=True)
|
||||||
|
i2 = IntOption('test2', '', multi=True, default_multi=1)
|
||||||
|
i3 = IntOption('test3', '', default=[2], multi=True, default_multi=1)
|
||||||
|
od = OptionDescription('test', '', [i1, i2, i3])
|
||||||
|
config = Config(od)
|
||||||
|
api = getapi(config)
|
||||||
|
assert api.option('test1').value.get() == []
|
||||||
|
assert api.option('test2').value.get() == []
|
||||||
|
api.option('test2').value.set([undefined])
|
||||||
|
assert api.option('test2').value.get() == [1]
|
||||||
|
assert api.option('test3').value.get() == [2]
|
||||||
|
api.option('test3').value.set([undefined, undefined])
|
||||||
|
assert api.option('test3').value.get() == [2, 1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_no_validation():
|
||||||
|
i1 = IntOption('test1', '')
|
||||||
|
od = OptionDescription('test', '', [i1])
|
||||||
|
cfg = Config(od)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('test1').value.set(1)
|
||||||
|
raises(ValueError, "api.option('test1').value.set('yes')")
|
||||||
|
assert api.option('test1').value.get() == 1
|
||||||
|
api.property.pop('validator')
|
||||||
|
api.option('test1').value.set('yes')
|
||||||
|
assert api.option('test1').value.get() == 'yes'
|
||||||
|
api.property.add('validator')
|
||||||
|
raises(ValueError, "api.option('test1').value.get()")
|
||||||
|
api.option('test1').value.reset()
|
||||||
|
assert api.option('test1').value.get() is None
|
||||||
|
|
||||||
|
|
||||||
|
#def test_delete_config_with_subconfig():
|
||||||
|
# test = IntOption('test', '')
|
||||||
|
# multi = IntOption('multi', '', multi=True)
|
||||||
|
# od = OptionDescription('od', '', [test, multi])
|
||||||
|
# odroot = OptionDescription('odroot', '', [od])
|
||||||
|
# cfg = Config(odroot)
|
||||||
|
# api = getapi(cfg)
|
||||||
|
# sub = cfg.od
|
||||||
|
# val = cfg.cfgimpl_get_values()
|
||||||
|
# setting = cfg.cfgimpl_get_settings()
|
||||||
|
# assert api.option('od.test').value.get() is None
|
||||||
|
# assert api.option('od.multi').value.get() == []
|
||||||
|
# api.config.make_dict()
|
||||||
|
# del(api)
|
||||||
|
# del(cfg)
|
||||||
|
# raises(ConfigError, 'val[test]')
|
||||||
|
# raises(ConfigError, 'val[multi]')
|
||||||
|
# raises(ConfigError, 'setting[test]')
|
||||||
|
# raises(ConfigError, 'sub.make_dict()')
|
||||||
|
|
||||||
|
|
||||||
|
def test_subconfig():
|
||||||
|
i = IntOption('i', '')
|
||||||
|
o = OptionDescription('val', '', [i])
|
||||||
|
o2 = OptionDescription('val', '', [o])
|
||||||
|
c = Config(o2)
|
||||||
|
c
|
||||||
|
raises(TypeError, "SubConfig(i, weakref.ref(c))")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_config_weakref():
|
||||||
|
# o = OptionDescription('val', '', [])
|
||||||
|
# o2 = OptionDescription('val', '', [o])
|
||||||
|
# c = Config(o2)
|
||||||
|
# SubConfig(o, weakref.ref(c))
|
||||||
|
# raises(ValueError, "SubConfig(o, c)")
|
||||||
|
# s = SubConfig(o, weakref.ref(c))
|
||||||
|
# assert s._cfgimpl_get_context() == c
|
||||||
|
# del(c)
|
||||||
|
# raises(ConfigError, "s._cfgimpl_get_context()")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_config_str():
|
||||||
|
# gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
# gcdummy1 = BoolOption('dummy1', 'dummy', default=False, properties=('disabled',))
|
||||||
|
# o = OptionDescription('o', '', [gcdummy, gcdummy1])
|
||||||
|
# descr = OptionDescription('tiramisu', '', [o])
|
||||||
|
# cfg = Config(descr)
|
||||||
|
# api = getapi(cfg)
|
||||||
|
# api.property.read_only()
|
||||||
|
# str(cfg)
|
||||||
|
# str(cfg.o)
|
||||||
|
|
||||||
|
|
||||||
|
#def test_config_od_function():
|
||||||
|
# gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
# gcdummy1 = BoolOption('dummy1', 'dummy', default=False, properties=('disabled',))
|
||||||
|
# o = OptionDescription('o', '', [gcdummy, gcdummy1])
|
||||||
|
# descr = OptionDescription('tiramisu', '', [o])
|
||||||
|
# cfg = Config(descr)
|
||||||
|
# try:
|
||||||
|
# print(cfg.impl_get_opt_by_path())
|
||||||
|
# except AttributeError as err:
|
||||||
|
# assert str(err) == _('unknown Option {0} in OptionDescription {1}'
|
||||||
|
# '').format('impl_get_opt_by_path', descr.impl_getname())
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_subconfig():
|
||||||
|
i1 = IntOption('i1', '')
|
||||||
|
i2 = IntOption('i2', '', default=1)
|
||||||
|
i3 = IntOption('i3', '')
|
||||||
|
i4 = IntOption('i4', '', default=2)
|
||||||
|
od1 = OptionDescription('od1', '', [i1, i2, i3, i4])
|
||||||
|
od2 = OptionDescription('od2', '', [od1])
|
||||||
|
conf1 = Config(od2, session_id='conf1')
|
||||||
|
api = getapi(conf1)
|
||||||
|
raises(ConfigError, "conf2 = Config(od1, session_id='conf2')")
|
|
@ -0,0 +1,387 @@
|
||||||
|
"configuration objects global API"
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from tiramisu import Config, IntOption, FloatOption, StrOption, ChoiceOption, \
|
||||||
|
BoolOption, FilenameOption, UnicodeOption, SymLinkOption, IPOption, \
|
||||||
|
PortOption, NetworkOption, NetmaskOption, BroadcastOption, \
|
||||||
|
DomainnameOption, OptionDescription, getapi
|
||||||
|
from tiramisu.error import PropertiesOptionError
|
||||||
|
|
||||||
|
|
||||||
|
def make_description():
|
||||||
|
gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
prop = BoolOption('prop', '', properties=('disabled',))
|
||||||
|
prop2 = BoolOption('prop', '', properties=('hidden',))
|
||||||
|
objspaceoption = ChoiceOption('objspace', 'Object space',
|
||||||
|
('std', 'thunk'), 'std')
|
||||||
|
booloption = BoolOption('bool', 'Test boolean option', default=True)
|
||||||
|
booloption2 = BoolOption('bool', 'Test boolean option', default=False)
|
||||||
|
intoption = IntOption('int', 'Test int option', default=0)
|
||||||
|
floatoption2 = FloatOption('float', 'Test float option', default=2.3)
|
||||||
|
floatoption = FloatOption('float', 'Test float option', default=2.3)
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc")
|
||||||
|
boolop = BoolOption('boolop', 'Test boolean option op', default=True)
|
||||||
|
wantref_option = BoolOption('wantref', 'Tests', default=False)
|
||||||
|
wantframework_option = BoolOption('wantframework', 'Test', default=False)
|
||||||
|
gcgroup2 = OptionDescription('gc2', '', [booloption2, prop])
|
||||||
|
gcgroup = OptionDescription('gc', '', [gcgroup2, gcoption, gcdummy, floatoption, prop2])
|
||||||
|
descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
|
||||||
|
wantref_option, stroption,
|
||||||
|
wantframework_option,
|
||||||
|
intoption, boolop, floatoption2])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def _is_same_opt(opt1, opt2):
|
||||||
|
if "id" in dir(opt1):
|
||||||
|
assert opt1.id == opt2.id
|
||||||
|
else:
|
||||||
|
assert opt1 == opt2
|
||||||
|
|
||||||
|
|
||||||
|
#def test_iter_config():
|
||||||
|
# "iteration on config object"
|
||||||
|
# s = StrOption("string", "", default="string")
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# descr = OptionDescription("options", "", [s, s2])
|
||||||
|
# config = Config(descr)
|
||||||
|
# assert [(name, value) for name, value in config] == \
|
||||||
|
# [('string', 'string'), ('string2', 'string2')]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_iter_config_property():
|
||||||
|
# "iteration on config object"
|
||||||
|
# s = StrOption("string", "", default="string", properties=('disabled',))
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# descr = OptionDescription("options", "", [s, s2])
|
||||||
|
# config = Config(descr)
|
||||||
|
# config.read_only()
|
||||||
|
# assert [(name, value) for name, value in config] == \
|
||||||
|
# [('string2', 'string2')]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_iter_subconfig():
|
||||||
|
# "iteration on config sub object"
|
||||||
|
# descr = make_description()
|
||||||
|
# conf = Config(descr)
|
||||||
|
# for (name, value), (gname, gvalue) in \
|
||||||
|
# zip(conf.gc, [("name", "ref"), ("dummy", False)]):
|
||||||
|
# assert name == gname
|
||||||
|
# assert value == gvalue
|
||||||
|
|
||||||
|
|
||||||
|
def test_str():
|
||||||
|
descr = make_description()
|
||||||
|
c = Config(descr)
|
||||||
|
c # does not crash
|
||||||
|
|
||||||
|
|
||||||
|
def test_make_dict():
|
||||||
|
"serialization of the whole config to a dict"
|
||||||
|
descr = OptionDescription("opt", "", [
|
||||||
|
OptionDescription("s1", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False, properties=('hidden',))]),
|
||||||
|
IntOption("int", "", default=42)])
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.property.read_write()
|
||||||
|
api.permissive.set(('hidden',))
|
||||||
|
d = api.option.make_dict()
|
||||||
|
assert d == {"s1.a": False, "int": 42}
|
||||||
|
api.option('int').value.set(43)
|
||||||
|
api.option('s1.a').value.set(True)
|
||||||
|
d = api.option.make_dict()
|
||||||
|
assert d == {"s1.a": True, "int": 43}
|
||||||
|
d2 = api.option.make_dict(flatten=True)
|
||||||
|
assert d2 == {'a': True, 'int': 43}
|
||||||
|
raises(ValueError, 'd2 = api.option.make_dict(withvalue="3")')
|
||||||
|
d = api.forcepermissive.option.make_dict()
|
||||||
|
assert d == {"s1.a": True, "s1.b": False, "int": 43}
|
||||||
|
|
||||||
|
|
||||||
|
def test_make_dict_with_disabled():
|
||||||
|
descr = OptionDescription("opt", "", [
|
||||||
|
OptionDescription("s1", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False, properties=('disabled',))]),
|
||||||
|
OptionDescription("s2", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False)], properties=('disabled',)),
|
||||||
|
IntOption("int", "", default=42)])
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.property.read_only()
|
||||||
|
d = api.option.make_dict()
|
||||||
|
assert d == {"s1.a": False, "int": 42}
|
||||||
|
|
||||||
|
|
||||||
|
def test_make_dict_with_disabled_in_callback():
|
||||||
|
descr = OptionDescription("opt", "", [
|
||||||
|
OptionDescription("s1", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False, properties=('disabled',))]),
|
||||||
|
OptionDescription("s2", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False)], properties=('disabled',)),
|
||||||
|
IntOption("int", "", default=42)])
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.property.read_only()
|
||||||
|
d = api.option.make_dict()
|
||||||
|
assert d == {"s1.a": False, "int": 42}
|
||||||
|
|
||||||
|
|
||||||
|
def test_make_dict_fullpath():
|
||||||
|
descr = OptionDescription("root", "", [
|
||||||
|
OptionDescription("opt", "", [
|
||||||
|
OptionDescription("s1", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False, properties=('disabled',))]),
|
||||||
|
OptionDescription("s2", "", [
|
||||||
|
BoolOption("a", "", default=False),
|
||||||
|
BoolOption("b", "", default=False)], properties=('disabled',)),
|
||||||
|
IntOption("int", "", default=42)]),
|
||||||
|
IntOption("introot", "", default=42)])
|
||||||
|
config = Config(descr)
|
||||||
|
api = getapi(config)
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option.make_dict() == {"opt.s1.a": False, "opt.int": 42, "introot": 42}
|
||||||
|
assert api.option('opt').make_dict() == {"s1.a": False, "int": 42}
|
||||||
|
assert api.option.make_dict(fullpath=True) == {"opt.s1.a": False, "opt.int": 42, "introot": 42}
|
||||||
|
assert api.option('opt').make_dict(fullpath=True) == {"opt.s1.a": False, "opt.int": 42}
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_in_config():
|
||||||
|
"finds option in config"
|
||||||
|
descr = make_description()
|
||||||
|
conf = Config(descr)
|
||||||
|
api = getapi(conf)
|
||||||
|
api.property.read_only()
|
||||||
|
api.permissive.set(('hidden',))
|
||||||
|
ret = api.option.find('dummy')
|
||||||
|
assert len(ret) == 1
|
||||||
|
_is_same_opt(ret[0], api.option.get('gc.dummy'))
|
||||||
|
#
|
||||||
|
ret = api.option.find_first('dummy')
|
||||||
|
_is_same_opt(ret, api.option.get('gc.dummy'))
|
||||||
|
#
|
||||||
|
ret = api.option.find('float')
|
||||||
|
assert len(ret) == 2
|
||||||
|
_is_same_opt(ret[0], api.option.get('gc.float'))
|
||||||
|
_is_same_opt(ret[1], api.option.get('float'))
|
||||||
|
#
|
||||||
|
_is_same_opt(api.option.find_first('bool'), api.option.get('gc.gc2.bool'))
|
||||||
|
#_is_same_opt(conf.find_first(byname='bool', byvalue=True), conf.unwrap_from_path('bool'))
|
||||||
|
#_is_same_opt(conf.find_first(byname='dummy'), conf.unwrap_from_path('gc.dummy'))
|
||||||
|
#_is_same_opt(conf.find_first(byname='float'), conf.unwrap_from_path('gc.float'))
|
||||||
|
#ret = conf.find(bytype=ChoiceOption)
|
||||||
|
#assert len(ret) == 2
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.name'))
|
||||||
|
#_is_same_opt(ret[1], conf.unwrap_from_path('objspace'))
|
||||||
|
#_is_same_opt(conf.find_first(bytype=ChoiceOption), conf.unwrap_from_path('gc.name'))
|
||||||
|
#ret = conf.find(byvalue='ref')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.name'))
|
||||||
|
#_is_same_opt(conf.find_first(byvalue='ref'), conf.unwrap_from_path('gc.name'))
|
||||||
|
#ret = conf.find(byname='prop')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.prop'))
|
||||||
|
#conf.read_write()
|
||||||
|
#raises(AttributeError, "assert conf.find(byname='prop')")
|
||||||
|
#ret = conf.find(byname='prop', check_properties=False)
|
||||||
|
#assert len(ret) == 2
|
||||||
|
#_is_same_opt(ret[0], conf.cfgimpl_get_description().impl_get_opt_by_path('gc.gc2.prop'))
|
||||||
|
#_is_same_opt(ret[1], conf.unwrap_from_path('gc.prop', force_permissive=True))
|
||||||
|
#ret = conf.find(byname='prop', force_permissive=True)
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.prop', force_permissive=True))
|
||||||
|
#_is_same_opt(conf.find_first(byname='prop', force_permissive=True), conf.unwrap_from_path('gc.prop', force_permissive=True))
|
||||||
|
##assert conf.find_first(byname='prop') == conf.unwrap_from_path('gc.prop')
|
||||||
|
## combinaison of filters
|
||||||
|
#ret = conf.find(bytype=BoolOption, byname='dummy')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.dummy'))
|
||||||
|
#_is_same_opt(conf.find_first(bytype=BoolOption, byname='dummy'), conf.unwrap_from_path('gc.dummy'))
|
||||||
|
#ret = conf.find(byvalue=False, byname='dummy')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.dummy'))
|
||||||
|
#_is_same_opt(conf.find_first(byvalue=False, byname='dummy'), conf.unwrap_from_path('gc.dummy'))
|
||||||
|
##subconfig
|
||||||
|
#ret = conf.gc.find(byname='dummy')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.dummy'))
|
||||||
|
#ret = conf.gc.find(byname='float')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.float'))
|
||||||
|
#ret = conf.gc.find(byname='bool')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.gc2.bool'))
|
||||||
|
#_is_same_opt(conf.gc.find_first(byname='bool', byvalue=False), conf.unwrap_from_path('gc.gc2.bool'))
|
||||||
|
#raises(AttributeError, "assert conf.gc.find_first(byname='bool', byvalue=True)")
|
||||||
|
#raises(AttributeError, "conf.gc.find(byname='wantref').first()")
|
||||||
|
#ret = conf.gc.find(byname='prop', check_properties=False)
|
||||||
|
#assert len(ret) == 2
|
||||||
|
#_is_same_opt(ret[0], conf.cfgimpl_get_description().impl_get_opt_by_path('gc.gc2.prop'))
|
||||||
|
#_is_same_opt(ret[1], conf.unwrap_from_path('gc.prop', force_permissive=True))
|
||||||
|
#conf.read_only()
|
||||||
|
#ret = conf.gc.find(byname='prop')
|
||||||
|
#assert len(ret) == 1
|
||||||
|
#_is_same_opt(ret[0], conf.unwrap_from_path('gc.prop'))
|
||||||
|
## not OptionDescription
|
||||||
|
#raises(AttributeError, "conf.find_first(byname='gc')")
|
||||||
|
#raises(AttributeError, "conf.gc.find_first(byname='gc2')")
|
||||||
|
#raises(ValueError, "conf.find(byname='bool', type_='unknown')")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_find_multi():
|
||||||
|
# b = BoolOption('bool', '', multi=True)
|
||||||
|
# o = OptionDescription('od', '', [b])
|
||||||
|
# conf = Config(o)
|
||||||
|
# raises(AttributeError, "conf.find(byvalue=True)")
|
||||||
|
# raises(AttributeError, "conf.find_first(byvalue=True)")
|
||||||
|
# conf.bool.append(False)
|
||||||
|
# raises(AttributeError, "conf.find(byvalue=True)")
|
||||||
|
# raises(AttributeError, "conf.find_first(byvalue=True)")
|
||||||
|
# conf.bool.append(False)
|
||||||
|
# raises(AttributeError, "conf.find(byvalue=True)")
|
||||||
|
# raises(AttributeError, "conf.find_first(byvalue=True)")
|
||||||
|
# conf.bool.append(True)
|
||||||
|
# ret = conf.find(byvalue=True)
|
||||||
|
# assert len(ret) == 1
|
||||||
|
# _is_same_opt(ret[0], b)
|
||||||
|
# _is_same_opt(conf.find_first(byvalue=True), b)
|
||||||
|
|
||||||
|
|
||||||
|
def test_does_not_find_in_config():
|
||||||
|
descr = make_description()
|
||||||
|
conf = Config(descr)
|
||||||
|
api = getapi(conf)
|
||||||
|
api
|
||||||
|
raises(AttributeError, "api.option.find('IDontExist')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_filename():
|
||||||
|
a = FilenameOption('a', '')
|
||||||
|
o = OptionDescription('o', '', [a])
|
||||||
|
cfg = Config(o)
|
||||||
|
api = getapi(cfg)
|
||||||
|
api.option('a').value.set('/')
|
||||||
|
api.option('a').value.set('/tmp')
|
||||||
|
api.option('a').value.set('/tmp/')
|
||||||
|
api.option('a').value.set('/tmp/text.txt')
|
||||||
|
api.option('a').value.set('tmp')
|
||||||
|
api.option('a').value.set('tmp/')
|
||||||
|
api.option('a').value.set('tmp/text.txt')
|
||||||
|
raises(ValueError, "api.option('a').value.set('/tmp/with space.txt')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('/tmp/with$.txt')")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_iter_all():
|
||||||
|
# s = StrOption("string", "", default="string")
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# descr = OptionDescription("options", "", [s, s2])
|
||||||
|
# config = Config(descr)
|
||||||
|
# assert list(config.iter_all()) == [('string', 'string'), ('string2', 'string2')]
|
||||||
|
# for i in config.iter_all():
|
||||||
|
# #test StopIteration
|
||||||
|
# break
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_iter_all_force_permissive():
|
||||||
|
# s = StrOption("string", "", default="string")
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# s3 = StrOption("string3", "", default="string3", properties=('hidden',))
|
||||||
|
# descr = OptionDescription("options", "", [s, s2, s3])
|
||||||
|
# config = Config(descr)
|
||||||
|
# api = getapi(config)
|
||||||
|
# api.property.read_write()
|
||||||
|
# api.permissive.set(('hidden',))
|
||||||
|
# assert list(config.iter_all()) == [('string', 'string'), ('string2', 'string2')]
|
||||||
|
# assert list(config.iter_all(force_permissive=True)) == [('string', 'string'),
|
||||||
|
# ('string2', 'string2'),
|
||||||
|
# ('string3', 'string3')]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_iter_all_prop():
|
||||||
|
# s = StrOption("string", "", default="string", properties=('disabled',))
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# descr = OptionDescription("options", "", [s, s2])
|
||||||
|
# config = Config(descr)
|
||||||
|
# api = getapi(config)
|
||||||
|
# api.property.read_only()
|
||||||
|
# assert list(config.iter_all()) == [('string2', 'string2')]
|
||||||
|
|
||||||
|
|
||||||
|
#def test_impl_getpaths():
|
||||||
|
# s = StrOption("string", "", default="string", properties=('disabled',))
|
||||||
|
# s2 = StrOption("string2", "", default="string2")
|
||||||
|
# s3 = StrOption("string3", "", default="string3")
|
||||||
|
# s4 = StrOption("string4", "", default="string4", properties=('hidden',))
|
||||||
|
# od = OptionDescription('od', '', [s3, s4])
|
||||||
|
# descr = OptionDescription("options", "", [s, s2, od])
|
||||||
|
# config = Config(descr)
|
||||||
|
# assert ['string', 'string2', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths()
|
||||||
|
# assert ['string', 'string2', 'od', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths(include_groups=True)
|
||||||
|
# config.read_write()
|
||||||
|
# raises(PropertiesOptionError, "config.od.string4")
|
||||||
|
# assert ['string', 'string2', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths()
|
||||||
|
# assert ['string', 'string2', 'od', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths(include_groups=True)
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_option():
|
||||||
|
ChoiceOption('a', '', ('1', '2'))
|
||||||
|
raises(TypeError, "ChoiceOption('a', '', [1, 2])")
|
||||||
|
raises(TypeError, "ChoiceOption('a', '', 1)")
|
||||||
|
raises(ValueError, "ChoiceOption('a', '', (1,), 3)")
|
||||||
|
FloatOption('a', '')
|
||||||
|
raises(ValueError, "FloatOption('a', '', 'string')")
|
||||||
|
UnicodeOption('a', '')
|
||||||
|
raises(ValueError, "UnicodeOption('a', '', 1)")
|
||||||
|
u = UnicodeOption('a', '')
|
||||||
|
SymLinkOption('a', u)
|
||||||
|
raises(ValueError, "SymLinkOption('a', 'string')")
|
||||||
|
IPOption('a', '')
|
||||||
|
raises(ValueError, "IPOption('a', '', 1)")
|
||||||
|
raises(ValueError, "IPOption('a', '', 'string')")
|
||||||
|
PortOption('a', '')
|
||||||
|
raises(ValueError, "PortOption('a', '', 'string')")
|
||||||
|
raises(ValueError, "PortOption('a', '', '11:12:13', allow_range=True)")
|
||||||
|
raises(ValueError, "PortOption('a', '', 11111111111111111111)")
|
||||||
|
raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=True, allow_private=False)")
|
||||||
|
raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=True, allow_registred=False, allow_private=True)")
|
||||||
|
raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=False, allow_private=True)")
|
||||||
|
raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=True, allow_private=True)")
|
||||||
|
raises(ValueError, "PortOption('a', '', allow_zero=False, allow_wellknown=False, allow_registred=False, allow_private=False)")
|
||||||
|
NetworkOption('a', '')
|
||||||
|
raises(ValueError, "NetworkOption('a', '', 'string')")
|
||||||
|
NetmaskOption('a', '')
|
||||||
|
raises(ValueError, "NetmaskOption('a', '', 'string')")
|
||||||
|
BroadcastOption('a', '')
|
||||||
|
raises(ValueError, "BroadcastOption('a', '', 'string')")
|
||||||
|
DomainnameOption('a', '')
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', 'string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', type_='string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', allow_ip='string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', allow_without_dot='string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', 1)")
|
||||||
|
#
|
||||||
|
ChoiceOption('a', '', (1,), multi=True, default_multi=1)
|
||||||
|
raises(ValueError, "ChoiceOption('a', '', (1,), default_multi=1)")
|
||||||
|
raises(ValueError, "ChoiceOption('a', '', (1,), multi=True, default=[1,], default_multi=2)")
|
||||||
|
raises(ValueError, "FloatOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "UnicodeOption('a', '', multi=True, default_multi=1)")
|
||||||
|
raises(ValueError, "IPOption('a', '', multi=True, default_multi=1)")
|
||||||
|
raises(ValueError, "IPOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "PortOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "PortOption('a', '', multi=True, default_multi='11:12:13', allow_range=True)")
|
||||||
|
raises(ValueError, "PortOption('a', '', multi=True, default_multi=11111111111111111111)")
|
||||||
|
raises(ValueError, "NetworkOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "NetmaskOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "BroadcastOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', multi=True, default_multi='string')")
|
||||||
|
raises(ValueError, "DomainnameOption('a', '', multi=True, default_multi=1)")
|
|
@ -0,0 +1,178 @@
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
import warnings, sys
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
from tiramisu.config import Config
|
||||||
|
from tiramisu.option import DomainnameOption, EmailOption, URLOption, OptionDescription
|
||||||
|
from tiramisu.error import ValueWarning
|
||||||
|
from tiramisu.i18n import _
|
||||||
|
from tiramisu import getapi
|
||||||
|
|
||||||
|
|
||||||
|
def test_domainname():
|
||||||
|
d = DomainnameOption('d', '')
|
||||||
|
f = DomainnameOption('f', '', allow_without_dot=True)
|
||||||
|
g = DomainnameOption('g', '', allow_ip=True)
|
||||||
|
od = OptionDescription('a', '', [d, f, g])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('d').value.set('toto.com')
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto')")
|
||||||
|
api.option('d').value.set('toto3.com')
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto_super.com')")
|
||||||
|
api.option('d').value.set('toto-.com')
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto..com')")
|
||||||
|
#
|
||||||
|
api.option('f').value.set('toto.com')
|
||||||
|
api.option('f').value.set('toto')
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea')
|
||||||
|
raises(ValueError, "api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamean')")
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nd')
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie')
|
||||||
|
raises(ValueError, "api.option('d').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowien')")
|
||||||
|
api.option('f').value.set('d')
|
||||||
|
api.option('f').value.set('d.t')
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('f').value.set('192.168.1.1')")
|
||||||
|
api.option('g').value.set('toto.com')
|
||||||
|
api.option('g').value.set('192.168.1.0')
|
||||||
|
api.option('g').value.set('192.168.1.29')
|
||||||
|
|
||||||
|
|
||||||
|
def test_domainname_upper():
|
||||||
|
d = DomainnameOption('d', '')
|
||||||
|
od = OptionDescription('a', '', [d])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('d').value.set('toto.com')
|
||||||
|
msg = _('some characters are uppercase')
|
||||||
|
has_error = False
|
||||||
|
try:
|
||||||
|
api.option('d').value.set('TOTO.COM')
|
||||||
|
except ValueError as err:
|
||||||
|
assert msg in str(err)
|
||||||
|
has_error = True
|
||||||
|
assert has_error is True
|
||||||
|
has_error = False
|
||||||
|
try:
|
||||||
|
api.option('d').value.set('toTo.com')
|
||||||
|
except ValueError as err:
|
||||||
|
assert msg in str(err)
|
||||||
|
has_error = True
|
||||||
|
assert has_error is True
|
||||||
|
|
||||||
|
|
||||||
|
def test_domainname_warning():
|
||||||
|
d = DomainnameOption('d', '', warnings_only=True)
|
||||||
|
f = DomainnameOption('f', '', allow_without_dot=True, warnings_only=True)
|
||||||
|
g = DomainnameOption('g', '', allow_ip=True, warnings_only=True)
|
||||||
|
od = OptionDescription('a', '', [d, f, g])
|
||||||
|
warnings.simplefilter("always", ValueWarning)
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('d').value.set('toto.com')
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto')")
|
||||||
|
api.option('d').value.set('toto3.com')
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
api.option('d').value.set('toto_super.com')
|
||||||
|
assert len(w) == 1
|
||||||
|
api.option('d').value.set('toto-.com')
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto..com')")
|
||||||
|
#
|
||||||
|
api.option('f').value.set('toto.com')
|
||||||
|
api.option('f').value.set('toto')
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea')
|
||||||
|
raises(ValueError, "api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamean')")
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nd')
|
||||||
|
api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie')
|
||||||
|
raises(ValueError, "api.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainname.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnamet.olongthathavemorethanmaximumsizeforatruedomainnameanditsnotea.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie.xxxx')")
|
||||||
|
api.option('f').value.set('d')
|
||||||
|
api.option('f').value.set('d.t')
|
||||||
|
#
|
||||||
|
raises(ValueError, "api.option('f').value.set('192.168.1.1')")
|
||||||
|
api.option('g').value.set('toto.com')
|
||||||
|
api.option('g').value.set('192.168.1.0')
|
||||||
|
api.option('g').value.set('192.168.1.29')
|
||||||
|
|
||||||
|
|
||||||
|
def test_special_domain_name():
|
||||||
|
"""domain name option that starts with a number or not
|
||||||
|
"""
|
||||||
|
d = DomainnameOption('d', '')
|
||||||
|
e = DomainnameOption('e', '', type_='netbios')
|
||||||
|
od = OptionDescription('a', '', [d, e])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('d').value.set('1toto.com')
|
||||||
|
api.option('d').value.set('123toto.com')
|
||||||
|
api.option('e').value.set('toto')
|
||||||
|
api.option('e').value.set('1toto')
|
||||||
|
|
||||||
|
|
||||||
|
def test_domainname_netbios():
|
||||||
|
d = DomainnameOption('d', '', type_='netbios')
|
||||||
|
e = DomainnameOption('e', '', "toto", type_='netbios')
|
||||||
|
od = OptionDescription('a', '', [d, e])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto.com')")
|
||||||
|
api.option('d').value.set('toto')
|
||||||
|
raises(ValueError, "api.option('d').value.set('domainnametoolong')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_domainname_hostname():
|
||||||
|
d = DomainnameOption('d', '', type_='hostname')
|
||||||
|
e = DomainnameOption('e', '', "toto", type_='hostname')
|
||||||
|
od = OptionDescription('a', '', [d, e])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(ValueError, "api.option('d').value.set('toto.com')")
|
||||||
|
api.option('d').value.set('toto')
|
||||||
|
api.option('d').value.set('domainnametoolong')
|
||||||
|
|
||||||
|
|
||||||
|
def test_email():
|
||||||
|
e = EmailOption('e', '')
|
||||||
|
od = OptionDescription('a', '', [e])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('e').value.set('foo-bar.baz@example.com')
|
||||||
|
api.option('e').value.set('root@foo.com')
|
||||||
|
api.option('e').value.set('root@domain')
|
||||||
|
raises(ValueError, "api.option('e').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('e').value.set('root')")
|
||||||
|
raises(ValueError, "api.option('e').value.set('root[]@domain')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_url():
|
||||||
|
u = URLOption('u', '')
|
||||||
|
od = OptionDescription('a', '', [u])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('u').value.set('http://foo.com')
|
||||||
|
api.option('u').value.set('https://foo.com')
|
||||||
|
api.option('u').value.set('https://foo.com/')
|
||||||
|
raises(ValueError, "api.option('u').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('u').value.set('ftp://foo.com')")
|
||||||
|
raises(ValueError, "api.option('u').value.set('foo.com')")
|
||||||
|
raises(ValueError, "api.option('u').value.set(':/foo.com')")
|
||||||
|
raises(ValueError, "api.option('u').value.set('foo.com/http://')")
|
||||||
|
api.option('u').value.set('https://foo.com/index.html')
|
||||||
|
api.option('u').value.set('https://foo.com/index.html?var=value&var2=val2')
|
||||||
|
raises(ValueError, "api.option('u').value.set('https://foo.com/index\\n.html')")
|
||||||
|
api.option('u').value.set('https://foo.com:8443')
|
||||||
|
api.option('u').value.set('https://foo.com:8443/')
|
||||||
|
api.option('u').value.set('https://foo.com:8443/index.html')
|
||||||
|
raises(ValueError, "api.option('u').value.set('https://foo.com:84438989')")
|
||||||
|
api.option('u').value.set('https://foo.com:8443/INDEX')
|
||||||
|
raises(ValueError, "api.option('u').value.set('https://FOO.COM:8443')")
|
|
@ -0,0 +1,254 @@
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
import warnings
|
||||||
|
from py.test import raises
|
||||||
|
from tiramisu import Config ,IPOption, NetworkOption, NetmaskOption, \
|
||||||
|
PortOption, BroadcastOption, OptionDescription, getapi
|
||||||
|
from tiramisu.error import ValueWarning
|
||||||
|
|
||||||
|
|
||||||
|
def test_ip():
|
||||||
|
a = IPOption('a', '')
|
||||||
|
b = IPOption('b', '', private_only=True)
|
||||||
|
d = IPOption('d', '', warnings_only=True, private_only=True)
|
||||||
|
warnings.simplefilter("always", ValueWarning)
|
||||||
|
od = OptionDescription('od', '', [a, b, d])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.option('a').value.set('192.168.1.1')
|
||||||
|
api.option('a').value.set('192.168.1.0')
|
||||||
|
api.option('a').value.set('88.88.88.88')
|
||||||
|
api.option('a').value.set('0.0.0.0')
|
||||||
|
raises(ValueError, "api.option('a').value.set('255.255.255.0')")
|
||||||
|
api.option('b').value.set('192.168.1.1')
|
||||||
|
api.option('b').value.set('192.168.1.0')
|
||||||
|
raises(ValueError, "api.option('b').value.set('88.88.88.88')")
|
||||||
|
api.option('b').value.set('0.0.0.0')
|
||||||
|
raises(ValueError, "api.option('b').value.set('255.255.255.0')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('333.0.1.20')")
|
||||||
|
|
||||||
|
raises(ValueError, "IPOption('a', 'ip', default='192.000.023.01')")
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
api.option('d').value.set('88.88.88.88')
|
||||||
|
assert len(w) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_ip_default():
|
||||||
|
a = IPOption('a', '', '88.88.88.88')
|
||||||
|
od = OptionDescription('od', '', [a])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.option('a').value.get() == '88.88.88.88'
|
||||||
|
|
||||||
|
|
||||||
|
def test_ip_reserved():
|
||||||
|
a = IPOption('a', '')
|
||||||
|
b = IPOption('b', '', allow_reserved=True)
|
||||||
|
c = IPOption('c', '', warnings_only=True)
|
||||||
|
od = OptionDescription('od', '', [a, b, c])
|
||||||
|
warnings.simplefilter("always", ValueWarning)
|
||||||
|
cfg = Config(od)
|
||||||
|
api = getapi(cfg)
|
||||||
|
raises(ValueError, "api.option('a').value.set('226.94.1.1')")
|
||||||
|
api.option('b').value.set('226.94.1.1')
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
api.option('c').value.set('226.94.1.1')
|
||||||
|
assert len(w) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_network():
|
||||||
|
a = NetworkOption('a', '')
|
||||||
|
b = NetworkOption('b', '', warnings_only=True)
|
||||||
|
od = OptionDescription('od', '', [a, b])
|
||||||
|
warnings.simplefilter("always", ValueWarning)
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
api.option('a').value.set('192.168.1.1')
|
||||||
|
api.option('a').value.set('192.168.1.0')
|
||||||
|
api.option('a').value.set('88.88.88.88')
|
||||||
|
api.option('a').value.set('0.0.0.0')
|
||||||
|
raises(ValueError, "api.option('a').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('a').value.set('1.1.1.1.1')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('255.255.255.0')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.001.0')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('333.168.1.1')")
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
api.option('b').value.set('255.255.255.0')
|
||||||
|
assert len(w) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_network_invalid():
|
||||||
|
raises(ValueError, "NetworkOption('a', '', default='toto')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_netmask():
|
||||||
|
a = NetmaskOption('a', '')
|
||||||
|
od = OptionDescription('od', '', [a])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.1.1.1')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.1.1')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.1.0')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('88.88.88.88')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('255.255.255.000')")
|
||||||
|
raises(ValueError, "api.option('a').value.set(2)")
|
||||||
|
api.option('a').value.set('0.0.0.0')
|
||||||
|
api.option('a').value.set('255.255.255.0')
|
||||||
|
|
||||||
|
|
||||||
|
def test_broadcast():
|
||||||
|
a = BroadcastOption('a', '')
|
||||||
|
od = OptionDescription('od', '', [a])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.1.255.1')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.001.255')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('192.168.0.300')")
|
||||||
|
raises(ValueError, "api.option('a').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('a').value.set(2)")
|
||||||
|
api.option('a').value.set('0.0.0.0')
|
||||||
|
api.option('a').value.set('255.255.255.0')
|
||||||
|
|
||||||
|
|
||||||
|
def test_port():
|
||||||
|
a = PortOption('a', '')
|
||||||
|
b = PortOption('b', '', allow_zero=True)
|
||||||
|
c = PortOption('c', '', allow_zero=True, allow_registred=False)
|
||||||
|
d = PortOption('d', '', allow_zero=True, allow_wellknown=False, allow_registred=False)
|
||||||
|
e = PortOption('e', '', allow_zero=True, allow_private=True)
|
||||||
|
f = PortOption('f', '', allow_private=True)
|
||||||
|
od = OptionDescription('od', '', [a, b, c, d, e, f])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
raises(ValueError, "api.option('a').value.set(0)")
|
||||||
|
api.option('a').value.set(1)
|
||||||
|
api.option('a').value.set(1023)
|
||||||
|
api.option('a').value.set(1024)
|
||||||
|
api.option('a').value.set(49151)
|
||||||
|
raises(ValueError, "api.option('a').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('a').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('a').value.set(65536)")
|
||||||
|
|
||||||
|
api.option('b').value.set(0)
|
||||||
|
api.option('b').value.set(1)
|
||||||
|
api.option('b').value.set(1023)
|
||||||
|
api.option('b').value.set(1024)
|
||||||
|
api.option('b').value.set(49151)
|
||||||
|
raises(ValueError, "api.option('b').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('b').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('b').value.set(65536)")
|
||||||
|
|
||||||
|
api.option('c').value.set(0)
|
||||||
|
api.option('c').value.set(1)
|
||||||
|
api.option('c').value.set(1023)
|
||||||
|
raises(ValueError, "api.option('c').value.set(1024)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(49151)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(65536)")
|
||||||
|
|
||||||
|
api.option('d').value.set(0)
|
||||||
|
raises(ValueError, "api.option('d').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(1023)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(1024)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(49151)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(65536)")
|
||||||
|
|
||||||
|
api.option('e').value.set(0)
|
||||||
|
api.option('e').value.set(1)
|
||||||
|
api.option('e').value.set(1023)
|
||||||
|
api.option('e').value.set(1024)
|
||||||
|
api.option('e').value.set(49151)
|
||||||
|
api.option('e').value.set(49152)
|
||||||
|
api.option('e').value.set(65535)
|
||||||
|
|
||||||
|
raises(ValueError, "api.option('f').value.set(0)")
|
||||||
|
api.option('f').value.set(1)
|
||||||
|
api.option('f').value.set(1023)
|
||||||
|
api.option('f').value.set(1024)
|
||||||
|
api.option('f').value.set(49151)
|
||||||
|
api.option('f').value.set(49152)
|
||||||
|
api.option('f').value.set(65535)
|
||||||
|
raises(ValueError, "api.option('f').value.set(65536)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_port_range():
|
||||||
|
a = PortOption('a', '', allow_range=True)
|
||||||
|
b = PortOption('b', '', allow_range=True, allow_zero=True)
|
||||||
|
c = PortOption('c', '', allow_range=True, allow_zero=True, allow_registred=False)
|
||||||
|
d = PortOption('d', '', allow_range=True, allow_zero=True, allow_wellknown=False, allow_registred=False)
|
||||||
|
e = PortOption('e', '', allow_range=True, allow_zero=True, allow_private=True)
|
||||||
|
f = PortOption('f', '', allow_range=True, allow_private=True)
|
||||||
|
od = OptionDescription('od', '', [a, b, c, d, e, f])
|
||||||
|
c = Config(od)
|
||||||
|
api = getapi(c)
|
||||||
|
raises(ValueError, "api.option('a').value.set(0)")
|
||||||
|
api.option('a').value.set(1)
|
||||||
|
api.option('a').value.set(1023)
|
||||||
|
api.option('a').value.set(1024)
|
||||||
|
api.option('a').value.set(49151)
|
||||||
|
raises(ValueError, "api.option('a').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('a').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('a').value.set(65536)")
|
||||||
|
api.option('a').value.set('1:49151')
|
||||||
|
raises(ValueError, "api.option('a').value.set('0:49151')")
|
||||||
|
raises(ValueError, "api.option('a').value.set('1:49152')")
|
||||||
|
|
||||||
|
api.option('b').value.set(0)
|
||||||
|
api.option('b').value.set(1)
|
||||||
|
api.option('b').value.set(1023)
|
||||||
|
api.option('b').value.set(1024)
|
||||||
|
api.option('b').value.set(49151)
|
||||||
|
raises(ValueError, "api.option('b').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('b').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('b').value.set(65536)")
|
||||||
|
api.option('b').value.set('0:49151')
|
||||||
|
raises(ValueError, "api.option('b').value.set('0:49152')")
|
||||||
|
|
||||||
|
api.option('c').value.set(0)
|
||||||
|
api.option('c').value.set(1)
|
||||||
|
api.option('c').value.set(1023)
|
||||||
|
raises(ValueError, "api.option('c').value.set(1024)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(49151)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('c').value.set(65536)")
|
||||||
|
api.option('c').value.set('0:1023')
|
||||||
|
raises(ValueError, "api.option('c').value.set('0:1024')")
|
||||||
|
|
||||||
|
api.option('d').value.set(0)
|
||||||
|
raises(ValueError, "api.option('d').value.set(1)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(1023)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(1024)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(49151)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(49152)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(65535)")
|
||||||
|
raises(ValueError, "api.option('d').value.set(65536)")
|
||||||
|
raises(ValueError, "api.option('d').value.set('0:0')")
|
||||||
|
raises(ValueError, "api.option('d').value.set('0:1')")
|
||||||
|
|
||||||
|
api.option('e').value.set(0)
|
||||||
|
api.option('e').value.set(1)
|
||||||
|
api.option('e').value.set(1023)
|
||||||
|
api.option('e').value.set(1024)
|
||||||
|
api.option('e').value.set(49151)
|
||||||
|
api.option('e').value.set(49152)
|
||||||
|
api.option('e').value.set(65535)
|
||||||
|
api.option('e').value.set('0:65535')
|
||||||
|
raises(ValueError, "api.option('e').value.set('0:65536')")
|
||||||
|
|
||||||
|
raises(ValueError, "api.option('f').value.set(0)")
|
||||||
|
api.option('f').value.set(1)
|
||||||
|
api.option('f').value.set(1023)
|
||||||
|
api.option('f').value.set(1024)
|
||||||
|
api.option('f').value.set(49151)
|
||||||
|
api.option('f').value.set(49152)
|
||||||
|
api.option('f').value.set(65535)
|
||||||
|
raises(ValueError, "api.option('f').value.set(65536)")
|
||||||
|
api.option('f').value.set('1:65535')
|
||||||
|
api.option('f').value.set('3:4')
|
||||||
|
raises(ValueError, "api.option('f').value.set('0:65535')")
|
||||||
|
raises(ValueError, "api.option('f').value.set('4:3')")
|
|
@ -0,0 +1,1368 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from tiramisu.setting import groups, owners
|
||||||
|
from tiramisu import BoolOption, StrOption, ChoiceOption, IPOption, \
|
||||||
|
NetworkOption, NetmaskOption, IntOption, FloatOption, \
|
||||||
|
UnicodeOption, PortOption, BroadcastOption, DomainnameOption, \
|
||||||
|
EmailOption, URLOption, UsernameOption, FilenameOption, SymLinkOption, \
|
||||||
|
OptionDescription, DynOptionDescription, DynSymLinkOption, submulti, MasterSlaves, \
|
||||||
|
Config, getapi
|
||||||
|
from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError
|
||||||
|
from tiramisu.storage import delete_session
|
||||||
|
#from .test_state import _diff_opts, _diff_conf
|
||||||
|
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
|
||||||
|
def return_true(value, param=None, suffix=None):
|
||||||
|
if value == 'val' and param in [None, 'yes']:
|
||||||
|
return
|
||||||
|
raise ValueError('no value')
|
||||||
|
|
||||||
|
|
||||||
|
def return_dynval(value='val', suffix=None):
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def return_list2(suffix):
|
||||||
|
return [str(suffix), 'val2']
|
||||||
|
|
||||||
|
|
||||||
|
def return_list(val=None, suffix=None):
|
||||||
|
if val:
|
||||||
|
return val
|
||||||
|
else:
|
||||||
|
return ['val1', 'val2']
|
||||||
|
|
||||||
|
|
||||||
|
def return_same_list():
|
||||||
|
return ['val1', 'val1']
|
||||||
|
|
||||||
|
|
||||||
|
def return_wrong_list():
|
||||||
|
return ['---', ' ']
|
||||||
|
|
||||||
|
|
||||||
|
def return_raise():
|
||||||
|
raise Exception('error')
|
||||||
|
|
||||||
|
|
||||||
|
#def test_build_dyndescription():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# assert str(cfg) == """[dodval1]
|
||||||
|
#[dodval2]"""
|
||||||
|
# assert str(cfg.dodval1) == "stval1 = 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():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# assert str(cfg) == "[od]"
|
||||||
|
# assert str(cfg.od) == """[dodval1]
|
||||||
|
#[dodval2]"""
|
||||||
|
# assert str(cfg.od.dodval1) == "stval1 = None"
|
||||||
|
# assert str(cfg.od.dodval2) == "stval2 = None"
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_unknown_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
raises(AttributeError, "api.option('od.dodval3').value.get()")
|
||||||
|
raises(AttributeError, "api.option('od.dodval1.novalue').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_getdoc_dyndescription():
|
||||||
|
# st = StrOption('st', 'doc1')
|
||||||
|
# dod = DynOptionDescription('dod', 'doc2', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# stval1 = cfg.unwrap_from_path('od.dodval1.stval1')
|
||||||
|
# stval2 = cfg.unwrap_from_path('od.dodval2.stval2')
|
||||||
|
# dodval1 = cfg.unwrap_from_path('od.dodval1')
|
||||||
|
# dodval2 = cfg.unwrap_from_path('od.dodval2')
|
||||||
|
# assert stval1.impl_getname() == 'stval1'
|
||||||
|
# assert stval2.impl_getname() == 'stval2'
|
||||||
|
# assert dodval1.impl_getname() == 'dodval1'
|
||||||
|
# assert dodval2.impl_getname() == 'dodval2'
|
||||||
|
# assert stval1.impl_getdoc() == 'doc1'
|
||||||
|
# assert stval2.impl_getdoc() == 'doc1'
|
||||||
|
# assert dodval1.impl_getdoc() == 'doc2'
|
||||||
|
# assert dodval2.impl_getdoc() == 'doc2'
|
||||||
|
|
||||||
|
|
||||||
|
#def test_getpaths_dyndescription():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# assert cfg.cfgimpl_get_description().impl_getpaths() == ['od.dodval1.stval1', 'od.dodval2.stval2']
|
||||||
|
# assert cfg.cfgimpl_get_description().impl_getpaths(include_groups=True) == ['od', 'od.dodval1', 'od.dodval1.stval1', 'od.dodval2', 'od.dodval2.stval2']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mod_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
#
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'yes'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
#
|
||||||
|
api.option('od.dodval2.stval2').value.set('no')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'yes'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'no'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.get() == owner
|
||||||
|
|
||||||
|
|
||||||
|
def test_del_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_multi_dyndescription():
|
||||||
|
st = StrOption('st', '', multi=True)
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == []
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == []
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == []
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval2.stval2').value.set(['no'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == ['no']
|
||||||
|
#assert cfg.getowner(st) == owners.default
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.get() == owner
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes', 'yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes', 'yes']
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
|
||||||
|
|
||||||
|
def test_prop_dyndescription():
|
||||||
|
st = StrOption('st', '', properties=('test',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set(['test'])
|
||||||
|
assert set(api.option('od.dodval2.stval2').property.get()) == set(['test'])
|
||||||
|
api.option('od.dodval2.stval2').property.add('test2')
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set(['test'])
|
||||||
|
assert set(api.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
|
||||||
|
api.option('od.dodval1.stval1').property.pop('test')
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set([])
|
||||||
|
#
|
||||||
|
assert set(api.option('od.dodval1').property.get()) == set([])
|
||||||
|
assert set(api.option('od.dodval2').property.get()) == set([])
|
||||||
|
api.option('od.dodval1').property.add('test1')
|
||||||
|
assert set(api.option('od.dodval1').property.get()) == set(['test1'])
|
||||||
|
assert set(api.option('od.dodval2').property.get()) == set([])
|
||||||
|
api.option('od.dodval1').property.pop('test1')
|
||||||
|
assert set(api.option('od.dodval1').property.get()) == set([])
|
||||||
|
assert set(api.option('od.dodval2').property.get()) == set([])
|
||||||
|
|
||||||
|
|
||||||
|
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():
|
||||||
|
st = StrOption('st', '', callback=return_dynval)
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set('val2')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val2'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_callback_list_dyndescription():
|
||||||
|
st = StrOption('st', '', callback=return_list2, multi=True)
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['val1', 'val2']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == ['val2', 'val2']
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set(['val3', 'val2'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['val3', 'val2']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == ['val2', 'val2']
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_dyndescription():
|
||||||
|
st = StrOption('st', '', properties=('mandatory',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval1.stval1').value.get()")
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval2.stval2').value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('od.dodval1.stval1').value.set('val')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval2.stval2').value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval1.stval1').value.get()")
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['od.dodval1.stval1', 'od.dodval2.stval2']
|
||||||
|
|
||||||
|
|
||||||
|
#def test_build_dyndescription_context():
|
||||||
|
# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
# od = OptionDescription('od', '', [dod, val1])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# cfg._impl_test = True
|
||||||
|
# assert str(cfg) == """[dodval1]
|
||||||
|
#[dodval2]
|
||||||
|
#val1 = ['val1', 'val2']"""
|
||||||
|
# assert str(cfg.dodval1) == "stval1 = None"
|
||||||
|
# assert str(cfg.dodval2) == "stval2 = None"
|
||||||
|
# cfg.unwrap_from_path('dodval2')
|
||||||
|
|
||||||
|
|
||||||
|
#def test_subpath_dyndescription_context():
|
||||||
|
# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
# od = OptionDescription('od', '', [dod, val1])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# assert str(cfg) == "[od]"
|
||||||
|
# assert str(cfg.od) == """[dodval1]
|
||||||
|
#[dodval2]
|
||||||
|
#val1 = ['val1', 'val2']"""
|
||||||
|
# assert str(cfg.od.dodval1) == "stval1 = None"
|
||||||
|
# assert str(cfg.od.dodval2) == "stval2 = None"
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
raises(AttributeError, "api.option('od.dodval3').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_mod_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'yes'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval2.stval2').value.set('no')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'yes'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'no'
|
||||||
|
#assert cfg.getowner(st) == owners.default
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.get() == owner
|
||||||
|
|
||||||
|
|
||||||
|
def test_del_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_multi_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', multi=True)
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == []
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == []
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == []
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval2.stval2').value.set(['no'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == ['no']
|
||||||
|
#assert cfg.getowner(st) == owners.default
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.get() == owner
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes', 'yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes', 'yes']
|
||||||
|
api.option('od.dodval1.stval1').value.set(['yes'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == ['yes']
|
||||||
|
|
||||||
|
|
||||||
|
def test_prop_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', properties=('test',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set(['test'])
|
||||||
|
assert set(api.option('od.dodval2.stval2').property.get()) == set(['test'])
|
||||||
|
api.option('od.dodval2.stval2').property.add('test2')
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set(['test'])
|
||||||
|
assert set(api.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
|
||||||
|
api.option('od.dodval1.stval1').property.pop('test')
|
||||||
|
assert set(api.option('od.dodval1.stval1').property.get()) == set([])
|
||||||
|
assert set(api.option('od.dodval2.stval2').property.get()) == set(['test', 'test2'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_callback_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', callback=return_dynval)
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.set('val2')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val2'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.get() == owner
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'val'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.isdefault()
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', properties=('mandatory',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval1.stval1').value.get()")
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval2.stval2').value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('od.dodval1.stval1').value.set('val')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval2.stval2').value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('od.dodval1.stval1').value.reset()
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('od.dodval1.stval1').value.get()")
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['od.dodval1.stval1', 'od.dodval2.stval2']
|
||||||
|
|
||||||
|
|
||||||
|
def test_increase_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', properties=('mandatory',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.property.read_write()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
raises(AttributeError, "api.option('od.dodval3').value.get()")
|
||||||
|
api.option('od.val1').value.set(['val1', 'val2', 'val3'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('od.dodval3.stval3').value.get() is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_decrease_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', properties=('mandatory',))
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list, callback_params={'': ((val1, False),)})
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
owner = api.owner.get()
|
||||||
|
api.property.read_write()
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
api.option('od.dodval2.stval2').value.set('yes')
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('od.dodval2.stval2').value.get() == 'yes'
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
assert api.option('od.dodval2.stval2').owner.get() == owner
|
||||||
|
raises(AttributeError, "api.option('od.dodval3').value.get()")
|
||||||
|
api.option('od.val1').value.set(['val1'])
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
raises(AttributeError, "api.option('od.dodval2').value.get()")
|
||||||
|
raises(AttributeError, "api.option('od.dodval3').value.get()")
|
||||||
|
assert api.option('od.dodval1.stval1').owner.isdefault()
|
||||||
|
#FIXME
|
||||||
|
# raises(AttributeError, "cfg.getowner(stval2)")
|
||||||
|
raises(AttributeError, "api.option('od.dodval2.stval2').value.get()")
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_requires_dyndescription():
|
||||||
|
# boolean = BoolOption('boolean', '', True)
|
||||||
|
# st = StrOption('st', '', requires=[{'option': boolean, 'expected': False,
|
||||||
|
# 'action': 'disabled'}])
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# od2 = OptionDescription('od', '', [od, boolean])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# api.property.read_write()
|
||||||
|
# assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
# assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
# #
|
||||||
|
# cfg.boolean = False
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval1.stval1
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval2.stval2
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# #
|
||||||
|
# cfg.boolean = True
|
||||||
|
# assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
# assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
# #transitive
|
||||||
|
# cfg.cfgimpl_get_settings()[boolean].append('disabled')
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval1.stval1
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval2.stval2
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
|
||||||
|
|
||||||
|
#def test_requires_dyndescription2():
|
||||||
|
# boolean = BoolOption('boolean', '', True)
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list,
|
||||||
|
# requires=[{'option': boolean, 'expected': False,
|
||||||
|
# 'action': 'disabled'}])
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# od2 = OptionDescription('od', '', [od, boolean])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# api.property.read_write()
|
||||||
|
# assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
# assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
# #
|
||||||
|
# cfg.boolean = False
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval1.stval1
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval2.stval2
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# #
|
||||||
|
# cfg.boolean = True
|
||||||
|
# assert api.option('od.dodval1.stval1').value.get() is None
|
||||||
|
# assert api.option('od.dodval2.stval2').value.get() is None
|
||||||
|
# #transitive
|
||||||
|
# cfg.cfgimpl_get_settings()[boolean].append('disabled')
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval1.stval1
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
# props = []
|
||||||
|
# try:
|
||||||
|
# cfg.od.dodval2.stval2
|
||||||
|
# except PropertiesOptionError as err:
|
||||||
|
# props = err.proptype
|
||||||
|
# assert props == ['disabled']
|
||||||
|
#
|
||||||
|
#
|
||||||
|
def test_validator_dyndescription():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
assert api.option('od.dodval1.stval1').value.get() == 'val'
|
||||||
|
raises(ValueError, "api.option('od.dodval1.stval1').value.set('no')")
|
||||||
|
api.option('od.dodval1.stval1').value.set('val')
|
||||||
|
|
||||||
|
|
||||||
|
def test_makedict_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option.make_dict() == {'od.val1': ['val1', 'val2'], 'od.dodval1.stval1': 'yes', 'od.dodval2.stval2': None}
|
||||||
|
assert api.option.make_dict(flatten=True) == {'val1': ['val1', 'val2'], 'stval1': 'yes', 'stval2': None}
|
||||||
|
assert api.option.make_dict(withoption='stval1') == {'od.dodval1.stval1': 'yes'}
|
||||||
|
assert api.option('od').make_dict(withoption='stval1') == {'dodval1.stval1': 'yes'}
|
||||||
|
assert api.option('od.dodval1').make_dict(withoption='stval1') == {'stval1': 'yes'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_find_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
assert api.option.find_first('stval1', type='value') == "yes"
|
||||||
|
assert isinstance(api.option.find_first('stval1', type='option'), DynSymLinkOption)
|
||||||
|
#assert api.option.find(bytype=StrOption, type='path') == ['od.dodval1.stval1', 'od.dodval2.stval2', 'od.val1']
|
||||||
|
#opts = api.option.find(byvalue='yes')
|
||||||
|
#assert len(opts) == 1
|
||||||
|
#assert isinstance(opts[0], DynSymLinkOption)
|
||||||
|
#assert opts[0].impl_getname() == 'stval1'
|
||||||
|
raises(AttributeError, "api.option.find('strnotexists')")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_iter_all_dyndescription_context():
|
||||||
|
# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod, val1])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# for it in cfg.iter_all():
|
||||||
|
# assert it[0] == 'od'
|
||||||
|
# assert str(it[1]) == str(cfg.od)
|
||||||
|
# #
|
||||||
|
# list_od = []
|
||||||
|
# for it in cfg.od.iter_all():
|
||||||
|
# list_od.append(it[0])
|
||||||
|
# assert list_od == ['dodval1', 'dodval2', 'val1']
|
||||||
|
# #
|
||||||
|
# list_od = []
|
||||||
|
# for it in cfg.od.dodval1:
|
||||||
|
# list_od.append(it[0])
|
||||||
|
# assert list_od == ['stval1']
|
||||||
|
|
||||||
|
|
||||||
|
def test_information_dyndescription_context():
|
||||||
|
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, val1])
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
dod.impl_set_information('testod', 'val1')
|
||||||
|
st.impl_set_information('testst', 'val2')
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
api.information.set('testcfgod', 'val3')
|
||||||
|
assert api.option('od.dodval1').information.get('testod') == 'val1'
|
||||||
|
assert api.option('od.dodval2').information.get('testod') == 'val1'
|
||||||
|
assert api.option('od.dodval1.stval1').information.get('testst') == 'val2'
|
||||||
|
assert api.option('od.dodval2.stval2').information.get('testst') == 'val2'
|
||||||
|
assert api.information.get('testcfgod') == 'val3'
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_consistency_dyndescription():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# st2 = StrOption('st2', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st, st2], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# st.impl_add_consistency('not_equal', st2)
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# api.option('od.dodval1.stval1').value.set('yes')
|
||||||
|
# raises(ValueError, "cfg.od.dodval1.st2val1 = 'yes'")
|
||||||
|
# api.option('od.dodval2.stval2').value.set('yes')
|
||||||
|
# raises(ValueError, "cfg.od.dodval2.st2val2 = 'yes'")
|
||||||
|
# raises(ValueError, "cfg.od.dodval1.st2val1 = 'yes'")
|
||||||
|
# del(cfg.od.dodval2.stval2)
|
||||||
|
# raises(ValueError, "cfg.od.dodval1.st2val1 = 'yes'")
|
||||||
|
# cfg.od.dodval2.st2val2 = 'yes'
|
||||||
|
# raises(ValueError, "api.option('od.dodval2.stval2').value.set('yes')")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_dyndescription_default():
|
||||||
|
st = StrOption('st', '', 'yes')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st, st2], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
st.impl_add_consistency('not_equal', st2)
|
||||||
|
od2 = OptionDescription('od', '', [od])
|
||||||
|
api = getapi(Config(od2))
|
||||||
|
print('===>', api.option('od.dodval1.st2val1').value.get())
|
||||||
|
raises(ValueError, "api.option('od.dodval1.st2val1').value.get()")
|
||||||
|
raises(ValueError, "api.option('od.dodval2.st2val2').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_dyndescription_default_multi2():
|
||||||
|
st = StrOption('st', '', ['yes'], multi=True)
|
||||||
|
st2 = StrOption('st2', '', ['yes'], multi=True)
|
||||||
|
dod = DynOptionDescription('dod', '', [st, st2], callback=return_list)
|
||||||
|
dod
|
||||||
|
raises(ValueError, "st.impl_add_consistency('not_equal', st2)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_only_one_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
DynOptionDescription('dod', '', [st2], callback=return_list)
|
||||||
|
raises(ConfigError, "st.impl_add_consistency('not_equal', st2)")
|
||||||
|
raises(ConfigError, "st2.impl_add_consistency('not_equal', st)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_became_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
st2.impl_add_consistency('not_equal', st)
|
||||||
|
od = DynOptionDescription('dod', '', [st2], callback=return_list)
|
||||||
|
od2 = OptionDescription('od', '', [od, st])
|
||||||
|
od2
|
||||||
|
raises(ConfigError, "c = Config(od2)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_became_dyndescription2():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
st.impl_add_consistency('not_equal', st2)
|
||||||
|
od = DynOptionDescription('dod', '', [st2], callback=return_list)
|
||||||
|
od2 = OptionDescription('od', '', [od, st])
|
||||||
|
od2
|
||||||
|
raises(ConfigError, "c = Config(od2)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_external_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st1 = StrOption('st1', '')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st1, st2], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, st])
|
||||||
|
od
|
||||||
|
raises(ConfigError, "st.impl_add_consistency('not_equal', st2)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_consistency_notsame_dyndescription():
|
||||||
|
st1 = StrOption('st1', '')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st1, st2], callback=return_list)
|
||||||
|
tst1 = StrOption('tst1', '')
|
||||||
|
tst2 = StrOption('tst2', '')
|
||||||
|
tdod = DynOptionDescription('tdod', '', [tst1, tst2], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod, tdod])
|
||||||
|
od
|
||||||
|
raises(ConfigError, "st1.impl_add_consistency('not_equal', tst1)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_all_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
ip = IPOption('ip', '')
|
||||||
|
network = NetworkOption('network', '')
|
||||||
|
netmask = NetmaskOption('netmask', '')
|
||||||
|
ch = ChoiceOption('ch', '', ('val1', 'val2', 'val3'))
|
||||||
|
ch1 = ChoiceOption('ch1', '', return_list)
|
||||||
|
boo = BoolOption('boo', '')
|
||||||
|
intr = IntOption('intr', '')
|
||||||
|
floa = FloatOption('floa', '')
|
||||||
|
uni = UnicodeOption('uni', '')
|
||||||
|
port = PortOption('port', '')
|
||||||
|
broad = BroadcastOption('broad', '')
|
||||||
|
domain = DomainnameOption('domain', '')
|
||||||
|
email = EmailOption('email', '')
|
||||||
|
url = URLOption('url', '')
|
||||||
|
username = UsernameOption('username', '')
|
||||||
|
filename = FilenameOption('filename', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st, ip, network, netmask, ch, ch1,
|
||||||
|
boo, intr, floa, uni, port, broad,
|
||||||
|
domain, email, url, username,
|
||||||
|
filename], callback=return_list)
|
||||||
|
od = OptionDescription('od', '', [dod])
|
||||||
|
api = getapi(Config(od))
|
||||||
|
assert api.option('dodval1.stval1').value.get() is None
|
||||||
|
assert api.option('dodval1.ipval1').value.get() is None
|
||||||
|
assert api.option('dodval1.networkval1').value.get() is None
|
||||||
|
assert api.option('dodval1.netmaskval1').value.get() is None
|
||||||
|
assert api.option('dodval1.chval1').value.get() is None
|
||||||
|
assert api.option('dodval1.ch1val1').value.get() is None
|
||||||
|
assert api.option('dodval1.booval1').value.get() is None
|
||||||
|
assert api.option('dodval1.intrval1').value.get() is None
|
||||||
|
assert api.option('dodval1.floaval1').value.get() is None
|
||||||
|
assert api.option('dodval1.unival1').value.get() is None
|
||||||
|
assert api.option('dodval1.portval1').value.get() is None
|
||||||
|
assert api.option('dodval1.broadval1').value.get() is None
|
||||||
|
assert api.option('dodval1.domainval1').value.get() is None
|
||||||
|
assert api.option('dodval1.emailval1').value.get() is None
|
||||||
|
assert api.option('dodval1.urlval1').value.get() is None
|
||||||
|
assert api.option('dodval1.usernameval1').value.get() is None
|
||||||
|
assert api.option('dodval1.filenameval1').value.get() is None
|
||||||
|
#
|
||||||
|
api.option('dodval1.stval1').value.set("no")
|
||||||
|
api.option('dodval1.ipval1').value.set("1.1.1.1")
|
||||||
|
api.option('dodval1.networkval1').value.set("1.1.1.0")
|
||||||
|
api.option('dodval1.netmaskval1').value.set("255.255.255.0")
|
||||||
|
api.option('dodval1.chval1').value.set("val1")
|
||||||
|
api.option('dodval1.ch1val1').value.set("val2")
|
||||||
|
api.option('dodval1.booval1').value.set(True)
|
||||||
|
api.option('dodval1.intrval1').value.set(1)
|
||||||
|
api.option('dodval1.floaval1').value.set(0.1)
|
||||||
|
api.option('dodval1.unival1').value.set("no")
|
||||||
|
api.option('dodval1.portval1').value.set(80)
|
||||||
|
api.option('dodval1.broadval1').value.set("1.1.1.255")
|
||||||
|
api.option('dodval1.domainval1').value.set("test.com")
|
||||||
|
api.option('dodval1.emailval1').value.set("test@test.com")
|
||||||
|
api.option('dodval1.urlval1').value.set("http://test.com")
|
||||||
|
api.option('dodval1.usernameval1').value.set("user1")
|
||||||
|
api.option('dodval1.filenameval1').value.set("/tmp")
|
||||||
|
assert api.option('dodval1.stval1').value.get() == "no"
|
||||||
|
assert api.option('dodval1.ipval1').value.get() == "1.1.1.1"
|
||||||
|
assert api.option('dodval1.networkval1').value.get() == "1.1.1.0"
|
||||||
|
assert api.option('dodval1.netmaskval1').value.get() == "255.255.255.0"
|
||||||
|
assert api.option('dodval1.chval1').value.get() == "val1"
|
||||||
|
assert api.option('dodval1.ch1val1').value.get() == "val2"
|
||||||
|
assert api.option('dodval1.booval1').value.get() is True
|
||||||
|
assert api.option('dodval1.intrval1').value.get() == 1
|
||||||
|
assert api.option('dodval1.floaval1').value.get() == 0.1
|
||||||
|
assert api.option('dodval1.unival1').value.get() == u"no"
|
||||||
|
assert api.option('dodval1.portval1').value.get() == 80
|
||||||
|
assert api.option('dodval1.broadval1').value.get() == "1.1.1.255"
|
||||||
|
assert api.option('dodval1.domainval1').value.get() == "test.com"
|
||||||
|
assert api.option('dodval1.emailval1').value.get() == "test@test.com"
|
||||||
|
assert api.option('dodval1.urlval1').value.get() == "http://test.com"
|
||||||
|
assert api.option('dodval1.usernameval1').value.get() == "user1"
|
||||||
|
assert api.option('dodval1.filenameval1').value.get() == "/tmp"
|
||||||
|
assert api.option('dodval2.stval2').value.get() is None
|
||||||
|
assert api.option('dodval2.ipval2').value.get() is None
|
||||||
|
assert api.option('dodval2.networkval2').value.get() is None
|
||||||
|
assert api.option('dodval2.netmaskval2').value.get() is None
|
||||||
|
assert api.option('dodval2.chval2').value.get() is None
|
||||||
|
assert api.option('dodval2.ch1val2').value.get() is None
|
||||||
|
assert api.option('dodval2.booval2').value.get() is None
|
||||||
|
assert api.option('dodval2.intrval2').value.get() is None
|
||||||
|
assert api.option('dodval2.floaval2').value.get() is None
|
||||||
|
assert api.option('dodval2.unival2').value.get() is None
|
||||||
|
assert api.option('dodval2.portval2').value.get() is None
|
||||||
|
assert api.option('dodval2.broadval2').value.get() is None
|
||||||
|
assert api.option('dodval2.domainval2').value.get() is None
|
||||||
|
assert api.option('dodval2.emailval2').value.get() is None
|
||||||
|
assert api.option('dodval2.urlval2').value.get() is None
|
||||||
|
assert api.option('dodval2.usernameval2').value.get() is None
|
||||||
|
assert api.option('dodval2.filenameval2').value.get() is None
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_consistency_ip_netmask_dyndescription():
|
||||||
|
# a = IPOption('a', '')
|
||||||
|
# b = NetmaskOption('b', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [a, b], callback=return_list)
|
||||||
|
# b.impl_add_consistency('ip_netmask', a)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# c = Config(od)
|
||||||
|
# c.dodval1.aval1 = '192.168.1.1'
|
||||||
|
# c.dodval1.bval1 = '255.255.255.0'
|
||||||
|
# c.dodval2.aval2 = '192.168.1.2'
|
||||||
|
# c.dodval2.bval2 = '255.255.255.255'
|
||||||
|
## c.dodval2.bval2 = '255.255.255.0'
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_consistency_ip_in_network_dyndescription():
|
||||||
|
# a = NetworkOption('a', '')
|
||||||
|
# b = NetmaskOption('b', '')
|
||||||
|
# c = IPOption('c', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [a, b, c], callback=return_list)
|
||||||
|
# c.impl_add_consistency('in_network', a, b)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# cfg.dodval1.aval1 = '192.168.1.0'
|
||||||
|
# cfg.dodval1.bval1 = '255.255.255.0'
|
||||||
|
# cfg.dodval1.cval1 = '192.168.1.1'
|
||||||
|
|
||||||
|
|
||||||
|
#def test_masterslaves_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True)
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# print('--------------- 1')
|
||||||
|
# owner = api.owner.get()
|
||||||
|
# print('--------------- 2')
|
||||||
|
# st1val1 = cfg.unwrap_from_path('od.stval1.st1val1.st1val1')
|
||||||
|
# print('--------------- 3')
|
||||||
|
# st2val1 = cfg.unwrap_from_path('od.stval1.st1val1.st2val1')
|
||||||
|
# print('--------------- 4')
|
||||||
|
# st1val2 = cfg.unwrap_from_path('od.stval2.st1val2.st1val2')
|
||||||
|
# print('--------------- 5')
|
||||||
|
# st2val2 = cfg.unwrap_from_path('od.stval2.st1val2.st2val2')
|
||||||
|
# print('--------------- 6')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []}
|
||||||
|
# print('--------------- 7')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# print('--------------- 8')
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# print('--------------- 9')
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# print('--------------- 10')
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# print('--------------- 11')
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# print('--------------- 12')
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# print('--------------- 13')
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# print('--------------- 14')
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# print('--------------- 15')
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# print('--------------- 16')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']}
|
||||||
|
# print('--------------- 17')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# print('--------------- 18')
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == [None]
|
||||||
|
# print('--------------- 19')
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# print('--------------- 20')
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# print('--------------- 21')
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# print('--------------- 22')
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# print('--------------- 23')
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# print('--------------- 24')
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# print('--------------- 25')
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == [None]
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['no']
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['no']
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
## assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.pop(0)
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
## assert cfg.getowner(st2val1) == owner
|
||||||
|
## assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['yes']
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
# del(cfg.od.stval1.st1val1.st2val1)
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
## assert cfg.getowner(st2val1) == owners.default
|
||||||
|
## assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['yes']
|
||||||
|
# del(cfg.od.stval1.st1val1.st1val1)
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_default_multi_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True, default_multi='no')
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# owner = api.owner.get()
|
||||||
|
# st1val1 = cfg.unwrap_from_path('od.stval1.st1val1.st1val1')
|
||||||
|
# st2val1 = cfg.unwrap_from_path('od.stval1.st1val1.st2val1')
|
||||||
|
# st1val2 = cfg.unwrap_from_path('od.stval2.st1val2.st1val2')
|
||||||
|
# st2val2 = cfg.unwrap_from_path('od.stval2.st1val2.st2val2')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['no']
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_submulti_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=submulti)
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# owner = api.owner.get()
|
||||||
|
# st1val1 = cfg.unwrap_from_path('od.stval1.st1val1.st1val1')
|
||||||
|
# st2val1 = cfg.unwrap_from_path('od.stval1.st1val1.st2val1')
|
||||||
|
# st1val2 = cfg.unwrap_from_path('od.stval2.st1val2.st1val2')
|
||||||
|
# st2val2 = cfg.unwrap_from_path('od.stval2.st1val2.st2val2')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == [[]]
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st2val1[0].append('no')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == [['no']]
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
|
||||||
|
|
||||||
|
#def test_masterslaves_consistency_ip_dyndescription():
|
||||||
|
# a = NetworkOption('net', '', multi=True)
|
||||||
|
# b = NetmaskOption('mask', '', multi=True)
|
||||||
|
# c = BroadcastOption('broad', '', multi=True)
|
||||||
|
# b.impl_add_consistency('network_netmask', a)
|
||||||
|
# c.impl_add_consistency('broadcast', a, b)
|
||||||
|
# dod = DynOptionDescription('net', '', [a, b, c], callback=return_list)
|
||||||
|
# dod.impl_set_group_type(groups.master)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# cfg.netval1.netval1 = ['192.168.1.0']
|
||||||
|
# cfg.netval1.maskval1 = ['255.255.255.0']
|
||||||
|
# cfg.netval1.broadval1 = ['192.168.1.255']
|
||||||
|
#
|
||||||
|
# cfg.netval1.netval1 = ['192.168.1.0', '192.168.2.128']
|
||||||
|
# cfg.netval1.maskval1 = ['255.255.255.0', '255.255.255.128']
|
||||||
|
# cfg.netval1.broadval1 = ['192.168.1.255', '192.168.2.255']
|
||||||
|
# cfg.netval1.broadval1[1] = '192.168.2.255'
|
||||||
|
# #
|
||||||
|
# assert cfg.netval1.netval1 == ['192.168.1.0', '192.168.2.128']
|
||||||
|
# assert cfg.netval1.maskval1 == ['255.255.255.0', '255.255.255.128']
|
||||||
|
# assert cfg.netval1.broadval1 == ['192.168.1.255', '192.168.2.255']
|
||||||
|
# assert cfg.netval2.netval2 == []
|
||||||
|
# assert cfg.netval2.maskval2 == []
|
||||||
|
# assert cfg.netval2.broadval2 == []
|
||||||
|
|
||||||
|
|
||||||
|
#def test_masterslaves_consistency_ip_dyndescription_propertyerror():
|
||||||
|
# a = NetworkOption('net', '', multi=True)
|
||||||
|
# b = NetmaskOption('mask', '', multi=True, properties=('mandatory',))
|
||||||
|
# c = BroadcastOption('broad', '', multi=True)
|
||||||
|
# b.impl_add_consistency('network_netmask', a)
|
||||||
|
# c.impl_add_consistency('broadcast', a, b)
|
||||||
|
# dod = DynOptionDescription('net', '', [a, b, c], callback=return_list)
|
||||||
|
# dod.impl_set_group_type(groups.master)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# api.property.read_write()
|
||||||
|
# cfg.netval1.netval1 = ['192.168.1.0']
|
||||||
|
# api.property.read_only()
|
||||||
|
# raises(PropertiesOptionError, "cfg.netval1.netval1")
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_callback_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True, callback=return_dynval, callback_params={'value': ((st1, False),)})
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# owner = api.owner.get()
|
||||||
|
# st1val1 = cfg.unwrap_from_path('od.stval1.st1val1.st1val1')
|
||||||
|
# st2val1 = cfg.unwrap_from_path('od.stval1.st1val1.st2val1')
|
||||||
|
# st1val2 = cfg.unwrap_from_path('od.stval2.st1val2.st1val2')
|
||||||
|
# st2val2 = cfg.unwrap_from_path('od.stval2.st1val2.st2val2')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []}
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st2val1': ['yes'], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']}
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['yes']
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['no']
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['no']
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
## assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.pop(0)
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
## assert cfg.getowner(st2val1) == owner
|
||||||
|
## assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['yes']
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
# del(cfg.od.stval1.st1val1.st2val1)
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = ['yes']
|
||||||
|
# del(cfg.od.stval1.st1val1.st1val1)
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st2val1 = []
|
||||||
|
# cfg.od.stval1.st1val1.st1val1 = ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['yes']
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_callback_value_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True, callback=return_dynval, callback_params={'value': ('val',)})
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1[0] == 'val'
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['val']
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_callback_nomulti_dyndescription():
|
||||||
|
# v1 = StrOption('v1', '', "val")
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True, callback=return_dynval, callback_params={'': ((v1, False),)})
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od, v1])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == ['yes']
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == ['val']
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_masterslaves_callback_samegroup_dyndescription():
|
||||||
|
# st1 = StrOption('st1', "", multi=True)
|
||||||
|
# st2 = StrOption('st2', "", multi=True)
|
||||||
|
# st3 = StrOption('st3', "", multi=True, callback=return_dynval, callback_params={'': ((st2, False),)})
|
||||||
|
# stm = MasterSlaves('st1', '', [st1, st2, st3])
|
||||||
|
# #stm.impl_set_group_type(groups.master)
|
||||||
|
# st = DynOptionDescription('st', '', [stm], callback=return_list)
|
||||||
|
# od = OptionDescription('od', '', [st])
|
||||||
|
# od2 = OptionDescription('od', '', [od])
|
||||||
|
# api = getapi(Config(od2))
|
||||||
|
# owner = api.owner.get()
|
||||||
|
# st1val1 = cfg.unwrap_from_path('od.stval1.st1val1.st1val1')
|
||||||
|
# st2val1 = cfg.unwrap_from_path('od.stval1.st1val1.st2val1')
|
||||||
|
# st3val1 = cfg.unwrap_from_path('od.stval1.st1val1.st3val1')
|
||||||
|
# st1val2 = cfg.unwrap_from_path('od.stval2.st1val2.st1val2')
|
||||||
|
# st2val2 = cfg.unwrap_from_path('od.stval2.st1val2.st2val2')
|
||||||
|
# st3val2 = cfg.unwrap_from_path('od.stval2.st1val2.st3val2')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st1val1': [],
|
||||||
|
# 'od.stval1.st1val1.st2val1': [],
|
||||||
|
# 'od.stval1.st1val1.st3val1': [],
|
||||||
|
# 'od.stval2.st1val2.st1val2': [],
|
||||||
|
# 'od.stval2.st1val2.st2val2': [],
|
||||||
|
# 'od.stval2.st1val2.st3val2': []}
|
||||||
|
# assert cfg.od.stval1.st1val1.st1val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st2val1 == []
|
||||||
|
# assert cfg.od.stval1.st1val1.st3val1 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st1val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st2val2 == []
|
||||||
|
# assert cfg.od.stval2.st1val2.st3val2 == []
|
||||||
|
# assert cfg.getowner(st1val1) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# assert cfg.getowner(st3val1) == owners.default
|
||||||
|
# assert cfg.getowner(st3val2) == owners.default
|
||||||
|
# ##
|
||||||
|
# cfg.od.stval1.st1val1.st1val1.append('yes')
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st1val1': ['yes'],
|
||||||
|
# 'od.stval1.st1val1.st2val1': [None],
|
||||||
|
# 'od.stval1.st1val1.st3val1': [None],
|
||||||
|
# 'od.stval2.st1val2.st1val2': [],
|
||||||
|
# 'od.stval2.st1val2.st2val2': [],
|
||||||
|
# 'od.stval2.st1val2.st3val2': []}
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# assert cfg.getowner(st2val1) == owners.default
|
||||||
|
# assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# assert cfg.getowner(st3val1) == owners.default
|
||||||
|
# assert cfg.getowner(st3val2) == owners.default
|
||||||
|
# #
|
||||||
|
# cfg.od.stval1.st1val1.st2val1[0] = 'yes'
|
||||||
|
# assert api.option.make_dict() == {'od.stval1.st1val1.st1val1': ['yes'],
|
||||||
|
# 'od.stval1.st1val1.st2val1': ['yes'],
|
||||||
|
# 'od.stval1.st1val1.st3val1': ['yes'],
|
||||||
|
# 'od.stval2.st1val2.st1val2': [],
|
||||||
|
# 'od.stval2.st1val2.st2val2': [],
|
||||||
|
# 'od.stval2.st1val2.st3val2': []}
|
||||||
|
# assert cfg.getowner(st1val1) == owner
|
||||||
|
# assert cfg.getowner(st2val1, 0) == owner
|
||||||
|
# assert cfg.getowner(st3val1, 0) == owners.default
|
||||||
|
# assert cfg.getowner(st1val2) == owners.default
|
||||||
|
# #assert cfg.getowner(st2val2) == owners.default
|
||||||
|
# #assert cfg.getowner(st3val2) == owners.default
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_conflict_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
dod = DynOptionDescription('dod', '', [st], callback=return_list)
|
||||||
|
dodinvalid = StrOption('dodinvalid', '')
|
||||||
|
dod, dodinvalid
|
||||||
|
raises(ConflictError, "OptionDescription('od', '', [dod, dodinvalid])")
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_subod_dyndescription():
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
od1 = OptionDescription('od1', '', [st2])
|
||||||
|
od1
|
||||||
|
raises(ConfigError, "DynOptionDescription('dod', '', [od1], callback=return_list)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_subdynod_dyndescription():
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
od1 = DynOptionDescription('od1', '', [st2], callback=return_list)
|
||||||
|
od1
|
||||||
|
raises(ConfigError, "DynOptionDescription('dod', '', [od1], callback=return_list)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_symlink_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st2 = SymLinkOption('st2', st)
|
||||||
|
st2
|
||||||
|
raises(ConfigError, "DynOptionDescription('dod', '', [st, st2], callback=return_list)")
|
||||||
|
|
||||||
|
|
||||||
|
def test_nocallback_dyndescription():
|
||||||
|
st = StrOption('st', '')
|
||||||
|
st2 = StrOption('st2', '')
|
||||||
|
st, st2
|
||||||
|
raises(ConfigError, "DynOptionDescription('dod', '', [st, st2])")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_invalid_samevalue_dyndescription():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_same_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# cfg
|
||||||
|
# raises(ConfigError, "print(cfg)")
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#def test_invalid_name_dyndescription():
|
||||||
|
# st = StrOption('st', '')
|
||||||
|
# dod = DynOptionDescription('dod', '', [st], callback=return_wrong_list)
|
||||||
|
# od = OptionDescription('od', '', [dod])
|
||||||
|
# cfg = Config(od)
|
||||||
|
# cfg
|
||||||
|
# raises(ValueError, "print(cfg)")
|
|
@ -0,0 +1,221 @@
|
||||||
|
# coding: utf-8
|
||||||
|
"frozen and hidden values"
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from py.test import raises
|
||||||
|
|
||||||
|
from tiramisu.setting import owners, groups
|
||||||
|
from tiramisu import ChoiceOption, BoolOption, IntOption, FloatOption, \
|
||||||
|
StrOption, OptionDescription, SymLinkOption, MasterSlaves, Config, \
|
||||||
|
getapi
|
||||||
|
from tiramisu.error import PropertiesOptionError, ConfigError
|
||||||
|
|
||||||
|
|
||||||
|
#____________________________________________________________
|
||||||
|
#freeze
|
||||||
|
def make_description_freeze():
|
||||||
|
gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
|
||||||
|
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||||
|
objspaceoption = ChoiceOption('objspace', 'Object space',
|
||||||
|
('std', 'thunk'), 'std')
|
||||||
|
booloption = BoolOption('bool', 'Test boolean option', default=True)
|
||||||
|
intoption = IntOption('int', 'Test int option', default=0)
|
||||||
|
floatoption = FloatOption('float', 'Test float option', default=2.3)
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc")
|
||||||
|
boolop = BoolOption('boolop', 'Test boolean option op', default=[True], multi=True)
|
||||||
|
wantref_option = BoolOption('wantref', 'Test requires', default=False, properties=('force_store_value',),
|
||||||
|
requires=({'option': booloption, 'expected': True, 'action': 'hidden'},))
|
||||||
|
wantref2_option = BoolOption('wantref2', 'Test requires', default=False, properties=('force_store_value', 'hidden'))
|
||||||
|
wantref3_option = BoolOption('wantref3', 'Test requires', default=[False], multi=True, properties=('force_store_value',))
|
||||||
|
st2 = SymLinkOption('st2', wantref3_option)
|
||||||
|
wantframework_option = BoolOption('wantframework', 'Test requires',
|
||||||
|
default=False,
|
||||||
|
requires=({'option': booloption, 'expected': True, 'action': 'hidden'},))
|
||||||
|
|
||||||
|
gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
|
||||||
|
descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
|
||||||
|
wantref_option, wantref2_option, wantref3_option, st2, stroption,
|
||||||
|
wantframework_option,
|
||||||
|
intoption, boolop])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def return_val():
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
def return_val2(value):
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def return_val3(context, value):
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def test_freeze_whole_config():
|
||||||
|
descr = make_description_freeze()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.add('everything_frozen')
|
||||||
|
assert api.option('gc.dummy').value.get() is False
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('gc.dummy').value.set(True)
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
assert api.option('gc.dummy').value.get() is False
|
||||||
|
#
|
||||||
|
api.property.pop('everything_frozen')
|
||||||
|
api.option('gc.dummy').value.set(True)
|
||||||
|
assert api.option('gc.dummy').value.get() is True
|
||||||
|
#
|
||||||
|
api.property.add('everything_frozen')
|
||||||
|
owners.addowner("everythingfrozen")
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('gc.dummy').owner.set('everythingfrozen')
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_freeze_one_option():
|
||||||
|
"freeze an option "
|
||||||
|
descr = make_description_freeze()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
#freeze only one option
|
||||||
|
api.option('gc.dummy').property.add('frozen')
|
||||||
|
assert api.option('gc.dummy').value.get() is False
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('gc.dummy').value.set(True)
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_frozen_value():
|
||||||
|
"setattr a frozen value at the config level"
|
||||||
|
s = StrOption("string", "", default="string")
|
||||||
|
descr = OptionDescription("options", "", [s])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.add('frozen')
|
||||||
|
api.option('string').property.add('frozen')
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('string').value.set('egg')
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_freeze():
|
||||||
|
"freeze a whole configuration object"
|
||||||
|
descr = make_description_freeze()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.add('frozen')
|
||||||
|
api.option('gc.name').property.add('frozen')
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('gc.name').value.set('framework')
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_freeze_multi():
|
||||||
|
descr = make_description_freeze()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.add('frozen')
|
||||||
|
api.option('boolop').property.add('frozen')
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('boolop').value.set([True])
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'frozen' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value():
|
||||||
|
descr = make_description_freeze()
|
||||||
|
conf = Config(descr)
|
||||||
|
api = getapi(conf)
|
||||||
|
assert api.value.get() == {'wantref': ('forced', False),
|
||||||
|
'wantref2': ('forced', False),
|
||||||
|
'wantref3': ('forced', (False,))}
|
||||||
|
api.option('wantref').value.set(True)
|
||||||
|
assert api.value.get() == {'wantref': ('user', True),
|
||||||
|
'wantref2': ('forced', False),
|
||||||
|
'wantref3': ('forced', (False,))}
|
||||||
|
api.option('wantref').value.reset()
|
||||||
|
assert api.value.get() == {'wantref': ('forced', False),
|
||||||
|
'wantref2': ('forced', False),
|
||||||
|
'wantref3': ('forced', (False,))}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_no_requirement():
|
||||||
|
booloption = BoolOption('bool', 'Test boolean option', default=True)
|
||||||
|
try:
|
||||||
|
BoolOption('wantref', 'Test requires', default=False,
|
||||||
|
requires=({'option': booloption, 'expected': True, 'action': 'force_store_value'},))
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_masterslaves_slave():
|
||||||
|
b = IntOption('int', 'Test int option', multi=True)
|
||||||
|
c = StrOption('str', 'Test string option', multi=True, properties=('force_store_value',))
|
||||||
|
descr = MasterSlaves("int", "", [b, c])
|
||||||
|
raises(ConfigError, "conf = Config(descr)")
|
||||||
|
|
||||||
|
|
||||||
|
#def test_force_store_value_masterslaves():
|
||||||
|
# b = IntOption('int', 'Test int option', multi=True, properties=('force_store_value',))
|
||||||
|
# c = StrOption('str', 'Test string option', multi=True)
|
||||||
|
# descr = MasterSlaves("int", "", [b, c])
|
||||||
|
# api = getapi(Config(descr))
|
||||||
|
# assert api.value.get() == {'int': ('forced', ())}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_masterslaves_sub():
|
||||||
|
b = IntOption('int', 'Test int option', multi=True, properties=('force_store_value',))
|
||||||
|
c = StrOption('str', 'Test string option', multi=True)
|
||||||
|
descr = MasterSlaves("int", "", [b, c])
|
||||||
|
odr = OptionDescription('odr', '', [descr])
|
||||||
|
api = getapi(Config(odr))
|
||||||
|
assert api.value.get() == {'int.int': ('forced', ())}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_callback():
|
||||||
|
b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val)
|
||||||
|
descr = OptionDescription("int", "", [b])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert api.value.get() == {'int': ('forced', 1)}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_callback_params():
|
||||||
|
b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val2, callback_params={'value': (2,)})
|
||||||
|
descr = OptionDescription("int", "", [b])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert api.value.get() == {'int': ('forced', 2)}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_callback_params_2():
|
||||||
|
b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val3, callback_params={'': ((None,),), 'value': (2,)})
|
||||||
|
descr = OptionDescription("int", "", [b])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert api.value.get() == {'int': ('forced', 2)}
|
||||||
|
|
||||||
|
|
||||||
|
def test_force_store_value_callback_params_with_opt():
|
||||||
|
a = IntOption('val1', "", 2)
|
||||||
|
b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val2, callback_params={'value': ((a, False),)})
|
||||||
|
descr = OptionDescription("int", "", [a, b])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert api.value.get() == {'int': ('forced', 2)}
|
|
@ -0,0 +1,575 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from .autopath import do_autopath
|
||||||
|
do_autopath()
|
||||||
|
|
||||||
|
from py.test import raises
|
||||||
|
from tiramisu.config import Config
|
||||||
|
from tiramisu import IntOption, StrOption, UnicodeOption, OptionDescription, \
|
||||||
|
SymLinkOption, MasterSlaves, getapi, undefined
|
||||||
|
from tiramisu.error import PropertiesOptionError, ConfigError
|
||||||
|
from tiramisu.setting import groups
|
||||||
|
|
||||||
|
|
||||||
|
def make_description():
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc",
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption1 = StrOption('str1', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption2 = UnicodeOption('unicode2', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption3 = StrOption('str3', 'Test string option', multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption4 = StrOption('str4', 'Test string option', multi=True,
|
||||||
|
properties=('mandatory', ), allow_empty_list=True)
|
||||||
|
descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, stroption4])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def return_value(value):
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def make_description2():
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc",
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption1 = StrOption('str1', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption2 = SymLinkOption('unicode2', stroption1)
|
||||||
|
stroption3 = StrOption('str3', 'Test string option', multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
unicode1 = UnicodeOption('unicode1', 'Test string option', callback=return_value, callback_params={'': ((stroption, False),)}, properties=('mandatory', ))
|
||||||
|
descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, unicode1])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def make_description_sym():
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc",
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption1 = StrOption('str1', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption2 = SymLinkOption('unicode2', stroption1)
|
||||||
|
stroption3 = StrOption('str3', 'Test string option', multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def make_description3():
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc",
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption1 = StrOption('str1', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption2 = SymLinkOption('unicode2', stroption1)
|
||||||
|
stroption3 = StrOption('str3', 'Test string option', multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
unicode1 = UnicodeOption('unicode1', 'Test string option', callback=return_value, callback_params={'': ((stroption, False),)}, properties=('mandatory', ))
|
||||||
|
int1 = IntOption('int1', '', callback=return_value, callback_params={'': ((stroption, False),)}, properties=('mandatory', ))
|
||||||
|
descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, unicode1, int1])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def make_description4():
|
||||||
|
stroption = StrOption('str', 'Test string option', default="abc",
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption1 = StrOption('str1', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption2 = UnicodeOption('unicode2', 'Test string option',
|
||||||
|
properties=('mandatory', ))
|
||||||
|
stroption3 = StrOption('str3', 'Test string option', multi=True, requires=[{'option': stroption, 'expected': 'yes', 'action': 'mandatory', 'transitive': False}])
|
||||||
|
descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3])
|
||||||
|
return descr
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_ro():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str1').value.set('yes')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('str1').value.get() == 'yes'
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_rw():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
#not mandatory in rw
|
||||||
|
api.option('str1').value.get()
|
||||||
|
api.option('str1').value.set('yes')
|
||||||
|
assert api.option('str1').value.get() == 'yes'
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_default():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
#not mandatory in rw
|
||||||
|
api.option('str').value.get()
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.set('yes')
|
||||||
|
api.property.read_only()
|
||||||
|
api.option('str').value.get()
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.set(None)
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_delete():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
api.option('str').value.get()
|
||||||
|
try:
|
||||||
|
api.option('str1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str1').value.set('yes')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('str1').value.get() == 'yes'
|
||||||
|
api.property.pop('everything_frozen')
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str1').value.reset()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
api.option('str').value.reset()
|
||||||
|
|
||||||
|
assert api.option('str1').value.get() == 'yes'
|
||||||
|
|
||||||
|
|
||||||
|
#valeur vide : None, '', u'', ...
|
||||||
|
def test_mandatory_none():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str1').value.set(None)
|
||||||
|
assert api.option('str1').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_empty():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str1').value.set('')
|
||||||
|
assert api.option('str1').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_multi_none():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str3').value.set([None])
|
||||||
|
assert api.option('str3').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str3').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str3').value.set(['yes', None])
|
||||||
|
assert api.option('str3').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str3').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_multi_empty():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str3').value.set([])
|
||||||
|
assert api.option('str3').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str3').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str3').value.set([''])
|
||||||
|
assert api.option('str3').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str3').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str3').value.set(['yes', ''])
|
||||||
|
assert api.option('str3').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str3').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_multi_empty_allow_empty_list():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str4').value.set([])
|
||||||
|
assert api.option('str4').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
api.option('str4').value.get()
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str4').value.set([''])
|
||||||
|
assert api.option('str4').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str4').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str4').value.set(['yes', ''])
|
||||||
|
assert api.option('str4').owner.get() == 'user'
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('str4').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_multi_append():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str3').value.set(['yes'])
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str3').value.get().append(None)
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_disabled():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str1').value.get()
|
||||||
|
api.option('str1').property.add('disabled')
|
||||||
|
api.property.read_only()
|
||||||
|
pop = []
|
||||||
|
try:
|
||||||
|
api.option('str1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert set(prop) == set(['disabled', 'mandatory'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_unicode():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('unicode2').value.get()
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('unicode2').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('unicode2').value.set('')
|
||||||
|
api.property.read_only()
|
||||||
|
prop = []
|
||||||
|
try:
|
||||||
|
api.option('unicode2').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_ro():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_only()
|
||||||
|
proc = []
|
||||||
|
try:
|
||||||
|
api.option('str').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
prop = err.proptype
|
||||||
|
assert 'mandatory' in prop
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.set('a')
|
||||||
|
api.property.read_only()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_rw():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
|
||||||
|
api.option('str').value.set('a')
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_disabled():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str', 'str1', 'unicode2', 'str3'}
|
||||||
|
api.option('str').property.add('disabled')
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str1', 'unicode2', 'str3'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_hidden():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.permissive.set(('hidden',))
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str', 'str1', 'unicode2', 'str3'}
|
||||||
|
api.option('str').property.add('hidden')
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str', 'str1', 'unicode2', 'str3'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_frozen():
|
||||||
|
descr = make_description()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str', 'str1', 'unicode2', 'str3'}
|
||||||
|
api.option('str').property.add('frozen')
|
||||||
|
api.property.read_only()
|
||||||
|
assert set(api.value.mandatory_warnings()) == {'str', 'str1', 'unicode2', 'str3'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_master():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_master():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True,
|
||||||
|
properties=('mandatory', ))
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_master_empty():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == []
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined])
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None]
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()")
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.reset()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == []
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set([''])
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['']
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()")
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()")
|
||||||
|
api.property.read_write()
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip'])
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip']
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip2'])
|
||||||
|
api.property.read_only()
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.reset()")
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.reset()
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_master_empty():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined])
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None]
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.reset()
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set([''])
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['']
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip'])
|
||||||
|
assert list(api.value.mandatory_warnings()) == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_slave():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True, properties=('mandatory', ))
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == []
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip'])
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip']
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()")
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip']
|
||||||
|
raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()")
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('ip')
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip']
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'ip'
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_slave():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
|
||||||
|
multi=True, properties=('mandatory', ))
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
#interface1.impl_set_group_type(groups.master)
|
||||||
|
descr = OptionDescription('o', '', [interface1])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == []
|
||||||
|
#
|
||||||
|
api.property.read_write()
|
||||||
|
assert list(api.value.mandatory_warnings()) == []
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip'])
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['ip_admin_eth0.netmask_admin_eth0']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_symlink():
|
||||||
|
descr = make_description_sym()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'str3']
|
||||||
|
api.option('str').property.add('frozen')
|
||||||
|
api.property.read_only()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'str3']
|
||||||
|
|
||||||
|
|
||||||
|
#def test_mandatory_warnings_validate():
|
||||||
|
# descr = make_description3()
|
||||||
|
# api = getapi(Config(descr))
|
||||||
|
# api.option('str').value.set('')
|
||||||
|
# raises(ValueError, "list(api.value.mandatory_warnings())")
|
||||||
|
# api.option('str').value.set('test')
|
||||||
|
# raises(ValueError, "list(api.value.mandatory_warnings())")
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_validate_empty():
|
||||||
|
descr = make_description2()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_only()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'str3', 'unicode1']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_warnings_requires():
|
||||||
|
descr = make_description4()
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.option('str').value.set('')
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.get()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'unicode2']
|
||||||
|
api.property.read_only()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str', 'str1', 'unicode2']
|
||||||
|
api.property.read_write()
|
||||||
|
api.option('str').value.set('yes')
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
|
|
||||||
|
|
||||||
|
def test_mandatory_od_disabled():
|
||||||
|
descr = make_description()
|
||||||
|
descr = OptionDescription('od', '', [descr])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
api.property.read_only()
|
||||||
|
assert list(api.value.mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3']
|
||||||
|
api.option('tiram').property.add('disabled')
|
||||||
|
assert list(api.value.mandatory_warnings()) == []
|
408
tiramisu/api.py
408
tiramisu/api.py
|
@ -15,11 +15,17 @@
|
||||||
# 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 inspect import ismethod, getdoc
|
from inspect import ismethod, getdoc
|
||||||
from .error import APIError, PropertiesOptionError
|
from .error import APIError, PropertiesOptionError, ConfigError
|
||||||
from .i18n import _
|
from .i18n import _
|
||||||
from .setting import owners, undefined
|
from .setting import owners, undefined
|
||||||
|
from .option import ChoiceOption
|
||||||
from time import time
|
from time import time
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
|
|
||||||
|
TIRAMISU_VERSION = 3
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from .value import Multi
|
from .value import Multi
|
||||||
except:
|
except:
|
||||||
|
@ -27,29 +33,31 @@ except:
|
||||||
|
|
||||||
|
|
||||||
COUNT_TIME = False
|
COUNT_TIME = False
|
||||||
#COUNT_TIME = {}
|
COUNT_TIME = {}
|
||||||
|
|
||||||
|
|
||||||
def count(func):
|
def count(func):
|
||||||
global MOD_COUNT_TIME
|
global MOD_COUNT_TIME
|
||||||
|
class_name = func.__str__().split()[1].split('.')[0]
|
||||||
func_name = func.__name__
|
func_name = func.__name__
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
time1 = time()
|
time1 = time()
|
||||||
ret = func(*args, **kwargs)
|
ret = func(*args, **kwargs)
|
||||||
time2 = time()
|
time2 = time()
|
||||||
diff = (time2 - time1) * 1000.0
|
diff = (time2 - time1) * 1000.0
|
||||||
MOD_COUNT_TIME[func_name]['max'] = max(MOD_COUNT_TIME[func_name]['max'], diff)
|
MOD_COUNT_TIME[class_name][func_name]['max'] = max(MOD_COUNT_TIME[class_name][func_name]['max'], diff)
|
||||||
MOD_COUNT_TIME[func_name]['min'] = min(MOD_COUNT_TIME[func_name]['min'], diff)
|
MOD_COUNT_TIME[class_name][func_name]['min'] = min(MOD_COUNT_TIME[class_name][func_name]['min'], diff)
|
||||||
MOD_COUNT_TIME[func_name]['total'] += diff
|
MOD_COUNT_TIME[class_name][func_name]['total'] += diff
|
||||||
MOD_COUNT_TIME[func_name]['nb'] += 1
|
MOD_COUNT_TIME[class_name][func_name]['nb'] += 1
|
||||||
#print('%s function took %0.3f ms' % (func_name, diff))
|
#print('%s function took %0.3f ms' % (func_name, diff))
|
||||||
#print(COUNT_TIME)
|
#print(COUNT_TIME)
|
||||||
return ret
|
return ret
|
||||||
if COUNT_TIME is not False:
|
if COUNT_TIME is not False:
|
||||||
COUNT_TIME[func_name] = {'max': 0,
|
COUNT_TIME.setdefault(class_name, {})
|
||||||
'min': 1000,
|
COUNT_TIME[class_name][func_name] = {'max': 0,
|
||||||
'nb': 0,
|
'min': 1000,
|
||||||
'total': 0}
|
'nb': 0,
|
||||||
|
'total': 0}
|
||||||
MOD_COUNT_TIME = deepcopy(COUNT_TIME)
|
MOD_COUNT_TIME = deepcopy(COUNT_TIME)
|
||||||
return wrapper
|
return wrapper
|
||||||
return func
|
return func
|
||||||
|
@ -59,19 +67,23 @@ def display_count():
|
||||||
if COUNT_TIME is not False:
|
if COUNT_TIME is not False:
|
||||||
global MOD_COUNT_TIME
|
global MOD_COUNT_TIME
|
||||||
#print(MOD_COUNT_TIME)
|
#print(MOD_COUNT_TIME)
|
||||||
for func in MOD_COUNT_TIME:
|
print()
|
||||||
print('>', func)
|
for class_name in MOD_COUNT_TIME:
|
||||||
print('=> nb:', MOD_COUNT_TIME[func]['nb'])
|
print('>', class_name)
|
||||||
if MOD_COUNT_TIME[func]['nb'] != 0:
|
for func in MOD_COUNT_TIME[class_name]:
|
||||||
print('=> min:', MOD_COUNT_TIME[func]['min'])
|
print('=>', func)
|
||||||
print('=> max:', MOD_COUNT_TIME[func]['max'])
|
print('==> nb:', MOD_COUNT_TIME[class_name][func]['nb'])
|
||||||
print('=> moy:', MOD_COUNT_TIME[func]['total'] / MOD_COUNT_TIME[func]['nb'])
|
if MOD_COUNT_TIME[class_name][func]['nb'] != 0:
|
||||||
|
print('==> min:', MOD_COUNT_TIME[class_name][func]['min'])
|
||||||
|
print('==> max:', MOD_COUNT_TIME[class_name][func]['max'])
|
||||||
|
print('==> moy:', MOD_COUNT_TIME[class_name][func]['total'] / MOD_COUNT_TIME[class_name][func]['nb'])
|
||||||
MOD_COUNT_TIME = deepcopy(COUNT_TIME)
|
MOD_COUNT_TIME = deepcopy(COUNT_TIME)
|
||||||
|
|
||||||
class CommonTiramisuOption(object):
|
class CommonTiramisuOption(object):
|
||||||
icon = '\u2937'
|
icon = '\u2937'
|
||||||
tmpl_help = u' {} {}: {}'
|
tmpl_help = u' {} {}: {}'
|
||||||
allow_unrestraint = False
|
allow_unrestraint = False
|
||||||
|
allow_optiondescription = False
|
||||||
slave_need_index = True
|
slave_need_index = True
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -82,8 +94,10 @@ class CommonTiramisuOption(object):
|
||||||
setting_properties,
|
setting_properties,
|
||||||
force_permissive,
|
force_permissive,
|
||||||
force_unrestraint):
|
force_unrestraint):
|
||||||
self.opt = opt
|
if not self.allow_optiondescription and opt.impl_is_optiondescription():
|
||||||
self.path = path
|
raise APIError(_('option must not be an optiondescription'))
|
||||||
|
self._opt = opt
|
||||||
|
self._path = path
|
||||||
self.index = index
|
self.index = index
|
||||||
if self.slave_need_index:
|
if self.slave_need_index:
|
||||||
self._test_slave_index()
|
self._test_slave_index()
|
||||||
|
@ -95,7 +109,8 @@ class CommonTiramisuOption(object):
|
||||||
self._unrestraint_not_allowed(force_unrestraint)
|
self._unrestraint_not_allowed(force_unrestraint)
|
||||||
|
|
||||||
def _test_slave_index(self):
|
def _test_slave_index(self):
|
||||||
if self.index is None and self.opt.impl_is_master_slaves('slave'):
|
if not self._opt.impl_is_optiondescription() and self.index is None and \
|
||||||
|
self._opt.impl_is_master_slaves('slave'):
|
||||||
raise APIError('index must be set with a slave option')
|
raise APIError('index must be set with a slave option')
|
||||||
|
|
||||||
def _unrestraint_not_allowed(self, force_unrestraint):
|
def _unrestraint_not_allowed(self, force_unrestraint):
|
||||||
|
@ -125,6 +140,7 @@ class CommonTiramisuOption(object):
|
||||||
class TiramisuOptionOption(CommonTiramisuOption):
|
class TiramisuOptionOption(CommonTiramisuOption):
|
||||||
"""get information from an option"""
|
"""get information from an option"""
|
||||||
allow_unrestraint = True
|
allow_unrestraint = True
|
||||||
|
allow_optiondescription = True
|
||||||
slave_need_index = False
|
slave_need_index = False
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -145,37 +161,46 @@ class TiramisuOptionOption(CommonTiramisuOption):
|
||||||
if config:
|
if config:
|
||||||
self.values = self.config.cfgimpl_get_values()
|
self.values = self.config.cfgimpl_get_values()
|
||||||
|
|
||||||
|
@count
|
||||||
def ismulti(self):
|
def ismulti(self):
|
||||||
"""test if option could have multi value"""
|
"""test if option could have multi value"""
|
||||||
return self.opt.impl_is_multi()
|
return self._opt.impl_is_multi()
|
||||||
|
|
||||||
|
@count
|
||||||
def issubmulti(self):
|
def issubmulti(self):
|
||||||
"""test if option could have submulti value"""
|
"""test if option could have submulti value"""
|
||||||
return self.opt.impl_is_submulti()
|
return self._opt.impl_is_submulti()
|
||||||
|
|
||||||
|
@count
|
||||||
def ismasterslaves(self):
|
def ismasterslaves(self):
|
||||||
"""test if option is a master or a slave"""
|
"""test if option is a master or a slave"""
|
||||||
return self.opt.impl_is_master_slaves()
|
return self._opt.impl_is_master_slaves()
|
||||||
|
|
||||||
|
@count
|
||||||
def ismaster(self):
|
def ismaster(self):
|
||||||
"""test if option is a master"""
|
"""test if option is a master"""
|
||||||
return self.opt.impl_is_master_slaves('master')
|
return self._opt.impl_is_master_slaves('master')
|
||||||
|
|
||||||
|
@count
|
||||||
def isslave(self):
|
def isslave(self):
|
||||||
"""test if option is a slave"""
|
"""test if option is a slave"""
|
||||||
return self.opt.impl_is_master_slaves('slave')
|
return self._opt.impl_is_master_slaves('slave')
|
||||||
|
|
||||||
|
@count
|
||||||
def getname(self):
|
def getname(self):
|
||||||
return self.opt.impl_getname()
|
return self._opt.impl_getname()
|
||||||
|
|
||||||
|
@count
|
||||||
def getdoc(self):
|
def getdoc(self):
|
||||||
return self.opt.impl_get_display_name()
|
return self._opt.impl_get_display_name()
|
||||||
|
|
||||||
|
@count
|
||||||
def getdefault(self):
|
def getdefault(self):
|
||||||
return self.opt.impl_getdefault()
|
return self._opt.impl_getdefault()
|
||||||
|
|
||||||
|
@count
|
||||||
def getdefaultmulti(self):
|
def getdefaultmulti(self):
|
||||||
return self.opt.impl_getdefault_multi()
|
return self._opt.impl_getdefault_multi()
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionOwner(CommonTiramisuOption):
|
class TiramisuOptionOwner(CommonTiramisuOption):
|
||||||
|
@ -200,39 +225,46 @@ class TiramisuOptionOwner(CommonTiramisuOption):
|
||||||
if config:
|
if config:
|
||||||
self.values = self.config.cfgimpl_get_values()
|
self.values = self.config.cfgimpl_get_values()
|
||||||
|
|
||||||
|
@count
|
||||||
def get(self):
|
def get(self):
|
||||||
"""get owner for a specified option"""
|
"""get owner for a specified option"""
|
||||||
return self.values.getowner(self.opt,
|
return self.values.getowner(self._opt,
|
||||||
self.path,
|
path=self._path,
|
||||||
self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
index=self.index,
|
index=self.index,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
|
|
||||||
@count
|
@count
|
||||||
def isdefault(self):
|
def isdefault(self):
|
||||||
"""is option has defaut value"""
|
"""is option has defaut value"""
|
||||||
return self.values.is_default_owner(self.opt,
|
return self.values.is_default_owner(self._opt,
|
||||||
self.path,
|
self._path,
|
||||||
self.setting_properties,
|
self.setting_properties,
|
||||||
index=self.index,
|
index=self.index,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
|
|
||||||
|
@count
|
||||||
def set(self, owner):
|
def set(self, owner):
|
||||||
"""get owner for a specified option"""
|
"""get owner for a specified option"""
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
if owner in ['default', 'forced', 'meta']:
|
||||||
|
raise ConfigError()
|
||||||
try:
|
try:
|
||||||
obj_owner = getattr(owners, owner)
|
obj_owner = getattr(owners, owner)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
owners.addowner(owner)
|
owners.addowner(owner)
|
||||||
obj_owner = getattr(owners, owner)
|
obj_owner = getattr(owners, owner)
|
||||||
self.values.setowner(self.opt,
|
self.values.setowner(self._opt,
|
||||||
self.path,
|
path=self._path,
|
||||||
obj_owner,
|
owner=obj_owner,
|
||||||
self.index)
|
setting_properties=self.setting_properties,
|
||||||
|
index=self.index)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionProperty(CommonTiramisuOption):
|
class TiramisuOptionProperty(CommonTiramisuOption):
|
||||||
"""manager option's property"""
|
"""manager option's property"""
|
||||||
#allow_unrestraint = True
|
#allow_unrestraint = True
|
||||||
|
allow_optiondescription = True
|
||||||
slave_need_index = False
|
slave_need_index = False
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -253,29 +285,49 @@ class TiramisuOptionProperty(CommonTiramisuOption):
|
||||||
if config:
|
if config:
|
||||||
self.settings = config.cfgimpl_get_settings()
|
self.settings = config.cfgimpl_get_settings()
|
||||||
|
|
||||||
|
@count
|
||||||
def get(self):
|
def get(self):
|
||||||
self._test_slave_index()
|
self._test_slave_index()
|
||||||
return self.settings.getproperties(self.opt,
|
properties = self.settings.getproperties(self._opt,
|
||||||
self.path,
|
self._path,
|
||||||
self.setting_properties,
|
self.setting_properties,
|
||||||
index=self.index)
|
index=self.index)
|
||||||
|
if TIRAMISU_VERSION == 2:
|
||||||
|
properties = properties.get()
|
||||||
|
return set(properties)
|
||||||
|
|
||||||
|
@count
|
||||||
def set(self, properties):
|
def set(self, properties):
|
||||||
"""set properties for a specified option"""
|
"""set properties for a specified option"""
|
||||||
self.settings.setproperties(self.opt,
|
properties = frozenset(properties)
|
||||||
self.path,
|
self.settings.setproperties(opt=self._opt,
|
||||||
properties)
|
path=self._path,
|
||||||
|
properties=properties)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def add(self, prop):
|
||||||
|
props = self.get()
|
||||||
|
props.add(prop)
|
||||||
|
self.set(props)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def pop(self, prop):
|
||||||
|
props = self.get()
|
||||||
|
props.remove(prop)
|
||||||
|
self.set(props)
|
||||||
|
|
||||||
|
@count
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""reset all personalised properties
|
"""reset all personalised properties
|
||||||
"""
|
"""
|
||||||
self.settings.reset(opt=self.opt,
|
self.settings.reset(opt=self._opt,
|
||||||
path=self.path)
|
path=self._path)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionPermissive(CommonTiramisuOption):
|
class TiramisuOptionPermissive(CommonTiramisuOption):
|
||||||
"""manager option's property"""
|
"""manager option's property"""
|
||||||
allow_unrestraint = True
|
allow_unrestraint = True
|
||||||
|
allow_optiondescription = True
|
||||||
slave_need_index = False
|
slave_need_index = False
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -296,48 +348,47 @@ class TiramisuOptionPermissive(CommonTiramisuOption):
|
||||||
if config:
|
if config:
|
||||||
self.settings = config.cfgimpl_get_settings()
|
self.settings = config.cfgimpl_get_settings()
|
||||||
|
|
||||||
|
@count
|
||||||
def get(self):
|
def get(self):
|
||||||
"""get permissive value for a specified path"""
|
"""get permissive value for a specified path"""
|
||||||
return self.settings.getpermissive(self.opt,
|
if TIRAMISU_VERSION == 2:
|
||||||
self.path)
|
args = [self.setting_properties, self._path]
|
||||||
|
else:
|
||||||
|
args = [self._opt, self._path]
|
||||||
|
return self.settings.getpermissive(*args)
|
||||||
|
|
||||||
|
@count
|
||||||
def set(self, permissive):
|
def set(self, permissive):
|
||||||
self.settings.setpermissive(self.opt,
|
if TIRAMISU_VERSION == 2:
|
||||||
self.path,
|
permissive = tuple(permissive)
|
||||||
permissive)
|
self.settings.setpermissive(opt=self._opt,
|
||||||
|
path=self._path,
|
||||||
|
permissive=permissive)
|
||||||
|
|
||||||
|
@count
|
||||||
def reset(self, path):
|
def reset(self, path):
|
||||||
"""reset all personalised permissive
|
"""reset all personalised permissive
|
||||||
"""
|
"""
|
||||||
self.set(tuple())
|
self.set(tuple())
|
||||||
|
|
||||||
|
|
||||||
|
class TiramisuOptionInformation(CommonTiramisuOption):
|
||||||
|
allow_optiondescription = True
|
||||||
|
|
||||||
|
@count
|
||||||
|
def get(self, name, default=undefined):
|
||||||
|
return self._opt.impl_get_information(name, default)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionValue(CommonTiramisuOption):
|
class TiramisuOptionValue(CommonTiramisuOption):
|
||||||
"""manager option's value"""
|
"""manager option's value"""
|
||||||
slave_need_index = False
|
slave_need_index = False
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
opt,
|
|
||||||
path,
|
|
||||||
index,
|
|
||||||
config,
|
|
||||||
setting_properties,
|
|
||||||
force_permissive,
|
|
||||||
force_unrestraint):
|
|
||||||
|
|
||||||
super(TiramisuOptionValue, self).__init__(opt,
|
|
||||||
path,
|
|
||||||
index,
|
|
||||||
config,
|
|
||||||
setting_properties,
|
|
||||||
force_permissive,
|
|
||||||
force_unrestraint)
|
|
||||||
|
|
||||||
@count
|
@count
|
||||||
def get(self):
|
def get(self):
|
||||||
self._test_slave_index()
|
self._test_slave_index()
|
||||||
settings = self.config.cfgimpl_get_settings()
|
settings = self.config.cfgimpl_get_settings()
|
||||||
value = self.config.getattr(self.path,
|
value = self.config.getattr(self._path,
|
||||||
index=self.index,
|
index=self.index,
|
||||||
setting_properties=self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
|
@ -353,17 +404,17 @@ class TiramisuOptionValue(CommonTiramisuOption):
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
while undefined in value:
|
while undefined in value:
|
||||||
idx = value.index(undefined)
|
idx = value.index(undefined)
|
||||||
value[idx] = values.getdefaultvalue(self.opt,
|
value[idx] = values.getdefaultvalue(self._opt,
|
||||||
self.path,
|
self._path,
|
||||||
self.setting_properties,
|
self.setting_properties,
|
||||||
idx)
|
idx)
|
||||||
else:
|
else:
|
||||||
if value == undefined:
|
if value == undefined:
|
||||||
value = values.getdefaultvalue(self.opt,
|
value = values.getdefaultvalue(self._opt,
|
||||||
self.path,
|
self._path,
|
||||||
self.setting_properties,
|
self.setting_properties,
|
||||||
self.index)
|
self.index)
|
||||||
self.config.setattr(self.path,
|
self.config.setattr(self._path,
|
||||||
value,
|
value,
|
||||||
index=self.index,
|
index=self.index,
|
||||||
setting_properties=self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
|
@ -375,27 +426,48 @@ class TiramisuOptionValue(CommonTiramisuOption):
|
||||||
"""
|
"""
|
||||||
self._test_slave_index()
|
self._test_slave_index()
|
||||||
#FIXME only for master
|
#FIXME only for master
|
||||||
self.config.delattr(self.path,
|
self.config.delattr(self._path,
|
||||||
index=index,
|
index=index,
|
||||||
setting_properties=self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
|
|
||||||
|
@count
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""reset value for a value"""
|
"""reset value for a value"""
|
||||||
self._test_slave_index()
|
self._test_slave_index()
|
||||||
self.config.delattr(self.path,
|
self.config.delattr(self._path,
|
||||||
index=self.index,
|
index=self.index,
|
||||||
setting_properties=self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
|
|
||||||
|
@count
|
||||||
def len(self):
|
def len(self):
|
||||||
#FIXME only for slave
|
#FIXME only for slave
|
||||||
subconfig_path = self.path.rsplit('.', 1)[0]
|
subconfig_path = self._path.rsplit('.', 1)[0]
|
||||||
subconfig = self.config.getattr(subconfig_path,
|
subconfig = self.config.getattr(subconfig_path,
|
||||||
setting_properties=self.setting_properties,
|
setting_properties=self.setting_properties,
|
||||||
force_permissive=self.force_permissive)
|
force_permissive=self.force_permissive)
|
||||||
return subconfig.cfgimpl_get_length()
|
return subconfig.cfgimpl_get_length()
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
if name == 'list':
|
||||||
|
if isinstance(self._opt, ChoiceOption):
|
||||||
|
return self._list
|
||||||
|
raise APIError(_('{} allowed only for choiceoption').format(name))
|
||||||
|
|
||||||
|
@count
|
||||||
|
def _list(self):
|
||||||
|
return self._opt.impl_get_values(context=self.config,
|
||||||
|
setting_properties=self.setting_properties)
|
||||||
|
|
||||||
|
|
||||||
|
def registers(registers, prefix):
|
||||||
|
for module_name in globals().keys():
|
||||||
|
if module_name != prefix and module_name.startswith(prefix):
|
||||||
|
module = globals()[module_name]
|
||||||
|
func_name = module_name[len(prefix):].lower()
|
||||||
|
registers[func_name] = module
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOption(object):
|
class TiramisuOption(object):
|
||||||
icon = '\u2937'
|
icon = '\u2937'
|
||||||
|
@ -410,20 +482,15 @@ class TiramisuOption(object):
|
||||||
force_permissive,
|
force_permissive,
|
||||||
force_unrestraint):
|
force_unrestraint):
|
||||||
|
|
||||||
self.opt = opt
|
self._opt = opt
|
||||||
self.path = path
|
self._path = path
|
||||||
self.index = index
|
self.index = index
|
||||||
self.config = config
|
self.config = config
|
||||||
self.setting_properties = setting_properties
|
self.setting_properties = setting_properties
|
||||||
self.force_permissive = force_permissive
|
self.force_permissive = force_permissive
|
||||||
self.force_unrestraint = force_unrestraint
|
self.force_unrestraint = force_unrestraint
|
||||||
self.registers = {}
|
self.registers = {}
|
||||||
self.prefix = self.__class__.__name__
|
registers(self.registers, self.__class__.__name__)
|
||||||
for module_name in globals().keys():
|
|
||||||
if module_name != self.prefix and module_name.startswith(self.prefix):
|
|
||||||
module = globals()[module_name]
|
|
||||||
func_name = module_name[len(self.prefix):].lower()
|
|
||||||
self.registers[func_name] = module
|
|
||||||
|
|
||||||
def _help(self):
|
def _help(self):
|
||||||
txt = []
|
txt = []
|
||||||
|
@ -435,8 +502,8 @@ class TiramisuOption(object):
|
||||||
|
|
||||||
def __getattr__(self, subfunc):
|
def __getattr__(self, subfunc):
|
||||||
if subfunc in self.registers:
|
if subfunc in self.registers:
|
||||||
return self.registers[subfunc](self.opt,
|
return self.registers[subfunc](self._opt,
|
||||||
self.path,
|
self._path,
|
||||||
self.index,
|
self.index,
|
||||||
self.config,
|
self.config,
|
||||||
self.setting_properties,
|
self.setting_properties,
|
||||||
|
@ -445,7 +512,21 @@ class TiramisuOption(object):
|
||||||
elif subfunc == 'help':
|
elif subfunc == 'help':
|
||||||
return self._help()
|
return self._help()
|
||||||
else:
|
else:
|
||||||
raise APIError(_('please specify a valid sub function'))
|
raise APIError(_('please specify a valid sub function ({})').format(subfunc))
|
||||||
|
|
||||||
|
@count
|
||||||
|
def make_dict(self,
|
||||||
|
flatten=False,
|
||||||
|
withvalue=undefined,
|
||||||
|
withoption=None,
|
||||||
|
fullpath=False):
|
||||||
|
return self.config.getattr(setting_properties=self.setting_properties,
|
||||||
|
name=self._path).make_dict(setting_properties=self.setting_properties,
|
||||||
|
flatten=flatten,
|
||||||
|
fullpath=fullpath,
|
||||||
|
withoption=withoption,
|
||||||
|
force_permissive=self.force_permissive,
|
||||||
|
withvalue=withvalue)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContext(object):
|
class TiramisuContext(object):
|
||||||
|
@ -461,12 +542,82 @@ class TiramisuContext(object):
|
||||||
self.force_unrestraint = force_unrestraint
|
self.force_unrestraint = force_unrestraint
|
||||||
self.setting_properties = setting_properties
|
self.setting_properties = setting_properties
|
||||||
|
|
||||||
|
|
||||||
|
class TiramisuContextInformation(TiramisuContext):
|
||||||
|
@count
|
||||||
|
def get(self, name, default=undefined):
|
||||||
|
return self.config.impl_get_information(name, default)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def set(self, name, value):
|
||||||
|
self.config.impl_set_information(name, value)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def reset(self, name):
|
||||||
|
self.config.impl_del_information(name)
|
||||||
|
|
||||||
|
|
||||||
|
class TiramisuContextValue(TiramisuContext):
|
||||||
|
@count
|
||||||
|
def mandatory_warnings(self):
|
||||||
|
return self.config.cfgimpl_get_values().mandatory_warnings(self.setting_properties)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def get(self):
|
||||||
|
return self.config.cfgimpl_get_values().get_modified_values()
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContextOwner(TiramisuContext):
|
class TiramisuContextOwner(TiramisuContext):
|
||||||
|
@count
|
||||||
def get(self):
|
def get(self):
|
||||||
return self.config.cfgimpl_get_settings().getowner()
|
return self.config.cfgimpl_get_settings().getowner()
|
||||||
|
|
||||||
|
|
||||||
|
class TiramisuContextProperty(TiramisuContext):
|
||||||
|
@count
|
||||||
|
def read_only(self):
|
||||||
|
self.config.cfgimpl_get_settings().read_only()
|
||||||
|
|
||||||
|
@count
|
||||||
|
def read_write(self):
|
||||||
|
self.config.cfgimpl_get_settings().read_write()
|
||||||
|
# #FIXME ?
|
||||||
|
settings = self.config.cfgimpl_get_settings()
|
||||||
|
settings.set_context_permissive(frozenset(['hidden']))
|
||||||
|
#/FIXME ?
|
||||||
|
|
||||||
|
@count
|
||||||
|
def add(self, prop):
|
||||||
|
props = self.get()
|
||||||
|
props.add(prop)
|
||||||
|
self.set(props)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def pop(self, prop):
|
||||||
|
props = self.get()
|
||||||
|
props.remove(prop)
|
||||||
|
self.set(props)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def get(self):
|
||||||
|
return set(self.config.cfgimpl_get_settings().get_context_properties())
|
||||||
|
|
||||||
|
@count
|
||||||
|
def set(self, props):
|
||||||
|
self.config.cfgimpl_get_settings().set_context_properties(frozenset(props))
|
||||||
|
|
||||||
|
|
||||||
|
class TiramisuContextPermissive(TiramisuContext):
|
||||||
|
|
||||||
|
@count
|
||||||
|
def set(self, permissives):
|
||||||
|
if TIRAMISU_VERSION != 2:
|
||||||
|
permissives = frozenset(permissives)
|
||||||
|
self.config.cfgimpl_get_settings().set_context_permissive(permissives)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContextOption(TiramisuContext):
|
class TiramisuContextOption(TiramisuContext):
|
||||||
|
@count
|
||||||
def find_first(self,
|
def find_first(self,
|
||||||
name,
|
name,
|
||||||
type='option'):
|
type='option'):
|
||||||
|
@ -477,6 +628,7 @@ class TiramisuContextOption(TiramisuContext):
|
||||||
force_permissive=self.force_permissive,
|
force_permissive=self.force_permissive,
|
||||||
check_properties=not self.force_unrestraint)
|
check_properties=not self.force_unrestraint)
|
||||||
|
|
||||||
|
@count
|
||||||
def find(self,
|
def find(self,
|
||||||
name,
|
name,
|
||||||
type='option'):
|
type='option'):
|
||||||
|
@ -486,19 +638,33 @@ class TiramisuContextOption(TiramisuContext):
|
||||||
force_permissive=self.force_permissive,
|
force_permissive=self.force_permissive,
|
||||||
check_properties=not self.force_unrestraint)
|
check_properties=not self.force_unrestraint)
|
||||||
|
|
||||||
|
@count
|
||||||
def get(self, path):
|
def get(self, path):
|
||||||
return self.config.unwrap_from_path(path,
|
return self.config.unwrap_from_path(path,
|
||||||
validate=False,
|
validate=False,
|
||||||
validate_properties=False)
|
validate_properties=False)
|
||||||
|
|
||||||
|
@count
|
||||||
|
def make_dict(self,
|
||||||
|
flatten=False,
|
||||||
|
withvalue=undefined,
|
||||||
|
withoption=None,
|
||||||
|
fullpath=False):
|
||||||
|
return self.config.make_dict(setting_properties=self.setting_properties,
|
||||||
|
flatten=flatten,
|
||||||
|
fullpath=fullpath,
|
||||||
|
force_permissive=self.force_permissive,
|
||||||
|
withoption=withoption,
|
||||||
|
withvalue=withvalue)
|
||||||
|
|
||||||
class TiramisuOptionDispatcher(TiramisuContextOption):
|
|
||||||
|
class TiramisuDispatcherOption(TiramisuContextOption):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
config,
|
config,
|
||||||
force_permissive,
|
force_permissive,
|
||||||
force_unrestraint):
|
force_unrestraint):
|
||||||
self.setting_properties = config.cfgimpl_get_settings().get_context_properties()
|
self.setting_properties = config.cfgimpl_get_settings().get_context_properties()
|
||||||
super(TiramisuOptionDispatcher, self).__init__(config,
|
super(TiramisuDispatcherOption, self).__init__(config,
|
||||||
force_permissive,
|
force_permissive,
|
||||||
force_unrestraint,
|
force_unrestraint,
|
||||||
self.setting_properties)
|
self.setting_properties)
|
||||||
|
@ -538,32 +704,6 @@ class TiramisuOptionDispatcher(TiramisuContextOption):
|
||||||
self.force_unrestraint)
|
self.force_unrestraint)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContextConfig(TiramisuContext):
|
|
||||||
def make_dict(self):
|
|
||||||
return self.config.make_dict(self.setting_properties)
|
|
||||||
|
|
||||||
|
|
||||||
class TiramisuConfigDispatcher(TiramisuContextConfig):
|
|
||||||
def __init__(self,
|
|
||||||
config,
|
|
||||||
force_permissive,
|
|
||||||
force_unrestraint):
|
|
||||||
self.setting_properties = config.cfgimpl_get_settings().get_context_properties()
|
|
||||||
super(TiramisuConfigDispatcher, self).__init__(config,
|
|
||||||
force_permissive,
|
|
||||||
force_unrestraint,
|
|
||||||
self.setting_properties)
|
|
||||||
|
|
||||||
def __call__(self, path):
|
|
||||||
if path is None:
|
|
||||||
subconfig = self.config
|
|
||||||
else:
|
|
||||||
subconfig = self.config.getconfig(path)
|
|
||||||
return TiramisuAPI(subconfig,
|
|
||||||
force_permissive=self.force_permissive,
|
|
||||||
force_unrestraint=self.force_unrestraint)
|
|
||||||
|
|
||||||
|
|
||||||
class TiramisuAPI(object):
|
class TiramisuAPI(object):
|
||||||
icon = '\u2937'
|
icon = '\u2937'
|
||||||
tmpl_help = ' {} {}: {}'
|
tmpl_help = ' {} {}: {}'
|
||||||
|
@ -575,6 +715,9 @@ class TiramisuAPI(object):
|
||||||
self._config = config
|
self._config = config
|
||||||
self.force_permissive = force_permissive
|
self.force_permissive = force_permissive
|
||||||
self.force_unrestraint = force_unrestraint
|
self.force_unrestraint = force_unrestraint
|
||||||
|
self.registers = {}
|
||||||
|
registers(self.registers, 'TiramisuContext')
|
||||||
|
registers(self.registers, 'TiramisuDispatcher')
|
||||||
|
|
||||||
def __getattr__(self, subfunc):
|
def __getattr__(self, subfunc):
|
||||||
if subfunc == 'forcepermissive':
|
if subfunc == 'forcepermissive':
|
||||||
|
@ -585,20 +728,16 @@ class TiramisuAPI(object):
|
||||||
return TiramisuAPI(self._config,
|
return TiramisuAPI(self._config,
|
||||||
force_permissive=self.force_permissive,
|
force_permissive=self.force_permissive,
|
||||||
force_unrestraint=True)
|
force_unrestraint=True)
|
||||||
|
elif subfunc == 'config':
|
||||||
|
return TiramisuAPI(self._config,
|
||||||
|
force_permissive=self.force_permissive,
|
||||||
|
force_unrestraint=True)
|
||||||
elif subfunc == 'help':
|
elif subfunc == 'help':
|
||||||
return self._help()
|
return self._help()
|
||||||
elif subfunc == 'owner':
|
elif subfunc in self.registers:
|
||||||
return TiramisuContextOwner(self._config,
|
return self.registers[subfunc](self._config,
|
||||||
self.force_permissive,
|
force_permissive=self.force_permissive,
|
||||||
self.force_unrestraint)
|
force_unrestraint=self.force_unrestraint)
|
||||||
elif subfunc == 'config':
|
|
||||||
return TiramisuConfigDispatcher(self._config,
|
|
||||||
force_permissive=self.force_permissive,
|
|
||||||
force_unrestraint=self.force_unrestraint)
|
|
||||||
elif subfunc == 'option':
|
|
||||||
return TiramisuOptionDispatcher(self._config,
|
|
||||||
force_permissive=self.force_permissive,
|
|
||||||
force_unrestraint=self.force_unrestraint)
|
|
||||||
else:
|
else:
|
||||||
raise APIError(_('please specify a valid sub function ({})').format(subfunc))
|
raise APIError(_('please specify a valid sub function ({})').format(subfunc))
|
||||||
|
|
||||||
|
@ -610,17 +749,8 @@ class TiramisuAPI(object):
|
||||||
txt.append(module(None, None).help)
|
txt.append(module(None, None).help)
|
||||||
return '\n'.join(txt)
|
return '\n'.join(txt)
|
||||||
|
|
||||||
def read_only(self):
|
|
||||||
self._config.read_write()
|
|
||||||
|
|
||||||
def read_write(self):
|
|
||||||
settings = self._config.cfgimpl_get_settings()
|
|
||||||
self._config.read_write()
|
|
||||||
# #FIXME ?
|
|
||||||
settings.set_context_permissive(frozenset(['hidden']))
|
|
||||||
#/FIXME ?
|
|
||||||
|
|
||||||
|
|
||||||
|
@count
|
||||||
def getapi(config):
|
def getapi(config):
|
||||||
"""instanciate TiramisuAPI
|
"""instanciate TiramisuAPI
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ def carry_out_calculation(option,
|
||||||
context,
|
context,
|
||||||
callback,
|
callback,
|
||||||
callback_params,
|
callback_params,
|
||||||
setting_properties=undefined,
|
setting_properties,
|
||||||
index=undefined,
|
index=undefined,
|
||||||
validate=True,
|
validate=True,
|
||||||
is_validator=False):
|
is_validator=False):
|
||||||
|
|
|
@ -86,6 +86,10 @@ class SubConfig(object):
|
||||||
master = descr.getmaster()
|
master = descr.getmaster()
|
||||||
context_ = context()
|
context_ = context()
|
||||||
masterp = master.impl_getpath(context_)
|
masterp = master.impl_getpath(context_)
|
||||||
|
context_.cfgimpl_get_settings().validate_properties(master,
|
||||||
|
masterp,
|
||||||
|
setting_properties,
|
||||||
|
force_permissive=force_permissive)
|
||||||
value = context_.cfgimpl_get_values().get_cached_value(master,
|
value = context_.cfgimpl_get_values().get_cached_value(master,
|
||||||
masterp,
|
masterp,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
|
@ -104,6 +108,7 @@ class SubConfig(object):
|
||||||
resetted_opts,
|
resetted_opts,
|
||||||
opt,
|
opt,
|
||||||
path):
|
path):
|
||||||
|
|
||||||
tresetted_opts = copy(resetted_opts)
|
tresetted_opts = copy(resetted_opts)
|
||||||
opt.reset_cache(opt,
|
opt.reset_cache(opt,
|
||||||
path,
|
path,
|
||||||
|
@ -121,7 +126,7 @@ class SubConfig(object):
|
||||||
option = woption()
|
option = woption()
|
||||||
if option in resetted_opts:
|
if option in resetted_opts:
|
||||||
continue
|
continue
|
||||||
option_path = opt.impl_getpath(self)
|
option_path = option.impl_getpath(self)
|
||||||
self.reset_one_option_cache(values,
|
self.reset_one_option_cache(values,
|
||||||
settings,
|
settings,
|
||||||
resetted_opts,
|
resetted_opts,
|
||||||
|
@ -139,17 +144,6 @@ class SubConfig(object):
|
||||||
:param only_expired: if True reset only expired cached values
|
:param only_expired: if True reset only expired cached values
|
||||||
:type only_expired: boolean
|
:type only_expired: boolean
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def reset_expired_cache():
|
|
||||||
# reset cache for expired cache value ony
|
|
||||||
datetime = int(time())
|
|
||||||
values._p_.reset_expired_cache(datetime)
|
|
||||||
settings._p_.reset_expired_cache(datetime)
|
|
||||||
|
|
||||||
def reset_all_cache():
|
|
||||||
values._p_.reset_all_cache()
|
|
||||||
settings._p_.reset_all_cache()
|
|
||||||
|
|
||||||
if resetted_opts is None:
|
if resetted_opts is None:
|
||||||
resetted_opts = set()
|
resetted_opts = set()
|
||||||
|
|
||||||
|
@ -166,9 +160,13 @@ class SubConfig(object):
|
||||||
path)
|
path)
|
||||||
|
|
||||||
elif only_expired:
|
elif only_expired:
|
||||||
reset_expired_cache()
|
# reset cache for expired cache value ony
|
||||||
|
datetime = int(time())
|
||||||
|
values._p_.reset_expired_cache(datetime)
|
||||||
|
settings._p_.reset_expired_cache(datetime)
|
||||||
else:
|
else:
|
||||||
reset_all_cache()
|
values._p_.reset_all_cache()
|
||||||
|
settings._p_.reset_all_cache()
|
||||||
|
|
||||||
def cfgimpl_get_home_by_path(self,
|
def cfgimpl_get_home_by_path(self,
|
||||||
path,
|
path,
|
||||||
|
@ -676,7 +674,7 @@ class SubConfig(object):
|
||||||
setting_properties=setting_properties):
|
setting_properties=setting_properties):
|
||||||
path = '.'.join(path.split('.')[:-1])
|
path = '.'.join(path.split('.')[:-1])
|
||||||
opt = context.unwrap_from_path(path,
|
opt = context.unwrap_from_path(path,
|
||||||
orce_permissive=True)
|
force_permissive=True)
|
||||||
mypath = self.cfgimpl_get_path()
|
mypath = self.cfgimpl_get_path()
|
||||||
if mypath is not None:
|
if mypath is not None:
|
||||||
if mypath == path:
|
if mypath == path:
|
||||||
|
@ -717,7 +715,7 @@ class SubConfig(object):
|
||||||
|
|
||||||
def _make_sub_dict(self,
|
def _make_sub_dict(self,
|
||||||
option,
|
option,
|
||||||
path,
|
name,
|
||||||
pathsvalues,
|
pathsvalues,
|
||||||
_currpath,
|
_currpath,
|
||||||
flatten,
|
flatten,
|
||||||
|
@ -730,17 +728,18 @@ class SubConfig(object):
|
||||||
length = self.cfgimpl_get_length()
|
length = self.cfgimpl_get_length()
|
||||||
if length:
|
if length:
|
||||||
for idx in range(length):
|
for idx in range(length):
|
||||||
ret.append(self.getattr(path,
|
ret.append(self.getattr(name,
|
||||||
index=idx,
|
index=idx,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
setting_properties=setting_properties))
|
setting_properties=setting_properties))
|
||||||
elif setting_properties:
|
elif setting_properties:
|
||||||
|
path = self._get_subpath(name)
|
||||||
self.cfgimpl_get_settings().validate_properties(option,
|
self.cfgimpl_get_settings().validate_properties(option,
|
||||||
path,
|
path,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
force_permissive=force_permissive)
|
force_permissive=force_permissive)
|
||||||
else:
|
else:
|
||||||
ret = self.getattr(path,
|
ret = self.getattr(name,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
except PropertiesOptionError:
|
except PropertiesOptionError:
|
||||||
|
@ -749,7 +748,7 @@ class SubConfig(object):
|
||||||
if option.impl_is_optiondescription():
|
if option.impl_is_optiondescription():
|
||||||
pathsvalues += ret.make_dict(setting_properties,
|
pathsvalues += ret.make_dict(setting_properties,
|
||||||
flatten=flatten,
|
flatten=flatten,
|
||||||
_currpath=_currpath + path.split('.'),
|
_currpath=_currpath + [name],
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
fullpath=fullpath)
|
fullpath=fullpath)
|
||||||
else:
|
else:
|
||||||
|
@ -764,7 +763,7 @@ class SubConfig(object):
|
||||||
# name = '.'.join([root_path, opt.impl_getname()])
|
# name = '.'.join([root_path, opt.impl_getname()])
|
||||||
name = self._get_subpath(name)
|
name = self._get_subpath(name)
|
||||||
else:
|
else:
|
||||||
name = '.'.join(_currpath + [option.impl_getname()])
|
name = '.'.join(_currpath + [name])
|
||||||
pathsvalues.append((name, ret))
|
pathsvalues.append((name, ret))
|
||||||
|
|
||||||
def cfgimpl_get_path(self,
|
def cfgimpl_get_path(self,
|
||||||
|
@ -789,30 +788,6 @@ class _CommonConfig(SubConfig):
|
||||||
descr.impl_build_force_store_values(self,
|
descr.impl_build_force_store_values(self,
|
||||||
force_store_values)
|
force_store_values)
|
||||||
|
|
||||||
def read_only(self):
|
|
||||||
"read only is a global config's setting, see `settings.py`"
|
|
||||||
self.cfgimpl_get_settings().read_only()
|
|
||||||
|
|
||||||
def read_write(self):
|
|
||||||
"read write is a global config's setting, see `settings.py`"
|
|
||||||
self.cfgimpl_get_settings().read_write()
|
|
||||||
|
|
||||||
def getowner(self,
|
|
||||||
opt,
|
|
||||||
index=None,
|
|
||||||
force_permissive=False):
|
|
||||||
"""convenience method to retrieve an option's owner
|
|
||||||
from the config itself
|
|
||||||
"""
|
|
||||||
if not isinstance(opt, Option) and \
|
|
||||||
not isinstance(opt, SymLinkOption) and \
|
|
||||||
not isinstance(opt, DynSymLinkOption): # pragma: optional cover
|
|
||||||
raise TypeError(_('opt in getowner must be an option not {0}'
|
|
||||||
'').format(type(opt)))
|
|
||||||
return self.cfgimpl_get_values().getowner(opt,
|
|
||||||
index=index,
|
|
||||||
force_permissive=force_permissive)
|
|
||||||
|
|
||||||
def unwrap_from_path(self,
|
def unwrap_from_path(self,
|
||||||
path,
|
path,
|
||||||
setting_properties=None,
|
setting_properties=None,
|
||||||
|
@ -847,7 +822,8 @@ class _CommonConfig(SubConfig):
|
||||||
else:
|
else:
|
||||||
true_option = option
|
true_option = option
|
||||||
true_path = path
|
true_path = path
|
||||||
if index is None and true_option.impl_is_master_slaves('slave'):
|
if not true_option.impl_is_optiondescription() and index is None and \
|
||||||
|
true_option.impl_is_master_slaves('slave'):
|
||||||
subpath = self._get_subpath(true_path)
|
subpath = self._get_subpath(true_path)
|
||||||
self.cfgimpl_get_settings().validate_properties(true_option,
|
self.cfgimpl_get_settings().validate_properties(true_option,
|
||||||
subpath,
|
subpath,
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
"user defined exceptions"
|
"user defined exceptions"
|
||||||
from .i18n import _
|
from .i18n import _
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def display_list(lst, separator='and'):
|
def display_list(lst, separator='and'):
|
||||||
|
@ -28,28 +27,22 @@ def display_list(lst, separator='and'):
|
||||||
return ''
|
return ''
|
||||||
elif len(lst) == 1:
|
elif len(lst) == 1:
|
||||||
ret = lst[0]
|
ret = lst[0]
|
||||||
if sys.version_info[0] < 3 and isinstance(ret, unicode):
|
|
||||||
ret = ret.encode('utf8')
|
|
||||||
if not isinstance(ret, str):
|
if not isinstance(ret, str):
|
||||||
ret = str(ret)
|
ret = str(ret)
|
||||||
return ret
|
return '"{}"'.format(ret)
|
||||||
else:
|
else:
|
||||||
if isinstance(lst, tuple):
|
if isinstance(lst, tuple):
|
||||||
lst = list(lst)
|
lst = list(lst)
|
||||||
lst.sort()
|
lst.sort()
|
||||||
lst_ = []
|
lst_ = []
|
||||||
for l in lst[:-1]:
|
for l in lst[:-1]:
|
||||||
if sys.version_info[0] < 3 and isinstance(l, unicode):
|
if not isinstance(l, str):
|
||||||
l = l.encode('utf8')
|
|
||||||
elif not isinstance(l, str):
|
|
||||||
l = str(l)
|
l = str(l)
|
||||||
lst_.append(l)
|
lst_.append(l)
|
||||||
last = lst[-1]
|
last = lst[-1]
|
||||||
if sys.version_info[0] < 3 and isinstance(last, unicode):
|
|
||||||
last = last.encode('utf8')
|
|
||||||
if not isinstance(last, str):
|
if not isinstance(last, str):
|
||||||
last = str(last)
|
last = str(last)
|
||||||
return ', '.join(lst_) + _(' {} ').format(separator) + last
|
return ', '.join(lst_) + _(' "{}" ').format(separator) + last
|
||||||
|
|
||||||
|
|
||||||
# Exceptions for an Option
|
# Exceptions for an Option
|
||||||
|
|
|
@ -56,17 +56,10 @@ def validate_callback(callback,
|
||||||
"""
|
"""
|
||||||
def _validate_option(option):
|
def _validate_option(option):
|
||||||
#validate option
|
#validate option
|
||||||
#FIXME etrange ...
|
if option.impl_is_symlinkoption():
|
||||||
if hasattr(option, 'impl_is_symlinkoption'):
|
cur_opt = option.impl_getopt()
|
||||||
if option.impl_is_symlinkoption():
|
|
||||||
cur_opt = option.impl_getopt()
|
|
||||||
else:
|
|
||||||
cur_opt = option
|
|
||||||
else:
|
else:
|
||||||
raise ValueError(_('{}_params must have an option'
|
cur_opt = option
|
||||||
' not a {} for first argument'
|
|
||||||
).format(type_,
|
|
||||||
type(option)))
|
|
||||||
if cur_opt != callbackoption:
|
if cur_opt != callbackoption:
|
||||||
cur_opt._add_dependency(callbackoption)
|
cur_opt._add_dependency(callbackoption)
|
||||||
callbackoption._has_dependency = True
|
callbackoption._has_dependency = True
|
||||||
|
@ -406,7 +399,7 @@ class BaseOption(Base):
|
||||||
def _impl_valid_string(self,
|
def _impl_valid_string(self,
|
||||||
value):
|
value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
return ValueError(_('invalid string'))
|
raise ValueError(_('invalid string'))
|
||||||
|
|
||||||
def impl_get_display_name(self,
|
def impl_get_display_name(self,
|
||||||
dyn_name=None):
|
dyn_name=None):
|
||||||
|
@ -498,7 +491,7 @@ def validate_requires_arg(new_option,
|
||||||
option = exp['option']
|
option = exp['option']
|
||||||
option._add_dependency(new_option)
|
option._add_dependency(new_option)
|
||||||
if option is not None:
|
if option is not None:
|
||||||
err = option._validate(exp['value'])
|
err = option._validate(exp['value'], undefined)
|
||||||
if err:
|
if err:
|
||||||
raise ValueError(_('malformed requirements expected value '
|
raise ValueError(_('malformed requirements expected value '
|
||||||
'must be valid for option {0}'
|
'must be valid for option {0}'
|
||||||
|
@ -513,7 +506,7 @@ def validate_requires_arg(new_option,
|
||||||
else:
|
else:
|
||||||
option = get_option(require)
|
option = get_option(require)
|
||||||
if expected is not None:
|
if expected is not None:
|
||||||
err = option._validate(expected)
|
err = option._validate(expected, undefined)
|
||||||
if err:
|
if err:
|
||||||
raise ValueError(_('malformed requirements expected value '
|
raise ValueError(_('malformed requirements expected value '
|
||||||
'must be valid for option {0}'
|
'must be valid for option {0}'
|
||||||
|
|
|
@ -29,6 +29,10 @@ class BoolOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('boolean')
|
_display_name = _('boolean')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
if not isinstance(value, bool):
|
if not isinstance(value, bool):
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
|
@ -30,26 +30,36 @@ class BroadcastOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('broadcast address')
|
_display_name = _('broadcast address')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
if value.count('.') != 3:
|
if value.count('.') != 3:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
for val in value.split('.'):
|
for val in value.split('.'):
|
||||||
if val.startswith("0") and len(val) > 1:
|
if val.startswith("0") and len(val) > 1:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
try:
|
try:
|
||||||
IP('{0}/32'.format(value))
|
IP('{0}/32'.format(value))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
def _cons_broadcast(self, current_opt, opts, vals, warnings_only):
|
def _cons_broadcast(self,
|
||||||
|
current_opt,
|
||||||
|
opts,
|
||||||
|
vals,
|
||||||
|
warnings_only):
|
||||||
if len(vals) != 3:
|
if len(vals) != 3:
|
||||||
return ConfigError(_('invalid len for vals'))
|
return ConfigError(_('invalid len for vals'))
|
||||||
if None in vals:
|
if None in vals:
|
||||||
return
|
return
|
||||||
broadcast, network, netmask = vals
|
broadcast, network, netmask = vals
|
||||||
if IP('{0}/{1}'.format(network, netmask)).broadcast() != IP(broadcast):
|
if IP('{0}/{1}'.format(network, netmask)).broadcast() != IP(broadcast):
|
||||||
return ValueError(_('broadcast {4} invalid with network {0}/{1} ({2}/{3})').format(
|
raise ValueError(_('broadcast "{4}" invalid with network {0}/{1} ("{2}"/"{3}")'
|
||||||
network, netmask, opts[1].impl_getname(), opts[2].impl_getname(), broadcast))
|
'').format(network,
|
||||||
|
netmask,
|
||||||
|
opts[1].impl_get_display_name(),
|
||||||
|
opts[2].impl_get_display_name(),
|
||||||
|
broadcast))
|
||||||
|
|
|
@ -36,16 +36,30 @@ class ChoiceOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('choice')
|
_display_name = _('choice')
|
||||||
|
|
||||||
def __init__(self, name, doc, values, default=None,
|
def __init__(self,
|
||||||
values_params=None, default_multi=None, requires=None,
|
name,
|
||||||
multi=False, callback=None, callback_params=None,
|
doc,
|
||||||
validator=None, validator_params=None,
|
values,
|
||||||
properties=None, warnings_only=False):
|
default=None,
|
||||||
|
values_params=None,
|
||||||
|
default_multi=None,
|
||||||
|
requires=None,
|
||||||
|
multi=False,
|
||||||
|
callback=None,
|
||||||
|
callback_params=None,
|
||||||
|
validator=None,
|
||||||
|
validator_params=None,
|
||||||
|
properties=None,
|
||||||
|
warnings_only=False):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
:param values: is a list of values the option can possibly take
|
:param values: is a list of values the option can possibly take
|
||||||
"""
|
"""
|
||||||
if isinstance(values, FunctionType):
|
if isinstance(values, FunctionType):
|
||||||
validate_callback(values, values_params, 'values', self)
|
validate_callback(values,
|
||||||
|
values_params,
|
||||||
|
'values',
|
||||||
|
self)
|
||||||
else:
|
else:
|
||||||
if values_params is not None:
|
if values_params is not None:
|
||||||
raise ValueError(_('values is not a function, so values_params must be None'))
|
raise ValueError(_('values is not a function, so values_params must be None'))
|
||||||
|
@ -55,7 +69,9 @@ class ChoiceOption(Option):
|
||||||
self._choice_values = values
|
self._choice_values = values
|
||||||
if values_params is not None:
|
if values_params is not None:
|
||||||
self._choice_values_params = values_params
|
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,
|
||||||
callback_params=callback_params,
|
callback_params=callback_params,
|
||||||
|
@ -66,7 +82,10 @@ class ChoiceOption(Option):
|
||||||
properties=properties,
|
properties=properties,
|
||||||
warnings_only=warnings_only)
|
warnings_only=warnings_only)
|
||||||
|
|
||||||
def impl_get_values(self, context, current_opt=undefined):
|
def impl_get_values(self,
|
||||||
|
setting_properties,
|
||||||
|
context,
|
||||||
|
current_opt=undefined):
|
||||||
if current_opt is undefined:
|
if current_opt is undefined:
|
||||||
current_opt = self
|
current_opt = self
|
||||||
#FIXME cache? but in context...
|
#FIXME cache? but in context...
|
||||||
|
@ -75,25 +94,29 @@ class ChoiceOption(Option):
|
||||||
if context is None:
|
if context is None:
|
||||||
values = []
|
values = []
|
||||||
else:
|
else:
|
||||||
values = carry_out_calculation(current_opt, context=context,
|
values = carry_out_calculation(current_opt,
|
||||||
|
setting_properties=setting_properties,
|
||||||
|
context=context,
|
||||||
callback=values,
|
callback=values,
|
||||||
callback_params=getattr(self, '_choice_values_params', {}))
|
callback_params=getattr(self, '_choice_values_params', {}))
|
||||||
if isinstance(values, Exception):
|
|
||||||
return values
|
|
||||||
if values is not undefined and not isinstance(values, list):
|
if values is not undefined and not isinstance(values, list):
|
||||||
raise ConfigError(_('calculated values for {0} is not a list'
|
raise ConfigError(_('calculated values for {0} is not a list'
|
||||||
'').format(self.impl_getname()))
|
'').format(self.impl_getname()))
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
values = self.impl_get_values(context, current_opt=current_opt)
|
value,
|
||||||
if isinstance(values, Exception):
|
setting_properties,
|
||||||
return values
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
values = self.impl_get_values(setting_properties,
|
||||||
|
context,
|
||||||
|
current_opt=current_opt)
|
||||||
if values is not undefined and not value in values:
|
if values is not undefined and not value in values:
|
||||||
if len(values) == 1:
|
if len(values) == 1:
|
||||||
return ValueError(_('only {0} is allowed'
|
raise ValueError(_('only {0} is allowed'
|
||||||
'').format(values[0]))
|
'').format(values[0]))
|
||||||
else:
|
else:
|
||||||
return ValueError(_('only {0} are allowed'
|
raise ValueError(_('only {0} are allowed'
|
||||||
'').format(display_list(values)))
|
'').format(display_list(values)))
|
||||||
|
|
|
@ -29,11 +29,13 @@ class DateOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('date')
|
_display_name = _('date')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
try:
|
try:
|
||||||
datetime.strptime(value, "%Y-%m-%d")
|
datetime.strptime(value, "%Y-%m-%d")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
|
@ -36,11 +36,23 @@ class DomainnameOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('domain name')
|
_display_name = _('domain name')
|
||||||
|
|
||||||
def __init__(self, name, doc, default=None, default_multi=None,
|
def __init__(self,
|
||||||
requires=None, multi=False, callback=None,
|
name,
|
||||||
callback_params=None, validator=None, validator_params=None,
|
doc,
|
||||||
properties=None, allow_ip=False, type_='domainname',
|
default=None,
|
||||||
warnings_only=False, allow_without_dot=False):
|
default_multi=None,
|
||||||
|
requires=None,
|
||||||
|
multi=False,
|
||||||
|
callback=None,
|
||||||
|
callback_params=None,
|
||||||
|
validator=None,
|
||||||
|
validator_params=None,
|
||||||
|
properties=None,
|
||||||
|
allow_ip=False,
|
||||||
|
type_='domainname',
|
||||||
|
warnings_only=False,
|
||||||
|
allow_without_dot=False):
|
||||||
|
|
||||||
if type_ not in ['netbios', 'hostname', 'domainname']:
|
if type_ not in ['netbios', 'hostname', 'domainname']:
|
||||||
raise ValueError(_('unknown type_ {0} for hostname').format(type_))
|
raise ValueError(_('unknown type_ {0} for hostname').format(type_))
|
||||||
extra = {'_dom_type': type_}
|
extra = {'_dom_type': type_}
|
||||||
|
@ -50,8 +62,6 @@ class DomainnameOption(Option):
|
||||||
raise ValueError(_('allow_without_dot must be a boolean'))
|
raise ValueError(_('allow_without_dot must be a boolean'))
|
||||||
extra['_allow_ip'] = allow_ip
|
extra['_allow_ip'] = allow_ip
|
||||||
extra['_allow_without_dot'] = allow_without_dot
|
extra['_allow_without_dot'] = allow_without_dot
|
||||||
# FIXME should be
|
|
||||||
# regexp = r'^((?!-)[a-z0-9-]{1,63}(?<!-)\.{0,1})$'
|
|
||||||
if type_ == 'domainname':
|
if type_ == 'domainname':
|
||||||
if allow_without_dot:
|
if allow_without_dot:
|
||||||
min_time = 0
|
min_time = 0
|
||||||
|
@ -67,7 +77,9 @@ class DomainnameOption(Option):
|
||||||
extra['_domain_re'] = re.compile(regexp)
|
extra['_domain_re'] = re.compile(regexp)
|
||||||
extra['_has_upper'] = re.compile('[A-Z]')
|
extra['_has_upper'] = re.compile('[A-Z]')
|
||||||
|
|
||||||
super(DomainnameOption, self).__init__(name, doc, default=default,
|
super(DomainnameOption, self).__init__(name,
|
||||||
|
doc,
|
||||||
|
default=default,
|
||||||
default_multi=default_multi,
|
default_multi=default_multi,
|
||||||
callback=callback,
|
callback=callback,
|
||||||
callback_params=callback_params,
|
callback_params=callback_params,
|
||||||
|
@ -85,49 +97,50 @@ class DomainnameOption(Option):
|
||||||
else:
|
else:
|
||||||
return 63
|
return 63
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
|
|
||||||
def _valid_length(val):
|
def _valid_length(val):
|
||||||
if len(val) < 1:
|
if len(val) < 1:
|
||||||
return ValueError(_("invalid length (min 1)"))
|
raise ValueError(_("invalid length (min 1)"))
|
||||||
if len(val) > part_name_length:
|
if len(val) > part_name_length:
|
||||||
return ValueError(_("invalid length (max {0})"
|
raise ValueError(_("invalid length (max {0})"
|
||||||
"").format(part_name_length))
|
"").format(part_name_length))
|
||||||
|
|
||||||
if self._get_extra('_allow_ip') is True:
|
if self._get_extra('_allow_ip') is True:
|
||||||
try:
|
try:
|
||||||
IP('{0}/32'.format(value))
|
IP('{0}/32'.format(value))
|
||||||
return
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
else:
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
IP('{0}/32'.format(value))
|
IP('{0}/32'.format(value))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
return ValueError(_('must not be an IP'))
|
raise ValueError(_('must not be an IP'))
|
||||||
part_name_length = self._get_len(self._get_extra('_dom_type'))
|
part_name_length = self._get_len(self._get_extra('_dom_type'))
|
||||||
if self._get_extra('_dom_type') == 'domainname':
|
if self._get_extra('_dom_type') == 'domainname':
|
||||||
if not self._get_extra('_allow_without_dot') and not "." in value:
|
if not self._get_extra('_allow_without_dot') and not "." in value:
|
||||||
return ValueError(_("must have dot"))
|
raise ValueError(_("must have dot"))
|
||||||
if len(value) > 255:
|
if len(value) > 255:
|
||||||
return ValueError(_("invalid length (max 255)"))
|
raise ValueError(_("invalid length (max 255)"))
|
||||||
for dom in value.split('.'):
|
for dom in value.split('.'):
|
||||||
err = _valid_length(dom)
|
_valid_length(dom)
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
else:
|
else:
|
||||||
return _valid_length(value)
|
_valid_length(value)
|
||||||
|
|
||||||
def _second_level_validation(self, value, warnings_only):
|
def _second_level_validation(self, value, warnings_only):
|
||||||
if self._get_extra('_has_upper').search(value):
|
if self._get_extra('_has_upper').search(value):
|
||||||
return ValueError(_('some characters are uppercase'))
|
raise ValueError(_('some characters are uppercase'))
|
||||||
if not self._get_extra('_domain_re').search(value):
|
if not self._get_extra('_domain_re').search(value):
|
||||||
if warnings_only:
|
if warnings_only:
|
||||||
return ValueError(_('some characters may cause problems'))
|
raise ValueError(_('some characters may cause problems'))
|
||||||
else:
|
else:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
|
@ -29,6 +29,10 @@ class FloatOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('float')
|
_display_name = _('float')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
if not isinstance(value, float):
|
if not isinstance(value, float):
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
|
@ -29,6 +29,10 @@ class IntOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('integer')
|
_display_name = _('integer')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
if not isinstance(value, int):
|
if not isinstance(value, int):
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
|
@ -31,14 +31,26 @@ class IPOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('IP')
|
_display_name = _('IP')
|
||||||
|
|
||||||
def __init__(self, name, doc, default=None, default_multi=None,
|
def __init__(self,
|
||||||
requires=None, multi=False, callback=None,
|
name,
|
||||||
callback_params=None, validator=None, validator_params=None,
|
doc,
|
||||||
properties=None, private_only=False, allow_reserved=False,
|
default=None,
|
||||||
|
default_multi=None,
|
||||||
|
requires=None,
|
||||||
|
multi=False,
|
||||||
|
callback=None,
|
||||||
|
callback_params=None,
|
||||||
|
validator=None,
|
||||||
|
validator_params=None,
|
||||||
|
properties=None,
|
||||||
|
private_only=False,
|
||||||
|
allow_reserved=False,
|
||||||
warnings_only=False):
|
warnings_only=False):
|
||||||
extra = {'_private_only': private_only,
|
extra = {'_private_only': private_only,
|
||||||
'_allow_reserved': allow_reserved}
|
'_allow_reserved': allow_reserved}
|
||||||
super(IPOption, self).__init__(name, doc, default=default,
|
super(IPOption, self).__init__(name,
|
||||||
|
doc,
|
||||||
|
default=default,
|
||||||
default_multi=default_multi,
|
default_multi=default_multi,
|
||||||
callback=callback,
|
callback=callback,
|
||||||
callback_params=callback_params,
|
callback_params=callback_params,
|
||||||
|
@ -50,47 +62,62 @@ class IPOption(Option):
|
||||||
warnings_only=warnings_only,
|
warnings_only=warnings_only,
|
||||||
extra=extra)
|
extra=extra)
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
# sometimes an ip term starts with a zero
|
# sometimes an ip term starts with a zero
|
||||||
# but this does not fit in some case, for example bind does not like it
|
# but this does not fit in some case, for example bind does not like it
|
||||||
err = self._impl_valid_string(value)
|
self._impl_valid_string(value)
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
if value.count('.') != 3:
|
if value.count('.') != 3:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
for val in value.split('.'):
|
for val in value.split('.'):
|
||||||
if val.startswith("0") and len(val) > 1:
|
if val.startswith("0") and len(val) > 1:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
# 'standard' validation
|
# 'standard' validation
|
||||||
try:
|
try:
|
||||||
IP('{0}/32'.format(value))
|
IP('{0}/32'.format(value))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
def _second_level_validation(self, value, warnings_only):
|
def _second_level_validation(self,
|
||||||
|
value,
|
||||||
|
warnings_only):
|
||||||
ip = IP('{0}/32'.format(value))
|
ip = IP('{0}/32'.format(value))
|
||||||
if not self._get_extra('_allow_reserved') and ip.iptype() == 'RESERVED':
|
if not self._get_extra('_allow_reserved') and ip.iptype() == 'RESERVED':
|
||||||
if warnings_only:
|
if warnings_only:
|
||||||
msg = _("shouldn't in reserved class")
|
msg = _("shouldn't in reserved class")
|
||||||
else:
|
else:
|
||||||
msg = _("mustn't be in reserved class")
|
msg = _("mustn't be in reserved class")
|
||||||
return ValueError(msg)
|
raise ValueError(msg)
|
||||||
if self._get_extra('_private_only') and ip.iptype() != 'PRIVATE':
|
if self._get_extra('_private_only') and ip.iptype() != 'PRIVATE':
|
||||||
if warnings_only:
|
if warnings_only:
|
||||||
msg = _("should be in private class")
|
msg = _("should be in private class")
|
||||||
else:
|
else:
|
||||||
msg = _("must be in private class")
|
msg = _("must be in private class")
|
||||||
return ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
def _cons_in_network(self, current_opt, opts, vals, warnings_only):
|
def _cons_in_network(self,
|
||||||
|
current_opt,
|
||||||
|
opts,
|
||||||
|
vals,
|
||||||
|
warnings_only):
|
||||||
if len(vals) != 3:
|
if len(vals) != 3:
|
||||||
return ConfigError(_('invalid len for vals'))
|
return ConfigError(_('invalid len for vals'))
|
||||||
if None in vals:
|
if None in vals:
|
||||||
return
|
return
|
||||||
ip, network, netmask = vals
|
ip, network, netmask = vals
|
||||||
if IP(ip) not in IP('{0}/{1}'.format(network, netmask)):
|
if IP(ip) not in IP('{0}/{1}'.format(network,
|
||||||
msg = _('{4} is not in network {0}/{1} ({2}/{3})')
|
netmask)):
|
||||||
return ValueError(msg.format(network, netmask,
|
msg = _('"{4}" is not in network "{0}"/"{1}" ("{2}"/"{3}")')
|
||||||
opts[1].impl_getname(), opts[2].impl_getname(), ip))
|
raise ValueError(msg.format(network,
|
||||||
|
netmask,
|
||||||
|
opts[1].impl_get_display_name(),
|
||||||
|
opts[2].impl_getname(),
|
||||||
|
ip))
|
||||||
# test if ip is not network/broadcast IP
|
# test if ip is not network/broadcast IP
|
||||||
return opts[2]._cons_ip_netmask(current_opt, (opts[2], opts[0]), (netmask, ip), warnings_only)
|
opts[2]._cons_ip_netmask(current_opt,
|
||||||
|
(opts[2], opts[0]),
|
||||||
|
(netmask, ip),
|
||||||
|
warnings_only)
|
||||||
|
|
|
@ -175,7 +175,7 @@ class MasterSlaves(OptionDescription):
|
||||||
context):
|
context):
|
||||||
if option.impl_is_master_slaves('master') and isinstance(value, list):
|
if option.impl_is_master_slaves('master') and isinstance(value, list):
|
||||||
if len(value) < context._impl_length:
|
if len(value) < context._impl_length:
|
||||||
return ValueError(_('cannot reduce length of master "{}"'
|
raise ValueError(_('cannot reduce length of master "{}"'
|
||||||
'').format(option.impl_get_display_name()))
|
'').format(option.impl_get_display_name()))
|
||||||
|
|
||||||
def is_masterslaves(self):
|
def is_masterslaves(self):
|
||||||
|
|
|
@ -31,50 +31,72 @@ class NetmaskOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('netmask address')
|
_display_name = _('netmask address')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
if value.count('.') != 3:
|
if value.count('.') != 3:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
for val in value.split('.'):
|
for val in value.split('.'):
|
||||||
if val.startswith("0") and len(val) > 1:
|
if val.startswith("0") and len(val) > 1:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
try:
|
try:
|
||||||
IP('0.0.0.0/{0}'.format(value))
|
IP('0.0.0.0/{0}'.format(value))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
def _cons_network_netmask(self, current_opt, opts, vals, warnings_only):
|
def _cons_network_netmask(self,
|
||||||
|
current_opt,
|
||||||
|
opts,
|
||||||
|
vals,
|
||||||
|
warnings_only):
|
||||||
#opts must be (netmask, network) options
|
#opts must be (netmask, network) options
|
||||||
if None in vals:
|
if None in vals:
|
||||||
return
|
return
|
||||||
return self.__cons_netmask(opts, vals[0], vals[1], False, warnings_only)
|
return self.__cons_netmask(opts,
|
||||||
|
vals[0],
|
||||||
|
vals[1],
|
||||||
|
False,
|
||||||
|
warnings_only)
|
||||||
|
|
||||||
def _cons_ip_netmask(self, current_opt, opts, vals, warnings_only):
|
def _cons_ip_netmask(self,
|
||||||
|
current_opt,
|
||||||
|
opts,
|
||||||
|
vals,
|
||||||
|
warnings_only):
|
||||||
#opts must be (netmask, ip) options
|
#opts must be (netmask, ip) options
|
||||||
if None in vals:
|
if None in vals:
|
||||||
return
|
return
|
||||||
return self.__cons_netmask(opts, vals[0], vals[1], True, warnings_only)
|
self.__cons_netmask(opts,
|
||||||
|
vals[0],
|
||||||
|
vals[1],
|
||||||
|
True,
|
||||||
|
warnings_only)
|
||||||
|
|
||||||
def __cons_netmask(self, opts, val_netmask, val_ipnetwork, make_net,
|
def __cons_netmask(self,
|
||||||
|
opts,
|
||||||
|
val_netmask,
|
||||||
|
val_ipnetwork,
|
||||||
|
make_net,
|
||||||
warnings_only):
|
warnings_only):
|
||||||
if len(opts) != 2:
|
if len(opts) != 2:
|
||||||
return ConfigError(_('invalid len for opts'))
|
return ConfigError(_('invalid len for opts'))
|
||||||
msg = None
|
msg = None
|
||||||
try:
|
try:
|
||||||
ip = IP('{0}/{1}'.format(val_ipnetwork, val_netmask),
|
ip = IP('{0}/{1}'.format(val_ipnetwork, val_netmask), make_net=make_net)
|
||||||
make_net=make_net)
|
|
||||||
#if cidr == 32, ip same has network
|
#if cidr == 32, ip same has network
|
||||||
if make_net and ip.prefixlen() != 32:
|
if make_net and ip.prefixlen() != 32:
|
||||||
val_ip = IP(val_ipnetwork)
|
val_ip = IP(val_ipnetwork)
|
||||||
if ip.net() == val_ip:
|
if ip.net() == val_ip:
|
||||||
msg = _("this is a network with netmask {0} ({1})")
|
msg = _('this is a network with netmask "{0}" ("{1}")')
|
||||||
if ip.broadcast() == val_ip:
|
if ip.broadcast() == val_ip:
|
||||||
msg = _("this is a broadcast with netmask {0} ({1})")
|
msg = _('this is a broadcast with netmask "{0}" ("{1}")')
|
||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
if not make_net:
|
if not make_net:
|
||||||
msg = _('with netmask {0} ({1})')
|
msg = _('with netmask "{0}" ("{1}")')
|
||||||
if msg is not None:
|
if msg is not None:
|
||||||
return ValueError(msg.format(val_netmask, opts[1].impl_getname()))
|
raise ValueError(msg.format(val_netmask,
|
||||||
|
opts[1].impl_get_diplay_name()))
|
||||||
|
|
|
@ -30,25 +30,29 @@ class NetworkOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('network address')
|
_display_name = _('network address')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
if value.count('.') != 3:
|
if value.count('.') != 3:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
for val in value.split('.'):
|
for val in value.split('.'):
|
||||||
if val.startswith("0") and len(val) > 1:
|
if val.startswith("0") and len(val) > 1:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
try:
|
try:
|
||||||
IP(value)
|
IP(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
def _second_level_validation(self, value, warnings_only):
|
def _second_level_validation(self,
|
||||||
|
value,
|
||||||
|
warnings_only):
|
||||||
ip = IP(value)
|
ip = IP(value)
|
||||||
if ip.iptype() == 'RESERVED':
|
if ip.iptype() == 'RESERVED':
|
||||||
if warnings_only:
|
if warnings_only:
|
||||||
msg = _("shouldn't be in reserved class")
|
msg = _("shouldn't be in reserved class")
|
||||||
else:
|
else:
|
||||||
msg = _("mustn't be in reserved class")
|
msg = _("mustn't be in reserved class")
|
||||||
return ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
|
@ -133,7 +133,8 @@ class Option(OnlyOption):
|
||||||
is_multi=is_multi)
|
is_multi=is_multi)
|
||||||
if is_multi and default_multi is not None:
|
if is_multi and default_multi is not None:
|
||||||
def test_multi_value(value):
|
def test_multi_value(value):
|
||||||
err = self._validate(value)
|
err = self._validate(value,
|
||||||
|
undefined)
|
||||||
if err:
|
if err:
|
||||||
raise ValueError(_("invalid default_multi value {0} "
|
raise ValueError(_("invalid default_multi value {0} "
|
||||||
"for option {1}: {2}").format(str(value),
|
"for option {1}: {2}").format(str(value),
|
||||||
|
@ -152,10 +153,8 @@ class Option(OnlyOption):
|
||||||
_setattr(self, '_default_multi', default_multi)
|
_setattr(self, '_default_multi', default_multi)
|
||||||
if unique is not undefined:
|
if unique is not undefined:
|
||||||
_setattr(self, '_unique', unique)
|
_setattr(self, '_unique', unique)
|
||||||
err = self.impl_validate(default,
|
self.impl_validate(default,
|
||||||
is_multi=is_multi)
|
is_multi=is_multi)
|
||||||
if err:
|
|
||||||
raise err
|
|
||||||
if (is_multi and default != []) or \
|
if (is_multi and default != []) or \
|
||||||
(not is_multi and default is not None):
|
(not is_multi and default is not None):
|
||||||
if is_multi:
|
if is_multi:
|
||||||
|
@ -300,8 +299,7 @@ class Option(OnlyOption):
|
||||||
force_index=None,
|
force_index=None,
|
||||||
current_opt=undefined,
|
current_opt=undefined,
|
||||||
is_multi=None,
|
is_multi=None,
|
||||||
display_error=True,
|
check_error=True,
|
||||||
display_warnings=True,
|
|
||||||
multi=None,
|
multi=None,
|
||||||
setting_properties=undefined):
|
setting_properties=undefined):
|
||||||
"""
|
"""
|
||||||
|
@ -315,14 +313,13 @@ class Option(OnlyOption):
|
||||||
"""
|
"""
|
||||||
if current_opt is undefined:
|
if current_opt is undefined:
|
||||||
current_opt = self
|
current_opt = self
|
||||||
|
|
||||||
if display_warnings and setting_properties is undefined and context is not undefined:
|
if check_error is False and not 'warnings' in setting_properties:
|
||||||
setting_properties = context.cfgimpl_get_settings()._getproperties(read_write=False)
|
return
|
||||||
display_warnings = display_warnings and (setting_properties is undefined or 'warnings' in setting_properties)
|
|
||||||
|
|
||||||
def _is_not_unique(value):
|
def _is_not_unique(value):
|
||||||
#FIXME pourquoi la longueur doit etre egal ???
|
#FIXME pourquoi la longueur doit etre egal ???
|
||||||
if display_error and self.impl_is_unique() and len(set(value)) != len(value):
|
if check_error and self.impl_is_unique() and len(set(value)) != len(value):
|
||||||
for idx, val in enumerate(value):
|
for idx, val in enumerate(value):
|
||||||
if val in value[idx+1:]:
|
if val in value[idx+1:]:
|
||||||
raise ValueError(_('invalid value "{}", this value is already in "{}"'
|
raise ValueError(_('invalid value "{}", this value is already in "{}"'
|
||||||
|
@ -361,16 +358,18 @@ class Option(OnlyOption):
|
||||||
raise ValueError(_('invalid value "{}" for "{}" '
|
raise ValueError(_('invalid value "{}" for "{}" '
|
||||||
'which must not be a list').format(_value,
|
'which must not be a list').format(_value,
|
||||||
self.impl_get_display_name()))
|
self.impl_get_display_name()))
|
||||||
|
#FIXME a revoir ...
|
||||||
is_warnings_only = getattr(self, '_warnings_only', False)
|
is_warnings_only = getattr(self, '_warnings_only', False)
|
||||||
try:
|
try:
|
||||||
if _value is not None:
|
if _value is not None:
|
||||||
if display_error:
|
if check_error:
|
||||||
# option validation
|
# option validation
|
||||||
self._validate(_value,
|
self._validate(_value,
|
||||||
|
setting_properties,
|
||||||
context,
|
context,
|
||||||
current_opt)
|
current_opt)
|
||||||
if ((display_error and not is_warnings_only) or
|
if ((check_error and not is_warnings_only) or
|
||||||
(display_warnings and is_warnings_only)):
|
(not check_error and is_warnings_only)):
|
||||||
calculation_validator(_value,
|
calculation_validator(_value,
|
||||||
_index)
|
_index)
|
||||||
self._second_level_validation(_value,
|
self._second_level_validation(_value,
|
||||||
|
@ -379,8 +378,7 @@ class Option(OnlyOption):
|
||||||
_value,
|
_value,
|
||||||
context,
|
context,
|
||||||
_index,
|
_index,
|
||||||
display_warnings,
|
check_error,
|
||||||
display_error,
|
|
||||||
setting_properties)
|
setting_properties)
|
||||||
except ValueError as err:
|
except ValueError as err:
|
||||||
if debug: # pragma: no cover
|
if debug: # pragma: no cover
|
||||||
|
@ -402,12 +400,12 @@ class Option(OnlyOption):
|
||||||
err_msg = '{0}'.format(err)
|
err_msg = '{0}'.format(err)
|
||||||
if err_msg:
|
if err_msg:
|
||||||
msg += ', {}'.format(err_msg)
|
msg += ', {}'.format(err_msg)
|
||||||
if is_warnings_only:
|
if check_error:
|
||||||
|
raise ValueError(msg)
|
||||||
|
else:
|
||||||
warnings.warn_explicit(ValueWarning(msg, self),
|
warnings.warn_explicit(ValueWarning(msg, self),
|
||||||
ValueWarning,
|
ValueWarning,
|
||||||
self.__class__.__name__, 0)
|
self.__class__.__name__, 0)
|
||||||
else:
|
|
||||||
raise ValueError(msg)
|
|
||||||
|
|
||||||
if is_multi is None:
|
if is_multi is None:
|
||||||
is_multi = self.impl_is_multi()
|
is_multi = self.impl_is_multi()
|
||||||
|
@ -563,10 +561,10 @@ class Option(OnlyOption):
|
||||||
all_cons_opts,
|
all_cons_opts,
|
||||||
params)
|
params)
|
||||||
#validate default value when add consistency
|
#validate default value when add consistency
|
||||||
err = self.impl_validate(self.impl_getdefault())
|
self.impl_validate(self.impl_getdefault())
|
||||||
if err:
|
#FIXME
|
||||||
self._del_consistency()
|
#if err:
|
||||||
raise err
|
# self._del_consistency()
|
||||||
if func != '_cons_not_equal':
|
if func != '_cons_not_equal':
|
||||||
#consistency could generate warnings or errors
|
#consistency could generate warnings or errors
|
||||||
self._has_dependency = True
|
self._has_dependency = True
|
||||||
|
@ -584,8 +582,7 @@ class Option(OnlyOption):
|
||||||
value,
|
value,
|
||||||
context,
|
context,
|
||||||
index,
|
index,
|
||||||
display_warnings,
|
check_error,
|
||||||
display_error,
|
|
||||||
setting_properties):
|
setting_properties):
|
||||||
if context is not undefined:
|
if context is not undefined:
|
||||||
descr = context.cfgimpl_get_description()
|
descr = context.cfgimpl_get_description()
|
||||||
|
@ -601,7 +598,7 @@ class Option(OnlyOption):
|
||||||
if consistencies is not None:
|
if consistencies is not None:
|
||||||
for func, all_cons_opts, params in consistencies:
|
for func, all_cons_opts, params in consistencies:
|
||||||
warnings_only = params.get('warnings_only', False)
|
warnings_only = params.get('warnings_only', False)
|
||||||
if (warnings_only and display_warnings) or (not warnings_only and display_error):
|
if (warnings_only and not check_error) or (not warnings_only and check_error):
|
||||||
transitive = params.get('transitive', True)
|
transitive = params.get('transitive', True)
|
||||||
#all_cons_opts[0] is the option where func is set
|
#all_cons_opts[0] is the option where func is set
|
||||||
if isinstance(option, DynSymLinkOption):
|
if isinstance(option, DynSymLinkOption):
|
||||||
|
@ -745,6 +742,7 @@ class RegexpOption(Option):
|
||||||
|
|
||||||
def _validate(self,
|
def _validate(self,
|
||||||
value,
|
value,
|
||||||
|
setting_properties,
|
||||||
context=undefined,
|
context=undefined,
|
||||||
current_opt=undefined):
|
current_opt=undefined):
|
||||||
err = self._impl_valid_string(value)
|
err = self._impl_valid_string(value)
|
||||||
|
|
|
@ -99,7 +99,7 @@ class CacheOptionDescription(BaseOption):
|
||||||
params))
|
params))
|
||||||
# if context is set to callback, must be reset each time a value change
|
# if context is set to callback, must be reset each time a value change
|
||||||
if hasattr(option, '_has_calc_context'):
|
if hasattr(option, '_has_calc_context'):
|
||||||
_dependencies.append(option)
|
self._add_dependency(option)
|
||||||
is_slave = None
|
is_slave = None
|
||||||
if is_multi:
|
if is_multi:
|
||||||
all_requires = option.impl_getrequires()
|
all_requires = option.impl_getrequires()
|
||||||
|
@ -150,10 +150,10 @@ class CacheOptionDescription(BaseOption):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def impl_build_force_store_values(self,
|
def impl_build_force_store_values(self,
|
||||||
config,
|
context,
|
||||||
force_store_values):
|
force_store_values):
|
||||||
session = config._impl_values._p_.getsession()
|
value_setted = False
|
||||||
value_set = False
|
values = context.cfgimpl_get_values()
|
||||||
for subpath, option in self._cache_force_store_values:
|
for subpath, option in self._cache_force_store_values:
|
||||||
if option.impl_is_master_slaves('slave'):
|
if option.impl_is_master_slaves('slave'):
|
||||||
# problem with index
|
# problem with index
|
||||||
|
@ -162,19 +162,24 @@ class CacheOptionDescription(BaseOption):
|
||||||
if option._is_subdyn():
|
if option._is_subdyn():
|
||||||
raise ConfigError(_('a dynoption ({0}) cannot have '
|
raise ConfigError(_('a dynoption ({0}) cannot have '
|
||||||
'force_store_value property').format(subpath))
|
'force_store_value property').format(subpath))
|
||||||
if force_store_values and not config._impl_values._p_.hasvalue(subpath, session):
|
if force_store_values is False:
|
||||||
value = impl_build_force_store_values.getvalue(option,
|
raise Exception('ok ca existe ...')
|
||||||
subpath,
|
if force_store_values and not values._p_.hasvalue(subpath):
|
||||||
index=None,
|
value = values.getvalue(option,
|
||||||
setting_properties=undefined,
|
subpath,
|
||||||
self_properties=undefined,
|
index=None,
|
||||||
validate=False)
|
setting_properties=None,
|
||||||
value_set = True
|
self_properties=None,
|
||||||
config._impl_values._p_.setvalue(subpath, value,
|
validate=False)
|
||||||
owners.forced, None, session, False)
|
value_setted = True
|
||||||
|
values._p_.setvalue(subpath,
|
||||||
|
value,
|
||||||
|
owners.forced,
|
||||||
|
None,
|
||||||
|
False)
|
||||||
|
|
||||||
if value_set:
|
if value_setted:
|
||||||
config._impl_values._p_.commit()
|
values._p_.commit()
|
||||||
|
|
||||||
def _build_cache_option(self,
|
def _build_cache_option(self,
|
||||||
_currpath=None,
|
_currpath=None,
|
||||||
|
|
|
@ -29,7 +29,9 @@ class PasswordOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('password')
|
_display_name = _('password')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
|
|
|
@ -40,12 +40,25 @@ class PortOption(Option):
|
||||||
port_re = re.compile(r"^[0-9]*$")
|
port_re = re.compile(r"^[0-9]*$")
|
||||||
_display_name = _('port')
|
_display_name = _('port')
|
||||||
|
|
||||||
def __init__(self, name, doc, default=None, default_multi=None,
|
def __init__(self,
|
||||||
requires=None, multi=False, callback=None,
|
name,
|
||||||
callback_params=None, validator=None, validator_params=None,
|
doc,
|
||||||
properties=None, allow_range=False, allow_zero=False,
|
default=None,
|
||||||
allow_wellknown=True, allow_registred=True,
|
default_multi=None,
|
||||||
allow_private=False, warnings_only=False):
|
requires=None,
|
||||||
|
multi=False,
|
||||||
|
callback=None,
|
||||||
|
callback_params=None,
|
||||||
|
validator=None,
|
||||||
|
validator_params=None,
|
||||||
|
properties=None,
|
||||||
|
allow_range=False,
|
||||||
|
allow_zero=False,
|
||||||
|
allow_wellknown=True,
|
||||||
|
allow_registred=True,
|
||||||
|
allow_private=False,
|
||||||
|
warnings_only=False):
|
||||||
|
|
||||||
extra = {'_allow_range': allow_range,
|
extra = {'_allow_range': allow_range,
|
||||||
'_min_value': None,
|
'_min_value': None,
|
||||||
'_max_value': None}
|
'_max_value': None}
|
||||||
|
@ -69,7 +82,9 @@ class PortOption(Option):
|
||||||
if extra['_max_value'] is None:
|
if extra['_max_value'] is None:
|
||||||
raise ValueError(_('max value is empty'))
|
raise ValueError(_('max value is empty'))
|
||||||
|
|
||||||
super(PortOption, self).__init__(name, doc, default=default,
|
super(PortOption, self).__init__(name,
|
||||||
|
doc,
|
||||||
|
default=default,
|
||||||
default_multi=default_multi,
|
default_multi=default_multi,
|
||||||
callback=callback,
|
callback=callback,
|
||||||
callback_params=callback_params,
|
callback_params=callback_params,
|
||||||
|
@ -81,30 +96,29 @@ class PortOption(Option):
|
||||||
warnings_only=warnings_only,
|
warnings_only=warnings_only,
|
||||||
extra=extra)
|
extra=extra)
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
if isinstance(value, int):
|
if isinstance(value, int):
|
||||||
if sys.version_info[0] >= 3: # pragma: no cover
|
value = str(value)
|
||||||
value = str(value)
|
self._impl_valid_string(value)
|
||||||
else:
|
|
||||||
value = unicode(value)
|
|
||||||
err = self._impl_valid_string(value)
|
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
if self._get_extra('_allow_range') and ":" in str(value):
|
if self._get_extra('_allow_range') and ":" in str(value):
|
||||||
value = str(value).split(':')
|
value = str(value).split(':')
|
||||||
if len(value) != 2:
|
if len(value) != 2:
|
||||||
return ValueError(_('range must have two values only'))
|
raise ValueError(_('range must have two values only'))
|
||||||
if not value[0] < value[1]:
|
if not value[0] < value[1]:
|
||||||
return ValueError(_('first port in range must be'
|
raise ValueError(_('first port in range must be'
|
||||||
' smaller than the second one'))
|
' smaller than the second one'))
|
||||||
else:
|
else:
|
||||||
value = [value]
|
value = [value]
|
||||||
|
|
||||||
for val in value:
|
for val in value:
|
||||||
if not self.port_re.search(val):
|
if not self.port_re.search(val):
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
val = int(val)
|
val = int(val)
|
||||||
if not self._get_extra('_min_value') <= val <= self._get_extra('_max_value'):
|
if not self._get_extra('_min_value') <= val <= self._get_extra('_max_value'):
|
||||||
return ValueError(_('must be an integer between {0} '
|
raise ValueError(_('must be an integer between {0} '
|
||||||
'and {1}').format(self._get_extra('_min_value'),
|
'and {1}').format(self._get_extra('_min_value'),
|
||||||
self._get_extra('_max_value')))
|
self._get_extra('_max_value')))
|
||||||
|
|
|
@ -30,23 +30,16 @@ class StrOption(Option):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
_display_name = _('string')
|
_display_name = _('string')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
|
value,
|
||||||
|
setting_properties,
|
||||||
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
return ValueError()
|
raise ValueError()
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info[0] >= 3: # pragma: no cover
|
#UnicodeOption is same as StrOption in python 3+
|
||||||
#UnicodeOption is same as StrOption in python 3+
|
class UnicodeOption(StrOption):
|
||||||
class UnicodeOption(StrOption):
|
__slots__ = tuple()
|
||||||
__slots__ = tuple()
|
_display_name = _('unicode')
|
||||||
pass
|
|
||||||
else:
|
|
||||||
class UnicodeOption(Option):
|
|
||||||
"represents the choice of a unicode string"
|
|
||||||
__slots__ = tuple()
|
|
||||||
_empty = u''
|
|
||||||
_display_name = _('unicode string')
|
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
|
||||||
if not isinstance(value, unicode):
|
|
||||||
return ValueError()
|
|
||||||
|
|
|
@ -38,6 +38,10 @@ class SymLinkOption(OnlyOption):
|
||||||
_setattr(self, '_opt', opt)
|
_setattr(self, '_opt', opt)
|
||||||
opt._add_dependency(self)
|
opt._add_dependency(self)
|
||||||
|
|
||||||
|
def __getattr__(self,
|
||||||
|
name):
|
||||||
|
return getattr(self._opt, name)
|
||||||
|
|
||||||
def impl_has_dependency(self, self_is_dep=True):
|
def impl_has_dependency(self, self_is_dep=True):
|
||||||
"""If self_is_dep is True, it has dependency (self._opt), so return True
|
"""If self_is_dep is True, it has dependency (self._opt), so return True
|
||||||
if self_is_dep is False, cannot has validation or callback, so return False
|
if self_is_dep is False, cannot has validation or callback, so return False
|
||||||
|
@ -47,37 +51,32 @@ class SymLinkOption(OnlyOption):
|
||||||
def impl_is_symlinkoption(self):
|
def impl_is_symlinkoption(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __getattr__(self,
|
|
||||||
name,
|
|
||||||
context=undefined):
|
|
||||||
return getattr(self.impl_getopt(), name)
|
|
||||||
|
|
||||||
def impl_getopt(self):
|
def impl_getopt(self):
|
||||||
return self._opt
|
return self._opt
|
||||||
|
|
||||||
def impl_get_information(self,
|
#def impl_get_information(self,
|
||||||
key,
|
# key,
|
||||||
default=undefined):
|
# default=undefined):
|
||||||
return self.impl_getopt().impl_get_information(key, default)
|
# return self._opt.impl_get_information(key, default)
|
||||||
|
|
||||||
def impl_is_readonly(self):
|
def impl_is_readonly(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def impl_getproperties(self):
|
#def impl_getproperties(self):
|
||||||
return self.impl_getopt().impl_getproperties()
|
# return self._opt.impl_getproperties()
|
||||||
|
|
||||||
def impl_get_callback(self):
|
#def impl_get_callback(self):
|
||||||
return self.impl_getopt().impl_get_callback()
|
# return self._opt.impl_get_callback()
|
||||||
|
|
||||||
def impl_has_callback(self):
|
#def impl_has_callback(self):
|
||||||
"to know if a callback has been defined or not"
|
# "to know if a callback has been defined or not"
|
||||||
return self.impl_getopt().impl_has_callback()
|
# return self._opt.impl_has_callback()
|
||||||
|
|
||||||
def impl_is_multi(self):
|
#def impl_is_multi(self):
|
||||||
return self.impl_getopt().impl_is_multi()
|
# return self._opt.impl_is_multi()
|
||||||
|
|
||||||
def _is_subdyn(self):
|
#def _is_subdyn(self):
|
||||||
return getattr(self.impl_getopt(), '_subdyn', None) is not None
|
# return getattr(self._opt, '_subdyn', None) is not None
|
||||||
|
|
||||||
def _get_consistencies(self):
|
def _get_consistencies(self):
|
||||||
return ()
|
return ()
|
||||||
|
@ -100,15 +99,14 @@ class DynSymLinkOption(object):
|
||||||
self._suffix = suffix
|
self._suffix = suffix
|
||||||
|
|
||||||
def __getattr__(self,
|
def __getattr__(self,
|
||||||
name,
|
name):
|
||||||
context=undefined):
|
return getattr(self._opt, name)
|
||||||
return getattr(self.impl_getopt(), name)
|
|
||||||
|
|
||||||
def impl_getname(self):
|
def impl_getname(self):
|
||||||
return self._opt.impl_getname() + self._suffix
|
return self._opt.impl_getname() + self._suffix
|
||||||
|
|
||||||
def impl_get_display_name(self):
|
def impl_get_display_name(self):
|
||||||
return self.impl_getopt().impl_get_display_name(dyn_name=self.impl_getname())
|
return self._opt.impl_get_display_name(dyn_name=self.impl_getname())
|
||||||
|
|
||||||
def impl_getopt(self):
|
def impl_getopt(self):
|
||||||
return self._opt
|
return self._opt
|
||||||
|
@ -125,23 +123,20 @@ class DynSymLinkOption(object):
|
||||||
def impl_validate(self,
|
def impl_validate(self,
|
||||||
value,
|
value,
|
||||||
context=undefined,
|
context=undefined,
|
||||||
validate=True,
|
|
||||||
force_index=None,
|
force_index=None,
|
||||||
is_multi=None,
|
is_multi=None,
|
||||||
display_error=True,
|
check_error=True,
|
||||||
display_warnings=True,
|
|
||||||
multi=None,
|
multi=None,
|
||||||
setting_properties=undefined):
|
setting_properties=undefined):
|
||||||
return self.impl_getopt().impl_validate(value,
|
# add current_opt !
|
||||||
context,
|
self._opt.impl_validate(value,
|
||||||
validate,
|
context,
|
||||||
force_index,
|
force_index,
|
||||||
current_opt=self,
|
current_opt=self,
|
||||||
is_multi=is_multi,
|
is_multi=is_multi,
|
||||||
display_error=display_error,
|
check_error=check_error,
|
||||||
display_warnings=display_warnings,
|
multi=multi,
|
||||||
multi=multi,
|
setting_properties=setting_properties)
|
||||||
setting_properties=setting_properties)
|
|
||||||
|
|
||||||
def impl_is_dynsymlinkoption(self):
|
def impl_is_dynsymlinkoption(self):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -40,16 +40,23 @@ class SynDynOptionDescription(object):
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
return getattr(self._opt, name)
|
return getattr(self._opt, name)
|
||||||
|
|
||||||
|
def impl_getopt(self):
|
||||||
|
return self._opt
|
||||||
|
|
||||||
def impl_getchild(self,
|
def impl_getchild(self,
|
||||||
name,
|
name,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
subconfig):
|
subconfig):
|
||||||
if name.endswith(self._suffix):
|
try:
|
||||||
oname = name[:-len(self._suffix)]
|
if name.endswith(self._suffix):
|
||||||
child = self._children[1][self._children[0].index(oname)]
|
oname = name[:-len(self._suffix)]
|
||||||
return self._impl_get_dynchild(child,
|
child = self._children[1][self._children[0].index(oname)]
|
||||||
self._suffix,
|
return self._impl_get_dynchild(child,
|
||||||
subconfig.cfgimpl_get_path())
|
self._suffix,
|
||||||
|
subconfig.cfgimpl_get_path())
|
||||||
|
except ValueError:
|
||||||
|
# when oname not in self._children
|
||||||
|
pass
|
||||||
raise AttributeError(_('unknown Option {0} '
|
raise AttributeError(_('unknown Option {0} '
|
||||||
'in SynDynOptionDescription {1}'
|
'in SynDynOptionDescription {1}'
|
||||||
'').format(name, self.impl_getname()))
|
'').format(name, self.impl_getname()))
|
||||||
|
|
|
@ -32,13 +32,15 @@ class URLOption(DomainnameOption):
|
||||||
path_re = re.compile(r"^[A-Za-z0-9\-\._~:/\?#\[\]@!%\$&\'\(\)\*\+,;=]+$")
|
path_re = re.compile(r"^[A-Za-z0-9\-\._~:/\?#\[\]@!%\$&\'\(\)\*\+,;=]+$")
|
||||||
_display_name = _('URL')
|
_display_name = _('URL')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
def _validate(self,
|
||||||
err = self._impl_valid_string(value)
|
value,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context=undefined,
|
||||||
|
current_opt=undefined):
|
||||||
|
self._impl_valid_string(value)
|
||||||
match = self.proto_re.search(value)
|
match = self.proto_re.search(value)
|
||||||
if not match:
|
if not match:
|
||||||
return ValueError(_('must start with http:// or '
|
raise ValueError(_('must start with http:// or '
|
||||||
'https://'))
|
'https://'))
|
||||||
value = value[len(match.group(0)):]
|
value = value[len(match.group(0)):]
|
||||||
# get domain/files
|
# get domain/files
|
||||||
|
@ -56,18 +58,17 @@ class URLOption(DomainnameOption):
|
||||||
else:
|
else:
|
||||||
domain, port = splitted
|
domain, port = splitted
|
||||||
if not 0 <= int(port) <= 65535:
|
if not 0 <= int(port) <= 65535:
|
||||||
return ValueError(_('port must be an between 0 and '
|
raise ValueError(_('port must be an between 0 and '
|
||||||
'65536'))
|
'65536'))
|
||||||
# validate domainname
|
# validate domainname
|
||||||
err = super(URLOption, self)._validate(domain)
|
super(URLOption, self)._validate(domain,
|
||||||
if err:
|
setting_properties,
|
||||||
return err
|
context,
|
||||||
err = super(URLOption, self)._second_level_validation(domain, False)
|
current_opt)
|
||||||
if err:
|
super(URLOption, self)._second_level_validation(domain, False)
|
||||||
return err
|
|
||||||
# validate file
|
# validate file
|
||||||
if files is not None and files != '' and not self.path_re.search(files):
|
if files is not None and files != '' and not self.path_re.search(files):
|
||||||
return ValueError(_('must ends with a valid resource name'))
|
raise ValueError(_('must ends with a valid resource name'))
|
||||||
|
|
||||||
def _second_level_validation(self, value, warnings_only):
|
def _second_level_validation(self, value, warnings_only):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -349,10 +349,10 @@ class Settings(object):
|
||||||
opt = opt.impl_getopt()
|
opt = opt.impl_getopt()
|
||||||
path = opt.impl_getpath(self._getcontext())
|
path = opt.impl_getpath(self._getcontext())
|
||||||
meta = self._getcontext().cfgimpl_get_meta()
|
meta = self._getcontext().cfgimpl_get_meta()
|
||||||
if meta is None:
|
if meta is not None:
|
||||||
return self._pp_.getpermissive(path)
|
return meta.cfgimpl_get_settings().getpermissive(opt,
|
||||||
return meta.cfgimpl_get_settings().getpermissive(opt,
|
path)
|
||||||
path)
|
return self._pp_.getpermissive(path)
|
||||||
|
|
||||||
def apply_requires(self,
|
def apply_requires(self,
|
||||||
opt,
|
opt,
|
||||||
|
@ -589,6 +589,7 @@ class Settings(object):
|
||||||
opt,
|
opt,
|
||||||
path,
|
path,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
|
self_properties=undefined,
|
||||||
index=None,
|
index=None,
|
||||||
force_permissive=False):
|
force_permissive=False):
|
||||||
"""
|
"""
|
||||||
|
@ -599,10 +600,11 @@ class Settings(object):
|
||||||
was present
|
was present
|
||||||
"""
|
"""
|
||||||
# opt properties
|
# opt properties
|
||||||
self_properties = self.getproperties(opt,
|
if self_properties is undefined:
|
||||||
path,
|
self_properties = self.getproperties(opt,
|
||||||
setting_properties=setting_properties,
|
path,
|
||||||
index=index)
|
setting_properties=setting_properties,
|
||||||
|
index=index)
|
||||||
|
|
||||||
# calc properties
|
# calc properties
|
||||||
properties = self_properties & setting_properties - set(['frozen'])
|
properties = self_properties & setting_properties - set(['frozen'])
|
||||||
|
@ -612,7 +614,7 @@ class Settings(object):
|
||||||
value = self._getcontext().cfgimpl_get_values().get_cached_value(opt,
|
value = self._getcontext().cfgimpl_get_values().get_cached_value(opt,
|
||||||
path,
|
path,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
validate=False,
|
validate=True,
|
||||||
self_properties=self_properties,
|
self_properties=self_properties,
|
||||||
index=index)
|
index=index)
|
||||||
if not self.validate_mandatory(opt,
|
if not self.validate_mandatory(opt,
|
||||||
|
@ -663,6 +665,10 @@ class Settings(object):
|
||||||
force_allow_empty_list=True,
|
force_allow_empty_list=True,
|
||||||
index=index))
|
index=index))
|
||||||
|
|
||||||
|
def validate_frozen(self,
|
||||||
|
setting_properties,
|
||||||
|
self_properties):
|
||||||
|
return 'everything_frozen' in setting_properties or 'frozen' in self_properties
|
||||||
#____________________________________________________________
|
#____________________________________________________________
|
||||||
# read only/read write
|
# read only/read write
|
||||||
|
|
||||||
|
|
|
@ -90,15 +90,14 @@ class Values(object):
|
||||||
"""
|
"""
|
||||||
ntime = None
|
ntime = None
|
||||||
# try to retrive value in cache
|
# try to retrive value in cache
|
||||||
if 'cache' in setting_properties and self._p_.hascache(path,
|
if setting_properties and 'cache' in setting_properties and \
|
||||||
index):
|
self._p_.hascache(path,
|
||||||
|
index):
|
||||||
if 'expire' in setting_properties:
|
if 'expire' in setting_properties:
|
||||||
ntime = int(time())
|
ntime = int(time())
|
||||||
is_cached, value = self._p_.getcache(path,
|
is_cached, value = self._p_.getcache(path,
|
||||||
ntime,
|
ntime,
|
||||||
None)
|
index)
|
||||||
if index:
|
|
||||||
value = value[index]
|
|
||||||
if is_cached:
|
if is_cached:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -120,15 +119,14 @@ class Values(object):
|
||||||
validate,
|
validate,
|
||||||
force_permissive=force_permissive)
|
force_permissive=force_permissive)
|
||||||
# store value in cache
|
# store value in cache
|
||||||
#FIXME pas de cache pour les slaves !!!
|
if setting_properties and 'cache' in setting_properties and \
|
||||||
if index is None and 'cache' in setting_properties and \
|
|
||||||
validate and force_permissive is False \
|
validate and force_permissive is False \
|
||||||
and trusted_cached_properties is True:
|
and trusted_cached_properties is True:
|
||||||
if 'expire' in setting_properties:
|
if 'expire' in setting_properties:
|
||||||
if ntime is None:
|
if ntime is None:
|
||||||
ntime = int(time())
|
ntime = int(time())
|
||||||
ntime = ntime + expires_time
|
ntime = ntime + expires_time
|
||||||
self._p_.setcache(path, value, ntime, None)
|
self._p_.setcache(path, value, ntime, index)
|
||||||
# and return it
|
# and return it
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -164,15 +162,13 @@ class Values(object):
|
||||||
opt.impl_validate(value,
|
opt.impl_validate(value,
|
||||||
context,
|
context,
|
||||||
force_index=index,
|
force_index=index,
|
||||||
display_error=True,
|
check_error=True,
|
||||||
display_warnings=False,
|
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
if display_warnings:
|
if display_warnings:
|
||||||
opt.impl_validate(value,
|
opt.impl_validate(value,
|
||||||
context,
|
context,
|
||||||
force_index=index,
|
force_index=index,
|
||||||
display_error=False,
|
check_error=False,
|
||||||
display_warnings=display_warnings,
|
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -411,12 +407,11 @@ class Values(object):
|
||||||
else:
|
else:
|
||||||
tested_context = context
|
tested_context = context
|
||||||
tested_values = self
|
tested_values = self
|
||||||
tested_values.validate_setitem(opt,
|
tested_values.setvalue_validation(opt,
|
||||||
value,
|
value,
|
||||||
path,
|
path,
|
||||||
force_permissive,
|
setting_properties,
|
||||||
setting_properties,
|
index)
|
||||||
index)
|
|
||||||
|
|
||||||
self._setvalue(opt,
|
self._setvalue(opt,
|
||||||
path,
|
path,
|
||||||
|
@ -425,22 +420,22 @@ class Values(object):
|
||||||
index=index,
|
index=index,
|
||||||
commit=_commit)
|
commit=_commit)
|
||||||
|
|
||||||
def validate_setitem(self,
|
def setvalue_validation(self,
|
||||||
opt,
|
opt,
|
||||||
value,
|
value,
|
||||||
path,
|
path,
|
||||||
force_permissive,
|
setting_properties,
|
||||||
setting_properties,
|
index):
|
||||||
index):
|
|
||||||
|
|
||||||
context = self._getcontext()
|
context = self._getcontext()
|
||||||
settings = context.cfgimpl_get_settings()
|
settings = context.cfgimpl_get_settings()
|
||||||
# First validate properties with this value
|
# First validate properties with this value
|
||||||
properties = settings.getproperties(opt,
|
self_properties = settings.getproperties(opt,
|
||||||
path,
|
path,
|
||||||
setting_properties=setting_properties,
|
setting_properties=setting_properties,
|
||||||
index=index)
|
index=index)
|
||||||
if 'everything_frozen' in setting_properties or 'frozen' in properties:
|
if settings.validate_frozen(setting_properties,
|
||||||
|
self_properties):
|
||||||
datas = {'opt': opt,
|
datas = {'opt': opt,
|
||||||
'path': path,
|
'path': path,
|
||||||
'setting_properties': setting_properties,
|
'setting_properties': setting_properties,
|
||||||
|
@ -455,7 +450,7 @@ class Values(object):
|
||||||
index,
|
index,
|
||||||
value,
|
value,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
properties):
|
self_properties):
|
||||||
datas = {'opt': opt,
|
datas = {'opt': opt,
|
||||||
'path': path,
|
'path': path,
|
||||||
'setting_properties': setting_properties,
|
'setting_properties': setting_properties,
|
||||||
|
@ -469,13 +464,13 @@ class Values(object):
|
||||||
# Value must be valid for option
|
# Value must be valid for option
|
||||||
opt.impl_validate(value,
|
opt.impl_validate(value,
|
||||||
context,
|
context,
|
||||||
display_warnings=False,
|
check_error=True,
|
||||||
force_index=index,
|
force_index=index,
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
# No error found so emit warnings
|
# No error found so emit warnings
|
||||||
opt.impl_validate(value,
|
opt.impl_validate(value,
|
||||||
context,
|
context,
|
||||||
display_error=False,
|
check_error=False,
|
||||||
force_index=index,
|
force_index=index,
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
|
|
||||||
|
@ -602,6 +597,7 @@ class Values(object):
|
||||||
opt,
|
opt,
|
||||||
path,
|
path,
|
||||||
owner,
|
owner,
|
||||||
|
setting_properties,
|
||||||
index=None):
|
index=None):
|
||||||
"""
|
"""
|
||||||
sets a owner to an option
|
sets a owner to an option
|
||||||
|
@ -621,6 +617,10 @@ class Values(object):
|
||||||
if not self._p_.hasvalue(path):
|
if not self._p_.hasvalue(path):
|
||||||
raise ConfigError(_('no value for {0} cannot change owner to {1}'
|
raise ConfigError(_('no value for {0} cannot change owner to {1}'
|
||||||
'').format(path, owner))
|
'').format(path, owner))
|
||||||
|
self.setowner_validation(opt,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
index)
|
||||||
self._p_.setowner(path, owner, index=index)
|
self._p_.setowner(path, owner, index=index)
|
||||||
|
|
||||||
def is_default_owner(self,
|
def is_default_owner(self,
|
||||||
|
@ -663,12 +663,16 @@ class Values(object):
|
||||||
path,
|
path,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
validate=False)
|
validate=False)
|
||||||
#FIXME ce n'est pas deja fait dans le reset ?
|
value = fake_value._getdefaultvalue(opt,
|
||||||
#sinon c'est un validate_properties qu'il faut faire ...
|
path,
|
||||||
#fake_value.get_cached_value(opt,
|
None,
|
||||||
# path,
|
validate,
|
||||||
# setting_properties=setting_properties,
|
setting_properties)
|
||||||
# force_permissive=force_permissive)
|
fake_value.setvalue_validation(opt,
|
||||||
|
value,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
None)
|
||||||
if opt.impl_is_master_slaves('master'):
|
if opt.impl_is_master_slaves('master'):
|
||||||
opt.impl_get_master_slaves().reset(opt,
|
opt.impl_get_master_slaves().reset(opt,
|
||||||
self,
|
self,
|
||||||
|
@ -714,11 +718,16 @@ class Values(object):
|
||||||
index,
|
index,
|
||||||
setting_properties,
|
setting_properties,
|
||||||
validate=False)
|
validate=False)
|
||||||
fake_value.get_cached_value(opt,
|
value = fake_value._getdefaultvalue(opt,
|
||||||
path,
|
path,
|
||||||
setting_properties,
|
index,
|
||||||
index=index,
|
validate,
|
||||||
force_permissive=force_permissive)
|
setting_properties)
|
||||||
|
fake_value.setvalue_validation(opt,
|
||||||
|
value,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
index)
|
||||||
self._p_.resetvalue_index(path, index)
|
self._p_.resetvalue_index(path, index)
|
||||||
|
|
||||||
def reset_master(self,
|
def reset_master(self,
|
||||||
|
@ -746,6 +755,33 @@ class Values(object):
|
||||||
setting_properties,
|
setting_properties,
|
||||||
force_permissive)
|
force_permissive)
|
||||||
|
|
||||||
|
|
||||||
|
def setowner_validation(self,
|
||||||
|
opt,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
index):
|
||||||
|
|
||||||
|
context = self._getcontext()
|
||||||
|
settings = context.cfgimpl_get_settings()
|
||||||
|
# First validate properties with this value
|
||||||
|
self_properties = settings.getproperties(opt,
|
||||||
|
path,
|
||||||
|
setting_properties=setting_properties,
|
||||||
|
index=index)
|
||||||
|
if settings.validate_frozen(setting_properties,
|
||||||
|
self_properties):
|
||||||
|
datas = {'opt': opt,
|
||||||
|
'path': path,
|
||||||
|
'setting_properties': setting_properties,
|
||||||
|
'index': index,
|
||||||
|
'debug': True}
|
||||||
|
raise PropertiesOptionError(None,
|
||||||
|
['frozen'],
|
||||||
|
settings,
|
||||||
|
datas,
|
||||||
|
'option')
|
||||||
|
|
||||||
#______________________________________________________________________
|
#______________________________________________________________________
|
||||||
# information
|
# information
|
||||||
|
|
||||||
|
@ -771,7 +807,7 @@ class Values(object):
|
||||||
# mandatory warnings
|
# mandatory warnings
|
||||||
|
|
||||||
def mandatory_warnings(self,
|
def mandatory_warnings(self,
|
||||||
force_permissive=True):
|
setting_properties):
|
||||||
"""convenience function to trace Options that are mandatory and
|
"""convenience function to trace Options that are mandatory and
|
||||||
where no value has been set
|
where no value has been set
|
||||||
|
|
||||||
|
@ -779,65 +815,82 @@ class Values(object):
|
||||||
"""
|
"""
|
||||||
context = self._getcontext()
|
context = self._getcontext()
|
||||||
settings = context.cfgimpl_get_settings()
|
settings = context.cfgimpl_get_settings()
|
||||||
setting_properties = context.cfgimpl_get_settings().get_context_properties()
|
# copy
|
||||||
|
setting_properties = set(setting_properties)
|
||||||
setting_properties.update(['mandatory', 'empty'])
|
setting_properties.update(['mandatory', 'empty'])
|
||||||
def _is_properties_option(err, path):
|
def _mandatory_warnings(description, currpath):
|
||||||
#FIXME hum ...
|
is_masterslaves = description.is_masterslaves()
|
||||||
if not isinstance(err, Exception):
|
lenmaster = None
|
||||||
pass
|
for opt in description.impl_getchildren(context=context,
|
||||||
elif isinstance(err, PropertiesOptionError):
|
setting_properties=setting_properties):
|
||||||
if err.proptype == ['mandatory']:
|
|
||||||
return path
|
|
||||||
elif isinstance(err, ConfigError):
|
|
||||||
#assume that uncalculated value is an empty value
|
|
||||||
return path
|
|
||||||
else:
|
|
||||||
raise err
|
|
||||||
|
|
||||||
def _mandatory_warnings(description, currpath=None):
|
|
||||||
if currpath is None:
|
|
||||||
currpath = []
|
|
||||||
for opt in description._impl_getchildren(context=context):
|
|
||||||
name = opt.impl_getname()
|
name = opt.impl_getname()
|
||||||
path = '.'.join(currpath + [name])
|
path = '.'.join(currpath + [name])
|
||||||
|
|
||||||
if opt.impl_is_optiondescription():
|
if opt.impl_is_optiondescription():
|
||||||
#FIXME ?
|
try:
|
||||||
if not settings.validate_properties(opt,
|
settings.validate_properties(opt,
|
||||||
True,
|
path,
|
||||||
False,
|
setting_properties,
|
||||||
path=path,
|
force_permissive=True)
|
||||||
force_permissive=True,
|
|
||||||
setting_properties=setting_properties):
|
|
||||||
for path in _mandatory_warnings(opt,
|
for path in _mandatory_warnings(opt,
|
||||||
currpath + [name]):
|
currpath + [name]):
|
||||||
yield path
|
yield path
|
||||||
else:
|
except PropertiesOptionError:
|
||||||
if opt.impl_is_symlinkoption():
|
pass
|
||||||
continue
|
elif not opt.impl_is_symlinkoption():
|
||||||
self_properties = settings.getproperties(opt,
|
self_properties = settings.getproperties(opt,
|
||||||
path,
|
path,
|
||||||
setting_properties=setting_properties)
|
setting_properties=setting_properties)
|
||||||
if 'mandatory' in self_properties or 'empty' in self_properties:
|
if 'mandatory' in self_properties or 'empty' in self_properties:
|
||||||
values = self.get_cached_value(opt,
|
try:
|
||||||
path,
|
if opt.impl_is_master_slaves('slave'):
|
||||||
setting_properties,
|
if lenmaster is None:
|
||||||
trusted_cached_properties=False,
|
# master is a length (so int) if value is already calculated
|
||||||
force_permissive=True,
|
# otherwise get value and calculate length
|
||||||
self_properties=self_properties,
|
values = self.get_cached_value(optmaster,
|
||||||
validate=True,
|
pathmaster,
|
||||||
display_warnings=False)
|
setting_properties,
|
||||||
if opt.impl_is_master_slaves('slave') and isinstance(values, list):
|
self_properties=self_properties,
|
||||||
for val in values:
|
trusted_cached_properties=False,
|
||||||
ret = _is_properties_option(val, path)
|
force_permissive=True,
|
||||||
if ret is not None:
|
validate=True,
|
||||||
yield ret
|
display_warnings=False)
|
||||||
break
|
|
||||||
else:
|
lenmaster = len(values)
|
||||||
ret = _is_properties_option(values, path)
|
if not lenmaster:
|
||||||
if ret is not None:
|
settings.validate_properties(opt,
|
||||||
yield ret
|
path,
|
||||||
|
setting_properties,
|
||||||
|
self_properties=self_properties,
|
||||||
|
force_permissive=True)
|
||||||
|
else:
|
||||||
|
for index in range(lenmaster):
|
||||||
|
settings.validate_properties(opt,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
self_properties=self_properties,
|
||||||
|
index=index,
|
||||||
|
force_permissive=True)
|
||||||
|
else:
|
||||||
|
settings.validate_properties(opt,
|
||||||
|
path,
|
||||||
|
setting_properties,
|
||||||
|
self_properties=self_properties,
|
||||||
|
force_permissive=True)
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
if err.proptype == frozenset(['mandatory']):
|
||||||
|
yield path
|
||||||
|
if is_masterslaves and lenmaster is None:
|
||||||
|
break
|
||||||
|
except ConfigError as err:
|
||||||
|
#assume that uncalculated value is an empty value
|
||||||
|
yield path
|
||||||
|
if is_masterslaves and lenmaster is None:
|
||||||
|
break
|
||||||
|
if is_masterslaves and lenmaster is None:
|
||||||
|
pathmaster = path
|
||||||
|
optmaster = opt
|
||||||
|
|
||||||
descr = context.cfgimpl_get_description()
|
descr = context.cfgimpl_get_description()
|
||||||
for path in _mandatory_warnings(descr):
|
for path in _mandatory_warnings(descr, []):
|
||||||
yield path
|
yield path
|
||||||
|
|
Loading…
Reference in New Issue