[Python-checkins] r53233 - sandbox/trunk/import_in_py/importer.py sandbox/trunk/import_in_py/test_importer.py
brett.cannon
python-checkins at python.org
Thu Jan 4 01:34:40 CET 2007
Author: brett.cannon
Date: Thu Jan 4 01:34:39 2007
New Revision: 53233
Modified:
sandbox/trunk/import_in_py/importer.py
sandbox/trunk/import_in_py/test_importer.py
Log:
Add case-sensitivity.
Modified: sandbox/trunk/import_in_py/importer.py
==============================================================================
--- sandbox/trunk/import_in_py/importer.py (original)
+++ sandbox/trunk/import_in_py/importer.py Thu Jan 4 01:34:39 2007
@@ -101,6 +101,28 @@
x |= ord(bytes[3]) << 24
return x
+def case_ok(directory, file_name):
+ """Verify that file_name (as found in 'directory') has the proper case.
+
+ The path is assumed to already exist.
+
+ XXX Temporary until imp's case_ok function can be exposed.
+
+ XXX Better to roll this into a single function some how so that existence
+ check can be part of case check and thus cut down on stat calls?
+
+ """
+ if sys.platform not in ('win32', 'mac', 'riscos', 'darwin', 'cygwin',
+ 'os2emx') or os.environ.get('PYTHONCASEOK'):
+ # Platform is case-sensitive so existence check already handle
+ # case-sensitivity.
+ return True
+ directory_contents = os.listdir(directory)
+ if file_name in directory_contents:
+ return True
+ else:
+ return False
+
class BuiltinFrozenBaseImporter(object):
@@ -217,23 +239,26 @@
for each directory in __path__ for a package.
"""
- # XXX Does not worry about case-insensitive filesystems.
tail_module = fullname.rsplit('.', 1)[-1]
package_directory = os.path.join(self.path_entry, tail_module)
for handler in self.handlers:
for file_ext in handler.handles:
# XXX Backwards-incompatible to use anything but .py/.pyc
# files for __init__?
- package_init = os.path.join(package_directory,
- '__init__'+file_ext)
- if os.path.isfile(package_init):
+ init_filename = '__init__' + file_ext
+ package_init = os.path.join(package_directory, init_filename)
+ if (os.path.isfile(package_init) and
+ case_ok(self.path_entry, tail_module) and
+ case_ok(package_directory, init_filename)):
return self.loader(package_init, handler, package_directory)
file_name = tail_module + file_ext
file_path = os.path.join(self.path_entry, file_name)
- if os.path.isfile(file_path):
+ if (os.path.isfile(file_path) and
+ case_ok(self.path_entry, file_name)):
return self.loader(file_path, handler)
else:
- if os.path.isdir(package_directory):
+ if (os.path.isdir(package_directory) and
+ case_ok(self.path_entry, tail_module)):
warnings.warn("Not importing directory %s: missing __init__.py"
% package_directory,
ImportWarning)
Modified: sandbox/trunk/import_in_py/test_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/test_importer.py (original)
+++ sandbox/trunk/import_in_py/test_importer.py Thu Jan 4 01:34:39 2007
@@ -337,7 +337,57 @@
self.importer = importer.FileSystemImporter(self.directory,
self.handler)
self.importer.loader = mock_importer.MockPyPycLoader
-
+
+ def test_module_case_sensitivity(self):
+ # Case-sensitivity should always matter as long as PYTHONCASEOK is not
+ # set.
+ name_len = len(self.top_level_module_name)
+ bad_case_name = (self.top_level_module_name[:name_len/2].upper() +
+ self.top_level_module_name[name_len/2:].lower())
+ env_guard = test_support.EnvironmentVarGuard()
+ env_guard.unset('PYTHONCASEOK')
+ with env_guard:
+ self.failUnless(not self.importer.find_module(bad_case_name))
+ if sys.platform not in ('win32', 'mac', 'darwin', 'cygwin', 'os2emx',
+ 'riscos'):
+ return
+ env_guard = test_support.EnvironmentVarGuard()
+ env_guard.set('PYTHONCASEOK', '1')
+ with env_guard:
+ assert os.environ['PYTHONCASEOK']
+ self.failUnless(self.importer.find_module(bad_case_name))
+
+ def test_package_case_sensitivity(self):
+ # Case-sensitivity should always matter as long as PYTHONCASEOK is not
+ # set.
+ name_len = len(self.pkg_name)
+ bad_case_name = (self.pkg_name[:name_len/2].upper() +
+ self.pkg_name[name_len/2:].lower())
+ bad_init_name = os.path.join(self.directory, self.pkg_name,
+ '__INit__.py')
+ env_guard = test_support.EnvironmentVarGuard()
+ env_guard.unset('PYTHONCASEOK')
+ with env_guard:
+ self.failUnless(not self.importer.find_module(bad_case_name))
+ os.unlink(self.pkg_init_path)
+ with open(bad_init_name, 'w') as init_file:
+ init_file.write('# Test case-sensitivity of imports.')
+ self.failUnless(not self.importer.find_module(self.pkg_name))
+ if sys.platform not in ('win32', 'mac', 'darwin', 'cygwin', 'os2emx',
+ 'riscos'):
+ return
+ os.unlink(bad_init_name)
+ with open(self.pkg_init_path, 'w') as init_file:
+ init_file.write('# Used for testing import.')
+ env_guard = test_support.EnvironmentVarGuard()
+ env_guard.set('PYTHONCASEOK', '1')
+ with env_guard:
+ assert os.environ['PYTHONCASEOK']
+ self.failUnless(self.importer.find_module(bad_case_name))
+ with open(bad_init_name, 'w') as init_file:
+ init_file.write('# Used to test case-insensitivity of import.')
+ self.failUnless(self.importer.find_module(self.pkg_name))
+
def test_find_module_single_handler(self):
# Having a single handler should work without issue.
loader = self.importer.find_module(self.module_name)
More information about the Python-checkins
mailing list