[Checkins] SVN: z3c.dobbin/trunk/src/z3c/dobbin/ Refactoring; compatibility with SQLAlchemy 0.5.

Malthe Borch cvs-admin at zope.org
Fri Jun 13 05:15:34 EDT 2008


Log message for revision 87360:
  Refactoring; compatibility with SQLAlchemy 0.5.

Changed:
  U   z3c.dobbin/trunk/src/z3c/dobbin/README.txt
  U   z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
  A   z3c.dobbin/trunk/src/z3c/dobbin/collections.py
  U   z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
  U   z3c.dobbin/trunk/src/z3c/dobbin/relations.py
  A   z3c.dobbin/trunk/src/z3c/dobbin/soup.py

-=-
Modified: z3c.dobbin/trunk/src/z3c/dobbin/README.txt
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/README.txt	2008-06-13 01:44:02 UTC (rev 87359)
+++ z3c.dobbin/trunk/src/z3c/dobbin/README.txt	2008-06-13 09:13:59 UTC (rev 87360)
@@ -144,9 +144,8 @@
 
 Copy the attributes from the Diana Ross vinyl record.
 
-    >>> diana = session.query(IVinyl.__mapper__).select_by(
-    ...     IAlbum.__mapper__.c.id==2)[0]
-
+    >>> diana = session.query(IVinyl.__mapper__).filter_by(id=2)[0]
+    
     >>> vinyl.artist = diana.artist
     >>> vinyl.title = diana.title
     >>> vinyl.rpm = diana.rpm
@@ -199,8 +198,8 @@
     
 Get back the object.
     
-    >>> favorite = session.query(IFavorite.__mapper__).select_by(
-    ...     IFavorite.__mapper__.c.spec==IFavorite.__mapper__.__spec__)[0]
+    >>> favorite = session.query(IFavorite.__mapper__).filter_by(
+    ...     spec=IFavorite.__mapper__.__spec__)[0]
 
 When we retrieve the related items, it's automatically reconstructed
 to match the specification to which it was associated.

Modified: z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py	2008-06-13 01:44:02 UTC (rev 87359)
+++ z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py	2008-06-13 09:13:59 UTC (rev 87360)
@@ -4,10 +4,7 @@
 from sqlalchemy import orm
         
 from ore.alchemist.interfaces import IDatabaseEngine
-from ore.alchemist import Session
 
-from interfaces import IMapped
-
 import relations
 
 def bootstrapDatabaseEngine(event):
@@ -21,9 +18,6 @@
     relation(metadata)
     metadata.create_all()
 
-class Soup(object):
-    pass
-
 def soup(metadata):
     table = rdb.Table(
         'soup',
@@ -35,8 +29,6 @@
 
     orm.mapper(Soup, table)
 
-    return table
-
 def catalog(metadata):
     return rdb.Table(
         'catalog',
@@ -46,29 +38,6 @@
         rdb.Column('right', rdb.String(length=32), rdb.ForeignKey("soup.uuid")),
         rdb.Column('name', rdb.String))
 
-class Relation(object):
-    def _get_source(self):
-        return relations.lookup(self.left)
-
-    def _set_source(self, item):
-        self.left = item.uuid
-
-    def _get_target(self):
-        return relations.lookup(self.right)
-
-    def _set_target(self, item):
-        if not IMapped.providedBy(item):
-            item = relations.persist(item)
-
-        if item.id is None:
-            session = Session()
-            session.save(item)
-                
-        self.right = item.uuid
-
-    source = property(_get_source, _set_source)
-    target = property(_get_target, _set_target)
-    
 def relation(metadata):
     table = rdb.Table(
         'relation',
@@ -78,6 +47,7 @@
         rdb.Column('right', rdb.String(length=32), rdb.ForeignKey("soup.uuid")),
         rdb.Column('order', rdb.Integer, nullable=False))
     
-    orm.mapper(Relation, table)
-    
-    return table
+    orm.mapper(relations.Relation, table)
+
+class Soup(object):
+    pass

Added: z3c.dobbin/trunk/src/z3c/dobbin/collections.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/collections.py	                        (rev 0)
+++ z3c.dobbin/trunk/src/z3c/dobbin/collections.py	2008-06-13 09:13:59 UTC (rev 87360)
@@ -0,0 +1,77 @@
+from zope.security.checker import NamesChecker
+
+from sqlalchemy import orm
+
+import interfaces
+import relations
+
+class OrderedList(object):
+    __Security_checker__ = NamesChecker(
+        ('append', 'remove'))
+    
+    def __init__(self):
+        self.data = []
+
+    @property
+    def adapter(self):
+        return self._sa_adapter
+
+    @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)
+        
+    def append(self, item, _sa_initiator=None):
+        # make sure item is mapped
+        if not interfaces.IMapped.providedBy(item):
+            item = relations.persist(item)
+
+        # set up relation
+        relation = relations.Relation()
+        relation.target = item
+        relation.order = len(self.data)
+
+        self.adapter.fire_append_event(relation, _sa_initiator)
+        
+        # add relation to internal list
+        self.data.append(relation)
+
+    def remove(self, item, _sa_initiator=None):
+        if interfaces.IMapped.providedBy(item):
+            uuid = item.uuid
+        else:
+            uuid = item._d_uuid
+
+        for relation in self.data:
+            if relation.right == uuid:
+                self.adapter.fire_remove_event(relation, _sa_initiator)
+                self.data.remove(relation)
+
+                return
+        else:
+            return 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-13 01:44:02 UTC (rev 87359)
+++ z3c.dobbin/trunk/src/z3c/dobbin/mapper.py	2008-06-13 09:13:59 UTC (rev 87360)
@@ -5,7 +5,6 @@
 from zope.dottedname.resolve import resolve
 from zope.security.interfaces import IChecker
 from zope.security.checker import defineChecker, getCheckerForInstancesOf
