From 7de404bb4af2744a64c13e31a780fc0229b8f9e5 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 7 Jul 2008 04:44:57 +0000 Subject: Look up a view after traversal; adapt it to IWSGIApplication. --- repoze/bfg/mapply.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 repoze/bfg/mapply.py (limited to 'repoze/bfg/mapply.py') 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) -- cgit v1.2.3