[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