# HG changeset patch # User Yuya Nishihara # Date 1452919357 -32400 # Node ID ac8c0ee5c3b8c96c4054cbb7b83abfb110b51e6a # Parent ce76c4d2b85c6a9f8b02d614cd60ba0a5d505b48 templater: make _hybrid not callable to avoid conflicting semantics In templater, a callable symbol exists for lazy evaluation, which should have f(**mapping) signature. On the other hand, _hybrid.__call__(), which was introduced by 0b241d7a8c62, generates mapping for each element. This patch renames _hybrid.__call__() to _hybrid.itermaps() so that a _hybrid object can be a value of a mapping dict. {namespaces % "{namespace}: {names % "{name }"}\n"} ~~~~~ a _hybrid object diff -r ce76c4d2b85c -r ac8c0ee5c3b8 mercurial/templatekw.py --- a/mercurial/templatekw.py Fri Jan 15 13:46:33 2016 -0800 +++ b/mercurial/templatekw.py Sat Jan 16 13:42:37 2016 +0900 @@ -34,7 +34,7 @@ self.joinfmt = lambda x: x.values()[0] def __iter__(self): return self.gen - def __call__(self): + def itermaps(self): makemap = self._makemap for x in self.values: yield makemap(x) diff -r ce76c4d2b85c -r ac8c0ee5c3b8 mercurial/templater.py --- a/mercurial/templater.py Fri Jan 15 13:46:33 2016 -0800 +++ b/mercurial/templater.py Sat Jan 16 13:42:37 2016 +0900 @@ -281,8 +281,8 @@ def runmap(context, mapping, data): func, data, ctmpl = data d = func(context, mapping, data) - if callable(d): - d = d() + if util.safehasattr(d, 'itermaps'): + d = d.itermaps() lm = mapping.copy() @@ -483,9 +483,9 @@ raise error.ParseError(_("join expects one or two arguments")) joinset = args[0][0](context, mapping, args[0][1]) - if callable(joinset): + if util.safehasattr(joinset, 'itermaps'): jf = joinset.joinfmt - joinset = [jf(x) for x in joinset()] + joinset = [jf(x) for x in joinset.itermaps()] joiner = " " if len(args) > 1: