aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mesonlib.py
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-10-01 12:39:39 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-10-01 22:27:48 +0530
commitbb0e18b73885de374f8461c0e4f3c911fded1e46 (patch)
treeaf3dce3b6df439fd828bb97c529403b40d311448 /mesonbuild/mesonlib.py
parent24e0774acee5036a9556360fef0fe2e76ea30e02 (diff)
downloadmeson-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.py51
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.