[PATCH 7 of 7] hgweb: convert _siblings to a factory function of mappinggenerator

Yuya Nishihara yuya at tcha.org
Sun Apr 15 09:20:13 EDT 2018


On Sun, 15 Apr 2018 14:06:03 +0800, Anton Shestakov wrote:
> On Sat, 14 Apr 2018 21:49:17 +0900
> Yuya Nishihara <yuya at tcha.org> wrote:
> 
> > -class _siblings(object):
> > -    def __init__(self, siblings=None, hiderev=None):
> > -        if siblings is None:
> > -            siblings = []
> > -        self.siblings = [s for s in siblings if s.node() != nullid]
> > -        if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
> > -            self.siblings = []
> > -
> > -    def __iter__(self):
> > -        return _ctxsgen(self.siblings)
> > -
> > -    def __len__(self):
> > -        return len(self.siblings)
> > +def _siblings(siblings=None, hiderev=None):
> > +    if siblings is None:
> > +        siblings = []
> > +    siblings = [s for s in siblings if s.node() != nullid]
> > +    if len(siblings) == 1 and siblings[0].rev() == hiderev:
> > +        siblings = []
> > +    return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))
> 
> One thing that this patch makes difficult to understand is how you can't
> now say len(parents):
> 
>   TypeError: object of type 'mappinggenerator' has no len()
> 
> ... but "{count(parents)}" in the templates works as expected, even
> though count template filter simply does len(i).

Filter functions receive an inner value, in which case, it is a list of dicts.

Basically I threw away the idea behind the hybrid class, which is to provide
all required behaviors by a single object as if it were a plain Python object.
It didn't work. Instead, a wrapped class can be considered a container like
Maybe type. It returns some meaningful values depending on what is expected by
caller.


More information about the Mercurial-devel mailing list