[z3-checkins] r40540 - in z3/deliverance/zdeliverance: . tests

ianb at codespeak.net ianb at codespeak.net
Thu Mar 15 16:24:48 CET 2007


Author: ianb
Date: Thu Mar 15 16:24:47 2007
New Revision: 40540

Modified:
   z3/deliverance/zdeliverance/tests/test_traversal.py
   z3/deliverance/zdeliverance/traversal.py
Log:
Added deliverance tranformations

Modified: z3/deliverance/zdeliverance/tests/test_traversal.py
==============================================================================
--- z3/deliverance/zdeliverance/tests/test_traversal.py	(original)
+++ z3/deliverance/zdeliverance/tests/test_traversal.py	Thu Mar 15 16:24:47 2007
@@ -1,5 +1,6 @@
 import unittest
 import time
+import re
 
 from zope.app.testing import ztapi
 from zope.app.testing.placelesssetup import PlacelessSetup
@@ -36,17 +37,31 @@
         rule = self._makeOne()
         container = Dummy()
         request = DummyRequest()
-        rule.theme_url = 'the theme url'
-        rule.rule = 'the rule'
+        rule.theme_uri = 'data:<html>'
+        rule.rule = '<rules>the rule</rules>'
         rule.__call__(container, request)
         response = request.RESPONSE
+        response.headers = {'content-type': 'text/plain'}
         response.setBody('hello')
         self.assertEqual(response.body, 'hello')
-        self.assertEqual(request.data['DELIVERANCE_THEME'],
-                         {'theme_url':'the theme url',
-                          'rule':'the rule'})
 
-# puru1pip
+    def test_transform(self):
+        rule = self._makeOne()
+        container = Dummy()
+        request = DummyRequest()
+        rule.theme_uri = '''data:<html><head></head>
+        <body><h1>Example</h1><div id="body"></div></body></html>'''
+        rule.rule = '''<rules xmlns="http://www.plone.org/deliverance">
+        <copy theme="//div[@id='body']" content="//*[@id='served-content']" />
+        </rules>'''
+        rule.__call__(container, request)
+        response = request.RESPONSE
+        response.headers = {'content-type': 'text/html'}
+        response.setBody('''<html><head>
+        <body><div id="served-content">some content</div></body></html>''')
+        body = re.sub(r'[\n\t]', '', response.body)
+        self.assertEqual(body, '''<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1>Example</h1><div id="body"><div id="served-content">some content</div></div></body></html>''')
+
 
 class Dummy:
     pass

Modified: z3/deliverance/zdeliverance/traversal.py
==============================================================================
--- z3/deliverance/zdeliverance/traversal.py	(original)
+++ z3/deliverance/zdeliverance/traversal.py	Thu Mar 15 16:24:47 2007
@@ -5,6 +5,11 @@
 from OFS.SimpleItem import SimpleItem
 from OFS.PropertyManager import PropertyManager
 
+from deliverance.interpreter import Renderer
+from deliverance import htmlserialize
+from lxml import etree
+import urllib
+
 class DeliveranceRule(SimpleItem, PropertyManager):
     """ An object which invokes a deliverance rule when its container
     is traversed """
@@ -16,7 +21,7 @@
 
     _properties = (
         {'id':'title', 'type':'string', 'mode':'w'},
-        {'id':'theme_url', 'type':'string', 'mode':'w', 'label':'Theme URL'},
+        {'id':'theme_uri', 'type':'string', 'mode':'w', 'label':'Theme URI'},
         {'id':'rule', 'type':'text', 'mode':'w', 'label':'Rule'},
         )
     manage_options = PropertyManager.manage_options
@@ -36,12 +41,57 @@
         orig_setBody = response.setBody
         def setBody(*arg, **kw):
             orig_setBody(*arg, **kw)
-            # XXX do work
-            orig_setBody(*arg, **kw)
+            # Should also stop if deliverance.theme doesn't match up to self
+            if not response.headers['content-type'].startswith('text/html'):
+                return response
+            body = self.transform_body(response)
+            return orig_setBody(body)
         response.setBody = setBody
-        request.set('DELIVERANCE_THEME', {'theme_url':self.theme_url,
-                                          'rule':self.rule})
-    
+
+    def transform_body(self, response):
+        interp = self.make_renderer()
+        body = response.body
+        transformed = interp.render(etree.HTML(body))
+        return htmlserialize.tostring(transformed)
+
+    def make_renderer(self):
+        return Renderer(
+            theme=self.get_theme(),
+            theme_uri=self.theme_uri,
+            rule=self.get_rule(),
+            rule_uri=self.get_rule_uri(),
+            reference_resolver=self.resolve_reference)
+
+    def get_theme(self):
+        return self.resolve_reference(self.theme_uri, 'html')
+
+    def get_rule(self):
+        return etree.XML(self.rule)
+
+    def get_rule_uri(self):
+        self.absolute_url() + '/rule'
+
+    def resolve_reference(self, href, parse, encoding=None):
+        text = self.get_resource(href)
+        if parse == "xml":
+            return etree.XML(text)
+        if parse == "html":
+            return etree.HTML(text)
+        else:
+            if encoding:
+                return text.decode(encoding)
+            else:
+                return text
+
+    def get_resource(self, href):
+        if href.startswith('data:'):
+            return href[5:]
+        # @@: This is a really bad implementation
+        f = urllib.urlopen(href)
+        c = f.read()
+        f.close()
+        return f
+            
 def manage_addDeliveranceRule(self, REQUEST=None):
     """ Add a deliverance rule """
     rule = DeliveranceRule()


More information about the z3-checkins mailing list