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.
Files changed (56) hide show
  1. plain/models/CHANGELOG.md +27 -0
  2. plain/models/README.md +8 -10
  3. plain/models/__init__.py +2 -6
  4. plain/models/backends/base/base.py +10 -18
  5. plain/models/backends/base/creation.py +3 -4
  6. plain/models/backends/base/introspection.py +2 -3
  7. plain/models/backends/base/schema.py +3 -9
  8. plain/models/backends/mysql/validation.py +1 -1
  9. plain/models/backends/postgresql/base.py +15 -23
  10. plain/models/backends/postgresql/schema.py +0 -2
  11. plain/models/backends/sqlite3/base.py +1 -1
  12. plain/models/backends/sqlite3/creation.py +2 -2
  13. plain/models/backends/sqlite3/features.py +1 -1
  14. plain/models/backends/sqlite3/schema.py +1 -1
  15. plain/models/backends/utils.py +2 -6
  16. plain/models/backups/core.py +15 -22
  17. plain/models/base.py +179 -225
  18. plain/models/cli.py +25 -62
  19. plain/models/connections.py +48 -165
  20. plain/models/constraints.py +10 -10
  21. plain/models/db.py +7 -15
  22. plain/models/default_settings.py +13 -20
  23. plain/models/deletion.py +14 -16
  24. plain/models/expressions.py +7 -10
  25. plain/models/fields/__init__.py +56 -76
  26. plain/models/fields/json.py +9 -12
  27. plain/models/fields/related.py +5 -17
  28. plain/models/fields/related_descriptors.py +43 -95
  29. plain/models/forms.py +2 -4
  30. plain/models/indexes.py +2 -3
  31. plain/models/lookups.py +0 -7
  32. plain/models/manager.py +1 -14
  33. plain/models/migrations/executor.py +0 -16
  34. plain/models/migrations/loader.py +1 -1
  35. plain/models/migrations/migration.py +1 -1
  36. plain/models/migrations/operations/base.py +4 -11
  37. plain/models/migrations/operations/fields.py +4 -4
  38. plain/models/migrations/operations/models.py +10 -10
  39. plain/models/migrations/operations/special.py +6 -14
  40. plain/models/migrations/recorder.py +1 -1
  41. plain/models/options.py +4 -7
  42. plain/models/preflight.py +25 -44
  43. plain/models/query.py +47 -102
  44. plain/models/query_utils.py +4 -4
  45. plain/models/sql/compiler.py +7 -11
  46. plain/models/sql/query.py +32 -42
  47. plain/models/sql/subqueries.py +6 -8
  48. plain/models/sql/where.py +1 -1
  49. plain/models/test/pytest.py +21 -32
  50. plain/models/test/utils.py +7 -143
  51. plain/models/transaction.py +66 -164
  52. {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/METADATA +9 -11
  53. {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/RECORD +56 -55
  54. {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/WHEEL +0 -0
  55. {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/entry_points.txt +0 -0
  56. {plain_models-0.33.1.dist-info → plain_models-0.34.1.dist-info}/licenses/LICENSE +0 -0
@@ -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(using=None):
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
- connection = get_connection(using)
111
- if connection.get_autocommit():
22
+ if db_connection.get_autocommit():
112
23
  yield
113
24
  else:
114
- with transaction.atomic(using=using, savepoint=False):
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
- connection = get_connection(using)
123
- if connection.in_atomic_block:
124
- connection.needs_rollback = True
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, using=None, robust=False):
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
- get_connection(using).on_commit(func, robust)
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
- connection. None denotes the absence of a savepoint.
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, using, savepoint, durable):
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 connection.atomic_blocks
188
- and not connection.atomic_blocks[-1]._from_testcase
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 connection.in_atomic_block:
100
+ if not db_connection.in_atomic_block:
194
101
  # Reset state when entering an outermost atomic block.
195
- connection.commit_on_exit = True
196
- connection.needs_rollback = False
197
- if not connection.get_autocommit():
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
- connection.in_atomic_block = True
202
- connection.commit_on_exit = False
108
+ db_connection.in_atomic_block = True
109
+ db_connection.commit_on_exit = False
203
110
 
204
- if connection.in_atomic_block:
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 connection.needs_rollback:
210
- sid = connection.savepoint()
211
- connection.savepoint_ids.append(sid)
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
- connection.savepoint_ids.append(None)
120
+ db_connection.savepoint_ids.append(None)
214
121
  else:
215
- connection.set_autocommit(
122
+ db_connection.set_autocommit(
216
123
  False, force_begin_transaction_with_broken_autocommit=True
217
124
  )
218
- connection.in_atomic_block = True
125
+ db_connection.in_atomic_block = True
219
126
 
220
- if connection.in_atomic_block:
221
- connection.atomic_blocks.append(self)
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
- connection = get_connection(self.using)
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 connection.savepoint_ids:
230
- sid = connection.savepoint_ids.pop()
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
- connection.in_atomic_block = False
138
+ db_connection.in_atomic_block = False
234
139
 
235
140
  try:
236
- if connection.closed_in_transaction:
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 connection.needs_rollback:
242
- if connection.in_atomic_block:
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
- connection.savepoint_commit(sid)
151
+ db_connection.savepoint_commit(sid)
247
152
  except DatabaseError:
248
153
  try:
249
- connection.savepoint_rollback(sid)
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
- connection.savepoint_commit(sid)
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
- connection.needs_rollback = True
162
+ db_connection.needs_rollback = True
258
163
  raise
259
164
  else:
260
165
  # Commit transaction
261
166
  try:
262
- connection.commit()
167
+ db_connection.commit()
263
168
  except DatabaseError:
264
169
  try:
265
- connection.rollback()
170
+ db_connection.rollback()
266
171
  except Error:
267
172
  # An error during rollback means that something
268
- # went wrong with the connection. Drop it.
269
- connection.close()
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
- connection.needs_rollback = False
275
- if connection.in_atomic_block:
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
- connection.needs_rollback = True
184
+ db_connection.needs_rollback = True
280
185
  else:
281
186
  try:
282
- connection.savepoint_rollback(sid)
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
- connection.savepoint_commit(sid)
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
- connection.needs_rollback = True
195
+ db_connection.needs_rollback = True
291
196
  else:
292
197
  # Roll back transaction
293
198
  try:
294
- connection.rollback()
199
+ db_connection.rollback()
295
200
  except Error:
296
201
  # An error during rollback means that something
297
- # went wrong with the connection. Drop it.
298
- connection.close()
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 connection.in_atomic_block:
303
- if connection.closed_in_transaction:
304
- connection.connection = None
207
+ if not db_connection.in_atomic_block:
208
+ if db_connection.closed_in_transaction:
209
+ db_connection.connection = None
305
210
  else:
306
- connection.set_autocommit(True)
211
+ db_connection.set_autocommit(True)
307
212
  # Outermost block exit when autocommit was disabled.
308
- elif not connection.savepoint_ids and not connection.commit_on_exit:
309
- if connection.closed_in_transaction:
310
- connection.connection = None
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
- connection.in_atomic_block = False
217
+ db_connection.in_atomic_block = False
313
218
 
314
219
 
315
- def atomic(using=None, savepoint=True, durable=False):
316
- # Bare decorator: @atomic -- although the first argument is called
317
- # `using`, it's actually the function being decorated.
318
- if callable(using):
319
- return Atomic(DEFAULT_DB_ALIAS, savepoint, durable)(using)
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.33.1
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 `DATABASES` setting.
74
+ Or you can manually define the `DATABASE` setting.
75
75
 
76
76
  ```python
77
77
  # app/settings.py
78
- DATABASES = {
79
- "default": {
80
- "ENGINE": "plain.models.backends.postgresql",
81
- "NAME": "dbname",
82
- "USER": "user",
83
- "PASSWORD": "password",
84
- "HOST": "localhost",
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/README.md,sha256=7GG_9N7YPYG4JbeEK1mrF0aWvpvRQI05YPq-dWzAAsw,1675
2
- plain/models/__init__.py,sha256=autF0BhlnS4cjhxIIJpLjEdqsbSK2OupEuJkQWuzMGQ,3018
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=g-hWZAY2KF-QIemMZ5frRA0LVTlApS79_FaxfVqNM6Y,70584
5
- plain/models/cli.py,sha256=GGBx4_u6C86XIDv9hVcNg1JNBpsEJLT5j7UFhO-3vpk,45343
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=_F1ibDcfQCYJ0AzArSw1JjYcl6o-FwWUybvZh6S4HP4,6259
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=HK25tv2sbGuLgcc1AFTN1iYzBrs1uat0IcZ0WAL0s9Y,17169
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=7-5PB_0zfjzN3QrWuzBBCTKh7tcU37jAhSaTs0_XjAs,1478
12
- plain/models/default_settings.py,sha256=5UX0f7V-Lxr7OzIr3taJKy2HMRxiBkDdkuEUPt03f84,738
13
- plain/models/deletion.py,sha256=A2D-g8yguDmPUGhwA-hBqbOjaSLQezA0tATq5QtMBCA,17818
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=gkZe7X3SzFIfmGYLSr6-5HXhedUsf3RQ8-RqMHe58m4,62911
18
- plain/models/forms.py,sha256=UqCF65LfkJ-dIz0ilREJmeV1EE0AhfZqfTz_V-yLzBI,28610
19
- plain/models/indexes.py,sha256=kXsua7bYHk9TK3bMF_NR_-gTdHlAcP13QPnPac5A5oQ,11610
20
- plain/models/lookups.py,sha256=LQKSHRZn069twSDJHovRRy0aSPeGOr1VUiQZzTeugjM,25087
21
- plain/models/manager.py,sha256=u7hWKXePVrImG4jRxCpjK2EfG-TkmEwaNV1FE8icbfE,6198
22
- plain/models/options.py,sha256=zOE-bpQWwl7sWNrpHRbiW5sANNA4_dkYi3ZJ-LGhJQw,24053
23
- plain/models/preflight.py,sha256=0ddt-VIY6ANYDE6GXFax0QcaXugs69FX9DUAhqoG0pQ,8852
24
- plain/models/query.py,sha256=FQf8qSNjSI1tppOfYqheWMRhu7vbest0gSXYViOT9Bc,94785
25
- plain/models/query_utils.py,sha256=WVxbN4pBxZj6rcLoGAhcexTZ22dwgvdJPgpa2M5Mbgk,14310
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=ray_nt2K4HMxDZkCSf3gRL0bt4CAZwzfX7TpHU-RdUU,12050
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=WJP8xAeevQXw6Uwi1JHr9zta7Z3EbTl4G2C4aypS1Dw,9984
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=L4OneGHQ6kLlhdB4sPywrUVdjH813FzsN5JEQy9xuic,26757
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=KOqOSZj5X0-xbq1Wqd4lynfhh1bvJfrHPZ38nELpIko,10122
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=8AU3PH1VmOyHEBjk0qTVt6R8Bigju-OBNf2950YOcMQ,6886
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=JVaJnbdofupWoqE0qg4JuaMuUZqaUQ56Ttqq0eVVZKY,65767
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=iMg2Zta75ctP5DvWgNsKshAzv1vUJQh8ZtQ02Un9u8E,1968
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=CzeP7rcTtNNUWm0HsujcBYUDQ3KXxFsbPCAlNAEcwTs,16460
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=iVYqK9pTMJWtyrfqGB-U23Gatr9dH3D0c3tORSycnMM,13732
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=uqtEpnhy9_7srB9k9ibfuHosUurpoTkRawBCBME4ZLU,13266
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=I41EureB3LZn2oNTP-xS1E-4e63JnlrvnzJcg8ttJS0,2913
64
- plain/models/backends/sqlite3/features.py,sha256=1eZ53zX_CSz7h8gOLy2kUq0I-YmEUODqpGx6xcqTmfU,2347
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=FvPQBDLzbUopsxv_XRsK1FFyQm8Ay1KyvvueTi6g5Hw,22587
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=VZScI4GWR5xS21k0SF7Dicgic5c7WcefOyWRq_RZ3oo,3655
72
- plain/models/fields/__init__.py,sha256=I2hy14Ef0gHSc5CjwAJ32JjaJiwGMFa-Q7ACVAmXuWw,81206
73
- plain/models/fields/json.py,sha256=kIYwYeka5XpwWX8pU3hGJpCKuwvdRytECJLE1i6XhGo,18181
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=zMn644RqhVDehlqsMhuu5ZG81z8wbQoMaFgKqvmFmX8,60950
76
- plain/models/fields/related_descriptors.py,sha256=c1FPXj4mUKnrBaQQmbETLIsLbZAfY3Qr1ymmwDyWw-I,41771
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=xxHw7sdO76danJnpEthmYFxvKcokTLUBs_ghfbhByWg,11808
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=GnlfkH8VsIKvmIfuPosZjQAgA6BMkaDiUjxUSAdMz4w,16481
92
- plain/models/migrations/migration.py,sha256=0pK6yiB3a_ETELndgfQ7cF88OJCgQuQ6vjoxnyR7TkA,6535
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=eV8mv61x4OuBc-xSPh-imEXgq8RGJfz1samQuLorwKo,3678
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=IAD-lXOPHTF7w4zzc97d4deXZov9m8SJGi5amd9M2DE,4506
102
- plain/models/migrations/operations/fields.py,sha256=bV8whLkg0RztZVqmeNaVnE7uQgThp_18e2SN_EsopQ4,11474
103
- plain/models/migrations/operations/models.py,sha256=HLiSG0Dvt5r15QcLZM-xJEo1E5nwPGIrSDqAXEc0bjQ,26915
104
- plain/models/migrations/operations/special.py,sha256=hhj93Rh0rXFGA6PryCM91lIo11kgyg994XXcb3usHyg,5454
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=pehP0ipQYqpO7495XF4KEq7w8WqvZ4O4dLK4-7t0oiw,84938
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=cLeP2TkAic51AEMeDXVwUOf6l2TgcpS0JeLalJBd3i4,110207
110
- plain/models/sql/subqueries.py,sha256=jDDR1t6tzshkr5uW7_m6HyirNsziCt1IorC9RWoAOWA,5921
111
- plain/models/sql/where.py,sha256=ockp2wvM7DEyW_t9vGW9SLU0pBhRHuAsh46CxyPXVik,12656
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=OUQiw8MnvEKYQzzxP78slC0dJcsWG-vONTXSrhnrSnw,3843
114
- plain/models/test/utils.py,sha256=xWV81zgFGdc3IXOYzilPZ_a_W5LXOnZJ9j_rXAvKpFg,5384
115
- plain_models-0.33.1.dist-info/METADATA,sha256=E1VImZfIv-eWT4NYFAjCnHEF_b8g1IZgHrAwf59iKqc,1970
116
- plain_models-0.33.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
117
- plain_models-0.33.1.dist-info/entry_points.txt,sha256=IYJAW9MpL3PXyXFWmKmALagAGXC_5rzBn2eEGJlcV04,112
118
- plain_models-0.33.1.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
119
- plain_models-0.33.1.dist-info/RECORD,,
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,,