mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Issue #16826: Don't check for PYTHONCASEOK when using -E.
This commit fixes a regression that sneaked into Python 3.3 where importlib was not respecting -E when checking for the PYTHONCASEOK environment variable.
This commit is contained in:
		
							parent
							
								
									9edb168dd7
								
							
						
					
					
						commit
						d151da9ef7
					
				
					 5 changed files with 4322 additions and 4244 deletions
				
			
		|  | @ -33,6 +33,9 @@ def _make_relax_case(): | |||
|     if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): | ||||
|         def _relax_case(): | ||||
|             """True if filenames must be checked case-insensitively.""" | ||||
|             if sys.flags.ignore_environment: | ||||
|                 return False | ||||
|             else: | ||||
|                 return b'PYTHONCASEOK' in _os.environ | ||||
|     else: | ||||
|         def _relax_case(): | ||||
|  |  | |||
|  | @ -5,7 +5,8 @@ | |||
| from importlib import _bootstrap | ||||
| from .. import util | ||||
| from . import util as ext_util | ||||
| 
 | ||||
| import os | ||||
| import subprocess | ||||
| 
 | ||||
| @util.case_insensitive_tests | ||||
| class ExtensionModuleCaseSensitivityTest(unittest.TestCase): | ||||
|  | @ -29,14 +30,34 @@ def test_case_sensitive(self): | |||
|             self.assertIsNone(loader) | ||||
| 
 | ||||
|     def test_case_insensitivity(self): | ||||
|         with support.EnvironmentVarGuard() as env: | ||||
|             env.set('PYTHONCASEOK', '1') | ||||
|             if b'PYTHONCASEOK' not in _bootstrap._os.environ: | ||||
|                 self.skipTest('os.environ changes not reflected in ' | ||||
|                               '_os.environ') | ||||
|             loader = self.find_module() | ||||
|             self.assertTrue(hasattr(loader, 'load_module')) | ||||
|         find_snippet = """if True: | ||||
|             from importlib import _bootstrap | ||||
|             import sys | ||||
|             finder = _bootstrap.FileFinder('{path}', | ||||
|                                            (_bootstrap.ExtensionFileLoader, | ||||
|                                             _bootstrap.EXTENSION_SUFFIXES)) | ||||
|             loader = finder.find_module('{bad_name}') | ||||
|             print(str(hasattr(loader, 'load_module'))) | ||||
|             """.format(bad_name=ext_util.NAME.upper(), path=ext_util.PATH) | ||||
| 
 | ||||
|         newenv = os.environ.copy() | ||||
|         newenv["PYTHONCASEOK"] = "1" | ||||
| 
 | ||||
|         def check_output(expected, extra_arg=None): | ||||
|             args = [sys.executable] | ||||
|             if extra_arg: | ||||
|                 args.append(extra_arg) | ||||
|             args.extend(["-c", find_snippet]) | ||||
|             p = subprocess.Popen(args, stdout=subprocess.PIPE, env=newenv) | ||||
|             actual = p.communicate()[0].decode().strip() | ||||
|             self.assertEqual(expected, actual) | ||||
|             self.assertEqual(p.wait(), 0) | ||||
| 
 | ||||
|         # Test with PYTHONCASEOK=1. | ||||
|         check_output("True") | ||||
| 
 | ||||
|         # Test with PYTHONCASEOK=1 ignored because of -E. | ||||
|         check_output("False", "-E") | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ | |||
| import sys | ||||
| from test import support as test_support | ||||
| import unittest | ||||
| import subprocess | ||||
| 
 | ||||
| 
 | ||||
| @util.case_insensitive_tests | ||||
|  | @ -50,16 +51,62 @@ def test_sensitive(self): | |||
|             self.assertIsNone(insensitive) | ||||
| 
 | ||||
