On Fri, Nov 10, 2000 at 08:52:16AM -0500, Greg Ward wrote:
>This suggests a very simple rule: after the main traversal loop, do this:
That certainly simplifies things, since it collapses the very similar
logic for modules and instances into a single code path. I then wind
up with the patch below that deletes a bunch of redundant code.
I'll test the changes on my machine for today, and then check it in if
no problems show up.
--amk
Index: publish.py
===================================================================
RCS file: /projects/cvsroot/mems/quixote/publish.py,v
retrieving revision 1.43
diff -u -r1.43 publish.py
--- publish.py 2000/10/27 15:31:20 1.43
+++ publish.py 2000/11/10 17:03:43
@@ -163,14 +163,10 @@
(script_name, path_info, object) = \
_traverse(original_path, path, request, response)
- # ExtensionClass-proof test for "this is a class instance"
- is_instance = (hasattr(object, '__class__') and
- not hasattr(object, '__bases__'))
- is_module = type(object) == types.ModuleType
-
- if is_module:
- # It's a module, which isn't callable. First, make sure URL has
- # trailing slash
+ if not callable(object):
+ # It's something which isn't callable, like a module or an
+ # instance without a __call__ method.
+ # Therefore we'll first ensure that the URL has a trailing slash.
if original_path[-1] != '/':
# repair path and redirect
path = "%s/%s/" % (config.URL_PREFIX, string.join(path, '/'))
@@ -183,22 +179,6 @@
if (hasattr(object, 'index') and
callable(object.index) and
'index' in object.__exports__):
- object = object.index
- else:
- raise errors.TraversalError(
- "module %s has no function index (or it's not in __exports__)"
- % object.__name__,
- original_path)
-
- # Instances get a similar treatment to modules, except they may be
- # callable already (in which case we leave them be, and just call
- # them).
- elif is_instance:
- if callable(object):
- pass # object is just fine as-is
- elif (hasattr(object, 'index') and
- callable(object.index) and
- 'index' in object.__exports__):
object = object.index
else:
raise errors.TraversalError(