Пример #1
0
def automain(argv=None, verbose=False, breakin=False, ultraTB=False, pdb=False,
             timemsg=False, available=None, mod=None, main_only=False):
    """
    Automatically create a very simple command-line interface.

    Note: All functions must take string arguments
    """

    if not mod:
        import __main__ as mod
    argv = argv or sys.argv

    try:
        if breakin:
            from debug import breakin
            breakin.enable()

        if ultraTB:
            from debug import ultraTB2
            ultraTB2.enable(include_vars=False)

        if pdb:
            from debug.utils import enable_debug_hook
            enable_debug_hook()

        if timemsg:
            from humanreadable import print_elapsed_time
            print_elapsed_time()

    except ImportError:
        pass


    if available:
        filterfn = None
    else:
        def filterfn(obj):
            try:
                if not obj.__module__ == '__main__' and main_only:
                    return False
                if not hasattr(obj, '__call__'):
                    return False
            except AttributeError:
                return False
            else:
                name = obj.__name__
                return name not in ('automain', 'usage', 'call_signature') and not name.startswith('_')
        available = dir(mod)
    objects = [getattr(mod, x) if isinstance(x, basestring) else x for x in available]
    objects = list(sorted(filter(filterfn, objects), key=lambda x: x.__name__))


    # should we print the module's docstring in the help?
    def show_help(objects):
        print
        for obj in objects:
            print usage(obj)
            print

    try:
        action = getattr(mod, argv[1])
        assert hasattr(action, '__call__')
    except (IndexError, AttributeError, AssertionError):
        show_help(objects)
    else:
        args = list(argv[2:])

        parser = OptionParser()
        #parser.allow_interspersed_args = False
        spec = getargspec(action)

        if spec.defaults:
            for default, arg in zip(reversed(spec.defaults), reversed(spec.args)):  # args with default values
                longname = '--' + arg
                #if isinstance(default, bool):   # XXX: this not the right semantics.
                #    if default == False:
                #        parser.add_option(longname, action="store_true", default=False)
                #    else:
                #        parser.add_option(longname, action="store_false", default=True)
                #else:
                parser.add_option(longname, default=default)

        parser.usage = '%s [options] %s' % (action.__name__, ' '.join(spec.args)) \
            + '\n\n    ' + getdoc(action)

        (kw, args) = parser.parse_args(args)

        # TODO: need a better usage message which shows positional arguments

        # minimum non-keyword args
        if len(args) < len(spec.args) - len(spec.defaults or []):
            parser.print_help()
            return

        kw = kw.__dict__

        # call function
        out = action(*args, **kw)

        # pretty-print result
        if isinstance(out, basestring):
            print out

        elif isinstance(out, dict):
            if isinstance(out, defaultdict):
                out = dict(out)
            pprint(out)

        else:
            try:
                out = iter(out)
            except TypeError:
                if out is not None:
                    print out
            else:
                for x in out:
                    print x
Пример #2
0
parser.add_option('-a', '--automain', action="store_true", default=False)
parser.add_option('--less-verbose', action="store_true", default=False)

# split the argument list at the first item ending with .py
source = [(i + 1, f) for i, f in enumerate(sys.argv[1:]) if f.endswith('.py')]

devargs = sys.argv[:source[0][0]]
scriptargs = sys.argv[source[0][0]:]

#print 'devargs:', devargs
#print 'scriptargs:',  scriptargs

(opts, args) = parser.parse_args(devargs)

if opts.less_verbose:
    ultraTB2.enable(include_vars=False)
else:
    ultraTB2.enable()

# hack sys.argv so that it no longer contains this script's options
sys.argv = scriptargs

if opts.coverage:
    from coverage import coverage
    cov = coverage(data_suffix=True, branch=True)
    cov.start()

if opts.doctest or opts.verbose_doctest or opts.doctest_for is not None:
    import doctest, atexit
    if opts.doctest_for is not None:  # XXX: not sure how useful this is
        print 'running doctest for %s only' % opts.doctest_for