|     def test_insensitive(self): | ||||
|         with test_support.EnvironmentVarGuard() as env: | ||||
|             env.set('PYTHONCASEOK', '1') | ||||
|             if b'PYTHONCASEOK' not in _bootstrap._os.environ: | ||||
|                 self.skipTest('os.environ changes not reflected in ' | ||||
|                               '_os.environ') | ||||
|             sensitive, insensitive = self.sensitivity_test() | ||||
|             self.assertTrue(hasattr(sensitive, 'load_module')) | ||||
|             self.assertIn(self.name, sensitive.get_filename(self.name)) | ||||
|             self.assertTrue(hasattr(insensitive, 'load_module')) | ||||
|             self.assertIn(self.name, insensitive.get_filename(self.name)) | ||||
|         sensitive_pkg = 'sensitive.{0}'.format(self.name) | ||||
|         insensitive_pkg = 'insensitive.{0}'.format(self.name.lower()) | ||||
|         context = source_util.create_modules(insensitive_pkg, sensitive_pkg) | ||||
|         with context as mapping: | ||||
|             sensitive_path = os.path.join(mapping['.root'], 'sensitive') | ||||
|             insensitive_path = os.path.join(mapping['.root'], 'insensitive') | ||||
|             find_snippet = """if True: | ||||
|                 import sys | ||||
|                 from importlib import machinery | ||||
| 
 | ||||
|                 def find(path): | ||||
|                     f = machinery.FileFinder(path, | ||||
|                                              (machinery.SourceFileLoader, | ||||
|                                               machinery.SOURCE_SUFFIXES), | ||||
|                                              (machinery.SourcelessFileLoader, | ||||
|                                               machinery.BYTECODE_SUFFIXES)) | ||||
|                     return f.find_module('{name}') | ||||
| 
 | ||||
|                 sensitive = find('{sensitive_path}') | ||||
|                 insensitive = find('{insensitive_path}') | ||||
|                 print(str(hasattr(sensitive, 'load_module'))) | ||||
|                 if hasattr(sensitive, 'load_module'): | ||||
|                     print(sensitive.get_filename('{name}')) | ||||
|                 else: | ||||
|                     print('None') | ||||
|                 print(str(hasattr(insensitive, 'load_module'))) | ||||
|                 if hasattr(insensitive, 'load_module'): | ||||
|                     print(insensitive.get_filename('{name}')) | ||||
|                 else: | ||||
|                     print('None') | ||||
|                 """.format(sensitive_path=sensitive_path, | ||||
|                            insensitive_path=insensitive_path, | ||||
|                            name=self.name) | ||||
| 
 | ||||
|             newenv = os.environ.copy() | ||||
|             newenv["PYTHONCASEOK"] = "1" | ||||
| 
 | ||||
|             def check_output(expected, extra_arg=None): | ||||
|                 args = [sys.executable] | ||||
|                 if extra_arg: | ||||
|                     args.append(extra_arg) | ||||
|                 args.extend(["-c", find_snippet]) | ||||
|                 p = subprocess.Popen(args, stdout=subprocess.PIPE, | ||||
|                                          env=newenv) | ||||
|                 actual = p.communicate()[0].decode().split() | ||||
|                 self.assertEqual(expected[0], actual[0]) | ||||
|                 self.assertIn(expected[1], actual[1]) | ||||
|                 self.assertEqual(expected[2], actual[2]) | ||||
|                 self.assertIn(expected[3], actual[3]) | ||||
|                 self.assertEqual(p.wait(), 0) | ||||
| 
 | ||||
|             # Test with PYTHONCASEOK=1. | ||||
|             check_output(["True", self.name, "True", self.name]) | ||||
| 
 | ||||
|             # Test with PYTHONCASEOK=1 ignored because of -E. | ||||
|             check_output(["True", self.name, "False", "None"], "-E") | ||||
| 
 | ||||
| 
 | ||||
| def test_main(): | ||||
|  |  | |||
|  | @ -66,6 +66,8 @@ Core and Builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Issue #16826: Don't check for PYTHONCASEOK if interpreter started with -E. | ||||
| 
 | ||||
| - Issue #18418: After fork(), reinit all threads states, not only active ones. | ||||
|   Patch by A. Jesse Jiryu Davis. | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										8455
									
								
								Python/importlib.h
									
										
									
									
									
								
							
							
						
						
									
										8455
									
								
								Python/importlib.h
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Meador Inge
						Meador Inge