Skip to content

Commit 560540c

Browse files
Move the helpers to test.support.
1 parent 777511f commit 560540c

3 files changed

Lines changed: 58 additions & 59 deletions

File tree

Lib/test/support/__init__.py

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

26102610

2611+
def iter_builtin_types():
2612+
for obj in __builtins__.values():
2613+
if not isinstance(obj, type):
2614+
continue
2615+
cls = obj
2616+
if cls.__module__ != 'builtins':
2617+
continue
2618+
yield cls
2619+
2620+
2621+
def iter_slot_wrappers(cls):
2622+
assert cls.__module__ == 'builtins', cls
2623+
2624+
def is_slot_wrapper(name, value):
2625+
if not isinstance(value, types.WrapperDescriptorType):
2626+
assert not repr(value).startswith('<slot wrapper '), (cls, name, value)
2627+
return False
2628+
assert repr(value).startswith('<slot wrapper '), (cls, name, value)
2629+
assert callable(value), (cls, name, value)
2630+
assert name.startswith('__') and name.endswith('__'), (cls, name, value)
2631+
return True
2632+
2633+
ns = vars(cls)
2634+
unused = set(ns)
2635+
for name in dir(cls):
2636+
if name in ns:
2637+
unused.remove(name)
2638+
2639+
try:
2640+
value = getattr(cls, name)
2641+
except AttributeError:
2642+
# It's as though it weren't in __dir__.
2643+
assert name in ('__annotate__', '__annotations__', '__abstractmethods__'), (cls, name)
2644+
if name in ns and is_slot_wrapper(name, ns[name]):
2645+
unused.add(name)
2646+
continue
2647+
2648+
if not name.startswith('__') or not name.endswith('__'):
2649+
assert not is_slot_wrapper(name, value), (cls, name, value)
2650+
if not is_slot_wrapper(name, value):
2651+
if name in ns:
2652+
assert not is_slot_wrapper(name, ns[name]), (cls, name, value, ns[name])
2653+
else:
2654+
if name in ns:
2655+
assert ns[name] is value, (cls, name, value, ns[name])
2656+
yield name, True
2657+
else:
2658+
yield name, False
2659+
2660+
for name in unused:
2661+
value = ns[name]
2662+
if is_slot_wrapper(cls, name, value):
2663+
yield name, True
2664+
2665+
26112666
def force_not_colorized(func):
26122667
"""Force the terminal not to be colorized."""
26132668
@functools.wraps(func)

Lib/test/test_embed.py

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

Lib/test/test_types.py

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from test.support import (
44
run_with_locale, is_apple_mobile, cpython_only, no_rerun,
5+
iter_builtin_types, iter_slot_wrappers,
56
MISSING_C_DOCSTRINGS,
67
)
78
import collections.abc
@@ -32,62 +33,6 @@ def clear_typing_caches():
3233
f()
3334

3435

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

9338
def test_truth_values(self):

0 commit comments

Comments
 (0)