Skip to content

Commit

Permalink
Merge pull request #1286 from di/pep-566-updates
Browse files Browse the repository at this point in the history
Updates for Metadata 2.1 (PEP 566)
  • Loading branch information
jaraco authored Mar 15, 2018
2 parents 4176ab5 + fe97cb5 commit 15fe9c1
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 4 deletions.
5 changes: 5 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
v38.6.0
-------

* #1286: Add support for Metadata 2.1 (PEP 566).

v38.5.2
-------

Expand Down
27 changes: 23 additions & 4 deletions setuptools/dist.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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)

Expand All @@ -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):
Expand Down Expand Up @@ -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 :)
Expand Down Expand Up @@ -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()

Expand Down
1 change: 1 addition & 0 deletions setuptools/tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
19 changes: 19 additions & 0 deletions setuptools/tests/test_egg_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand All @@ -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`
Expand Down

0 comments on commit 15fe9c1

Please sign in to comment.