[tests] Workaround Python 2 “narrow” builds The so-called Python 2 “narrow” builds support UCS2 only, this is a workaround to allow unichr to work with any Unicode character in such builds. This fixes Travis-CI failure as it has narrow Python 2 builds. Copied from: https://github.com/behdad/fonttools/blob/master/Lib/fontTools/misc/py23.py
diff --git a/test/shaping/hb_test_tools.py b/test/shaping/hb_test_tools.py index 747699b..7473982 100644 --- a/test/shaping/hb_test_tools.py +++ b/test/shaping/hb_test_tools.py
@@ -7,7 +7,43 @@ diff_symbols = "-+=*&^%$#@!~/" diff_colors = ['red', 'green', 'blue'] -if sys.version_info[0] >= 3: +try: + unichr = unichr + + if sys.maxunicode < 0x10FFFF: + # workarounds for Python 2 "narrow" builds with UCS2-only support. + + _narrow_unichr = unichr + + def unichr(i): + """ + Return the unicode character whose Unicode code is the integer 'i'. + The valid range is 0 to 0x10FFFF inclusive. + + >>> _narrow_unichr(0xFFFF + 1) + Traceback (most recent call last): + File "<stdin>", line 1, in ? + ValueError: unichr() arg not in range(0x10000) (narrow Python build) + >>> unichr(0xFFFF + 1) == u'\U00010000' + True + >>> unichr(1114111) == u'\U0010FFFF' + True + >>> unichr(0x10FFFF + 1) + Traceback (most recent call last): + File "<stdin>", line 1, in ? + ValueError: unichr() arg not in range(0x110000) + """ + try: + return _narrow_unichr(i) + except ValueError: + try: + padded_hex_str = hex(i)[2:].zfill(8) + escape_str = "\\U" + padded_hex_str + return escape_str.decode("unicode-escape") + except UnicodeDecodeError: + raise ValueError('unichr() arg not in range(0x110000)') + +except NameError: unichr = chr class ColorFormatter: