Skip to content

Commit 6b48e65

Browse files
bpo-36929: Modify io/re tests to allow for missing mod name (GH-13392)
* bpo-36929: Modify io/re tests to allow for missing mod name For a vanishingly small number of internal types, CPython sets the tp_name slot to mod_name.type_name, either in the PyTypeObject or the PyType_Spec. There are a few minor places where this surfaces: * Custom repr functions for those types (some of which ignore the tp_name in favor of using a string literal, such as _io.TextIOWrapper) * Pickling error messages The test suite only tests the former. This commit modifies the test suite to allow Python implementations to omit the module prefix. https://bugs.python.org/issue36929 (cherry picked from commit ccb7ca7) Co-authored-by: Max Bernstein <[email protected]>
1 parent 3c9c2dc commit 6b48e65

File tree

3 files changed

+34
-29
lines changed

3 files changed

+34
-29
lines changed

Lib/test/test_io.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,12 +1104,12 @@ def f():
11041104
def test_repr(self):
11051105
raw = self.MockRawIO()
11061106
b = self.tp(raw)
1107-
clsname = "%s.%s" % (self.tp.__module__, self.tp.__qualname__)
1108-
self.assertEqual(repr(b), "<%s>" % clsname)
1107+
clsname = r"(%s\.)?%s" % (self.tp.__module__, self.tp.__qualname__)
1108+
self.assertRegex(repr(b), "<%s>" % clsname)
11091109
raw.name = "dummy"
1110-
self.assertEqual(repr(b), "<%s name='dummy'>" % clsname)
1110+
self.assertRegex(repr(b), "<%s name='dummy'>" % clsname)
11111111
raw.name = b"dummy"
1112-
self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname)
1112+
self.assertRegex(repr(b), "<%s name=b'dummy'>" % clsname)
11131113

11141114
def test_recursive_repr(self):
11151115
# Issue #25455
@@ -2565,17 +2565,17 @@ def test_repr(self):
25652565
b = self.BufferedReader(raw)
25662566
t = self.TextIOWrapper(b, encoding="utf-8")
25672567
modname = self.TextIOWrapper.__module__
2568-
self.assertEqual(repr(t),
2569-
"<%s.TextIOWrapper encoding='utf-8'>" % modname)
2568+
self.assertRegex(repr(t),
2569+
r"<(%s\.)?TextIOWrapper encoding='utf-8'>" % modname)
25702570
raw.name = "dummy"
2571-
self.assertEqual(repr(t),
2572-
"<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
2571+
self.assertRegex(repr(t),
2572+
r"<(%s\.)?TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
25732573
t.mode = "r"
2574-
self.assertEqual(repr(t),
2575-
"<%s.TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname)
2574+
self.assertRegex(repr(t),
2575+
r"<(%s\.)?TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname)
25762576
raw.name = b"dummy"
2577-
self.assertEqual(repr(t),
2578-
"<%s.TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname)
2577+
self.assertRegex(repr(t),
2578+
r"<(%s\.)?TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname)
25792579

25802580
t.buffer.detach()
25812581
repr(t) # Should not raise an exception
@@ -4098,11 +4098,11 @@ def run():
40984098
err = res.err.decode()
40994099
if res.rc != 0:
41004100
# Failure: should be a fatal error
4101-
self.assertIn("Fatal Python error: could not acquire lock "
4102-
"for <_io.BufferedWriter name='<{stream_name}>'> "
4103-
"at interpreter shutdown, possibly due to "
4104-
"daemon threads".format_map(locals()),
4105-
err)
4101+
pattern = (r"Fatal Python error: could not acquire lock "
4102+
r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> "
4103+
r"at interpreter shutdown, possibly due to "
4104+
r"daemon threads".format_map(locals()))
4105+
self.assertRegex(err, pattern)
41064106
else:
41074107
self.assertFalse(err.strip('.!'))
41084108

Lib/test/test_re.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,24 +1736,28 @@ def test_issue17998(self):
17361736
def test_match_repr(self):
17371737
for string in '[abracadabra]', S('[abracadabra]'):
17381738
m = re.search(r'(.+)(.*?)\1', string)
1739-
self.assertEqual(repr(m), "<%s.%s object; "
1740-
"span=(1, 12), match='abracadabra'>" %
1741-
(type(m).__module__, type(m).__qualname__))
1739+
pattern = r"<(%s\.)?%s object; span=\(1, 12\), match='abracadabra'>" % (
1740+
type(m).__module__, type(m).__qualname__
1741+
)
1742+
self.assertRegex(repr(m), pattern)
17421743
for string in (b'[abracadabra]', B(b'[abracadabra]'),
17431744
bytearray(b'[abracadabra]'),
17441745
memoryview(b'[abracadabra]')):
17451746
m = re.search(br'(.+)(.*?)\1', string)
1746-
self.assertEqual(repr(m), "<%s.%s object; "
1747-
"span=(1, 12), match=b'abracadabra'>" %
1748-
(type(m).__module__, type(m).__qualname__))
1747+
pattern = r"<(%s\.)?%s object; span=\(1, 12\), match=b'abracadabra'>" % (
1748+
type(m).__module__, type(m).__qualname__
1749+
)
1750+
self.assertRegex(repr(m), pattern)
17491751

17501752
first, second = list(re.finditer("(aa)|(bb)", "aa bb"))
1751-
self.assertEqual(repr(first), "<%s.%s object; "
1752-
"span=(0, 2), match='aa'>" %
1753-
(type(second).__module__, type(first).__qualname__))
1754-
self.assertEqual(repr(second), "<%s.%s object; "
1755-
"span=(3, 5), match='bb'>" %
1756-
(type(second).__module__, type(second).__qualname__))
1753+
pattern = r"<(%s\.)?%s object; span=\(0, 2\), match='aa'>" % (
1754+
type(second).__module__, type(second).__qualname__
1755+
)
1756+
self.assertRegex(repr(first), pattern)
1757+
pattern = r"<(%s\.)?%s object; span=\(3, 5\), match='bb'>" % (
1758+
type(second).__module__, type(second).__qualname__
1759+
)
1760+
self.assertRegex(repr(second), pattern)
17571761

17581762
def test_zerowidth(self):
17591763
# Issues 852532, 1647489, 3262, 25054.

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ Michel Van den Bergh
141141
Julian Berman
142142
Brice Berna
143143
Olivier Bernard
144+
Maxwell Bernstein
144145
Eric Beser
145146
Steven Bethard
146147
Stephen Bevan

0 commit comments

Comments
 (0)