annotate Lib/test/test_pkgutil.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 59f3e50061bd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
1 from test.support import run_unittest, unload, check_warnings
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2 import unittest
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
3 import sys
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
4 import importlib
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
5 import pkgutil
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
6 import os
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
7 import os.path
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
8 import tempfile
84154
bc18b5d4920e Issue #17177: Stop using imp in a bunch of tests
Brett Cannon <brett@python.org>
parents: 83366
diff changeset
9 import types
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
10 import shutil
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
11 import zipfile
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
12
78111
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
13 # Note: pkgutil.walk_packages is currently tested in test_runpy. This is
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
14 # a hack to get a major issue resolved for 3.3b2. Longer term, it should
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
15 # be moved back here, perhaps by factoring out the helper code for
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
16 # creating interesting package layouts to a separate module.
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
17 # Issue #15348 declares this is indeed a dodgy hack ;)
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
18
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
19 class PkgutilTests(unittest.TestCase):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
20
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
21 def setUp(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
22 self.dirname = tempfile.mkdtemp()
72799
ff72f76dcf43 Issue #7367: Ensure test directory always gets removed.
Ned Deily <nad@acm.org>
parents: 72773
diff changeset
23 self.addCleanup(shutil.rmtree, self.dirname)
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
24 sys.path.insert(0, self.dirname)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
25
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
26 def tearDown(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
27 del sys.path[0]
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
28
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
29 def test_getdata_filesys(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
30 pkg = 'test_getdata_filesys'
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
31
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
32 # Include a LF and a CRLF, to test that binary data is read back
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
33 RESOURCE_DATA = b'Hello, world!\nSecond line\r\nThird line'
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
34
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
35 # Make a package with some resources
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
36 package_dir = os.path.join(self.dirname, pkg)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
37 os.mkdir(package_dir)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
38 # Empty init.py
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
39 f = open(os.path.join(package_dir, '__init__.py'), "wb")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
40 f.close()
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
41 # Resource files, res.txt, sub/res.txt
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
42 f = open(os.path.join(package_dir, 'res.txt'), "wb")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
43 f.write(RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
44 f.close()
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
45 os.mkdir(os.path.join(package_dir, 'sub'))
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
46 f = open(os.path.join(package_dir, 'sub', 'res.txt'), "wb")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
47 f.write(RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
48 f.close()
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
49
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
50 # Check we can read the resources
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
51 res1 = pkgutil.get_data(pkg, 'res.txt')
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
52 self.assertEqual(res1, RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
53 res2 = pkgutil.get_data(pkg, 'sub/res.txt')
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
54 self.assertEqual(res2, RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
55
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
56 del sys.modules[pkg]
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
57
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
58 def test_getdata_zipfile(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
59 zip = 'test_getdata_zipfile.zip'
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
60 pkg = 'test_getdata_zipfile'
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
61
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
62 # Include a LF and a CRLF, to test that binary data is read back
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
63 RESOURCE_DATA = b'Hello, world!\nSecond line\r\nThird line'
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
64
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
65 # Make a package with some resources
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
66 zip_file = os.path.join(self.dirname, zip)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
67 z = zipfile.ZipFile(zip_file, 'w')
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
68
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
69 # Empty init.py
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
70 z.writestr(pkg + '/__init__.py', "")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
71 # Resource files, res.txt, sub/res.txt
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
72 z.writestr(pkg + '/res.txt', RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
73 z.writestr(pkg + '/sub/res.txt', RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
74 z.close()
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
75
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
76 # Check we can read the resources
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
77 sys.path.insert(0, zip_file)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
78 res1 = pkgutil.get_data(pkg, 'res.txt')
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
79 self.assertEqual(res1, RESOURCE_DATA)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
80 res2 = pkgutil.get_data(pkg, 'sub/res.txt')
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
81 self.assertEqual(res2, RESOURCE_DATA)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
82
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
83 names = []
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
84 for loader, name, ispkg in pkgutil.iter_modules([zip_file]):
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
85 names.append(name)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
86 self.assertEqual(names, ['test_getdata_zipfile'])
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47201
diff changeset
87
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
88 del sys.path[0]
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
89
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
90 del sys.modules[pkg]
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
91
72773
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
92 def test_unreadable_dir_on_syspath(self):
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
93 # issue7367 - walk_packages failed if unreadable dir on sys.path
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
94 package_name = "unreadable_package"
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
95 d = os.path.join(self.dirname, package_name)
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
96 # this does not appear to create an unreadable dir on Windows
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
97 # but the test should not fail anyway
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
98 os.mkdir(d, 0)
72799
ff72f76dcf43 Issue #7367: Ensure test directory always gets removed.
Ned Deily <nad@acm.org>
parents: 72773
diff changeset
99 self.addCleanup(os.rmdir, d)
72773
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
100 for t in pkgutil.walk_packages(path=[self.dirname]):
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
101 self.fail("unexpected package found")
a1e6633ef3f1 Issue #7367: Add test case to test_pkgutil for walking path with
Ned Deily <nad@acm.org>
parents: 55602
diff changeset
102
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
103 class PkgutilPEP302Tests(unittest.TestCase):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
104
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
105 class MyTestLoader(object):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
106 def load_module(self, fullname):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
107 # Create an empty module
84154
bc18b5d4920e Issue #17177: Stop using imp in a bunch of tests
Brett Cannon <brett@python.org>
parents: 83366
diff changeset
108 mod = sys.modules.setdefault(fullname, types.ModuleType(fullname))
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
109 mod.__file__ = "<%s>" % self.__class__.__name__
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
110 mod.__loader__ = self
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
111 # Make it a package
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
112 mod.__path__ = []
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
113 # Count how many times the module is reloaded
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
114 mod.__dict__['loads'] = mod.__dict__.get('loads',0) + 1
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
115 return mod
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
116
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
117 def get_data(self, path):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
118 return "Hello, world!"
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
119
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
120 class MyTestImporter(object):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
121 def find_module(self, fullname, path=None):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
122 return PkgutilPEP302Tests.MyTestLoader()
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
123
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
124 def setUp(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
125 sys.meta_path.insert(0, self.MyTestImporter())
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
126
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
127 def tearDown(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
128 del sys.meta_path[0]
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
129
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
130 def test_getdata_pep302(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
131 # Use a dummy importer/loader
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
132 self.assertEqual(pkgutil.get_data('foo', 'dummy'), "Hello, world!")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
133 del sys.modules['foo']
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
134
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
135 def test_alreadyloaded(self):
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
136 # Ensure that get_data works without reloading - the "loads" module
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
137 # variable in the example loader should count how many times a reload
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
138 # occurs.
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
139 import foo
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
140 self.assertEqual(foo.loads, 1)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
141 self.assertEqual(pkgutil.get_data('foo', 'dummy'), "Hello, world!")
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
142 self.assertEqual(foo.loads, 1)
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
143 del sys.modules['foo']
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
144
76972
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
145
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
146 # These tests, especially the setup and cleanup, are hideous. They
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
147 # need to be cleaned up once issue 14715 is addressed.
76972
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
148 class ExtendPathTests(unittest.TestCase):
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
149 def create_init(self, pkgname):
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
150 dirname = tempfile.mkdtemp()
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
151 sys.path.insert(0, dirname)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
152
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
153 pkgdir = os.path.join(dirname, pkgname)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
154 os.mkdir(pkgdir)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
155 with open(os.path.join(pkgdir, '__init__.py'), 'w') as fl:
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
156 fl.write('from pkgutil import extend_path\n__path__ = extend_path(__path__, __name__)\n')
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
157
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
158 return dirname
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
159
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
160 def create_submodule(self, dirname, pkgname, submodule_name, value):
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
161 module_name = os.path.join(dirname, pkgname, submodule_name + '.py')
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
162 with open(module_name, 'w') as fl:
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
163 print('value={}'.format(value), file=fl)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
164
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
165 def test_simple(self):
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
166 pkgname = 'foo'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
167 dirname_0 = self.create_init(pkgname)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
168 dirname_1 = self.create_init(pkgname)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
169 self.create_submodule(dirname_0, pkgname, 'bar', 0)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
170 self.create_submodule(dirname_1, pkgname, 'baz', 1)
76972
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
171 import foo.bar
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
172 import foo.baz
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
173 # Ensure we read the expected values
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
174 self.assertEqual(foo.bar.value, 0)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
175 self.assertEqual(foo.baz.value, 1)
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
176
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
177 # Ensure the path is set up correctly
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
178 self.assertEqual(sorted(foo.__path__),
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
179 sorted([os.path.join(dirname_0, pkgname),
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
180 os.path.join(dirname_1, pkgname)]))
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
181
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
182 # Cleanup
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
183 shutil.rmtree(dirname_0)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
184 shutil.rmtree(dirname_1)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
185 del sys.path[0]
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
186 del sys.path[0]
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
187 del sys.modules['foo']
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
188 del sys.modules['foo.bar']
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
189 del sys.modules['foo.baz']
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
190
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
191
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
192 # Another awful testing hack to be cleaned up once the test_runpy
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
193 # helpers are factored out to a common location
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
194 def test_iter_importers(self):
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
195 iter_importers = pkgutil.iter_importers
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
196 get_importer = pkgutil.get_importer
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
197
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
198 pkgname = 'spam'
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
199 modname = 'eggs'
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
200 dirname = self.create_init(pkgname)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
201 pathitem = os.path.join(dirname, pkgname)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
202 fullname = '{}.{}'.format(pkgname, modname)
87372
59f3e50061bd Issue #19724: clear out colliding temp module.
Eric Snow <ericsnowcurrently@gmail.com>
parents: 87347
diff changeset
203 sys.modules.pop(fullname, None)
59f3e50061bd Issue #19724: clear out colliding temp module.
Eric Snow <ericsnowcurrently@gmail.com>
parents: 87347
diff changeset
204 sys.modules.pop(pkgname, None)
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
205 try:
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
206 self.create_submodule(dirname, pkgname, modname, 0)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
207
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
208 importlib.import_module(fullname)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
209
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
210 importers = list(iter_importers(fullname))
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
211 expected_importer = get_importer(pathitem)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
212 for finder in importers:
87347
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
213 loader = finder.find_module(fullname)
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
214 try:
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
215 loader = loader.loader
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
216 except AttributeError:
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
217 # For now we still allow raw loaders from
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
218 # find_module().
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
219 pass
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
220 self.assertIsInstance(finder, importlib.machinery.FileFinder)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
221 self.assertEqual(finder, expected_importer)
87347
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
222 self.assertIsInstance(loader,
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
223 importlib.machinery.SourceFileLoader)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
224 self.assertIsNone(finder.find_module(pkgname))
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
225
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
226 with self.assertRaises(ImportError):
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
227 list(iter_importers('invalid.module'))
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
228
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
229 with self.assertRaises(ImportError):
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
230 list(iter_importers('.spam'))
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
231 finally:
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
232 shutil.rmtree(dirname)
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
233 del sys.path[0]
87347
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
234 try:
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
235 del sys.modules['spam']
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
236 del sys.modules['spam.eggs']
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
237 except KeyError:
07229c6104b1 Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents: 84154
diff changeset
238 pass
83366
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
239
c40b50d65a00 Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents: 78155
diff changeset
240
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
241 def test_mixed_namespace(self):
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
242 pkgname = 'foo'
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
243 dirname_0 = self.create_init(pkgname)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
244 dirname_1 = self.create_init(pkgname)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
245 self.create_submodule(dirname_0, pkgname, 'bar', 0)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
246 # Turn this into a PEP 420 namespace package
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
247 os.unlink(os.path.join(dirname_0, pkgname, '__init__.py'))
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
248 self.create_submodule(dirname_1, pkgname, 'baz', 1)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
249 import foo.bar
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
250 import foo.baz
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
251 # Ensure we read the expected values
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
252 self.assertEqual(foo.bar.value, 0)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
253 self.assertEqual(foo.baz.value, 1)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
254
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
255 # Ensure the path is set up correctly
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
256 self.assertEqual(sorted(foo.__path__),
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
257 sorted([os.path.join(dirname_0, pkgname),
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
258 os.path.join(dirname_1, pkgname)]))
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
259
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
260 # Cleanup
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
261 shutil.rmtree(dirname_0)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
262 shutil.rmtree(dirname_1)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
263 del sys.path[0]
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
264 del sys.path[0]
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
265 del sys.modules['foo']
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
266 del sys.modules['foo.bar']
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76983
diff changeset
267 del sys.modules['foo.baz']
76972
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
268
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
269 # XXX: test .pkg files
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
270
48cb6b67d306 Issue #14817: Add rudimentary tests for pkgutil.extend_path.
Eric V. Smith <eric@trueblade.com>
parents: 72799
diff changeset
271
78039
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
272 class NestedNamespacePackageTest(unittest.TestCase):
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
273
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
274 def setUp(self):
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
275 self.basedir = tempfile.mkdtemp()
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
276 self.old_path = sys.path[:]
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
277
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
278 def tearDown(self):
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
279 sys.path[:] = self.old_path
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
280 shutil.rmtree(self.basedir)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
281
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
282 def create_module(self, name, contents):
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
283 base, final = name.rsplit('.', 1)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
284 base_path = os.path.join(self.basedir, base.replace('.', os.path.sep))
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
285 os.makedirs(base_path, exist_ok=True)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
286 with open(os.path.join(base_path, final + ".py"), 'w') as f:
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
287 f.write(contents)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
288
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
289 def test_nested(self):
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
290 pkgutil_boilerplate = (
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
291 'import pkgutil; '
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
292 '__path__ = pkgutil.extend_path(__path__, __name__)')
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
293 self.create_module('a.pkg.__init__', pkgutil_boilerplate)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
294 self.create_module('b.pkg.__init__', pkgutil_boilerplate)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
295 self.create_module('a.pkg.subpkg.__init__', pkgutil_boilerplate)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
296 self.create_module('b.pkg.subpkg.__init__', pkgutil_boilerplate)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
297 self.create_module('a.pkg.subpkg.c', 'c = 1')
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
298 self.create_module('b.pkg.subpkg.d', 'd = 2')
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
299 sys.path.insert(0, os.path.join(self.basedir, 'a'))
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
300 sys.path.insert(0, os.path.join(self.basedir, 'b'))
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
301 import pkg
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
302 self.addCleanup(unload, 'pkg')
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
303 self.assertEqual(len(pkg.__path__), 2)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
304 import pkg.subpkg
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
305 self.addCleanup(unload, 'pkg.subpkg')
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
306 self.assertEqual(len(pkg.subpkg.__path__), 2)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
307 from pkg.subpkg.c import c
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
308 from pkg.subpkg.d import d
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
309 self.assertEqual(c, 1)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
310 self.assertEqual(d, 2)
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
311
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
312
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
313 class ImportlibMigrationTests(unittest.TestCase):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
314 # With full PEP 302 support in the standard import machinery, the
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
315 # PEP 302 emulation in this module is in the process of being
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
316 # deprecated in favour of importlib proper
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
317
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
318 def check_deprecated(self):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
319 return check_warnings(
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
320 ("This emulation is deprecated, use 'importlib' instead",
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
321 DeprecationWarning))
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
322
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
323 def test_importer_deprecated(self):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
324 with self.check_deprecated():
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
325 x = pkgutil.ImpImporter("")
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
326
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
327 def test_loader_deprecated(self):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
328 with self.check_deprecated():
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
329 x = pkgutil.ImpLoader("", "", "", "")
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
330
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
331 def test_get_loader_avoids_emulation(self):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
332 with check_warnings() as w:
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
333 self.assertIsNotNone(pkgutil.get_loader("sys"))
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
334 self.assertIsNotNone(pkgutil.get_loader("os"))
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
335 self.assertIsNotNone(pkgutil.get_loader("test.support"))
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
336 self.assertEqual(len(w.warnings), 0)
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
337
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
338 def test_get_importer_avoids_emulation(self):
78155
16e50e85d684 Issue #15314: Tweak a pkgutil test to hopefully be more Windows friendly
Nick Coghlan <ncoghlan@gmail.com>
parents: 78111
diff changeset
339 # We use an illegal path so *none* of the path hooks should fire
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
340 with check_warnings() as w:
78155
16e50e85d684 Issue #15314: Tweak a pkgutil test to hopefully be more Windows friendly
Nick Coghlan <ncoghlan@gmail.com>
parents: 78111
diff changeset
341 self.assertIsNone(pkgutil.get_importer("*??"))
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
342 self.assertEqual(len(w.warnings), 0)
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
343
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
344 def test_iter_importers_avoids_emulation(self):
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
345 with check_warnings() as w:
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
346 for importer in pkgutil.iter_importers(): pass
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
347 self.assertEqual(len(w.warnings), 0)
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
348
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
349
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
350 def test_main():
78039
f86df559319d Backport test for nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76983
diff changeset
351 run_unittest(PkgutilTests, PkgutilPEP302Tests, ExtendPathTests,
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
352 NestedNamespacePackageTest, ImportlibMigrationTests)
46516
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46478
diff changeset
353 # this is necessary if test is run repeated (like when finding leaks)
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46478
diff changeset
354 import zipimport
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
355 import importlib
46516
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46478
diff changeset
356 zipimport._zip_directory_cache.clear()
78107
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
357 importlib.invalidate_caches()
3987667bf98f Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78040
diff changeset
358
46478
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
359
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
360 if __name__ == '__main__':
beb7abcd6c01 Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
361 test_main()