Пример #3
0
parser.add_option('-a','--automain', action="store_true", default=False)
parser.add_option('--less-verbose', action="store_true", default=False)

# split the argument list at the first item ending with .py
source = [(i+1,f) for i, f in enumerate(sys.argv[1:]) if f.endswith('.py')]

devargs = sys.argv[:source[0][0]]
scriptargs = sys.argv[source[0][0]:]

#print 'devargs:', devargs
#print 'scriptargs:',  scriptargs

(opts, args) = parser.parse_args(devargs)

if opts.less_verbose:
    ultraTB2.enable(include_vars=False)
else:
    ultraTB2.enable()

# hack sys.argv so that it no longer contains this script's options
sys.argv = scriptargs

if opts.coverage:
    from coverage import coverage
    cov = coverage(data_suffix=True, branch=True)
    cov.start()

if opts.doctest or opts.verbose_doctest or opts.doctest_for is not None:
    import doctest, atexit
    if opts.doctest_for is not None:   # XXX: not sure how useful this is
        print 'running doctest for %s only' % opts.doctest_for
Пример #4
0
def automain(argv=None,
             verbose=False,
             breakin=False,
             ultraTB=False,
             pdb=False,
             timemsg=False,
             available=None):
    """
    Automatically create a very simple command-line interface.

    Note: All functions must take string arguments
    """
    import __main__ as mod
    argv = argv or sys.argv

    try:
        if breakin:
            from debug import breakin
            breakin.enable()

        if ultraTB:
            from debug import ultraTB2
            ultraTB2.enable(include_vars=False)

        if pdb:
            from debug.utils import enable_debug_hook
            enable_debug_hook()

        if timemsg:
            from humanreadable import print_elapsed_time
            print_elapsed_time()

    except ImportError:
        pass

    if available:
        filterfn = None
    else:

        def filterfn(obj):
            try:
                if not obj.__module__ == '__main__':
                    return False
                if not hasattr(obj, '__call__'):
                    return False
            except AttributeError:
                return False
            else:
                name = obj.__name__
                return name not in ('automain', 'usage', 'call_signature'
                                    ) and not name.startswith('_')

        available = dir(mod)
    objects = [
        getattr(mod, x) if isinstance(x, basestring) else x for x in available
    ]
    objects = list(sorted(filter(filterfn, objects), key=lambda x: x.__name__))

    # should we print the module's docstring in the help?
    def show_help(objects):
        print
        for obj in objects:
            print usage(obj)
            print

    try:
        action = getattr(mod, argv[1])
        assert hasattr(action, '__call__')
    except (IndexError, AttributeError, AssertionError):
        show_help(objects)
    else:
        args = list(argv[2:])

        parser = OptionParser()
        #parser.allow_interspersed_args = False
        spec = getargspec(action)

        if spec.defaults:
            for default, arg in zip(reversed(spec.defaults), reversed(
                    spec.args)):  # args with default values
                longname = '--' + arg
                #if isinstance(default, bool):   # XXX: this not the right semantics.
                #    if default == False:
                #        parser.add_option(longname, action="store_true", default=False)
                #    else:
                #        parser.add_option(longname, action="store_false", default=True)
                #else:
                parser.add_option(longname, default=default)

        parser.usage = '%s [options] %s' % (action.__name__, ' '.join(spec.args)) \
            + '\n\n    ' + getdoc(action)

        (kw, args) = parser.parse_args(args)

        # TODO: need a better usage message which shows positional arguments

        # minimum non-keyword args
        if len(args) < len(spec.args) - len(spec.defaults or []):
            parser.print_help()
            return

        kw = kw.__dict__

        # call function
        out = action(*args, **kw)

        # pretty-print result
        if isinstance(out, basestring):
            print out

        elif isinstance(out, dict):
            if isinstance(out, defaultdict):
                out = dict(out)
            pprint(out)

        else:
            try:
                out = iter(out)
            except TypeError:
                if out is not None:
                    print out
            else:
                for x in out:
                    print x