[pypy-commit] pypy unicode-utf8: test, fix formating '%c'
mattip
pypy.commits at gmail.com
Tue Jan 1 13:29:08 EST 2019
Author: Matti Picus <matti.picus at gmail.com>
Branch: unicode-utf8
Changeset: r95560:9a0c90346239
Date: 2019-01-01 19:19 +0200
http://bitbucket.org/pypy/pypy/changeset/9a0c90346239/
Log: test, fix formating '%c'
diff --git a/pypy/objspace/std/formatting.py b/pypy/objspace/std/formatting.py
--- a/pypy/objspace/std/formatting.py
+++ b/pypy/objspace/std/formatting.py
@@ -455,6 +455,8 @@
self.prec = -1 # just because
space = self.space
if space.isinstance_w(w_value, space.w_bytes):
+ if do_unicode:
+ w_value = w_value.descr_decode(space, space.newtext('ascii'))
s = space.bytes_w(w_value)
if len(s) != 1:
raise oefmt(space.w_TypeError, "%c requires int or char")
@@ -463,7 +465,7 @@
if not do_unicode:
raise NeedUnicodeFormattingError
ustr = space.utf8_w(w_value)
- if len(ustr) != 1:
+ if space.len_w(w_value) != 1:
raise oefmt(space.w_TypeError, "%c requires int or unichar")
self.std_wp(ustr, False)
else:
@@ -516,7 +518,7 @@
formatter = UnicodeFormatter(space, fmt, values_w, w_valuedict)
result = formatter.format()
# this can force strings, not sure if it's a problem or not
- lgt = rutf8.check_utf8(result, True)
+ lgt = rutf8.codepoints_in_utf8(result)
return space.newutf8(result, lgt)
def mod_format(space, w_format, w_values, do_unicode=False):
diff --git a/pypy/objspace/std/test/test_unicodeobject.py b/pypy/objspace/std/test/test_unicodeobject.py
--- a/pypy/objspace/std/test/test_unicodeobject.py
+++ b/pypy/objspace/std/test/test_unicodeobject.py
@@ -1125,6 +1125,16 @@
return u'\u1234'
'%s' % X()
+ def test_formatting_char(self):
+ for num in range(0x80,0x100):
+ uchar = unichr(num)
+ print num
+ assert uchar == u"%c" % num # works only with ints
+ assert uchar == u"%c" % uchar # and unicode chars
+ # the implicit decoding should fail for non-ascii chars
+ raises(UnicodeDecodeError, u"%c".__mod__, chr(num))
+ raises(UnicodeDecodeError, u"%s".__mod__, chr(num))
+
def test_str_subclass(self):
class Foo9(str):
def __unicode__(self):
More information about the pypy-commit
mailing list