[Lxml-checkins] r44937 - in lxml/branch/lxml-1.3: . src/lxml src/lxml/tests

scoder at codespeak.net scoder at codespeak.net
Thu Jul 12 00:13:33 CEST 2007


Author: scoder
Date: Thu Jul 12 00:13:32 2007
New Revision: 44937

Modified:
   lxml/branch/lxml-1.3/CHANGES.txt
   lxml/branch/lxml-1.3/src/lxml/apihelpers.pxi
   lxml/branch/lxml-1.3/src/lxml/etree.pyx
   lxml/branch/lxml-1.3/src/lxml/tests/test_etree.py
Log:
trunk merge: split of fromstring() and XML(), raise exception on tag names containing ':'

Modified: lxml/branch/lxml-1.3/CHANGES.txt
==============================================================================
--- lxml/branch/lxml-1.3/CHANGES.txt	(original)
+++ lxml/branch/lxml-1.3/CHANGES.txt	Thu Jul 12 00:13:32 2007
@@ -8,11 +8,16 @@
 Features added
 --------------
 
+* ``etree.fromstring()`` now supports parsing both HTML and XML, depending on
+  the parser you pass.
+
 * Support ``base_url`` keyword argument in ``HTML()`` and ``XML()``
 
 Bugs fixed
 ----------
 
+* ``Element()`` did not raise an exception on tag names containing ':'
+
 
 1.3.2 (2007-07-03)
 ==================

Modified: lxml/branch/lxml-1.3/src/lxml/apihelpers.pxi
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/apihelpers.pxi	(original)
+++ lxml/branch/lxml-1.3/src/lxml/apihelpers.pxi	Thu Jul 12 00:13:32 2007
@@ -708,6 +708,8 @@
         c_ns_end = cstd.strchr(c_tag, c'}')
         if c_ns_end is NULL:
             raise ValueError, "Invalid tag name"
+        if cstd.strchr(c_ns_end, c':') is not NULL:
+            raise ValueError, "Invalid tag name"
         nslen  = c_ns_end - c_tag
         taglen = python.PyString_GET_SIZE(tag) - nslen - 2
         if taglen == 0:
@@ -717,6 +719,8 @@
         tag = python.PyString_FromStringAndSize(c_ns_end+1, taglen)
     elif python.PyString_GET_SIZE(tag) == 0:
         raise ValueError, "Empty tag name"
+    elif cstd.strchr(c_tag, c':') is not NULL:
+        raise ValueError, "Invalid tag name"
     return ns, tag
 
 cdef object _namespacedName(xmlNode* c_node):

Modified: lxml/branch/lxml-1.3/src/lxml/etree.pyx
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/etree.pyx	(original)
+++ lxml/branch/lxml-1.3/src/lxml/etree.pyx	Thu Jul 12 00:13:32 2007
@@ -1892,7 +1892,9 @@
 
 def XML(text, _BaseParser parser=None, base_url=None):
     """Parses an XML document from a string constant. This function can be used
-    to embed "XML literals" in Python code.
+    to embed "XML literals" in Python code, like in
+
+       >>> root = etree.XML("<root><test/></root>")
 
     To override the parser with a different ``XMLParser`` you can pass it to
     the ``parser`` keyword argument.
@@ -1909,7 +1911,21 @@
     doc = _parseMemoryDocument(text, base_url, parser)
     return doc.getroot()
 
-fromstring = XML
+def fromstring(text, _BaseParser parser=None, base_url=None):
+    """Parses an XML document from a string.
+
+    To override the default parser with a different parser you can pass it to
+    the ``parser`` keyword argument.
+
+    The ``base_url`` keyword argument allows to set the original base URL of
+    the document to support relative Paths when looking up external entities
+    (DTD, XInclude, ...).
+    """
+    cdef _Document doc
+    if parser is None:
+        parser = __GLOBAL_PARSER_CONTEXT.getDefaultParser()
+    doc = _parseMemoryDocument(text, base_url, parser)
+    return doc.getroot()
 
 def iselement(element):
     """Checks if an object appears to be a valid element object.

Modified: lxml/branch/lxml-1.3/src/lxml/tests/test_etree.py
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/tests/test_etree.py	(original)
+++ lxml/branch/lxml-1.3/src/lxml/tests/test_etree.py	Thu Jul 12 00:13:32 2007
@@ -52,14 +52,28 @@
 
     def test_element_names(self):
         Element = self.etree.Element
-        
         el = Element('name')
         self.assertEquals(el.tag, 'name')
         el = Element('{}name')
         self.assertEquals(el.tag, 'name')
+
+    def test_element_name_empty(self):
+        Element = self.etree.Element
+        el = Element('name')
+        self.assertRaises(ValueError, Element, '{}')
+        self.assertRaises(ValueError, setattr, el, 'tag', '{}')
+
         self.assertRaises(ValueError, Element, '{test}')
         self.assertRaises(ValueError, setattr, el, 'tag', '{test}')
 
+    def test_element_name_colon(self):
+        Element = self.etree.Element
+        self.assertRaises(ValueError, Element, 'p:name')
+        self.assertRaises(ValueError, Element, '{test}p:name')
+
+        el = Element('name')
+        self.assertRaises(ValueError, setattr, el, 'tag', 'p:name')
+
     def test_attribute_set(self):
         # ElementTree accepts arbitrary attribute values
         # lxml.etree allows only strings


More information about the lxml-checkins mailing list