Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
