summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2017-11-23 18:34:20 (GMT)
committerGitHub <noreply@github.com>2017-11-23 18:34:20 (GMT)
commitdcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae (patch)
tree04fe4e6ad2511884cfc719e566c683b8e7c04360 /Lib
parent6a54c676e63517653d3d4a1e164bdd0fd45132d8 (diff)
downloadcpython-dcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae.zip
cpython-dcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae.tar.gz
cpython-dcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae.tar.bz2
bpo-19610: setup() now raises TypeError for invalid types (GH-4519)
The Distribution class now explicitly raises an exception when 'classifiers', 'keywords' and 'platforms' fields are not specified as a list.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/distutils/dist.py26
-rw-r--r--Lib/distutils/tests/test_dist.py44
2 files changed, 70 insertions, 0 deletions
diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py
index 62a2451..78c29ed 100644
--- a/Lib/distutils/dist.py
+++ b/Lib/distutils/dist.py
@@ -1188,12 +1188,38 @@ class DistributionMetadata:
def get_keywords(self):
return self.keywords or []
+ def set_keywords(self, value):
+ # If 'keywords' is a string, it will be converted to a list
+ # by Distribution.finalize_options(). To maintain backwards
+ # compatibility, do not raise an exception if 'keywords' is
+ # a string.
+ if not isinstance(value, (list, str)):
+ msg = "'keywords' should be a 'list', not %r"
+ raise TypeError(msg % type(value).__name__)
+ self.keywords = value
+
def get_platforms(self):
return self.platforms or ["UNKNOWN"]
+ def set_platforms(self, value):
+ # If 'platforms' is a string, it will be converted to a list
+ # by Distribution.finalize_options(). To maintain backwards
+ # compatibility, do not raise an exception if 'platforms' is
+ # a string.
+ if not isinstance(value, (list, str)):
+ msg = "'platforms' should be a 'list', not %r"
+ raise TypeError(msg % type(value).__name__)
+ self.platforms = value
+
def get_classifiers(self):
return self.classifiers or []
+ def set_classifiers(self, value):
+ if not isinstance(value, list):
+ msg = "'classifiers' should be a 'list', not %r"
+ raise TypeError(msg % type(value).__name__)
+ self.classifiers = value
+
def get_download_url(self):
return self.download_url or "UNKNOWN"
diff --git a/Lib/distutils/tests/test_dist.py b/Lib/distutils/tests/test_dist.py
index 1f104ce..50b456e 100644
--- a/Lib/distutils/tests/test_dist.py
+++ b/Lib/distutils/tests/test_dist.py
@@ -195,6 +195,13 @@ class DistributionTestCase(support.LoggingSilencer,
self.assertEqual(dist.metadata.platforms, ['one', 'two'])
self.assertEqual(dist.metadata.keywords, ['one', 'two'])
+ attrs = {'keywords': 'foo bar',
+ 'platforms': 'foo bar'}
+ dist = Distribution(attrs=attrs)
+ dist.finalize_options()
+ self.assertEqual(dist.metadata.platforms, ['foo bar'])
+ self.assertEqual(dist.metadata.keywords, ['foo bar'])
+
def test_get_command_packages(self):
dist = Distribution()
self.assertEqual(dist.command_packages, None)
@@ -338,9 +345,46 @@ class MetadataTestCase(support.TempdirManager, support.EnvironGuard,
attrs = {'name': 'Boa', 'version': '3.0',
'classifiers': ['Programming Language :: Python :: 3']}
dist = Distribution(attrs)
+ self.assertEqual(dist.get_classifiers(),
+ ['Programming Language :: Python :: 3'])
meta = self.format_metadata(dist)
self.assertIn('Metadata-Version: 1.1', meta)
+ def test_classifier_invalid_type(self):
+ attrs = {'name': 'Boa', 'version': '3.0',
+ 'classifiers': ('Programming Language :: Python :: 3',)}
+ msg = "'classifiers' should be a 'list', not 'tuple'"
+ with self.assertRaises(TypeError, msg=msg):
+ Distribution(attrs)
+
+ def test_keywords(self):
+ attrs = {'name': 'Monty', 'version': '1.0',
+ 'keywords': ['spam', 'eggs', 'life of brian']}
+ dist = Distribution(attrs)
+ self.assertEqual(dist.get_keywords(),
+ ['spam', 'eggs', 'life of brian'])
+
+ def test_keywords_invalid_type(self):
+ attrs = {'name': 'Monty', 'version': '1.0',
+ 'keywords': ('spam', 'eggs', 'life of brian')}
+ msg = "'keywords' should be a 'list', not 'tuple'"
+ with self.assertRaises(TypeError, msg=msg):
+ Distribution(attrs)
+
+ def test_platforms(self):
+ attrs = {'name': 'Monty', 'version': '1.0',
+ 'platforms': ['GNU/Linux', 'Some Evil Platform']}
+ dist = Distribution(attrs)
+ self.assertEqual(dist.get_platforms(),
+ ['GNU/Linux', 'Some Evil Platform'])
+
+ def test_platforms_invalid_types(self):
+ attrs = {'name': 'Monty', 'version': '1.0',
+ 'platforms': ('GNU/Linux', 'Some Evil Platform')}
+ msg = "'platforms' should be a 'list', not 'tuple'"
+ with self.assertRaises(TypeError, msg=msg):
+ Distribution(attrs)
+
def test_download_url(self):
attrs = {'name': 'Boa', 'version': '3.0',
'download_url': 'http://example.org/boa'}