Skip to content

Commit 0d87a0b

Browse files
authored
gh-153521: Preserve bytes message sets in imaplib (GH-153907)
Signed-off-by: cuishuang <imcusg@gmail.com>
1 parent 5d91cf6 commit 0d87a0b

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

Lib/imaplib.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ def _seq_range(item):
168168

169169

170170
def _format_sequence_set(arg):
171+
if isinstance(arg, (bytes, bytearray)):
172+
return str(arg, 'ascii')
171173
if isinstance(arg, (int, str)):
172174
return str(arg)
173175
# A sequence of message numbers and ranges.

Lib/test/test_imaplib.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@ def test_sequence_set(self):
292292
# A scalar is passed through as a string.
293293
self.assertEqual(m._sequence_set(5), '5')
294294
self.assertEqual(m._sequence_set('1:3,7'), '1:3,7')
295+
self.assertEqual(m._sequence_set(b'1:3,7'), '1:3,7')
296+
self.assertEqual(m._sequence_set(bytearray(b'1:3,7')), '1:3,7')
295297
# A sequence of numbers and ranges is formatted as a sequence set.
296298
self.assertEqual(m._sequence_set([1, 2, 5]), '1,2,5')
297299
self.assertEqual(m._sequence_set([1, (3, 5), (8, '*')]), '1,3:5,8:*')
@@ -333,6 +335,7 @@ def test_substitute(self):
333335
r'(\Seen \Answered)')
334336
# '?s' formats a message sequence set.
335337
self.assertEqual(sub('?s', [[1, (3, 5), (8, '*')]]), '1,3:5,8:*')
338+
self.assertEqual(sub('?s', [b'1:3,7']), '1:3,7')
336339
# '??' is a literal '?'.
337340
self.assertEqual(sub('a?? b', []), 'a? b')
338341

@@ -1574,6 +1577,16 @@ def cmd_FETCH(self, tag, args):
15741577
])
15751578
self.assertEqual(server.args, ['2:4', '(FLAGS)'])
15761579

1580+
# A preformatted message set may be passed as bytes.
1581+
typ, data = client.fetch(b'2:4', '(FLAGS)')
1582+
self.assertEqual(typ, 'OK')
1583+
self.assertEqual(data, [
1584+
br'2 (FLAGS (\Seen))',
1585+
br'3 (FLAGS (\Seen))',
1586+
br'4 (FLAGS (\Seen))',
1587+
])
1588+
self.assertEqual(server.args, ['2:4', '(FLAGS)'])
1589+
15771590
# A comma-separated set with an open range up to '*'.
15781591
typ, data = client.fetch('1,3:*', '(FLAGS)')
15791592
self.assertEqual(typ, 'OK')

0 commit comments

Comments
 (0)