find in api return an api object

This commit is contained in:
2018-04-10 12:33:51 +02:00
parent 9ea373efdf
commit 5eb2f04202
13 changed files with 280 additions and 267 deletions

View File

@ -19,6 +19,7 @@
# the whole pypy projet is under MIT licence
# ____________________________________________________________
from copy import copy
from itertools import chain
from ..i18n import _
@ -254,74 +255,61 @@ class OptionDescriptionWalk(CacheOptionDescription):
bytype,
byname,
_subpath,
only_first,
config_bag):
find_results = []
def _filter_by_type(path,
option):
if isinstance(option,
bytype):
if byname is None:
if option.issubdyn():
for doption in self.build_dynoptions(option, config_bag):
dpath = doption.impl_getname(config_bag.config)
yield (dpath, doption)
else:
yield (path, option)
def _filter_by_name(path,
option):
name = option.impl_getname()
if option.issubdyn():
found = False
if byname.startswith(name):
for doption in self.build_dynoptions(option, config_bag):
if byname == doption.impl_getname():
dpath = doption.impl_getpath(config_bag.config)
find_results.append((dpath, doption))
found = True
yield (dpath, doption)
break
if not found:
return False
else:
if not byname == name:
return False
find_results.append((path, option))
return True
def _filter_by_type(path,
option):
if isinstance(option,
bytype):
#if byname is not None, check option byname in _filter_by_name
#not here
if byname is None:
if option.issubdyn():
for doption in self.build_dynoptions(option, config_bag):
dpath = doption.impl_getname(config_bag.config)
find_results.append((dpath, doption))
else:
find_results.append((path, option))
return True
return False
if byname == name:
yield (path, option)
def _filter(path, option):
generators = []
if bytype is not None:
retval = _filter_by_type(path, option)
if byname is None:
return retval
generators.append(_filter_by_type(path, option))
if byname is not None:
return _filter_by_name(path, option)
generators.append(_filter_by_name(path, option))
if len(generators) == 1:
return generators[0]
else:
return chain(*generators)
opts, paths = self._cache_paths
for index, path in enumerate(paths):
option = opts[index]
for index, option in enumerate(opts):
if option.impl_is_optiondescription():
continue
path = paths[index]
if _subpath is not None and not path.startswith(_subpath + '.'):
continue
if bytype == byname is None:
if option.issubdyn():
for doption in self.build_dynoptions(option, config_bag):
dpath = doption.impl_getpath(config_bag.config)
find_results.append((dpath, doption))
yield (dpath, doption)
else:
find_results.append((dpath, option))
yield (dpath, option)
else:
if _filter(path, option) is False:
continue
if only_first:
return find_results
return find_results
for ret in _filter(path, option):
yield ret
def impl_getchild(self,
name,