after all that, use pytest warnings plugin

The warnings plugin lets us set the filters up
in the config, and as our filter requirements are now
simple we can just set this up.

additionally pytest now recommends pyproject.toml, since
we fully include this now, let's move it there.

the pytest logging plugin seems to not be any problem either
at the moment, so re-enable that.  if it becomes apparent
whatever the problem was (which was probably that it was just
surprising, or something) we can disable it again and comment
what the reason was.

Change-Id: Ia9715533b01f72aa5fdcf6a27ce75b76f829fa43
This commit is contained in:
Mike Bayer
2022-01-23 10:51:55 -05:00
parent 321f64f71e
commit aba3ab247d
7 changed files with 46 additions and 40 deletions
+9
View File
@@ -672,6 +672,15 @@ class NotSupportedError(DatabaseError):
# 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."""
+11 -2
View File
@@ -757,13 +757,14 @@ def _finalize_fairy(
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)
@@ -779,6 +780,14 @@ def _finalize_fairy(
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
+7 -35
View File
@@ -4,54 +4,26 @@
#
# 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."""
"""hook for setting up warnings filters.
# TODO: at this point we can use the normal pytest warnings plugin,
# if we decide the test suite can be linked to pytest only
Note that when the pytest warnings plugin is in place, that plugin
overwrites whatever happens here.
origin = r"^(?:test|sqlalchemy)\..*"
Current SQLAlchemy 2.0 default is to use pytest warnings plugin
which is configured in pyproject.toml.
warnings.filterwarnings(
"ignore", category=sa_exc.SAPendingDeprecationWarning
)
warnings.filterwarnings("error", category=sa_exc.SADeprecationWarning)
warnings.filterwarnings("error", category=sa_exc.SAWarning)
warnings.filterwarnings("always", category=SATestSuiteWarning)
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):
+14
View File
@@ -9,3 +9,17 @@
[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"
]
+2 -3
View File
@@ -85,9 +85,8 @@ tag_build = dev
[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
+1
View File
@@ -511,6 +511,7 @@ ALL_EXC = [
[lambda cls: cls("foo", code="42")],
),
([sa_exceptions.SAPendingDeprecationWarning], [lambda cls: cls(1, 2, 3)]),
([sa_exceptions.SATestSuiteWarning], [lambda cls: cls()]),
]
+2
View File
@@ -16,6 +16,8 @@ os.environ["SQLALCHEMY_WARN_20"] = "true"
collect_ignore_glob = []
# this requires that sqlalchemy.testing was not already
# imported in order to work
pytest.register_assert_rewrite("sqlalchemy.testing.assertions")