mirror of
https://github.com/python/cpython.git
synced 2024-12-01 22:04:04 +08:00
c0747cf537
svn+ssh://pythondev@svn.python.org/python/trunk ........ r67028 | benjamin.peterson | 2008-10-25 18:27:07 -0500 (Sat, 25 Oct 2008) | 1 line don't use a catch-all ........ r67040 | armin.rigo | 2008-10-28 12:01:21 -0500 (Tue, 28 Oct 2008) | 5 lines Fix one of the tests: it relied on being present in an "output test" in order to actually test what it was supposed to test, i.e. that the code in the __del__ method did not crash. Use instead the new helper test_support.captured_output(). ........ r67044 | amaury.forgeotdarc | 2008-10-29 18:15:57 -0500 (Wed, 29 Oct 2008) | 3 lines Correct error message in io.open(): closefd=True is the only accepted value with a file name. ........ r67046 | thomas.heller | 2008-10-30 15:18:13 -0500 (Thu, 30 Oct 2008) | 2 lines Fixed a modulefinder crash on certain relative imports. ........ r67052 | christian.heimes | 2008-10-30 16:26:15 -0500 (Thu, 30 Oct 2008) | 1 line Issue #4237: io.FileIO() was raising invalid warnings caused by insufficient initialization of PyFileIOObject struct members. ........ r67065 | benjamin.peterson | 2008-10-30 18:59:18 -0500 (Thu, 30 Oct 2008) | 1 line move unprefixed error into .c file ........ r67070 | benjamin.peterson | 2008-10-31 15:41:44 -0500 (Fri, 31 Oct 2008) | 1 line rephrase has_key doc ........ r67077 | benjamin.peterson | 2008-11-03 09:14:51 -0600 (Mon, 03 Nov 2008) | 1 line #4048 make the parser module accept relative imports as valid ........ r67082 | hirokazu.yamamoto | 2008-11-03 12:03:06 -0600 (Mon, 03 Nov 2008) | 2 lines Issue #3774: Fixed an error when create a Tkinter menu item without command and then remove it. Written by Guilherme Polo (gpolo). ........
281 lines
7.7 KiB
Python
281 lines
7.7 KiB
Python
import __future__
|
|
import os
|
|
import unittest
|
|
import distutils.dir_util
|
|
import tempfile
|
|
|
|
from test import support
|
|
|
|
try: set
|
|
except NameError: from sets import Set as set
|
|
|
|
import modulefinder
|
|
|
|
# Note: To test modulefinder with Python 2.2, sets.py and
|
|
# modulefinder.py must be available - they are not in the standard
|
|
# library.
|
|
|
|
TEST_DIR = tempfile.mkdtemp()
|
|
TEST_PATH = [TEST_DIR, os.path.dirname(__future__.__file__)]
|
|
|
|
# Each test description is a list of 5 items:
|
|
#
|
|
# 1. a module name that will be imported by modulefinder
|
|
# 2. a list of module names that modulefinder is required to find
|
|
# 3. a list of module names that modulefinder should complain
|
|
# about because they are not found
|
|
# 4. a list of module names that modulefinder should complain
|
|
# about because they MAY be not found
|
|
# 5. a string specifying packages to create; the format is obvious imo.
|
|
#
|
|
# Each package will be created in TEST_DIR, and TEST_DIR will be
|
|
# removed after the tests again.
|
|
# Modulefinder searches in a path that contains TEST_DIR, plus
|
|
# the standard Lib directory.
|
|
|
|
maybe_test = [
|
|
"a.module",
|
|
["a", "a.module", "sys",
|
|
"b"],
|
|
["c"], ["b.something"],
|
|
"""\
|
|
a/__init__.py
|
|
a/module.py
|
|
from b import something
|
|
from c import something
|
|
b/__init__.py
|
|
from sys import *
|
|
"""]
|
|
|
|
maybe_test_new = [
|
|
"a.module",
|
|
["a", "a.module", "sys",
|
|
"b", "__future__"],
|
|
["c"], ["b.something"],
|
|
"""\
|
|
a/__init__.py
|
|
a/module.py
|
|
from b import something
|
|
from c import something
|
|
b/__init__.py
|
|
from __future__ import absolute_import
|
|
from sys import *
|
|
"""]
|
|
|
|
package_test = [
|
|
"a.module",
|
|
["a", "a.b", "a.c", "a.module", "mymodule", "sys"],
|
|
["blahblah", "c"], [],
|
|
"""\
|
|
mymodule.py
|
|
a/__init__.py
|
|
import blahblah
|
|
from a import b
|
|
import c
|
|
a/module.py
|
|
import sys
|
|
from a import b as x
|
|
from a.c import sillyname
|
|
a/b.py
|
|
a/c.py
|
|
from a.module import x
|
|
import mymodule as sillyname
|
|
from sys import version_info
|
|
"""]
|
|
|
|
absolute_import_test = [
|
|
"a.module",
|
|
["a", "a.module",
|
|
"b", "b.x", "b.y", "b.z",
|
|
"__future__", "sys", "gc"],
|
|
["blahblah", "z"], [],
|
|
"""\
|
|
mymodule.py
|
|
a/__init__.py
|
|
a/module.py
|
|
from __future__ import absolute_import
|
|
import sys # sys
|
|
import blahblah # fails
|
|
import gc # gc
|
|
import b.x # b.x
|
|
from b import y # b.y
|
|
from b.z import * # b.z.*
|
|
a/gc.py
|
|
a/sys.py
|
|
import mymodule
|
|
a/b/__init__.py
|
|
a/b/x.py
|
|
a/b/y.py
|
|
a/b/z.py
|
|
b/__init__.py
|
|
import z
|
|
b/unused.py
|
|
b/x.py
|
|
b/y.py
|
|
b/z.py
|
|
"""]
|
|
|
|
relative_import_test = [
|
|
"a.module",
|
|
["__future__",
|
|
"a", "a.module",
|
|
"a.b", "a.b.y", "a.b.z",
|
|
"a.b.c", "a.b.c.moduleC",
|
|
"a.b.c.d", "a.b.c.e",
|
|
"a.b.x",
|
|
"gc"],
|
|
[], [],
|
|
"""\
|
|
mymodule.py
|
|
a/__init__.py
|
|
from .b import y, z # a.b.y, a.b.z
|
|
a/module.py
|
|
from __future__ import absolute_import # __future__
|
|
import gc # gc
|
|
a/gc.py
|
|
a/sys.py
|
|
a/b/__init__.py
|
|
from ..b import x # a.b.x
|
|
#from a.b.c import moduleC
|
|
from .c import moduleC # a.b.moduleC
|
|
a/b/x.py
|
|
a/b/y.py
|
|
a/b/z.py
|
|
a/b/g.py
|
|
a/b/c/__init__.py
|
|
from ..c import e # a.b.c.e
|
|
a/b/c/moduleC.py
|
|
from ..c import d # a.b.c.d
|
|
a/b/c/d.py
|
|
a/b/c/e.py
|
|
a/b/c/x.py
|
|
"""]
|
|
|
|
relative_import_test_2 = [
|
|
"a.module",
|
|
["a", "a.module",
|
|
"a.sys",
|
|
"a.b", "a.b.y", "a.b.z",
|
|
"a.b.c", "a.b.c.d",
|
|
"a.b.c.e",
|
|
"a.b.c.moduleC",
|
|
"a.b.c.f",
|
|
"a.b.x",
|
|
"a.another"],
|
|
[], [],
|
|
"""\
|
|
mymodule.py
|
|
a/__init__.py
|
|
from . import sys # a.sys
|
|
a/another.py
|
|
a/module.py
|
|
from .b import y, z # a.b.y, a.b.z
|
|
a/gc.py
|
|
a/sys.py
|
|
a/b/__init__.py
|
|
from .c import moduleC # a.b.c.moduleC
|
|
from .c import d # a.b.c.d
|
|
a/b/x.py
|
|
a/b/y.py
|
|
a/b/z.py
|
|
a/b/c/__init__.py
|
|
from . import e # a.b.c.e
|
|
a/b/c/moduleC.py
|
|
#
|
|
from . import f # a.b.c.f
|
|
from .. import x # a.b.x
|
|
from ... import another # a.another
|
|
a/b/c/d.py
|
|
a/b/c/e.py
|
|
a/b/c/f.py
|
|
"""]
|
|
|
|
relative_import_test_3 = [
|
|
"a.module",
|
|
["a", "a.module"],
|
|
["a.bar"],
|
|
[],
|
|
"""\
|
|
a/__init__.py
|
|
def foo(): pass
|
|
a/module.py
|
|
from . import foo
|
|
from . import bar
|
|
"""]
|
|
|
|
def open_file(path):
|
|
##print "#", os.path.abspath(path)
|
|
dirname = os.path.dirname(path)
|
|
distutils.dir_util.mkpath(dirname)
|
|
return open(path, "w")
|
|
|
|
def create_package(source):
|
|
ofi = None
|
|
for line in source.splitlines():
|
|
if line.startswith(" ") or line.startswith("\t"):
|
|
ofi.write(line.strip() + "\n")
|
|
else:
|
|
ofi = open_file(os.path.join(TEST_DIR, line.strip()))
|
|
|
|
class ModuleFinderTest(unittest.TestCase):
|
|
def _do_test(self, info, report=False):
|
|
import_this, modules, missing, maybe_missing, source = info
|
|
create_package(source)
|
|
try:
|
|
mf = modulefinder.ModuleFinder(path=TEST_PATH)
|
|
mf.import_hook(import_this)
|
|
if report:
|
|
mf.report()
|
|
## # This wouldn't work in general when executed several times:
|
|
## opath = sys.path[:]
|
|
## sys.path = TEST_PATH
|
|
## try:
|
|
## __import__(import_this)
|
|
## except:
|
|
## import traceback; traceback.print_exc()
|
|
## sys.path = opath
|
|
## return
|
|
modules = set(modules)
|
|
found = set(mf.modules.keys())
|
|
more = list(found - modules)
|
|
less = list(modules - found)
|
|
# check if we found what we expected, not more, not less
|
|
self.failUnlessEqual((more, less), ([], []))
|
|
|
|
# check for missing and maybe missing modules
|
|
bad, maybe = mf.any_missing_maybe()
|
|
self.failUnlessEqual(bad, missing)
|
|
self.failUnlessEqual(maybe, maybe_missing)
|
|
finally:
|
|
distutils.dir_util.remove_tree(TEST_DIR)
|
|
|
|
def test_package(self):
|
|
self._do_test(package_test)
|
|
|
|
def test_maybe(self):
|
|
self._do_test(maybe_test)
|
|
|
|
if getattr(__future__, "absolute_import", None):
|
|
|
|
def test_maybe_new(self):
|
|
self._do_test(maybe_test_new)
|
|
|
|
def test_absolute_imports(self):
|
|
self._do_test(absolute_import_test)
|
|
|
|
def test_relative_imports(self):
|
|
self._do_test(relative_import_test)
|
|
|
|
def test_relative_imports_2(self):
|
|
self._do_test(relative_import_test_2)
|
|
|
|
def test_relative_imports_3(self):
|
|
self._do_test(relative_import_test_3)
|
|
|
|
def test_main():
|
|
distutils.log.set_threshold(distutils.log.WARN)
|
|
support.run_unittest(ModuleFinderTest)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|