taskcluster/translations_taskgraph/util/substitution.py (19 lines of code) (raw):

from typing import Any class PartialSubstitutionDict(dict): """A dictionary that will return any missing keys as their formatable version. Useful when a string needs to be formatted multiple times in different places to get to its final form.""" def __missing__(self, key): return "{" + key + "}" def substitute(item: Any, **subs): if isinstance(item, list): for i in range(len(item)): item[i] = substitute(item[i], **subs) elif isinstance(item, dict): new_dict = {} for k, v in item.items(): k = k.format_map(PartialSubstitutionDict(subs)) new_dict[k] = substitute(v, **subs) item = new_dict elif isinstance(item, str): item = item.format_map(PartialSubstitutionDict(subs)) else: item = item return item