Commit 8f00d60d authored by rajdeep's avatar rajdeep Committed by Paul Ganssle

Disallow files for license inputs

The ability to handle files was originally added and documented based on
a misunderstanding of what the `license` field should include. The field
should be the name of the license, not the full text.

It is likely that anyone actually using this was outputing malformed
PKG-INFO files, because most license files contain newlines.

See GH issue #1551
parent 17ad2b72
......@@ -26,4 +26,3 @@ universal = 1
license_file = LICENSE
[bumpversion:file:setup.py]
......@@ -246,6 +246,24 @@ class ConfigHandler:
value = value.lower()
return value in ('1', 'true', 'yes')
@classmethod
def _exclude_files_parser(cls, key):
"""Returns a parser function to make sure field inputs
are not files.
Parses a value after getting the key so error messages are
more informative.
:param key:
:rtype: callable
"""
def parser(value):
exclude_directive = 'file:'
if value.startswith(exclude_directive):
raise ValueError('Only strings are accepted for the {0} field, files are not accepted'.format(key))
return value
return parser
@classmethod
def _parse_file(cls, value):
"""Represents value as a string, allowing including text
......@@ -255,7 +273,6 @@ class ConfigHandler:
directory with setup.py.
Examples:
file: LICENSE
file: README.rst, CHANGELOG.md, src/file.txt
:param str value:
......@@ -449,6 +466,7 @@ class ConfigMetadataHandler(ConfigHandler):
parse_list = self._parse_list
parse_file = self._parse_file
parse_dict = self._parse_dict
exclude_files_parser = self._exclude_files_parser
return {
'platforms': parse_list,
......@@ -460,7 +478,7 @@ class ConfigMetadataHandler(ConfigHandler):
DeprecationWarning),
'obsoletes': parse_list,
'classifiers': self._get_parser_compound(parse_file, parse_list),
'license': parse_file,
'license': exclude_files_parser('license'),
'description': parse_file,
'long_description': parse_file,
'version': self._parse_version,
......
......@@ -148,6 +148,26 @@ class TestEggInfo:
]
assert sorted(actual) == expected
def test_license_is_a_string(self, tmpdir_cwd, env):
setup_config = DALS("""
[metadata]
name=foo
version=0.0.1
license=file:MIT
""")
setup_script = DALS("""
from setuptools import setup
setup()
""")
build_files({'setup.py': setup_script,
'setup.cfg': setup_config})
with pytest.raises(ValueError):
self._run_egg_info_command(tmpdir_cwd, env)
def test_rebuilt(self, tmpdir_cwd, env):
"""Ensure timestamps are updated when the command is re-run."""
self._create_project()
......@@ -598,7 +618,10 @@ class TestEggInfo:
env=environ,
)
if code:
raise AssertionError(data)
if 'ValueError' in data:
raise ValueError(data)
else:
raise AssertionError(data)
if output:
assert output in data
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment