[docs]defcmd(**overrides):"""Set the overrides for a command."""defwrap(cb):cb=cb.__func__ifinspect.ismethod(cb)elsecbcb.cli2=overridesreturncbreturnwrap
[docs]defarg(name,**kwargs):"""Set the overrides for an argument."""defwrap(cb):cb=cb.__func__ifinspect.ismethod(cb)elsecboverrides=getattr(cb,'cli2_'+name,None)ifoverridesisNone:try:setattr(cb,'cli2_'+name,{})exceptAttributeError:setattr(cb.__func__,'cli2_'+name,{})try:overrides=getattr(cb,'cli2_'+name)exceptAttributeError:overrides=getattr(cb.__func__,'cli2_'+name)overrides.update(kwargs)returncbreturnwrap
deffactories(*args,**args_overrides):args_overrides.setdefault('self','__init__')args_overrides.setdefault('cls','__class__')def_(cls):forkey,valueinargs_overrides.items():arg(key,factory=value)(cls)forname,objininspect.getmembers(cls):ifnotinspect.isfunction(obj)andnotinspect.ismethod(obj):continueobj=getattr(obj,'__func__',obj)specials=dict(__init__=lambda*a,**k:cls(*a,**k),__class__=lambda*a,**k:cls,)argspec=inspect.getfullargspec(obj)forkey,valueinargs_overrides.items():ifkeyinargspec.args:callback=Noneifisinstance(value,str)andvaluenotinspecials.keys():callback=getattr(cls,value)ifnotcallback:callback=specials.get(value,value)arg(key,factory=callback)(obj)returnclsifargs:# simple @cli2.factories call without argumentreturn_(args[0])return_