[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