liminal-orm 2.0.3a0__py3-none-any.whl → 2.0.4__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.
liminal/.DS_Store ADDED
Binary file
@@ -13,13 +13,13 @@ Order of operations based on order class var:
13
13
  6. ArchiveDropdownOption
14
14
  7. ReorderDropdownOptions
15
15
  8. CreateSchema
16
- 9. UpdateSchema
17
- 10. UnarchiveSchema
18
- 11. CreateField
19
- 12. UnarchiveField
20
- 13. UpdateField
21
- 14. ArchiveField
22
- 15. UpdateEntitySchemaNameTemplate
16
+ 9. UpdateEntitySchemaNameTemplate
17
+ 10. UpdateSchema
18
+ 11. UnarchiveSchema
19
+ 12. CreateField
20
+ 13. UnarchiveField
21
+ 14. UpdateField
22
+ 15. ArchiveField
23
23
  16. ReorderFields
24
24
  17. ArchiveSchema
25
25
  18. ArchiveDropdown
@@ -18,6 +18,7 @@ from liminal.entity_schemas.operations import (
18
18
  UpdateEntitySchemaNameTemplate,
19
19
  )
20
20
  from liminal.entity_schemas.utils import get_converted_tag_schemas
21
+ from liminal.enums.benchling_naming_strategy import BenchlingNamingStrategy
21
22
  from liminal.orm.base_model import BaseModel
22
23
  from liminal.orm.column import Column
23
24
  from liminal.utils import to_snake_case
@@ -275,6 +276,16 @@ def compare_entity_schemas(
275
276
  col.properties.set_warehouse_name(wh_name)
276
277
  for wh_name, col in model_columns.items()
277
278
  ]
