From 962c9e7f9188c75a3889fcc7fd29fb1626e278d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Fri, 6 Oct 2000 17:41:52 +0000 Subject: Add SAXReaderNotAvailable, and use it to distinguish between an ImportError, and a missing driver. --- Lib/test/output/test_sax | 3 ++- Lib/test/test_sax.py | 18 +++++++++++++++++- Lib/xml/sax/__init__.py | 13 +++++++++++-- Lib/xml/sax/_exceptions.py | 10 ++++++++++ Lib/xml/sax/expatreader.py | 5 ++++- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Lib/test/output/test_sax b/Lib/test/output/test_sax index 53c5f97..d2ccf88 100644 --- a/Lib/test/output/test_sax +++ b/Lib/test/output/test_sax @@ -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 diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index 1760eb2..b3576ab 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -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", {"å" : "å"}) == "Hei på 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 = '\n' diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py index 1f1f58e..447420e 100644 --- a/Lib/xml/sax/__init__.py +++ b/Lib/xml/sax/__init__.py @@ -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 diff --git a/Lib/xml/sax/_exceptions.py b/Lib/xml/sax/_exceptions.py index c02974f..1804f3f 100644 --- a/Lib/xml/sax/_exceptions.py +++ b/Lib/xml/sax/_exceptions.py @@ -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.""" diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 2fc2b7c..eb46bcd 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -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 -- cgit v0.12