[Checkins] SVN: z3c.dobbin/trunk/src/z3c/dobbin/ Added support for tuple relation.

Malthe Borch mborch at gmail.com
Thu Jun 19 20:57:04 EDT 2008


Log message for revision 87581:
  Added support for tuple relation.

Changed:
  U   z3c.dobbin/trunk/src/z3c/dobbin/collections.py
  U   z3c.dobbin/trunk/src/z3c/dobbin/mapper.py

-=-
Modified: z3c.dobbin/trunk/src/z3c/dobbin/collections.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/collections.py	2008-06-19 22:21:36 UTC (rev 87580)
+++ z3c.dobbin/trunk/src/z3c/dobbin/collections.py	2008-06-20 00:57:00 UTC (rev 87581)
@@ -6,10 +6,7 @@
 import relations
 import soup
 
-class OrderedList(object):
-    __Security_checker__ = NamesChecker(
-        ('append', 'remove'))
-    
+class Tuple(object):
     def __init__(self):
         self.data = []
 
@@ -29,9 +26,55 @@
     def _remover(self, item):
         self.data.remove(item)
 
+    @orm.collections.collection.converter
+    def convert(self, items):
+        converted = []
+        
+        for item in items:
+            if not interfaces.IMapped.providedBy(item):
+                item = soup.persist(item)
+
+            # set up relation
+            relation = relations.Relation()
+            relation.target = item
+            relation.order = len(converted)
+
+            converted.append(relation)
+            
+        return converted
+
+    def __iter__(self):
+        for relation in iter(self.data):
+            obj = relation.target
+            if interfaces.IBasicType.providedBy(obj):
+                yield obj.value
+            else:
+                yield obj
+                
+    def __len__(self):
+        return len(self.data)
+    
+    def __repr__(self):
+        return repr(tuple(self))
+    
+class OrderedList(Tuple):
+    __Security_checker__ = NamesChecker(
+        ('append', 'remove'))
+
+    @orm.collections.collection.appender
+    def _appender(self, item):
+        self.data.append(item)
+    
+    @orm.collections.collection.iterator
+    def _iterator(self):
+        return iter(self.data)
+
+    @orm.collections.collection.remover
+    def _remover(self, item):
+        self.data.remove(item)
+
     @orm.collections.collection.internally_instrumented
     def append(self, item, _sa_initiator=None):
-        # make sure item is mapped
         if not interfaces.IMapped.providedBy(item):
             item = soup.persist(item)
 
@@ -56,25 +99,19 @@
             if relation.right == uuid:
                 self.adapter.fire_remove_event(relation, _sa_initiator)
                 self.data.remove(relation)
-
-                return
+                break
         else:
-            return ValueError("Not in list: %s" % item)
+            raise ValueError("Not in list: %s" % item)
         
     def extend(self, items):
         map(self.append, items)
 
-    def __iter__(self):
-        return (relation.target for relation in iter(self.data))
-
     def __repr__(self):
         return repr(list(self))
     
-    def __len__(self):
-        return len(self.data)
-    
     def __getitem__(self, index):
         return self.data[index].target
         
     def __setitem__(self, index, value):
         return NotImplementedError("Setting items at an index is not implemented.")
+

Modified: z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/mapper.py	2008-06-19 22:21:36 UTC (rev 87580)
+++ z3c.dobbin/trunk/src/z3c/dobbin/mapper.py	2008-06-20 00:57:00 UTC (rev 87581)
@@ -69,12 +69,11 @@
             lazy=True)
             }
 
-class ListProperty(object):
-    """A list property.
+class CollectionProperty(object):
+    """A collection property."""
 
-    Model the schema.List
-    """
-
+    collection_class = None
+    
     def __call__(self, field, column, metadata):
         relation_table = metadata.tables['relation']
         soup_table = metadata.tables['soup']
@@ -83,9 +82,15 @@
             field.__name__: orm.relation(
                 relations.Relation,
                 primaryjoin=soup_table.c.uuid==relation_table.c.left,
-                collection_class=collections.OrderedList,
+                collection_class=self.collection_class,
                 enable_typechecks=False)
             }
+
+class ListProperty(CollectionProperty):
+    collection_class = collections.OrderedList
+
+class TupleProperty(CollectionProperty):
+    collection_class = collections.Tuple
                     
 class DictProperty(object):
     """A dict property.
@@ -132,6 +137,7 @@
     schema.Id: StringTranslator(rdb.Unicode),
     schema.Int: FieldTranslator(rdb.Integer),
     schema.List: (None, ListProperty()),
+    schema.Tuple: (None, TupleProperty()),
     schema.Object: (ObjectTranslator(), ObjectProperty()),
     schema.Password: StringTranslator(rdb.Unicode),
     schema.SourceText: StringTranslator(rdb.UnicodeText),



More information about the Checkins mailing list