- test suite swaps out warnings.warn with warnings.warn_explicit, to solve warnings registry issue
- explicitly disallow functions from inside test.bootstrap, test.lib being interpreted as tests
child is not None and \
not uowcommit.session._contains_state(child):
util.warn(
- "Child %s not in session, %s "
+ "Object of type %s not in session, %s "
"operation along '%s' won't proceed" %
- (mapperutil.state_str(child), operation, self.prop))
+ (mapperutil.state_class_str(child), operation, self.prop))
return
if clearkeys or child is None:
if child is not None and not uowcommit.session._contains_state(child):
if not child.deleted:
util.warn(
- "Child %s not in session, %s "
+ "Object of type %s not in session, %s "
"operation along '%s' won't proceed" %
- (mapperutil.state_str(child), operation, self.prop))
+ (mapperutil.state_class_str(child), operation, self.prop))
return False
self._verify_canload(child)
operation=None, prop=None):
if not self.session._contains_state(state):
if not state.deleted and operation is not None:
- util.warn("Object %s not in session, %s operation "
+ util.warn("Object of type %s not in session, %s operation "
"along '%s' will not proceed" %
- (mapperutil.state_str(state), operation, prop))
+ (mapperutil.state_class_str(state), operation, prop))
return False
if state not in self.states:
else:
return '<%s at 0x%x>' % (state.class_.__name__, id(state.obj()))
+def state_class_str(state):
+ """Return a string describing an instance's class via its InstanceState."""
+
+ if state is None:
+ return "None"
+ else:
+ return '<%s>' % (state.class_.__name__, )
+
def attribute_str(instance, attribute):
return instance_str(instance) + "." + attribute
def warn(msg, stacklevel=3):
+ """Issue a warning.
+
+ If msg is a string, :class:`.exc.SAWarning` is used as
+ the category.
+
+ .. note:: This function is swapped out when the test suite
+ runs, with a compatible version that uses
+ warnings.warn_explicit, so that the warnings registry can
+ be controlled.
+
+ """
if isinstance(msg, basestring):
warnings.warn(msg, exc.SAWarning, stacklevel=stacklevel)
else:
def describeTest(self, test):
return ""
-
+
+ def wantFunction(self, fn):
+ if fn.__module__.startswith('test.lib') or \
+ fn.__module__.startswith('test.bootstrap'):
+ return False
+
def wantClass(self, cls):
"""Return true if you want the main test selector to collect
tests from this class, false if you don't, and None if you don't
from sqlalchemy.util import function_named, py3k
from engines import drop_all_tables
-from sqlalchemy import exc as sa_exc, util, types as sqltypes, schema, pool, orm
+from sqlalchemy import exc as sa_exc, util, types as sqltypes, schema, \
+ pool, orm
from sqlalchemy.engine import default
from nose import SkipTest
strings; these will be matched to the root of the warning description by
warnings.filterwarnings().
"""
-
# TODO: it would be nice to assert that a named warning was
# emitted. should work with some monkeypatching of warnings,
# and may work on non-CPython if they keep to the spirit of
return function_named(safe, fn.__name__)
return decorate
+def testing_warn(msg, stacklevel=3):
+ """Replaces sqlalchemy.util.warn during tests."""
+
+ filename = "test.lib.testing"
+ lineno = 1
+ if isinstance(msg, basestring):
+ warnings.warn_explicit(msg, sa_exc.SAWarning, filename, lineno)
+ else:
+ warnings.warn_explicit(msg, filename, lineno)
+
def resetwarnings():
"""Reset warning behavior to testing defaults."""
-
+
+ util.warn = util.langhelpers.warn = testing_warn
+
warnings.filterwarnings('ignore',
category=sa_exc.SAPendingDeprecationWarning)
warnings.filterwarnings('error', category=sa_exc.SADeprecationWarning)
warnings.filterwarnings('error', category=sa_exc.SAWarning)
-# warnings.simplefilter('error')
-
def global_cleanup_assertions():
"""Check things that have to be finalized at the end of a test suite.