[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