convert tests

This commit is contained in:
Emmanuel Garette 2017-12-13 22:15:34 +01:00
parent fc787d4dbb
commit b5f785d62c
38 changed files with 5234 additions and 566 deletions

View File

@ -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
test/new_api/__init__.py Normal file
View File

14
test/new_api/autopath.py Normal file
View File

@ -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)

790
test/new_api/test_cache.py Normal file
View File

@ -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

View File

@ -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'])")

403
test/new_api/test_config.py Normal file
View File

@ -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')")

View File

@ -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)")

View File

@ -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')")

View File

@ -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')")

View File

@ -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)")

221
test/new_api/test_freeze.py Normal file
View File

@ -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)}

View File

@ -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()) == []

View File

@ -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

View File

@ -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):

View File

@ -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,

View File

@ -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

View File

@ -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}'

View File

@ -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()

View File

@ -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))

View File

@ -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)))

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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):

View File

@ -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()))

View File

@ -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)

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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')))

View File

@ -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()

View File

@ -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

View File

@ -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()))

View File

@ -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

View File

@ -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

View File

@ -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