plain.models 0.45.0__py3-none-any.whl → 0.46.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/preflight.py CHANGED
@@ -1,88 +1,87 @@
1
1
  import inspect
2
2
  from collections import defaultdict
3
- from itertools import chain
4
3
 
4
+ from plain.models.db import db_connection
5
5
  from plain.models.registry import models_registry
6
6
  from plain.packages import packages_registry
7
- from plain.preflight import Error, Warning, register_check
7
+ from plain.preflight import PreflightCheck, PreflightResult, register_check
8
8
 
9
9
 
10
- @register_check
11
- def check_database_backends(database=False, **kwargs):
12
- if not database:
13
- return []
10
+ @register_check("models.database_backends")
11
+ class CheckDatabaseBackends(PreflightCheck):
12
+ """Validates database backend configuration when plain.models is available."""
14
13
 
15
- from plain.models.db import db_connection
14
+ def run(self):
15
+ return db_connection.validation.preflight()
16
16
 
17
- return db_connection.validation.check(**kwargs)
18
17
 
18
+ @register_check("models.all_models")
19
+ class CheckAllModels(PreflightCheck):
20
+ """Validates all model definitions for common issues."""
19
21
 
20
- @register_check
21
- def check_all_models(package_configs=None, **kwargs):
22
- db_table_models = defaultdict(list)
23
- indexes = defaultdict(list)
24
- constraints = defaultdict(list)
25
- errors = []
26
- if package_configs is None:
22
+ def run(self):
23
+ db_table_models = defaultdict(list)
24
+ indexes = defaultdict(list)
25
+ constraints = defaultdict(list)
26
+ errors = []
27
27
  models = models_registry.get_models()
