diff options
author | Nirbheek Chauhan <nirbheek@centricular.com> | 2017-10-01 12:39:39 +0530 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2017-10-01 22:27:48 +0530 |
commit | bb0e18b73885de374f8461c0e4f3c911fded1e46 (patch) | |
tree | af3dce3b6df439fd828bb97c529403b40d311448 /mesonbuild/mesonlib.py | |
parent | 24e0774acee5036a9556360fef0fe2e76ea30e02 (diff) | |
download | meson-bb0e18b73885de374f8461c0e4f3c911fded1e46.zip meson-bb0e18b73885de374f8461c0e4f3c911fded1e46.tar.gz meson-bb0e18b73885de374f8461c0e4f3c911fded1e46.tar.bz2 |
Use listify and extract_as_list everywhere
They now flatten by default and unhold objects if required
Includes unit tests.
Diffstat (limited to 'mesonbuild/mesonlib.py')
-rw-r--r-- | mesonbuild/mesonlib.py | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 95af3ea..5c4c374 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -199,9 +199,6 @@ def classify_unity_sources(compilers, sources): compsrclist[comp].append(src) return compsrclist -def flatten(item): - return listify(item, flatten=True) - def is_osx(): return platform.system().lower() == 'darwin' @@ -466,34 +463,45 @@ def replace_if_different(dst, dst_tmp): else: os.unlink(dst_tmp) - -def listify(item, flatten=True): +def listify(item, flatten=True, unholder=False): ''' - Returns a list with all args embedded in a list if they are not of type list. + Returns a list with all args embedded in a list if they are not a list. This function preserves order. + @flatten: Convert lists of lists to a flat list + @unholder: Replace each item with the object it holds, if required + + Note: unholding only works recursively when flattening ''' if not isinstance(item, list): + if unholder and hasattr(item, 'held_object'): + item = item.held_object return [item] result = [] - if flatten: - for i in item: - if isinstance(i, list): - result += listify(i, flatten=True) - else: - result.append(i) - else: - for i in item: + for i in item: + if unholder and hasattr(i, 'held_object'): + i = i.held_object + if flatten and isinstance(i, list): + result += listify(i, flatten=True, unholder=unholder) + else: result.append(i) return result -def extract_as_list(dict_object, *keys, pop=False): +def extract_as_list(dict_object, *keys, pop=False, **kwargs): ''' Extracts all values from given dict_object and listifies them. ''' + result = [] + fetch = dict_object.get if pop: - return flatten([dict_object.pop(key, []) for key in keys]) - return flatten([dict_object.get(key, []) for key in keys]) + 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], []), **kwargs) + # Return a list of values corresponding to *keys + for key in keys: + result.append(listify(fetch(key, []), **kwargs)) + return result def typeslistify(item, types): @@ -752,15 +760,6 @@ def windows_proof_rmtree(f): # Try one last time and throw if it fails. shutil.rmtree(f) -def unholder_array(entries): - result = [] - entries = flatten(entries) - for e in entries: - if hasattr(e, 'held_object'): - e = e.held_object - result.append(e) - return result - class OrderedSet(collections.MutableSet): """A set that preserves the order in which items are added, by first insertion. |