Show
Ignore:
Timestamp:
03/23/08 01:03:06 (10 months ago)
Author:
edsuom
Message:

VERSION 0.7: Updated to work with SA 0.4

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • projects/sAsync/trunk/sasync/database.py

    r128 r129  
    2828from twisted.internet import defer 
    2929from twisted.python import failure 
     30 
    3031import sqlalchemy as SA 
    31 from sqlalchemy.orm import create_session 
     32 
     33###################################################################### 
     34# SA 0.4 support contributed by Ricky Iacovou,  based upon: 
     35
     36#   http://www.sqlalchemy.org/docs/04/intro.html#overview_migration 
     37
     38# Determine the version of SQLAlchemy used, 0.3 or 0.4, and set the 
     39# Boolean variable "SA04" accordingly. 
     40
     41# We could also use a capability-based approach, like: 
     42
     43# try: 
     44#     MetaData = SA.BoundMetaData 
     45# except AttributeError: 
     46#     MetaData = SA.MetaData 
     47
     48# However, late 0.3.x versions also supported some 0.4 constructs, 
     49# so better use an explicit 0.3.x -> 0.4.x cutoff in order to avoid 
     50# ambiguity. 
     51###################################################################### 
     52_sv = SA.__version__.split ('.') 
     53try: 
     54    _v = int (_sv[0]) + (int(_sv[1]) / 10.0) 
     55except: 
     56    # Not strictly an Import Error, but close enough. 
     57    raise ImportError("Failed to determine SQLAlchemy version: %s", _sv) 
     58if _v >= 0.4: 
     59    SA04 = True 
     60else: 
     61    SA04 = False 
     62del _sv, _v 
     63# End of version check 
     64 
    3265 
    3366from asynqueue import ThreadQueue 
     
    287320        def createEngine(): 
    288321            url, kw = self.engineParams 
     322            # The 'threadlocal' keyword value is unchanged from SA 0.3 to 0.4 
    289323            kw['strategy'] = 'threadlocal' 
    290324            return SA.create_engine(url, **kw) 
     
    331365        """ 
    332366        def gotConnection(connection): 
    333             d = self.q.call(create_session, connection, doNext=True) 
     367            if SA04: 
     368                d = self.q.call( 
     369                    SA.orm.create_session, bind=connection, doNext=True) 
     370            else: 
     371                d = self.q.call( 
     372                    SA.create_session, bind_to=connection, doNext=True) 
    334373            d.addCallback(gotSession) 
    335374            return d 
     
    360399        def _table(): 
    361400            if not hasattr(self, '_meta'): 
    362                 self._meta = SA.MetaData(self._engine) 
     401                if SA04: 
     402                    self._meta = SA.MetaData(self._engine) 
     403                else: 
     404                    self._meta = SA.BoundMetaData(self._engine) 
    363405            indexes = {} 
    364406            for key in kw.keys(): 
  • projects/sAsync/trunk/sasync/items.py

    r3 r129  
    141141        self.sasync_items.delete( 
    142142            SA.and_(items.c.group_id == self.groupID, 
    143                     items.c.name.in_(*names))).execute() 
     143                    items.c.name.in_(names))).execute() 
    144144     
    145145    @transact 
  • projects/sAsync/trunk/sasync/test/test_database.py

    r3 r129  
    8585            'people', 
    8686            Column('id', Integer, primary_key=True), 
    87             Column('name_first', String), 
    88             Column('name_last', String)) 
     87            Column('name_first', String(32)), 
     88            Column('name_last', String(32))) 
    8989        d.addCallbacks(self.insertions, self.oops) 
    9090        return d 
     
    172172            'people', 
    173173            Column('id', Integer, primary_key=True), 
    174             Column('name_first', String), 
    175             Column('name_last', String)) 
     174            Column('name_first', String(32)), 
     175            Column('name_last', String(32))) 
    176176        return d 
    177177 
     
    333333                'very_cool_table', 
    334334                Column('id', Integer, primary_key=True), 
    335                 Column('Whatever', String)) 
     335                Column('Whatever', String(32))) 
    336336 
    337337        def gotTable(table): 
     
    353353                'singleton', 
    354354                Column('id', Integer, primary_key=True), 
    355                 Column('foobar', String)) 
     355                Column('foobar', String(32))) 
    356356        return DeferredList([create(), create()]) 
    357357 
     
    361361                'table_indexed', 
    362362                Column('id', Integer, primary_key=True), 
    363                 Column('foo', String), 
    364                 Column('bar', String), 
     363                Column('foo', String(32)), 
     364                Column('bar', String(64)), 
    365365                index_foobar=['foo', 'bar'] 
    366366                ) 
     
    374374                'table_unique', 
    375375                Column('id', Integer, primary_key=True), 
    376                 Column('foo', String), 
    377                 Column('bar', String), 
     376                Column('foo', String(32)), 
     377                Column('bar', String(64)), 
    378378                unique_foobar=['foo', 'bar'] 
    379379                ) 
     
    425425                'foobars', 
    426426                Column('id', Integer, primary_key=True), 
    427                 Column('foobar', String)) 
     427                Column('foobar', String(64))) 
    428428            return d 
    429429         
  • projects/sAsync/trunk/sasync/test/test_orm.py

    r5 r129  
    2929 
    3030import sqlalchemy as SA 
     31from sqlalchemy.orm import mapper, relation 
    3132 
    3233from sasync.database import AccessBroker, transact 
     
    7879    def startup(self): 
    7980        def gotTables(null): 
    80             relation = SA.relation(SA.mapper
    81                 Address, self.addresses), cascade="all, delete-orphan") 
    82             properties = {'addresses':relation} 
    83             SA.mapper(User, self.users, properties) 
    84  
     81            r = relation
     82                Address, backref='user', cascade="all, delete, delete-orphan") 
     83            mapper(User, self.users, properties={'addresses':r}) 
     84            mapper(Address, self.addresses) 
     85         
    8586        d = self.table( 
    8687            'users', 
     
    126127    @transact 
    127128    def getResidents(self, state): 
    128         users = self.session.query(User).select_by(state=state) 
     129        users = self.session.query(User).join('addresses').filter_by(state=state) 
    129130        return [x.user_name for x in users] 
    130131     
    131132    @transact 
    132133    def getTarzan(self): 
    133         return self.session.query(User).get_by(user_name='tarzan'
     134        return self.session.query(User).filter_by(user_name='tarzan').one(
    134135     
    135136    @transact 
    136137    def getJane(self): 
    137         return self.session.query(User).get_by(user_name='jane'
     138        return self.session.query(User).filter_by(user_name='jane').one(
    138139     
    139140    @transact 
     
    155156        return d 
    156157     
    157     def testSimpleJoinQuery(self): 
     158    def test_query_bothStates(self): 
    158159        d = self.broker.setJane(session=True) 
    159160        d = self.broker.setTarzan(session=True) 
    160161        d.addCallback(lambda _: self.broker.getResidents('UT', session=True)) 
    161162        d.addCallback(self.failUnlessEqual, ['jane', 'tarzan']) 
     163        return d 
     164 
     165    def test_query_oneState(self): 
     166        d = self.broker.setJane(session=True) 
     167        d = self.broker.setTarzan(session=True) 
     168        d.addCallback(lambda _: self.broker.getResidents('OK', session=True)) 
     169        d.addCallback(self.failUnlessEqual, ['jane']) 
    162170        return d 
    163171 
     
    173181    @defer.deferredGenerator 
    174182    def testDeleteUser(self): 
    175         yield defer.waitForDeferred(self.broker.setJane(session=True)) 
    176         yield defer.waitForDeferred(self.broker.setTarzan(session=True)) 
    177  
     183        # Setup Tarzan & Jane 
     184        wfd = defer.waitForDeferred(self.broker.setJane(session=True)) 
     185        yield wfd; wfd.getResult() 
     186        wfd = defer.waitForDeferred(self.broker.setTarzan(session=True)) 
     187        yield wfd; wfd.getResult() 
     188        # Delete Jane 
    178189        wfd = defer.waitForDeferred(self.broker.getJane(session=True)) 
    179190        yield wfd 
    180191        user = wfd.getResult() 
    181         yield defer.waitForDeferred( 
    182             self.broker.deleteUser(user, session=True)) 
    183  
    184         wfd = defer.waitForDeferred( 
    185             self.broker.getResidents('UT', session=True)) 
     192        wfd = defer.waitForDeferred(self.broker.deleteUser(user, session=True)) 
     193        yield wfd; wfd.getResult() 
     194        # Make sure only Tarzan is listed for a Utah address 
     195        wfd = defer.waitForDeferred(self.broker.getResidents('UT', session=True)) 
    186196        yield wfd 
    187197        self.failUnlessEqual(wfd.getResult(), ['tarzan']) 
  • projects/sAsync/trunk/setup.py

    r68 r129  
    3838 
    3939### Define setup options 
    40 kw = {'version':'0.6', 
     40kw = {'version':'0.7', 
    4141      'license':'GPL', 
    4242      'platforms':'OS Independent',