-from zope.security.checker import NamesChecker
 from zope.security.proxy import removeSecurityProxy
 
 from interfaces import IMapper
@@ -26,8 +25,9 @@
 
 import bootstrap
 import relations
-
+import collections
 import factory
+import soup
 
 from itertools import chain
 
@@ -41,98 +41,6 @@
     
     return chr(randint(ord('a'), ord('z'))) + uuid1().hex[:-1]
 
-class RelationProperty(property):
-    def __init__(self, field):
-        self.field = field
-        self.name = field.__name__+'_relation'
-        property.__init__(self, self.get, self.set)
-
-    def get(kls, instance):
-        item = getattr(instance, kls.name)
-        return relations.lookup(item.uuid)
-
-    def set(kls, instance, item):
-        if not IMapped.providedBy(item):
-            item = relations.persist(item)
-
-        if item.id is None:
-            session = Session()
-            session.save(item)
-
-        setattr(instance, kls.name, item)
-
-class RelationList(object):
-    __emulates__ = None
-    __Security_checker__ = NamesChecker(
-        ('append', 'remove'))
-    
-    def __init__(self):
-        self.data = []
-
-    @property
-    def adapter(self):
-        return self._sa_adapter
-
-    @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)
-        
-    def append(self, item, _sa_initiator=None):
-        # make sure item is mapped
-        if not IMapped.providedBy(item):
-            item = relations.persist(item)
-
-        # set up relation
-        relation = bootstrap.Relation()
-        relation.target = item
-        relation.order = len(self.data)
-
-        self.adapter.fire_append_event(relation, _sa_initiator)
-        
-        # add relation to internal list
-        self.data.append(relation)
-
-    def remove(self, item, _sa_initiator=None):
-        if IMapped.providedBy(item):
-            uuid = item.uuid
-        else:
-            uuid = item._d_uuid
-
-        for relation in self.data:
-            if relation.right == uuid:
-                self.adapter.fire_remove_event(relation, _sa_initiator)
-                self.data.remove(relation)
-
-                return
-        else:
-            return 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.")
-
 class ObjectTranslator(object):
     def __init__(self, column_type=None):
         self.column_type = column_type
