mercurial/templater.py
changeset 37073 44757e6dad93
parent 37070 1101d6747d2d
child 37074 2891079fb0c0
--- a/mercurial/templater.py	Thu Mar 15 20:27:38 2018 +0900
+++ b/mercurial/templater.py	Thu Mar 15 20:43:39 2018 +0900
@@ -48,6 +48,7 @@
 
 from __future__ import absolute_import, print_function
 
+import abc
 import os
 
 from .i18n import _
@@ -556,6 +557,26 @@
         return s
     return s[1:-1]
 
+class resourcemapper(object):
+    """Mapper of internal template resources"""
+
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractmethod
+    def knownkeys(self):
+        """Return a set of supported resource keys"""
+
+    @abc.abstractmethod
+    def lookup(self, context, mapping, key):
+        """Return a resource for the key if available; otherwise None"""
+
+class nullresourcemapper(resourcemapper):
+    def knownkeys(self):
+        return set()
+
+    def lookup(self, context, mapping, key):
+        return None
+
 class engine(object):
     '''template expansion engine.
 
@@ -586,7 +607,7 @@
         if defaults is None:
             defaults = {}
         if resources is None:
-            resources = {}
+            resources = nullresourcemapper()
         self._defaults = defaults
         self._resources = resources
         self._aliasmap = _aliasrules.buildmap(aliases)
@@ -595,7 +616,7 @@
     def symbol(self, mapping, key):
         """Resolve symbol to value or function; None if nothing found"""
         v = None
-        if key not in self._resources:
+        if key not in self._resources.knownkeys():
             v = mapping.get(key)
         if v is None:
             v = self._defaults.get(key)
@@ -604,9 +625,7 @@
     def resource(self, mapping, key):
         """Return internal data (e.g. cache) used for keyword/function
         evaluation"""
-        v = None
-        if key in self._resources:
-            v = self._resources[key](self, mapping, key)
+        v = self._resources.lookup(self, mapping, key)
         if v is None:
             raise templateutil.ResourceUnavailable(
                 _('template resource not available: %s') % key)
@@ -717,7 +736,7 @@
         - ``filters``: a dict of functions to transform a value into another.
         - ``defaults``: a dict of symbol values/functions; may be overridden
           by a ``mapping`` dict.
-        - ``resources``: a dict of functions returning internal data
+        - ``resources``: a resourcemapper object to look up internal data
           (e.g. cache), inaccessible from user template.
         - ``cache``: a dict of preloaded template fragments.
         - ``aliases``: a list of alias (name, replacement) pairs.
@@ -729,8 +748,6 @@
             filters = {}
         if defaults is None:
             defaults = {}
-        if resources is None:
-            resources = {}
         if cache is None:
             cache = {}
         self.cache = cache.copy()