comparison mercurial/templateutil.py @ 38254:12b6ee9e88f3

templater: move getdictitem() to hybrid class Since a raw dict will never be returned by evalwrapped(), we don't need to support d.get(key).
author Yuya Nishihara <yuya@tcha.org>
date Wed, 21 Mar 2018 01:39:44 +0900
parents ad06a4264daf
children 06d11cd90516
comparison
equal deleted inserted replaced
38253:ad06a4264daf 38254:12b6ee9e88f3
125 self._gen = gen # generator or function returning generator 125 self._gen = gen # generator or function returning generator
126 self._values = values 126 self._values = values
127 self._makemap = makemap 127 self._makemap = makemap
128 self._joinfmt = joinfmt 128 self._joinfmt = joinfmt
129 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved 129 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved
130
131 def getmember(self, context, mapping, key):
132 # TODO: maybe split hybrid list/dict types?
133 if not util.safehasattr(self._values, 'get'):
134 raise error.ParseError(_('not a dictionary'))
135 return self._wrapvalue(key, self._values.get(key))
136
137 def _wrapvalue(self, key, val):
138 if val is None:
139 return
140 return wraphybridvalue(self, key, val)
130 141
131 def itermaps(self, context): 142 def itermaps(self, context):
132 makemap = self._makemap 143 makemap = self._makemap
133 for x in self._values: 144 for x in self._values:
134 yield makemap(x) 145 yield makemap(x)
665 d = evalwrapped(context, mapping, darg) 676 d = evalwrapped(context, mapping, darg)
666 if util.safehasattr(d, 'tomap'): 677 if util.safehasattr(d, 'tomap'):
667 lm = context.overlaymap(mapping, d.tomap()) 678 lm = context.overlaymap(mapping, d.tomap())
668 return runsymbol(context, lm, memb) 679 return runsymbol(context, lm, memb)
669 try: 680 try:
670 if util.safehasattr(d, 'get'): 681 if util.safehasattr(d, 'getmember'):
671 return getdictitem(d, memb) 682 return d.getmember(context, mapping, memb)
672 raise error.ParseError 683 raise error.ParseError
673 except error.ParseError: 684 except error.ParseError:
674 sym = findsymbolicname(darg) 685 sym = findsymbolicname(darg)
675 if sym: 686 if sym:
676 raise error.ParseError(_("keyword '%s' has no member") % sym) 687 raise error.ParseError(_("keyword '%s' has no member") % sym)
691 try: 702 try:
692 return func(left, right) 703 return func(left, right)
693 except ZeroDivisionError: 704 except ZeroDivisionError:
694 raise error.Abort(_('division by zero is not defined')) 705 raise error.Abort(_('division by zero is not defined'))
695 706
696 def getdictitem(dictarg, key):
697 val = dictarg.get(key)
698 if val is None:
699 return
700 return wraphybridvalue(dictarg, key, val)
701
702 def joinitems(itemiter, sep): 707 def joinitems(itemiter, sep):
703 """Join items with the separator; Returns generator of bytes""" 708 """Join items with the separator; Returns generator of bytes"""
704 first = True 709 first = True
705 for x in itemiter: 710 for x in itemiter:
706 if first: 711 if first: