]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Make template.Loader and DictLoader share a common base class
authorBen Darnell <ben@bendarnell.com>
Mon, 30 May 2011 21:07:10 +0000 (14:07 -0700)
committerBen Darnell <ben@bendarnell.com>
Mon, 30 May 2011 21:07:10 +0000 (14:07 -0700)
tornado/template.py
tornado/test/template_test.py

index d3b3861261e92515bfff37501934462985126b5a..06c10ce30b3bb76203514440203f3eb897565d09 100644 (file)
@@ -163,13 +163,7 @@ class Template(object):
         return ancestors
 
 
-class Loader(object):
-    """A template loader that loads from a single root directory.
-
-    You must use a template loader to use template constructs like
-    {% extends %} and {% include %}. Loader caches all templates after
-    they are loaded the first time.
-    """
+class BaseLoader(object):
     def __init__(self, root_directory):
         self.root = os.path.abspath(root_directory)
         self.templates = {}
@@ -191,27 +185,35 @@ class Loader(object):
     def load(self, name, parent_path=None):
         name = self.resolve_path(name, parent_path=parent_path)
         if name not in self.templates:
-            path = os.path.join(self.root, name)
-            f = open(path, "r")
-            self.templates[name] = Template(f.read(), name=name, loader=self)
-            f.close()
+            self.templates[name] = self._create_template(name)
         return self.templates[name]
 
+    def _create_template(self, name):
+        raise NotImplementedError()
+
+class Loader(BaseLoader):
+    """A template loader that loads from a single root directory.
+
+    You must use a template loader to use template constructs like
+    {% extends %} and {% include %}. Loader caches all templates after
+    they are loaded the first time.
+    """
+    def _create_template(self, name):
+        path = os.path.join(self.root, name)
+        f = open(path, "r")
+        template = Template(f.read(), name=name, loader=self)
+        f.close()
+        return template
+
 
-class DictLoader(object):
+class DictLoader(BaseLoader):
     """A template loader that loads from a dictionary."""
     def __init__(self, dict):
+        super(DictLoader, self).__init__("")
         self.dict = dict
-        self.templates = {}
 
-    def reset(self):
-        self.templates = {}
-
-    def load(self, name, parent_path=None):
-        if name not in self.templates:
-            self.templates[name] = Template(self.dict[name], name=name,
-                                            loader=self)
-        return self.templates[name]
+    def _create_template(self, name):
+        return Template(self.dict[name], name=name, loader=self)
 
 
 class _Node(object):
index 120c73ba018255536a331cf25189dfd3de643248..893711acfe9974786110f33519d29abb39f236b8 100644 (file)
@@ -40,3 +40,12 @@ class TemplateTest(LogTrapTestCase):
                 })
         self.assertEqual(loader.load("page.html").generate(),
                          b("<title>page title</title>\n<body>page body</body>\n"))
+
+    def test_relative_load(self):
+        loader = DictLoader({
+                "a/1.html": "{% include '2.html' %}",
+                "a/2.html": "{% include '../b/3.html' %}",
+                "b/3.html": "ok",
+                })
+        self.assertEqual(loader.load("a/1.html").generate(),
+                         b("ok"))