Skip to content

Commit

Permalink
Merge branch 'main' into feature/drop-fetch-build-eggs-easy-install-f…
Browse files Browse the repository at this point in the history
…allback
  • Loading branch information
jaraco committed Jan 23, 2021
2 parents 9d61fdd + 8222d6f commit 0afc4ef
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 24 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 51.3.1
current_version = 51.3.3
commit = True
tag = True

Expand Down
18 changes: 18 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
v51.3.3
-------


Misc
^^^^
* #2539: Fix AttributeError in Description validation.


v51.3.2
-------


Misc
^^^^
* #1390: Validation of Description field now is more lenient, emitting a warning and mangling the value to be valid (replacing newlines with spaces).


v51.3.1
-------

Expand Down
1 change: 1 addition & 0 deletions changelog.d/2459.change.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Tests now run in parallel via pytest-xdist, completing in about half the time. Special thanks to :user:`webknjaz` for hard work implementing test isolation. To run without parallelization, disable the plugin with ``tox -- -p no:xdist``.
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ addopts = "--flake8"
[pytest.enabler.cov]
addopts = "--cov"

[pytest.enabler.xdist]
addopts = "-n auto"

[tool.towncrier]
package = "setuptools"
package_dir = "setuptools"
Expand Down
5 changes: 3 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
license_files =
LICENSE
name = setuptools
version = 51.3.1
version = 51.3.3
author = Python Packaging Authority
author_email = distutils-sig@python.org
description = Easily download, build, install, upgrade, and uninstall Python packages
Expand Down Expand Up @@ -47,7 +47,7 @@ testing =
pytest-black >= 0.3.7; python_implementation != "PyPy"
pytest-cov
pytest-mypy; python_implementation != "PyPy"
pytest-enabler
pytest-enabler >= 1.0.1

# local
mock
Expand All @@ -58,6 +58,7 @@ testing =
paver
pip>=19.1 # For proper file:// URLs support.
jaraco.envs
pytest-xdist

docs =
# Keep these in sync with docs/requirements.txt
Expand Down
4 changes: 3 additions & 1 deletion setuptools/dist.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ def _read_list(name):
def single_line(val):
# quick and dirty validation for description pypa/setuptools#1390
if '\n' in val:
raise ValueError("newlines not allowed")
# TODO after 2021-07-31: Replace with `raise ValueError("newlines not allowed")`
warnings.warn("newlines not allowed and will break in the future")
val = val.replace('\n', ' ')
return val


Expand Down
37 changes: 37 additions & 0 deletions setuptools/tests/fixtures.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import contextlib
import sys
import shutil

import pytest

from . import contexts
Expand All @@ -21,3 +25,36 @@ def user_override(monkeypatch):
def tmpdir_cwd(tmpdir):
with tmpdir.as_cwd() as orig:
yield orig


@pytest.fixture
def tmp_src(request, tmp_path):
"""Make a copy of the source dir under `$tmp/src`.
This fixture is useful whenever it's necessary to run `setup.py`
or `pip install` against the source directory when there's no
control over the number of simultaneous invocations. Such
concurrent runs create and delete directories with the same names
under the target directory and so they influence each other's runs
when they are not being executed sequentially.
"""
tmp_src_path = tmp_path / 'src'
shutil.copytree(request.config.rootdir, tmp_src_path)
return tmp_src_path


@pytest.fixture(autouse=True, scope="session")
def workaround_xdist_376(request):
"""
Workaround pytest-dev/pytest-xdist#376
``pytest-xdist`` tends to inject '' into ``sys.path``,
which may break certain isolation expectations.
Remove the entry so the import
machinery behaves the same irrespective of xdist.
"""
if not request.config.pluginmanager.has_plugin('xdist'):
return

with contextlib.suppress(ValueError):
sys.path.remove('')
6 changes: 3 additions & 3 deletions setuptools/tests/test_build_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@


class BuildBackendBase:
def __init__(self, cwd=None, env={}, backend_name='setuptools.build_meta'):
def __init__(self, cwd='.', env={}, backend_name='setuptools.build_meta'):
self.cwd = cwd
self.env = env
self.backend_name = backend_name
Expand Down Expand Up @@ -126,7 +126,7 @@ class TestBuildMetaBackend:
backend_name = 'setuptools.build_meta'

def get_build_backend(self):
return BuildBackend(cwd='.', backend_name=self.backend_name)
return BuildBackend(backend_name=self.backend_name)

