[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