find method in config
This commit is contained in:
parent
d3dc40033b
commit
aa67ae31aa
|
@ -17,7 +17,7 @@ def make_description():
|
||||||
boolop = BoolOption('boolop', 'Test boolean option op', default=True)
|
boolop = BoolOption('boolop', 'Test boolean option op', default=True)
|
||||||
wantref_option = BoolOption('wantref', 'Tests', default=False)
|
wantref_option = BoolOption('wantref', 'Tests', default=False)
|
||||||
wantframework_option = BoolOption('wantframework', 'Test', default=False)
|
wantframework_option = BoolOption('wantframework', 'Test', default=False)
|
||||||
|
|
||||||
gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
|
gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
|
||||||
descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
|
descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
|
||||||
wantref_option, stroption,
|
wantref_option, stroption,
|
||||||
|
@ -61,7 +61,7 @@ def test_iter_subconfig():
|
||||||
def test_getpaths():
|
def test_getpaths():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr)
|
||||||
|
|
||||||
assert config.getpaths() == ['gc.name', 'gc.dummy', 'gc.float', 'bool',
|
assert config.getpaths() == ['gc.name', 'gc.dummy', 'gc.float', 'bool',
|
||||||
'objspace', 'wantref', 'str', 'wantframework',
|
'objspace', 'wantref', 'str', 'wantframework',
|
||||||
'int', 'boolop']
|
'int', 'boolop']
|
||||||
|
@ -71,7 +71,7 @@ def test_getpaths():
|
||||||
assert config.getpaths(include_groups=True) == [
|
assert config.getpaths(include_groups=True) == [
|
||||||
'gc', 'gc.name', 'gc.dummy', 'gc.float',
|
'gc', 'gc.name', 'gc.dummy', 'gc.float',
|
||||||
'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
'bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
||||||
|
|
||||||
assert config.getpaths(True) == descr.getpaths(True)
|
assert config.getpaths(True) == descr.getpaths(True)
|
||||||
|
|
||||||
def test_getpaths_with_hidden():
|
def test_getpaths_with_hidden():
|
||||||
|
@ -85,18 +85,18 @@ def test_getpaths_with_hidden():
|
||||||
wantref_option = BoolOption('wantref', 'Test requires', default=False)
|
wantref_option = BoolOption('wantref', 'Test requires', default=False)
|
||||||
wantframework_option = BoolOption('wantframework', 'Test requires',
|
wantframework_option = BoolOption('wantframework', 'Test requires',
|
||||||
default=False)
|
default=False)
|
||||||
|
|
||||||
descr = OptionDescription('tiramisu', '', [booloption, objspaceoption,
|
descr = OptionDescription('tiramisu', '', [booloption, objspaceoption,
|
||||||
wantref_option, stroption,
|
wantref_option, stroption,
|
||||||
wantframework_option,
|
wantframework_option,
|
||||||
intoption, boolop])
|
intoption, boolop])
|
||||||
|
|
||||||
config = Config(descr)
|
config = Config(descr)
|
||||||
result = ['objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
result = ['objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
||||||
assert config.getpaths() == result
|
assert config.getpaths() == result
|
||||||
r2 = ['bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
r2 = ['bool', 'objspace', 'wantref', 'str', 'wantframework', 'int', 'boolop']
|
||||||
assert config.getpaths(allpaths=True) == r2
|
assert config.getpaths(allpaths=True) == r2
|
||||||
|
|
||||||
def test_str():
|
def test_str():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
c = Config(descr)
|
c = Config(descr)
|
||||||
|
@ -137,6 +137,14 @@ def test_delattr():
|
||||||
c.int = 45
|
c.int = 45
|
||||||
assert c.int == 45
|
assert c.int == 45
|
||||||
|
|
||||||
|
def test_find_in_config():
|
||||||
|
"finds option in config"
|
||||||
|
descr = make_description()
|
||||||
|
conf = Config(descr)
|
||||||
|
assert conf.find(byname='dummy')[0] == conf.unwrap_from_name('dummy')
|
||||||
|
assert conf.find(bytype=ChoiceOption)[0] == conf.unwrap_from_name('name')
|
||||||
|
assert conf.find(byvalue='ref')[0] == conf.unwrap_from_name('name')
|
||||||
|
|
||||||
#def test_validator():
|
#def test_validator():
|
||||||
# "validates the integrity of an option towards a whole configuration"
|
# "validates the integrity of an option towards a whole configuration"
|
||||||
# def my_validator_1(config):
|
# def my_validator_1(config):
|
||||||
|
|
|
@ -359,7 +359,6 @@ class Config(object):
|
||||||
and sets the found option if the match is not ambiguous.
|
and sets the found option if the match is not ambiguous.
|
||||||
:param kwargs: dict of name strings to values.
|
:param kwargs: dict of name strings to values.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
all_paths = [p.split(".") for p in self.getpaths(allpaths=True)]
|
all_paths = [p.split(".") for p in self.getpaths(allpaths=True)]
|
||||||
for key, value in kwargs.iteritems():
|
for key, value in kwargs.iteritems():
|
||||||
key_p = key.split('.')
|
key_p = key.split('.')
|
||||||
|
@ -384,10 +383,15 @@ class Config(object):
|
||||||
|
|
||||||
def get(self, name):
|
def get(self, name):
|
||||||
"""
|
"""
|
||||||
|
same as a find_first() method in a config that has identical names
|
||||||
|
that is : Returns the first item of an option named 'name'
|
||||||
|
|
||||||
much like the attribute access way, except that
|
much like the attribute access way, except that
|
||||||
the search for the option is performed recursively in the whole
|
the search for the option is performed recursively in the whole
|
||||||
configuration tree.
|
configuration tree.
|
||||||
**carefull**: very slow !
|
**carefull**: very slow !
|
||||||
|
|
||||||
|
:returns: option value.
|
||||||
"""
|
"""
|
||||||
paths = self.getpaths(allpaths=True)
|
paths = self.getpaths(allpaths=True)
|
||||||
pathsvalues = []
|
pathsvalues = []
|
||||||
|
@ -560,6 +564,11 @@ class Config(object):
|
||||||
def getpaths(self, include_groups=False, allpaths=False, mandatory=False):
|
def getpaths(self, include_groups=False, allpaths=False, mandatory=False):
|
||||||
"""returns a list of all paths in self, recursively, taking care of
|
"""returns a list of all paths in self, recursively, taking care of
|
||||||
the context of properties (hidden/disabled)
|
the context of properties (hidden/disabled)
|
||||||
|
|
||||||
|
:param include_groups: if true, OptionDescription are included
|
||||||
|
:param allpaths: all the options (event the properties protected ones)
|
||||||
|
:param mandatory: includes the mandatory options
|
||||||
|
:returns: list of all paths
|
||||||
"""
|
"""
|
||||||
paths = []
|
paths = []
|
||||||
for path in self._cfgimpl_descr.getpaths(include_groups=include_groups):
|
for path in self._cfgimpl_descr.getpaths(include_groups=include_groups):
|
||||||
|
@ -576,6 +585,45 @@ class Config(object):
|
||||||
paths.append(path)
|
paths.append(path)
|
||||||
return paths
|
return paths
|
||||||
|
|
||||||
|
def find(self, bytype=None, byname=None, byvalue=None, byattrs=None):
|
||||||
|
"""
|
||||||
|
finds an option recursively in the config
|
||||||
|
|
||||||
|
:param bytype: Option class (BoolOption, StrOption, ...)
|
||||||
|
:param byname: filter by Option._name
|
||||||
|
:param byvalue: filter by the option's value
|
||||||
|
:param byattrs: dict of option attributes (default, callback...)
|
||||||
|
:returns: list of matching Option objects
|
||||||
|
"""
|
||||||
|
def _filter_by_name():
|
||||||
|
if byname is not None:
|
||||||
|
pathname = path.split('.')[-1]
|
||||||
|
if pathname == byname:
|
||||||
|
yield option
|
||||||
|
def _filter_by_value():
|
||||||
|
if byvalue is not None:
|
||||||
|
try:
|
||||||
|
value = getattr(self, path)
|
||||||
|
if value == byvalue:
|
||||||
|
yield option
|
||||||
|
except Exception, e: # a property restricts the acces to value
|
||||||
|
pass
|
||||||
|
def _filter_by_type():
|
||||||
|
if bytype is not None:
|
||||||
|
if isinstance(option, bytype):
|
||||||
|
find_results.append(self.unwrap_from_path(path))
|
||||||
|
find_results = []
|
||||||
|
paths = self.getpaths(allpaths=True)
|
||||||
|
for path in paths:
|
||||||
|
option = self.unwrap_from_path(path)
|
||||||
|
if _filter_by_name() is not None:
|
||||||
|
find_results.extend(list( _filter_by_name() ))
|
||||||
|
if _filter_by_value() is not None:
|
||||||
|
find_results.extend(list( _filter_by_value() ))
|
||||||
|
if _filter_by_type() is not None:
|
||||||
|
find_results.extend(list( _filter_by_type() ))
|
||||||
|
return find_results
|
||||||
|
|
||||||
def make_dict(config, flatten=False):
|
def make_dict(config, flatten=False):
|
||||||
"""export the whole config into a `dict`
|
"""export the whole config into a `dict`
|
||||||
:returns: dict of Option's name (or path) and values"""
|
:returns: dict of Option's name (or path) and values"""
|
||||||
|
|
Loading…
Reference in New Issue