[Checkins] SVN: z3c.pt/trunk/z3c/pt/pagetemplate.py Generate a signature on the template body and include as part of the storage key so we can somewhat cheaply switch template source at our leisure.

Malthe Borch mborch at gmail.com
Fri Jan 18 10:49:30 EST 2008


Log message for revision 82948:
  Generate a signature on the template body and include as part of the storage key so we can somewhat cheaply switch template source at our leisure.

Changed:
  U   z3c.pt/trunk/z3c/pt/pagetemplate.py

-=-
Modified: z3c.pt/trunk/z3c/pt/pagetemplate.py
===================================================================
--- z3c.pt/trunk/z3c/pt/pagetemplate.py	2008-01-18 13:19:38 UTC (rev 82947)
+++ z3c.pt/trunk/z3c/pt/pagetemplate.py	2008-01-18 15:49:30 UTC (rev 82948)
@@ -1,3 +1,4 @@
+import os
 import translation
 import codegen
 
@@ -2,13 +3,14 @@
 class PageTemplate(object):
+    registry = {}
+
     def __init__(self, body):
         self.body = body
-        self.init()
+        self.signature = hash(body)
         
-    def init(self):
-        self.registry = {}
-        
     def cook(self, params):
         source, _globals = translation.translate(self.body, params)
         suite = codegen.Suite(source)
 
+        self.source = source
+
         _locals = {}
@@ -20,7 +22,7 @@
         return _locals['render']
 
     def render(self, **kwargs):
-        signature = hash(",".join(kwargs.keys()))
+        signature = self.signature + hash(",".join(kwargs.keys()))
 
         template = self.registry.get(signature)
         if not template:
@@ -34,20 +36,39 @@
 class PageTemplateFile(PageTemplate):
     def __init__(self, filename):
         self.filename = filename
-
+        
     def get_filename(self):
         return getattr(self, '_filename', None)
 
     def set_filename(self, filename):
         self._filename = filename
-        self.init()
+        self._v_last_read = False
 
     filename = property(get_filename, set_filename)
-        
-    @property
-    def body(self):
-        return open(self.filename, 'r').read()
 
+    def render(self, **kwargs):
+        if self._cook_check():
+            self.body = open(self.filename, 'r').read()
+            self.signature = hash(self.body)
+            self._v_last_read = self.mtime()
+
+        return PageTemplate.render(self, **kwargs)
+            
+    def _cook_check(self):
+        if self._v_last_read and not __debug__:
+            return
+
+        if self.mtime() == self._v_last_read:
+            return
+
+        return True
+
+    def mtime(self):
+        try:
+            return os.path.getmtime(self.filename)
+        except OSError:
+            return 0
+
 class ViewPageTemplateFile(property):
     def __init__(self, filename):
         self.template = PageTemplateFile(filename)



More information about the Checkins mailing list