#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2009 Søren Roug, European Environment Agency
#
# This is free software. You may redistribute it under the terms
# of the Apache license and the GNU General Public License Version
# 2 or at your option any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Contributor(s):
#
import xml.sax, xml.sax.saxutils
import io
import tempfile
import unittest
import sys
class MyGen(xml.sax.saxutils.XMLGenerator):
def _qname(self, name):
"""Builds a qualified name from a (ns_url, localname) pair"""
if name[0]:
if name[0] == u'http://www.w3.org/XML/1998/namespace':
return u'xml' + ":" + name[1]
# The name is in a non-empty namespace
prefix = self._current_context[name[0]]
if prefix:
# If it is not the default namespace, prepend the prefix
return prefix + ":" + name[1]
# Return the unqualified name
return name[1]
class TestXMLGenerator(unittest.TestCase):
def test_xmlgenerator(self):
""" Test that the xml namespace is understood by XMLGenerator """
outfp = tempfile.TemporaryFile()
c = xml.sax.saxutils.XMLGenerator(outfp,'utf-8')
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 1)
parser.setContentHandler(c)
testcontent="""
Hello world
"""
parser.feed(testcontent)
parser.close()
expectedresult = """
Hello world
"""
outfp.seek(0)
self.assertEqual( outfp.read().decode('utf-8'), expectedresult)
outfp.close()
def test_xmlgenerator_wo_ns(self):
""" Test that the missing xml namespace is understood by XMLGenerator """
outfp = tempfile.TemporaryFile()
c = xml.sax.saxutils.XMLGenerator(outfp,'utf-8')
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 1)
parser.setContentHandler(c)
testcontent="""
Hello world
"""
# There is a bug in older versions of saxutils
if sys.version_info[0] == 2 and sys.version_info[1] == 6:
self.assertRaises(KeyError, parser.feed, testcontent)
else:
parser.feed(testcontent)
parser.close()
expectedresult="""
Hello world
"""
outfp.seek(0)
self.assertEqual( outfp.read().decode('utf-8'), expectedresult)
outfp.close()
def test_myxml(self):
""" Test that my patch works """
outfp = tempfile.TemporaryFile()
c = MyGen(outfp,'utf-8')
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 1)
parser.setContentHandler(c)
testcontent="""
Hello world
"""
parser.feed(testcontent)
parser.close()
outfp.seek(0)
expectedresult = """
Hello world
"""
self.assertEqual( outfp.read().decode('utf-8'), expectedresult)
outfp.close()
def test_myxml_wo_xml(self):
""" Test that my patch understands the missing xml namespace """
outfp = tempfile.TemporaryFile()
c = MyGen(outfp,'utf-8')
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 1)
parser.setContentHandler(c)
testcontent="""
Hello world
"""
parser.feed(testcontent)
parser.close()
outfp.seek(0)
expectedresult = """
Hello world
"""
self.assertEqual( outfp.read().decode('utf-8'), expectedresult)
outfp.close()
if __name__ == '__main__':
unittest.main()