[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