[Python-checkins] r45770 - in python/trunk: Include/pyerrors.h Lib/test/exception_hierarchy.txt Lib/test/regrtest.py Lib/test/test_import.py Python/exceptions.c Python/import.c
thomas.wouters
python-checkins at python.org
Fri Apr 28 01:13:21 CEST 2006
Author: thomas.wouters
Date: Fri Apr 28 01:13:20 2006
New Revision: 45770
Modified:
python/trunk/Include/pyerrors.h
python/trunk/Lib/test/exception_hierarchy.txt
python/trunk/Lib/test/regrtest.py
python/trunk/Lib/test/test_import.py
python/trunk/Python/exceptions.c
python/trunk/Python/import.c
Log:
- Add new Warning class, ImportWarning
- Warn-raise ImportWarning when importing would have picked up a directory
as package, if only it'd had an __init__.py. This swaps two tests (for
case-ness and __init__-ness), but case-test is not really more expensive,
and it's not in a speed-critical section.
- Test for the new warning by importing a common non-package directory on
sys.path: site-packages
- In regrtest.py, silence warnings generated by the build-environment
because Modules/ (which is added to sys.path for Setup-created modules)
has 'zlib' and '_ctypes' directories without __init__.py's.
Modified: python/trunk/Include/pyerrors.h
==============================================================================
--- python/trunk/Include/pyerrors.h (original)
+++ python/trunk/Include/pyerrors.h Fri Apr 28 01:13:20 2006
@@ -108,6 +108,7 @@
PyAPI_DATA(PyObject *) PyExc_OverflowWarning;
PyAPI_DATA(PyObject *) PyExc_RuntimeWarning;
PyAPI_DATA(PyObject *) PyExc_FutureWarning;
+PyAPI_DATA(PyObject *) PyExc_ImportWarning;
/* Convenience functions */
Modified: python/trunk/Lib/test/exception_hierarchy.txt
==============================================================================
--- python/trunk/Lib/test/exception_hierarchy.txt (original)
+++ python/trunk/Lib/test/exception_hierarchy.txt Fri Apr 28 01:13:20 2006
@@ -44,3 +44,4 @@
+-- UserWarning
+-- FutureWarning
+-- OverflowWarning [not generated by the interpreter]
+ +-- ImportWarning
Modified: python/trunk/Lib/test/regrtest.py
==============================================================================
--- python/trunk/Lib/test/regrtest.py (original)
+++ python/trunk/Lib/test/regrtest.py Fri Apr 28 01:13:20 2006
@@ -138,6 +138,12 @@
warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
"<string>")
+# Ignore ImportWarnings that only occur in the source tree,
+# (because of modules with the same name as source-directories in Modules/)
+for mod in ("ctypes", "gzip", "test.test_zipimport", "test.test_zlib"):
+ warnings.filterwarnings(module=".*%s$" % (mod,),
+ action="ignore", category=ImportWarning)
+
# MacOSX (a.k.a. Darwin) has a default stack size that is too small
# for deeply recursive regular expressions. We see this as crashes in
# the Python test suite when running test_re.py and test_sre.py. The
Modified: python/trunk/Lib/test/test_import.py
==============================================================================
--- python/trunk/Lib/test/test_import.py (original)
+++ python/trunk/Lib/test/test_import.py Fri Apr 28 01:13:20 2006
@@ -205,3 +205,20 @@
assert y is test.test_support, y.__name__
test_import_name_binding()
+
+def test_import_initless_directory_warning():
+ import warnings
+ oldfilters = warnings.filters[:]
+ warnings.simplefilter('error', ImportWarning);
+ try:
+ # Just a random non-package directory we always expect to be
+ # somewhere in sys.path...
+ __import__("site-packages")
+ except ImportWarning:
+ pass
+ else:
+ raise AssertionError
+ finally:
+ warnings.filters = oldfilters
+
+test_import_initless_directory_warning()
Modified: python/trunk/Python/exceptions.c
==============================================================================
--- python/trunk/Python/exceptions.c (original)
+++ python/trunk/Python/exceptions.c Fri Apr 28 01:13:20 2006
@@ -1647,6 +1647,8 @@
"Base class for warnings about constructs that will change semantically "
"in the future.");
+PyDoc_STRVAR(ImportWarning__doc__,
+"Base class for warnings about probable mistakes in module imports");
/* module global functions */
@@ -1719,6 +1721,7 @@
PyObject *PyExc_OverflowWarning;
PyObject *PyExc_RuntimeWarning;
PyObject *PyExc_FutureWarning;
+PyObject *PyExc_ImportWarning;
@@ -1818,6 +1821,8 @@
RuntimeWarning__doc__},
{"FutureWarning", &PyExc_FutureWarning, &PyExc_Warning,
FutureWarning__doc__},
+ {"ImportWarning", &PyExc_ImportWarning, &PyExc_Warning,
+ ImportWarning__doc__},
/* Sentinel */
{NULL}
};
Modified: python/trunk/Python/import.c
==============================================================================
--- python/trunk/Python/import.c (original)
+++ python/trunk/Python/import.c Fri Apr 28 01:13:20 2006
@@ -1271,19 +1271,42 @@
#ifdef HAVE_STAT
if (stat(buf, &statbuf) == 0 && /* it exists */
S_ISDIR(statbuf.st_mode) && /* it's a directory */
- find_init_module(buf) && /* it has __init__.py */
- case_ok(buf, len, namelen, name)) { /* and case matches */
- Py_XDECREF(copy);
- return &fd_package;
+ case_ok(buf, len, namelen, name)) { /* case matches */
+ if (find_init_module(buf)) { /* and has __init__.py */
+ Py_XDECREF(copy);
+ return &fd_package;
+ }
+ else {
+ char warnstr[MAXPATHLEN+80];
+ sprintf(warnstr, "Not importing directory "
+ "'%.*s': missing __init__.py",
+ MAXPATHLEN, buf);
+ if (PyErr_Warn(PyExc_ImportWarning,
+ warnstr)) {
+ Py_XDECREF(copy);
+ return NULL;
+ }
+ }
}
#else
/* XXX How are you going to test for directories? */
#ifdef RISCOS
if (isdir(buf) &&
- find_init_module(buf) &&
case_ok(buf, len, namelen, name)) {
- Py_XDECREF(copy);
- return &fd_package;
+ if (find_init_module(buf)) {
+ Py_XDECREF(copy);
+ return &fd_package;
+ }
+ else {
+ char warnstr[MAXPATHLEN+80];
+ sprintf(warnstr, "Not importing directory "
+ "'%.*s': missing __init__.py",
+ MAXPATHLEN, buf);
+ if (PyErr_Warn(PyExc_ImportWarning,
+ warnstr)) {
+ Py_XDECREF(copy);
+ return NULL;
+ }
}
#endif
#endif
More information about the Python-checkins
mailing list