1"""Test case-sensitivity (PEP 235).""" 2from .. import util 3 4importlib = util.import_importlib('importlib') 5machinery = util.import_importlib('importlib.machinery') 6 7import os 8from test import support as test_support 9import unittest 10 11 12@util.case_insensitive_tests 13class CaseSensitivityTest(util.CASEOKTestBase): 14 15 """PEP 235 dictates that on case-preserving, case-insensitive file systems 16 that imports are case-sensitive unless the PYTHONCASEOK environment 17 variable is set.""" 18 19 name = 'MoDuLe' 20 assert name != name.lower() 21 22 def finder(self, path): 23 return self.machinery.FileFinder(path, 24 (self.machinery.SourceFileLoader, 25 self.machinery.SOURCE_SUFFIXES), 26 (self.machinery.SourcelessFileLoader, 27 self.machinery.BYTECODE_SUFFIXES)) 28 29 def sensitivity_test(self): 30 """Look for a module with matching and non-matching sensitivity.""" 31 sensitive_pkg = 'sensitive.{0}'.format(self.name) 32 insensitive_pkg = 'insensitive.{0}'.format(self.name.lower()) 33 context = util.create_modules(insensitive_pkg, sensitive_pkg) 34 with context as mapping: 35 sensitive_path = os.path.join(mapping['.root'], 'sensitive') 36 insensitive_path = os.path.join(mapping['.root'], 'insensitive') 37 sensitive_finder = self.finder(sensitive_path) 38 insensitive_finder = self.finder(insensitive_path) 39 return self.find(sensitive_finder), self.find(insensitive_finder) 40 41 def test_sensitive(self): 42 with test_support.EnvironmentVarGuard() as env: 43 env.unset('PYTHONCASEOK') 44 self.caseok_env_changed(should_exist=False) 45 sensitive, insensitive = self.sensitivity_test() 46 self.assertIsNotNone(sensitive) 47 self.assertIn(self.name, sensitive.get_filename(self.name)) 48 self.assertIsNone(insensitive) 49 50 def test_insensitive(self): 51 with test_support.EnvironmentVarGuard() as env: 52 env.set('PYTHONCASEOK', '1') 53 self.caseok_env_changed(should_exist=True) 54 sensitive, insensitive = self.sensitivity_test() 55 self.assertIsNotNone(sensitive) 56 self.assertIn(self.name, sensitive.get_filename(self.name)) 57 self.assertIsNotNone(insensitive) 58 self.assertIn(self.name, insensitive.get_filename(self.name)) 59 60 61class CaseSensitivityTestPEP302(CaseSensitivityTest): 62 def find(self, finder): 63 return finder.find_module(self.name) 64 65 66(Frozen_CaseSensitivityTestPEP302, 67 Source_CaseSensitivityTestPEP302 68 ) = util.test_both(CaseSensitivityTestPEP302, importlib=importlib, 69 machinery=machinery) 70 71 72class CaseSensitivityTestPEP451(CaseSensitivityTest): 73 def find(self, finder): 74 found = finder.find_spec(self.name) 75 return found.loader if found is not None else found 76 77 78(Frozen_CaseSensitivityTestPEP451, 79 Source_CaseSensitivityTestPEP451 80 ) = util.test_both(CaseSensitivityTestPEP451, importlib=importlib, 81 machinery=machinery) 82 83 84if __name__ == '__main__': 85 unittest.main() 86