Index: Lib/test/test_import.py =================================================================== --- Lib/test/test_import.py (revision 79159) +++ Lib/test/test_import.py (working copy) @@ -417,8 +417,59 @@ self.assertRaises(ValueError, check_absolute) self.assertRaises(ValueError, check_relative) +class PackageTest(unittest.TestCase): + """Create a package and test that imports within the package work.""" + path = TESTFN + + def tearDown(self): + shutil.rmtree(self.path) + sys.path = self.syspath + + def setUp(self): + os.mkdir(self.path) + self.syspath = sys.path[:] + # Construct the package hierarchy. + # TESTFN/pkg/ + # __init__.py + # a.py + # b.py + # C/ + # __init__.py + # c.py + pkg = os.path.join(self.path, "pkg") + os.mkdir(pkg) + open(os.path.join(pkg, "__init__.py"), "w") + C = os.path.join(pkg, "C") + os.mkdir(C) + open(os.path.join(C, "__init__.py"), "w") + f = open(os.path.join(pkg, "a.py"), "w") + print >> f, "from . import b" + print >> f, "x = 'a'" + f.close() + f = open(os.path.join(pkg, "b.py"), "w") + print >> f, "x = 'b'" + f.close() + f = open(os.path.join(C, "c.py"), "w") + # equivalent of + # from .. import a + # from .. import b + print >> f, "a = __import__('a', globals=globals(), level=2)" + print >> f, "b = __import__('b', globals=globals(), level=2)" + print >> f, "x = 'c'" + f.close() + + def test_dot_import(self): + sys.path.insert(0, self.path) + import pkg.C.c + self.assertEqual(pkg.C.c.x, 'c') + self.assertEqual(pkg.C.c.b.x, 'b') + import pkg.a + self.assertEqual(pkg.a.x, 'a') + self.assertEqual(pkg.a.b.x, 'b') + def test_main(verbose=None): - run_unittest(ImportTest, TestPycRewriting, PathsTests, RelativeImport) + run_unittest(ImportTest, TestPycRewriting, PathsTests, RelativeImport, + PackageTest) if __name__ == '__main__': # test needs to be a package, so we can do relative import