mercurial/templateutil.py
changeset 38242 12b6ee9e88f3
parent 38241 ad06a4264daf
child 38243 06d11cd90516
equal deleted inserted replaced
38241:ad06a4264daf 38242: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: