]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- sqlalchemy.test and nose plugin moves back to being entirely
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 28 Nov 2010 19:19:44 +0000 (14:19 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 28 Nov 2010 19:19:44 +0000 (14:19 -0500)
outside of "sqlalchemy" and under "test/".

Rationale:

- coverage plugin works without issue, without need for an awkward
additional package install
- command line for "nosetests" isn't polluted with SQLAlchemy options

[ticket:1949]

53 files changed:
1  2 
setup.cfg
test/aaa_profiling/test_compiler.py
test/aaa_profiling/test_memusage.py
test/aaa_profiling/test_orm.py
test/aaa_profiling/test_pool.py
test/base/test_dependency.py
test/base/test_events.py
test/bootstrap/noseplugin.py
test/dialect/test_mysql.py
test/dialect/test_postgresql.py
test/dialect/test_sqlite.py
test/engine/test_ddlevents.py
test/engine/test_execute.py
test/engine/test_metadata.py
test/engine/test_pool.py
test/engine/test_reconnect.py
test/engine/test_reflection.py
test/engine/test_transaction.py
test/ext/test_declarative.py
test/ext/test_horizontal_shard.py
test/ext/test_serializer.py
test/lib/assertsql.py
test/lib/engines.py
test/lib/requires.py
test/lib/util.py
test/orm/inheritance/test_basic.py
test/orm/inheritance/test_poly_linked_list.py
test/orm/inheritance/test_polymorph.py
test/orm/inheritance/test_query.py
test/orm/test_assorted_eager.py
test/orm/test_attributes.py
test/orm/test_backref_mutations.py
test/orm/test_cascade.py
test/orm/test_collection.py
test/orm/test_compile.py
test/orm/test_defaults.py
test/orm/test_eager_relations.py
test/orm/test_expire.py
test/orm/test_extendedattr.py
test/orm/test_generative.py
test/orm/test_instrumentation.py
test/orm/test_manytomany.py
test/orm/test_mapper.py
test/orm/test_merge.py
test/orm/test_pickled.py
test/orm/test_query.py
test/orm/test_relationships.py
test/orm/test_scoping.py
test/orm/test_session.py
test/orm/test_unitofwork.py
test/orm/test_utils.py
test/sql/test_compiler.py
test/sql/test_generative.py

diff --cc setup.cfg
index df713b739dc7646175a78ecd5bdb826cc689666f,df713b739dc7646175a78ecd5bdb826cc689666f..bb8fe0543dfe10fab0e4f9a98e5fb5321a3ca816
+++ b/setup.cfg
@@@ -2,6 -2,6 +2,6 @@@
  tag_build = dev
  
  [nosetests]
--with-sqlalchemy = true
++with-_sqlalchemy = true
  exclude = ^examples
  first-package-wins = true
Simple merge
Simple merge
Simple merge
Simple merge
index 605a16cc340d8e278a4d135f73c8aab619b5f7dc,9f6344de71151bb024256f5035abbcb9b66d1be6..6d4662be564210218bd53c85ef1e67acc5a78b37
@@@ -1,7 -1,6 +1,7 @@@
  import sqlalchemy.topological as topological
- from sqlalchemy.test import TestBase
- from sqlalchemy.test.testing import assert_raises, eq_
- from sqlalchemy.test.util import conforms_partial_ordering
+ from test.lib import TestBase
+ from test.lib.testing import assert_raises, eq_
++from test.lib.util import conforms_partial_ordering
  from sqlalchemy import exc, util
  
  
index 2920598775e29283642d4e3d419fb168efcac59e,0000000000000000000000000000000000000000..1baed241b004d7f5d7ff1e7b82a0eb928d9b6444
mode 100644,000000..100644
--- /dev/null
@@@ -1,264 -1,0 +1,264 @@@
- from sqlalchemy.test.testing import TestBase, eq_, assert_raises
 +"""Test event registration and listening."""
 +
++from test.lib.testing import TestBase, eq_, assert_raises
 +from sqlalchemy import event, exc, util
 +
 +class TestEvents(TestBase):
 +    """Test class- and instance-level event registration."""
 +    
 +    def setUp(self):
 +        global Target
 +        
 +        assert 'on_event_one' not in event._registrars
 +        assert 'on_event_two' not in event._registrars
 +        
 +        class TargetEvents(event.Events):
 +            def on_event_one(self, x, y):
 +                pass
 +            
 +            def on_event_two(self, x):
 +                pass
 +                
 +        class Target(object):
 +            dispatch = event.dispatcher(TargetEvents)
 +    
 +    def tearDown(self):
 +        event._remove_dispatcher(Target.__dict__['dispatch'].events)
 +    
 +    def test_register_class(self):
 +        def listen(x, y):
 +            pass
 +        
 +        event.listen(listen, "on_event_one", Target)
 +        
 +        eq_(len(Target().dispatch.on_event_one), 1)
 +        eq_(len(Target().dispatch.on_event_two), 0)
 +
 +    def test_register_instance(self):
 +        def listen(x, y):
 +            pass
 +        
 +        t1 = Target()
 +        event.listen(listen, "on_event_one", t1)
 +
 +        eq_(len(Target().dispatch.on_event_one), 0)
 +        eq_(len(t1.dispatch.on_event_one), 1)
 +        eq_(len(Target().dispatch.on_event_two), 0)
 +        eq_(len(t1.dispatch.on_event_two), 0)
 +    
 +    def test_register_class_instance(self):
 +        def listen_one(x, y):
 +            pass
 +
 +        def listen_two(x, y):
 +            pass
 +
 +        event.listen(listen_one, "on_event_one", Target)
 +        
 +        t1 = Target()
 +        event.listen(listen_two, "on_event_one", t1)
 +
 +        eq_(len(Target().dispatch.on_event_one), 1)
 +        eq_(len(t1.dispatch.on_event_one), 2)
 +        eq_(len(Target().dispatch.on_event_two), 0)
 +        eq_(len(t1.dispatch.on_event_two), 0)
 +        
 +        def listen_three(x, y):
 +            pass
 +        
 +        event.listen(listen_three, "on_event_one", Target)
 +        eq_(len(Target().dispatch.on_event_one), 2)
 +        eq_(len(t1.dispatch.on_event_one), 3)
 +        
 +class TestAcceptTargets(TestBase):
 +    """Test default target acceptance."""
 +    
 +    def setUp(self):
 +        global TargetOne, TargetTwo
 +        
 +        class TargetEventsOne(event.Events):
 +            def on_event_one(self, x, y):
 +                pass
 +
 +        class TargetEventsTwo(event.Events):
 +            def on_event_one(self, x, y):
 +                pass
 +                
 +        class TargetOne(object):
 +            dispatch = event.dispatcher(TargetEventsOne)
 +
 +        class TargetTwo(object):
 +            dispatch = event.dispatcher(TargetEventsTwo)
 +    
 +    def tearDown(self):
 +        event._remove_dispatcher(TargetOne.__dict__['dispatch'].events)
 +        event._remove_dispatcher(TargetTwo.__dict__['dispatch'].events)
 +        
 +    def test_target_accept(self):
 +        """Test that events of the same name are routed to the correct
 +        collection based on the type of target given.
 +        
 +        """
 +        def listen_one(x, y):
 +            pass
 +
 +        def listen_two(x, y):
 +            pass
 +        
 +        def listen_three(x, y):
 +            pass
 +
 +        def listen_four(x, y):
 +            pass
 +            
 +        event.listen(listen_one, "on_event_one", TargetOne)
 +        event.listen(listen_two, "on_event_one", TargetTwo)
 +        
 +        eq_(
 +            list(TargetOne().dispatch.on_event_one),
 +            [listen_one]
 +        )
 +
 +        eq_(
 +            list(TargetTwo().dispatch.on_event_one),
 +            [listen_two]
 +        )
 +
 +        t1 = TargetOne()
 +        t2 = TargetTwo()
 +
 +        event.listen(listen_three, "on_event_one", t1)
 +        event.listen(listen_four, "on_event_one", t2)
 +        
 +        eq_(
 +            list(t1.dispatch.on_event_one),
 +            [listen_one, listen_three]
 +        )
 +
 +        eq_(
 +            list(t2.dispatch.on_event_one),
 +            [listen_two, listen_four]
 +        )
 +        
 +class TestCustomTargets(TestBase):
 +    """Test custom target acceptance."""
 +
 +    def setUp(self):
 +        global Target
 +        
 +        class TargetEvents(event.Events):
 +            @classmethod
 +            def accept_with(cls, target):
 +                if target == 'one':
 +                    return Target
 +                else:
 +                    return None
 +                    
 +            def on_event_one(self, x, y):
 +                pass
 +
 +        class Target(object):
 +            dispatch = event.dispatcher(TargetEvents)
 +
 +    def tearDown(self):
 +        event._remove_dispatcher(Target.__dict__['dispatch'].events)
 +    
 +    def test_indirect(self):
 +        def listen(x, y):
 +            pass
 +        
 +        event.listen(listen, "on_event_one", "one")
 +
 +        eq_(
 +            list(Target().dispatch.on_event_one),
 +            [listen]
 +        )
 +        
 +        assert_raises(
 +            exc.InvalidRequestError, 
 +            event.listen,
 +            listen, "on_event_one", Target
 +        )
 +        
 +class TestListenOverride(TestBase):
 +    """Test custom listen functions which change the listener function signature."""
 +    
 +    def setUp(self):
 +        global Target
 +        
 +        class TargetEvents(event.Events):
 +            @classmethod
 +            def listen(cls, fn, identifier, target, add=False):
 +                if add:
 +                    def adapt(x, y):
 +                        fn(x + y)
 +                else:
 +                    adapt = fn
 +                    
 +                event.Events.listen(adapt, identifier, target)
 +                    
 +            def on_event_one(self, x, y):
 +                pass
 +
 +        class Target(object):
 +            dispatch = event.dispatcher(TargetEvents)
 +
 +    def tearDown(self):
 +        event._remove_dispatcher(Target.__dict__['dispatch'].events)
 +    
 +    def test_listen_override(self):
 +        result = []
 +        def listen_one(x):
 +            result.append(x)
 +            
 +        def listen_two(x, y):
 +            result.append((x, y))
 +        
 +        event.listen(listen_one, "on_event_one", Target, add=True)
 +        event.listen(listen_two, "on_event_one", Target)
 +
 +        t1 = Target()
 +        t1.dispatch.on_event_one(5, 7)
 +        t1.dispatch.on_event_one(10, 5)
 +        
 +        eq_(result,
 +            [
 +                12, (5, 7), 15, (10, 5)
 +            ]
 +        )
 +        
 +class TestPropagate(TestBase):
 +    def setUp(self):
 +        global Target
 +        
 +        class TargetEvents(event.Events):
 +            def on_event_one(self, arg):
 +                pass
 +            
 +            def on_event_two(self, arg):
 +                pass
 +                
 +        class Target(object):
 +            dispatch = event.dispatcher(TargetEvents)
 +            
 +    
 +    def test_propagate(self):
 +        result = []
 +        def listen_one(target, arg):
 +            result.append((target, arg))
 +
 +        def listen_two(target, arg):
 +            result.append((target, arg))
 +        
 +        t1 = Target()
 +        
 +        event.listen(listen_one, "on_event_one", t1, propagate=True)
 +        event.listen(listen_two, "on_event_two", t1)
 +
 +        t2 = Target()
 +        
 +        t2.dispatch.update(t1.dispatch)
 +        
 +        t2.dispatch.on_event_one(t2, 1)
 +        t2.dispatch.on_event_two(t2, 2)
 +        eq_(result, [(t2, 1)])
index 8732142f7d323f8e107da2805c2e1c71ed5deec5,1be8be5220fc6f24d874b02132ae078adf3973c9..c2a152aa6ecb9e4156f26a62125e3136bdce36fc
@@@ -24,7 -24,7 +24,10 @@@ class NoseSQLAlchemy(Plugin)
      Handles the setup and extra properties required for testing SQLAlchemy
      """
      enabled = True
--    name = 'sqlalchemy'
++    
++    # nose 1.0 will allow us to replace the old "sqlalchemy" plugin,
++    # if installed, using the same name, but nose 1.0 isn't released yet...
++    name = '_sqlalchemy'
      score = 100
  
      def options(self, parser, env=os.environ):
index 499fd7bd25b1153653c372d3221b96a8849b6fca,02e317b024b89b1bd89212dfda0f70207649b82e..7b06f412a56e5f934d75b0a203dd9d0a57ce0f65
@@@ -7,11 -7,11 +7,11 @@@ import set
  # end Py2K
  
  from sqlalchemy import *
 -from sqlalchemy import sql, exc, schema, types as sqltypes
 +from sqlalchemy import sql, exc, schema, types as sqltypes, event
  from sqlalchemy.dialects.mysql import base as mysql
- from sqlalchemy.test.testing import eq_
- from sqlalchemy.test import *
- from sqlalchemy.test.engines import utf8_engine
+ from test.lib.testing import eq_
+ from test.lib import *
+ from test.lib.engines import utf8_engine
  import datetime
  
  class TypesTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL):
Simple merge
index d42e8dde9efd289aacd5a7b28d8996f30645d7e4,90036147b993bffe9ed60e2e3c5a0f3578294356..34f5927edfc7d6d5d8f1c9ee1d003605e1018208
@@@ -4,10 -4,10 +4,10 @@@ from test.lib.testing import eq_, asser
      assert_raises_message
  import datetime
  from sqlalchemy import *
 -from sqlalchemy import exc, sql, schema
 +from sqlalchemy import exc, sql, schema, pool
  from sqlalchemy.dialects.sqlite import base as sqlite, \
      pysqlite as pysqlite_dialect
- from sqlalchemy.test import *
+ from test.lib import *
  
  
  class TestTypes(TestBase, AssertsExecutionResults):
index d0e8af81dfa04cf394a9ca6d65272405ef8a3993,cc4f8b0e4d4bab117c3120ffd919f75b88bd91aa..733cc1fcf5d2f7b6b03b3e403d17027bac4f2099
@@@ -2,12 -2,12 +2,12 @@@ from test.lib.testing import assert_rai
  from sqlalchemy.schema import DDL, CheckConstraint, AddConstraint, \
      DropConstraint
  from sqlalchemy import create_engine
 -from sqlalchemy import MetaData, Integer, String
 +from sqlalchemy import MetaData, Integer, String, event, exc, text
- from sqlalchemy.test.schema import Table
- from sqlalchemy.test.schema import Column
+ from test.lib.schema import Table
+ from test.lib.schema import Column
  import sqlalchemy as tsa
- from sqlalchemy.test import TestBase, testing, engines
- from sqlalchemy.test.testing import AssertsCompiledSQL, eq_
+ from test.lib import TestBase, testing, engines
 -from test.lib.testing import AssertsCompiledSQL
++from test.lib.testing import AssertsCompiledSQL, eq_
  from nose import SkipTest
  
  class DDLEventTest(TestBase):
index 7334f755a42341187dfc8ef648cb1ac798ebd3ac,9b63945fb8b64b2d8f0e74414297cda6b6aa64be..6b0e86e2f5706777476f0bde9934b8afe4049d9d
@@@ -2,10 -2,10 +2,10 @@@ from test.lib.testing import eq_, asser
  import re
  from sqlalchemy.interfaces import ConnectionProxy
  from sqlalchemy import MetaData, Integer, String, INT, VARCHAR, func, \
 -    bindparam, select
 +    bindparam, select, event
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  import sqlalchemy as tsa
- from sqlalchemy.test import TestBase, testing, engines
+ from test.lib import TestBase, testing, engines
  import logging
  from sqlalchemy.dialects.oracle.zxjdbc import ReturningParam
  
Simple merge
index 06c9ac06517f8c937eaded034ce94a6117ffbf30,a278b563a99187779e71c932b2b4ccc103446f59..4da3a08e3aabdfd0d32a757091acabfe1dd7a4a0
@@@ -1,9 -1,9 +1,9 @@@
  import threading, time
 -from sqlalchemy import pool, interfaces, create_engine, select
 +from sqlalchemy import pool, interfaces, create_engine, select, event
  import sqlalchemy as tsa
- from sqlalchemy.test import TestBase, testing
- from sqlalchemy.test.util import gc_collect, lazy_gc
- from sqlalchemy.test.testing import eq_
+ from test.lib import TestBase, testing
+ from test.lib.util import gc_collect, lazy_gc
+ from test.lib.testing import eq_
  
  mcid = 1
  class MockDBAPI(object):
Simple merge
Simple merge
Simple merge
index 32173cdc1c2a609e832087328222161ca6e07efc,9d7ee255a46be7ee4d3cac16280e37cf5271b0be..85692161b6fbaf89b338df459582146fc8a3c68f
@@@ -4,14 -4,14 +4,14 @@@ from test.lib.testing import eq_, asser
  from sqlalchemy.ext import declarative as decl
  from sqlalchemy import exc
  import sqlalchemy as sa
- from sqlalchemy.test import testing
+ from test.lib import testing
  from sqlalchemy import MetaData, Integer, String, ForeignKey, \
      ForeignKeyConstraint, asc, Index
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  from sqlalchemy.orm import relationship, create_session, class_mapper, \
 -    joinedload, compile_mappers, backref, clear_mappers, \
 +    joinedload, configure_mappers, backref, clear_mappers, \
      polymorphic_union, deferred, column_property
- from sqlalchemy.test.testing import eq_
+ from test.lib.testing import eq_
  from sqlalchemy.util import classproperty
  from test.orm._base import ComparableEntity, MappedTest
  from sqlalchemy.ext.declarative import declared_attr
Simple merge
index 24626bc8e4e4e89abc42d579b9b004e8eb76679a,09a6504a3c9607c0a3c86165612ba0c38fd1f014..862a871afc46ac47bfd2e49146355058fa364149
@@@ -2,14 -2,14 +2,14 @@@
  from sqlalchemy.ext import serializer
  from sqlalchemy import exc
  import sqlalchemy as sa
- from sqlalchemy.test import testing
+ from test.lib import testing
  from sqlalchemy import MetaData, Integer, String, ForeignKey, select, \
      desc, func, util
- from sqlalchemy.test.schema import Table
- from sqlalchemy.test.schema import Column
+ from test.lib.schema import Table
+ from test.lib.schema import Column
  from sqlalchemy.orm import relationship, sessionmaker, scoped_session, \
 -    class_mapper, mapper, joinedload, compile_mappers, aliased
 +    class_mapper, mapper, joinedload, configure_mappers, aliased
- from sqlalchemy.test.testing import eq_
+ from test.lib.testing import eq_
  from test.orm._base import ComparableEntity, MappedTest
  
  
index dee63a876da4c9bd26c4cdc52d9cd83081e4a60c,a044f9d02fbef8d610fbed41032e100eb9949e39..b206f91fc9fabedbc6a8cb283bc4225b3ea333ee
@@@ -6,35 -6,35 +6,40 @@@ from sqlalchemy import uti
  import re
  
  class AssertRule(object):
++
      def process_execute(self, clauseelement, *multiparams, **params):
          pass
  
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          pass
--        
++
      def is_consumed(self):
          """Return True if this rule has been consumed, False if not.
          
--        Should raise an AssertionError if this rule's condition has definitely failed.
++        Should raise an AssertionError if this rule's condition has
++        definitely failed.
          
          """
++
          raise NotImplementedError()
--    
++
      def rule_passed(self):
--        """Return True if the last test of this rule passed, False if failed, None if no test was applied."""
--        
++        """Return True if the last test of this rule passed, False if
++        failed, None if no test was applied."""
++
          raise NotImplementedError()
--        
++
      def consume_final(self):
          """Return True if this rule has been consumed.
          
--        Should raise an AssertionError if this rule's condition has not been consumed or has failed.
++        Should raise an AssertionError if this rule's condition has not
++        been consumed or has failed.
          
          """
--        
++
          if self._result is None:
--            assert False, "Rule has not been consumed"
--            
++            assert False, 'Rule has not been consumed'
          return self.is_consumed()
  
  class SQLMatchRule(AssertRule):
          return True
      
  class ExactSQL(SQLMatchRule):
++
      def __init__(self, sql, params=None):
          SQLMatchRule.__init__(self)
          self.sql = sql
          self.params = params
--    
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          if not context:
              return
--            
--        _received_statement = _process_engine_statement(context.unicode_statement, context)
++        _received_statement = \
++            _process_engine_statement(context.unicode_statement,
++                context)
          _received_parameters = context.compiled_parameters
--        
--        # TODO: remove this step once all unit tests
--        # are migrated, as ExactSQL should really be *exact* SQL 
++
++        # TODO: remove this step once all unit tests are migrated, as
++        # ExactSQL should really be *exact* SQL
++
          sql = _process_assertion_statement(self.sql, context)
--        
          equivalent = _received_statement == sql
          if self.params:
              if util.callable(self.params):
                  params = self.params(context)
              else:
                  params = self.params
--
              if not isinstance(params, list):
                  params = [params]
--            equivalent = equivalent and params == context.compiled_parameters
++            equivalent = equivalent and params \
++                == context.compiled_parameters
          else:
              params = {}
--        
--        
          self._result = equivalent
          if not self._result:
--            self._errmsg = "Testing for exact statement %r exact params %r, " \
--                "received %r with params %r" % (sql, params, _received_statement, _received_parameters)
++            self._errmsg = \
++                'Testing for exact statement %r exact params %r, '\
++                'received %r with params %r' % (sql, params,
++                    _received_statement, _received_parameters)
      
  
  class RegexSQL(SQLMatchRule):
++
      def __init__(self, regex, params=None):
          SQLMatchRule.__init__(self)
          self.regex = re.compile(regex)
          self.orig_regex = regex
          self.params = params
  
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          if not context:
              return
--
--        _received_statement = _process_engine_statement(context.unicode_statement, context)
++        _received_statement = \
++            _process_engine_statement(context.unicode_statement,
++                context)
          _received_parameters = context.compiled_parameters
--
          equivalent = bool(self.regex.match(_received_statement))
          if self.params:
              if util.callable(self.params):
                  params = self.params(context)
              else:
                  params = self.params
--
              if not isinstance(params, list):
                  params = [params]
--            
++
              # do a positive compare only
++
              for param, received in zip(params, _received_parameters):
                  for k, v in param.iteritems():
                      if k not in received or received[k] != v:
                          break
          else:
              params = {}
--
          self._result = equivalent
          if not self._result:
--            self._errmsg = "Testing for regex %r partial params %r, "\
--                "received %r with params %r" % (self.orig_regex, params, _received_statement, _received_parameters)
++            self._errmsg = \
++                'Testing for regex %r partial params %r, received %r '\
++                'with params %r' % (self.orig_regex, params,
++                                    _received_statement,
++                                    _received_parameters)
  
  class CompiledSQL(SQLMatchRule):
++
      def __init__(self, statement, params):
          SQLMatchRule.__init__(self)
          self.statement = statement
          self.params = params
  
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          if not context:
              return
--
          _received_parameters = list(context.compiled_parameters)
--        
++
          # recompile from the context, using the default dialect
--        compiled = context.compiled.statement.\
--                compile(dialect=DefaultDialect(), column_keys=context.compiled.column_keys)
--                
++
++        compiled = \
++            context.compiled.statement.compile(dialect=DefaultDialect(),
++                column_keys=context.compiled.column_keys)
          _received_statement = re.sub(r'\n', '', str(compiled))
--        
          equivalent = self.statement == _received_statement
          if self.params:
              if util.callable(self.params):
                  params = self.params(context)
              else:
                  params = self.params
--
              if not isinstance(params, list):
                  params = [params]
--            
              all_params = list(params)
              all_received = list(_received_parameters)
              while params:
                  param = dict(params.pop(0))
                  for k, v in context.compiled.params.iteritems():
                      param.setdefault(k, v)
--                    
                  if param not in _received_parameters:
                      equivalent = False
                      break
                  equivalent = False
          else:
              params = {}
--
          self._result = equivalent
          if not self._result:
-             print "Testing for compiled statement %r partial params %r, " \
-                     "received %r with params %r" % \
-                     (self.statement, all_params, _received_statement, all_received)
-                     
--            self._errmsg = "Testing for compiled statement %r partial params %r, " \
--                    "received %r with params %r" % \
--                    (self.statement, all_params, _received_statement, all_received)
--            #print self._errmsg
++            print 'Testing for compiled statement %r partial params '\
++                '%r, received %r with params %r' % (self.statement,
++                    all_params, _received_statement, all_received)
++            self._errmsg = \
++                'Testing for compiled statement %r partial params %r, '\
++                'received %r with params %r' % (self.statement,
++                    all_params, _received_statement, all_received)
++
++
++            # print self._errmsg
      
--        
  class CountStatements(AssertRule):
++
      def __init__(self, count):
          self.count = count
          self._statement_count = 0
--        
++
      def process_execute(self, clauseelement, *multiparams, **params):
          self._statement_count += 1
  
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          pass
  
      def is_consumed(self):
          return False
--    
++
      def consume_final(self):
--        assert self.count == self._statement_count, "desired statement count %d does not match %d" % (self.count, self._statement_count)
++        assert self.count == self._statement_count, \
++            'desired statement count %d does not match %d' \
++            % (self.count, self._statement_count)
          return True
          
  class AllOf(AssertRule):
++
      def __init__(self, *rules):
          self.rules = set(rules)
--        
++
      def process_execute(self, clauseelement, *multiparams, **params):
          for rule in self.rules:
              rule.process_execute(clauseelement, *multiparams, **params)
  
--    def process_cursor_execute(self, statement, parameters, context, executemany):
++    def process_cursor_execute(self, statement, parameters, context,
++                               executemany):
          for rule in self.rules:
--            rule.process_cursor_execute(statement, parameters, context, executemany)
++            rule.process_cursor_execute(statement, parameters, context,
++                    executemany)
  
      def is_consumed(self):
          if not self.rules:
              return True
--        
          for rule in list(self.rules):
--            if rule.rule_passed(): # a rule passed, move on
++            if rule.rule_passed():  # a rule passed, move on
                  self.rules.remove(rule)
                  return len(self.rules) == 0
++        assert False, 'No assertion rules were satisfied for statement'
  
--        assert False, "No assertion rules were satisfied for statement"
--    
      def consume_final(self):
          return len(self.rules) == 0
          
  def _process_engine_statement(query, context):
      if util.jython:
++
          # oracle+zxjdbc passes a PyStatement when returning into
++
          query = unicode(query)
--    if context.engine.name == 'mssql' and query.endswith('; select scope_identity()'):
++    if context.engine.name == 'mssql' \
++        and query.endswith('; select scope_identity()'):
          query = query[:-25]
--    
      query = re.sub(r'\n', '', query)
--    
      return query
      
  def _process_assertion_statement(query, context):
  
      return query
  
 -class SQLAssert(ConnectionProxy):
 +class SQLAssert(object):
++
      rules = None
--    
++
      def add_rules(self, rules):
          self.rules = list(rules)
--    
++
      def statement_complete(self):
          for rule in self.rules:
              if not rule.consume_final():
--                assert False, "All statements are complete, but pending assertion rules remain"
++                assert False, \
++                    'All statements are complete, but pending '\
++                    'assertion rules remain'
  
      def clear_rules(self):
          del self.rules
--        
 -    def execute(self, conn, execute, clauseelement, *multiparams, **params):
 -        result = execute(clauseelement, *multiparams, **params)
 +    def execute(self, conn, clauseelement, multiparams, params, result):
          if self.rules is not None:
              if not self.rules:
--                assert False, "All rules have been exhausted, but further statements remain"
++                assert False, \
++                    'All rules have been exhausted, but further '\
++                    'statements remain'
              rule = self.rules[0]
              rule.process_execute(clauseelement, *multiparams, **params)
              if rule.is_consumed():
                  self.rules.pop(0)
--            
 -        return result
--        
-     def cursor_execute(self, conn, cursor, statement, parameters, context, executemany):
 -    def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):
 -        result = execute(cursor, statement, parameters, context)
 -        
++
++    def cursor_execute(self, conn, cursor, statement, parameters,
++                       context, executemany):
          if self.rules:
              rule = self.rules[0]
--            rule.process_cursor_execute(statement, parameters, context, executemany)
 -
 -        return result
++            rule.process_cursor_execute(statement, parameters, context,
++                    executemany)
  
  asserter = SQLAssert()
      
index acae1d28a643f2437e9d0887d9e97d7070c261e9,61c5fb8fc536cd5ae0cd69443a1b86617600cec7..fdf4163c83e4183d34c33706a8334d07bd9cc8d2
@@@ -1,8 -1,7 +1,8 @@@
  import sys, types, weakref
  from collections import deque
- from sqlalchemy_nose import config
+ from test.bootstrap import config
  from sqlalchemy.util import function_named, callable
 +from sqlalchemy import event
  import re
  import warnings
  
Simple merge
Simple merge
Simple merge
index 33646c9227cfdba31b769f757018037355aa375e,8eeeeec50e1293c4af45fd5d9d66e94e646328da..1f82834d901d85c547e0b754eb0ebbd55b9c2cf5
@@@ -4,8 -4,7 +4,8 @@@ from test.lib.testing import eq_, asser
  from sqlalchemy import *
  from sqlalchemy.orm import *
  from sqlalchemy.orm import exc as orm_exc
- from sqlalchemy.test import Column, testing
 +from sqlalchemy import exc as sa_exc
+ from test.lib import Column, testing
  from sqlalchemy.util import function_named
  from test.orm import _fixtures, _base
  
Simple merge
Simple merge
index b5a6c1f5e9739baf5f4ccb0bea3469b779b51c44,cedfccd5bd487083c991af02a6e503ab70d0361f..913c6ec52e2eb2285f303a9e2f0ad9fba09a96f2
@@@ -3,12 -3,11 +3,12 @@@ from sqlalchemy.orm import attributes, 
  from sqlalchemy.orm.collections import collection
  from sqlalchemy.orm.interfaces import AttributeExtension
  from sqlalchemy import exc as sa_exc
- from sqlalchemy.test import *
- from sqlalchemy.test.testing import eq_, ne_, assert_raises
+ from test.lib import *
+ from test.lib.testing import eq_, ne_, assert_raises
  from test.orm import _base
- from sqlalchemy.test.util import gc_collect, all_partial_orderings
 -from test.lib.util import gc_collect
++from test.lib.util import gc_collect, all_partial_orderings
  from sqlalchemy.util import cmp, jython
 +from sqlalchemy import event, topological
  
  # global for pickling tests
  MyTest = None
Simple merge
Simple merge
index b0ce28663f1d8e6240883a375f344fd14f18c2b0,1e92d415580e9b71af3d450c0ff072c25e3490cc..540213745bd390b0e8b5de043ca9242f83de801a
@@@ -6,14 -6,13 +6,14 @@@ import sqlalchemy.orm.collections as co
  from sqlalchemy.orm.collections import collection
  
  import sqlalchemy as sa
- from sqlalchemy.test import testing
+ from test.lib import testing
  from sqlalchemy import Integer, String, ForeignKey, text
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  from sqlalchemy import util, exc as sa_exc
 -from sqlalchemy.orm import create_session, mapper, relationship, attributes
 +from sqlalchemy.orm import create_session, mapper, relationship, \
 +    attributes, instrumentation
  from test.orm import _base
- from sqlalchemy.test.testing import eq_, assert_raises, assert_raises_message
+ from test.lib.testing import eq_, assert_raises, assert_raises_message
  
  class Canary(sa.orm.interfaces.AttributeExtension):
      def __init__(self):
index 575c3ccfb567188bc35a52d87bfd0ffde72209d7,a4fd280a2c32eb48c46fcbaec24db1b7b94f32fb..3294a853c4b479be2c83774008affe33c731c57a
@@@ -1,8 -1,7 +1,8 @@@
  from sqlalchemy import *
  from sqlalchemy import exc as sa_exc
  from sqlalchemy.orm import *
- from sqlalchemy.test import *
- from sqlalchemy.test.testing import assert_raises_message
+ from test.lib import *
++from test.lib.testing import assert_raises_message
  from test.orm import _base
  
  
index 389fdbc5cdd980fb3ee9cba49a18febd240c5883,8e0b689186e8a56b81b4d161575b0f74b114bca6..e5f419ccbe78a6f32fac4f2a9b447cc52dfe3473
@@@ -1,11 -1,11 +1,11 @@@
  
  import sqlalchemy as sa
- from sqlalchemy.test import testing
 +from sqlalchemy import Integer, String, ForeignKey, event
- from sqlalchemy.test.schema import Table, Column
+ from test.lib import testing
 -from sqlalchemy import Integer, String, ForeignKey
+ from test.lib.schema import Table, Column
  from sqlalchemy.orm import mapper, relationship, create_session
  from test.orm import _base
- from sqlalchemy.test.testing import eq_
+ from test.lib.testing import eq_
  
  
  class TriggerDefaultsTest(_base.MappedTest):
Simple merge
Simple merge
index 6fabe7e43aae66139ff08e9c17a0a54efe703081,83839e77b2e0a0ada2b2d237fcedc33e5c850b44..aae1ecdbb5a38e3d75fcb9ec2764327a333fe279
@@@ -1,13 -1,12 +1,13 @@@
- from sqlalchemy.test.testing import eq_, assert_raises, assert_raises_message
+ from test.lib.testing import eq_, assert_raises, assert_raises_message
  import pickle
  from sqlalchemy import util
 -import sqlalchemy.orm.attributes as attributes
 +from sqlalchemy.orm import attributes, instrumentation
  from sqlalchemy.orm.collections import collection
 -from sqlalchemy.orm.attributes import set_attribute, get_attribute, del_attribute, is_instrumented
 +from sqlalchemy.orm.attributes import set_attribute, get_attribute, del_attribute
 +from sqlalchemy.orm.instrumentation import is_instrumented
  from sqlalchemy.orm import clear_mappers
  from sqlalchemy.orm import InstrumentationManager
- from sqlalchemy.test import *
+ from test.lib import *
  from test.orm import _base
  
  class MyTypesManager(InstrumentationManager):
Simple merge
index 7ffee2a2e5d5aa7be6afb51479f8013ec1037590,0495ae20b1dc97da99942f1704796b3b1b1f0591..4bcf363519514de8c698d24086c8f24e444552f4
@@@ -1,12 -1,11 +1,12 @@@
  
- from sqlalchemy.test.testing import assert_raises, assert_raises_message
+ from test.lib.testing import assert_raises, assert_raises_message
  import sqlalchemy as sa
 -from sqlalchemy import MetaData, Integer, ForeignKey, util
 +from sqlalchemy import MetaData, Integer, ForeignKey, util, event
- from sqlalchemy.test.schema import Table
- from sqlalchemy.test.schema import Column
 +from sqlalchemy.orm import mapper, relationship, create_session, \
 +    attributes, class_mapper, clear_mappers, instrumentation, events
- from sqlalchemy.test.testing import eq_, ne_
+ from test.lib.schema import Table
+ from test.lib.schema import Column
 -from sqlalchemy.orm import mapper, relationship, create_session, attributes, class_mapper, clear_mappers
+ from test.lib.testing import eq_, ne_
  from sqlalchemy.util import function_named
  from test.orm import _base
  
Simple merge
index 78e0f22063ca6bf66d910b88c96aa657d8437562,c3cbaeb337723808a4a27558e51fc00883a83dff..7ea4209a8251eb760ee6ce8fe2e177e0eb2fd31d
@@@ -1,23 -1,18 +1,23 @@@
  """General mapper operations with an emphasis on selecting/loading."""
  
- from sqlalchemy.test.testing import assert_raises, assert_raises_message
+ from test.lib.testing import assert_raises, assert_raises_message
  import sqlalchemy as sa
- from sqlalchemy.test import testing, pickleable
+ from test.lib import testing, pickleable
  from sqlalchemy import MetaData, Integer, String, ForeignKey, func, util
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  from sqlalchemy.engine import default
 -from sqlalchemy.orm import mapper, relationship, backref, create_session, class_mapper, compile_mappers, reconstructor, validates, aliased
 -from sqlalchemy.orm import defer, deferred, synonym, attributes, column_property, composite, relationship, dynamic_loader, comparable_property,AttributeExtension
 +from sqlalchemy.orm import mapper, relationship, backref, \
 +    create_session, class_mapper, configure_mappers, reconstructor, \
 +    validates, aliased, Mapper
 +from sqlalchemy.orm import defer, deferred, synonym, attributes, \
 +    column_property, composite, relationship, dynamic_loader, \
 +    comparable_property, AttributeExtension
 +from sqlalchemy.orm.instrumentation import ClassManager
- from sqlalchemy.test.testing import eq_, AssertsCompiledSQL
+ from test.lib.testing import eq_, AssertsCompiledSQL
  from test.orm import _base, _fixtures
- from sqlalchemy.test.assertsql import AllOf, CompiledSQL
 +from sqlalchemy import event
+ from test.lib.assertsql import AllOf, CompiledSQL
  
 -
  class MapperTest(_fixtures.FixtureTest):
  
      @testing.resolve_artifact_names
index 50d001a8c203eeb760b51f02d551b49488b9e70c,47c4f0963ff59bccfef015cf79068afc70428423..fbdbcfe2143974a76a18c1d315dd658e2efd5fb5
@@@ -2,17 -2,15 +2,17 @@@ from test.lib.testing import assert_rai
  import sqlalchemy as sa
  from sqlalchemy import Integer, PickleType, String
  import operator
- from sqlalchemy.test import testing
+ from test.lib import testing
  from sqlalchemy.util import OrderedSet
 -from sqlalchemy.orm import mapper, relationship, create_session, PropComparator, \
 -                            synonym, comparable_property, sessionmaker, attributes
 +from sqlalchemy.orm import mapper, relationship, create_session, \
 +    PropComparator, synonym, comparable_property, sessionmaker, \
 +    attributes, Session
  from sqlalchemy.orm.collections import attribute_mapped_collection
  from sqlalchemy.orm.interfaces import MapperOption
- from sqlalchemy.test.testing import eq_, ne_
+ from test.lib.testing import eq_, ne_
  from test.orm import _base, _fixtures
- from sqlalchemy.test.schema import Table, Column
 +from sqlalchemy import event
+ from test.lib.schema import Table, Column
  
  class MergeTest(_fixtures.FixtureTest):
      """Session.merge() functionality"""
Simple merge
Simple merge
index 2ad8bc8aa469e99ea4491afeec5a8c9bdfee82f6,9cd99320aa9d53ac0ad1e7fd2e1a51d09193eaa3..42340683739e52e556ed01ffffb11e442bd1924e
@@@ -1,14 -1,14 +1,14 @@@
- from sqlalchemy.test.testing import assert_raises, assert_raises_message
+ from test.lib.testing import assert_raises, assert_raises_message
  import datetime
  import sqlalchemy as sa
- from sqlalchemy.test import testing
+ from test.lib import testing
  from sqlalchemy import Integer, String, ForeignKey, MetaData, and_
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  from sqlalchemy.orm import mapper, relationship, relation, \
 -                    backref, create_session, compile_mappers, \
 +                    backref, create_session, configure_mappers, \
                      clear_mappers, sessionmaker, attributes,\
                      Session, composite, column_property
- from sqlalchemy.test.testing import eq_, startswith_
+ from test.lib.testing import eq_, startswith_
  from test.orm import _base, _fixtures
  
  
Simple merge
index 62047970c936ab392a70c95c85f09d65761f26a2,51e59d809beaabd5e45dcaf6dedc3822bc96d14a..0486a8124594e04bbf68893ca99b9872d85b5aa4
@@@ -7,15 -7,15 +7,15 @@@ from sqlalchemy.orm import create_sessi
      make_transient, Session
  from sqlalchemy.orm.attributes import instance_state
  import sqlalchemy as sa
- from sqlalchemy.test import engines, testing, config
+ from test.lib import engines, testing, config
  from sqlalchemy import Integer, String, Sequence
- from sqlalchemy.test.schema import Table, Column
+ from test.lib.schema import Table, Column
  from sqlalchemy.orm import mapper, relationship, backref, joinedload, \
      exc as orm_exc, object_session
- from sqlalchemy.test.testing import eq_
+ from test.lib.testing import eq_
  from test.engine import _base as engine_base
  from test.orm import _base, _fixtures
 -
 +from sqlalchemy import event
  
  class SessionTest(_fixtures.FixtureTest):
      run_inserts = None
index 511adde825b494fec036e28f1a3c7e7ca1070954,f228fb7d9f90c9d14c7af222f520d53658a2e585..6b6251d66a7a6e61a2b5a03a3c3c143dde82c9b5
@@@ -7,17 -7,16 +7,17 @@@ import operato
  from sqlalchemy.orm import mapper as orm_mapper
  
  import sqlalchemy as sa
- from sqlalchemy.test import engines, testing, pickleable
 +from sqlalchemy import Integer, String, ForeignKey, literal_column, event
- from sqlalchemy.test.schema import Table
- from sqlalchemy.test.schema import Column
+ from test.lib import engines, testing, pickleable
 -from sqlalchemy import Integer, String, ForeignKey, literal_column
+ from test.lib.schema import Table
+ from test.lib.schema import Column
  from sqlalchemy.orm import mapper, relationship, create_session, \
      column_property, attributes, Session, reconstructor, object_session
- from sqlalchemy.test.testing import eq_, ne_
- from sqlalchemy.test.util import gc_collect
+ from test.lib.testing import eq_, ne_
++from test.lib.util import gc_collect
  from test.orm import _base, _fixtures
  from test.engine import _base as engine_base
- from sqlalchemy.test.assertsql import AllOf, CompiledSQL
+ from test.lib.assertsql import AllOf, CompiledSQL
  import gc
  
  class UnitOfWorkTest(object):
index 43a15056cd4c7f961ca3e7b5fc20d8514077a13e,89861c78dec07425fe6e47eee44a89bbfa2d6ec1..1ee34c50fd0c8b4e594f8d370bafc421ccc9adb5
@@@ -8,12 -8,48 +8,12 @@@ from sqlalchemy.orm import aliase
  from sqlalchemy.orm import mapper, create_session
  
  
- from sqlalchemy.test import TestBase, testing
+ from test.lib import TestBase, testing
  
  from test.orm import _fixtures
- from sqlalchemy.test.testing import eq_
+ from test.lib.testing import eq_
  
  
 -class ExtensionCarrierTest(TestBase):
 -    def test_basic(self):
 -        carrier = util.ExtensionCarrier()
 -
 -        assert 'translate_row' not in carrier
 -        assert carrier.translate_row() is interfaces.EXT_CONTINUE
 -        assert 'translate_row' not in carrier
 -
 -        assert_raises(AttributeError, lambda: carrier.snickysnack)
 -
 -        class Partial(object):
 -            def __init__(self, marker):
 -                self.marker = marker
 -            def translate_row(self, row):
 -                return self.marker
 -
 -        carrier.append(Partial('end'))
 -        assert 'translate_row' in carrier
 -        assert carrier.translate_row(None) == 'end'
 -
 -        carrier.push(Partial('front'))
 -        assert carrier.translate_row(None) == 'front'
 -
 -        assert 'populate_instance' not in carrier
 -        carrier.append(interfaces.MapperExtension)
 -        
 -        # Py3K
 -        #assert 'populate_instance' not in carrier
 -        # Py2K
 -        assert 'populate_instance' in carrier
 -        # end Py2K
 -        
 -        assert carrier.interface
 -        for m in carrier.interface:
 -            assert getattr(interfaces.MapperExtension, m)
 -
  class AliasedClassTest(TestBase):
      def point_map(self, cls):
          table = Table('point', MetaData(),
Simple merge
Simple merge