From 6926c30b3c05852517daf57cf929bdd9a7a09aa8 Mon Sep 17 00:00:00 2001 From: Radovan Bast Date: Mon, 18 Apr 2016 11:44:08 +0200 Subject: [PATCH] extend interpolation to lists --- update.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/update.py b/update.py index 4c35eca..1aa1278 100644 --- a/update.py +++ b/update.py @@ -47,16 +47,25 @@ def test_replace(): def interpolate(d, d_map): - from collections import Mapping + from collections import Mapping, Iterable for k, v in d.items(): if isinstance(v, Mapping): d[k] = interpolate(d[k], d_map) + elif not isinstance(v, str) and isinstance(v, Iterable): + l = [] + for x in v: + if isinstance(x, Mapping): + l.append(interpolate(x, d_map)) + else: + l.append(replace(x, d_map)) + d[k] = l.copy() else: d[k] = replace(d[k], d_map) return d def test_interpolate(): + from collections import OrderedDict d = {'foo': 'hey', 'bar': 'ho', 'one': 'hey %(foo) ho %(bar)', @@ -68,6 +77,10 @@ def test_interpolate(): 'two': {'one': 'hey hey ho ho', 'two': 'raboof'}} assert interpolate(d, d) == d_interpolated + d2 = {'modules': [{'fc': [{'source': '%(url_root)fc_optional.cmake'}]}], 'url_root': 'downloaded/downloaded_'} + d2_interpolated = {'modules': [{'fc': [{'source': 'downloaded/downloaded_fc_optional.cmake'}]}], 'url_root': 'downloaded/downloaded_'} + assert interpolate(d2, d2) == d2_interpolated + # ------------------------------------------------------------------------------ @@ -89,6 +102,7 @@ def fetch_url(src, dst): def parse_yaml(file_name): import yaml + from collections import OrderedDict def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict): class OrderedLoader(Loader):