28
- else:
29
- models = chain.from_iterable(
30
- models_registry.get_models(package_label=package_config.package_label)
31
- for package_config in package_configs
32
- )
33
- for model in models:
34
- db_table_models[model._meta.db_table].append(model._meta.label)
35
- if not inspect.ismethod(model.check):
36
- errors.append(
37
- Error(
38
- f"The '{model.__name__}.check()' class method is currently overridden by {model.check!r}.",
39
- obj=model,
40
- id="models.E020",
28
+ for model in models:
29
+ db_table_models[model._meta.db_table].append(model._meta.label)
30
+ if not inspect.ismethod(model.preflight):
31
+ errors.append(
32
+ PreflightResult(
33
+ fix=f"The '{model.__name__}.preflight()' class method is currently overridden by {model.preflight!r}.",
34
+ obj=model,
35
+ id="models.preflight_method_overridden",
36
+ )
41
37
  )
42
- )
43
- else:
44
- errors.extend(model.check(**kwargs))
45
- for model_index in model._meta.indexes:
46
- indexes[model_index.name].append(model._meta.label)
47
- for model_constraint in model._meta.constraints:
48
- constraints[model_constraint.name].append(model._meta.label)
49
- for db_table, model_labels in db_table_models.items():
50
- if len(model_labels) != 1:
51
- model_labels_str = ", ".join(model_labels)
52
- errors.append(
53
- Error(
54
- f"db_table '{db_table}' is used by multiple models: {model_labels_str}.",
55
- obj=db_table,
56
- id="models.E028",
38
+ else:
39
+ errors.extend(model.preflight())
40
+ for model_index in model._meta.indexes:
41
+ indexes[model_index.name].append(model._meta.label)
42
+ for model_constraint in model._meta.constraints:
43
+ constraints[model_constraint.name].append(model._meta.label)
44
+ for db_table, model_labels in db_table_models.items():
45
+ if len(model_labels) != 1:
46
+ model_labels_str = ", ".join(model_labels)
47
+ errors.append(
48
+ PreflightResult(
49
+ fix=f"db_table '{db_table}' is used by multiple models: {model_labels_str}.",
50
+ obj=db_table,
51
+ id="models.duplicate_db_table",
52
+ )
57
53
  )
58
- )
59
- for index_name, model_labels in indexes.items():
60
- if len(model_labels) > 1:
61
- model_labels = set(model_labels)
62
- errors.append(
63
- Error(
64
- "index name '{}' is not unique {} {}.".format(
65
- index_name,
66
- "for model" if len(model_labels) == 1 else "among models:",
67
- ", ".join(sorted(model_labels)),
54
+ for index_name, model_labels in indexes.items():
55
+ if len(model_labels) > 1:
56
+ model_labels = set(model_labels)
57
+ errors.append(
58
+ PreflightResult(
59
+ fix="index name '{}' is not unique {} {}.".format(
60
+ index_name,
61
+ "for model" if len(model_labels) == 1 else "among models:",
62
+ ", ".join(sorted(model_labels)),
63
+ ),
64
+ id="models.index_name_not_unique_single"
65
+ if len(model_labels) == 1
66
+ else "models.index_name_not_unique_multiple",
68
67
  ),
69
- id="models.E029" if len(model_labels) == 1 else "models.E030",
70
- ),
71
- )
72
- for constraint_name, model_labels in constraints.items():
73
- if len(model_labels) > 1:
74
- model_labels = set(model_labels)
75
- errors.append(
76
- Error(
77
- "constraint name '{}' is not unique {} {}.".format(
78
- constraint_name,
79
- "for model" if len(model_labels) == 1 else "among models:",
80
- ", ".join(sorted(model_labels)),
68
+ )
69
+ for constraint_name, model_labels in constraints.items():
70
+ if len(model_labels) > 1:
71
+ model_labels = set(model_labels)
72
+ errors.append(
73
+ PreflightResult(
74
+ fix="constraint name '{}' is not unique {} {}.".format(
75
+ constraint_name,
76
+ "for model" if len(model_labels) == 1 else "among models:",
77
+ ", ".join(sorted(model_labels)),
78
+ ),
79
+ id="models.constraint_name_not_unique_single"
80
+ if len(model_labels) == 1
81
+ else "models.constraint_name_not_unique_multiple",
81
82
  ),
82
- id="models.E031" if len(model_labels) == 1 else "models.E032",
83
- ),
84
- )
85
- return errors
83
+ )
84
+ return errors
86
85
 
87
86
 
88
87
  def _check_lazy_references(models_registry, packages_registry):
@@ -140,7 +139,11 @@ def _check_lazy_references(models_registry, packages_registry):
140
139
  "field": keywords["field"],
141
140
  "model_error": app_model_error(model_key),
142
141
  }
143
- return Error(error_msg % params, obj=keywords["field"], id="fields.E307")
142
+ return PreflightResult(
143
+ fix=error_msg % params,
144
+ obj=keywords["field"],
145
+ id="fields.lazy_reference_not_resolvable",
146
+ )
144
147
 
145
148
  def default_error(model_key, func, args, keywords):
146
149
  error_msg = (
@@ -151,7 +154,11 @@ def _check_lazy_references(models_registry, packages_registry):
151
154
  "model": ".".join(model_key),
152
155
  "model_error": app_model_error(model_key),
153
156
  }
154
- return Error(error_msg % params, obj=func, id="models.E022")
157
+ return PreflightResult(
158
+ fix=error_msg % params,
159
+ obj=func,
160
+ id="models.lazy_reference_resolution_failed",
161
+ )
155
162
 
156
163
  # Maps common uses of lazy operations to corresponding error functions
157
164
  # defined above. If a key maps to None, no error will be produced.
@@ -174,41 +181,41 @@ def _check_lazy_references(models_registry, packages_registry):
174
181
  for func in models_registry._pending_operations[model_key]
175
182
  ),
176
183
  ),
177
- key=lambda error: error.msg,
184
+ key=lambda error: error.message,
178
185
  )
179
186
 
180
187
 
181
- @register_check
182
- def check_lazy_references(package_configs=None, **kwargs):
183
- return _check_lazy_references(models_registry, packages_registry)
188
+ @register_check("models.lazy_references")
189
+ class CheckLazyReferences(PreflightCheck):
190
+ """Ensures all lazy (string) model references have been resolved."""
184
191
 
192
+ def run(self):
193
+ return _check_lazy_references(models_registry, packages_registry)
185
194
 
186
- @register_check
187
- def check_database_tables(package_configs, **kwargs):
188
- from plain.models.db import db_connection
189
195
 
190
- if not kwargs.get("database", False):
191
- return []
196
+ @register_check("models.database_tables")
197
+ class CheckDatabaseTables(PreflightCheck):
198
+ """Checks for unknown tables in the database when plain.models is available."""
192
199
 
