summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Ganssle <pganssle@users.noreply.github.com>2019-03-16 15:23:38 -0400
committerGitHub <noreply@github.com>2019-03-16 15:23:38 -0400
commit4cd3da049027b6321a56ca4724c3a072d1c32cd1 (patch)
treea42d58ab0f42c1728a1125cb0c6cfb9c4a325be0
parentc27c705f6a326e4820f1a34d6ce1db101dad3a30 (diff)
parent5efdf816fddcd8fbc9c3d1e6867a25848b1f9a06 (diff)
downloadpython-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.rst1
-rw-r--r--setuptools/build_meta.py6
-rw-r--r--setuptools/tests/test_build_meta.py51
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__'