# Warnings
+class SATestSuiteWarning(Warning):
+ """warning for a condition detected during tests that is non-fatal
+
+ Currently outside of SAWarning so that we can work around tools like
+ Alembic doing the wrong thing with warnings.
+
+ """
+
+
class SADeprecationWarning(HasDescriptionCode, DeprecationWarning):
"""Issued for usage of deprecated APIs."""
else:
message = (
"The garbage collector is trying to clean up "
- "connection %r. This feature is unsupported on async "
+ f"connection {dbapi_connection!r}. This feature is "
+ "unsupported on async "
"dbapi, since no IO can be performed at this stage to "
"reset the connection. Please close out all "
"connections when they are no longer used, calling "
"``close()`` or using a context manager to "
"manage their lifetime."
- ) % dbapi_connection
+ )
pool.logger.error(message)
util.warn(message)
if connection_record and connection_record.fairy_ref is not None:
connection_record.checkin()
+ # give gc some help. See
+ # test/engine/test_pool.py::PoolEventsTest::test_checkin_event_gc[True]
+ # which actually started failing when pytest warnings plugin was
+ # turned on, due to util.warn() above
+ del dbapi_connection
+ del connection_record
+ del fairy
+
# a dictionary of the _ConnectionFairy weakrefs to _ConnectionRecord, so that
# GC under pypy will call ConnectionFairy finalizers. linked directly to the
#
# This module is part of SQLAlchemy and is released under
# the MIT License: https://www.opensource.org/licenses/mit-license.php
-import warnings
-
from . import assertions
from .. import exc as sa_exc
+from ..exc import SATestSuiteWarning
from ..util.langhelpers import _warnings_warn
-class SATestSuiteWarning(Warning):
- """warning for a condition detected during tests that is non-fatal
-
- Currently outside of SAWarning so that we can work around tools like
- Alembic doing the wrong thing with warnings.
-
- """
-
-
def warn_test_suite(message):
_warnings_warn(message, category=SATestSuiteWarning)
def setup_filters():
- """Set global warning behavior for the test suite."""
-
- # TODO: at this point we can use the normal pytest warnings plugin,
- # if we decide the test suite can be linked to pytest only
-
- origin = r"^(?:test|sqlalchemy)\..*"
+ """hook for setting up warnings filters.
- warnings.filterwarnings(
- "ignore", category=sa_exc.SAPendingDeprecationWarning
- )
- warnings.filterwarnings("error", category=sa_exc.SADeprecationWarning)
- warnings.filterwarnings("error", category=sa_exc.SAWarning)
+ Note that when the pytest warnings plugin is in place, that plugin
+ overwrites whatever happens here.
- warnings.filterwarnings("always", category=SATestSuiteWarning)
+ Current SQLAlchemy 2.0 default is to use pytest warnings plugin
+ which is configured in pyproject.toml.
- warnings.filterwarnings(
- "error", category=DeprecationWarning, module=origin
- )
-
- try:
- import pytest
- except ImportError:
- pass
- else:
- warnings.filterwarnings(
- "once", category=pytest.PytestDeprecationWarning, module=origin
- )
+ """
def assert_warnings(fn, warning_msgs, regex=False):
[tool.black]
line-length = 79
target-version = ['py37']
+
+
+[tool.pytest.ini_options]
+addopts = "--tb native -v -r sfxX --maxfail=250 -p warnings -p logging"
+python_files = "test/*test_*.py"
+minversion = "6.2"
+filterwarnings = [
+ "ignore::sqlalchemy.exc.SAPendingDeprecationWarning",
+ "error::sqlalchemy.exc.SADeprecationWarning",
+ "error::sqlalchemy.exc.SAWarning",
+ "always::sqlalchemy.exc.SATestSuiteWarning",
+ "error::DeprecationWarning:test",
+ "error::DeprecationWarning:sqlalchemy"
+]
[options.packages.find]
where = lib
-[tool:pytest]
-addopts = --tb native -v -r sfxX --maxfail=250 -p no:warnings -p no:logging
-python_files = test/*test_*.py
+# [tool:pytest]
+# pytest settings moved to pyproject.toml
[upload]
sign = 1
[lambda cls: cls("foo", code="42")],
),
([sa_exceptions.SAPendingDeprecationWarning], [lambda cls: cls(1, 2, 3)]),
+ ([sa_exceptions.SATestSuiteWarning], [lambda cls: cls()]),
]
collect_ignore_glob = []
+# this requires that sqlalchemy.testing was not already
+# imported in order to work
pytest.register_assert_rewrite("sqlalchemy.testing.assertions")