plain.models 0.33.1__py3-none-any.whl → 0.34.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plain/models/CHANGELOG.md +27 -0
- plain/models/README.md +8 -10
- plain/models/__init__.py +2 -6
- plain/models/backends/base/base.py +10 -18
- plain/models/backends/base/creation.py +3 -4
- plain/models/backends/base/introspection.py +2 -3
- plain/models/backends/base/schema.py +3 -9
- plain/models/backends/mysql/validation.py +1 -1
- plain/models/backends/postgresql/base.py +15 -23
- plain/models/backends/postgresql/schema.py +0 -2
- plain/models/backends/sqlite3/base.py +1 -1
- plain/models/backends/sqlite3/creation.py +2 -2
- plain/models/backends/sqlite3/features.py +1 -1
- plain/models/backends/sqlite3/schema.py +1 -1
- plain/models/backends/utils.py +2 -6
- plain/models/backups/core.py +15 -22
- plain/models/base.py +179 -225
- plain/models/cli.py +25 -62
- plain/models/connections.py +48 -165
- plain/models/constraints.py +10 -10
- plain/models/db.py +7 -15
- plain/models/default_settings.py +13 -20
- plain/models/deletion.py +14 -16
- plain/models/expressions.py +7 -10
- plain/models/fields/__init__.py +56 -76
- plain/models/fields/json.py +9 -12
- plain/models/fields/related.py +5 -17
- plain/models/fields/related_descriptors.py +43 -95
- plain/models/forms.py +2 -4
- plain/models/indexes.py +2 -3
- plain/models/lookups.py +0 -7
- plain/models/manager.py +1 -14
- plain/models/migrations/executor.py +0 -16
- plain/models/migrations/loader.py +1 -1
- plain/models/migrations/migration.py +1 -1
- plain/models/migrations/operations/base.py +4 -11
- plain/models/migrations/operations/fields.py +4 -4
- plain/models/migrations/operations/models.py +10 -10
- plain/models/migrations/operations/special.py +6 -14
- plain/models/migrations/recorder.py +1 -1
- plain/models/options.py +4 -7
- plain/models/preflight.py +25 -44
- plain/models/query.py +47 -102
- plain/models/query_utils.py +4 -4
- plain/models/sql/compiler.py +7 -11
- plain/models/sql/query.py +32 -42
- plain/models/sql/subqueries.py +6 -8
- plain/models/sql/where.py +1 -1
- plain/models/test/pytest.py +21 -32
- plain/models/test/utils.py +7 -143
- plain/models/transaction.py +66 -164
- {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/METADATA +9 -11
- {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/RECORD +56 -55
- {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/WHEEL +0 -0
- {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/entry_points.txt +0 -0
- {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/licenses/LICENSE +0 -0
plain/models/transaction.py
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
from contextlib import ContextDecorator, contextmanager
|
2
2
|
|
3
|
-
from plain.models.db import
|
4
|
-
DEFAULT_DB_ALIAS,
|
5
|
-
DatabaseError,
|
6
|
-
Error,
|
7
|
-
ProgrammingError,
|
8
|
-
connections,
|
9
|
-
)
|
3
|
+
from plain.models.db import DatabaseError, Error, ProgrammingError, db_connection
|
10
4
|
|
11
5
|
|
12
6
|
class TransactionManagementError(ProgrammingError):
|
@@ -15,90 +9,8 @@ class TransactionManagementError(ProgrammingError):
|
|
15
9
|
pass
|
16
10
|
|
17
11
|
|
18
|
-
def get_connection(using=None):
|
19
|
-
"""
|
20
|
-
Get a database connection by name, or the default database connection
|
21
|
-
if no name is provided. This is a private API.
|
22
|
-
"""
|
23
|
-
if using is None:
|
24
|
-
using = DEFAULT_DB_ALIAS
|
25
|
-
return connections[using]
|
26
|
-
|
27
|
-
|
28
|
-
def get_autocommit(using=None):
|
29
|
-
"""Get the autocommit status of the connection."""
|
30
|
-
return get_connection(using).get_autocommit()
|
31
|
-
|
32
|
-
|
33
|
-
def set_autocommit(autocommit, using=None):
|
34
|
-
"""Set the autocommit status of the connection."""
|
35
|
-
return get_connection(using).set_autocommit(autocommit)
|
36
|
-
|
37
|
-
|
38
|
-
def commit(using=None):
|
39
|
-
"""Commit a transaction."""
|
40
|
-
get_connection(using).commit()
|
41
|
-
|
42
|
-
|
43
|
-
def rollback(using=None):
|
44
|
-
"""Roll back a transaction."""
|
45
|
-
get_connection(using).rollback()
|
46
|
-
|
47
|
-
|
48
|
-
def savepoint(using=None):
|
49
|
-
"""
|
50
|
-
Create a savepoint (if supported and required by the backend) inside the
|
51
|
-
current transaction. Return an identifier for the savepoint that will be
|
52
|
-
used for the subsequent rollback or commit.
|
53
|
-
"""
|
54
|
-
return get_connection(using).savepoint()
|
55
|
-
|
56
|
-
|
57
|
-
def savepoint_rollback(sid, using=None):
|
58
|
-
"""
|
59
|
-
Roll back the most recent savepoint (if one exists). Do nothing if
|
60
|
-
savepoints are not supported.
|
61
|
-
"""
|
62
|
-
get_connection(using).savepoint_rollback(sid)
|
63
|
-
|
64
|
-
|
65
|
-
def savepoint_commit(sid, using=None):
|
66
|
-
"""
|
67
|
-
Commit the most recent savepoint (if one exists). Do nothing if
|
68
|
-
savepoints are not supported.
|
69
|
-
"""
|
70
|
-
get_connection(using).savepoint_commit(sid)
|
71
|
-
|
72
|
-
|
73
|
-
def clean_savepoints(using=None):
|
74
|
-
"""
|
75
|
-
Reset the counter used to generate unique savepoint ids in this thread.
|
76
|
-
"""
|
77
|
-
get_connection(using).clean_savepoints()
|
78
|
-
|
79
|
-
|
80
|
-
def get_rollback(using=None):
|
81
|
-
"""Get the "needs rollback" flag -- for *advanced use* only."""
|
82
|
-
return get_connection(using).get_rollback()
|
83
|
-
|
84
|
-
|
85
|
-
def set_rollback(rollback, using=None):
|
86
|
-
"""
|
87
|
-
Set or unset the "needs rollback" flag -- for *advanced use* only.
|
88
|
-
|
89
|
-
When `rollback` is `True`, trigger a rollback when exiting the innermost
|
90
|
-
enclosing atomic block that has `savepoint=True` (that's the default). Use
|
91
|
-
this to force a rollback without raising an exception.
|
92
|
-
|
93
|
-
When `rollback` is `False`, prevent such a rollback. Use this only after
|
94
|
-
rolling back to a known-good state! Otherwise, you break the atomic block
|
95
|
-
and data corruption may occur.
|
96
|
-
"""
|
97
|
-
return get_connection(using).set_rollback(rollback)
|
98
|
-
|
99
|
-
|
100
12
|
@contextmanager
|
101
|
-
def mark_for_rollback_on_error(
|
13
|
+
def mark_for_rollback_on_error():
|
102
14
|
"""
|
103
15
|
Internal low-level utility to mark a transaction as "needs rollback" when
|
104
16
|
an exception is raised while not enforcing the enclosed block to be in a
|
@@ -107,11 +19,10 @@ def mark_for_rollback_on_error(using=None):
|
|
107
19
|
|
108
20
|
It's equivalent to:
|
109
21
|
|
110
|
-
|
111
|
-
if connection.get_autocommit():
|
22
|
+
if db_connection.get_autocommit():
|
112
23
|
yield
|
113
24
|
else:
|
114
|
-
with transaction.atomic(
|
25
|
+
with transaction.atomic(savepoint=False):
|
115
26
|
yield
|
116
27
|
|
117
28
|
but it uses low-level utilities to avoid performance overhead.
|
@@ -119,19 +30,18 @@ def mark_for_rollback_on_error(using=None):
|
|
119
30
|
try:
|
120
31
|
yield
|
121
32
|
except Exception as exc:
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
connection.rollback_exc = exc
|
33
|
+
if db_connection.in_atomic_block:
|
34
|
+
db_connection.needs_rollback = True
|
35
|
+
db_connection.rollback_exc = exc
|
126
36
|
raise
|
127
37
|
|
128
38
|
|
129
|
-
def on_commit(func,
|
39
|
+
def on_commit(func, robust=False):
|
130
40
|
"""
|
131
41
|
Register `func` to be called when the current transaction is committed.
|
132
42
|
If the current transaction is rolled back, `func` will not be called.
|
133
43
|
"""
|
134
|
-
|
44
|
+
db_connection.on_commit(func, robust)
|
135
45
|
|
136
46
|
|
137
47
|
#################################
|
@@ -157,7 +67,7 @@ class Atomic(ContextDecorator):
|
|
157
67
|
ensure that some code runs within a transaction without creating overhead.
|
158
68
|
|
159
69
|
A stack of savepoints identifiers is maintained as an attribute of the
|
160
|
-
|
70
|
+
db_connection. None denotes the absence of a savepoint.
|
161
71
|
|
162
72
|
This allows reentrancy even if the same AtomicWrapper is reused. For
|
163
73
|
example, it's possible to define `oa = atomic('other')` and use `@oa` or
|
@@ -173,150 +83,142 @@ class Atomic(ContextDecorator):
|
|
173
83
|
This is a private API.
|
174
84
|
"""
|
175
85
|
|
176
|
-
def __init__(self,
|
177
|
-
self.using = using
|
86
|
+
def __init__(self, savepoint, durable):
|
178
87
|
self.savepoint = savepoint
|
179
88
|
self.durable = durable
|
180
89
|
self._from_testcase = False
|
181
90
|
|
182
91
|
def __enter__(self):
|
183
|
-
connection = get_connection(self.using)
|
184
|
-
|
185
92
|
if (
|
186
93
|
self.durable
|
187
|
-
and
|
188
|
-
and not
|
94
|
+
and db_connection.atomic_blocks
|
95
|
+
and not db_connection.atomic_blocks[-1]._from_testcase
|
189
96
|
):
|
190
97
|
raise RuntimeError(
|
191
98
|
"A durable atomic block cannot be nested within another atomic block."
|
192
99
|
)
|
193
|
-
if not
|
100
|
+
if not db_connection.in_atomic_block:
|
194
101
|
# Reset state when entering an outermost atomic block.
|
195
|
-
|
196
|
-
|
197
|
-
if not
|
102
|
+
db_connection.commit_on_exit = True
|
103
|
+
db_connection.needs_rollback = False
|
104
|
+
if not db_connection.get_autocommit():
|
198
105
|
# Pretend we're already in an atomic block to bypass the code
|
199
106
|
# that disables autocommit to enter a transaction, and make a
|
200
107
|
# note to deal with this case in __exit__.
|
201
|
-
|
202
|
-
|
108
|
+
db_connection.in_atomic_block = True
|
109
|
+
db_connection.commit_on_exit = False
|
203
110
|
|
204
|
-
if
|
111
|
+
if db_connection.in_atomic_block:
|
205
112
|
# We're already in a transaction; create a savepoint, unless we
|
206
113
|
# were told not to or we're already waiting for a rollback. The
|
207
114
|
# second condition avoids creating useless savepoints and prevents
|
208
115
|
# overwriting needs_rollback until the rollback is performed.
|
209
|
-
if self.savepoint and not
|
210
|
-
sid =
|
211
|
-
|
116
|
+
if self.savepoint and not db_connection.needs_rollback:
|
117
|
+
sid = db_connection.savepoint()
|
118
|
+
db_connection.savepoint_ids.append(sid)
|
212
119
|
else:
|
213
|
-
|
120
|
+
db_connection.savepoint_ids.append(None)
|
214
121
|
else:
|
215
|
-
|
122
|
+
db_connection.set_autocommit(
|
216
123
|
False, force_begin_transaction_with_broken_autocommit=True
|
217
124
|
)
|
218
|
-
|
125
|
+
db_connection.in_atomic_block = True
|
219
126
|
|
220
|
-
if
|
221
|
-
|
127
|
+
if db_connection.in_atomic_block:
|
128
|
+
db_connection.atomic_blocks.append(self)
|
222
129
|
|
223
130
|
def __exit__(self, exc_type, exc_value, traceback):
|
224
|
-
|
225
|
-
|
226
|
-
if connection.in_atomic_block:
|
227
|
-
connection.atomic_blocks.pop()
|
131
|
+
if db_connection.in_atomic_block:
|
132
|
+
db_connection.atomic_blocks.pop()
|
228
133
|
|
229
|
-
if
|
230
|
-
sid =
|
134
|
+
if db_connection.savepoint_ids:
|
135
|
+
sid = db_connection.savepoint_ids.pop()
|
231
136
|
else:
|
232
137
|
# Prematurely unset this flag to allow using commit or rollback.
|
233
|
-
|
138
|
+
db_connection.in_atomic_block = False
|
234
139
|
|
235
140
|
try:
|
236
|
-
if
|
141
|
+
if db_connection.closed_in_transaction:
|
237
142
|
# The database will perform a rollback by itself.
|
238
143
|
# Wait until we exit the outermost block.
|
239
144
|
pass
|
240
145
|
|
241
|
-
elif exc_type is None and not
|
242
|
-
if
|
146
|
+
elif exc_type is None and not db_connection.needs_rollback:
|
147
|
+
if db_connection.in_atomic_block:
|
243
148
|
# Release savepoint if there is one
|
244
149
|
if sid is not None:
|
245
150
|
try:
|
246
|
-
|
151
|
+
db_connection.savepoint_commit(sid)
|
247
152
|
except DatabaseError:
|
248
153
|
try:
|
249
|
-
|
154
|
+
db_connection.savepoint_rollback(sid)
|
250
155
|
# The savepoint won't be reused. Release it to
|
251
156
|
# minimize overhead for the database server.
|
252
|
-
|
157
|
+
db_connection.savepoint_commit(sid)
|
253
158
|
except Error:
|
254
159
|
# If rolling back to a savepoint fails, mark for
|
255
160
|
# rollback at a higher level and avoid shadowing
|
256
161
|
# the original exception.
|
257
|
-
|
162
|
+
db_connection.needs_rollback = True
|
258
163
|
raise
|
259
164
|
else:
|
260
165
|
# Commit transaction
|
261
166
|
try:
|
262
|
-
|
167
|
+
db_connection.commit()
|
263
168
|
except DatabaseError:
|
264
169
|
try:
|
265
|
-
|
170
|
+
db_connection.rollback()
|
266
171
|
except Error:
|
267
172
|
# An error during rollback means that something
|
268
|
-
# went wrong with the
|
269
|
-
|
173
|
+
# went wrong with the db_connection. Drop it.
|
174
|
+
db_connection.close()
|
270
175
|
raise
|
271
176
|
else:
|
272
177
|
# This flag will be set to True again if there isn't a savepoint
|
273
178
|
# allowing to perform the rollback at this level.
|
274
|
-
|
275
|
-
if
|
179
|
+
db_connection.needs_rollback = False
|
180
|
+
if db_connection.in_atomic_block:
|
276
181
|
# Roll back to savepoint if there is one, mark for rollback
|
277
182
|
# otherwise.
|
278
183
|
if sid is None:
|
279
|
-
|
184
|
+
db_connection.needs_rollback = True
|
280
185
|
else:
|
281
186
|
try:
|
282
|
-
|
187
|
+
db_connection.savepoint_rollback(sid)
|
283
188
|
# The savepoint won't be reused. Release it to
|
284
189
|
# minimize overhead for the database server.
|
285
|
-
|
190
|
+
db_connection.savepoint_commit(sid)
|
286
191
|
except Error:
|
287
192
|
# If rolling back to a savepoint fails, mark for
|
288
193
|
# rollback at a higher level and avoid shadowing
|
289
194
|
# the original exception.
|
290
|
-
|
195
|
+
db_connection.needs_rollback = True
|
291
196
|
else:
|
292
197
|
# Roll back transaction
|
293
198
|
try:
|
294
|
-
|
199
|
+
db_connection.rollback()
|
295
200
|
except Error:
|
296
201
|
# An error during rollback means that something
|
297
|
-
# went wrong with the
|
298
|
-
|
202
|
+
# went wrong with the db_connection. Drop it.
|
203
|
+
db_connection.close()
|
299
204
|
|
300
205
|
finally:
|
301
206
|
# Outermost block exit when autocommit was enabled.
|
302
|
-
if not
|
303
|
-
if
|
304
|
-
|
207
|
+
if not db_connection.in_atomic_block:
|
208
|
+
if db_connection.closed_in_transaction:
|
209
|
+
db_connection.connection = None
|
305
210
|
else:
|
306
|
-
|
211
|
+
db_connection.set_autocommit(True)
|
307
212
|
# Outermost block exit when autocommit was disabled.
|
308
|
-
elif not
|
309
|
-
if
|
310
|
-
|
213
|
+
elif not db_connection.savepoint_ids and not db_connection.commit_on_exit:
|
214
|
+
if db_connection.closed_in_transaction:
|
215
|
+
db_connection.connection = None
|
311
216
|
else:
|
312
|
-
|
217
|
+
db_connection.in_atomic_block = False
|
313
218
|
|
314
219
|
|
315
|
-
def atomic(
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
# Decorator: @atomic(...) or context manager: with atomic(...): ...
|
321
|
-
else:
|
322
|
-
return Atomic(using, savepoint, durable)
|
220
|
+
def atomic(func=None, *, savepoint=True, durable=False):
|
221
|
+
"""Create an atomic transaction context or decorator."""
|
222
|
+
if callable(func):
|
223
|
+
return Atomic(savepoint, durable)(func)
|
224
|
+
return Atomic(savepoint, durable)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: plain.models
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.34.1
|
4
4
|
Summary: Database models for Plain.
|
5
5
|
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
6
6
|
License-File: LICENSE
|
@@ -71,19 +71,17 @@ To connect to a database, you can provide a `DATABASE_URL` environment variable.
|
|
71
71
|
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
|
72
72
|
```
|
73
73
|
|
74
|
-
Or you can manually define the `
|
74
|
+
Or you can manually define the `DATABASE` setting.
|
75
75
|
|
76
76
|
```python
|
77
77
|
# app/settings.py
|
78
|
-
|
79
|
-
"
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
"PORT": "5432",
|
86
|
-
}
|
78
|
+
DATABASE = {
|
79
|
+
"ENGINE": "plain.models.backends.postgresql",
|
80
|
+
"NAME": "dbname",
|
81
|
+
"USER": "user",
|
82
|
+
"PASSWORD": "password",
|
83
|
+
"HOST": "localhost",
|
84
|
+
"PORT": "5432",
|
87
85
|
}
|
88
86
|
```
|
89
87
|
|
@@ -1,42 +1,43 @@
|
|
1
|
-
plain/models/
|
2
|
-
plain/models/
|
1
|
+
plain/models/CHANGELOG.md,sha256=COnA--DTd1IojcgEcH2Z0CC4Yp5t8NA5GWXkhyAy0pE,1582
|
2
|
+
plain/models/README.md,sha256=vsZPev3Fna-Irdcs3-wrOcAoII5LOhXdcWLBMT87CS0,1626
|
3
|
+
plain/models/__init__.py,sha256=dnU6MOXs3lGoK31nLWjCqbf7zigkaUccomchz9lNDJ8,2950
|
3
4
|
plain/models/aggregates.py,sha256=P0mhsMl1VZt2CVHMuCHnNI8SxZ9citjDLEgioN6NOpo,7240
|
4
|
-
plain/models/base.py,sha256=
|
5
|
-
plain/models/cli.py,sha256
|
5
|
+
plain/models/base.py,sha256=rjPWtHI0YzTJ--uRgQ-CrMK-iNhttNFAWWWC2h4pqis,68095
|
6
|
+
plain/models/cli.py,sha256=-K5ZrMbwL-fcUOze64_U4uOPpCuppa-ibdoOaCFvBF4,43966
|
6
7
|
plain/models/config.py,sha256=OF7eIEtXNZyGwgc3eMEpb5uEAup5RXeT-0um60dfBeU,636
|
7
|
-
plain/models/connections.py,sha256=
|
8
|
+
plain/models/connections.py,sha256=RBNa2FZ0x3C9un6PaYL-IYzH_OesRSpdHNGKvYHGiOM,2276
|
8
9
|
plain/models/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210
|
9
|
-
plain/models/constraints.py,sha256=
|
10
|
+
plain/models/constraints.py,sha256=ZECMnw6urCjRu6XLDjXE5zuFdeZOE-hzowCAa8N8xGU,16967
|
10
11
|
plain/models/database_url.py,sha256=iidKVhOylf5N6t1EMPRySRQiv6LiuRjYRECB_UJ3MI8,6419
|
11
|
-
plain/models/db.py,sha256=
|
12
|
-
plain/models/default_settings.py,sha256=
|
13
|
-
plain/models/deletion.py,sha256=
|
12
|
+
plain/models/db.py,sha256=FpdfLYrRX2THUzDy4QdJ_OpSo9IFKLerZIEQ-T2x8zA,1348
|
13
|
+
plain/models/default_settings.py,sha256=cDym1o_DtHySWgDRIdjgEM0YxjgYU51ZqzWVA3vpzTk,569
|
14
|
+
plain/models/deletion.py,sha256=izvpGwvP8xxmuNVKvuYaeAKFD03FZMMfjkRUmMBiTDI,17631
|
14
15
|
plain/models/entrypoints.py,sha256=EC14mW19tK9dCumaNHnv4_9jQV8jomQ8jXy8Ib89VBw,191
|
15
16
|
plain/models/enums.py,sha256=Zr-JKt2aeYsSADtAm69fDRfajS7jYwop2vWQVLJ9YYI,2726
|
16
17
|
plain/models/exceptions.py,sha256=IqzK60-hY3TYsgOMxlWwgpVa21E7ydC-gqUG4tNvVJc,2042
|
17
|
-
plain/models/expressions.py,sha256=
|
18
|
-
plain/models/forms.py,sha256=
|
19
|
-
plain/models/indexes.py,sha256=
|
20
|
-
plain/models/lookups.py,sha256=
|
21
|
-
plain/models/manager.py,sha256=
|
22
|
-
plain/models/options.py,sha256=
|
23
|
-
plain/models/preflight.py,sha256=
|
24
|
-
plain/models/query.py,sha256=
|
25
|
-
plain/models/query_utils.py,sha256=
|
18
|
+
plain/models/expressions.py,sha256=hN6sfOxqxpP0qmYOUotsFAAn2-bnl35iHwyINyXA7CI,62763
|
19
|
+
plain/models/forms.py,sha256=M53zESGUdkJk6B6GD6vcGQ_aVvqF3S2eKBgcmMdvHyI,28548
|
20
|
+
plain/models/indexes.py,sha256=fazIZPJgCX5_Bhwk7MQy3YbWOxpHvaCe1dDLGGldTuY,11540
|
21
|
+
plain/models/lookups.py,sha256=0tbuMBpd4DlTUeO0IdZPtSO2GcjsSgcbRcj5lYfe87M,24776
|
22
|
+
plain/models/manager.py,sha256=zc2W-vTTk3zkDXCds5-TCXgLhVmM4PdQb-qtu-njeLQ,5827
|
23
|
+
plain/models/options.py,sha256=AxlxzHY_cKIcuWESeIDM02fzknGl4KN0-Bp5XWr3IVk,23829
|
24
|
+
plain/models/preflight.py,sha256=PlS1S2YHEpSKZ57KbTP6TbED98dDDXYSBUk6xMIpgsI,8136
|
25
|
+
plain/models/query.py,sha256=DEqiSsNPNtPX6_Cycwemq5XH99CoCi_7y42BEtBi5cE,92648
|
26
|
+
plain/models/query_utils.py,sha256=EtKxtyAk36Jou0Uz4beADGENEucQymziVtfp7uJjoSQ,14254
|
26
27
|
plain/models/registry.py,sha256=5yxVgT_W8GlyL2bsGT2HvMQB5sKolXucP2qrhr7Wlnk,8126
|
27
|
-
plain/models/transaction.py,sha256=
|
28
|
+
plain/models/transaction.py,sha256=KqkRDT6aqMgbPA_ch7qO8a9NyDvwY_2FaxM7FkBkcgY,9357
|
28
29
|
plain/models/utils.py,sha256=rD47CAMH4SsznTe-kUnRUdnaZeZHVv1fwLUiU3KOFW0,1630
|
29
30
|
plain/models/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
31
|
plain/models/backends/ddl_references.py,sha256=rPgGp1mjcZyIo6aA8OjNvPRv42yCBbvVgk9IEHAcAGc,8096
|
31
|
-
plain/models/backends/utils.py,sha256=
|
32
|
+
plain/models/backends/utils.py,sha256=QFmpqe1FATF7KcLc00OhZbQzM_L9dPvtqptXe4hU4FU,9808
|
32
33
|
plain/models/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
-
plain/models/backends/base/base.py,sha256=
|
34
|
+
plain/models/backends/base/base.py,sha256=I5040pUAe7-yNTb9wfMNOYjeiFQLZ5dcRI4rtmVKJ04,26457
|
34
35
|
plain/models/backends/base/client.py,sha256=90Ffs6zZYCli3tJjwsPH8TItZ8tz1Pp-zhQa-EpsNqc,937
|
35
|
-
plain/models/backends/base/creation.py,sha256=
|
36
|
+
plain/models/backends/base/creation.py,sha256=idyE4g7uhqPWmTf9oMlovpoIqQaZFv5fvQ-DGnqKAYM,10029
|
36
37
|
plain/models/backends/base/features.py,sha256=nHUkFjKSx_w9QwD4l-jXP_zotvspy9o6ayn-AHzzrHI,7959
|
37
|
-
plain/models/backends/base/introspection.py,sha256=
|
38
|
+
plain/models/backends/base/introspection.py,sha256=8icKf9h8y4kobmyrbo8JWTDcpQIAt4oS_4FtCnY7FqQ,6815
|
38
39
|
plain/models/backends/base/operations.py,sha256=Y08cS7IZwYXMKVUoEpBCjyOTh1PW2OShoRU9TZdipss,25740
|
39
|
-
plain/models/backends/base/schema.py,sha256=
|
40
|
+
plain/models/backends/base/schema.py,sha256=6AWP7eIpUIn1yu3q7tCYoabR7C2FL4WRGio3tuoVHkU,65606
|
40
41
|
plain/models/backends/base/validation.py,sha256=2zpI11hyUJr0I0cA1xmvoFwQVdZ-7_1T2F11TpQ0Rkk,1067
|
41
42
|
plain/models/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
43
|
plain/models/backends/mysql/base.py,sha256=9PEaRvRcU9MBfir-s_rNooemDmjQQpfzB1DxJJdmC14,15985
|
@@ -47,33 +48,33 @@ plain/models/backends/mysql/features.py,sha256=OPHaiqPmAFAUZqnZdLOqbCmxmuGMnIqa6
|
|
47
48
|
plain/models/backends/mysql/introspection.py,sha256=nKhuFDi8xxj0DZH8_45F-XOARiHxWBoW21_2lTFARUc,14131
|
48
49
|
plain/models/backends/mysql/operations.py,sha256=zLtg50k7WzqO3eZjLAknhKg29bxm0-ysd1_NydlDlzQ,16665
|
49
50
|
plain/models/backends/mysql/schema.py,sha256=W6sV2DLdGAeM7ZX80m1XCRtV95DDhyochy8oJ18bet8,9870
|
50
|
-
plain/models/backends/mysql/validation.py,sha256=
|
51
|
+
plain/models/backends/mysql/validation.py,sha256=TFYpuRoy3yG3SGfMFtRewaWq5gISN6FBaq-AD0DY7SI,1946
|
51
52
|
plain/models/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
52
|
-
plain/models/backends/postgresql/base.py,sha256=
|
53
|
+
plain/models/backends/postgresql/base.py,sha256=urYnS-g85OYet5vhYOMvl0O9sLpxRqnmwShS6b_AJQ8,16087
|
53
54
|
plain/models/backends/postgresql/client.py,sha256=EcqNtyQ9Kt5mA6sOmrO_5PGZBGo7fjMc9VQ-hcxJs1s,2055
|
54
55
|
plain/models/backends/postgresql/creation.py,sha256=HSGzWzsx3-IayEVZvgqcYqIE_HCtAEBK0uIPh5duPKg,1555
|
55
56
|
plain/models/backends/postgresql/features.py,sha256=O8iWfAjqyOX7DhjZaGJvyO-vmWcrkDopFnG2bHEQK44,1322
|
56
57
|
plain/models/backends/postgresql/introspection.py,sha256=IV7E_vT0TQ5UaTgGIi0a5nYb7WOZdRXx2NyNFGuVB2E,11334
|
57
58
|
plain/models/backends/postgresql/operations.py,sha256=CZ5wtgV1wvUJOCyBLmtnWEIecERJIO9AijqISJVINs4,11309
|
58
|
-
plain/models/backends/postgresql/schema.py,sha256=
|
59
|
+
plain/models/backends/postgresql/schema.py,sha256=NCVBhSfcacoGd4uQpvRGEkjtXf94_9W5L6bfoDPQVFg,13689
|
59
60
|
plain/models/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
61
|
plain/models/backends/sqlite3/_functions.py,sha256=XsohPZN-xFEEmC28stQzAiSMvE0nHJ1cMHfL2Ze72vI,14317
|
61
|
-
plain/models/backends/sqlite3/base.py,sha256=
|
62
|
+
plain/models/backends/sqlite3/base.py,sha256=h0nFOR89IqFRnBLgjKLPf9eutHOQPmpiatjt4ZjlU34,13265
|
62
63
|
plain/models/backends/sqlite3/client.py,sha256=dvxY10LFJHKY6ykOuCE6e45Wo4fAH4IPDtNCH3Wvd34,324
|
63
|
-
plain/models/backends/sqlite3/creation.py,sha256=
|
64
|
-
plain/models/backends/sqlite3/features.py,sha256=
|
64
|
+
plain/models/backends/sqlite3/creation.py,sha256=zNAJRkr--ZKJv8QeJWEaYAh8pLPPBK-dclHgelAMn6M,2877
|
65
|
+
plain/models/backends/sqlite3/features.py,sha256=xbGiBom7Kh0xNTLZrFmTQ32C7M8q8UEmyi6hoBd25kE,2326
|
65
66
|
plain/models/backends/sqlite3/introspection.py,sha256=RMzb8RUfNUvrcbcmgIKjxwp5D2uoth4-eJF-bduBo2o,17286
|
66
67
|
plain/models/backends/sqlite3/operations.py,sha256=K2PFCsvzGhBrPEzz1AXFenge2B4Ap8lsQAABsC4e_UI,15302
|
67
|
-
plain/models/backends/sqlite3/schema.py,sha256=
|
68
|
+
plain/models/backends/sqlite3/schema.py,sha256=sbtI0PBGe0fK0IOFWh0bkpVntCMMVsfzPb9dpL7o4r8,22566
|
68
69
|
plain/models/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
69
70
|
plain/models/backups/cli.py,sha256=du_751qWPtJT7C3GF_nLfHucMoUzlUOz9OKUwqHQ16s,2990
|
70
71
|
plain/models/backups/clients.py,sha256=WQ4X4KrkNeiKYJcpGRwnfRiAeeyduHWEnq4tA4mtjvw,4047
|
71
|
-
plain/models/backups/core.py,sha256=
|
72
|
-
plain/models/fields/__init__.py,sha256=
|
73
|
-
plain/models/fields/json.py,sha256=
|
72
|
+
plain/models/backups/core.py,sha256=09IZUhBEe1Yej3PC8AidtkaI0c8tt7VnqGBCWK-WrFg,3318
|
73
|
+
plain/models/fields/__init__.py,sha256=fZXZzsvFoIEte-0XSdKjYhkr3mqZ2NqjFD9KPU_HmxI,80319
|
74
|
+
plain/models/fields/json.py,sha256=OdGW4EYBSHQgkuugB-EiIXOqGstUqcMKUvOTOVUHqEQ,18049
|
74
75
|
plain/models/fields/mixins.py,sha256=K_ocrSbb6pPuGwYZeqgzoZskwCIMFIB6IV3T5CrU5J0,1805
|
75
|
-
plain/models/fields/related.py,sha256=
|
76
|
-
plain/models/fields/related_descriptors.py,sha256=
|
76
|
+
plain/models/fields/related.py,sha256=v3MH00jy2dcqk8bnYGmABnXIr5OMJ413V9qQL0wej2s,60321
|
77
|
+
plain/models/fields/related_descriptors.py,sha256=UKwyJi7jGGFO373nPSfX20xOIxo460Xm9Zf-qqZ7Sh8,38703
|
77
78
|
plain/models/fields/related_lookups.py,sha256=AyAtd5iK_MMkvsQxsFznMCv36QtLoT9NMLLp0v4tDwQ,7785
|
78
79
|
plain/models/fields/reverse_related.py,sha256=PGEFus3ov_0U3W8Ijj1MZlYoFrhUhFllZ8fpZLggvR8,11070
|
79
80
|
plain/models/functions/__init__.py,sha256=aglCm_JtzDYk2KmxubDN_78CGG3JCfRWnfJ74Oj5YJ4,2658
|
@@ -86,34 +87,34 @@ plain/models/functions/window.py,sha256=3S0QIZc_pIVcWpE5Qq-OxixmtATLb8rZrWkvCfVt
|
|
86
87
|
plain/models/migrations/__init__.py,sha256=ZAQUGrfr_OxYMIO7vUBIHLs_M3oZ4iQSjDzCHRFUdtI,96
|
87
88
|
plain/models/migrations/autodetector.py,sha256=sPOhIXdUQkiEUmzS3OYGTwM-9cEzLx7kHj3Hghre9OQ,62972
|
88
89
|
plain/models/migrations/exceptions.py,sha256=_bGjIMaBP2Py9ePUxUhiH0p1zXrQM4JhJO4lWfyF8-g,1044
|
89
|
-
plain/models/migrations/executor.py,sha256=
|
90
|
+
plain/models/migrations/executor.py,sha256=0xvduDwB_6KuCFMXsArhmlkEQkTigoMJFptwUTqPOoc,11204
|
90
91
|
plain/models/migrations/graph.py,sha256=nrztu_8dU0wAUSxKUqqFWpvZcSQxGEqE6dXWkPytmCU,12570
|
91
|
-
plain/models/migrations/loader.py,sha256=
|
92
|
-
plain/models/migrations/migration.py,sha256=
|
92
|
+
plain/models/migrations/loader.py,sha256=qUTmaEYI1_mV6goQPQYZKjSz8rMbE6G1wqvrAsmuGwA,16464
|
93
|
+
plain/models/migrations/migration.py,sha256=22YwRHnaRnCkBpW5p7K89tAU6h4QSsG5yiq-o7W-cSI,6505
|
93
94
|
plain/models/migrations/optimizer.py,sha256=HH-uz-jnWw_Ni6F2_rRW1nax1Dxmf1s_F_8s8N2OlVc,3266
|
94
95
|
plain/models/migrations/questioner.py,sha256=Q0JSiumYYGHkv4O8LFWioNvtJZa0J2JHIvf0NX7eSZM,12490
|
95
|
-
plain/models/migrations/recorder.py,sha256=
|
96
|
+
plain/models/migrations/recorder.py,sha256=9UfNdzM5meeOXSxMNxTN69uqX0K2uh5Ma7dNA2fL2rI,3655
|
96
97
|
plain/models/migrations/serializer.py,sha256=IRO1-8ojalOFt27DSfCDhRWjTULQZQ-aSroL-A9MPbk,12947
|
97
98
|
plain/models/migrations/state.py,sha256=Xb09rIdh3D-LVx3gPgaJ2mcXDL6WWW92gq6coJsjycM,35476
|
98
99
|
plain/models/migrations/utils.py,sha256=mvyEoEq7Weojh9RjAYRMLq2EXZcXUayZQTNpan7mUw4,4441
|
99
100
|
plain/models/migrations/writer.py,sha256=N8Rnjv5ccsA_CTcS7zZyppzyHFOUQVJy0l6RZYjwF-0,10981
|
100
101
|
plain/models/migrations/operations/__init__.py,sha256=C8VTJbzvFgt7AXTPvtuY8HF1FC8rqNvsXMOCW26UV9E,802
|
101
|
-
plain/models/migrations/operations/base.py,sha256=
|
102
|
-
plain/models/migrations/operations/fields.py,sha256=
|
103
|
-
plain/models/migrations/operations/models.py,sha256=
|
104
|
-
plain/models/migrations/operations/special.py,sha256=
|
102
|
+
plain/models/migrations/operations/base.py,sha256=JsKGjM6ouvEbFHzV14km7YjkpOUC4PoUR1M2yGZ82bE,4323
|
103
|
+
plain/models/migrations/operations/fields.py,sha256=1BfQ5xt-EaJnp2N_nv9jsMFFQ9kQu70GvsHW5w9a4yU,11450
|
104
|
+
plain/models/migrations/operations/models.py,sha256=bdsEhCCi6UJVxKaNA4wJUGrU9ZmeqZZItJUBZ-2a4TM,26855
|
105
|
+
plain/models/migrations/operations/special.py,sha256=SiL_7u3rSj35uhc8JPmFHtItt_k_EgbLhY-TEXfmkaI,5162
|
105
106
|
plain/models/sql/__init__.py,sha256=FoRCcab-kh_XY8C4eldgLy9-zuk-M63Nyi9cFsYjclU,225
|
106
|
-
plain/models/sql/compiler.py,sha256=
|
107
|
+
plain/models/sql/compiler.py,sha256=MrwiVKfWxk_fL_cwY1exiM7wbnasIfcfh_4-Q1XKnlA,84734
|
107
108
|
plain/models/sql/constants.py,sha256=usb1LSh9WNGPsurWAGppDkV0wYJJg5GEegKibQdS718,533
|
108
109
|
plain/models/sql/datastructures.py,sha256=FC88CVCukLyU621JrmKLBhmgvotEHgAhIOYfVvJpuR0,7084
|
109
|
-
plain/models/sql/query.py,sha256=
|
110
|
-
plain/models/sql/subqueries.py,sha256=
|
111
|
-
plain/models/sql/where.py,sha256=
|
110
|
+
plain/models/sql/query.py,sha256=gsCBVo5l3yJusukX2xarD1pGoOD69M2W3X3YGx1YjgI,109508
|
111
|
+
plain/models/sql/subqueries.py,sha256=JkVjYuWyEBpSDFNMOH00RmXxe8V4cERjUQ_ypGepqyo,5847
|
112
|
+
plain/models/sql/where.py,sha256=ezE9Clt2BmKo-I7ARsgqZ_aVA-1UdayCwr6ULSWZL6c,12635
|
112
113
|
plain/models/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
113
|
-
plain/models/test/pytest.py,sha256=
|
114
|
-
plain/models/test/utils.py,sha256=
|
115
|
-
plain_models-0.
|
116
|
-
plain_models-0.
|
117
|
-
plain_models-0.
|
118
|
-
plain_models-0.
|
119
|
-
plain_models-0.
|
114
|
+
plain/models/test/pytest.py,sha256=5mxY1MHqfCFJ7G39W1DuE0vCHfsfehQQmOyE6vI6caw,3323
|
115
|
+
plain/models/test/utils.py,sha256=MxBNWoGMtwAtka7LbxWgilgzv7T5qqJL8ystF2SDJrs,345
|
116
|
+
plain_models-0.34.1.dist-info/METADATA,sha256=dkV8i5GN8rOwJHDF5jdZK-Q82F7x8mMqi5N7EGQIBeY,1921
|
117
|
+
plain_models-0.34.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
118
|
+
plain_models-0.34.1.dist-info/entry_points.txt,sha256=IYJAW9MpL3PXyXFWmKmALagAGXC_5rzBn2eEGJlcV04,112
|
119
|
+
plain_models-0.34.1.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
|
120
|
+
plain_models-0.34.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|