Skip to content

Commit 31fc158

Browse files
Move the helpers to test.support.
1 parent be25362 commit 31fc158

File tree

3 files changed

+62
-60
lines changed

3 files changed

+62
-60
lines changed

Lib/test/support/__init__.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,6 +2589,61 @@ def copy_python_src_ignore(path, names):
25892589
return ignored
25902590

25912591

2592+
def iter_builtin_types():
2593+
for obj in __builtins__.values():
2594+
if not isinstance(obj, type):
2595+
continue
2596+
cls = obj
2597+
if cls.__module__ != 'builtins':
2598+
continue
2599+
yield cls
2600+
2601+
2602+
def iter_slot_wrappers(cls):
2603+
assert cls.__module__ == 'builtins', cls
2604+
2605+
def is_slot_wrapper(name, value):
2606+
if not isinstance(value, types.WrapperDescriptorType):
2607+
assert not repr(value).startswith('<slot wrapper '), (cls, name, value)
2608+
return False
2609+
assert repr(value).startswith('<slot wrapper '), (cls, name, value)
2610+
assert callable(value), (cls, name, value)
2611+
assert name.startswith('__') and name.endswith('__'), (cls, name, value)
2612+
return True
2613+
2614+
ns = vars(cls)
2615+
unused = set(ns)
2616+
for name in dir(cls):
2617+
if name in ns:
2618+
unused.remove(name)
2619+
2620+
try:
2621+
value = getattr(cls, name)
2622+
except AttributeError:
2623+
# It's as though it weren't in __dir__.
2624+
assert name in ('__annotate__', '__annotations__', '__abstractmethods__'), (cls, name)
2625+
if name in ns and is_slot_wrapper(name, ns[name]):
2626+
unused.add(name)
2627+
continue
2628+
2629+
if not name.startswith('__') or not name.endswith('__'):
2630+
assert not is_slot_wrapper(name, value), (cls, name, value)
2631+
if not is_slot_wrapper(name, value):
2632+
if name in ns:
2633+
assert not is_slot_wrapper(name, ns[name]), (cls, name, value, ns[name])
2634+
else:
2635+
if name in ns:
2636+
assert ns[name] is value, (cls, name, value, ns[name])
2637+
yield name, True
2638+
else:
2639+
yield name, False
2640+
2641+
for name in unused:
2642+
value = ns[name]
2643+
if is_slot_wrapper(cls, name, value):
2644+
yield name, True
2645+
2646+
25922647
def force_not_colorized(func):
25932648
"""Force the terminal not to be colorized."""
25942649
@functools.wraps(func)

Lib/test/test_embed.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,10 @@ def add(cls, slot, own):
436436
print(text, file=sys.stderr)
437437
""")
438438
body = []
439-
from test.test_types import iter_builtin_types, iter_slot_wrappers
440-
for cls in iter_builtin_types():
439+
for cls in support.iter_builtin_types():
441440
body.append('')
442441
body.append(f'cls = {cls.__name__}')
443-
for slot, own in iter_slot_wrappers(cls):
442+
for slot, own in support.iter_slot_wrappers(cls):
444443
body.append(f'add(cls, {slot!r}, {own})')
445444
body.pop(0)
446445
script = script.replace('{body}', os.linesep.join(body))

Lib/test/test_types.py

Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Python test set -- part 6, built-in types
22

3-
from test.support import run_with_locale, is_apple_mobile, cpython_only, MISSING_C_DOCSTRINGS
3+
from test.support import (
4+
run_with_locale, is_apple_mobile, cpython_only,
5+
iter_builtin_types, iter_slot_wrappers,
6+
MISSING_C_DOCSTRINGS,
7+
)
48
from test.test_import import no_rerun
59
import collections.abc
610
from collections import namedtuple, UserDict
@@ -30,62 +34,6 @@ def clear_typing_caches():
3034
f()
3135

3236

33-
def iter_builtin_types():
34-
for obj in __builtins__.values():
35-
if not isinstance(obj, type):
36-
continue
37-
cls = obj
38-
if cls.__module__ != 'builtins':
39-
continue
40-
yield cls
41-
42-
43-
@cpython_only
44-
def iter_slot_wrappers(cls):
45-
assert cls.__module__ == 'builtins', cls
46-
47-
def is_slot_wrapper(name, value):
48-
if not isinstance(value, types.WrapperDescriptorType):
49-
assert not repr(value).startswith('<slot wrapper '), (cls, name, value)
50-
return False
51-
assert repr(value).startswith('<slot wrapper '), (cls, name, value)
52-
assert callable(value), (cls, name, value)
53-
assert name.startswith('__') and name.endswith('__'), (cls, name, value)
54-
return True
55-
56-
ns = vars(cls)
57-
unused = set(ns)
58-
for name in dir(cls):
59-
if name in ns:
60-
unused.remove(name)
61-
62-
try:
63-
value = getattr(cls, name)
64-
except AttributeError:
65-
# It's as though it weren't in __dir__.
66-
assert name in ('__annotate__', '__annotations__', '__abstractmethods__'), (cls, name)
67-
if name in ns and is_slot_wrapper(name, ns[name]):
68-
unused.add(name)
69-
continue
70-
71-
if not name.startswith('__') or not name.endswith('__'):
72-
assert not is_slot_wrapper(name, value), (cls, name, value)
73-
if not is_slot_wrapper(name, value):
74-
if name in ns:
75-
assert not is_slot_wrapper(name, ns[name]), (cls, name, value, ns[name])
76-
else:
77-
if name in ns:
78-
assert ns[name] is value, (cls, name, value, ns[name])
79-
yield name, True
80-
else:
81-
yield name, False
82-
83-
for name in unused:
84-
value = ns[name]
85-
if is_slot_wrapper(cls, name, value):
86-
yield name, True
87-
88-
8937
class TypesTests(unittest.TestCase):
9038

9139
def test_truth_values(self):

0 commit comments

Comments
 (0)