aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools/dist.py
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools/dist.py')
-rw-r--r--setuptools/dist.py75
1 files changed, 60 insertions, 15 deletions
diff --git a/setuptools/dist.py b/setuptools/dist.py
index 489198c8..57d585b7 100644
--- a/setuptools/dist.py
+++ b/setuptools/dist.py
@@ -14,10 +14,11 @@ from distutils.errors import (
DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
)
from distutils.util import rfc822_escape
+from distutils.version import StrictVersion
from setuptools.extern import six
-from setuptools.extern.six.moves import map, filter, filterfalse
from setuptools.extern import packaging
+from setuptools.extern.six.moves import map, filter, filterfalse
from setuptools.extern import pkg_resources
from setuptools.depends import Require
@@ -34,36 +35,52 @@ def _get_unpatched(cls):
warnings.warn("Do not call this function", DeprecationWarning)
return get_unpatched(cls)
+def get_metadata_version(dist_md):
+ if dist_md.long_description_content_type or dist_md.provides_extras:
+ return StrictVersion('2.1')
+ elif getattr(dist_md, 'python_requires', None) is not None:
+ return StrictVersion('1.2')
+ elif (dist_md.provides or dist_md.requires or dist_md.obsoletes or
+ dist_md.classifiers or dist_md.download_url):
+ return StrictVersion('1.1')
+
+ return StrictVersion('1.0')
+
# Based on Python 3.5 version
def write_pkg_file(self, file):
"""Write the PKG-INFO format data to a file object.
"""
- version = '1.0'
- if (self.provides or self.requires or self.obsoletes or
- self.classifiers or self.download_url):
- version = '1.1'
- # Setuptools specific for PEP 345
- if hasattr(self, 'python_requires') or self.project_urls:
- version = '1.2'
+ version = get_metadata_version(self)
file.write('Metadata-Version: %s\n' % version)
file.write('Name: %s\n' % self.get_name())
file.write('Version: %s\n' % self.get_version())
file.write('Summary: %s\n' % self.get_description())
file.write('Home-page: %s\n' % self.get_url())
- file.write('Author: %s\n' % self.get_contact())
- file.write('Author-email: %s\n' % self.get_contact_email())
+
+ if version == '1.2':
+ file.write('Author: %s\n' % self.get_contact())
+ file.write('Author-email: %s\n' % self.get_contact_email())
+ else:
+ optional_fields = (
+ ('Author', 'author'),
+ ('Author-email', 'author_email'),
+ ('Maintainer', 'maintainer'),
+ ('Maintainer-email', 'maintainer_email'),
+ )
+
+ for field, attr in optional_fields:
+ attr_val = getattr(self, attr)
+ if attr_val is not None:
+ file.write('%s: %s\n' % (field, attr_val))
+
file.write('License: %s\n' % self.get_license())
if self.download_url:
file.write('Download-URL: %s\n' % self.download_url)
for project_url in self.project_urls.items():
file.write('Project-URL: %s, %s\n' % project_url)
- long_desc_content_type = \
- self.long_description_content_type or 'UNKNOWN'
- file.write('Description-Content-Type: %s\n' % long_desc_content_type)
-
long_desc = rfc822_escape(self.get_long_description())
file.write('Description: %s\n' % long_desc)
@@ -71,7 +88,12 @@ def write_pkg_file(self, file):
if keywords:
file.write('Keywords: %s\n' % keywords)
- self._write_list(file, 'Platform', self.get_platforms())
+ if version == '1.2':
+ for platform in self.get_platforms():
+ file.write('Platform: %s\n' % platform)
+ else:
+ self._write_list(file, 'Platform', self.get_platforms())
+
self._write_list(file, 'Classifier', self.get_classifiers())
# PEP 314
@@ -83,6 +105,16 @@ def write_pkg_file(self, file):
if hasattr(self, 'python_requires'):
file.write('Requires-Python: %s\n' % self.python_requires)
+ # PEP 566
+ if self.long_description_content_type:
+ file.write(
+ 'Description-Content-Type: %s\n' %
+ self.long_description_content_type
+ )
+ if self.provides_extras:
+ for extra in self.provides_extras:
+ file.write('Provides-Extra: %s\n' % extra)
+
# from Python 3.4
def write_pkg_info(self, base_dir):
@@ -339,6 +371,9 @@ class Distribution(Distribution_parse_config_files, _Distribution):
self.metadata.long_description_content_type = attrs.get(
'long_description_content_type'
)
+ self.metadata.provides_extras = getattr(
+ self.metadata, 'provides_extras', set()
+ )
if isinstance(self.metadata.version, numbers.Number):
# Some people apparently take "version number" too literally :)
@@ -372,6 +407,16 @@ class Distribution(Distribution_parse_config_files, _Distribution):
"""
if getattr(self, 'python_requires', None):
self.metadata.python_requires = self.python_requires
+
+ if getattr(self, 'extras_require', None):
+ for extra in self.extras_require.keys():
+ # Since this gets called multiple times at points where the
+ # keys have become 'converted' extras, ensure that we are only
+ # truly adding extras we haven't seen before here.
+ extra = extra.split(':')[0]
+ if extra:
+ self.metadata.provides_extras.add(extra)
+
self._convert_extras_requirements()
self._move_install_requirements_markers()