[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