Skip to content

Commit 1533854

Browse files
committed
Add support for proper %s formatting of newbytes
1 parent 39a066e commit 1533854

File tree

2 files changed

+48
-15
lines changed

2 files changed

+48
-15
lines changed

src/future/types/newbytes.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,22 @@ def __mul__(self, other):
174174
def __rmul__(self, other):
175175
return newbytes(super(newbytes, self).__rmul__(other))
176176

177+
def __mod__(self, vals):
178+
if isinstance(vals, newbytes):
179+
vals = _builtin_bytes.__str__(vals)
180+
elif isinstance(vals, dict):
181+
for k, v in vals.items():
182+
if isinstance(v, newbytes):
183+
vals[k] = _builtin_bytes.__str__(v)
184+
elif isinstance(vals, tuple):
185+
newvals = []
186+
for v in vals:
187+
if isinstance(v, newbytes):
188+
v = _builtin_bytes.__str__(v)
189+
newvals.append(v)
190+
vals = tuple(newvals)
191+
return _builtin_bytes.__mod__(self, vals)
192+
177193
def join(self, iterable_of_bytes):
178194
errmsg = 'sequence item {0}: expected bytes, {1} found'
179195
if isbytes(iterable_of_bytes) or istext(iterable_of_bytes):

tests/test_future/test_bytes.py

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -552,21 +552,38 @@ def test_maketrans(self):
552552
self.assertRaises(ValueError, bytes.maketrans, b'abc', b'xyzq')
553553
self.assertRaises(TypeError, bytes.maketrans, 'abc', 'def')
554554

555-
# def test_mod(self):
556-
# """
557-
# From Py3.5 test suite (post-PEP 461).
558-
#
559-
# The bytes mod code is in _PyBytes_Format() in bytesobject.c in Py3.5.
560-
# """
561-
# b = b'hello, %b!'
562-
# orig = b
563-
# b = b % b'world'
564-
# self.assertEqual(b, b'hello, world!')
565-
# self.assertEqual(orig, b'hello, %b!')
566-
# self.assertFalse(b is orig)
567-
# b = b'%s / 100 = %d%%'
568-
# a = b % (b'seventy-nine', 79)
569-
# self.assertEqual(a, b'seventy-nine / 100 = 79%')
555+
def test_mod_more(self):
556+
self.assertEqual(b'%s' % b'aaa', b'aaa')
557+
self.assertEqual(bytes(b'%s') % b'aaa', b'aaa')
558+
self.assertEqual(bytes(b'%s') % bytes(b'aaa'), b'aaa')
559+
560+
self.assertEqual(b'%s' % (b'aaa',), b'aaa')
561+
self.assertEqual(bytes(b'%s') % (b'aaa',), b'aaa')
562+
self.assertEqual(bytes(b'%s') % (bytes(b'aaa'),), b'aaa')
563+
564+
self.assertEqual(bytes(b'%(x)s') % {'x': b'aaa'}, b'aaa')
565+
self.assertEqual(bytes(b'%(x)s') % {'x': bytes(b'aaa')}, b'aaa')
566+
567+
def test_mod(self):
568+
"""
569+
From Py3.5 test suite (post-PEP 461).
570+
571+
The bytes mod code is in _PyBytes_Format() in bytesobject.c in Py3.5.
572+
"""
573+
# b = bytes(b'hello, %b!')
574+
# orig = b
575+
# b = b % b'world'
576+
# self.assertEqual(b, b'hello, world!')
577+
# self.assertEqual(orig, b'hello, %b!')
578+
# self.assertFalse(b is orig)
579+
580+
b = bytes(b'%s / 100 = %d%%')
581+
a = b % (b'seventy-nine', 79)
582+
self.assertEqual(a, b'seventy-nine / 100 = 79%')
583+
584+
b = bytes(b'%s / 100 = %d%%')
585+
a = b % (bytes(b'seventy-nine'), 79)
586+
self.assertEqual(a, b'seventy-nine / 100 = 79%')
570587

571588
# def test_imod(self):
572589
# """

0 commit comments

Comments
 (0)