[Checkins] SVN: grok/branches/regebro-guido-templates/src/grok/ Template types can now be registered.

Lennart Regebro regebro at gmail.com
Tue Oct 2 07:38:24 EDT 2007


Log message for revision 80472:
  Template types can now be registered.
  

Changed:
  U   grok/branches/regebro-guido-templates/src/grok/_grok.py
  U   grok/branches/regebro-guido-templates/src/grok/components.py
  U   grok/branches/regebro-guido-templates/src/grok/interfaces.py
  U   grok/branches/regebro-guido-templates/src/grok/templatereg.py
  U   grok/branches/regebro-guido-templates/src/grok/tests/view/dirandinlinetemplate.py

-=-
Modified: grok/branches/regebro-guido-templates/src/grok/_grok.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/_grok.py	2007-10-02 11:37:39 UTC (rev 80471)
+++ grok/branches/regebro-guido-templates/src/grok/_grok.py	2007-10-02 11:38:24 UTC (rev 80472)
@@ -31,7 +31,7 @@
 
 import grok
 
-from grok import components, meta
+from grok import components, meta, templatereg
 from grok import templatereg
 
 _bootstrapped = False
@@ -53,6 +53,7 @@
 
     # now grok the grokkers
     martian.grok_module(scan.module_info_from_module(meta), the_module_grokker)
+    martian.grok_module(scan.module_info_from_module(templatereg), the_module_grokker)
 
 def addSiteHandler(site, event):
     sitemanager = LocalSiteManager(site)

Modified: grok/branches/regebro-guido-templates/src/grok/components.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/components.py	2007-10-02 11:37:39 UTC (rev 80471)
+++ grok/branches/regebro-guido-templates/src/grok/components.py	2007-10-02 11:38:24 UTC (rev 80472)
@@ -216,6 +216,8 @@
 
 class PageTemplateFile(GrokPageTemplate, TrustedAppPT,
                        pagetemplatefile.PageTemplateFile):
+    
+    interface.implements(interfaces.ITemplateFile)
 
     def __init__(self, filename, _prefix=None):
         _prefix = self.get_path_from_prefix(_prefix)
@@ -226,8 +228,8 @@
         # XXX unfortunately using caller_module means that
         # PageTemplateFile cannot be subclassed
         self.__grok_module__ = martian.util.caller_module()
+    
 
-
 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/branches/regebro-guido-templates/src/grok/interfaces.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/interfaces.py	2007-10-02 11:37:39 UTC (rev 80471)
+++ grok/branches/regebro-guido-templates/src/grok/interfaces.py	2007-10-02 11:38:24 UTC (rev 80472)
@@ -429,3 +429,20 @@
         Use name for index name and attribute to index. Set up
         index for interface or class context.
         """
+
+class ITemplateFactory(interface.Interface):
+    """Utility that generated templates. One per template type/extension"""
+    
+    def __call__(self, filename, _prefix=None):
+        """Creates an ITemplateFile
+        
+        _prefix is the directory the file is located in
+        """
+
+class ITemplateFile(interface.Interface):
+    """Template objects created from files
+    """
+    
+    def __call__(self, args, request):
+        """Renders the template. Args is a tuple of arguments."""
+        
\ No newline at end of file

Modified: grok/branches/regebro-guido-templates/src/grok/templatereg.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/templatereg.py	2007-10-02 11:37:39 UTC (rev 80471)
+++ grok/branches/regebro-guido-templates/src/grok/templatereg.py	2007-10-02 11:38:24 UTC (rev 80472)
@@ -1,6 +1,7 @@
 from martian.error import GrokError
 
 import os
+import zope.component
 import grok
 import warnings
 
@@ -34,7 +35,16 @@
             if template_file.startswith('.') or template_file.endswith('~'):
                 continue
 
-            if not template_file.endswith('.pt'):
+            #import pdb
+            #pdb.set_trace()
+
+            template_name, extension = os.path.splitext(template_file)
+            extension = extension[1:] # Get rid of the leading dot.
+            template_factory = zope.component.queryUtility(
+                grok.interfaces.ITemplateFactory,
+                name=extension)
+                
+            if template_factory is None:
                 # Warning when importing files. This should be
                 # allowed because people may be using editors that generate
                 # '.bak' files and such.
@@ -43,21 +53,33 @@
                               (template_file, template_dir), UserWarning, 2)
                 continue
 
-            template_name = template_file[:-3] # cut off .pt
-            template = grok.PageTemplateFile(template_file, template_dir)
-            template_path = os.path.join(template_dir, template_file)
-            template._annotateGrokInfo(template_name, template_path)
-
             inline_template = self.get(template_name)
             if inline_template:
                 raise GrokError("Conflicting templates found for name '%s' "
-                                "in module %r, both inline and in template "
-                                "directory '%s'."
+                                "in module %r, either inline and in template "
+                                "directory '%s', or two templates with the "
+                                "same name and different extensions."
                                 % (template_name, module_info.getModule(),
                                    template_dir), inline_template)
+
+            template = template_factory(template_file, template_dir)
+            template_path = os.path.join(template_dir, template_file)
+            template._annotateGrokInfo(template_name, template_path)
+
             self.register(template_name, template)
 
     def listUnassociated(self):
         for name, entry in self._reg.iteritems():
             if not entry['associated']:
                 yield name
+
+
+class PageTemplateFileFactory(grok.GlobalUtility):
+    
+    grok.implements(grok.interfaces.ITemplateFactory)
+    grok.name('pt')
+    
+    
+    def __call__(self, filename, _prefix=None):
+        return grok.components.PageTemplateFile(filename, _prefix)
+    
\ No newline at end of file

Modified: grok/branches/regebro-guido-templates/src/grok/tests/view/dirandinlinetemplate.py
===================================================================
--- grok/branches/regebro-guido-templates/src/grok/tests/view/dirandinlinetemplate.py	2007-10-02 11:37:39 UTC (rev 80471)
+++ grok/branches/regebro-guido-templates/src/grok/tests/view/dirandinlinetemplate.py	2007-10-02 11:38:24 UTC (rev 80472)
@@ -5,9 +5,7 @@
   >>> grok.grok(__name__)
   Traceback (most recent call last):
     ...
-  GrokError: Conflicting templates found for name 'cavepainting' in module
-  <module 'grok.tests.view.dirandinlinetemplate' from '...'>,
-  both inline and in template directory '...dirandinlinetemplate_templates'.
+  GrokError: Conflicting templates found ...
 
 """
 import grok



More information about the Checkins mailing list