[Repoze-checkins] r1341 - in repoze.bfg/trunk/repoze/bfg: . tests tests/fixtures
Paul Everitt
paul at agendaless.com
Wed Jul 16 13:21:29 EDT 2008
For Tres's pushpage, and for this XSLT crapola, should we have the
sampleapp cover these other ways?
I think leaving it out of the README is the best thing, at least for
the XSLT.
--Paul
On Jul 16, 2008, at 1:00 PM, Chris McDonough wrote:
> Hooray!
>
> Paul Everitt wrote:
>> Author: Paul Everitt <paul at agendaless.com>
>> Date: Wed Jul 16 12:55:42 2008
>> New Revision: 1341
>> Log:
>> Added:
>> repoze.bfg/trunk/repoze/bfg/tests/fixtures/minimal.xsl
>> repoze.bfg/trunk/repoze/bfg/tests/test_xslt.py
>> Modified:
>> repoze.bfg/trunk/repoze/bfg/template.py
>> Modified: repoze.bfg/trunk/repoze/bfg/template.py
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- repoze.bfg/trunk/repoze/bfg/template.py (original)
>> +++ repoze.bfg/trunk/repoze/bfg/template.py Wed Jul 16 12:55:42 2008
>> @@ -26,6 +26,38 @@
>> response = Response(result)
>> return response
>> +class XSLTemplateFactory(object):
>> + classProvides(ITemplateFactory)
>> + implements(IView)
>> +
>> + def __init__(self, path):
>> + self.path = path
>> +
>> + def __call__(self, *arg, **kw):
>> + node = kw.get("node")
>> + processor = get_processor(self.path)
>> + result = str(processor(node))
>> + response = Response(result)
>> + return response
>> +
>> +# Manage XSLT processors on a per-thread basis
>> +import threading
>> +from lxml import etree
>> +xslt_pool = threading.local()
>> +def get_processor(xslt_fn):
>> + try:
>> + return xslt_pool.processors[xslt_fn]
>> + except AttributeError:
>> + xslt_pool.processors = {}
>> + except KeyError:
>> + pass
>> +
>> + # Make a processor and add it to the pool
>> + source = etree.ElementTree(file=xslt_fn)
>> + proc = etree.XSLT(source)
>> + xslt_pool.processors[xslt_fn] = proc
>> + return proc
>> +
>> def package_path(package):
>> return os.path.abspath(os.path.dirname(package.__file__))
>> @@ -56,3 +88,23 @@
>> registerTemplate(template, path)
>> return template(**kw)
>> +
>> +def render_transform(path, **kw):
>> + # Render using XSLT
>> +
>> + if not os.path.isabs(path):
>> + package_globals = sys._getframe(1).f_globals
>> + package_name = package_globals['__name__']
>> + package = sys.modules[package_name]
>> + prefix = package_path(package)
>> + path = os.path.join(prefix, path)
>> +
>> + template = queryUtility(IView, path)
>> + node = kw.get("node")
>> + if template is None:
>> + if not os.path.exists(path):
>> + raise ValueError('Missing template file: %s' % path)
>> + template = XSLTemplateFactory(path)
>> + registerTemplate(template, path)
>> +
>> + return template(**kw)
>> Added: repoze.bfg/trunk/repoze/bfg/tests/fixtures/minimal.xsl
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- (empty file)
>> +++ repoze.bfg/trunk/repoze/bfg/tests/fixtures/minimal.xsl Wed Jul
>> 16 12:55:42 2008
>> @@ -0,0 +1,6 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> version="1.0">
>> + <xsl:template match="/">
>> + <div/>
>> + </xsl:template>
>> +</xsl:stylesheet>
>> Added: repoze.bfg/trunk/repoze/bfg/tests/test_xslt.py
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- (empty file)
>> +++ repoze.bfg/trunk/repoze/bfg/tests/test_xslt.py Wed Jul 16
>> 12:55:42 2008
>> @@ -0,0 +1,123 @@
>> +import unittest
>> +
>> +from zope.component.testing import PlacelessSetup
>> +
>> +class Base(PlacelessSetup):
>> + def setUp(self):
>> + PlacelessSetup.setUp(self)
>> +
>> + def tearDown(self):
>> + PlacelessSetup.tearDown(self)
>> +
>> + def _zcmlConfigure(self):
>> + import repoze.bfg
>> + import zope.configuration.xmlconfig
>> + zope.configuration.xmlconfig.file('configure.zcml',
>> package=repoze.bfg)
>> +
>> + def _getTemplatePath(self, name):
>> + import os
>> + here = os.path.abspath(os.path.dirname(__file__))
>> + return os.path.join(here, 'fixtures', name)
>> + +class XSLTemplateFactoryTests(unittest.TestCase, Base):
>> + def setUp(self):
>> + Base.setUp(self)
>> +
>> + def tearDown(self):
>> + Base.tearDown(self)
>> +
>> + def _getTargetClass(self):
>> + from repoze.bfg.template import XSLTemplateFactory
>> + return XSLTemplateFactory
>> +
>> + def _makeOne(self, *arg, **kw):
>> + klass = self._getTargetClass()
>> + return klass(*arg, **kw)
>> +
>> + def test_instance_conforms_to_IView(self):
>> + from zope.interface.verify import verifyObject
>> + from repoze.bfg.interfaces import IView
>> + path = self._getTemplatePath('minimal.xsl')
>> + verifyObject(IView, self._makeOne(path))
>> +
>> + def test_class_conforms_to_IView(self):
>> + from zope.interface.verify import verifyClass
>> + from repoze.bfg.interfaces import IView
>> + verifyClass(IView, self._getTargetClass())
>> +
>> + def test_class_conforms_to_ITemplateFactory(self):
>> + from zope.interface.verify import verifyObject
>> + from repoze.bfg.interfaces import ITemplateFactory
>> + verifyObject(ITemplateFactory, self._getTargetClass())
>> +
>> + def test_call(self):
>> + self._zcmlConfigure()
>> + minimal = self._getTemplatePath('minimal.xsl')
>> + instance = self._makeOne(minimal)
>> + from lxml import etree
>> + info = etree.Element("info")
>> + result = instance(node=info)
>> + from webob import Response
>> + self.failUnless(isinstance(result, Response))
>> + resultstr = """<?xml version="1.0"?>\n<div/>\n"""
>> + self.assertEqual(result.app_iter, [resultstr])
>> + self.assertEqual(result.status, '200 OK')
>> + self.assertEqual(len(result.headerlist), 2)
>> +
>> +class RenderTemplateTests(unittest.TestCase, Base):
>> + def setUp(self):
>> + Base.setUp(self)
>> +
>> + def tearDown(self):
>> + Base.tearDown(self)
>> +
>> + def _getFUT(self):
>> + from repoze.bfg.template import render_transform
>> + return render_transform
>> +
>> + def test_nonabs_unregistered(self):
>> + self._zcmlConfigure()
>> + from zope.component import queryUtility
>> + from repoze.bfg.interfaces import IView
>> + minimal = self._getTemplatePath('minimal.xsl')
>> + self.assertEqual(queryUtility(IView, minimal), None)
>> + render = self._getFUT()
>> + from lxml import etree
>> + info = etree.Element("info")
>> + result = render(minimal, node=info)
>> + from webob import Response
>> + self.failUnless(isinstance(result, Response))
>> + resultstr = """<?xml version="1.0"?>\n<div/>\n"""
>> + self.assertEqual(result.app_iter, [resultstr])
>> + self.assertEqual(result.status, '200 OK')
>> + self.assertEqual(len(result.headerlist), 2)
>> + from repoze.bfg.template import XSLTemplateFactory
>> + self.failUnless(isinstance(queryUtility(IView, minimal),
>> + XSLTemplateFactory))
>> +
>> + def test_nonabs_registered(self):
>> + self._zcmlConfigure()
>> + from zope.component import getGlobalSiteManager
>> + from zope.component import queryUtility
>> + from repoze.bfg.template import XSLTemplateFactory
>> + from repoze.bfg.interfaces import IView
>> + minimal = self._getTemplatePath('minimal.xsl')
>> + utility = XSLTemplateFactory(minimal)
>> + gsm = getGlobalSiteManager()
>> + gsm.registerUtility(utility, IView, name=minimal)
>> + render = self._getFUT()
>> + from lxml import etree
>> + info = etree.Element("info")
>> + result = render(minimal, node=info)
>> + from webob import Response
>> + self.failUnless(isinstance(result, Response))
>> + resultstr = """<?xml version="1.0"?>\n<div/>\n"""
>> + self.assertEqual(result.app_iter, [resultstr])
>> + self.assertEqual(result.status, '200 OK')
>> + self.assertEqual(len(result.headerlist), 2)
>> + self.assertEqual(queryUtility(IView, minimal), utility)
>> + +class DummyView:
>> + context = 'context'
>> + request = 'request'
>> + _______________________________________________
>> Repoze-checkins mailing list
>> Repoze-checkins at lists.repoze.org
>> http://lists.repoze.org/listinfo/repoze-checkins
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.repoze.org/pipermail/repoze-checkins/attachments/20080716/0c9982c0/attachment-0001.htm
More information about the Repoze-checkins
mailing list