def verify_callback(callback):
    """ ensure callback has a signature similar
        to one of these:
            def callback(ctx, **data):       stuff()
            def callback(self, ctx, **data): stuff()
    """
    try:
      s = pep362.signature(callback)
    except AttributeError: #used declare_channel?
      s = pep362.signature(callback.fxn)

    not_more_than2 = lambda s: len(s._parameters) < 3
    if2then_self_is_one = lambda s: ( len(s._parameters)!=2 and True ) or \
                                    ( len(s._parameters)==2 and 'self' in s._parameters )

    at_least_one = lambda s: len(s._parameters) > 0
    if not s.var_args:
       # maybe warn them or something here..
       pass
    tests = [ #s.var_args,
              not_more_than2(s),
              if2then_self_is_one(s),
              #at_least_one(s),
               ]

    if not s.var_kw_args: #all(tests):
       err='callback@{name} needs to accept **kargs'
       raise CallbackError(err.format(name=s.name))
Beispiel #2
0
def sig_example():
    from pep362 import signature
    def f(a,b,c): pass
    sig = signature(f)
    parameters = sig._parameters #{'a':parameter1,'b':parameter2, .. }
    print 'sig_example',sig, parameters
    from IPython import Shell; Shell.IPShellEmbed(argv=['-noconfirm_exit'])()
Beispiel #3
0
def func2sig(func):
    """ returns sig_obj, sig_str """

    sig          = signature(func)
    parameters   = sig._parameters
    sort_machine = lambda x, y: cmp(x[0],y[0])
    func_sig     = [ [position(parameters, k), k, parameters[k] ] for k in parameters.keys() ]
    func_sig.sort(sort_machine) # sort args by their position in signature

    func_sig   = [ display(x) for x in func_sig ]
    func_sig   = func_sig[1:] # probably an instancemethod.. chop off "self"
    func_sig   = ' '.join(func_sig)
    sig_str    = "{name} {sig}".format(name=sig.name,sig=func_sig)
    return sig, sig_str
Beispiel #4
0
    def help(self, indent=0):
        """ shows help for this plugin """
        cls_names = [ x for x in dir(self.__class__) if \
                      is_published_to_commandline(getattr(self, x)) and\
                      x!='help' ]
        modname    = self.__class__.__module__.lower().split('.')[-1]

        if not indent:
            print "->",modname.upper()
            indent=3

        for name in cls_names:
            func       = getattr(self,name)
            doc        = func.__doc__
            parent     = self.__class__.__name__.lower()

            progname   = os.path.split(sys.argv[0])[1]
            sig        = signature(func)
            parameters = sig._parameters

            display1     = lambda k:   '<{k}>'.format(k=k)
            dvdisplay    = lambda p:   (p.default_value is not None and \
                                        '[<{k}={deflt}>'.format(**{'k':p.name,
                                                                  'deflt':p.default_value})) or \
                                       ('[<{k}>]'.format(**{'k':p.name}))
            position     = lambda k:   parameters[k].position
            sort_machine = lambda x, y: cmp(x[0],y[0])

            func_sig   = [ [position(k), k, parameters[k] ] for k in parameters.keys() ]
            func_sig.sort(sort_machine) # sort args by their position in signature

            display    = lambda t: (hasattr(t[2],'default_value') and \
                                    dvdisplay(t[2])) or \
                                   (True and \
                                    display1(t[1]))

            func_sig   = [ display(x) for x in func_sig ]
            func_sig   = func_sig[1:] # probably an instancemethod.. chop off "self"
            func_sig   = ' '.join(func_sig)
            _ex        = "{kinbaku} {plugin} {name} {sig}".format(kinbaku = progname,
                                                                  plugin  = modname,
                                                                  name    = name,
                                                                  sig     = func_sig)
            print ' '*indent + ' {example}{space1}{doc}'.format(example=_ex,
                                                    space1=' '*(45-len(_ex)),
                                                    doc=doc or "")
Beispiel #5
0
def sig_example():
    from pep362 import signature
    def f(a,b,c): pass
    sig = signature(f)
    parameters = sig._parameters #{'a':parameter1,'b':parameter2, .. }
    print 'sig_example',sig, parameters