diff options
author | Tarek Ziade <tarek@ziade.org> | 2012-03-12 20:25:35 -0700 |
---|---|---|
committer | Tarek Ziade <tarek@ziade.org> | 2012-03-12 20:25:35 -0700 |
commit | 7d29edff4202035cc03f339e1a90ea30db37d640 (patch) | |
tree | f080f60ccaee4b912b8d45c3943180958cc9751e /distutils2 | |
parent | 065332c0f9814048c4d3e4c8dc74b9a6146312d5 (diff) | |
download | disutils2-7d29edff4202035cc03f339e1a90ea30db37d640.tar.gz |
changed the metadata behavior so the version does not get set all the time
Diffstat (limited to 'distutils2')
-rw-r--r-- | distutils2/database.py | 3 | ||||
-rw-r--r-- | distutils2/metadata.py | 29 | ||||
-rw-r--r-- | distutils2/tests/test_metadata.py | 25 |
3 files changed, 36 insertions, 21 deletions
diff --git a/distutils2/database.py b/distutils2/database.py index 55fe71f..29b0926 100644 --- a/distutils2/database.py +++ b/distutils2/database.py @@ -380,7 +380,8 @@ class EggInfoDistribution(object): if self.metadata['Metadata-Version'] == '1.1': # we can't have 1.1 metadata *and* Setuptools requires for field in ('Obsoletes', 'Requires', 'Provides'): - del self.metadata[field] + if field in self.metadata: + del self.metadata[field] reqs = [] diff --git a/distutils2/metadata.py b/distutils2/metadata.py index cc942bd..bcb766b 100644 --- a/distutils2/metadata.py +++ b/distutils2/metadata.py @@ -49,7 +49,7 @@ PKG_INFO_ENCODING = 'utf-8' # preferred version. Hopefully will be changed # to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.0' +PKG_INFO_PREFERRED_VERSION = '1.1' _LINE_PREFIX = re.compile('\n \|') _241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', @@ -102,7 +102,12 @@ def _best_version(fields): return True return False - keys = list(fields) + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + possible_versions = ['1.0', '1.1', '1.2'] # first let's try to see if a field is not part of one of the version @@ -215,8 +220,9 @@ class Metadata(object): self.read_file(fileobj) elif mapping is not None: self.update(mapping) + self.set_metadata_version() - def _set_best_version(self): + def set_metadata_version(self): self._fields['Metadata-Version'] = _best_version(self._fields) def _write_field(self, file, name, value): @@ -234,7 +240,6 @@ class Metadata(object): del self._fields[field_name] except KeyError: raise KeyError(name) - self._set_best_version() def __contains__(self, name): return (name in self._fields or @@ -336,6 +341,7 @@ class Metadata(object): value = msg[field] if value is not None and value != 'UNKNOWN': self.set(field, value) + self.set_metadata_version() def write(self, filepath): """Write the metadata fields to filepath.""" @@ -347,7 +353,8 @@ class Metadata(object): def write_file(self, fileobject): """Write the PKG-INFO format data to a file object.""" - self._set_best_version() + self.set_metadata_version() + for field in _version2fieldlist(self['Metadata-Version']): values = self.get(field) if field in _ELEMENTSFIELD: @@ -374,14 +381,6 @@ class Metadata(object): Keys that don't match a metadata field or that have an empty value are dropped. """ - # XXX the code should just use self.set, which does tbe same checks and - # conversions already, but that would break packaging.pypi: it uses the - # update method, which does not call _set_best_version (which set - # does), and thus allows having a Metadata object (as long as you don't - # modify or write it) with extra fields from PyPI that are not fields - # defined in Metadata PEPs. to solve it, the best_version system - # should be reworked so that it's called only for writing, or in a new - # strict mode, or with a new, more lax Metadata subclass in p7g.pypi def _set(key, value): if key in _ATTR2FIELD and value: self.set(self._convert_name(key), value) @@ -442,7 +441,6 @@ class Metadata(object): value = self._remove_line_prefix(value) self._fields[name] = value - self._set_best_version() def get(self, name, default=_MISSING): """Get a metadata field.""" @@ -484,6 +482,8 @@ class Metadata(object): def check(self, strict=False, restructuredtext=False): """Check if the metadata is compliant. If strict is False then raise if no Name or Version are provided""" + self.set_metadata_version() + # XXX should check the versions (if the file was loaded) missing, warnings = [], [] @@ -528,6 +528,7 @@ class Metadata(object): Field names will be converted to use the underscore-lowercase style instead of hyphen-mixed case (i.e. home_page instead of Home-page). """ + self.set_metadata_version() data = { 'metadata_version': self['Metadata-Version'], 'name': self['Name'], diff --git a/distutils2/tests/test_metadata.py b/distutils2/tests/test_metadata.py index 0f513f9..4f586cb 100644 --- a/distutils2/tests/test_metadata.py +++ b/distutils2/tests/test_metadata.py @@ -54,7 +54,7 @@ class MetadataTestCase(LoggingCatcher, self.assertEqual(len(m.items()), 22) m = Metadata(mapping=dict(name='Test', version='1.0')) - self.assertEqual(len(m.items()), 11) + self.assertEqual(len(m.items()), 17) d = dict(m.items()) self.assertRaises(TypeError, Metadata, @@ -266,27 +266,32 @@ class MetadataTestCase(LoggingCatcher, self.assertNotIn('Obsoletes', metadata) metadata['Classifier'] = ['ok'] + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.1') metadata = Metadata() metadata['Download-URL'] = 'ok' + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.1') metadata = Metadata() metadata['Obsoletes'] = 'ok' + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.1') del metadata['Obsoletes'] metadata['Obsoletes-Dist'] = 'ok' + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.2') - - self.assertRaises(MetadataConflictError, metadata.set, - 'Obsoletes', 'ok') + metadata.set('Obsoletes', 'ok') + self.assertRaises(MetadataConflictError, + metadata.set_metadata_version) del metadata['Obsoletes'] del metadata['Obsoletes-Dist'] + metadata.set_metadata_version() metadata['Version'] = '1' - self.assertEqual(metadata['Metadata-Version'], '1.0') + self.assertEqual(metadata['Metadata-Version'], '1.1') # make sure the _best_version function works okay with # non-conflicting fields from 1.1 and 1.2 (i.e. we want only the @@ -295,18 +300,25 @@ class MetadataTestCase(LoggingCatcher, metadata = Metadata() metadata['Requires-Python'] = '3' metadata['Classifier'] = ['Programming language :: Python :: 3'] + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.2') PKG_INFO = os.path.join(os.path.dirname(__file__), 'SETUPTOOLS-PKG-INFO') metadata = Metadata(PKG_INFO) - self.assertEqual(metadata['Metadata-Version'], '1.0') + self.assertEqual(metadata['Metadata-Version'], '1.1') PKG_INFO = os.path.join(os.path.dirname(__file__), 'SETUPTOOLS-PKG-INFO2') metadata = Metadata(PKG_INFO) self.assertEqual(metadata['Metadata-Version'], '1.1') + # make sure an empty list for Obsoletes and Requires-dist gets ignored + metadata['Obsoletes'] = [] + metadata['Requires-dist'] = [] + metadata.set_metadata_version() + self.assertEqual(metadata['Metadata-Version'], '1.1') + # Update the _fields dict directly to prevent 'Metadata-Version' # from being updated by the _set_best_version() method. metadata._fields['Metadata-Version'] = '1.618' @@ -371,6 +383,7 @@ class MetadataTestCase(LoggingCatcher, metadata = Metadata() metadata['Project-URL'] = [('one', 'http://ok')] self.assertEqual(metadata['Project-URL'], [('one', 'http://ok')]) + metadata.set_metadata_version() self.assertEqual(metadata['Metadata-Version'], '1.2') # make sure this particular field is handled properly when written |