diff options
Diffstat (limited to 'setuptools/dist.py')
-rw-r--r-- | setuptools/dist.py | 75 |
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() |