[Checkins] SVN: traject/trunk/src/traject/ Modify signature of consume_stack to also return those bits that were
Martijn Faassen
faassen at startifact.com
Wed Oct 28 15:29:52 EDT 2009
Log message for revision 105341:
Modify signature of consume_stack to also return those bits that were
consumed.
Changed:
U traject/trunk/src/traject/_traject.py
U traject/trunk/src/traject/tests.py
U traject/trunk/src/traject/traject.txt
-=-
Modified: traject/trunk/src/traject/_traject.py
===================================================================
--- traject/trunk/src/traject/_traject.py 2009-10-28 18:21:15 UTC (rev 105340)
+++ traject/trunk/src/traject/_traject.py 2009-10-28 19:29:51 UTC (rev 105341)
@@ -138,7 +138,7 @@
return self.resolve_stack(root, names, default_factory)
def resolve_stack(self, root, stack, default_factory):
- unconsumed, obj = self.consume_stack(root, stack, default_factory)
+ unconsumed, consumed, obj = self.consume_stack(root, stack, default_factory)
if unconsumed:
raise ResolutionError(
"Could not resolve path: %s" % '/'.join(reversed(stack)))
@@ -155,6 +155,7 @@
provided = (providedBy(root),)
obj = root
pattern = ()
+ consumed = []
while stack:
name = stack.pop()
step_pattern = pattern + (name,)
@@ -182,7 +183,7 @@
else:
# cannot find step or variable, so cannot resolve
stack.append(name)
- return stack, obj
+ return stack, consumed, obj
# now see about constructing the object
factory = self._registry.lookup(provided, IFactory, pattern_str)
if factory is None:
@@ -192,10 +193,11 @@
if obj is None:
stack.append(name)
# we cannot resolve to a factory that returns None
- return stack, parent
+ return stack, consumed, parent
+ consumed.append(name)
obj.__name__ = name
obj.__parent__ = parent
- return stack, obj
+ return stack, consumed, obj
def locate(self, root, model, default):
if hasattr(model, '__parent__') and model.__parent__ is not None:
Modified: traject/trunk/src/traject/tests.py
===================================================================
--- traject/trunk/src/traject/tests.py 2009-10-28 18:21:15 UTC (rev 105340)
+++ traject/trunk/src/traject/tests.py 2009-10-28 19:29:51 UTC (rev 105341)
@@ -141,10 +141,12 @@
l = ['a', 'B', 'c', 'D']
l.reverse()
- unconsumed, obj = patterns.consume_stack(root, l, default)
+ unconsumed, consumed, obj = patterns.consume_stack(root, l, default)
# have nothing left unconsumed
self.assertEquals([], unconsumed)
+ # everything was consumed
+ self.assertEquals(['a', 'B', 'c', 'D'], consumed)
# we see that the parents and names are correct
self.assertEquals('D', obj.__name__)
@@ -188,10 +190,11 @@
l = ['a', 'B', 'c']
l.reverse()
- unconsumed, obj = patterns.consume_stack(root, l, default)
+ unconsumed, consumed, obj = patterns.consume_stack(root, l, default)
self.assertEquals([], unconsumed)
-
+ self.assertEquals(['a', 'B', 'c'], consumed)
+
# we get a bunch of default objects
self.assertEquals('c', obj.__name__)
self.assert_(isinstance(obj, Default))
@@ -229,11 +232,12 @@
l = ['b', 'c', 'd']
l.reverse()
- unconsumed, obj = patterns.consume_stack(root, l, default)
+ unconsumed, consumed, obj = patterns.consume_stack(root, l, default)
self.assert_(obj is root)
self.assertEquals(['d', 'c', 'b'], unconsumed)
-
+ self.assertEquals([], consumed)
+
def test_wrong_arguments(self):
patterns = traject.Patterns()
class Obj(object):
@@ -283,8 +287,11 @@
patterns.register(Root, 'models/:id', factory)
root = Root()
- unconsumed, obj = patterns.consume(root, 'models/not_an_int', default)
+ unconsumed, consumed, obj = patterns.consume(root,
+ 'models/not_an_int',
+ default)
self.assertEquals(['not_an_int'], unconsumed)
+ self.assertEquals(['models'], consumed)
self.assertEquals('models', obj.__name__)
self.assert_(obj.__parent__ is root)
@@ -311,12 +318,13 @@
patterns = self.get_multi_patterns()
root = Root()
- unconsumed, obj = patterns.consume(
+ unconsumed, consumed, obj = patterns.consume(
root, u'departments/1/employees/10/index',
default)
self.assertEquals(['index'], unconsumed)
-
+ self.assertEquals(['departments', '1', 'employees', '10'],
+ consumed)
self.assert_(isinstance(obj, Employee))
self.assertEquals(u'1', obj.department_id)
self.assertEquals(u'10', obj.employee_id)
@@ -334,10 +342,11 @@
patterns = self.get_multi_patterns()
root = Root()
- unconsumed, obj = patterns.consume(
+ unconsumed, consumed, obj = patterns.consume(
root, u'departments/1/index', default)
self.assertEquals(['index'], unconsumed)
+ self.assertEquals(['departments', '1'], consumed)
self.assert_(isinstance(obj, Department))
self.assertEquals(u'1', obj.department_id)
Modified: traject/trunk/src/traject/traject.txt
===================================================================
--- traject/trunk/src/traject/traject.txt 2009-10-28 18:21:15 UTC (rev 105340)
+++ traject/trunk/src/traject/traject.txt 2009-10-28 19:29:51 UTC (rev 105341)
@@ -290,12 +290,15 @@
possible. The rest of the the steps are not followed.
The method consume will consume steps as far as possible, return the
-steps that weren't consumed yet, and the object it managed to find::
+steps that weren't consumed yet, those steps that were consumed, and
+the object it managed to find::
- >>> unconsumed, last_obj = patterns.consume(root,
+ >>> unconsumed, consumed, last_obj = patterns.consume(root,
... 'departments/1/some_view', Default)
>>> unconsumed
['some_view']
+ >>> consumed
+ ['departments', '1']
>>> isinstance(last_obj, Default)
True
>>> last_obj.__name__
@@ -310,9 +313,11 @@
>>> l = ['departments', '1', 'some_view']
>>> l.reverse()
- >>> unconsumed, last_obj = patterns.consume_stack(root, l, Default)
+ >>> unconsumed, consumed, last_obj = patterns.consume_stack(root, l, Default)
>>> unconsumed
['some_view']
+ >>> consumed
+ ['departments', '1']
>>> isinstance(last_obj, Default)
True
>>> last_obj.__name__
More information about the checkins
mailing list