help in API became usable

This commit is contained in:
Emmanuel Garette 2018-10-07 10:55:52 +02:00
parent fbff3d9ced
commit 290f687f6c
12 changed files with 716 additions and 620 deletions

View file

@ -136,14 +136,17 @@ def test_information_config():
config = Config(descr)
string = 'some informations'
#
assert list(config.information.list()) == []
config.information.set('info', string)
assert config.information.get('info') == string
assert list(config.information.list()) == ['info']
#
raises(ValueError, "config.information.get('noinfo')")
assert config.information.get('noinfo', 'default') == 'default'
config.information.reset('info')
raises(ValueError, "config.information.get('info')")
raises(ValueError, "config.information.reset('noinfo')")
assert list(config.information.list()) == []
def test_information_option():
@ -151,14 +154,17 @@ def test_information_option():
config = Config(descr)
string = 'some informations'
#
list(config.option('gc.name').information.list()) == []
config.option('gc.name').information.set('info', string)
assert config.option('gc.name').information.get('info') == string
list(config.option('gc.name').information.list()) == ['info']
#
raises(ValueError, "config.option('gc.name').information.get('noinfo')")
assert config.option('gc.name').information.get('noinfo', 'default') == 'default'
config.option('gc.name').information.reset('info')
raises(ValueError, "config.option('gc.name').information.get('info')")
raises(ValueError, "config.option('gc.name').information.reset('noinfo')")
list(config.option('gc.name').information.list()) == []
#
assert config.option('wantref').information.get('info') == 'default value'
config.option('wantref').information.set('info', 'default value')

View file

