1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
commit 1607c5c19f8ef362be7182b0ee0fddc6a3d3140e
Author: Federico Caselli <cfederico87@gmail.com>
Date: Sat Apr 18 18:10:59 2020 +0200
Enable pypy tests on github workflow
Fixes: #5223
Change-Id: I0952e54ed9af2952ea340be1945311376ffc1ad2
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 6f3170a9e..0427eeac5 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -1326,7 +1326,7 @@ class Mapper(InspectionAttr):
if key == "__init__" and hasattr(method, "_sa_original_init"):
method = method._sa_original_init
if isinstance(method, types.MethodType):
- method = method.im_func
+ method = method.__func__
if isinstance(method, types.FunctionType):
if hasattr(method, "__sa_reconstructor__"):
self._reconstructor = method
diff --git a/lib/sqlalchemy/testing/plugin/pytestplugin.py b/lib/sqlalchemy/testing/plugin/pytestplugin.py
index ad4ebb656..dc47f671e 100644
--- a/lib/sqlalchemy/testing/plugin/pytestplugin.py
+++ b/lib/sqlalchemy/testing/plugin/pytestplugin.py
@@ -340,7 +340,7 @@ def %(name)s(%(args)s):
code, {"target": target, "fn": fn}, fn.__name__
)
if not add_positional_parameters:
- decorated.__defaults__ = getattr(fn, "im_func", fn).__defaults__
+ decorated.__defaults__ = getattr(fn, "__func__", fn).__defaults__
decorated.__wrapped__ = fn
return update_wrapper(decorated, fn)
else:
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 7de16bcdf..e256d7764 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -151,7 +151,7 @@ def %(name)s(%(args)s):
decorated = _exec_code_in_env(
code, {targ_name: target, fn_name: fn}, fn.__name__
)
- decorated.__defaults__ = getattr(fn, "im_func", fn).__defaults__
+ decorated.__defaults__ = getattr(fn, "__func__", fn).__defaults__
decorated.__wrapped__ = fn
return update_wrapper(decorated, fn)
@@ -751,7 +751,7 @@ def monkeypatch_proxied_specials(
fn = getattr(from_cls, method)
if not hasattr(fn, "__call__"):
continue
- fn = getattr(fn, "im_func", fn)
+ fn = getattr(fn, "__func__", fn)
except AttributeError:
continue
try:
diff --git a/test/base/test_utils.py b/test/base/test_utils.py
index 8356de61b..c04dea7cd 100644
--- a/test/base/test_utils.py
+++ b/test/base/test_utils.py
@@ -411,7 +411,8 @@ class WrapCallableTest(fixtures.TestBase):
lambda: my_functools_default(), my_functools_default
)
eq_(c.__name__, "partial")
- eq_(c.__doc__, my_functools_default.__call__.__doc__)
+ if not compat.pypy: # pypy fails this check
+ eq_(c.__doc__, my_functools_default.__call__.__doc__)
eq_(c(), 5)
diff --git a/test/engine/test_logging.py b/test/engine/test_logging.py
index fe4ff44a7..e14c3a37d 100644
--- a/test/engine/test_logging.py
+++ b/test/engine/test_logging.py
@@ -8,6 +8,7 @@ from sqlalchemy import or_
from sqlalchemy import select
from sqlalchemy import String
from sqlalchemy import Table
+from sqlalchemy import testing
from sqlalchemy import util
from sqlalchemy.sql import util as sql_util
from sqlalchemy.testing import assert_raises_message
@@ -460,10 +461,12 @@ class PoolLoggingTest(fixtures.TestBase):
q = self._stpool_logging_fixture()
self._test_queuepool(q, False)
+ @testing.requires.predictable_gc
def test_queuepool_echo(self):
q = self._queuepool_echo_fixture()
self._test_queuepool(q)
+ @testing.requires.predictable_gc
def test_queuepool_logging(self):
q = self._queuepool_logging_fixture()
self._test_queuepool(q)
diff --git a/test/engine/test_pool.py b/test/engine/test_pool.py
index 3b989959e..c8cd89555 100644
--- a/test/engine/test_pool.py
+++ b/test/engine/test_pool.py
@@ -608,6 +608,7 @@ class PoolEventsTest(PoolTestBase):
assert canary.call_args_list[0][0][0] is dbapi_con
assert canary.call_args_list[0][0][2] is exc
+ @testing.requires.predictable_gc
def test_checkin_event_gc(self):
p, canary = self._checkin_event_fixture()
diff --git a/test/orm/test_deferred.py b/test/orm/test_deferred.py
index f8817bbd7..2bf466c15 100644
--- a/test/orm/test_deferred.py
+++ b/test/orm/test_deferred.py
@@ -1700,6 +1700,8 @@ class WithExpressionTest(fixtures.DeclarativeMappedTest):
c1 = s.query(C).order_by(C.id)
eq_(c1.all(), [C(c_expr=1), C(c_expr=1)])
+ s.expunge_all()
+
c2 = (
s.query(C)
.options(with_expression(C.c_expr, C.x * 2))
commit 8d3ac81a8794bdd3532ad07427edf9f48493919d
Date: Wed Oct 14 18:25:45 2020 +0200
Skip a failing test that got removed in master
https://github.com/sqlalchemy/sqlalchemy/commit/a9b068ae564e5e775e312373088545b75aeaa1b0
diff --git a/test/orm/test_deprecations.py b/test/orm/test_deprecations.py
index 156898f..0d6dc72 100644
--- a/test/orm/test_deprecations.py
+++ b/test/orm/test_deprecations.py
@@ -560,7 +560,7 @@ class StrongIdentityMapTest(_fixtures.FixtureTest):
def test_prune_imap(self):
self._test_prune(self._strong_ident_fixture)
- def test_prune_events(self):
+ def _test_prune_events(self):
self._test_prune(self._event_fixture)
@testing.fails_if(lambda: pypy, "pypy has a real GC")
commit 1a1cc0e623698a75274f1525d2d14464ff738b86
Date: Wed Oct 14 18:28:56 2020 +0200
Fix PyPy-related tests
Partial backport of https://github.com/sqlalchemy/sqlalchemy/commit/9e31fc74089cf565df5f275d22eb8ae5414d6e45
diff --git a/test/base/test_utils.py b/test/base/test_utils.py
diff --git a/test/base/test_utils.py b/test/base/test_utils.py
index 8356de61b..c3d25b824 100644
--- a/test/base/test_utils.py
+++ b/test/base/test_utils.py
@@ -1725,7 +1725,7 @@ class ArgInspectionTest(fixtures.TestBase):
assert_raises(TypeError, get_callable_argspec, datetime.datetime.now)
- @fails_if(lambda: util.pypy, "pypy returns plain *arg, **kw")
+ @testing.requires.cpython
def test_callable_argspec_obj_init(self):
assert_raises(TypeError, get_callable_argspec, object)
@@ -2154,10 +2154,7 @@ class TestFormatArgspec(_Py3KFixtures, fixtures.TestBase):
grouped=False,
)
- @testing.fails_if(
- lambda: util.pypy,
- "pypy doesn't report Obj.__init__ as object.__init__",
- )
+ @testing.requires.cpython
def test_init_grouped(self):
object_spec = {
"args": "(self)",
@@ -2181,10 +2178,7 @@ class TestFormatArgspec(_Py3KFixtures, fixtures.TestBase):
self._test_init(None, object_spec, wrapper_spec, custom_spec)
self._test_init(True, object_spec, wrapper_spec, custom_spec)
- @testing.fails_if(
- lambda: util.pypy,
- "pypy doesn't report Obj.__init__ as object.__init__",
- )
+ @testing.requires.cpython
def test_init_bare(self):
object_spec = {
"args": "self",
|