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:
Meador Inge 2013-09-03 16:37:26 -05:00
parent 9edb168dd7
commit d151da9ef7
5 changed files with 4322 additions and 4244 deletions

View File

@ -33,7 +33,10 @@ def _make_relax_case():
if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
def _relax_case(): def _relax_case():
"""True if filenames must be checked case-insensitively.""" """True if filenames must be checked case-insensitively."""
return b'PYTHONCASEOK' in _os.environ if sys.flags.ignore_environment:
return False
else:
return b'PYTHONCASEOK' in _os.environ
else: else:
def _relax_case(): def _relax_case():
"""True if filenames must be checked case-insensitively.""" """True if filenames must be checked case-insensitively."""

View File

@ -5,7 +5,8 @@
from importlib import _bootstrap from importlib import _bootstrap
from .. import util from .. import util
from . import util as ext_util from . import util as ext_util
import os
import subprocess
@util.case_insensitive_tests @util.case_insensitive_tests
class ExtensionModuleCaseSensitivityTest(unittest.TestCase): class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
@ -29,14 +30,34 @@ def test_case_sensitive(self):
self.assertIsNone(loader) self.assertIsNone(loader)
def test_case_insensitivity(self): def test_case_insensitivity(self):
with support.EnvironmentVarGuard() as env: find_snippet = """if True:
env.set('PYTHONCASEOK', '1') from importlib import _bootstrap
if b'PYTHONCASEOK' not in _bootstrap._os.environ: import sys
self.skipTest('os.environ changes not reflected in ' finder = _bootstrap.FileFinder('{path}',
'_os.environ') (_bootstrap.ExtensionFileLoader,
loader = self.find_module() _bootstrap.EXTENSION_SUFFIXES))
self.assertTrue(hasattr(loader, 'load_module')) 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")

View File

@ -8,6 +8,7 @@
import sys import sys
from test import support as test_support from test import support as test_support
import unittest import unittest
import subprocess
@util.case_insensitive_tests @util.case_insensitive_tests
@ -50,16 +51,62 @@ def test_sensitive(self):
self.assertIsNone(insensitive) self.assertIsNone(insensitive)
def test_insensitive(self): def test_insensitive(self):
with test_support.EnvironmentVarGuard() as env: sensitive_pkg = 'sensitive.{0}'.format(self.name)
env.set('PYTHONCASEOK', '1') insensitive_pkg = 'insensitive.{0}'.format(self.name.lower())
if b'PYTHONCASEOK' not in _bootstrap._os.environ: context = source_util.create_modules(insensitive_pkg, sensitive_pkg)
self.skipTest('os.environ changes not reflected in ' with context as mapping:
'_os.environ') sensitive_path = os.path.join(mapping['.root'], 'sensitive')
sensitive, insensitive = self.sensitivity_test() insensitive_path = os.path.join(mapping['.root'], 'insensitive')
self.assertTrue(hasattr(sensitive, 'load_module')) find_snippet = """if True:
self.assertIn(self.name, sensitive.get_filename(self.name)) import sys
self.assertTrue(hasattr(insensitive, 'load_module')) from importlib import machinery
self.assertIn(self.name, insensitive.get_filename(self.name))
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(): def test_main():

View File

@ -66,6 +66,8 @@ Core and Builtins
Library 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. - Issue #18418: After fork(), reinit all threads states, not only active ones.
Patch by A. Jesse Jiryu Davis. Patch by A. Jesse Jiryu Davis.

File diff suppressed because it is too large Load Diff