Version 0.4
authorEric Mc Sween <eric.mcsween@auf.org>
Mon, 26 Aug 2013 18:08:23 +0000 (14:08 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Mon, 26 Aug 2013 18:08:23 +0000 (14:08 -0400)
CHANGES
README [deleted file]
README.rst [new file with mode: 0644]
codaxmli/__init__.py
codaxmli/lxmlutils.py [deleted file]
codaxmli/utils.py [new file with mode: 0644]
setup.py

diff --git a/CHANGES b/CHANGES
index eee7ffd..fd5d689 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,3 +12,11 @@ Version 0.3
 ===========
 
 * Gestion des échecs de connexion
+
+Version 0.4
+===========
+
+* Utilise xml.etree plutôt que lxml
+
+* On retire maintenant tous les namespaces de la réponse pour faciliter le
+  traitement.
diff --git a/README b/README
deleted file mode 100644 (file)
index 47d155c..0000000
--- a/README
+++ /dev/null
@@ -1,9 +0,0 @@
-coda-xmli
-=========
-
-Client pour l'interface XMLi de Coda.
-
-Installation
-============
-
-coda-xmli requiert Java, idéalement la version 1.6.
diff --git a/README.rst b/README.rst
new file mode 100644 (file)
index 0000000..7b0eff4
--- /dev/null
@@ -0,0 +1,10 @@
+=========
+coda-xmli
+=========
+
+Client pour l'interface XMLi de Coda.
+
+Installation
+============
+
+coda-xmli requiert Java, idéalement la version 1.6.
index ea0e9cc..b2b7a72 100644 (file)
@@ -1,12 +1,13 @@
+# encoding: utf-8
+
 import os
 import subprocess
+import xml.etree.cElementTree as ET
 from tempfile import mkstemp
+from xml.parsers.expat import ExpatError
 
-from lxml import etree
-from lxml.etree import XMLSyntaxError
 from pkg_resources import resource_filename
 
-
 CLASSPATH = ':'.join([
     resource_filename('codaxmli', 'java/router.jar'),
     resource_filename('codaxmli', 'java/xercesImpl.jar'),
@@ -27,7 +28,7 @@ class Client(object):
 
     def send(self, request):
         if not isinstance(request, basestring):
-            request = etree.tostring(request)
+            request = ET.tostring(request)
         if self.trace:
             print request
         request_fd, request_path = mkstemp(prefix='xmli-req-')
@@ -47,18 +48,27 @@ class Client(object):
         os.close(error_fd)
 
         try:
-            response = etree.parse(response_path)
-        except XMLSyntaxError:
+            response = ET.parse(response_path)
+        except (ExpatError, SyntaxError):
             with open(error_path) as error_file:
                 error_str = error_file.read()
             if 'COMMON_FW_INVALID_USER' in error_str:
                 raise LoginFailed()
-            raise
+            else:
+                raise XMLiError(error_str)
 
         os.remove(request_path)
         os.remove(response_path)
         os.remove(error_path)
 
+        # Enlever les namespaces de la réponse. C'est plus facile à traiter
+        # et Coda accepte de toute façon les requêtes sans les namespaces.
+        for elem in response.getiterator():
+            if elem.tag.startswith('{'):
+                ns_end = elem.tag.find('}')
+                if ns_end != -1:
+                    elem.tag = elem.tag[ns_end + 1:]
+
         errors = response.findall('//Reason')
         if errors:
             msgs = []
@@ -73,7 +83,7 @@ class Client(object):
                 msgs.append('\n'.join(lines))
             raise XMLiError('\n\n'.join(msgs).encode('utf-8'))
 
-        return response
+        return response.getroot()
 
 
 class XMLiError(Exception):
diff --git a/codaxmli/lxmlutils.py b/codaxmli/lxmlutils.py
deleted file mode 100644 (file)
index c1d591f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-from lxml.etree import SubElement
-
-
-def get_or_create_child(elem, name):
-    child = elem.find(name)
-    if child is None:
-        child = SubElement(elem, name)
-    return child
diff --git a/codaxmli/utils.py b/codaxmli/utils.py
new file mode 100644 (file)
index 0000000..d9dc358
--- /dev/null
@@ -0,0 +1,33 @@
+import xml.etree.cElementTree as ET
+import functools
+
+
+class Builder(object):
+
+    def __call__(self, tag, *children, **attrib):
+        elem = ET.Element(tag, attrib)
+        for item in children:
+            if isinstance(item, dict):
+                elem.attrib.update(item)
+            elif isinstance(item, basestring):
+                if len(elem):
+                    elem[-1].tail = (elem[-1].tail or "") + item
+                else:
+                    elem.text = (elem.text or "") + item
+            elif ET.iselement(item):
+                elem.append(item)
+            else:
+                raise TypeError("bad argument: %r" % item)
+        return elem
+
+    def __getattr__(self, tag):
+        return functools.partial(self, tag)
+
+E = Builder()
+
+
+def get_or_create_child(elem, name):
+    child = elem.find(name)
+    if child is None:
+        child = ET.SubElement(elem, name)
+    return child
index cf2487c..d016184 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 from setuptools import setup, find_packages
 
 name = 'coda-xmli'
-version = '0.3'
+version = '0.4'
 
 setup(
     name=name,