279
+ template_based_naming_strategies = {
280
+ s
281
+ for s in model.__schema_properties__.naming_strategies
282
+ if BenchlingNamingStrategy.is_template_based(s)
283
+ }
284
+ model.__schema_properties__.naming_strategies = {
285
+ s
286
+ for s in model.__schema_properties__.naming_strategies
287
+ if not BenchlingNamingStrategy.is_template_based(s)
288
+ }
278
289
  ops.append(
279
290
  CompareOperation(
280
291
  op=CreateEntitySchema(
@@ -288,28 +299,10 @@ def compare_entity_schemas(
288
299
  ),
289
300
  )
290
301
  )
291
- benchling_given_wh_name = to_snake_case(model.__schema_properties__.name)
292
- if model.__schema_properties__.warehouse_name != benchling_given_wh_name:
293
- ops.append(
294
- CompareOperation(
295
- op=UpdateEntitySchema(
296
- benchling_given_wh_name,
297
- BaseSchemaProperties(
298
- warehouse_name=model.__schema_properties__.warehouse_name
299
- ),
300
- ),
301
- reverse_op=UpdateEntitySchema(
302
- model.__schema_properties__.warehouse_name,
303
- BaseSchemaProperties(
304
- warehouse_name=benchling_given_wh_name
305
- ),
306
- ),
307
- )
308
- )
309
302
  benchling_given_name_template = BaseNameTemplate(
310
303
  parts=[], order_name_parts_by_sequence=False
311
304
  )
312
- if benchling_name_template != model.__name_template__:
305
+ if benchling_given_name_template != model.__name_template__:
313
306
  ops.append(
314
307
  CompareOperation(
315
308
  op=UpdateEntitySchemaNameTemplate(
@@ -323,13 +316,39 @@ def compare_entity_schemas(
323
316
  reverse_op=UpdateEntitySchemaNameTemplate(
324
317
  model.__schema_properties__.warehouse_name,
325
318
  BaseNameTemplate(
326
- **benchling_given_name_template.merge(
327
- model.__name_template__
319
+ **model.__name_template__.merge(
320
+ benchling_given_name_template
328
321
  )
329
322
  ),
330
323
  ),
331
324
  )
332
325
  )
326
+ benchling_given_wh_name = to_snake_case(model.__schema_properties__.name)
327
+ new_schema_props = BaseSchemaProperties()
328
+ rollback_schema_props = BaseSchemaProperties()
329
+ if model.__schema_properties__.warehouse_name != benchling_given_wh_name:
330
+ new_schema_props.warehouse_name = (
331
+ model.__schema_properties__.warehouse_name
332
+ )
333
+ rollback_schema_props.warehouse_name = benchling_given_wh_name
334
+ if template_based_naming_strategies:
335
+ new_schema_props.naming_strategies = template_based_naming_strategies
336
+ rollback_schema_props.naming_strategies = (
337
+ model.__schema_properties__.naming_strategies
338
+ )
339
+ if new_schema_props.model_dump(exclude_unset=True) != {}:
340
+ ops.append(
341
+ CompareOperation(
342
+ op=UpdateEntitySchema(
343
+ benchling_given_wh_name,
344
+ new_schema_props,
345
+ ),
346
+ reverse_op=UpdateEntitySchema(
347
+ model.__schema_properties__.warehouse_name,
348
+ rollback_schema_props,
349
+ ),
350
+ )
351
+ )
333
352
 
334
353
  model_operations[model.__schema_properties__.warehouse_name] = ops
335
354
  running_benchling_schema_names = [
@@ -105,7 +105,7 @@ def generate_all_entity_schema_files(
105
105
  if not has_date:
106
106
  import_strings.append("from datetime import datetime")
107
107
  if (
108
- col.type == BenchlingFieldType.ENTITY_LINK
108
+ col.type in BenchlingFieldType.get_entity_link_types()
109
109
  and col.entity_link is not None
110
110
  ):
111
111
  if not col.is_multi:
@@ -162,7 +162,7 @@ class ArchiveEntitySchema(BaseOperation):
162
162
 
163
163
 
164
164
  class UnarchiveEntitySchema(BaseOperation):
165
- order: ClassVar[int] = 100
165
+ order: ClassVar[int] = 110
166
166
 
167
167
  def __init__(self, wh_schema_name: str) -> None:
168
168
  self.wh_schema_name = wh_schema_name
@@ -187,7 +187,7 @@ class UnarchiveEntitySchema(BaseOperation):
187
187
 
188
188
 
189
189
  class UpdateEntitySchema(BaseOperation):
190
- order: ClassVar[int] = 90
190
+ order: ClassVar[int] = 100
191
191
 
192
192
  def __init__(
193
193
  self,
@@ -251,7 +251,7 @@ class UpdateEntitySchema(BaseOperation):
251
251
 
252
252
 
253
253
  class UpdateEntitySchemaNameTemplate(BaseOperation):
254
- order: ClassVar[int] = 150
254
+ order: ClassVar[int] = 90
255
255
 
256
256
  def __init__(
257
257
  self,
@@ -283,7 +283,7 @@ class UpdateEntitySchemaNameTemplate(BaseOperation):
283
283
 
284
284
 
285
285
  class CreateEntitySchemaField(BaseOperation):
286
- order: ClassVar[int] = 110
286
+ order: ClassVar[int] = 120
287
287
 
288
288
  def __init__(
289
289
  self,
@@ -370,7 +370,7 @@ class CreateEntitySchemaField(BaseOperation):
370
370
 
371
371
 
372
372
  class ArchiveEntitySchemaField(BaseOperation):
373
- order: ClassVar[int] = 140
373
+ order: ClassVar[int] = 150
374
374
 
375
375
  def __init__(
376
376
  self, wh_schema_name: str, wh_field_name: str, index: int | None = None
@@ -421,7 +421,7 @@ class ArchiveEntitySchemaField(BaseOperation):
421
421
 
422
422
 
423
423
  class UnarchiveEntitySchemaField(BaseOperation):
424
- order: ClassVar[int] = 120
424
+ order: ClassVar[int] = 130
425
425
 
426
426
  def __init__(
427
427
  self, wh_schema_name: str, wh_field_name: str, index: int | None = None
@@ -468,7 +468,7 @@ class UnarchiveEntitySchemaField(BaseOperation):
468
468
 
469
469
 
470
470
  class UpdateEntitySchemaField(BaseOperation):
471
- order: ClassVar[int] = 130
471
+ order: ClassVar[int] = 140
472
472
 
473
473
  def __init__(
474
474
  self,
@@ -164,7 +164,7 @@ class CreateTagSchemaFieldModel(BaseModel):
164
164
  )
165
165
 
166
166
  tagSchema = None
167
- if new_props.type == BenchlingFieldType.ENTITY_LINK:
167
+ if new_props.type in BenchlingFieldType.get_entity_link_types():
168
168
  if new_props.entity_link is not None:
169
169
  if benchling_service is None:
170
170
  raise ValueError(
@@ -32,3 +32,7 @@ class BenchlingFieldType(StrEnum):
32
32
  cls.DATE,
33
33
  cls.DATETIME,
34
34
  ]
35
+
36
+ @classmethod
37
+ def get_entity_link_types(cls) -> list[str]:
38
+ return [cls.ENTITY_LINK, cls.TRANSLATION_LINK]
@@ -11,6 +11,7 @@ class BenchlingNamingStrategy(StrEnum):
11
11
  )
12
12
  RENAME_WITH_TEMPLATE_WITH_ALIAS = "SET_FROM_NAME_PARTS" # Generate new registry IDs, rename according to name template, and keep old name as alias
13
13
  REPLACE_NAMES_WITH_TEMPLATE = "REPLACE_NAMES_FROM_PARTS" # Generate new registry IDs, and replace name according to name template
14
+ KEEP_NAMES = "KEEP_NAMES" # Keeps the original name
14
15
 
15
16
  @classmethod
16
17
  def is_template_based(cls, strategy: BenchlingNamingStrategy) -> bool:
liminal/mappers.py CHANGED
@@ -22,6 +22,8 @@ def convert_benchling_type_to_python_type(benchling_type: BenchlingFieldType) ->
22
22
  BenchlingFieldType.BLOB_LINK: dict[str, Any],
23
23
  BenchlingFieldType.CUSTOM_ENTITY_LINK: str,
24
24
  BenchlingFieldType.DNA_SEQUENCE_LINK: str,
25
+ BenchlingFieldType.AA_SEQUENCE_LINK: str,
26
+ BenchlingFieldType.TRANSLATION_LINK: str,
25
27
  BenchlingFieldType.DROPDOWN: str,
26
28
  BenchlingFieldType.ENTITY_LINK: str,
27
29
  BenchlingFieldType.ENTRY_LINK: str,
@@ -48,6 +50,8 @@ def convert_benchling_type_to_sql_alchemy_type(
48
50
  BenchlingFieldType.BLOB_LINK: JSON,
49
51
  BenchlingFieldType.CUSTOM_ENTITY_LINK: String,
50
52
  BenchlingFieldType.DNA_SEQUENCE_LINK: String,
53
+ BenchlingFieldType.AA_SEQUENCE_LINK: String,
54
+ BenchlingFieldType.TRANSLATION_LINK: String,
51
55
  BenchlingFieldType.DROPDOWN: String,
52
56
  BenchlingFieldType.ENTITY_LINK: String,
53
57
  BenchlingFieldType.ENTRY_LINK: String,
@@ -55,7 +59,6 @@ def convert_benchling_type_to_sql_alchemy_type(
55
59
  BenchlingFieldType.STORAGE_LINK: String,
56
60
  BenchlingFieldType.PART_LINK: String,
57
61
  BenchlingFieldType.MIXTURE_LINK: String,
58
- BenchlingFieldType.AA_SEQUENCE_LINK: String,
59
62
  BenchlingFieldType.TEXT: String,
60
63
  }
61
64
  if benchling_type in benchling_to_sql_alchemy_type_map:
@@ -141,7 +144,7 @@ def convert_api_field_type_to_field_type(
141
144
  ): BenchlingFieldType.PART_LINK,
142
145
  (
143
146
  BenchlingAPIFieldType.TRANSLATION_LINK,
144
- BenchlingFolderItemType.SEQUENCE,
147
+ None,
145
148
  ): BenchlingFieldType.TRANSLATION_LINK,
146
149
  (BenchlingAPIFieldType.FILE_LINK, None): BenchlingFieldType.ENTITY_LINK,
147
150
  (BenchlingAPIFieldType.FLOAT, None): BenchlingFieldType.DECIMAL,
liminal/orm/column.py CHANGED
@@ -73,19 +73,19 @@ class Column(SqlColumn):
73
73
  raise ValueError("Dropdown can only be set if the field type is DROPDOWN.")
74
74
  if dropdown is None and type == BenchlingFieldType.DROPDOWN:
75
75
  raise ValueError("Dropdown must be set if the field type is DROPDOWN.")
76
- if entity_link and type != BenchlingFieldType.ENTITY_LINK:
76
+ if entity_link and type not in BenchlingFieldType.get_entity_link_types():
77
77
  raise ValueError(
78
- "Entity link can only be set if the field type is ENTITY_LINK."
78
+ "Entity link can only be set if the field type is ENTITY_LINK or TRANSLATION_LINK."
79
79
  )
80
- if parent_link and type != BenchlingFieldType.ENTITY_LINK:
80
+ if parent_link and type not in BenchlingFieldType.get_entity_link_types():
81
81
  raise ValueError(
82
- "Parent link can only be set if the field type is ENTITY_LINK."
82
+ "Parent link can only be set if the field type is ENTITY_LINK or TRANSLATION_LINK."
83
83
  )
84
84
  if type in BenchlingFieldType.get_non_multi_select_types() and is_multi is True:
85
85
  raise ValueError(f"Field type {type} cannot have multi-value set as True.")
86
86
  self.sqlalchemy_type = sqlalchemy_type
87
87
  foreign_key = None
88
- if type == BenchlingFieldType.ENTITY_LINK and entity_link:
88
+ if type in BenchlingFieldType.get_entity_link_types() and entity_link:
89
89
  foreign_key = ForeignKey(f"{entity_link}$raw.id")
90
90
  if _warehouse_name:
91
91
  kwargs["name"] = _warehouse_name
Binary file
@@ -1,4 +1,3 @@
1
- import inspect
2
1
  from datetime import datetime
3
2
  from functools import partial, wraps
4
3
  from typing import TYPE_CHECKING, Any, Callable
@@ -102,7 +101,7 @@ class BenchlingValidatorReport(BaseModel):
102
101
 
103
102
 
104
103
  def liminal_validator(
105
- func: Callable[[type["BenchlingBaseModel"]], BenchlingValidatorReport | None]
104
+ func: Callable[["BenchlingBaseModel"], BenchlingValidatorReport | None]
106
105
  | None = None,
107
106
  *,
108
107
  validator_level: ValidationSeverity = ValidationSeverity.LOW,
@@ -125,15 +124,9 @@ def liminal_validator(
125
124
  validator_level=validator_level,
126
125
  validator_name=validator_name,
127
126
  )
128
- elif not isinstance(
129
- func, Callable[[type["BenchlingBaseModel"]], BenchlingValidatorReport | None]
130
- ):
131
- raise ValueError(
132
- "Parameters passed to liminal_validator must be keyword arguments, not positional arguments."
133
- )
134
127
 
135
128
  @wraps(func)
136
- def wrapper(self: type["BenchlingBaseModel"]) -> BenchlingValidatorReport:
129
+ def wrapper(self: "BenchlingBaseModel") -> BenchlingValidatorReport:
137
130
  """Wrapper that runs the validator function and returns a BenchlingValidatorReport."""
138
131
  try:
139
132
  ret_val = func(self)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: liminal-orm
3
- Version: 2.0.3a0
3
+ Version: 2.0.4
4
4
  Summary: An ORM and toolkit that builds on top of Benchling's platform to keep your schemas and downstream code dependencies in sync.
5
5
  Home-page: https://github.com/dynotx/liminal-orm
6
6
  Author: DynoTx Open Source
@@ -1,6 +1,7 @@
1
+ liminal/.DS_Store,sha256=s_ehSI1aIzOjVRnFlcSzhtWS3irmEDSGHyS6l0QRcus,8196
1
2
  liminal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
3
  liminal/base/base_dropdown.py,sha256=Unk4l_5Y8rj_eSWYqzFi2BAFSQToQDWW2qdXwiCHTg8,2523
3
- liminal/base/base_operation.py,sha256=RjGRaCTNQ5oVI4PAQ5D3svymw_HAcGvzBXWWrMRo29k,3128
4
+ liminal/base/base_operation.py,sha256=8Mus5Aao3QeYyMb6EBcuAu9kpVgiomtNH5ulq9kMfG8,3128
4
5
  liminal/base/base_validation_filters.py,sha256=kHG3G5gXkuNHQosMTrxRc57OTmczcaoSx0DmkrScIr4,1043
5
6
  liminal/base/compare_operation.py,sha256=hkpv4ewHhxy4dlTPKgJuzBjsAqO6Km7OrrKB44pRA_o,352
6
7
  liminal/base/name_template_parts.py,sha256=dJeyrhhhZHDwKXe_p7AtgDlbZlzsnYQ8FoM8FXVF7q0,271
@@ -21,22 +22,22 @@ liminal/dropdowns/generate_files.py,sha256=IqnBs-IyLsIZE0NUkdB99zd5EAF-1f9CPBebl
21
22
  liminal/dropdowns/operations.py,sha256=-TRIsxqnUtrIUjhrt5k_PdiBCDUXsXDzsOUmznJE-6Q,13516
22
23
  liminal/dropdowns/utils.py,sha256=1-H7bTszCUeqeRBpiYXjRjreDzhn1Fd1MFwIsrEI-o4,4109
23
24
  liminal/entity_schemas/api.py,sha256=Emn_Y95cAG9Wis6tpchw6QBVKQh4If86LOdgKk0Ndjw,3575
24
- liminal/entity_schemas/compare.py,sha256=CIYglq1F-g9jGc1eRRD4LnNErrH2n__pPIJc4EB1hkM,16570
25
+ liminal/entity_schemas/compare.py,sha256=t6tl67GWaMoNNcPxyLpCuNAlN3OWNqURTo3EUEMtETE,17549
25
26
  liminal/entity_schemas/entity_schema_models.py,sha256=YDpz1XkNc9e51zah8Z6qCk30gAuXP6xLEYv1Lb3ECpA,6838
26
- liminal/entity_schemas/generate_files.py,sha256=oYx0t76oRa36gWwVl1W5jHryh-POIyZPDMbGNjT5bfY,8877
27
- liminal/entity_schemas/operations.py,sha256=rs9EXmHDgnUad2SSfZ3tnDPFA6L-2wvllAGqBwBurMs,24020
28
- liminal/entity_schemas/tag_schema_models.py,sha256=h6Zf_zXYG_gTh2eQh_lEGZKUAmvzdnnArlmAhIeX1bM,22016
27
+ liminal/entity_schemas/generate_files.py,sha256=2_E-QdYdci10ORqs-AguPUXmA1le0wnyh7EmflrcTEA,8889
28
+ liminal/entity_schemas/operations.py,sha256=PvsPYHd5_geDwbkcQjRK4yfnYT7t6V36QLG-C8GISEQ,24020
29
+ liminal/entity_schemas/tag_schema_models.py,sha256=by5HnKi08Oj00buc751jFnDVAhbdKep7tbBaE5A9Plg,22028
29
30
  liminal/entity_schemas/utils.py,sha256=iZ1_M2r8zKOCFj9QSMdrv-_4XznDn_znAOfoP4Mh1jA,4943
30
31
  liminal/enums/__init__.py,sha256=Ue_3QtElW-JMSWtu4vGsAOFQbYnzHHZUdkWpdkzkKA4,453
31
32
  liminal/enums/benchling_api_field_type.py,sha256=0QamSWEMnxZtedZXlh6zNhSRogS9ZqvWskdHHN19xJo,633
32
33
  liminal/enums/benchling_entity_type.py,sha256=BS6U8qnRM3I3xTTqp9BbInV7yjPh9gC3ULvN6-zLaCM,624
33
- liminal/enums/benchling_field_type.py,sha256=uinDm5Mn_yGK1jlmlRH3NlAlXUzA1guNk8wF6lbUKD4,947
34
+ liminal/enums/benchling_field_type.py,sha256=VI0gdpeQR9Ja5VuusxLdScZKwLmN9rqIRD7_9ByC5O4,1069
34
35
  liminal/enums/benchling_folder_item_type.py,sha256=Jb-YxCvB8O86_qTsfwtLQOkKGjTWGKHFwIKf24eemYk,248
35
- liminal/enums/benchling_naming_strategy.py,sha256=wG3AfnPOui5Qfc0Fihszm5uKWjuc7gdpI8jptNB5A-w,1201
36
+ liminal/enums/benchling_naming_strategy.py,sha256=jmaR-Vfj3MWhna8tANBNjAgYUyoQ5wMbz1AIy2bv6Zk,1258
36
37
  liminal/enums/benchling_sequence_type.py,sha256=TBI4C5c1XKE4ZXqsz1ApDUzy2wR-04u-M3VO_zLikjM,202
37
38
  liminal/enums/name_template_part_type.py,sha256=Kv0phZIO_dPN3tLHM0lT2tjUd3zBGqpJQGahEpGjNcU,365
38
39
  liminal/external/__init__.py,sha256=nMpyzpBXpYhTvN3R3HQEiYb24_U2AYjz_20seAUUK9s,1264
39
- liminal/mappers.py,sha256=O9gc95b7JvfaR8xVrn0X1d0Tcs6Iwh-yhBHXhWSX8i0,9616
40
+ liminal/mappers.py,sha256=4GkotNH_yrcRdbfbTWUtUY_bMqXwMKcIGaUP-MEtZNA,9741
40
41
  liminal/migrate/components.py,sha256=2HuFp5KDNhofROMRI-BioUoA4CCjhQ_v_F0QmGJzUBU,3480
41
42
  liminal/migrate/revision.py,sha256=KppU0u-d0JsfPsXsmncxy9Q_XBJyf-o4e16wNZAJODM,7774
42
43
  liminal/migrate/revisions_timeline.py,sha256=G9VwxPrLhLqKOrIXyxrXyHpujc-72m7omsZjI5-0D0M,14520
@@ -46,23 +47,24 @@ liminal/orm/base_model.py,sha256=Nf4gSEwvORRdnY5ODW79ddJWxnshLLvrPo8xcimHH6c,138
46
47
  liminal/orm/base_tables/registry_entity.py,sha256=4ET1cepTGjZ3AMFI5q-iMYxMObzXwuUDBD0jNNqCipE,2126
47
48
  liminal/orm/base_tables/schema.py,sha256=7_btCVSUJxjVdGcKVRKL8sKcNw7-_gazTpfEh1jru3o,921
48
49
  liminal/orm/base_tables/user.py,sha256=elRAHj7HgO3iVLK_pNCIwf_9Rl_9k6vkBgaYazoJSQc,818
49
- liminal/orm/column.py,sha256=e4JWn97s_4EVJ1LOO5l6iucHQUd39Vl0stqMEj0uet8,5114
50
+ liminal/orm/column.py,sha256=_Ie2edtkAmTNV80fswM6plz2LfuqTfO2nvyTZPkyFc8,5198
50
51
  liminal/orm/mixins.py,sha256=yEeUDF1qEBLP523q8bZra4KtNVK0gwZN9mXJSNe3GEE,4802
51
52
  liminal/orm/name_template.py,sha256=ftXZOiRR6gGGvGaZkFVDXKOboIHFWauhQENRguBGWMI,1739
52
53
  liminal/orm/name_template_parts.py,sha256=KCGXAcCuOqCjlgYn-mw1K7fwDI92D20l-FnlpEVrbM8,2771
53
54
  liminal/orm/relationship.py,sha256=Zl4bMHbtDSPx1psGHYnojGGJpA8B8hwcPJdgjB1lmW0,2490
54
55
  liminal/orm/schema_properties.py,sha256=yv6MOsE_16OWJnGDh2K8wI_054PJwafYmHgY_Awr3XA,3420
55
56
  liminal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ liminal/tests/.DS_Store,sha256=0sTLf7flLKL2_3KGceYriAB8_gXTcYwn0c2RVSYmLZk,6148
56
58
  liminal/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
59
  liminal/tests/conftest.py,sha256=B463eOfe1uCHDJsUNvG-6tY8Qx8FJMByGDOtuyM87lA,17669
58
60
  liminal/tests/from benchling_sdk.py,sha256=CjRUHFB3iaa4rUPLGOqDiBq5EPKldm-Fd8aQQr92zF4,147
59
61
  liminal/tests/test_dropdown_compare.py,sha256=yHB0ovQlBLRu8-qYkqIPd8VtYEOmOft_93FQM86g_z8,8198
60
62
  liminal/tests/test_entity_schema_compare.py,sha256=-26Bu5eYIuHRswB5kYjGDo5Wed5LUWjm1e6IRI1Q-lE,18952
61
63
  liminal/utils.py,sha256=radRtRsZmCiNblMvxOX1DH0rcO5TR09kFlp6OONIPBU,2951
62
- liminal/validation/__init__.py,sha256=p9VoX4rYnDE1DHr2BOnZmRklX6LBNeerlVLPvvr6y0Y,5562
64
+ liminal/validation/__init__.py,sha256=TVaHrSF3GnSd4mbZrPn8TBHscGWkAPKAUUPq7-symC8,5275
63
65
  liminal/validation/validation_severity.py,sha256=ib03PTZCQHcbBDc01v4gJF53YtA-ANY6QSFnhTV-FbU,259
64
- liminal_orm-2.0.3a0.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
65
- liminal_orm-2.0.3a0.dist-info/METADATA,sha256=ANm_kbsM-VMU2lpUnbHutpmlWDyrOYmU1Rg_Zkhsq0c,11034
66
- liminal_orm-2.0.3a0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
67
- liminal_orm-2.0.3a0.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
68
- liminal_orm-2.0.3a0.dist-info/RECORD,,
66
+ liminal_orm-2.0.4.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
67
+ liminal_orm-2.0.4.dist-info/METADATA,sha256=Zfj3MIn8MMxLTUbQJODThCNCDTmefMwpuV-myafdaTA,11032
68
+ liminal_orm-2.0.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
69
+ liminal_orm-2.0.4.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
70
+ liminal_orm-2.0.4.dist-info/RECORD,,