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
--- 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)
--- 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: