pip/tests/lib/configuration_helpers.py

78 lines
2.1 KiB
Python

"""Helpers for tests that check configuration
"""
import contextlib
import functools
import os
import tempfile
import textwrap
import pip._internal.configuration
from pip._internal.utils.misc import ensure_dir
# This is so that tests don't need to import pip._internal.configuration.
kinds = pip._internal.configuration.kinds
def reset_os_environ(old_environ):
"""
Reset os.environ while preserving the same underlying mapping.
"""
# Preserving the same mapping is preferable to assigning a new mapping
# because the latter has interfered with test isolation by, for example,
# preventing time.tzset() from working in subsequent tests after
# changing os.environ['TZ'] in those tests.
os.environ.clear()
os.environ.update(old_environ)
class ConfigurationMixin(object):
def setup(self):
self.configuration = pip._internal.configuration.Configuration(
isolated=False,
)
self._files_to_clear = []
self._old_environ = os.environ.copy()
def teardown(self):
for fname in self._files_to_clear:
fname.stop()
reset_os_environ(self._old_environ)
def patch_configuration(self, variant, di):
old = self.configuration._load_config_files
@functools.wraps(old)
def overridden():
# Manual Overload
self.configuration._config[variant].update(di)
self.configuration._parsers[variant].append((None, None))
return old()
self.configuration._load_config_files = overridden
@contextlib.contextmanager
def tmpfile(self, contents):
# Create a temporary file
fd, path = tempfile.mkstemp(
prefix="pip_", suffix="_config.ini", text=True
)
os.close(fd)
contents = textwrap.dedent(contents).lstrip()
ensure_dir(os.path.dirname(path))
with open(path, "w") as f:
f.write(contents)
yield path
os.remove(path)
@staticmethod
def get_file_contents(path):
with open(path) as f:
return f.read()