[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