Mercurial > public > mercurial-scm > hg-stable
diff mercurial/templater.py @ 37076:44757e6dad93
templater: introduce resourcemapper class
A couple more functions will be added later to work around nested mapping
bugs such as the issue 5612.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Thu, 15 Mar 2018 20:43:39 +0900 |
parents | 1101d6747d2d |
children | 2891079fb0c0 |
line wrap: on
line diff
--- 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()