[PATCH 1 of 5] templatekw: use decorator to mark a function as template keyword

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Sat Dec 26 05:23:52 CST 2015


At Thu, 24 Dec 2015 21:54:17 +0900,
Yuya Nishihara wrote:
> 
> On Thu, 24 Dec 2015 01:46:37 +0900, FUJIWARA Katsunori wrote:
> > # HG changeset patch
> > # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> > # Date 1450888882 -32400
> > #      Thu Dec 24 01:41:22 2015 +0900
> > # Node ID e49528b9e652dc0e5d2543ea34de3068f78ae9ed
> > # Parent  fe376159a58d9b3d748b669ac011b0eed0346fea
> > templatekw: use decorator to mark a function as template keyword
> 
> > + at templatekw.templatekeyword('svnrev')
> >  def kwsvnrev(repo, ctx, **args):
> > -    """:svnrev: String. Converted subversion revision number."""
> > +    """String. Converted subversion revision number."""
> >      return kwconverted(ctx, 'svnrev')
> >  
> > + at templatekw.templatekeyword('svnpath')
> >  def kwsvnpath(repo, ctx, **args):
> > -    """:svnpath: String. Converted subversion revision project path."""
> > +    """String. Converted subversion revision project path."""
> >      return kwconverted(ctx, 'svnpath')
> >  
> > + at templatekw.templatekeyword('svnuuid')
> >  def kwsvnuuid(repo, ctx, **args):
> > -    """:svnuuid: String. Converted subversion revision repository identifier."""
> > +    """String. Converted subversion revision repository identifier."""
> >      return kwconverted(ctx, 'svnuuid')
> >  
> > -def extsetup(ui):
> > -    templatekw.keywords['svnrev'] = kwsvnrev
> > -    templatekw.keywords['svnpath'] = kwsvnpath
> > -    templatekw.keywords['svnuuid'] = kwsvnuuid
> 
> Extensions shouldn't change the keywords table just by importing. It should be
> delayed until uisetup() or extsetup().

In fact, once I wrote decorators delaying registration until uisetup()
or extsetup() in 'cmdutil.command' style.

But I discarded them, because (1) 'cmdutil.command' style isn't
reasonable to hide internal implementation (like
_statuscallers/_existingcallers of fileset or safesymbols of revset)
and (2) convert extension adds template filters in module top level
code path :-)

I'll post revised ones.

> > +keywords = {}
> >  
> > +def templatekeyword(name):
> > +    """Return a decorator for template keyword function
> > +
> > +    'name' argument is the keyword name.
> > +    """
> > +    def decorator(func):
> > +        keywords[name] = func
> > +        if func.__doc__:
> > +            func.__doc__ = ":%s: %s" % (name, func.__doc__.strip())
> > +        return func
> > +    return decorator
> 
> Perhaps, we'll need a decorator that can handle common cases? And the hgweb
> will eventually use it.
> 

OK, I'll try to define generic decorator to centralize similar logic
into it.

----------------------------------------------------------------------
[FUJIWARA Katsunori]                             foozy at lares.dti.ne.jp


More information about the Mercurial-devel mailing list