@@ -149,7 +57,7 @@
     """
     
     def __call__(self, field, column, metadata):
-        relation = RelationProperty(field)
+        relation = relations.RelationProperty(field)
 
         return {
             field.__name__: relation,
@@ -173,9 +81,9 @@
         
         return {
             field.__name__: orm.relation(
-                bootstrap.Relation,
+                relations.Relation,
                 primaryjoin=soup_table.c.uuid==relation_table.c.left,
-                collection_class=RelationList,
+                collection_class=collections.OrderedList,
                 enable_typechecks=False)
             }
                     
@@ -339,6 +247,7 @@
         table,
         properties=properties,
         exclude_properties=exclude,
+        # order_by=soup_table.c.id,
         inherits=bootstrap.Soup,
         inherit_condition=(first_table.c.id==soup_table.c.id))
 

Modified: z3c.dobbin/trunk/src/z3c/dobbin/relations.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/relations.py	2008-06-13 01:44:02 UTC (rev 87359)
+++ z3c.dobbin/trunk/src/z3c/dobbin/relations.py	2008-06-13 09:13:59 UTC (rev 87360)
@@ -1,65 +1,50 @@
 from zope import interface
 
-from interfaces import IMapper
-from interfaces import IMapped
-
-from session import getTransactionManager
-
-from zope.dottedname.resolve import resolve
 from ore.alchemist import Session
 
+import soup
 import factory
-import bootstrap
+import interfaces
 
-def lookup(uuid, ignore_cache=False):
-    session = Session()
+class Relation(object):
+    def _get_source(self):
+        return soup.lookup(self.left)
 
-    try:
-        item = session.query(bootstrap.Soup).select_by(uuid=uuid)[0]
-    except IndexError:
-        raise LookupError("Unable to locate object with UUID = '%s'." % uuid)
-        
-    # try to acquire relation target from session
-    if not ignore_cache:
-        try:
-            return session._d_pending[item.uuid]
-        except (AttributeError, KeyError):
-            pass
+    def _set_source(self, item):
+        self.left = item.uuid
 
-    # build item
-    return build(item.spec, item.uuid)
+    def _get_target(self):
+        return soup.lookup(self.right)
 
-def build(spec, uuid):
-    kls = resolve(spec)
-    mapper = IMapper(kls)
-    
-    session = Session()
-    return session.query(mapper).select_by(uuid=uuid)[0]
+    def _set_target(self, item):
+        if not interfaces.IMapped.providedBy(item):
+            item = persist(item)
 
-def persist(item):
-    # create instance
-    instance = factory.create(item.__class__)
+        if item.id is None:
+            session = Session()
+            session.save(item)
+                
+        self.right = item.uuid
 
-    # assign uuid to item
-    item._d_uuid = instance.uuid
+    source = property(_get_source, _set_source)
+    target = property(_get_target, _set_target)
+    
+class RelationProperty(property):
+    def __init__(self, field):
+        self.field = field
+        self.name = field.__name__+'_relation'
+        property.__init__(self, self.get, self.set)
 
-    # hook into transaction
-    try:
-        manager = item._d_manager
-    except AttributeError:
-        manager = item._d_manager = getTransactionManager(item)
-        
-    manager.register()
+    def get(kls, instance):
+        item = getattr(instance, kls.name)
+        return soup.lookup(item.uuid)
 
-    # update attributes
-    update(instance, item)
+    def set(kls, instance, item):
+        if not interfaces.IMapped.providedBy(item):
+            item = persist(item)
 
-    return instance
+        if item.id is None:
+            session = Session()
+            session.save(item)
 
-def update(instance, item):
-    # set attributes
-    for iface in interface.providedBy(item):
-        for name in iface.names():
-            value = getattr(item, name)
-            setattr(instance, name, value)
-
+        setattr(instance, kls.name, item)

Added: z3c.dobbin/trunk/src/z3c/dobbin/soup.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/soup.py	                        (rev 0)
+++ z3c.dobbin/trunk/src/z3c/dobbin/soup.py	2008-06-13 09:13:59 UTC (rev 87360)
@@ -0,0 +1,65 @@
+from zope import interface
+
+from interfaces import IMapper
+from interfaces import IMapped
+
+from session import getTransactionManager
+
+from zope.dottedname.resolve import resolve
+from ore.alchemist import Session
+
+import factory
+import bootstrap
+
+def lookup(uuid, ignore_cache=False):
+    session = Session()
+
+    try:
+        item = session.query(bootstrap.Soup).filter_by(uuid=uuid)[0]
+    except IndexError:
+        raise LookupError("Unable to locate object with UUID = '%s'." % uuid)
+        
+    # try to acquire relation target from session
+    if not ignore_cache:
+        try:
+            return session._d_pending[item.uuid]
+        except (AttributeError, KeyError):
+            pass
+
+    # build item
+    return build(item.spec, item.uuid)
+
+def build(spec, uuid):
+    kls = resolve(spec)
+    mapper = IMapper(kls)
+    
+    session = Session()
+    return session.query(mapper).filter_by(uuid=uuid)[0]
+
+def persist(item):
+    # create instance
+    instance = factory.create(item.__class__)
+
+    # assign uuid to item
+    item._d_uuid = instance.uuid
+
+    # hook into transaction
+    try:
+        manager = item._d_manager
+    except AttributeError:
+        manager = item._d_manager = getTransactionManager(item)
+        
+    manager.register()
+
+    # update attributes
+    update(instance, item)
+
+    return instance
+
+def update(instance, item):
+    # set attributes
+    for iface in interface.providedBy(item):
+        for name in iface.names():
+            value = getattr(item, name)
+            setattr(instance, name, value)
+



More information about the Checkins mailing list