@pytest.fixture(params=defns)
def build_backend(self, tmpdir, request):
Expand Down Expand Up @@ -337,7 +337,7 @@ def test_build_sdist_builds_targz_even_if_zip_indicated(self, tmpdir_cwd):
def test_build_sdist_relative_path_import(self, tmpdir_cwd):
build_files(self._relative_path_import_files)
build_backend = self.get_build_backend()
with pytest.raises(ImportError):
with pytest.raises(ImportError, match="^No module named 'hello'$"):
build_backend.build_sdist("temp")

@pytest.mark.parametrize('setup_literal, requirements', [
Expand Down
6 changes: 3 additions & 3 deletions setuptools/tests/test_distutils_adoption.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ def run(self, cmd, *args, **kwargs):


@pytest.fixture
def venv(tmpdir):
def venv(tmp_path, tmp_src):
env = VirtualEnv()
env.root = path.Path(tmpdir)
env.req = os.getcwd()
env.root = path.Path(tmp_path / 'venv')
env.req = str(tmp_src)
return env.create()


Expand Down
25 changes: 11 additions & 14 deletions setuptools/tests/test_virtualenv.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,11 @@ def bare_virtualenv():
yield venv


SOURCE_DIR = os.path.join(os.path.dirname(__file__), '../..')


def test_clean_env_install(bare_virtualenv):
def test_clean_env_install(bare_virtualenv, tmp_src):
"""
Check setuptools can be installed in a clean environment.
"""
bare_virtualenv.run(['python', 'setup.py', 'install'], cd=SOURCE_DIR)
bare_virtualenv.run(['python', 'setup.py', 'install'], cd=tmp_src)


def _get_pip_versions():
Expand Down Expand Up @@ -85,7 +82,7 @@ def _get_pip_versions():


@pytest.mark.parametrize('pip_version', _get_pip_versions())
def test_pip_upgrade_from_source(pip_version, virtualenv):
def test_pip_upgrade_from_source(pip_version, tmp_src, virtualenv):
"""
Check pip can upgrade setuptools from source.
"""
Expand All @@ -104,7 +101,7 @@ def test_pip_upgrade_from_source(pip_version, virtualenv):
virtualenv.run(' && '.join((
'python setup.py -q sdist -d {dist}',
'python setup.py -q bdist_wheel -d {dist}',
)).format(dist=dist_dir), cd=SOURCE_DIR)
)).format(dist=dist_dir), cd=tmp_src)
sdist = glob.glob(os.path.join(dist_dir, '*.zip'))[0]
wheel = glob.glob(os.path.join(dist_dir, '*.whl'))[0]
# Then update from wheel.
Expand All @@ -113,12 +110,12 @@ def test_pip_upgrade_from_source(pip_version, virtualenv):
virtualenv.run('pip install --no-cache-dir --upgrade ' + sdist)


def _check_test_command_install_requirements(virtualenv, tmpdir):
def _check_test_command_install_requirements(virtualenv, tmpdir, cwd):
"""
Check the test command will install all required dependencies.
"""
# Install setuptools.
virtualenv.run('python setup.py develop', cd=SOURCE_DIR)
virtualenv.run('python setup.py develop', cd=cwd)

def sdist(distname, version):
dist_path = tmpdir.join('%s-%s.tar.gz' % (distname, version))
Expand Down Expand Up @@ -175,21 +172,21 @@ def sdist(distname, version):
assert tmpdir.join('success').check()


def test_test_command_install_requirements(virtualenv, tmpdir):
def test_test_command_install_requirements(virtualenv, tmpdir, request):
# Ensure pip/wheel packages are installed.
virtualenv.run(
"python -c \"__import__('pkg_resources').require(['pip', 'wheel'])\"")
# uninstall setuptools so that 'setup.py develop' works
virtualenv.run("python -m pip uninstall -y setuptools")
# disable index URL so bits and bobs aren't requested from PyPI
virtualenv.env['PIP_NO_INDEX'] = '1'
_check_test_command_install_requirements(virtualenv, tmpdir)
_check_test_command_install_requirements(virtualenv, tmpdir, request.config.rootdir)


def test_no_missing_dependencies(bare_virtualenv):
def test_no_missing_dependencies(bare_virtualenv, request):
"""
Quick and dirty test to ensure all external dependencies are vendored.
"""
for command in ('upload',): # sorted(distutils.command.__all__):
bare_virtualenv.run(
['python', 'setup.py', command, '-h'], cd=SOURCE_DIR)
cmd = ['python', 'setup.py', command, '-h']
bare_virtualenv.run(cmd, cd=request.config.rootdir)

0 comments on commit 0afc4ef

Please sign in to comment.