remove ability to pass multiple keys to extract_as_list

This makes the typing annotations basically impossible to get right, but
if we only have one key then it's easy. Fortunately python provides
comprehensions, so we don't even need the ability to pass multiple keys,
we can just [extract_as_list(kwargs, c) for c in ('a', 'b', 'c')] and
get the same result.
pull/6736/head
Dylan Baker 5 years ago
parent b231ff36df
commit 581d69a8d3
  1. 5
      mesonbuild/build.py
  2. 2
      mesonbuild/dependencies/boost.py
  3. 11
      mesonbuild/mesonlib.py
  4. 2
      mesonbuild/modules/gnome.py
  5. 4
      mesonbuild/modules/qt.py
  6. 6
      run_unittests.py

@ -827,8 +827,7 @@ just like those detected with the dependency() function.''')
self.link_whole(linktarget)
c_pchlist, cpp_pchlist, clist, cpplist, cudalist, cslist, valalist, objclist, objcpplist, fortranlist, rustlist \
= extract_as_list(kwargs, 'c_pch', 'cpp_pch', 'c_args', 'cpp_args', 'cuda_args', 'cs_args', 'vala_args', 'objc_args',
'objcpp_args', 'fortran_args', 'rust_args')
= [extract_as_list(kwargs, c) for c in ['c_pch', 'cpp_pch', 'c_args', 'cpp_args', 'cuda_args', 'cs_args', 'vala_args', 'objc_args', 'objcpp_args', 'fortran_args', 'rust_args']]
self.add_pch('c', c_pchlist)
self.add_pch('cpp', cpp_pchlist)
@ -2161,7 +2160,7 @@ class CustomTarget(Target):
self.build_always_stale = kwargs['build_always_stale']
if not isinstance(self.build_always_stale, bool):
raise InvalidArguments('Argument build_always_stale must be a boolean.')
extra_deps, depend_files = extract_as_list(kwargs, 'depends', 'depend_files', pop = False)
extra_deps, depend_files = [extract_as_list(kwargs, c, pop=False) for c in ['depends', 'depend_files']]
for ed in extra_deps:
while hasattr(ed, 'held_object'):
ed = ed.held_object

@ -272,7 +272,7 @@ class BoostDependency(ExternalDependency):
self.boost_root = None
# Extract and validate modules
self.modules = mesonlib.extract_as_list(kwargs, 'modules')
self.modules = mesonlib.extract_as_list(kwargs, 'modules') # type: T.List[str]
for i in self.modules:
if not isinstance(i, str):
raise DependencyException('Boost module argument is not a string.')

@ -1075,22 +1075,15 @@ def listify(item: T.Any, flatten: bool = True) -> T.List[T.Any]:
return result
def extract_as_list(dict_object: T.Dict[_T, _U], *keys: _T, pop: bool = False,
flatten: bool = True) -> T.List[T.Union[_U, T.List[_U]]]:
def extract_as_list(dict_object: T.Dict[_T, _U], key: _T, pop: bool = False) -> T.List[_U]:
'''
Extracts all values from given dict_object and listifies them.
'''
result = [] # type: T.List[T.Union[_U, T.List[_U]]]
fetch = dict_object.get
if pop:
fetch = dict_object.pop
# If there's only one key, we don't return a list with one element
if len(keys) == 1:
return listify(fetch(keys[0], []), flatten=True)
# Return a list of values corresponding to *keys
for key in keys:
result.append(listify(fetch(key, []), flatten=True))
return result
return listify(fetch(key, []), flatten=True)
def typeslistify(item: 'T.Union[_T, T.Sequence[_T]]',

@ -98,7 +98,7 @@ class GnomeModule(ExtensionModule):
cmd = ['glib-compile-resources', '@INPUT@']
source_dirs, dependencies = mesonlib.extract_as_list(kwargs, 'source_dir', 'dependencies', pop=True)
source_dirs, dependencies = [mesonlib.extract_as_list(kwargs, c, pop=True) for c in ['source_dir', 'dependencies']]
if len(args) < 2:
raise MesonException('Not enough arguments; the name of the resource '

@ -123,7 +123,7 @@ class QtBaseModule(ExtensionModule):
@permittedKwargs({'moc_headers', 'moc_sources', 'uic_extra_arguments', 'moc_extra_arguments', 'rcc_extra_arguments', 'include_directories', 'dependencies', 'ui_files', 'qresources', 'method'})
def preprocess(self, state, args, kwargs):
rcc_files, ui_files, moc_headers, moc_sources, uic_extra_arguments, moc_extra_arguments, rcc_extra_arguments, sources, include_directories, dependencies \
= extract_as_list(kwargs, 'qresources', 'ui_files', 'moc_headers', 'moc_sources', 'uic_extra_arguments', 'moc_extra_arguments', 'rcc_extra_arguments', 'sources', 'include_directories', 'dependencies', pop = True)
= [extract_as_list(kwargs, c, pop=True) for c in ['qresources', 'ui_files', 'moc_headers', 'moc_sources', 'uic_extra_arguments', 'moc_extra_arguments', 'rcc_extra_arguments', 'sources', 'include_directories', 'dependencies']]
sources += args[1:]
method = kwargs.get('method', 'auto')
self._detect_tools(state.environment, method)
@ -202,7 +202,7 @@ class QtBaseModule(ExtensionModule):
@FeatureNew('qt.compile_translations', '0.44.0')
@permittedKwargs({'ts_files', 'install', 'install_dir', 'build_by_default', 'method'})
def compile_translations(self, state, args, kwargs):
ts_files, install_dir = extract_as_list(kwargs, 'ts_files', 'install_dir', pop=True)
ts_files, install_dir = [extract_as_list(kwargs, c, pop=True) for c in ['ts_files', 'install_dir']]
self._detect_tools(state.environment, kwargs.get('method', 'auto'))
translations = []
for ts in ts_files:

@ -706,17 +706,15 @@ class InternalTests(unittest.TestCase):
self.assertEqual(kwargs, {'sources': [1, 2, 3]})
self.assertEqual([1, 2, 3], extract(kwargs, 'sources', pop=True))
self.assertEqual(kwargs, {})
# Test unholding
holder3 = ObjectHolder(3)
kwargs = {'sources': [1, 2, holder3]}
self.assertEqual(kwargs, {'sources': [1, 2, holder3]})
# Test listification
kwargs = {'sources': [1, 2, 3], 'pch_sources': [4, 5, 6]}
self.assertEqual([[1, 2, 3], [4, 5, 6]], extract(kwargs, 'sources', 'pch_sources'))
# flatten nested lists
kwargs = {'sources': [1, [2, [3]]]}
self.assertEqual([1, 2, 3], extract(kwargs, 'sources', flatten=True))
self.assertEqual([1, 2, 3], extract(kwargs, 'sources'))
def test_pkgconfig_module(self):

Loading…
Cancel
Save