aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools/dist.py
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools/dist.py')
-rw-r--r--setuptools/dist.py55
1 files changed, 31 insertions, 24 deletions
diff --git a/setuptools/dist.py b/setuptools/dist.py
index 68c8747a..9a034db5 100644
--- a/setuptools/dist.py
+++ b/setuptools/dist.py
@@ -9,7 +9,6 @@ import distutils.core
import distutils.cmd
import distutils.dist
import itertools
-import operator
from collections import defaultdict
from distutils.errors import (
DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
@@ -17,7 +16,7 @@ from distutils.errors import (
from distutils.util import rfc822_escape
from setuptools.extern import six
-from setuptools.extern.six.moves import map, filter
+from setuptools.extern.six.moves import map
from pkg_resources.extern import packaging
from setuptools.depends import Require
@@ -146,17 +145,7 @@ def _check_extra(extra, reqs):
name, sep, marker = extra.partition(':')
if marker and pkg_resources.invalid_marker(marker):
raise DistutilsSetupError("Invalid environment marker: " + marker)
-
- # extras requirements cannot themselves have markers
- parsed = pkg_resources.parse_requirements(reqs)
- marked_reqs = filter(operator.attrgetter('marker'), parsed)
- bad_req = next(marked_reqs, None)
- if bad_req:
- tmpl = (
- "'extras_require' requirements cannot include "
- "environment markers, in {name!r}: '{bad_req!s}'"
- )
- raise DistutilsSetupError(tmpl.format(**locals()))
+ list(pkg_resources.parse_requirements(reqs))
def assert_bool(dist, attr, value):
@@ -366,23 +355,41 @@ class Distribution(Distribution_parse_config_files, _Distribution):
def _finalize_requires(self):
"""
- Move requirements in `install_requires` that
- are using environment markers to `extras_require`.
+ Fix environment markers in `install_requires` and `extras_require`.
+
+ - move requirements in `install_requires` that are using environment
+ markers or extras to `extras_require`.
+ - convert requirements in `extras_require` of the form
+ `"extra": ["barbazquux; {marker}"]` to
+ `"extra:{marker}": ["barbazquux"]`.
"""
- if not self.install_requires:
- return
- extras_require = defaultdict(list, (
- (k, list(pkg_resources.parse_requirements(v)))
- for k, v in (self.extras_require or {}).items()
- ))
+ extras_require = defaultdict(list)
+ for k, v in (
+ getattr(self, 'extras_require', None) or {}
+ ).items():
+ for r in pkg_resources.parse_requirements(v):
+ marker = r.marker
+ if marker:
+ r.marker = None
+ extras_require[k + ':' + str(marker)].append(r)
+ else:
+ extras_require[k].append(r)
install_requires = []
- for r in pkg_resources.parse_requirements(self.install_requires):
+ for r in pkg_resources.parse_requirements(
+ getattr(self, 'install_requires', None) or ()
+ ):
marker = r.marker
- if not marker:
+ extras = r.extras
+ if not marker and not extras:
install_requires.append(r)
continue
+ r.extras = ()
r.marker = None
- extras_require[':' + str(marker)].append(r)
+ for e in extras or ('',):
+ section = e
+ if marker:
+ section += ':' + str(marker)
+ extras_require[section].append(r)
self.extras_require = dict(
(k, [str(r) for r in v])
for k, v in extras_require.items()