[Checkins] SVN: Products.SQLAlchemyDA/trunk/ Merged from zsql_commit_fix

Abdul Kader Maliyakkal akm.mail at gmail.com
Fri May 7 12:27:23 EDT 2010


Log message for revision 112155:
  Merged from zsql_commit_fix
  

Changed:
  _U  Products.SQLAlchemyDA/trunk/
  U   Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/__init__.py
  U   Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/da.py
  U   Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/tests/testSQLAlchemyDA.py
  A   Products.SQLAlchemyDA/trunk/bootstrap.py
  A   Products.SQLAlchemyDA/trunk/buildout.cfg
  U   Products.SQLAlchemyDA/trunk/setup.py

-=-

Property changes on: Products.SQLAlchemyDA/trunk
___________________________________________________________________
Added: svn:ignore
   + develop-eggs
dist
eggs
bin
parts
.installed.cfg


Modified: Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/__init__.py
===================================================================
--- Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/__init__.py	2010-05-07 16:02:53 UTC (rev 112154)
+++ Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/__init__.py	2010-05-07 16:27:22 UTC (rev 112155)
@@ -6,6 +6,7 @@
 # and ZOPYX Ltd. & Co. KG, Tuebingen, Germany
 ##########################################################################
 
+import os
 try:
     import z3c.sqlalchemy
 except ImportError:
@@ -14,12 +15,15 @@
 from config import ADD_SA_WRAPPER_PERMISSION
 
 
+
 def initialize(context):
+    from da import (SAWrapper, manage_addSAWrapper,
+                   manage_addSAWrapperForm)
+    from Shared.DC import ZRDB
 
