[Python-checkins] distutils2: make sure 1.2 is picked when a 1.1 or 1.2 field is encoutered

tarek.ziade python-checkins at python.org
Thu May 6 13:28:46 CEST 2010


tarek.ziade pushed 09e726d8a111 to distutils2:

http://hg.python.org/distutils2/rev/09e726d8a111
changeset:   125:09e726d8a111
user:        Tarek Ziade <tarek at ziade.org>
date:        Thu May 06 13:28:08 2010 +0200
summary:     make sure 1.2 is picked when a 1.1 or 1.2 field is encoutered
files:       src/distutils2/metadata.py, src/distutils2/tests/test_metadata.py

diff --git a/src/distutils2/metadata.py b/src/distutils2/metadata.py
--- a/src/distutils2/metadata.py
+++ b/src/distutils2/metadata.py
@@ -103,20 +103,44 @@
             if marker in keys:
                 return True
         return False
+
     keys = fields.keys()
-    is_1_1 = _has_marker(keys, _314_MARKERS)
-    is_1_2 = _has_marker(keys, _345_MARKERS)
+    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
+    for key in keys:
+        if key not in _241_FIELDS and '1.0' in possible_versions:
+            possible_versions.remove('1.0')
+        if key not in _314_FIELDS and '1.1' in possible_versions:
+            possible_versions.remove('1.1')
+        if key not in _345_FIELDS and '1.2' in possible_versions:
+            possible_versions.remove('1.2')
+
+    # possible_version contains qualified versions
+    if len(possible_versions) == 1:
+        return possible_versions[0]   # found !
+    elif len(possible_versions) == 0:
+        raise MetadataConflictError('Unknown metadata set')
+
+    # let's see if one unique marker is found
+    is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
+    is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
     if is_1_1 and is_1_2:
-        raise MetadataConflictError('You used both 1.1 and 1.2 fields')
+        raise MetadataConflictError('You used incompatible 1.1 and 1.2 fields')
 
     # we have the choice, either 1.0, or 1.2
     #   - 1.0 has a broken Summary field but work with all tools
     #   - 1.1 is to avoid
     #   - 1.2 fixes Summary but is not spreaded yet
     if not is_1_1 and not is_1_2:
-        return PKG_INFO_PREFERRED_VERSION
+        # we couldn't find any specific marker
+        if PKG_INFO_PREFERRED_VERSION in possible_versions:
+            return PKG_INFO_PREFERRED_VERSION
     if is_1_1:
         return '1.1'
+
+    # default marker when 1.0 is disqualified
     return '1.2'
 
 _ATTR2FIELD = {'metadata_version': 'Metadata-Version',
diff --git a/src/distutils2/tests/test_metadata.py b/src/distutils2/tests/test_metadata.py
--- a/src/distutils2/tests/test_metadata.py
+++ b/src/distutils2/tests/test_metadata.py
@@ -4,7 +4,8 @@
 import sys
 from StringIO import StringIO
 
-from distutils2.metadata import DistributionMetadata, _interpret
+from distutils2.metadata import (DistributionMetadata, _interpret,
+                                 PKG_INFO_PREFERRED_VERSION)
 
 class DistributionMetadataTestCase(unittest2.TestCase):
 
@@ -200,6 +201,12 @@
         self.assertEquals(missing, ['Name', 'Home-page'])
         self.assertEquals(len(warnings), 2)
 
+    def test_best_choice(self):
+        metadata = DistributionMetadata()
+        metadata['Version'] = '1.0'
+        self.assertEquals(metadata.version, PKG_INFO_PREFERRED_VERSION)
+        metadata['Classifier'] = ['ok']
+        self.assertEquals(metadata.version, '1.2')
 
 def test_suite():
     return unittest2.makeSuite(DistributionMetadataTestCase)

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list