@ -149,14 +149,14 @@ def test_find_in_config():
conf = Config(descr)
conf.property.read_only()
conf.permissive.set(frozenset(['hidden']))
ret = conf.option.find('dummy')
ret = list(conf.option.find('dummy'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.dummy').option.get())
#
ret = conf.option.find('dummy', first=True).option.get()
_is_same_opt(ret, conf.option('gc.dummy').option.get())
#
ret = conf.option.find('float')
ret = list(conf.option.find('float'))
assert len(ret) == 2
_is_same_opt(ret[0].option.get(), conf.option('gc.float').option.get())
_is_same_opt(ret[1].option.get(), conf.option('float').option.get())
@ -177,48 +177,49 @@ def test_find_in_config():
#_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.option.find('prop')
ret = list(conf.option.find('prop'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.prop').option.get())
#
ret = conf.option.find('prop', value=None)
ret = conf.option.find('prop')
ret = list(conf.option.find('prop', value=None))
assert len(ret) == 1
ret = list(conf.option.find('prop'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.prop').option.get())
#
conf.property.read_write()
raises(AttributeError, "assert conf.option.find('prop').option.get()")
ret = conf.unrestraint.option.find(name='prop')
ret = list(conf.unrestraint.option.find(name='prop'))
assert len(ret) == 2
_is_same_opt(ret[0].option.get(), conf.unrestraint.option('gc.gc2.prop').option.get())
_is_same_opt(ret[1].option.get(), conf.forcepermissive.option('gc.prop').option.get())
#
ret = conf.forcepermissive.option.find('prop')
ret = list(conf.forcepermissive.option.find('prop'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.forcepermissive.option('gc.prop').option.get())
#
_is_same_opt(conf.forcepermissive.option.find('prop', first=True).option.get(), conf.forcepermissive.option('gc.prop').option.get())
# combinaison of filters
ret = conf.unrestraint.option.find('prop', type=BoolOption)
ret = list(conf.unrestraint.option.find('prop', type=BoolOption))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.unrestraint.option('gc.gc2.prop').option.get())
_is_same_opt(conf.unrestraint.option.find('prop', type=BoolOption, first=True).option.get(), conf.unrestraint.option('gc.gc2.prop').option.get())
#
ret = conf.option.find('dummy', value=False)
ret = list(conf.option.find('dummy', value=False))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.dummy').option.get())
#
_is_same_opt(conf.option.find('dummy', value=False, first=True).option.get(), conf.option('gc.dummy').option.get())
#subconfig
ret = conf.option('gc').find('dummy')
ret = list(conf.option('gc').find('dummy'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.dummy').option.get())
#
ret = conf.option('gc').find('float')
ret = list(conf.option('gc').find('float'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.float').option.get())
#
ret = conf.option('gc').find('bool')
ret = list(conf.option('gc').find('bool'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.gc2.bool').option.get())
_is_same_opt(conf.option('gc').find('bool', value=False, first=True).option.get(), conf.option('gc.gc2.bool').option.get())
@ -227,13 +228,13 @@ def test_find_in_config():
#
raises(AttributeError, "conf.option('gc').find('wantref').option.get()")
#
ret = conf.unrestraint.option('gc').find('prop')
ret = list(conf.unrestraint.option('gc').find('prop'))
assert len(ret) == 2
_is_same_opt(ret[0].option.get(), conf.unrestraint.option('gc.gc2.prop').option.get())
_is_same_opt(ret[1].option.get(), conf.forcepermissive.option('gc.prop').option.get())
#
conf.property.read_only()
ret = conf.option('gc').find('prop')
ret = list(conf.option('gc').find('prop'))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), conf.option('gc.prop').option.get())
# not OptionDescription
@ -246,16 +247,16 @@ def test_find_multi():
o = OptionDescription('od', '', [b])
conf = Config(o)
#
raises(AttributeError, "conf.option.find('bool', value=True)")
raises(AttributeError, "conf.option.find('bool', value=True, first=True)")
raises(AttributeError, "list(conf.option.find('bool', value=True))")
raises(AttributeError, "list(conf.option.find('bool', value=True, first=True))")
conf.option('bool').value.set([False])
raises(AttributeError, "conf.option.find('bool', value=True)")
raises(AttributeError, "conf.option.find('bool', value=True, first=True)")
raises(AttributeError, "list(conf.option.find('bool', value=True))")
raises(AttributeError, "list(conf.option.find('bool', value=True, first=True))")
conf.option('bool').value.set([False, False])
raises(AttributeError, "conf.option.find('bool', value=True)")
raises(AttributeError, "conf.option.find('bool', value=True, first=True)")
raises(AttributeError, "list(conf.option.find('bool', value=True))")
raises(AttributeError, "list(conf.option.find('bool', value=True, first=True))")
conf.option('bool').value.set([False, False, True])
ret = conf.option.find('bool', value=True)
ret = list(conf.option.find('bool', value=True))
assert len(ret) == 1
_is_same_opt(ret[0].option.get(), b)
_is_same_opt(conf.option.find('bool', value=True, first=True).option.get(), b)
@ -264,7 +265,7 @@ def test_find_multi():
def test_does_not_find_in_config():
descr = make_description()
conf = Config(descr)
raises(AttributeError, "conf.option.find('IDontExist')")
raises(AttributeError, "list(conf.option.find('IDontExist'))")
def test_filename():
@ -341,7 +342,11 @@ def test_help():
od1 = OptionDescription('o', '', [stro])
od2 = OptionDescription('o', '', [od1])
cfg = Config(od2)
cfg.help(_display=False, _valid=True)
cfg.help(_display=False)
cfg.config.help(_display=False)
cfg.option.help(_display=False)
cfg.option('o').help(_display=False)
cfg.option('o.s').help(_display=False)
def test_config_reset():

View file

@ -689,7 +689,7 @@ def test_find_dyndescription_context():
#assert len(opts) == 1
#assert isinstance(opts[0], DynSymLinkOption)
#assert opts[0].impl_getname() == 'stval1'
raises(AttributeError, "api.option.find('strnotexists')")
raises(AttributeError, "list(api.option.find('strnotexists'))")
def test_information_dyndescription_context():

View file

@ -145,7 +145,7 @@ def test_contexts():
def test_find():
meta = make_metaconfig()
ret = meta.option.find('i2')
ret = list(meta.option.find('i2'))
assert len(ret) == 1
assert 1 == ret[0].value.get()
assert 1 == meta.option.find('i2', first=True).value.get()

View file

@ -383,7 +383,7 @@ def test_allow_multiple_changes_from_config():
def test_access_by_get():
descr = make_description()
api = Config(descr)
raises(AttributeError, "api.option.find('idontexist')")
raises(AttributeError, "list(api.option.find('idontexist'))")
assert api.option.find('wantref', first=True).value.get() is False
assert api.option.find('dummy', first=True).value.get() is False

View file

@ -15,7 +15,7 @@
from .function import Params, ParamOption, ParamValue, ParamContext
from .option import *
from .error import APIError
from .api import getapi, Config, MetaConfig, GroupConfig
from .api import Config, MetaConfig, GroupConfig
from .option import __all__ as all_options
from .setting import owners, undefined
@ -27,7 +27,6 @@ allfuncs = ['Params',
'MetaConfig',
'GroupConfig',
'Config',
'getapi',
'APIError',
'undefined']
allfuncs.extend(all_options)

File diff suppressed because it is too large Load diff

View file

@ -645,6 +645,9 @@ class _CommonConfig(SubConfig):
def impl_del_information(self, key, raises=True):
self._impl_values.del_information(key, raises)
def impl_list_information(self):
return self._impl_values.list_information()
def __getstate__(self):
raise NotImplementedError()

View file

@ -244,8 +244,6 @@ class OptionDescriptionWalk(CacheOptionDescription):
subpath = None
for child in self._children[1]:
if dyn and child.impl_is_dynoptiondescription():
if config_bag.context is None: # pragma: no cover
raise ConfigError(_('need context'))
if subpath is None:
if config_bag.context.cfgimpl_get_description() == self:
subpath = ''

View file

@ -289,6 +289,12 @@ class Values(Cache):
if raises:
raise ValueError(_("information's item not found {0}").format(key))
def list_information(self, path):
if path in self._informations:
return self._informations[path].keys()
else:
return []
def del_informations(self):
self._informations = {}

View file

@ -228,6 +228,14 @@ class Values(Sqlite3DB):
self._storage.execute("DELETE FROM information WHERE key = ? AND session_id = ? AND path = ?",
(key, self._session_id, path))
def list_information(self, path):
path = self._sqlite_encode_path(path)
rows = self._storage.select("SELECT key FROM information WHERE session_id = ? AND path = ?",
(self._session_id, path),
only_one=False)
for row in rows:
yield self._sqlite_decode_path(row[0])
def del_informations(self):
self._storage.execute("DELETE FROM information WHERE session_id = ?",
(self._session_id,))

View file

@ -513,6 +513,9 @@ class Values(object):
def del_information(self, key, raises=True, path=None):
self._p_.del_information(path, key, raises)
def list_information(self, path=None):
return self._p_.list_information(path)
#______________________________________________________________________
# mandatory warnings
def _mandatory_warnings(self,