-    from da import (SAWrapper, manage_addSAWrapper, 
-                   manage_addSAWrapperForm)
-    context.registerClass(SAWrapper, 
-                          constructors=(manage_addSAWrapperForm, 
+    icon_path = os.path.join(os.path.dirname(ZRDB.__file__), 'www', 'DBAdapterFolder_icon.gif')
+    context.registerClass(SAWrapper,
+                          constructors=(manage_addSAWrapperForm,
                                         manage_addSAWrapper),
-                          icon = SOFTWARE_HOME + '/Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif',
-                          permission=ADD_SA_WRAPPER_PERMISSION)                          
+                          icon=icon_path,
+                          permission=ADD_SA_WRAPPER_PERMISSION)

Modified: Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/da.py
===================================================================
--- Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/da.py	2010-05-07 16:02:53 UTC (rev 112154)
+++ Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/da.py	2010-05-07 16:27:22 UTC (rev 112155)
@@ -64,7 +64,8 @@
     transactional = True
     quoting_style = 'standard'
     _isAnSQLConnection = True
-
+    extra_engine_options = ()
+    
     security = ClassSecurityInfo()
 
     def __init__(self, id, title=''):
@@ -94,16 +95,33 @@
         if self.dsn:
             try:
                 return getSAWrapper(self.util_id)
-            except ValueError:               
+            except ValueError:
                 return createSAWrapper(self.dsn, 
                                        forZope=True, 
                                        transactional=self.transactional,
-                                       engine_options={'convert_unicode' : self.convert_unicode,
-                                                       'encoding' : self.encoding},
+                                       extension_options={'initial_state': 'invalidated'},
+                                       engine_options=self.engine_options,
                                        name=self.util_id)
         return None
 
+    @property
+    def engine_options(self):
+        engine_options = dict(self.extra_engine_options)
+        engine_options.update(convert_unicode=self.convert_unicode,
+                              encoding=self.encoding)
+        return engine_options
 
+    def add_extra_engine_options(self, engine_options):
+        """ engine_options is a tuple containing additional
+            options for sqlalchemy.create_engine.
+            Say you need to pass some engine options
+            to SQLAlchemy.create_engine::
+            wrapper = SAWrapper(id)
+            wrapper.add_extra_engine_options((('echo', True),
+                                              ('pool_size', 20)))
+        """
+        self.extra_engine_options = engine_options
+
     security.declareProtected(view_management_screens, 'getInfo')
     def getInfo(self):
         """ return a dict with additional information """

Modified: Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/tests/testSQLAlchemyDA.py
===================================================================
--- Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/tests/testSQLAlchemyDA.py	2010-05-07 16:02:53 UTC (rev 112154)
+++ Products.SQLAlchemyDA/trunk/Products/SQLAlchemyDA/tests/testSQLAlchemyDA.py	2010-05-07 16:27:22 UTC (rev 112155)
@@ -7,11 +7,14 @@
 """
 
 
-import sys, os, unittest
+import sys
+import os
+import unittest
 from Testing import ZopeTestCase
 
 import transaction
 from Products.SQLAlchemyDA.da import SAWrapper
+from Products.ZSQLMethods.SQL import manage_addZSQLMethod
 from z3c.sqlalchemy import createSAWrapper
 from z3c.sqlalchemy.mapper import MappedClassBase
 from sqlalchemy import MetaData, Table, Column, Integer, String, Unicode
@@ -19,66 +22,134 @@
 
 ZopeTestCase.installProduct('SQLAlchemyDA', 1)
 
-class SQLAlchemyDATests(ZopeTestCase.ZopeTestCase):
 
-    def afterSetUp(self):
+metadata = MetaData()
+test_table = Table('test', metadata,
+                   Column('id', Integer, primary_key=True),
+                   Column('utext', Unicode(255)),
+                   Column('text', String(255)))
 
-        self.dsn = os.environ.get('TEST_DSN', 'sqlite:///test')
-        wrapper = createSAWrapper(self.dsn)
-        metadata = MetaData(bind=wrapper.engine)
 
-        test_table = Table('test', metadata,
-                      Column('id', Integer, primary_key=True),
-                      Column('utext', Unicode(255)),
-                      Column('text', String(255)))
+class Test(MappedClassBase):
+    pass
 
-        class Test(MappedClassBase): pass
-        mapper(Test, test_table)
+mapper(Test, test_table)
 
-        metadata.create_all()
-        session = wrapper.session
-        t1 = Test(id=1, utext=u'Hello world', text='hello world')
-        t2 = Test(id=2, utext=u'foo', text='far')
-        session.save(t1)
-        session.save(t2)
 
+class TestBase(ZopeTestCase.ZopeTestCase):
 
-    def makeOne(self, **kw):
+    def createDA(self, **kw):
         factory = self.app.manage_addProduct['SQLAlchemyDA']
-        factory.manage_addSAWrapper(id='da', title='da',        
+        factory.manage_addSAWrapper(id='da', title='da',
                                     dsn=self.dsn,
                                     **kw)
         return self.app['da']
 
+
+class SQLAlchemyDATests(TestBase):
+
+    def afterSetUp(self):
+
+        self.dsn = os.environ.get('TEST_DSN', 'sqlite:///test')
+        wrapper = createSAWrapper(self.dsn)
+        metadata.bind = wrapper.engine
+        metadata.create_all()
+        session = wrapper.session
+        t1 = Test(id=1, utext=u'Hello world', text='hello world')
+        t2 = Test(id=2, utext=u'foo', text='far')
+        session.add(t1)
+        session.add(t2)
+
     def testSimpleSelect(self):
-        da = self.makeOne()
+        da = self.createDA()
         rows = da.query('select * from test')
         self.assertEqual(len(rows), 2)
-        
+
     def testSimpleInsert(self):
-        da = self.makeOne()
+        da = self.createDA()
         rows = da.query("insert into test (id, text) values(42, 'foo')")
-        
+
     def testSimpleUpdate(self):
-        da = self.makeOne()
+        da = self.createDA()
         rows = da.query("update test set text='bar'")
 
+    def testExtraEngineOptions(self):
+        da = self.createDA()
+        da.add_extra_engine_options((('echo', True),
+                                     ('pool_size', 20)))
+        self.assertEqual(da.engine_options['pool_size'], 20)
+
+
+class SQLAlchemyDAFunctionalTests(TestBase, ZopeTestCase.FunctionalTestCase):
+
+    def afterSetUp(self):
+        self.folder_path = '/' + self.folder.absolute_url(1)
+        self.dsn = os.environ.get('TEST_DSN', 'sqlite:///test')
+        wrapper = createSAWrapper(self.dsn)
+        metadata.bind = wrapper.engine
+        metadata.create_all()
+        self.session = wrapper.session
+
+    def testZsqlInsertWithCommit(self):
+        da = self.createDA()
+        template = "INSERT INTO test (id, text) VALUES (07, 'bar')"
+        manage_addZSQLMethod(self.app, 'zsql_id', 'title', 'da', '', template)
+        self.app['zsql_id']()
+        self.publish(self.folder_path)
+        rows = self.session.query(Test).all()
+        self.assertEqual(len(rows), 1)
+        
+    def testZsqlInsertWithRollback(self):
+        da = self.createDA()
+        template = "INSERT INTO test (id, text) VALUES (07, 'bar')"
+        manage_addZSQLMethod(self.app, 'zsql_id', 'title', 'da', '', template)
+        self.app['zsql_id']()
+        transaction.abort()
+        rows = self.session.query(Test).all()
+        self.assertEqual(len(rows), 0)
+        
+    def testORMInsertWithCommit(self):
+        t1 = Test(id=8, utext=u'Hello world', text='hello world')
+        t2 = Test(id=9, utext=u'foo', text='far')
+        self.session.add(t1)
+        self.session.add(t2)
+        self.publish(self.folder_path)
+        rows = self.session.query(Test).all()
+        self.assertEqual(len(rows), 2)
+        
+    def testORMInsertWithRollback(self):
+        t1 = Test(id=8, utext=u'Hello world', text='hello world')
+        t2 = Test(id=9, utext=u'foo', text='far')
+        self.session.add(t1)
+        self.session.add(t2)
+        transaction.abort()
+        rows = self.session.query(Test).all()
+        self.assertEqual(len(rows), 0)
+        
+    def beforeTearDown(self):
+        metadata.drop_all()
+
+
 def test_suite():
     s = unittest.TestSuite()
-    s.addTest(unittest.makeSuite(SQLAlchemyDATests))
+    s.addTests([unittest.makeSuite(SQLAlchemyDATests),
+               unittest.makeSuite(SQLAlchemyDAFunctionalTests)])
     return s
 
+
 def main():
     unittest.TextTestRunner().run(test_suite())
 
+
 def debug():
     test_suite().debug()
 
+
 def pdebug():
     import pdb
     pdb.run('debug()')
 
-if __name__=='__main__':
+if __name__ == '__main__':
     if len(sys.argv) > 1:
         globals()[sys.argv[1]]()
     else:

Copied: Products.SQLAlchemyDA/trunk/bootstrap.py (from rev 112154, Products.SQLAlchemyDA/branches/zsql_commit_fix/bootstrap.py)
===================================================================
--- Products.SQLAlchemyDA/trunk/bootstrap.py	                        (rev 0)
+++ Products.SQLAlchemyDA/trunk/bootstrap.py	2010-05-07 16:27:22 UTC (rev 112155)
@@ -0,0 +1,121 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 108946 2010-02-12 02:40:18Z yusei $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+from optparse import OptionParser
+
+tmpeggs = tempfile.mkdtemp()
+
+is_jython = sys.platform.startswith('java')
+
+# parsing arguments
+parser = OptionParser()
+parser.add_option("-v", "--version", dest="version",
+                          help="use a specific zc.buildout version")
+parser.add_option("-d", "--distribute",
+                   action="store_true", dest="distribute", default=False,
+                   help="Use Distribute rather than Setuptools.")
+
+parser.add_option("-c", None, action="store", dest="config_file",
+                   help=("Specify the path to the buildout configuration "
+                         "file to be used."))
+
+options, args = parser.parse_args()
+
+# if -c was provided, we push it back into args for buildout' main function
+if options.config_file is not None:
+    args += ['-c', options.config_file]
+
+if options.version is not None:
+    VERSION = '==%s' % options.version
+else:
+    VERSION = ''
+
+USE_DISTRIBUTE = options.distribute
+args = args + ['bootstrap']
+
+to_reload = False
+try:
+    import pkg_resources
+    if not hasattr(pkg_resources, '_distribute'):
+        to_reload = True
+        raise ImportError
+except ImportError:
+    ez = {}
+    if USE_DISTRIBUTE:
+        exec urllib2.urlopen('http://python-distribute.org/distribute_setup.py'
+                         ).read() in ez
+        ez['use_setuptools'](to_dir=tmpeggs, download_delay=0, no_fake=True)
+    else:
+        exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                             ).read() in ez
+        ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+    if to_reload:
+        reload(pkg_resources)
+    else:
+        import pkg_resources
+
+if sys.platform == 'win32':
+    def quote(c):
+        if ' ' in c:
+            return '"%s"' % c # work around spawn lamosity on windows
+        else:
+            return c
+else:
+    def quote (c):
+        return c
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+ws  = pkg_resources.working_set
+
+if USE_DISTRIBUTE:
+    requirement = 'distribute'
+else:
+    requirement = 'setuptools'
+
+if is_jython:
+    import subprocess
+
+    assert subprocess.Popen([sys.executable] + ['-c', quote(cmd), '-mqNxd',
+           quote(tmpeggs), 'zc.buildout' + VERSION],
+           env=dict(os.environ,
+               PYTHONPATH=
+               ws.find(pkg_resources.Requirement.parse(requirement)).location
+               ),
+           ).wait() == 0
+
+else:
+    assert os.spawnle(
+        os.P_WAIT, sys.executable, quote (sys.executable),
+        '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout' + VERSION,
+        dict(os.environ,
+            PYTHONPATH=
+            ws.find(pkg_resources.Requirement.parse(requirement)).location
+            ),
+        ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout' + VERSION)
+import zc.buildout.buildout
+zc.buildout.buildout.main(args)
+shutil.rmtree(tmpeggs)

Copied: Products.SQLAlchemyDA/trunk/buildout.cfg (from rev 112154, Products.SQLAlchemyDA/branches/zsql_commit_fix/buildout.cfg)
===================================================================
--- Products.SQLAlchemyDA/trunk/buildout.cfg	                        (rev 0)
+++ Products.SQLAlchemyDA/trunk/buildout.cfg	2010-05-07 16:27:22 UTC (rev 112155)
@@ -0,0 +1,11 @@
+[buildout]
+develop = .
+parts = test
+versions = versions
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = Products.SQLAlchemyDA[test]
+
+[versions]
+zope.testing = 3.9.3

Modified: Products.SQLAlchemyDA/trunk/setup.py
===================================================================
--- Products.SQLAlchemyDA/trunk/setup.py	2010-05-07 16:02:53 UTC (rev 112154)
+++ Products.SQLAlchemyDA/trunk/setup.py	2010-05-07 16:27:22 UTC (rev 112155)
@@ -22,7 +22,7 @@
 
 long_description = desc  + "\n\nCHANGES\n=======\n\n" + changes
 
-print long_description
+#print long_description
 
 setup(name='Products.SQLAlchemyDA',
       version=version,
@@ -40,6 +40,7 @@
       include_package_data = True,
       zip_safe=False,
       install_requires=['setuptools', 'z3c.sqlalchemy'],
+      extras_require = {'test': ['Zope2']},
       namespace_packages=['Products'],
 
       )



More information about the checkins mailing list