diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
| commit | 7de404bb4af2744a64c13e31a780fc0229b8f9e5 (patch) | |
| tree | 49f0b91b005777071050bf72732300f3bcd8d3ad /repoze/bfg/mapply.py | |
| parent | 93a4f5df2f74e4cbefc70733f2c0258859207106 (diff) | |
| download | pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.gz pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.bz2 pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.zip | |
Look up a view after traversal; adapt it to IWSGIApplication.
Diffstat (limited to 'repoze/bfg/mapply.py')
| -rw-r--r-- | repoze/bfg/mapply.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/repoze/bfg/mapply.py b/repoze/bfg/mapply.py new file mode 100644 index 000000000..421db2ce3 --- /dev/null +++ b/repoze/bfg/mapply.py @@ -0,0 +1,71 @@ +############################################################################## +# +# Copyright (c) 2002 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE +# +############################################################################## +"""Provide an apply-like facility that works with any mapping object +""" + +def mapply(object, + positional=(), + keyword={}, + maybe=True, + ): + + if hasattr(object,'__bases__'): # the object is a class + raise TypeError('Cannot publish class %s' % object) + else: + f=object + im=0 + if hasattr(f, 'im_func'): + im=1 + elif not hasattr(f,'func_defaults'): + if hasattr(f, '__call__'): + f=f.__call__ + if hasattr(f, 'im_func'): + im=1 + elif not hasattr(f,'func_defaults') and maybe: + return object + elif maybe: + return object + + if im: + f=f.im_func + c=f.func_code + defaults=f.func_defaults + names=c.co_varnames[1:c.co_argcount] + else: + defaults=f.func_defaults + c=f.func_code + names=c.co_varnames[:c.co_argcount] + + nargs=len(names) + if positional: + positional=list(positional) + if len(positional) > nargs: + raise TypeError('too many arguments') + args=positional + else: + args=[] + + get=keyword.get + nrequired=len(names) - (len(defaults or ())) + for index in range(len(args), len(names)): + name=names[index] + v=get(name, args) + if v is args: + if index < nrequired: + raise TypeError('Argument %s was omitted' % name) + else: + v=defaults[index-nrequired] + args.append(v) + + args=tuple(args) + return object(*args) |
