author Alexander Solovyov <piranha@piranha.org.ua>
Thu, 03 Sep 2009 22:06:14 +0300
changeset 81 c93635699e2a
parent 78 69c10074f5c5
child 82 074c1768759a
permissions -rwxr-xr-x
globaloptions were simply dropped after parsing, fold them in regular options

#!/usr/bin/env python

import sys

from opster import dispatch, command

@command(usage='[-t]', shortlist=True)
def simple(ui,
           test=('t', False, 'just test execution')):
    '''Just simple command to do nothing.

    I assure you! Nothing to look here. ;-)

cplx_opts = [('p', 'pass', False, 'don\'t run the command'),
             ('', 'exit', 0, 'exit with supplied code (default: 0)'),
             ('n', 'name', '', 'optional name')]

@command(cplx_opts, usage='[-p] [--exit value] ...', name='complex', hide=True)
def complex_(ui, *args, **opts):
    '''That's more complex command indented to do something

    Let's try to do that (what?!)
    if opts.get('pass'):
    # test ui
    if opts.get('exit'):

def ui_middleware(func):
    if func.__name__ == 'help_inner':
        return func
    def extract_dict(source, *keys):
        dest = {}
        for k in keys:
            dest[k] = source.pop(k, None)
        return dest

    def inner(*args, **kwargs):
        ui = UI(**extract_dict(kwargs, 'verbose', 'quiet'))
        return func(ui, *args, **kwargs)
    return inner

class UI(object):
    '''User interface helper.

    Intended to ease handling of quiet/verbose output and more.

    You have three methods to handle program messages output:

      - ``UI.info`` is printed by default, but hidden with quiet option
      - ``UI.note`` is printed only if output is verbose
      - ``UI.write`` is printed in any case

    Additionally there is ``UI.warn`` method, which prints to stderr.

    options = [('v', 'verbose', False, 'enable additional output'),
               ('q', 'quiet', False, 'suppress output')]

    def __init__(self, verbose=False, quiet=False):
        self.verbose = verbose
        # disabling quiet in favor of verbose is more safe
        self.quiet = (not verbose and quiet)

    def write(self, *messages):
        for m in messages:

    def warn(self, *messages):
        for m in messages:

    info = lambda self, *m: not self.quiet and self.write(*m)
    note = lambda self, *m: self.verbose and self.write(*m)

if __name__ == '__main__':
    dispatch(globaloptions=UI.options, middleware=ui_middleware)