view pyloader/invoke.py @ 4:5ce55f6c8964

invokation works in the barest sense
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 10 May 2011 19:00:57 -0700
parents 65d9a7c7ac63
children a825f00fe062
line wrap: on
line source

import inspect
import sys
from cast import cast
from cast import str2args

def call(obj, *args, **kwargs):
    """call a thing with string arguments"""
    inspected = obj
    if inspect.isclass(obj):
        inspected = obj.__init__ # inspect the ctor
    try:
        argspec = inspect.getargspec(inspected)
    except TypeError:
        argspec = None
    if argspec is None:
        args = [cast(i) for i in args]
        kwargs = dict([(key, cast(value)) for key, value in kwargs.items()])
    else:
        # TODO: get values from argspec
        args = [cast(i) for i in args]
        kwargs = dict([(key, cast(value)) for key, value in kwargs.items()])
    return obj(*args, **kwargs)

def main(args=sys.argv[1:]):
    """CLI entry point"""
    from loader import load
    from optparse import OptionParser
    usage = '%prog Object arg1=value1 arg2=value2 [...]'
    description = 'invoke an Object given string arguments'
    parser = OptionParser(usage=usage, description=description)
    if not args:
        parser.print_usage()
        parser.exit()
    obj = load(args[0])
    obj_args, obj_kwargs = str2args(' '.join(args[1:]))
    print call(obj, *obj_args, **obj_kwargs)

if __name__ == '__main__':
    main()