193
- errors = []
194
-
195
- db_tables = db_connection.introspection.table_names()
196
- model_tables = db_connection.introspection.plain_table_names()
197
- unknown_tables = set(db_tables) - set(model_tables)
198
- unknown_tables.discard("plainmigrations") # Know this could be there
199
- if unknown_tables:
200
- table_names = ", ".join(unknown_tables)
201
- specific_hint = f'echo "DROP TABLE IF EXISTS {unknown_tables.pop()}" | plain models db-shell'
202
- errors.append(
203
- Warning(
204
- f"Unknown tables in default database: {table_names}",
205
- hint=(
200
+ def run(self):
201
+ errors = []
202
+
203
+ db_tables = db_connection.introspection.table_names()
204
+ model_tables = db_connection.introspection.plain_table_names()
205
+ unknown_tables = set(db_tables) - set(model_tables)
206
+ unknown_tables.discard("plainmigrations") # Know this could be there
207
+ if unknown_tables:
208
+ table_names = ", ".join(unknown_tables)
209
+ specific_fix = f'echo "DROP TABLE IF EXISTS {unknown_tables.pop()}" | plain models db-shell'
210
+ errors.append(
211
+ PreflightResult(
212
+ fix=f"Unknown tables in default database: {table_names}. "
206
213
  "Tables may be from packages/models that have been uninstalled. "
207
214
  "Make sure you have a backup and delete the tables manually "
208
- f"(ex. `{specific_hint}`)."
209
- ),
210
- id="plain.models.W001",
215
+ f"(ex. `{specific_fix}`).",
216
+ id="models.unknown_database_tables",
217
+ warning=True,
218
+ )
211
219
  )
212
- )
213
220
 
214
- return errors
221
+ return errors
plain/models/query.py CHANGED
@@ -2204,7 +2204,15 @@ def prefetch_one_level(instances, prefetcher, lookup, level):
2204
2204
  if leaf and lookup.queryset is not None:
2205
2205
  qs = queryset._apply_rel_filters(lookup.queryset)
2206
2206
  else:
2207
- qs = queryset.__class__(model=queryset.model)
2207
+ # Check if queryset is a QuerySet or a related manager
2208
+ # We need a QuerySet instance to cache the prefetched values
2209
+ if isinstance(queryset, QuerySet):
2210
+ # It's already a QuerySet, create a new instance
2211
+ qs = queryset.__class__(model=queryset.model)
2212
+ else:
2213
+ # It's a related manager, get its QuerySet
2214
+ # The manager's query property returns a properly filtered QuerySet
2215
+ qs = queryset.query
2208
2216
  qs._result_cache = vals
2209
2217
  # We don't want the individual qs doing prefetch_related now,
2210
2218
  # since we have merged this into the current work.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain.models
3
- Version: 0.45.0
3
+ Version: 0.46.1
4
4
  Summary: Model your data and store it in a database.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -1,11 +1,11 @@
1
1
  plain/models/AGENTS.md,sha256=xQQW-z-DehnCUyjiGSBfLqUjoSUdo_W1b0JmwYmWieA,209
2
- plain/models/CHANGELOG.md,sha256=ydLOL2WwmZYT94V1tj0cqFocz6E7zo5M-Q7XWvIia_A,15529
2
+ plain/models/CHANGELOG.md,sha256=4voxndtCFoJPgNaMk6hb9-pmBS-pNOEvc8-zsgcPXXM,17129
3
3
  plain/models/README.md,sha256=lqzWJrEIxBCHC1P8X1YoRjbsMFlu0-kG4ujP76B_ZO4,8572
4
4
  plain/models/__init__.py,sha256=aB9HhIKBh0iK3LZztInAE-rDF-yKsdfcjfMtwtN5vnI,2920
5
5
  plain/models/aggregates.py,sha256=P0mhsMl1VZt2CVHMuCHnNI8SxZ9citjDLEgioN6NOpo,7240
6
- plain/models/base.py,sha256=APZ1K8hbiznIdW6GvzPC6o1LhofX-ggOPuMPcwZtqME,66180
6
+ plain/models/base.py,sha256=4NkK-gkcxbIWZm7c9Q51eDwLClIieWZvlRg6l7vJOxE,65692
7
7
  plain/models/cli.py,sha256=lhvlw7DVOU3CVoMUpHaj7qIbQ2d6qtSm_l9PdCeCnc0,36404
8
- plain/models/config.py,sha256=OF7eIEtXNZyGwgc3eMEpb5uEAup5RXeT-0um60dfBeU,636
8
+ plain/models/config.py,sha256=-m15VY1ZJKWdPGt-5i9fnMvz9LBzPfSRgWmWeEV8Dao,382
9
9
  plain/models/connections.py,sha256=RBNa2FZ0x3C9un6PaYL-IYzH_OesRSpdHNGKvYHGiOM,2276
10
10
  plain/models/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210
11
11
  plain/models/constraints.py,sha256=Mm9gm5D7EKmo486dL481-hrTcxi2gxgqyUUtbGrkLjs,16749
@@ -22,8 +22,8 @@ plain/models/indexes.py,sha256=fazIZPJgCX5_Bhwk7MQy3YbWOxpHvaCe1dDLGGldTuY,11540
22
22
  plain/models/lookups.py,sha256=eCsxQXUcOoAa_U_fAAd3edcgXI1wfyFW8hPgUh8TwTo,24776
23
23
  plain/models/options.py,sha256=BOnu9NDVcgL0tJhan5gBbaK1SWNeg4NVTPNAzkKT3NE,21528
24
24
  plain/models/otel.py,sha256=36QSJS6UXv1YPJTqeSmEvdMVHRkXa_zgqqItJaXc59g,7619
25
- plain/models/preflight.py,sha256=PlS1S2YHEpSKZ57KbTP6TbED98dDDXYSBUk6xMIpgsI,8136
26
- plain/models/query.py,sha256=6t0ow7oQfVB6WiC3fQ3kLme8TBeSOscEt5xl2lu6oOQ,89703
25
+ plain/models/preflight.py,sha256=_cBX7AnfQDNtZfoW0ydxH8WQM3ftCqcH0-tPhqS5q8c,8973
26
+ plain/models/query.py,sha256=0Mzg-tczpxGQ383GI2HwV-wf7GMKl_ivhPedeY1MpNY,90220
27
27
  plain/models/query_utils.py,sha256=zxAdfwDbOmaN_SJODl4Wl9gs-q2EzOjXbsBFTWWhh8g,14174
28
28
  plain/models/registry.py,sha256=5yxVgT_W8GlyL2bsGT2HvMQB5sKolXucP2qrhr7Wlnk,8126
29
29
  plain/models/transaction.py,sha256=KqkRDT6aqMgbPA_ch7qO8a9NyDvwY_2FaxM7FkBkcgY,9357
@@ -39,9 +39,9 @@ plain/models/backends/base/features.py,sha256=1AehdhpeC7VobhggwpeXIt7HJNY2EWY700
39
39
  plain/models/backends/base/introspection.py,sha256=8icKf9h8y4kobmyrbo8JWTDcpQIAt4oS_4FtCnY7FqQ,6815
40
40
  plain/models/backends/base/operations.py,sha256=tzuw7AgVb3aZn2RHamReGNco7wIt4UBkAHx8HebDZ_s,25652
41
41
  plain/models/backends/base/schema.py,sha256=GjASTEydinLbHg1f1-_l_eCu2CD3YV0vtT3Q7v8qTxY,64863
42
- plain/models/backends/base/validation.py,sha256=2zpI11hyUJr0I0cA1xmvoFwQVdZ-7_1T2F11TpQ0Rkk,1067
42
+ plain/models/backends/base/validation.py,sha256=ATkhZ36RgKHrXhdiOzIK5kRHW56eSggLhzrcviSJPQ8,1061
43
43
  plain/models/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- plain/models/backends/mysql/base.py,sha256=AvN-1aL94lTtGW0Z7O1g23gTG6zCSRtA_B0kt-U0LUQ,14324
44
+ plain/models/backends/mysql/base.py,sha256=FCANhKAs2013oLPdC9y4PQCRb9NYsp1Zca_wha6TDT4,14286
45
45
  plain/models/backends/mysql/client.py,sha256=YGjk4f5VOuIKcj5SOOJeBqiSDF0Ft9m1aUPOmLzdD6c,2973
46
46
  plain/models/backends/mysql/compiler.py,sha256=NaYgcGyFUZ2lTOXXJj87hLMMMnXRAS1jUYkJq1NoCv4,3289
47
47
  plain/models/backends/mysql/creation.py,sha256=ozuc3mz65bjFz6sn5BFLRRGQsUYaxwIGjQyKod31c1Y,952
@@ -49,18 +49,18 @@ plain/models/backends/mysql/features.py,sha256=OPHaiqPmAFAUZqnZdLOqbCmxmuGMnIqa6
49
49
  plain/models/backends/mysql/introspection.py,sha256=R3U912qnWwJDmTiX7QzGAXTc2LAShIhp4C6xHTABM68,13960
50
50
  plain/models/backends/mysql/operations.py,sha256=PieuZMwRtdAGRUR-TAIsOxR7qS-70h1B6LbyA3VR0YM,16591
51
51
  plain/models/backends/mysql/schema.py,sha256=LmP62COVuhpbH4gYulcSQNJgGuolc3RTFGsudoohJOQ,9942
52
- plain/models/backends/mysql/validation.py,sha256=TFYpuRoy3yG3SGfMFtRewaWq5gISN6FBaq-AD0DY7SI,1946
52
+ plain/models/backends/mysql/validation.py,sha256=DYnuPvIXGeLi66_uCZISKsS9xFTgj5CIWfaO8iarzu4,1996
53
53
  plain/models/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- plain/models/backends/postgresql/base.py,sha256=yOKwpaX24fHhh_CrZS2mw2T9iajq5F-hGLRAckx-KgY,15870
54
+ plain/models/backends/postgresql/base.py,sha256=5GPl5lc5wld9sL0oL-kAmstm-c6E5JGN3fxijiQp7o8,15836
55
55
  plain/models/backends/postgresql/client.py,sha256=EcqNtyQ9Kt5mA6sOmrO_5PGZBGo7fjMc9VQ-hcxJs1s,2055
56
56
  plain/models/backends/postgresql/creation.py,sha256=HSGzWzsx3-IayEVZvgqcYqIE_HCtAEBK0uIPh5duPKg,1555
57
57
  plain/models/backends/postgresql/features.py,sha256=O8iWfAjqyOX7DhjZaGJvyO-vmWcrkDopFnG2bHEQK44,1322
58
58
  plain/models/backends/postgresql/introspection.py,sha256=n_H2FIMzF5MI1D7kW7u5J1-ny2bM3_ARvSx4zuXpfQ4,11163
59
- plain/models/backends/postgresql/operations.py,sha256=c20oM27eflKLYaVOJclminrWVEgSU6cqavFn80VFXs4,11242
59
+ plain/models/backends/postgresql/operations.py,sha256=kEP_Eoi2v-fUd902e7pYHrJtwjSg6069_ShwWOxB3qk,11192
60
60
  plain/models/backends/postgresql/schema.py,sha256=6nruXkfuVesoqeCK5xDzGuZQRJLWj6n8G1VkPPzw8b0,13543
61
61
  plain/models/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  plain/models/backends/sqlite3/_functions.py,sha256=XsohPZN-xFEEmC28stQzAiSMvE0nHJ1cMHfL2Ze72vI,14317
63
- plain/models/backends/sqlite3/base.py,sha256=O8fqoQL6PkCRtb7tBteh7aqY-e-DtSNqz6qgsmjnY3w,13258
63
+ plain/models/backends/sqlite3/base.py,sha256=tvAt7ptT284wCLwMr-y68WEeojG95S_6PKzlImGkW38,13220
64
64
  plain/models/backends/sqlite3/client.py,sha256=dvxY10LFJHKY6ykOuCE6e45Wo4fAH4IPDtNCH3Wvd34,324
65
65
  plain/models/backends/sqlite3/creation.py,sha256=dH4rqZj79TCMHmaBash4I_io15QCxnam92fuWrRK_R8,2788
66
66
  plain/models/backends/sqlite3/features.py,sha256=V7ueGfbUSzBNGgMRtCptXSH_0b51lyVfzi-98BX4afo,2366
@@ -71,10 +71,10 @@ plain/models/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
71
71
  plain/models/backups/cli.py,sha256=AKVh_Go0LxnxFi2jQjmpPEbbJvYCurjJsGCWESm1X8A,2960
72
72
  plain/models/backups/clients.py,sha256=gHYQkukqamR_uksMr9wy3tBpMxK6DyUyj7nndNIlbo8,4744
73
73
  plain/models/backups/core.py,sha256=09IZUhBEe1Yej3PC8AidtkaI0c8tt7VnqGBCWK-WrFg,3318
74
- plain/models/fields/__init__.py,sha256=HrGTFOeG8Bt5pHWmiClmdn1qZcvCOIcXx4a5RKiIdr4,77938
75
- plain/models/fields/json.py,sha256=OdGW4EYBSHQgkuugB-EiIXOqGstUqcMKUvOTOVUHqEQ,18049
76
- plain/models/fields/mixins.py,sha256=K_ocrSbb6pPuGwYZeqgzoZskwCIMFIB6IV3T5CrU5J0,1805
77
- plain/models/fields/related.py,sha256=W5pvb_J0AulyQmd-q8Vzh4b9GT7IDmeAaJNCZhsMqkw,49698
74
+ plain/models/fields/__init__.py,sha256=-daSts1wN63oU_XXQUlNPmk81-JPQzXwY1FdCMRnTng,74732
75
+ plain/models/fields/json.py,sha256=4WHZX5MI-GZapcaaHltPgc6f9pHAezjfaTYNh_PX8rQ,18041
76
+ plain/models/fields/mixins.py,sha256=wmu3JJEOimijgepjMEFPN8u74mHpefgnsB4u5ZzVCUY,1890
77
+ plain/models/fields/related.py,sha256=7Ku8E5hxQxVgJy3afWZfuDlHDzrky_4mkKwPlqLpM6o,51065
78
78
  plain/models/fields/related_descriptors.py,sha256=nsVgLjpOlrha90eTfg7ad_il6_uI_YG0d4bH51LP3Os,15180
79
79
  plain/models/fields/related_lookups.py,sha256=9y6AfEcg8xRRZne2LXFP6jym9mecFlB_toYih7lD8Uw,7781
80
80
  plain/models/fields/related_managers.py,sha256=XiV2IvuEFLEWnej2KokCu6HFx87UyZTqqsP74v2xIHw,25011
@@ -97,7 +97,7 @@ plain/models/migrations/optimizer.py,sha256=HH-uz-jnWw_Ni6F2_rRW1nax1Dxmf1s_F_8s
97
97
  plain/models/migrations/questioner.py,sha256=qAsePI5JHiSJrlY_kmpgMuK9Dom22q17edov7RtBeGw,11967
98
98
  plain/models/migrations/recorder.py,sha256=_ncIVLJ4ns6AaO0vVmCoXfABlOFXDKu8NTPsutqKjK4,3653
99
99
  plain/models/migrations/serializer.py,sha256=yBP9TyUZlSh_8qdw1I4VotbsZqoomz3mBs7ASQLsDH8,12459
100
- plain/models/migrations/state.py,sha256=Q70cByjFgb8UG-wWqnLntf5s0hNv5DuDv0Bw1ovJ0yg,32116
100
+ plain/models/migrations/state.py,sha256=EB3BCST2SxpijGjdEhh2Jqp-wr4Fb29bhvOZP3ZWdqg,32120
101
101
  plain/models/migrations/utils.py,sha256=Ih_mu6UbdUSt-ZtHaB0xIXHDrBANuFZyftTQ56BFJYs,4174
102
102
  plain/models/migrations/writer.py,sha256=N8Rnjv5ccsA_CTcS7zZyppzyHFOUQVJy0l6RZYjwF-0,10981
103
103
  plain/models/migrations/operations/__init__.py,sha256=YKZsQsJ4G5iw9F4o6dOSgSCuLiiKuApvneoV4jqjZaA,752
@@ -115,8 +115,8 @@ plain/models/sql/where.py,sha256=ezE9Clt2BmKo-I7ARsgqZ_aVA-1UdayCwr6ULSWZL6c,126
115
115
  plain/models/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
116
  plain/models/test/pytest.py,sha256=KD5-mxonBxOYIhUh9Ql5uJOIiC9R4t-LYfb6sjA0UdE,3486
117
117
  plain/models/test/utils.py,sha256=S3d6zf3OFWDxB_kBJr0tDvwn51bjwDVWKPumv37N-p8,467
118
- plain_models-0.45.0.dist-info/METADATA,sha256=KH-Dp-3YMLQe0QWKK9VxV6c79zoghtxuqAqrEoq0qYI,8884
119
- plain_models-0.45.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
120
- plain_models-0.45.0.dist-info/entry_points.txt,sha256=IYJAW9MpL3PXyXFWmKmALagAGXC_5rzBn2eEGJlcV04,112
121
- plain_models-0.45.0.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
122
- plain_models-0.45.0.dist-info/RECORD,,
118
+ plain_models-0.46.1.dist-info/METADATA,sha256=WuLQKMHTTBKeEP1zmLYoHbjVxxkIi3sKOgee-MewjrM,8884
119
+ plain_models-0.46.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
120
+ plain_models-0.46.1.dist-info/entry_points.txt,sha256=IYJAW9MpL3PXyXFWmKmALagAGXC_5rzBn2eEGJlcV04,112
121
+ plain_models-0.46.1.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
122
+ plain_models-0.46.1.dist-info/RECORD,,