[Python-checkins] af2f3db02606 in distutils2: a bad predicate just display a warning --

tarek.ziade hg at python.org
Fri Mar 5 00:31:24 CET 2010


tarek.ziade pushed af2f3db02606 to distutils2:
http://hg.python.org/distutils2/rev/af2f3db02606
changeset: 72:af2f3db02606
tag: tip
user: Tarek Ziade <tarek at ziade.org>
date: Thu Mar 04 21:04:49 2010 +0100
summary: a bad predicate just display a warning --
diff --git a/docs/source/metadata.rst b/docs/source/metadata.rst
--- a/docs/source/metadata.rst
+++ b/docs/source/metadata.rst
@@ -2,20 +2,17 @@
 Metadata
 ========
 
-Distutils2 provides a :class:`DistributionMetadata` class that can read and 
-write Metadata files. It also supports PEP 345 environment markers and
-checks that version numbers provided in the fields are PEP 386 compatible
-when required.
+Distutils2 provides a :class:`DistributionMetadata` class that can read and
+write Metadata files. This class is compatible with all versions of Metadata:
 
+- 1.0 : PEP 241
+- 1.1 : PEP 314
+- 1.2 : PEP 345
 
-Supported formats
-=================
+The PEP 345 implementation supports the micro-language for the environment
+markers, and displays warnings when versions that are supposed to be
+PEP 386 are violating the scheme.
 
-The class can read and write Metadata v1.0 and v1.2 
-files. When a v1.1 file is read, it is transformed into 1.0 or 1.2 depending
-on the fields provided. 1.1 fields are ignored in that case.
-
-XXX explain why
 
 Reading metadata
 ================
@@ -34,11 +31,11 @@
 >>> metadata['Requires-Dist']
 ["pywin32; sys.platform == 'win32'", "Sphinx"]
 
-The fields that supports environment markers (XXX) can be automatically 
-ignored if the object is instanciated using the ``platform_dependant`` option.
+The fields that supports environment markers can be automatically ignored if
+the object is instanciated using the ``platform_dependant`` option.
 :class:`DistributionMetadata` will interpret in the case the markers and will
-automatically remove the fields that are not compliant with the running 
-environment. Here's an example under Mac OS X. The win32 dependency 
+automatically remove the fields that are not compliant with the running
+environment. Here's an example under Mac OS X. The win32 dependency
 we saw earlier is ignored::
 
 >>> from distutils2.metadata import DistributionMetadata
@@ -46,9 +43,53 @@
 >>> metadata['Requires-Dist']
 ['bar']
 
+If you want to provide your own execution context, let's say to test the
+Metadata under a particular environment that is not the current environment,
+you can provide your own values in the ``execution_context`` option, which
+is the dict that may contain one or more keys of the context the micro-language
+expects.
+
+Here's an example, simulating a win32 environment::
+
+ >>> from distutils2.metadata import DistributionMetadata
+ >>> context = {'sys.platform': 'win32'}
+ >>> metadata = DistributionMetadata('PKG-INFO', platform_dependant=True,
+ ... execution_context=context)
+ ...
+ >>> metadata['Requires-Dist'] = ["pywin32; sys.platform == 'win32'",
+ ... "Sphinx"]
+ ...
+ >>> metadata['Requires-Dist']
+ ['pywin32', 'Sphinx']
+
 
 Writing metadata
 ================
 
-XXX demonstrate here how version numbers are checked when a key is set.
+Writing metadata can be done using the ``write`` API::
 
+ >>> metadata.write('/to/my/PKG-INFO')
+
+The class will pick the best version for the metadata, depending on the values
+provided. If all the values provided exists in all versions, teh class will
+used :attr:`metadata.PKG_INFO_PREFERRED_VERSION`. It is set by default to 1.0.
+
+
+Conflict checking and best version
+==================================
+
+Some fields in PEP 345 have to follow a version scheme in their versions
+predicate. When the scheme is violated, a warning is emited::
+
+ >>> from distutils2.metadata import DistributionMetadata
+ >>> metadata = DistributionMetadata()
+ >>> metadata['Requires-Dist'] = ['Funky (Groovie)']
+ "Funky (Groovie)" is not a valid predicate
+ >>> metadata['Requires-Dist'] = ['Funky (1.2)']
+
+
+
+XXX talk about check()
+
+
+
diff --git a/src/distutils2/errors.py b/src/distutils2/errors.py
--- a/src/distutils2/errors.py
+++ b/src/distutils2/errors.py
@@ -93,3 +93,16 @@
 class MetadataUnrecognizedVersionError(DistutilsError):
 """Unknown metadata version number."""
 
+class IrrationalVersionError(Exception):
+ """This is an irrational version."""
+ pass
+
+class HugeMajorVersionNumError(IrrationalVersionError):
+ """An irrational version because the major version number is huge
+ (often because a year or date was used).
+
+ See `error_on_huge_major_num` option in `NormalizedVersion` for details.
+ This guard can be disabled by setting that option False.
+ """
+ pass
+
diff --git a/src/distutils2/metadata.py b/src/distutils2/metadata.py
--- a/src/distutils2/metadata.py
+++ b/src/distutils2/metadata.py
@@ -58,6 +58,7 @@
 from email import message_from_file
 from tokenize import tokenize, NAME, OP, STRING, ENDMARKER
 
+from distutils2.log import warn
 from distutils2.util import rfc822_escape
 from distutils2.version import is_valid_predicate
 from distutils2.errors import (MetadataConflictError,
@@ -352,7 +353,7 @@
 for v in value:
 # check that the values are valid predicates
 if not is_valid_predicate(v.split(';')[0]):
- raise ValueError('"%s" is not a valid predicate' % v)
+ warn('"%s" is not a valid predicate' % v)
 if name in _LISTFIELDS + _ELEMENTSFIELD:
 if isinstance(value, str):
 value = value.split(',')
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
@@ -134,6 +134,13 @@
 metadata.read_file(StringIO(open(PKG_INFO).read()))
 self.assertEquals(metadata['Metadata-Version'], '1.1')
 
+ def test_warnings(self):
+ metadata = DistributionMetadata()
+
+ # this should raise a warning
+ # XXX how to test this on 2.4 ?
+ metadata['Requires-Dist'] = ['Funky (Groovie)']
+
 
 
 def test_suite():
diff --git a/src/distutils2/version.py b/src/distutils2/version.py
--- a/src/distutils2/version.py
+++ b/src/distutils2/version.py
@@ -1,18 +1,7 @@
 import sys
 import re
 
-class IrrationalVersionError(Exception):
- """This is an irrational version."""
- pass
-
-class HugeMajorVersionNumError(IrrationalVersionError):
- """An irrational version because the major version number is huge
- (often because a year or date was used).
-
- See `error_on_huge_major_num` option in `NormalizedVersion` for details.
- This guard can be disabled by setting that option False.
- """
- pass
+from distutils2.errors import IrrationalVersionError, HugeMajorVersionNumError
 
 # A marker used in the second and third parts of the `parts` tuple, for
 # versions that don't have those segments, to sort properly. An example
@@ -373,7 +362,7 @@
 def is_valid_predicate(predicate):
 try:
 VersionPredicate(predicate)
- except ValueError:
+ except (ValueError, IrrationalVersionError):
 return False
 else:
 return True
--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /