summaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-06-09 09:53:43 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-06-09 09:54:04 -0400
commitcc7cc3c9ec73055703acc78c8d92eb0242e5cd20 (patch)
treeaf8a2272e4749ee0afd086294c65854f00b8f7b2 /test/base
parente1935b1711dd10d1cb30e3990fef2dd2e0435f1f (diff)
downloadsqlalchemy-cc7cc3c9ec73055703acc78c8d92eb0242e5cd20.tar.gz
dont transfer __weakref__ to regenerated class
Repaired a deprecation warning class decorator that was preventing key objects such as :class:`_engine.Connection` from having a proper ``__weakref__`` attribute, causing operations like Python standard library ``inspect.getmembers()`` to fail. Fixes: #8115 Change-Id: Ifd0bc2325fb9dc9e1431998c308b7fc081968373
Diffstat (limited to 'test/base')
-rw-r--r--test/base/test_warnings.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/base/test_warnings.py b/test/base/test_warnings.py
index e32c8f5ab..e951fcafc 100644
--- a/test/base/test_warnings.py
+++ b/test/base/test_warnings.py
@@ -1,6 +1,9 @@
+from sqlalchemy import testing
+from sqlalchemy.exc import SADeprecationWarning
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_deprecated
from sqlalchemy.testing import fixtures
+from sqlalchemy.util.deprecations import _decorate_cls_with_warning
from sqlalchemy.util.deprecations import warn_deprecated_limited
from sqlalchemy.util.langhelpers import _hash_limit_string
@@ -34,3 +37,46 @@ class WarnDeprecatedLimitedTest(fixtures.TestBase):
eq_(len(printouts), occurrences)
eq_(len(messages), cap)
+
+
+class ClsWarningTest(fixtures.TestBase):
+ @testing.fixture
+ def dep_cls_fixture(self):
+ class Connectable(object):
+ """a docstring"""
+
+ some_member = "foo"
+
+ Connectable = _decorate_cls_with_warning(
+ Connectable,
+ None,
+ SADeprecationWarning,
+ "a message",
+ "2.0",
+ "another message",
+ )
+
+ return Connectable
+
+ def test_dep_inspectable(self, dep_cls_fixture):
+ """test #8115"""
+
+ import inspect
+
+ class PlainClass(object):
+ some_member = "bar"
+
+ pc_keys = dict(inspect.getmembers(PlainClass()))
+ insp_keys = dict(inspect.getmembers(dep_cls_fixture()))
+
+ assert set(insp_keys).intersection(
+ (
+ "__class__",
+ "__doc__",
+ "__eq__",
+ "__dict__",
+ "__weakref__",
+ "some_member",
+ )
+ )
+ eq_(set(pc_keys), set(insp_keys))