[Checkins] SVN: zope.sqlalchemy/trunk/ SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.

Laurence Rowe l at lrowe.co.uk
Mon Jun 7 11:38:31 EDT 2010


Log message for revision 113240:
  SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.

Changed:
  U   zope.sqlalchemy/trunk/CHANGES.txt
  U   zope.sqlalchemy/trunk/setup.py
  U   zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt
  U   zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
  U   zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py

-=-
Modified: zope.sqlalchemy/trunk/CHANGES.txt
===================================================================
--- zope.sqlalchemy/trunk/CHANGES.txt	2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/CHANGES.txt	2010-06-07 15:38:30 UTC (rev 113240)
@@ -4,6 +4,11 @@
 0.5 (unreleased)
 ----------------
 
+* Remove redundant session.flush() / session.clear() on savepoint operations.
+  These were only needed with SQLAlchemy 0.4.x. 
+
+* SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.
+
 * Add support for running ``python setup.py test``.
 
 * Pull in pysqlite explicitly as a test dependency.

Modified: zope.sqlalchemy/trunk/setup.py
===================================================================
--- zope.sqlalchemy/trunk/setup.py	2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/setup.py	2010-06-07 15:38:30 UTC (rev 113240)
@@ -27,7 +27,7 @@
 
     install_requires=[
       'setuptools',
-      'SQLAlchemy>=0.4.7,!=0.5.0beta1,!=0.5.0beta2,!=0.5.0beta3,!=0.5.0rc1,!=0.5.0rc2,!=0.5.0rc3,!=0.5.0rc4,!=0.5.0', # or >=0.5.1
+      'SQLAlchemy>=0.5.1',
       'transaction',
       'zope.interface',
       ],

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt	2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt	2010-06-07 15:38:30 UTC (rev 113240)
@@ -71,19 +71,9 @@
 scoped sessions. Zope and SQLAlchemy sessions are tied together by using the
 ZopeTransactionExtension from this package.
 
-    >>> if SA_0_5:
-    ...     Session = scoped_session(sessionmaker(bind=engine,
-    ...     twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension()))
+    >>> Session = scoped_session(sessionmaker(bind=engine,
+    ... twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension()))
 
-The exact arguments depend on the version. Under SQLAlchemy 0.4 we must also
-supply transactional=True (equivalent to autocommit=False, which is default
-under 0.5).
-
-    >>> if SA_0_4:
-    ...     Session = scoped_session(sessionmaker(bind=engine,
-    ...     twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension(),
-    ...     transactional=True, autoflush=True,))
-
 Call the scoped session factory to retrieve a session. You may call this as
 many times as you like within a transaction and you will always retrieve the
 same session. At present there are no users in the database.

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2010-06-07 15:38:30 UTC (rev 113240)
@@ -139,12 +139,10 @@
     def __init__(self, session):
         self.session = session
         self.transaction = session.begin_nested()
-        session.flush() # do I want to do this? Probably.
 
     def rollback(self):
         # no need to check validity, sqlalchemy should raise an exception. I think.
         self.transaction.rollback()
-        self.session.clear() # remove when Session.rollback does an attribute_manager.rollback
 
 
 def join_transaction(session, initial_state=STATUS_ACTIVE):

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py	2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py	2010-06-07 15:38:30 UTC (rev 113240)
@@ -37,10 +37,6 @@
 TEST_TWOPHASE = bool(os.environ.get('TEST_TWOPHASE'))
 TEST_DSN = os.environ.get('TEST_DSN', 'sqlite:///:memory:')
 
-SA_0_4 = sa.__version__.split('.')[:2] == ['0', '4']
-SA_0_5 = not SA_0_4
-
-
 class SimpleModel(object):
     def __init__(self, **kw):
         for k, v in kw.items():
@@ -55,32 +51,16 @@
 engine = sa.create_engine(TEST_DSN)
 engine2 = sa.create_engine(TEST_DSN)
 
-if SA_0_4:
-    Session = orm.scoped_session(orm.sessionmaker(
-        bind=engine,
-        extension=tx.ZopeTransactionExtension(),
-        transactional=True,
-        autoflush=True,
-        twophase=TEST_TWOPHASE,
-        ))
-    UnboundSession = orm.scoped_session(orm.sessionmaker(
-        extension=tx.ZopeTransactionExtension(),
-        transactional=True,
-        autoflush=True,
-        twophase=TEST_TWOPHASE,
-        ))
+Session = orm.scoped_session(orm.sessionmaker(
+    bind=engine,
+    extension=tx.ZopeTransactionExtension(),
+    twophase=TEST_TWOPHASE,
+    ))
+UnboundSession = orm.scoped_session(orm.sessionmaker(
+    extension=tx.ZopeTransactionExtension(),
+    twophase=TEST_TWOPHASE,
+    ))
 
-if SA_0_5:
-    Session = orm.scoped_session(orm.sessionmaker(
-        bind=engine,
-        extension=tx.ZopeTransactionExtension(),
-        twophase=TEST_TWOPHASE,
-        ))
-    UnboundSession = orm.scoped_session(orm.sessionmaker(
-        extension=tx.ZopeTransactionExtension(),
-        twophase=TEST_TWOPHASE,
-        ))
-
 metadata = sa.MetaData() # best to use unbound metadata
 
 test_users = sa.Table('test_users', metadata,
@@ -296,6 +276,27 @@
         
         s1.rollback()
         self.failIf(query.all(), "Users table should be empty")
+
+    def testRollbackAttributes(self):
+        use_savepoint = not engine.url.drivername in tx.NO_SAVEPOINT_SUPPORT
+        if not use_savepoint:
+            return # sqlite databases do not support savepoints
+        
+        t = transaction.get()
+        session = Session()
+        query = session.query(User)
+        self.failIf(query.all(), "Users table should be empty")
+        
+        s1 = t.savepoint()
+        user = User(id=1, firstname='udo', lastname='juergens')
+        session.add(user)
+        session.flush()
+        
+        s2 = t.savepoint()
+        user.firstname='heino'
+        session.flush()
+        s2.rollback()
+        self.assertEqual(user.firstname, 'udo', "User firstname attribute should have been rolled back")
     
     def testCommit(self):
         session = Session()
@@ -439,8 +440,6 @@
             raise thread_error # reraise in current thread
 
     def testBulkDelete(self):
-        if SA_0_4:
-            return
         session = Session()
         session.add(User(id=1, firstname='udo', lastname='juergens'))
         session.add(User(id=2, firstname='heino', lastname='n/a'))
@@ -452,8 +451,6 @@
         self.assertEqual(len(results.fetchall()), 0)
 
     def testBulkUpdate(self):
-        if SA_0_4:
-            return
         session = Session()
         session.add(User(id=1, firstname='udo', lastname='juergens'))
         session.add(User(id=2, firstname='heino', lastname='n/a'))
@@ -506,5 +503,5 @@
     for cls in (ZopeSQLAlchemyTests, MultipleEngineTests):
         suite.addTest(makeSuite(cls))
     suite.addTest(doctest.DocFileSuite('README.txt', optionflags=optionflags, tearDown=tearDownReadMe,
-        globs={'TEST_DSN': TEST_DSN, 'TEST_TWOPHASE': TEST_TWOPHASE, 'SA_0_4': SA_0_4, 'SA_0_5': SA_0_5}))
+        globs={'TEST_DSN': TEST_DSN, 'TEST_TWOPHASE': TEST_TWOPHASE}))
     return suite



More information about the checkins mailing list