summaryrefslogtreecommitdiff
path: root/repoze/bfg/mapply.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-07 04:44:57 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-07 04:44:57 +0000
commit7de404bb4af2744a64c13e31a780fc0229b8f9e5 (patch)
tree49f0b91b005777071050bf72732300f3bcd8d3ad /repoze/bfg/mapply.py
parent93a4f5df2f74e4cbefc70733f2c0258859207106 (diff)
downloadpyramid-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.py71
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)