annotate Lib/test/test_module.py @ 86127:a3d09c19bb93

merge with 3.3
author Georg Brandl <georg@python.org>
date Sun, 06 Oct 2013 19:24:00 +0200
parents cdddd3ed2ae1
children 07229c6104b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Test the module type
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
2 import unittest
84950
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
3 import weakref
65231
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
4 from test.support import run_unittest, gc_collect
84936
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
5 from test.script_helper import assert_python_ok
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 import sys
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
8 ModuleType = type(sys)
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
10 class FullLoader:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
11 @classmethod
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
12 def module_repr(cls, m):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
13 return "<module '{}' (crafted)>".format(m.__name__)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
14
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
15 class BareLoader:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
16 pass
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
17
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
18
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
19 class ModuleTests(unittest.TestCase):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
20 def test_uninitialized(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
21 # An uninitialized module has no __dict__ or __name__,
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
22 # and __doc__ is None
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
23 foo = ModuleType.__new__(ModuleType)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
24 self.assertTrue(foo.__dict__ is None)
55647
4c51c4bffb21 Merged revisions 74459 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55593
diff changeset
25 self.assertRaises(SystemError, dir, foo)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
26 try:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
27 s = foo.__name__
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
28 self.fail("__name__ = %s" % repr(s))
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
29 except AttributeError:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
30 pass
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
31 self.assertEqual(foo.__doc__, ModuleType.__doc__)
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
33 def test_no_docstring(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
34 # Regularly initialized module, no docstring
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
35 foo = ModuleType("foo")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
36 self.assertEqual(foo.__name__, "foo")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
37 self.assertEqual(foo.__doc__, None)
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
38 self.assertIs(foo.__loader__, None)
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
39 self.assertIs(foo.__package__, None)
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
40 self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None,
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
41 "__loader__": None, "__package__": None})
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
43 def test_ascii_docstring(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
44 # ASCII docstring
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
45 foo = ModuleType("foo", "foodoc")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
46 self.assertEqual(foo.__name__, "foo")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
47 self.assertEqual(foo.__doc__, "foodoc")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
48 self.assertEqual(foo.__dict__,
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
49 {"__name__": "foo", "__doc__": "foodoc",
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
50 "__loader__": None, "__package__": None})
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
52 def test_unicode_docstring(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
53 # Unicode docstring
41575
beacf40b5960 Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
54 foo = ModuleType("foo", "foodoc\u1234")
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
55 self.assertEqual(foo.__name__, "foo")
41575
beacf40b5960 Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
56 self.assertEqual(foo.__doc__, "foodoc\u1234")
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
57 self.assertEqual(foo.__dict__,
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
58 {"__name__": "foo", "__doc__": "foodoc\u1234",
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
59 "__loader__": None, "__package__": None})
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
61 def test_reinit(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
62 # Reinitialization should not replace the __dict__
41575
beacf40b5960 Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
63 foo = ModuleType("foo", "foodoc\u1234")
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
64 foo.bar = 42
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
65 d = foo.__dict__
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
66 foo.__init__("foo", "foodoc")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
67 self.assertEqual(foo.__name__, "foo")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
68 self.assertEqual(foo.__doc__, "foodoc")
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
69 self.assertEqual(foo.bar, 42)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
70 self.assertEqual(foo.__dict__,
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
71 {"__name__": "foo", "__doc__": "foodoc", "bar": 42,
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
72 "__loader__": None, "__package__": None})
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
73 self.assertTrue(foo.__dict__ is d)
23652
b40165a4efe9 Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
57210
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
75 def test_dont_clear_dict(self):
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
76 # See issue 7140.
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
77 def f():
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
78 foo = ModuleType("foo")
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
79 foo.bar = 4
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
80 return foo
65231
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
81 gc_collect()
57210
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
82 self.assertEqual(f().__dict__["bar"], 4)
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55647
diff changeset
83
65231
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
84 def test_clear_dict_in_ref_cycle(self):
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
85 destroyed = []
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
86 m = ModuleType("foo")
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
87 m.destroyed = destroyed
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
88 s = """class A:
73991
c9ae0eb66959 fix this test to actually test something (closes #13606)
Benjamin Peterson <benjamin@python.org>
parents: 65231
diff changeset
89 def __init__(self, l):
c9ae0eb66959 fix this test to actually test something (closes #13606)
Benjamin Peterson <benjamin@python.org>
parents: 65231
diff changeset
90 self.l = l
65231
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
91 def __del__(self):
73991
c9ae0eb66959 fix this test to actually test something (closes #13606)
Benjamin Peterson <benjamin@python.org>
parents: 65231
diff changeset
92 self.l.append(1)
c9ae0eb66959 fix this test to actually test something (closes #13606)
Benjamin Peterson <benjamin@python.org>
parents: 65231
diff changeset
93 a = A(destroyed)"""
65231
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
94 exec(s, m.__dict__)
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
95 del m
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
96 gc_collect()
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
97 self.assertEqual(destroyed, [1])
e2aa3b1d08bc prefer clearing global objects to obscure module.__dict__ bugs #10068
Benjamin Peterson <benjamin@python.org>
parents: 57210
diff changeset
98
84950
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
99 def test_weakref(self):
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
100 m = ModuleType("foo")
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
101 wr = weakref.ref(m)
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
102 self.assertIs(wr(), m)
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
103 del m
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
104 gc_collect()
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
105 self.assertIs(wr(), None)
cdddd3ed2ae1 Add a test for module weakrefability
Antoine Pitrou <solipsis@pitrou.net>
parents: 84936
diff changeset
106
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
107 def test_module_repr_minimal(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
108 # reprs when modules have no __file__, __name__, or __loader__
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
109 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
110 del m.__name__
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
111 self.assertEqual(repr(m), "<module '?'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
112
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
113 def test_module_repr_with_name(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
114 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
115 self.assertEqual(repr(m), "<module 'foo'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
116
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
117 def test_module_repr_with_name_and_filename(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
118 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
119 m.__file__ = '/tmp/foo.py'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
120 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
121
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
122 def test_module_repr_with_filename_only(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
123 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
124 del m.__name__
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
125 m.__file__ = '/tmp/foo.py'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
126 self.assertEqual(repr(m), "<module '?' from '/tmp/foo.py'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
127
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
128 def test_module_repr_with_loader_as_None(self):
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
129 m = ModuleType('foo')
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
130 assert m.__loader__ is None
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
131 self.assertEqual(repr(m), "<module 'foo'>")
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
132
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
133 def test_module_repr_with_bare_loader_but_no_name(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
134 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
135 del m.__name__
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
136 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
137 m.__loader__ = BareLoader
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
138 loader_repr = repr(BareLoader)
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
139 self.assertEqual(
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
140 repr(m), "<module '?' ({})>".format(loader_repr))
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
141
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
142 def test_module_repr_with_full_loader_but_no_name(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
143 # m.__loader__.module_repr() will fail because the module has no
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
144 # m.__name__. This exception will get suppressed and instead the
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
145 # loader's repr will be used.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
146 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
147 del m.__name__
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
148 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
149 m.__loader__ = FullLoader
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
150 loader_repr = repr(FullLoader)
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
151 self.assertEqual(
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
152 repr(m), "<module '?' ({})>".format(loader_repr))
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
153
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
154 def test_module_repr_with_bare_loader(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
155 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
156 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
157 m.__loader__ = BareLoader
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
158 module_repr = repr(BareLoader)
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
159 self.assertEqual(
83607
e39a8f8ceb9f #17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents: 77126
diff changeset
160 repr(m), "<module 'foo' ({})>".format(module_repr))
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
161
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
162 def test_module_repr_with_full_loader(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
163 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
164 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
165 m.__loader__ = FullLoader
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
166 self.assertEqual(
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
167 repr(m), "<module 'foo' (crafted)>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
168
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
169 def test_module_repr_with_bare_loader_and_filename(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
170 # Because the loader has no module_repr(), use the file name.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
171 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
172 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
173 m.__loader__ = BareLoader
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
174 m.__file__ = '/tmp/foo.py'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
175 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
176
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
177 def test_module_repr_with_full_loader_and_filename(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
178 # Even though the module has an __file__, use __loader__.module_repr()
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
179 m = ModuleType('foo')
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
180 # Yes, a class not an instance.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
181 m.__loader__ = FullLoader
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
182 m.__file__ = '/tmp/foo.py'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
183 self.assertEqual(repr(m), "<module 'foo' (crafted)>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
184
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
185 def test_module_repr_builtin(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
186 self.assertEqual(repr(sys), "<module 'sys' (built-in)>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
187
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
188 def test_module_repr_source(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
189 r = repr(unittest)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
190 self.assertEqual(r[:25], "<module 'unittest' from '")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
191 self.assertEqual(r[-13:], "__init__.py'>")
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
192
84936
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
193 def test_module_finalization_at_shutdown(self):
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
194 # Module globals and builtins should still be available during shutdown
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
195 rc, out, err = assert_python_ok("-c", "from test import final_a")
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
196 self.assertFalse(err)
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
197 lines = out.splitlines()
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
198 self.assertEqual(set(lines), {
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
199 b"x = a",
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
200 b"x = b",
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
201 b"final_a.x = a",
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
202 b"final_b.x = b",
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
203 b"len = len",
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
204 b"shutil.rmtree = rmtree"})
79e2f5bbc30c Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83607
diff changeset
205
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
206 # frozen and namespace module reprs are tested in importlib.
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
207
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
208
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
209 def test_main():
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
210 run_unittest(ModuleTests)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
211
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 75097
diff changeset
212
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
213 if __name__ == '__main__':
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
214 test_main()