diff options
| author | Paul Ganssle <pganssle@users.noreply.github.com> | 2019-03-16 15:23:38 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-16 15:23:38 -0400 |
| commit | 4cd3da049027b6321a56ca4724c3a072d1c32cd1 (patch) | |
| tree | a42d58ab0f42c1728a1125cb0c6cfb9c4a325be0 | |
| parent | c27c705f6a326e4820f1a34d6ce1db101dad3a30 (diff) | |
| parent | 5efdf816fddcd8fbc9c3d1e6867a25848b1f9a06 (diff) | |
| download | python-setuptools-git-4cd3da049027b6321a56ca4724c3a072d1c32cd1.tar.gz | |
Merge pull request #1720 from pganssle/fix_setup_meta
Support requirement parsing in setuptools.build_meta
| -rw-r--r-- | changelog.d/1720.change.rst | 1 | ||||
| -rw-r--r-- | setuptools/build_meta.py | 6 | ||||
| -rw-r--r-- | setuptools/tests/test_build_meta.py | 51 |
3 files changed, 57 insertions, 1 deletions
diff --git a/changelog.d/1720.change.rst b/changelog.d/1720.change.rst new file mode 100644 index 00000000..a0d8fb35 --- /dev/null +++ b/changelog.d/1720.change.rst @@ -0,0 +1 @@ +Added support for ``pkg_resources.parse_requirements``-style requirements in ``setup_requires`` when ``setup.py`` is invoked from the ``setuptools.build_meta`` build backend. diff --git a/setuptools/build_meta.py b/setuptools/build_meta.py index 047cc07b..47cbcbf6 100644 --- a/setuptools/build_meta.py +++ b/setuptools/build_meta.py @@ -36,6 +36,8 @@ import contextlib import setuptools import distutils +from pkg_resources import parse_requirements + __all__ = ['get_requires_for_build_sdist', 'get_requires_for_build_wheel', 'prepare_metadata_for_build_wheel', @@ -51,7 +53,9 @@ class SetupRequirementsError(BaseException): class Distribution(setuptools.dist.Distribution): def fetch_build_eggs(self, specifiers): - raise SetupRequirementsError(specifiers) + specifier_list = list(map(str, parse_requirements(specifiers))) + + raise SetupRequirementsError(specifier_list) @classmethod @contextlib.contextmanager diff --git a/setuptools/tests/test_build_meta.py b/setuptools/tests/test_build_meta.py index 74969322..0bdea2d6 100644 --- a/setuptools/tests/test_build_meta.py +++ b/setuptools/tests/test_build_meta.py @@ -287,6 +287,57 @@ class TestBuildMetaBackend: with pytest.raises(ImportError): build_backend.build_sdist("temp") + @pytest.mark.parametrize('setup_literal, requirements', [ + ("'foo'", ['foo']), + ("['foo']", ['foo']), + (r"'foo\n'", ['foo']), + (r"'foo\n\n'", ['foo']), + ("['foo', 'bar']", ['foo', 'bar']), + (r"'# Has a comment line\nfoo'", ['foo']), + (r"'foo # Has an inline comment'", ['foo']), + (r"'foo \\\n >=3.0'", ['foo>=3.0']), + (r"'foo\nbar'", ['foo', 'bar']), + (r"'foo\nbar\n'", ['foo', 'bar']), + (r"['foo\n', 'bar\n']", ['foo', 'bar']), + ]) + @pytest.mark.parametrize('use_wheel', [True, False]) + def test_setup_requires(self, setup_literal, requirements, use_wheel, + tmpdir_cwd): + + files = { + 'setup.py': DALS(""" + from setuptools import setup + + setup( + name="qux", + version="0.0.0", + py_modules=["hello.py"], + setup_requires={setup_literal}, + ) + """).format(setup_literal=setup_literal), + 'hello.py': DALS(""" + def run(): + print('hello') + """), + } + + build_files(files) + + build_backend = self.get_build_backend() + + if use_wheel: + base_requirements = ['wheel'] + get_requires = build_backend.get_requires_for_build_wheel + else: + base_requirements = [] + get_requires = build_backend.get_requires_for_build_sdist + + # Ensure that the build requirements are properly parsed + expected = sorted(base_requirements + requirements) + actual = get_requires() + + assert expected == sorted(actual) + class TestBuildMetaLegacyBackend(TestBuildMetaBackend): backend_name = 'setuptools.build_meta:__legacy__' |
