[Checkins] SVN: megrok.rdb/trunk/src/megrok/rdb/ Finalize implementation of QueryContainer, now also get __parent__ right

Martijn Faassen faassen at infrae.com
Thu Aug 21 16:02:12 EDT 2008


Log message for revision 90092:
  Finalize implementation of QueryContainer, now also get __parent__ right
  for values().
  

Changed:
  U   megrok.rdb/trunk/src/megrok/rdb/README.txt
  U   megrok.rdb/trunk/src/megrok/rdb/components.py

-=-
Modified: megrok.rdb/trunk/src/megrok/rdb/README.txt
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/README.txt	2008-08-21 19:44:20 UTC (rev 90091)
+++ megrok.rdb/trunk/src/megrok/rdb/README.txt	2008-08-21 20:02:12 UTC (rev 90092)
@@ -291,7 +291,7 @@
   >>> qc[2].name
   'Physics'
 
-XXX Why the unicode difference?
+XXX Why the unicode difference between u'Philosophy' and 'Physics'?
 
 ``__getitem__`` with a ``KeyError``::
 
@@ -332,3 +332,33 @@
 
   >>> sorted([v.name for v in qc.values()])
   [u'Philosophy', 'Physics']
+
+The parents of all the values are the query container::
+
+  >>> [v.__parent__ is qc for v in qc.values()]
+  [True, True]
+  >>> sorted([v.__name__ for v in qc.values()])
+  [u'1', u'2']
+
+``keys``::
+
+  >>> sorted([key for key in qc.keys()])
+  [u'1', u'2']
+
+``items``::
+
+  >>> sorted([(key, value.name) for (key, value) in qc.items()])
+  [(u'1', u'Philosophy'), (u'2', 'Physics')]
+
+  >>> [value.__parent__ is qc for (key, value) in qc.items()]
+  [True, True]
+  >>> sorted([value.__name__ for (key, value) in qc.items()])
+  [u'1', u'2']
+
+``__iter__``::
+  
+  >>> result = []
+  >>> for key in qc:
+  ...   result.append(key)
+  >>> sorted(result)
+  [u'1', u'2']

Modified: megrok.rdb/trunk/src/megrok/rdb/components.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/components.py	2008-08-21 19:44:20 UTC (rev 90091)
+++ megrok.rdb/trunk/src/megrok/rdb/components.py	2008-08-21 20:02:12 UTC (rev 90092)
@@ -1,4 +1,5 @@
 from sqlalchemy.orm.collections import MappedCollection, collection
+from sqlalchemy.orm.util import identity_key
 
 from zope.interface import implements
 from zope.location.interfaces import ILocation
@@ -131,17 +132,39 @@
         return key in self
 
     def keys(self):
-        raise NotImplementedError
+        result = []
+        # XXX probably not the most efficient way to do this
+        for v in self.query().all():
+            result.append(self.keyfunc(v))
+        return result
 
     def __iter__(self):
-        raise NotImplementedError
+        for key in self.keys():
+            yield key
     
     def values(self):
-        return self.query().all()
+        result = []
+        for v in self.query().all():
+            v.__parent__ = self
+            v.__name__ = self.keyfunc(v)
+            result.append(v)
+        return result
         
     def items(self):
-        raise NotImplementedError
+        result = []
+        for v in self.query().all():
+            v.__parent__ = self
+            key = v.__name__ = self.keyfunc(v)
+            result.append((key, v))
+        return result
 
     def __len__(self):
         return self.query().count()
     
+    def keyfunc(self, value):
+        """Get the key for this value.
+        """
+        # XXX this isn't very general...
+        class_, key_tuple = identity_key(instance=value)
+        return unicode(key_tuple[0])
+



More information about the Checkins mailing list