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

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Sun Dec 27 00:25:53 CST 2015


At Sat, 26 Dec 2015 10:47:54 -0700,
Gregory Szorc wrote:
> 
> 
> 
> > On Dec 26, 2015, at 04:23, FUJIWARA Katsunori <foozy at lares.dti.ne.jp> wrote:
> > 
> > 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.
> 
> Relatedly, cmdutil and commands have a cycle-like issue that is
> making it difficult to convert to absolute import. I've been
> contemplating the idea of adding registrar.py or similar to hold
> registrations for commands, templates, revsets, etc.
> 

I'm just worried about where utilities should be placed to avoid
cyclic importing, too !

'registrar.py' seems reasonable (at least) for me.

> > 
> > 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
> > _______________________________________________
> > Mercurial-devel mailing list
> > Mercurial-devel at selenic.com
> > https://selenic.com/mailman/listinfo/mercurial-devel
> 

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


More information about the Mercurial-devel mailing list