[Lxml-checkins] r52430 - in lxml/trunk: . src/lxml

scoder at codespeak.net scoder at codespeak.net
Wed Mar 12 19:48:54 CET 2008


Author: scoder
Date: Wed Mar 12 19:48:52 2008
New Revision: 52430

Modified:
   lxml/trunk/   (props changed)
   lxml/trunk/src/lxml/lxml.objectify.pyx
Log:
 r3773 at delle:  sbehnel | 2008-03-12 19:46:51 +0100
 fix: attribute assignment of custom PyTypes must call the type's own stringify()


Modified: lxml/trunk/src/lxml/lxml.objectify.pyx
==============================================================================
--- lxml/trunk/src/lxml/lxml.objectify.pyx	(original)
+++ lxml/trunk/src/lxml/lxml.objectify.pyx	Wed Mar 12 19:48:52 2008
@@ -101,6 +101,9 @@
 XML_SCHEMA_INSTANCE_TYPE_ATTR = "{%s}type" % XML_SCHEMA_INSTANCE_NS
 
 
+# Forward declaration
+cdef class PyType
+
 ################################################################################
 # Element class for the main API
 
@@ -489,25 +492,27 @@
         _setElementValue(new_element, value)
 
 cdef _setElementValue(_Element element, value):
-    cdef python.PyObject* dict_result
+    cdef python.PyObject* _pytype
     if value is None:
         cetree.setAttributeValue(
             element, XML_SCHEMA_INSTANCE_NIL_ATTR, "true")
     elif isinstance(value, _Element):
         _replaceElement(element, value)
+        return
     else:
         cetree.delAttributeFromNsName(
             element._c_node, _XML_SCHEMA_INSTANCE_NS, "nil")
         if python._isString(value):
             pytype_name = "str"
+            _pytype = python.PyDict_GetItem(_PYTYPE_DICT, "str")
         else:
             pytype_name = _typename(value)
-            if isinstance(value, bool):
-                value = _lower_bool(value)
+            _pytype = python.PyDict_GetItem(_PYTYPE_DICT, pytype_name)
+            if _pytype is not NULL:
+                value = (<PyType>_pytype).stringify(value)
             else:
                 value = str(value)
-        dict_result = python.PyDict_GetItem(_PYTYPE_DICT, pytype_name)
-        if dict_result is not NULL:
+        if _pytype is not NULL:
             cetree.setAttributeValue(element, PYTYPE_ATTRIBUTE, pytype_name)
         else:
             cetree.delAttributeFromNsName(element._c_node, PYTYPE_NAMESPACE,
@@ -884,7 +889,7 @@
     """
     cdef readonly object name
     cdef readonly object type_check
-    cdef object _add_text
+    cdef readonly object stringify
     cdef object _type
     cdef object _schema_types
     def __init__(self, name, type_check, type_class, stringify=None):
@@ -900,9 +905,8 @@
         self._type = type_class
         self.type_check = type_check
         if stringify is None:
-            self._add_text = _StringValueSetter(str)
-        else:
-            self._add_text = _StringValueSetter(stringify)
+            stringify = str
+        self.stringify = stringify
         self._schema_types = []
 
     def __repr__(self):
@@ -973,14 +977,6 @@
         def __set__(self, types):
             self._schema_types = list(types)
 
-cdef class _StringValueSetter:
-    cdef object _stringify
-    def __init__(self, stringify):
-        self._stringify = stringify
-
-    def __call__(self, elem, value):
-        _add_text(elem, self._stringify(value))
-
 
 cdef object _PYTYPE_DICT
 _PYTYPE_DICT = {}
@@ -1204,7 +1200,7 @@
                 pytype_name = _typename(child)
                 pytype = python.PyDict_GetItem(_PYTYPE_DICT, pytype_name)
                 if pytype is not NULL:
-                    (<PyType>pytype)._add_text(element, child)
+                    _add_text(element, (<PyType>pytype).stringify(child))
                 else:
                     has_string_value = 1
                     child = str(child)


More information about the lxml-checkins mailing list