summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-03-04 13:04:24 -0800
committerDylan Baker <dylan@pnwbakers.com>2020-03-05 09:58:52 -0800
commit581d69a8d3a726dea06e8bf0cd18bb901692b56f (patch)
treea35887377e1967b4d9fb2f9280e8d3bd410e4cb1
parentb231ff36df8e5cb21fa41a6380516c6cf5bf9c4e (diff)
downloadmeson-581d69a8d3a726dea06e8bf0cd18bb901692b56f.tar.gz
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.
-rw-r--r--mesonbuild/build.py5
-rw-r--r--mesonbuild/dependencies/boost.py2
-rw-r--r--mesonbuild/mesonlib.py11
-rw-r--r--mesonbuild/modules/gnome.py2
-rw-r--r--mesonbuild/modules/qt.py4
-rwxr-xr-xrun_unittests.py6
6 files changed, 10 insertions, 20 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 770e851a3..fcd162272 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.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
diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py
index 53a0cfb7a..b07f3ac1d 100644
--- a/mesonbuild/dependencies/boost.py
+++ b/mesonbuild/dependencies/boost.py
@@ -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.')
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py
index e93b66f8b..e215dcd99 100644
--- a/mesonbuild/mesonlib.py
+++ b/mesonbuild/mesonlib.py
@@ -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]]',
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index ec8935ef5..e087bcdea 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -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 '
diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py
index 6887bc744..b4f3a49e3 100644
--- a/mesonbuild/modules/qt.py
+++ b/mesonbuild/modules/qt.py
@@ -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:
diff --git a/run_unittests.py b/run_unittests.py
index b39ba2832..adfd92735 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -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):