aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDustin Ingram <di@users.noreply.github.com>2018-03-05 21:57:06 -0600
committerDustin Ingram <di@users.noreply.github.com>2018-03-14 17:02:25 -0500
commitb2ea3c4a20d008622caec445f5b6916ddd420d16 (patch)
treeebb45f19da3df191cf0527053aec5fb3646d3c60
parent4176ab560a4863ed44b8e8c5424e6748c5e45a84 (diff)
downloadexternal_python_setuptools-b2ea3c4a20d008622caec445f5b6916ddd420d16.tar.gz
external_python_setuptools-b2ea3c4a20d008622caec445f5b6916ddd420d16.tar.bz2
external_python_setuptools-b2ea3c4a20d008622caec445f5b6916ddd420d16.zip
Updates for PEP 566 (Metadata 2.1)
-rw-r--r--setuptools/dist.py27
-rw-r--r--setuptools/tests/test_config.py1
-rw-r--r--setuptools/tests/test_egg_info.py19
3 files changed, 43 insertions, 4 deletions
diff --git a/setuptools/dist.py b/setuptools/dist.py
index c2bfdbc7..33ceb404 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 @@ 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 +383,14 @@ 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.
+ 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 383e0d30..abb953a8 100644
--- a/setuptools/tests/test_config.py
+++ b/setuptools/tests/test_config.py
@@ -546,6 +546,7 @@ class TestOptions:
'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 7d12434e..ff5fa0a3 100644
--- a/setuptools/tests/test_egg_info.py
+++ b/setuptools/tests/test_egg_info.py
@@ -420,6 +420,24 @@ class TestEggInfo(object):
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 @@ class TestEggInfo(object):
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`