[Checkins] SVN: grok/trunk/src/grok/ support reloading file-system
based templates by using PageTemplateFile (which
Philipp von Weitershausen
philikon at philikon.de
Wed Jan 10 13:18:24 EST 2007
Log message for revision 71887:
support reloading file-system based templates by using PageTemplateFile (which
remembers the file's time stamp and re-reads the data when necessary).
Changed:
U grok/trunk/src/grok/__init__.py
U grok/trunk/src/grok/components.py
U grok/trunk/src/grok/templatereg.py
A grok/trunk/src/grok/tests/view/templatereload.py
A grok/trunk/src/grok/tests/view/templatereload_templates/
A grok/trunk/src/grok/tests/view/templatereload_templates/index.pt
-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py 2007-01-10 18:00:46 UTC (rev 71886)
+++ grok/trunk/src/grok/__init__.py 2007-01-10 18:18:23 UTC (rev 71887)
@@ -31,7 +31,7 @@
from grok.components import ClassGrokker, InstanceGrokker, ModuleGrokker
from grok.components import Model, Adapter, MultiAdapter, View, XMLRPC
-from grok.components import PageTemplate, Container, Traverser
+from grok.components import PageTemplate, PageTemplateFile, Container, Traverser
from grok.components import Site, GlobalUtility, LocalUtility
from grok.components import EditForm, DisplayForm, AddForm
from grok.directive import (context, name, template, templatedir, provides,
Modified: grok/trunk/src/grok/components.py
===================================================================
--- grok/trunk/src/grok/components.py 2007-01-10 18:00:46 UTC (rev 71886)
+++ grok/trunk/src/grok/components.py 2007-01-10 18:18:23 UTC (rev 71887)
@@ -26,7 +26,7 @@
from zope.publisher.interfaces import NotFound
from zope.publisher.interfaces.browser import (IBrowserPublisher,
IBrowserRequest)
-from zope.pagetemplate import pagetemplate
+from zope.pagetemplate import pagetemplate, pagetemplatefile
from zope.formlib import form
from zope.formlib.namedtemplate import INamedTemplate
from zope.traversing.browser.interfaces import IAbsoluteURL
@@ -228,6 +228,27 @@
self.__grok_location__ = location
+class PageTemplateFile(TrustedAppPT, pagetemplatefile.PageTemplateFile):
+
+ def __init__(self, filename, _prefix=None):
+ _prefix = self.get_path_from_prefix(_prefix)
+ super(PageTemplateFile, self).__init__(filename, _prefix)
+
+ # __grok_module__ is needed to make defined_locally() return True for
+ # inline templates
+ # XXX unfortunately using caller_module means that
+ # PageTemplateFile cannot be subclassed
+ self.__grok_module__ = util.caller_module()
+
+ def __repr__(self):
+ return '<%s template in %s>' % (self.__grok_name__,
+ self.__grok_location__)
+
+ def _annotateGrokInfo(self, name, location):
+ self.__grok_name__ = name
+ self.__grok_location__ = location
+
+
class DirectoryResource(directoryresource.DirectoryResource):
# We subclass this, because we want to override the default factories for
# the resources so that .pt and .html do not get created as page
Modified: grok/trunk/src/grok/templatereg.py
===================================================================
--- grok/trunk/src/grok/templatereg.py 2007-01-10 18:00:46 UTC (rev 71886)
+++ grok/trunk/src/grok/templatereg.py 2007-01-10 18:18:23 UTC (rev 71887)
@@ -28,8 +28,7 @@
def findFilesystem(self, module_info):
template_dir_name = module_info.getAnnotation(
- 'grok.templatedir',
- module_info.name + '_templates')
+ 'grok.templatedir', module_info.name + '_templates')
template_dir = module_info.getResourcePath(template_dir_name)
@@ -46,13 +45,8 @@
module_info.getModule())
template_name = template_file[:-3] # cut off .pt
+ template = grok.PageTemplateFile(template_file, template_dir)
template_path = os.path.join(template_dir, template_file)
-
- f = open(template_path, 'rb')
- contents = f.read()
- f.close()
-
- template = grok.PageTemplate(contents)
template._annotateGrokInfo(template_name, template_path)
inline_template = self.get(template_name)
Added: grok/trunk/src/grok/tests/view/templatereload.py
===================================================================
--- grok/trunk/src/grok/tests/view/templatereload.py 2007-01-10 18:00:46 UTC (rev 71886)
+++ grok/trunk/src/grok/tests/view/templatereload.py 2007-01-10 18:18:23 UTC (rev 71887)
@@ -0,0 +1,36 @@
+"""
+Filesystem-based templates, once grokked, can be changed. The change
+will automatically be picked up, reloading Zope is not necessary.
+
+ >>> grok.grok(__name__)
+ >>> from zope.component import getMultiAdapter
+ >>> from zope.publisher.browser import TestRequest
+ >>> request = TestRequest()
+ >>> view = getMultiAdapter((Mammoth(), request), name='index')
+ >>> print view()
+ before
+
+Now we change the file:
+
+ >>> import os.path
+ >>> here = os.path.dirname(__file__)
+ >>> template_file = os.path.join(here, 'templatereload_templates', 'index.pt')
+ >>> template = open(template_file, 'w')
+ >>> template.write('after')
+ >>> template.close()
+
+and find that the output of the view has changed as well:
+
+ >>> print view()
+ after
+
+At last, we should change everything back to normal:
+
+ >>> template = open(template_file, 'w')
+ >>> template.write('before')
+ >>> template.close()
+"""
+import grok
+
+class Mammoth(grok.Model):
+ pass
Property changes on: grok/trunk/src/grok/tests/view/templatereload.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: grok/trunk/src/grok/tests/view/templatereload_templates/index.pt
===================================================================
--- grok/trunk/src/grok/tests/view/templatereload_templates/index.pt 2007-01-10 18:00:46 UTC (rev 71886)
+++ grok/trunk/src/grok/tests/view/templatereload_templates/index.pt 2007-01-10 18:18:23 UTC (rev 71887)
@@ -0,0 +1 @@
+before
\ No newline at end of file
Property changes on: grok/trunk/src/grok/tests/view/templatereload_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the Checkins
mailing list