| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- """Support code for distutils test cases."""
- import itertools
- import os
- import pathlib
- import shutil
- import sys
- import sysconfig
- import tempfile
- from distutils.core import Distribution
- import pytest
- from more_itertools import always_iterable
- @pytest.mark.usefixtures('distutils_managed_tempdir')
- class TempdirManager:
- """
- Mix-in class that handles temporary directories for test cases.
- """
- def mkdtemp(self):
- """Create a temporary directory that will be cleaned up.
- Returns the path of the directory.
- """
- d = tempfile.mkdtemp()
- self.tempdirs.append(d)
- return d
- def write_file(self, path, content='xxx'):
- """Writes a file in the given path.
- path can be a string or a sequence.
- """
- pathlib.Path(*always_iterable(path)).write_text(content, encoding='utf-8')
- def create_dist(self, pkg_name='foo', **kw):
- """Will generate a test environment.
- This function creates:
- - a Distribution instance using keywords
- - a temporary directory with a package structure
- It returns the package directory and the distribution
- instance.
- """
- tmp_dir = self.mkdtemp()
- pkg_dir = os.path.join(tmp_dir, pkg_name)
- os.mkdir(pkg_dir)
- dist = Distribution(attrs=kw)
- return pkg_dir, dist
- class DummyCommand:
- """Class to store options for retrieval via set_undefined_options()."""
- def __init__(self, **kwargs):
- vars(self).update(kwargs)
- def ensure_finalized(self):
- pass
- def copy_xxmodule_c(directory):
- """Helper for tests that need the xxmodule.c source file.
- Example use:
- def test_compile(self):
- copy_xxmodule_c(self.tmpdir)
- self.assertIn('xxmodule.c', os.listdir(self.tmpdir))
- If the source file can be found, it will be copied to *directory*. If not,
- the test will be skipped. Errors during copy are not caught.
- """
- shutil.copy(_get_xxmodule_path(), os.path.join(directory, 'xxmodule.c'))
- def _get_xxmodule_path():
- source_name = 'xxmodule.c' if sys.version_info > (3, 9) else 'xxmodule-3.8.c'
- return os.path.join(os.path.dirname(__file__), source_name)
- def fixup_build_ext(cmd):
- """Function needed to make build_ext tests pass.
- When Python was built with --enable-shared on Unix, -L. is not enough to
- find libpython<blah>.so, because regrtest runs in a tempdir, not in the
- source directory where the .so lives.
- When Python was built with in debug mode on Windows, build_ext commands
- need their debug attribute set, and it is not done automatically for
- some reason.
- This function handles both of these things. Example use:
- cmd = build_ext(dist)
- support.fixup_build_ext(cmd)
- cmd.ensure_finalized()
- Unlike most other Unix platforms, Mac OS X embeds absolute paths
- to shared libraries into executables, so the fixup is not needed there.
- """
- if os.name == 'nt':
- cmd.debug = sys.executable.endswith('_d.exe')
- elif sysconfig.get_config_var('Py_ENABLE_SHARED'):
- # To further add to the shared builds fun on Unix, we can't just add
- # library_dirs to the Extension() instance because that doesn't get
- # plumbed through to the final compiler command.
- runshared = sysconfig.get_config_var('RUNSHARED')
- if runshared is None:
- cmd.library_dirs = ['.']
- else:
- if sys.platform == 'darwin':
- cmd.library_dirs = []
- else:
- name, equals, value = runshared.partition('=')
- cmd.library_dirs = [d for d in value.split(os.pathsep) if d]
- def combine_markers(cls):
- """
- pytest will honor markers as found on the class, but when
- markers are on multiple subclasses, only one appears. Use
- this decorator to combine those markers.
- """
- cls.pytestmark = [
- mark
- for base in itertools.chain([cls], cls.__bases__)
- for mark in getattr(base, 'pytestmark', [])
- ]
- return cls
|