[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