[Checkins] SVN: z3c.pt/trunk/ Optimized template loader.

Malthe Borch mborch at gmail.com
Wed Sep 10 15:35:54 EDT 2008


Log message for revision 91038:
  Optimized template loader.

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/src/z3c/pt/loader.py
  U   z3c.pt/trunk/src/z3c/pt/tests/test_loader.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-09-10 19:16:29 UTC (rev 91037)
+++ z3c.pt/trunk/CHANGES.txt	2008-09-10 19:35:53 UTC (rev 91038)
@@ -20,6 +20,9 @@
 
   Features
 
+- Optimized template loader so only a single template is instantiated
+  per file. [malthe]
+  
 - Made ``z3c.pt`` a namespace package. [malthe]
   
 - Added reduce and restore operation to the compilation and rendering

Modified: z3c.pt/trunk/src/z3c/pt/loader.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/loader.py	2008-09-10 19:16:29 UTC (rev 91037)
+++ z3c.pt/trunk/src/z3c/pt/loader.py	2008-09-10 19:35:53 UTC (rev 91038)
@@ -3,9 +3,19 @@
 from z3c.pt.pagetemplate import PageTemplateFile
 from z3c.pt.texttemplate import TextTemplateFile
 
+def cache(func):
+    def load(self, *args):
+        template = self.registry.get(args)
+        if template is None:
+            self.registry[args] = template = func(self, *args)
+        return template
+    return load
+    
 class TemplateLoader(object):
-    """Template loader tool.
-    """
+    """Template loader tool. To load templates using relative
+    filenames, pass a sequence of paths (or a single path) as
+    ``search_path``; if ``auto_reload`` is set, templates will be
+    reloaded when modified."""
 
     def __init__(self, search_path=None, auto_reload=False, parser=None):
         if search_path is None:
@@ -15,7 +25,9 @@
         self.search_path = search_path
         self.auto_reload = auto_reload
         self.parser = parser
+        self.registry = {}
 
+    @cache
     def _load(self, filename, klass):
         if os.path.isabs(filename):
             return klass(filename, self.parser)

Modified: z3c.pt/trunk/src/z3c/pt/tests/test_loader.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/tests/test_loader.py	2008-09-10 19:16:29 UTC (rev 91037)
+++ z3c.pt/trunk/src/z3c/pt/tests/test_loader.py	2008-09-10 19:35:53 UTC (rev 91038)
@@ -17,6 +17,14 @@
         result = self._load(loader, 'view.pt')
         self.assertEqual(result.filename, os.path.join(here, 'view.pt'))
 
+    def test_consecutive_loads(self):
+        import os
+        here = os.path.dirname(__file__)
+        loader = self._makeOne(search_path = [here])
+        
+        self.assertTrue(
+            self._load(loader, 'view.pt') is self._load(loader, 'view.pt'))
+
     def test_load_relative_badpath_in_searchpath(self):
         import os
         here = os.path.dirname(__file__)



More information about the Checkins mailing list