]> granicus.if.org Git - python/commitdiff
Add SAXReaderNotAvailable, and use it to distinguish between an
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 6 Oct 2000 17:41:52 +0000 (17:41 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 6 Oct 2000 17:41:52 +0000 (17:41 +0000)
ImportError, and a missing driver.

Lib/test/output/test_sax
Lib/test/test_sax.py
Lib/xml/sax/__init__.py
Lib/xml/sax/_exceptions.py
Lib/xml/sax/expatreader.py

index 53c5f97ef78dfcca19c1387fbeee699c37ecba3d..d2ccf889bfe45ef2d5c3ff767aad73db054f0e1e 100644 (file)
@@ -14,6 +14,7 @@ Passed test_expat_inpsource_sysid
 Passed test_expat_nsattrs_empty
 Passed test_expat_nsattrs_wattr
 Passed test_filter_basic
+Passed test_make_parser
 Passed test_nsattrs_empty
 Passed test_nsattrs_wattr
 Passed test_xmlgen_basic
@@ -22,4 +23,4 @@ Passed test_xmlgen_content_escape
 Passed test_xmlgen_ignorable
 Passed test_xmlgen_ns
 Passed test_xmlgen_pi
-23 tests, 0 failures
+24 tests, 0 failures
index 1760eb27974b7cdee2c1f138cf2de6cc95b973f4..b3576ab1c8546251f6c4152b727505e7a3bedb66 100644 (file)
@@ -2,10 +2,15 @@
 # regression test for SAX 2.0
 # $Id$
 
+from xml.sax import make_parser, ContentHandler
+try:
+    make_parser()
+except xml.sax.SAXReaderNotAvailable:
+    # don't try to test this module if we cannot create a parser
+    raise ImportError("no XML parsers available")
 from xml.sax.saxutils import XMLGenerator, escape, XMLFilterBase
 from xml.sax.expatreader import create_parser
 from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
-from xml.sax.handler import ContentHandler
 from cStringIO import StringIO
 from test_support import verbose, TestFailed, findfile
 
@@ -41,6 +46,17 @@ def test_escape_all():
 def test_escape_extra():
     return escape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
 
+def test_make_parser():
+    try:
+        # Creating a parser should succeed - it should fall back
+        # to the expatreader
+        p = make_parser(['xml.parsers.no_such_parser'])
+    except:
+        return 0
+    else:
+        return p
+
+
 # ===== XMLGenerator
 
 start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
index 1f1f58eba6b03a7cc68ab8417317ad3a3338fa28..447420e6e9722ed13692045082350c556cdc158b 100644 (file)
@@ -22,7 +22,8 @@ expatreader -- Driver that allows use of the Expat parser with SAX.
 from xmlreader import InputSource
 from handler import ContentHandler, ErrorHandler
 from _exceptions import SAXException, SAXNotRecognizedException, \
-                        SAXParseException, SAXNotSupportedException
+                        SAXParseException, SAXNotSupportedException, \
+                        SAXReaderNotAvailable
 
 
 def parse(source, handler, errorHandler=ErrorHandler()):
@@ -74,9 +75,17 @@ def make_parser(parser_list = []):
         try:
             return _create_parser(parser_name)
         except ImportError,e:
+            import sys
+            if sys.modules.has_key(parser_name):
+                # The parser module was found, but importing it
+                # failed unexpectedly, pass this exception through
+                raise
+        except SAXReaderNotAvailable:
+            # The parser module detected that it won't work properly,
+            # so try the next one
             pass
 
-    raise SAXException("No parsers found", None)  
+    raise SAXReaderNotAvailable("No parsers found", None)  
     
 # --- Internal utility methods used by make_parser
 
index c02974fb8e7e4eb2c9f364450f5002c02fc229b6..1804f3fde22e1f4b37c845429135ecb1e0519efd 100644 (file)
@@ -104,3 +104,13 @@ class SAXNotSupportedException(SAXException):
     perform is requested (specifically setting a state or value). SAX
     applications and extensions may use this class for similar
     purposes."""
+
+# ===== SAXNOTSUPPORTEDEXCEPTION =====
+
+class SAXReaderNotAvailable(SAXNotSupportedException):
+    """Exception class for a missing driver.
+
+    An XMLReader module (driver) should raise this exception when it
+    is first imported, e.g. when a support module cannot be imported.
+    It also may be raised during parsing, e.g. if executing an external
+    program is not permitted."""
index 2fc2b7c145033cd03fcf8b73275557fdb5a30501..eb46bcd10052fec778a749c68007978caaa92fb4 100644 (file)
@@ -6,7 +6,10 @@ pyexpat.__version__ == '2.22'.
 version = "0.20"
 
 from xml.sax._exceptions import *
-from xml.parsers import expat
+try:
+    from xml.parsers import expat
+except ImportError:
+    raise SAXReaderNotAvailable("expat not supported",None) 
 from xml.sax import xmlreader, saxutils, handler
 
 AttributesImpl = xmlreader.AttributesImpl