ยปCore Development>Code coverage>Lib/importlib/test/import_/test_relative_imports.py

Python code coverage for Lib/importlib/test/import_/test_relative_imports.py

#countcontent
1n/a"""Test relative imports (PEP 328)."""
2n/afrom .. import util
3n/afrom . import util as import_util
4n/aimport sys
5n/aimport unittest
6n/a
7n/aclass RelativeImports(unittest.TestCase):
8n/a
9n/a """PEP 328 introduced relative imports. This allows for imports to occur
10n/a from within a package without having to specify the actual package name.
11n/a
12n/a A simple example is to import another module within the same package
13n/a [module from module]::
14n/a
15n/a # From pkg.mod1 with pkg.mod2 being a module.
16n/a from . import mod2
17n/a
18n/a This also works for getting an attribute from a module that is specified
19n/a in a relative fashion [attr from module]::
20n/a
21n/a # From pkg.mod1.
22n/a from .mod2 import attr
23n/a
24n/a But this is in no way restricted to working between modules; it works
25n/a from [package to module],::
26n/a
27n/a # From pkg, importing pkg.module which is a module.
28n/a from . import module
29n/a
30n/a [module to package],::
31n/a
32n/a # Pull attr from pkg, called from pkg.module which is a module.
33n/a from . import attr
34n/a
35n/a and [package to package]::
36n/a
37n/a # From pkg.subpkg1 (both pkg.subpkg[1,2] are packages).
38n/a from .. import subpkg2
39n/a
40n/a The number of dots used is in no way restricted [deep import]::
41n/a
42n/a # Import pkg.attr from pkg.pkg1.pkg2.pkg3.pkg4.pkg5.
43n/a from ...... import attr
44n/a
45n/a To prevent someone from accessing code that is outside of a package, one
46n/a cannot reach the location containing the root package itself::
47n/a
48n/a # From pkg.__init__ [too high from package]
49n/a from .. import top_level
50n/a
51n/a # From pkg.module [too high from module]
52n/a from .. import top_level
53n/a
54n/a Relative imports are the only type of import that allow for an empty
55n/a module name for an import [empty name].
56n/a
57n/a """
58n/a
59n/a def relative_import_test(self, create, globals_, callback):
60n/a """Abstract out boilerplace for setting up for an import test."""
61n/a uncache_names = []
62n/a for name in create:
63n/a if not name.endswith('.__init__'):
64n/a uncache_names.append(name)
65n/a else:
66n/a uncache_names.append(name[:-len('.__init__')])
67n/a with util.mock_modules(*create) as importer:
68n/a with util.import_state(meta_path=[importer]):
69n/a for global_ in globals_:
70n/a with util.uncache(*uncache_names):
71n/a callback(global_)
72n/a
73n/a
74n/a def test_module_from_module(self):
75n/a # [module from module]
76n/a create = 'pkg.__init__', 'pkg.mod2'
77n/a globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.mod1'}
78n/a def callback(global_):
79n/a import_util.import_('pkg') # For __import__().
80n/a module = import_util.import_('', global_, fromlist=['mod2'], level=1)
81n/a self.assertEqual(module.__name__, 'pkg')
82n/a self.assertTrue(hasattr(module, 'mod2'))
83n/a self.assertEqual(module.mod2.attr, 'pkg.mod2')
84n/a self.relative_import_test(create, globals_, callback)
85n/a
86n/a def test_attr_from_module(self):
87n/a # [attr from module]
88n/a create = 'pkg.__init__', 'pkg.mod2'
89n/a globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.mod1'}
90n/a def callback(global_):
91n/a import_util.import_('pkg') # For __import__().
92n/a module = import_util.import_('mod2', global_, fromlist=['attr'],
93n/a level=1)
94n/a self.assertEqual(module.__name__, 'pkg.mod2')
95n/a self.assertEqual(module.attr, 'pkg.mod2')
96n/a self.relative_import_test(create, globals_, callback)
97n/a
98n/a def test_package_to_module(self):
99n/a # [package to module]
100n/a create = 'pkg.__init__', 'pkg.module'
101n/a globals_ = ({'__package__': 'pkg'},
102n/a {'__name__': 'pkg', '__path__': ['blah']})
103n/a def callback(global_):
104n/a import_util.import_('pkg') # For __import__().
105n/a module = import_util.import_('', global_, fromlist=['module'],
106n/a level=1)
107n/a self.assertEqual(module.__name__, 'pkg')
108n/a self.assertTrue(hasattr(module, 'module'))
109n/a self.assertEqual(module.module.attr, 'pkg.module')
110n/a self.relative_import_test(create, globals_, callback)
111n/a
112n/a def test_module_to_package(self):
113n/a # [module to package]
114n/a create = 'pkg.__init__', 'pkg.module'
115n/a globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.module'}
116n/a def callback(global_):
117n/a import_util.import_('pkg') # For __import__().
118n/a module = import_util.import_('', global_, fromlist=['attr'], level=1)
119n/a self.assertEqual(module.__name__, 'pkg')
120n/a self.relative_import_test(create, globals_, callback)
121n/a
122n/a def test_package_to_package(self):
123n/a # [package to package]
124n/a create = ('pkg.__init__', 'pkg.subpkg1.__init__',
125n/a 'pkg.subpkg2.__init__')
126n/a globals_ = ({'__package__': 'pkg.subpkg1'},
127n/a {'__name__': 'pkg.subpkg1', '__path__': ['blah']})
128n/a def callback(global_):
129n/a module = import_util.import_('', global_, fromlist=['subpkg2'],
130n/a level=2)
131n/a self.assertEqual(module.__name__, 'pkg')
132n/a self.assertTrue(hasattr(module, 'subpkg2'))
133n/a self.assertEqual(module.subpkg2.attr, 'pkg.subpkg2.__init__')
134n/a
135n/a def test_deep_import(self):
136n/a # [deep import]
137n/a create = ['pkg.__init__']
138n/a for count in range(1,6):
139n/a create.append('{0}.pkg{1}.__init__'.format(
140n/a create[-1][:-len('.__init__')], count))
141n/a globals_ = ({'__package__': 'pkg.pkg1.pkg2.pkg3.pkg4.pkg5'},
142n/a {'__name__': 'pkg.pkg1.pkg2.pkg3.pkg4.pkg5',
143n/a '__path__': ['blah']})
144n/a def callback(global_):
145n/a import_util.import_(globals_[0]['__package__'])
146n/a module = import_util.import_('', global_, fromlist=['attr'], level=6)
147n/a self.assertEqual(module.__name__, 'pkg')
148n/a self.relative_import_test(create, globals_, callback)
149n/a
150n/a def test_too_high_from_package(self):
151n/a # [too high from package]
152n/a create = ['top_level', 'pkg.__init__']
153n/a globals_ = ({'__package__': 'pkg'},
154n/a {'__name__': 'pkg', '__path__': ['blah']})
155n/a def callback(global_):
156n/a import_util.import_('pkg')
157n/a with self.assertRaises(ValueError):
158n/a import_util.import_('', global_, fromlist=['top_level'],
159n/a level=2)
160n/a self.relative_import_test(create, globals_, callback)
161n/a
162n/a def test_too_high_from_module(self):
163n/a # [too high from module]
164n/a create = ['top_level', 'pkg.__init__', 'pkg.module']
165n/a globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.module'}
166n/a def callback(global_):
167n/a import_util.import_('pkg')
168n/a with self.assertRaises(ValueError):
169n/a import_util.import_('', global_, fromlist=['top_level'],
170n/a level=2)
171n/a self.relative_import_test(create, globals_, callback)
172n/a
173n/a def test_empty_name_w_level_0(self):
174n/a # [empty name]
175n/a with self.assertRaises(ValueError):
176n/a import_util.import_('')
177n/a
178n/a def test_import_from_different_package(self):
179n/a # Test importing from a different package than the caller.
180n/a # in pkg.subpkg1.mod
181n/a # from ..subpkg2 import mod
182n/a create = ['__runpy_pkg__.__init__',
183n/a '__runpy_pkg__.__runpy_pkg__.__init__',
184n/a '__runpy_pkg__.uncle.__init__',
185n/a '__runpy_pkg__.uncle.cousin.__init__',
186n/a '__runpy_pkg__.uncle.cousin.nephew']
187n/a globals_ = {'__package__': '__runpy_pkg__.__runpy_pkg__'}
188n/a def callback(global_):
189n/a import_util.import_('__runpy_pkg__.__runpy_pkg__')
190n/a module = import_util.import_('uncle.cousin', globals_, {},
191n/a fromlist=['nephew'],
192n/a level=2)
193n/a self.assertEqual(module.__name__, '__runpy_pkg__.uncle.cousin')
194n/a self.relative_import_test(create, globals_, callback)
195n/a
196n/a def test_import_relative_import_no_fromlist(self):
197n/a # Import a relative module w/ no fromlist.
198n/a create = ['crash.__init__', 'crash.mod']
199n/a globals_ = [{'__package__': 'crash', '__name__': 'crash'}]
200n/a def callback(global_):
201n/a import_util.import_('crash')
202n/a mod = import_util.import_('mod', global_, {}, [], 1)
203n/a self.assertEqual(mod.__name__, 'crash.mod')
204n/a self.relative_import_test(create, globals_, callback)
205n/a
206n/a def test_relative_import_no_globals(self):
207n/a # No globals for a relative import is an error.
208n/a with self.assertRaises(KeyError):
209n/a import_util.import_('sys', level=1)
210n/a
211n/a
212n/adef test_main():
213n/a from test.support import run_unittest
214n/a run_unittest(RelativeImports)
215n/a
216n/aif __name__ == '__main__':
217n/a test_main()