diff --git a/setup/resources.py b/setup/resources.py index da7c246a01..0fe7a31ac3 100644 --- a/setup/resources.py +++ b/setup/resources.py @@ -12,7 +12,7 @@ from itertools import chain is_ci = os.environ.get('CI', '').lower() == 'true' from setup import Command, basenames, __appname__, download_securely, dump_json -from polyglot.builtins import codepoint_to_chr, itervalues, iteritems +from polyglot.builtins import codepoint_to_chr, itervalues, iteritems, as_unicode_recursive def get_opts_from_parser(parser): @@ -358,7 +358,7 @@ class Resources(Command): # {{{ get_opts_from_parser(p)] with open(dest, 'wb') as f: - f.write(msgpack_dumps(complete)) + f.write(msgpack_dumps(as_unicode_recursive(complete))) self.info('\tCreating template-functions.json') dest = self.j(self.RESOURCES, 'template-functions.json') diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index 353e924a1a..d98859d15a 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -35,6 +35,18 @@ def as_unicode(x, encoding='utf-8', errors='strict'): return unicode_type(x) +def as_unicode_recursive(x, encoding='utf-8', errors='strict'): + if isinstance(x, bytes): + return x.decode(x, errors) + if isinstance(x, unicode_type): + return x + if isinstance(x, (list, tuple)): + return type(x)(as_unicode_recursive(i, encoding, errors) for i in x) + if isinstance(x, dict): + return {as_unicode_recursive(k, encoding, errors): as_unicode_recursive(v, encoding, errors) for k, v in iteritems(x)} + return x + + if is_py3: def reraise(tp, value, tb=None): try: