summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnderson Bravalheri <andersonbravalheri@gmail.com>2023-03-08 19:00:27 +0000
committerAnderson Bravalheri <andersonbravalheri@gmail.com>2023-05-03 14:09:16 +0100
commit71635355281283b85784539011baea6d679df29e (patch)
tree7b856ee607d2c441ab6fbe9ee061a1314353c21d
parent9f95fae2a7459fb1887085426fe1bf5cacd792ff (diff)
downloadpython-setuptools-git-71635355281283b85784539011baea6d679df29e.tar.gz
Add Requires-Dist to PKG-INFO
-rw-r--r--setuptools/_core_metadata.py55
-rw-r--r--setuptools/dist.py4
2 files changed, 56 insertions, 3 deletions
diff --git a/setuptools/_core_metadata.py b/setuptools/_core_metadata.py
index 750b09b3..c164fed3 100644
--- a/setuptools/_core_metadata.py
+++ b/setuptools/_core_metadata.py
@@ -10,6 +10,10 @@ from typing import Optional, List
from distutils.util import rfc822_escape
+from . import _normalization
+from ._deprecation_warning import SetuptoolsDeprecationWarning
+from .extern.packaging.markers import Marker
+from .extern.packaging.requirements import Requirement
from .extern.packaging.version import Version
from .warnings import SetuptoolsDeprecationWarning
@@ -178,14 +182,59 @@ def write_pkg_file(self, file): # noqa: C901 # is too complex (14) # FIXME
# PEP 566
if self.long_description_content_type:
write_field('Description-Content-Type', self.long_description_content_type)
- if self.provides_extras:
- for extra in self.provides_extras:
- write_field('Provides-Extra', extra)
self._write_list(file, 'License-File', self.license_files or [])
+ _write_requirements(self, file)
long_description = self.get_long_description()
if long_description:
file.write("\n%s" % long_description)
if not long_description.endswith("\n"):
file.write("\n")
+
+
+def _write_requirements(self, file):
+ for req in self.install_requires:
+ file.write(f"Requires-Dist: {req}\n")
+
+ processed_extras = {}
+ for augmented_extra, reqs in self.extras_require.items():
+ # Historically, setuptools allows "augmented extras": `<extra>:<condition>`
+ unsafe_extra, _, condition = augmented_extra.partition(":")
+ unsafe_extra = unsafe_extra.strip()
+ extra = _normalization.safe_extra(unsafe_extra)
+
+ if extra:
+ _write_provides_extra(file, processed_extras, extra, unsafe_extra)
+ for req in reqs:
+ r = _include_extra(req, extra, condition.strip())
+ file.write(f"Requires-Dist: {r}\n")
+
+ return processed_extras
+
+
+def _include_extra(req: str, extra: str, condition: str) -> Requirement:
+ r = Requirement(req)
+ parts = (
+ f"({r.marker})" if r.marker else None,
+ f"({condition})" if condition else None,
+ f"extra == {extra!r}" if extra else None
+ )
+ r.marker = Marker(" and ".join(x for x in parts if x))
+ return r
+
+
+def _write_provides_extra(file, processed_extras, safe, unsafe):
+ previous = processed_extras.get(safe)
+ if previous == unsafe:
+ msg = f"""Ambiguity during "extra" normalization for dependencies.\n\n
+ ********************************************************************
+ {previous!r} and {unsafe!r} normalize to the same value:\n
+ {safe!r}\n
+ In future versions, setuptools might halt the build process.
+ ********************************************************************\n\n
+ """
+ warnings.warn(msg, SetuptoolsDeprecationWarning, stacklevel=3)
+ else:
+ processed_extras[safe] = unsafe
+ file.write(f"Provides-Extra: {safe}\n")
diff --git a/setuptools/dist.py b/setuptools/dist.py
index c5c1bc2c..2af25895 100644
--- a/setuptools/dist.py
+++ b/setuptools/dist.py
@@ -277,6 +277,8 @@ class Distribution(_Distribution):
'provides_extras': ordered_set.OrderedSet,
'license_file': lambda: None,
'license_files': lambda: None,
+ 'install_requires': list,
+ 'extras_require': dict,
}
_patched_dist = None
@@ -399,6 +401,8 @@ class Distribution(_Distribution):
self.metadata.python_requires = self.python_requires
self._normalize_requires()
+ self.metadata.install_requires = self.install_requires
+ self.metadata.extras_require = self.extras_require
if self.extras_require:
for extra in self.extras_require.keys():