import package2.submodule1
package2.submodule1.submodule2
+ def test_rebinding(self):
+ # The same data is also used for testing pkgutil.resolve_name()
+ # in test_pkgutil and mock.patch in test_unittest.
+ path = os.path.join(os.path.dirname(__file__), 'data')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ from package3 import submodule
+ self.assertEqual(submodule.attr, 'rebound')
+ import package3.submodule as submodule
+ self.assertEqual(submodule.attr, 'rebound')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ import package3.submodule as submodule
+ self.assertEqual(submodule.attr, 'rebound')
+ from package3 import submodule
+ self.assertEqual(submodule.attr, 'rebound')
+
+ def test_rebinding2(self):
+ path = os.path.join(os.path.dirname(__file__), 'data')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ import package4.submodule as submodule
+ self.assertEqual(submodule.attr, 'submodule')
+ from package4 import submodule
+ self.assertEqual(submodule.attr, 'submodule')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ from package4 import submodule
+ self.assertEqual(submodule.attr, 'origin')
+ import package4.submodule as submodule
+ self.assertEqual(submodule.attr, 'submodule')
+
class OverridingImportBuiltinTests(unittest.TestCase):
def test_override_builtin(self):
--- /dev/null
+"""Rebinding the package attribute after importing the module."""
+from .submodule import submodule
--- /dev/null
+attr = 'submodule'
+class A:
+ attr = 'submodule'
+class submodule:
+ attr = 'rebound'
+ class B:
+ attr = 'rebound'
--- /dev/null
+"""Binding the package attribute without importing the module."""
+class submodule:
+ attr = 'origin'
+ class B:
+ attr = 'origin'
--- /dev/null
+attr = 'submodule'
+class A:
+ attr = 'submodule'
import shutil
import zipfile
+from test.support.import_helper import DirsOnSysPath
+from test.test_importlib.util import uncache
+
# Note: pkgutil.walk_packages is currently tested in test_runpy. This is
# a hack to get a major issue resolved for 3.3b2. Longer term, it should
# be moved back here, perhaps by factoring out the helper code for
with self.assertRaises(exc):
pkgutil.resolve_name(s)
+ def test_name_resolution_import_rebinding(self):
+ # The same data is also used for testing import in test_import and
+ # mock.patch in test_unittest.
+ path = os.path.join(os.path.dirname(__file__), 'test_import', 'data')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package3.submodule.attr'), 'submodule')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package3.submodule:attr'), 'submodule')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package3:submodule.attr'), 'rebound')
+ self.assertEqual(pkgutil.resolve_name('package3.submodule.attr'), 'submodule')
+ self.assertEqual(pkgutil.resolve_name('package3:submodule.attr'), 'rebound')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package3:submodule.attr'), 'rebound')
+ self.assertEqual(pkgutil.resolve_name('package3.submodule:attr'), 'submodule')
+ self.assertEqual(pkgutil.resolve_name('package3:submodule.attr'), 'rebound')
+
+ def test_name_resolution_import_rebinding2(self):
+ path = os.path.join(os.path.dirname(__file__), 'test_import', 'data')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package4.submodule.attr'), 'submodule')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package4.submodule:attr'), 'submodule')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package4:submodule.attr'), 'origin')
+ self.assertEqual(pkgutil.resolve_name('package4.submodule.attr'), 'submodule')
+ self.assertEqual(pkgutil.resolve_name('package4:submodule.attr'), 'submodule')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ self.assertEqual(pkgutil.resolve_name('package4:submodule.attr'), 'origin')
+ self.assertEqual(pkgutil.resolve_name('package4.submodule:attr'), 'submodule')
+ self.assertEqual(pkgutil.resolve_name('package4:submodule.attr'), 'submodule')
+
class PkgutilPEP302Tests(unittest.TestCase):
from collections import OrderedDict
import unittest
+import test
from test.test_unittest.testmock import support
from test.test_unittest.testmock.support import SomeClass, is_instance
+from test.support.import_helper import DirsOnSysPath
from test.test_importlib.util import uncache
from unittest.mock import (
NonCallableMock, CallableMixin, sentinel,
'exception traceback not propagated')
+ def test_name_resolution_import_rebinding(self):
+ # Currently mock.patch uses pkgutil.resolve_name(), but repeat
+ # similar tests just for the case.
+ # The same data is also used for testing import in test_import and
+ # pkgutil.resolve_name() in test_pkgutil.
+ path = os.path.join(os.path.dirname(test.__file__), 'test_import', 'data')
+ def check(name):
+ p = patch(name)
+ p.start()
+ p.stop()
+ def check_error(name):
+ p = patch(name)
+ self.assertRaises(AttributeError, p.start)
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ check('package3.submodule.A.attr')
+ check_error('package3.submodule.B.attr')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ check('package3.submodule:A.attr')
+ check_error('package3.submodule:B.attr')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ check('package3:submodule.B.attr')
+ check_error('package3:submodule.A.attr')
+ check('package3.submodule.A.attr')
+ check_error('package3.submodule.B.attr')
+ check('package3:submodule.B.attr')
+ check_error('package3:submodule.A.attr')
+ with uncache('package3', 'package3.submodule'), DirsOnSysPath(path):
+ check('package3:submodule.B.attr')
+ check_error('package3:submodule.A.attr')
+ check('package3.submodule:A.attr')
+ check_error('package3.submodule:B.attr')
+ check('package3:submodule.B.attr')
+ check_error('package3:submodule.A.attr')
+
+ def test_name_resolution_import_rebinding2(self):
+ path = os.path.join(os.path.dirname(test.__file__), 'test_import', 'data')
+ def check(name):
+ p = patch(name)
+ p.start()
+ p.stop()
+ def check_error(name):
+ p = patch(name)
+ self.assertRaises(AttributeError, p.start)
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ check('package4.submodule.A.attr')
+ check_error('package4.submodule.B.attr')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ check('package4.submodule:A.attr')
+ check_error('package4.submodule:B.attr')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ check('package4:submodule.B.attr')
+ check_error('package4:submodule.A.attr')
+ check('package4.submodule.A.attr')
+ check_error('package4.submodule.B.attr')
+ check('package4:submodule.A.attr')
+ check_error('package4:submodule.B.attr')
+ with uncache('package4', 'package4.submodule'), DirsOnSysPath(path):
+ check('package4:submodule.B.attr')
+ check_error('package4:submodule.A.attr')
+ check('package4.submodule:A.attr')
+ check_error('package4.submodule:B.attr')
+ check('package4:submodule.A.attr')
+ check_error('package4:submodule.B.attr')
+
+
def test_create_and_specs(self):
for kwarg in ('spec', 'spec_set', 'autospec'):
p = patch('%s.doesnotexist' % __name__, create=True,
test/test_import/data/circular_imports/subpkg2/parent \
test/test_import/data/package \
test/test_import/data/package2 \
+ test/test_import/data/package3 \
+ test/test_import/data/package4 \
test/test_import/data/unwritable \
test/test_importlib \
test/test_importlib/builtin \