From b2ea3c4a20d008622caec445f5b6916ddd420d16 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Mon, 5 Mar 2018 21:57:06 -0600 Subject: [PATCH 1/3] Updates for PEP 566 (Metadata 2.1) --- setuptools/dist.py | 27 +++++++++++++++++++++++---- setuptools/tests/test_config.py | 1 + setuptools/tests/test_egg_info.py | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/setuptools/dist.py b/setuptools/dist.py index c2bfdbc7c6..33ceb40426 100644 --- a/setuptools/dist.py +++ b/setuptools/dist.py @@ -46,6 +46,8 @@ def write_pkg_file(self, file): # Setuptools specific for PEP 345 if hasattr(self, 'python_requires') or self.project_urls: version = '1.2' + if self.long_description_content_type or self.provides_extras: + version = '2.1' file.write('Metadata-Version: %s\n' % version) file.write('Name: %s\n' % self.get_name()) @@ -60,10 +62,6 @@ def write_pkg_file(self, file): 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) @@ -83,6 +81,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 +347,9 @@ def __init__(self, attrs=None): 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 +383,14 @@ def _finalize_requires(self): """ 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. + self.metadata.provides_extras.add(extra.split(':')[0]) + self._convert_extras_requirements() self._move_install_requirements_markers() diff --git a/setuptools/tests/test_config.py b/setuptools/tests/test_config.py index 383e0d3071..abb953a8fa 100644 --- a/setuptools/tests/test_config.py +++ b/setuptools/tests/test_config.py @@ -546,6 +546,7 @@ def test_extras_require(self, tmpdir): 'pdf': ['ReportLab>=1.2', 'RXP'], 'rest': ['docutils>=0.3', 'pack==1.1,==1.3'] } + assert dist.metadata.provides_extras == set(['pdf', 'rest']) def test_entry_points(self, tmpdir): _, config = fake_env( diff --git a/setuptools/tests/test_egg_info.py b/setuptools/tests/test_egg_info.py index 7d12434e1f..ff5fa0a30b 100644 --- a/setuptools/tests/test_egg_info.py +++ b/setuptools/tests/test_egg_info.py @@ -420,6 +420,24 @@ def test_extras_require_with_invalid_marker_in_req(self, tmpdir_cwd, env): self._run_install_command(tmpdir_cwd, env) assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == [] + def test_provides_extra(self, tmpdir_cwd, env): + self._setup_script_with_requires( + 'extras_require={"foobar": ["barbazquux"]},') + environ = os.environ.copy().update( + HOME=env.paths['home'], + ) + code, data = environment.run_setup_py( + cmd=['egg_info'], + pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]), + data_stream=1, + env=environ, + ) + egg_info_dir = os.path.join('.', 'foo.egg-info') + with open(os.path.join(egg_info_dir, 'PKG-INFO')) as pkginfo_file: + pkg_info_lines = pkginfo_file.read().split('\n') + assert 'Provides-Extra: foobar' in pkg_info_lines + assert 'Metadata-Version: 2.1' in pkg_info_lines + def test_long_description_content_type(self, tmpdir_cwd, env): # Test that specifying a `long_description_content_type` keyword arg to # the `setup` function results in writing a `Description-Content-Type` @@ -444,6 +462,7 @@ def test_long_description_content_type(self, tmpdir_cwd, env): pkg_info_lines = pkginfo_file.read().split('\n') expected_line = 'Description-Content-Type: text/markdown' assert expected_line in pkg_info_lines + assert 'Metadata-Version: 2.1' in pkg_info_lines def test_project_urls(self, tmpdir_cwd, env): # Test that specifying a `project_urls` dict to the `setup` From bb85f40858438be88d22fe1fc35aa6c62cabe80a Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Thu, 15 Mar 2018 15:55:23 -0500 Subject: [PATCH 2/3] Add changelog entry --- CHANGES.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e518b19949..ccac3d35ef 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,8 @@ +v38.5.3 +------- + +* Support Metadata 2.1 (`PEP 566 `_) + v38.5.2 ------- From fe97cb5453c22e63784dd1e24baaac902cc950fc Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 15 Mar 2018 18:39:54 -0400 Subject: [PATCH 3/3] Update CHANGES.rst --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index ccac3d35ef..7c3a46c675 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ -v38.5.3 +v38.6.0 ------- -* Support Metadata 2.1 (`PEP 566 `_) +* #1286: Add support for Metadata 2.1 (PEP 566). v38.5.2 -------