liminal-orm 4.0.0__py3-none-any.whl → 4.1.0__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
liminal/cli/cli.py CHANGED
@@ -141,7 +141,7 @@ def generate_files(
141
141
 
142
142
  @app.command(
143
143
  name="current",
144
- help="Returns the remote revision_id that your Benchling tenant is currently on. Reads this from the name on the '_liminal_remote' schema.",
144
+ help="Returns the remote revision_id that your Benchling tenant is currently on. Reads this from the name on the 'liminal_remote' schema.",
145
145
  )
146
146
  def current(
147
147
  benchling_tenant: str = typer.Argument(
@@ -156,7 +156,7 @@ def current(
156
156
  remote_revision_id = benchling_service.get_remote_revision_id()
157
157
  if current_revision_id is not None:
158
158
  warnings.warn(
159
- f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the '_liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
159
+ f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the 'liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
160
160
  FutureWarning,
161
161
  )
162
162
  current_revision_id = remote_revision_id
@@ -200,7 +200,7 @@ def revision(
200
200
  remote_revision_id = benchling_service.get_remote_revision_id()
201
201
  if current_revision_id is not None:
202
202
  warnings.warn(
203
- f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the '_liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
203
+ f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the 'liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
204
204
  FutureWarning,
205
205
  )
206
206
  current_revision_id = remote_revision_id
@@ -256,7 +256,7 @@ def upgrade(
256
256
  remote_revision_id = benchling_service.get_remote_revision_id()
257
257
  if current_revision_id is not None:
258
258
  warnings.warn(
259
- f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the '_liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
259
+ f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the 'liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
260
260
  FutureWarning,
261
261
  )
262
262
  current_revision_id = remote_revision_id
@@ -272,7 +272,7 @@ def upgrade(
272
272
  f"[dim red]Set local {benchling_tenant}_CURRENT_REVISION_ID to {upgrade_revision_id} in liminal/env.py"
273
273
  )
274
274
  print(
275
- f"[dim]Set revision_id to {upgrade_revision_id} withinn '_liminal_remote' schema."
275
+ f"[dim]Set revision_id to {upgrade_revision_id} within 'liminal_remote' schema."
276
276
  )
277
277
  print("[bold green]Migration complete")
278
278
 
@@ -300,7 +300,7 @@ def downgrade(
300
300
  remote_revision_id = benchling_service.get_remote_revision_id()
301
301
  if current_revision_id is not None:
302
302
  warnings.warn(
303
- f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the '_liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
303
+ f"Accessing and using the revision_id variable in {LIMINAL_DIR_PATH/'env.py'} is deprecated. Delete the variable set in the env.py file, the revision_id is now stored in your Benchling tenant within the 'liminal_remote' schema. Support for reading/writing the local revision_id will end with the v5 release.",
304
304
  FutureWarning,
305
305
  )
306
306
  current_revision_id = remote_revision_id
@@ -316,7 +316,7 @@ def downgrade(
316
316
  f"[dim red]Set local {benchling_tenant}_CURRENT_REVISION_ID to {downgrade_revision_id} in liminal/env.py"
317
317
  )
318
318
  print(
319
- f"[dim]Set revision_id to {downgrade_revision_id} withinn '_liminal_remote' schema."
319
+ f"[dim]Set revision_id to {downgrade_revision_id} within 'liminal_remote' schema."
320
320
  )
321
321
  print("[bold green]Migration complete")
322
322
 
@@ -25,9 +25,10 @@ from liminal.enums import (
25
25
  BenchlingNamingStrategy,
26
26
  )
27
27
 
28
- logger = logging.getLogger(__name__)
28
+ LOGGER = logging.getLogger(__name__)
29
+ logging.getLogger("httpx").setLevel(logging.WARNING)
29
30
 
30
- REMOTE_LIMINAL_SCHEMA_NAME = "_liminal_remote"
31
+ REMOTE_LIMINAL_SCHEMA_NAME = "liminal_remote"
31
32
  REMOTE_REVISION_ID_FIELD_WH_NAME = "revision_id"
32
33
 
33
34
 
@@ -70,7 +71,7 @@ class BenchlingService(Benchling):
70
71
  super().__init__(
71
72
  url=url, auth_method=auth_method, retry_strategy=retry_strategy
72
73
  )
73
- logger.info(f"Tenant {connection.tenant_name}: Connected to Benchling API.")
74
+ LOGGER.info(f"Tenant {connection.tenant_name}: Connected to Benchling API.")
74
75
  self.use_db = use_db
75
76
  if use_db:
76
77
  if connection.warehouse_connection_string:
@@ -78,7 +79,7 @@ class BenchlingService(Benchling):
78
79
  connection.warehouse_connection_string
79
80
  )
80
81
  configure_mappers()
81
- logger.info(
82
+ LOGGER.info(
82
83
  f"Tenant {connection.tenant_name}: Connected to Benchling read-only Postgres warehouse."
83
84
  )
84
85
  else:
@@ -104,7 +105,7 @@ class BenchlingService(Benchling):
104
105
  "Referer": f"https://{connection.tenant_name}.benchling.com/",
105
106
  "Content-Type": "application/json",
106
107
  }
107
- logger.info(
108
+ LOGGER.info(
108
109
  f"Tenant {connection.tenant_name}: Connected to Benchling internal API."
109
110
  )
110
111
  else:
@@ -150,7 +151,7 @@ class BenchlingService(Benchling):
150
151
 
151
152
  def get_remote_revision_id(self) -> str:
152
153
  """
153
- Uses internal API to to search for the _liminal_remote schema, where the revision_id is stored.
154
+ Uses internal API to to search for the liminal_remote schema, where the revision_id is stored.
154
155
  This schema contains the remote revision_id in the name of the revision_id field.
155
156
 
156
157
  Returns the remote revision_id stored on the entity.
@@ -179,8 +180,8 @@ class BenchlingService(Benchling):
179
180
 
180
181
  def upsert_remote_revision_id(self, revision_id: str) -> None:
181
182
  """Updates or inserts a remote Liminal schema into your tenant with the given revision_id stored in the name of a field.
182
- If the '_liminal_remote' schema is found, check and make sure a field with warehouse_name 'revision_id' is present. If both are present, update the revision_id stored within the name.
183
- If no schema is found, create the _liminal_remote entity schema.
183
+ If the 'liminal_remote' schema is found, check and make sure a field with warehouse_name 'revision_id' is present. If both are present, update the revision_id stored within the name.
184
+ If no schema is found, create the liminal_remote entity schema.
184
185
  Upsert is needed to migrate users from using the CURRENT_REVISION_ID stored in the env.py file smoothly to storing in Benchling itself.
185
186
 
186
187
  Parameters
@@ -198,20 +199,20 @@ class BenchlingService(Benchling):
198
199
  try:
199
200
  liminal_schema = TagSchemaModel.get_one(self, REMOTE_LIMINAL_SCHEMA_NAME)
200
201
  except Exception:
201
- # No _liminal_remote schema found. Create schema.
202
+ # No liminal_remote schema found. Create schema.
202
203
  from liminal.entity_schemas.operations import CreateEntitySchema
203
204
 
204
205
  CreateEntitySchema(
205
206
  schema_properties=BaseSchemaProperties(
206
- name={REMOTE_LIMINAL_SCHEMA_NAME},
207
- warehouse_name={REMOTE_LIMINAL_SCHEMA_NAME},
208
- prefix={REMOTE_LIMINAL_SCHEMA_NAME},
207
+ name=REMOTE_LIMINAL_SCHEMA_NAME,
208
+ warehouse_name=REMOTE_LIMINAL_SCHEMA_NAME,
209
+ prefix=REMOTE_LIMINAL_SCHEMA_NAME,
209
210
  entity_type=BenchlingEntityType.CUSTOM_ENTITY,
210
211
  naming_strategies={BenchlingNamingStrategy.NEW_IDS},
211
212
  ),
212
213
  fields=[
213
214
  BaseFieldProperties(
214
- name={revision_id},
215
+ name=revision_id,
215
216
  warehouse_name=REMOTE_REVISION_ID_FIELD_WH_NAME,
216
217
  type=BenchlingFieldType.TEXT,
217
218
  parent_link=False,
@@ -220,14 +221,18 @@ class BenchlingService(Benchling):
220
221
  )
221
222
  ],
222
223
  ).execute(self)
223
- # _liminal_remote schema found. Check if revision_id field exists on it.
224
+ LOGGER.warning(
225
+ f"Created {REMOTE_LIMINAL_SCHEMA_NAME} schema for tracking the remote revision id. Please delete the revision_id variable tracked in your env.py to complete the migration to tracking the tenant revision_id in Benchling instead of locally."
226
+ )
227
+ return
228
+ # liminal_remote schema found. Check if revision_id field exists on it.
224
229
  revision_id_fields = [
225
230
  f
226
231
  for f in liminal_schema.fields
227
232
  if f.systemName == REMOTE_REVISION_ID_FIELD_WH_NAME
228
233
  ]
229
234
  if len(revision_id_fields) == 1:
230
- # _liminal_remote schema found, revision_id field found. Update revision_id field on it with given revision_id.
235
+ # liminal_remote schema found, revision_id field found. Update revision_id field on it with given revision_id.
231
236
  from liminal.entity_schemas.operations import UpdateEntitySchemaField
232
237
 
233
238
  revision_id_field = revision_id_fields[0]
@@ -33,7 +33,7 @@ def get_converted_tag_schemas(
33
33
  if include_archived
34
34
  else [s for s in all_schemas if not s.archiveRecord]
35
35
  )
36
- all_schemas = [s for s in all_schemas if s.sqlIdentifier != "_liminal_remote"]
36
+ all_schemas = [s for s in all_schemas if s.sqlIdentifier != "liminal_remote"]
37
37
  return [
38
38
  convert_tag_schema_to_internal_schema(
39
39
  tag_schema, dropdowns_map, unit_id_to_name_map, include_archived
@@ -18,3 +18,5 @@ class BenchlingAPIFieldType(StrEnum):
18
18
  SELECTOR = "ft_selector"
19
19
  STORABLE_LINK = "ft_storable_link"
20
20
  STRING = "ft_string"
21
+ JSON = "ft_json"
22
+ BOOLEAN = "ft_boolean"
@@ -21,6 +21,8 @@ class BenchlingFieldType(StrEnum):
21
21
  MIXTURE_LINK = "mixture_link"
22
22
  STORAGE_LINK = "storage_link"
23
23
  TEXT = "text"
24
+ JSON = "json"
25
+ BOOLEAN = "boolean"
24
26
 
25
27
  @classmethod
26
28
  def get_non_multi_select_types(cls) -> list[str]:
liminal/mappers.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
2
  from typing import Any
3
3
 
4
- from sqlalchemy import JSON, DateTime, Float, Integer, String
4
+ from sqlalchemy import JSON, DateTime, Float, Integer, String, Boolean
5
5
  from sqlalchemy.sql.type_api import TypeEngine
6
6
 
7
7
  from liminal.enums import (
@@ -32,6 +32,8 @@ def convert_benchling_type_to_python_type(benchling_type: BenchlingFieldType) ->
32
32
  BenchlingFieldType.STORAGE_LINK: str,
33
33
  BenchlingFieldType.PART_LINK: str,
34
34
  BenchlingFieldType.TEXT: str,
35
+ BenchlingFieldType.JSON: dict[str, Any],
36
+ BenchlingFieldType.BOOLEAN: bool,
35
37
  }
36
38
  if benchling_type in benchling_to_python_type_map:
37
39
  return benchling_to_python_type_map[benchling_type]
@@ -60,6 +62,8 @@ def convert_benchling_type_to_sql_alchemy_type(
60
62
  BenchlingFieldType.PART_LINK: String,
61
63
  BenchlingFieldType.MIXTURE_LINK: String,
62
64
  BenchlingFieldType.TEXT: String,
65
+ BenchlingFieldType.JSON: JSON,
66
+ BenchlingFieldType.BOOLEAN: Boolean,
63
67
  }
64
68
  if benchling_type in benchling_to_sql_alchemy_type_map:
65
69
  return benchling_to_sql_alchemy_type_map[benchling_type]
@@ -103,6 +107,8 @@ def convert_field_type_to_api_field_type(
103
107
  BenchlingFieldType.DROPDOWN: (BenchlingAPIFieldType.SELECTOR, None),
104
108
  BenchlingFieldType.STORAGE_LINK: (BenchlingAPIFieldType.STORABLE_LINK, None),
105
109
  BenchlingFieldType.TEXT: (BenchlingAPIFieldType.STRING, None),
110
+ BenchlingFieldType.JSON: (BenchlingAPIFieldType.JSON, None),
111
+ BenchlingFieldType.BOOLEAN: (BenchlingAPIFieldType.BOOLEAN, None),
106
112
  }
107
113
  if field_type in conversion_map:
108
114
  return conversion_map[field_type]
@@ -147,6 +153,8 @@ def convert_api_field_type_to_field_type(
147
153
  (BenchlingAPIFieldType.SELECTOR, None): BenchlingFieldType.DROPDOWN,
148
154
  (BenchlingAPIFieldType.STORABLE_LINK, None): BenchlingFieldType.STORAGE_LINK,
149
155
  (BenchlingAPIFieldType.STRING, None): BenchlingFieldType.TEXT,
156
+ (BenchlingAPIFieldType.JSON, None): BenchlingFieldType.JSON,
157
+ (BenchlingAPIFieldType.BOOLEAN, None): BenchlingFieldType.BOOLEAN,
150
158
  }
151
159
  if (field_type, folder_item_type) in conversion_map:
152
160
  return conversion_map[(field_type, folder_item_type)]
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: liminal-orm
3
- Version: 4.0.0
3
+ Version: 4.1.0
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,3 +1,4 @@
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
4
  liminal/base/base_operation.py,sha256=opQfFZeC49YAFkg5ahE6CFpeSUNPh1ootWZxXyEXfFI,3128
@@ -8,14 +9,14 @@ liminal/base/properties/base_field_properties.py,sha256=2I3L8mhoxOD1nzEAzwWJzUFe
8
9
  liminal/base/properties/base_name_template.py,sha256=AOtaW4QEDRC-mjZOZk6jgc_mopUMsHS2Fj6VVsO07WY,3150
9
10
  liminal/base/properties/base_schema_properties.py,sha256=jm7dG218gzHITOPdnILY4BUnOCW-KA8yiQjgz5FgQUI,5906
10
11
  liminal/base/str_enum.py,sha256=jF3d-Lo8zsHUe6GsctX2L-TSj92Y3qCYDrTD-saeJoc,210
11
- liminal/cli/cli.py,sha256=dqEnoIzz72YwzNiLacD7g_uE8nUtjkhksapODXQJvfo,14587
12
+ liminal/cli/cli.py,sha256=mh86uHRL7pidrtxHVzxgdcvRCVZjPYumLbkDc_aJXYM,14578
12
13
  liminal/cli/controller.py,sha256=2eRP-SDapjDsTYaipxhQyXwBYKtoJcbKNbd4rZCQNlk,11501
13
14
  liminal/cli/live_test_dropdown_migration.py,sha256=XLeFZaR4acLOQ6LmTMWjZHIIUnB6ysZMUu6kaSRcQiA,2913
14
15
  liminal/cli/live_test_entity_schema_migration.py,sha256=_JawaiJNHkAjIrtwe9_K15OoJSFq_4vaTK5vrmz-b6s,5576
15
16
  liminal/cli/utils.py,sha256=zaUkNW0P3ZU2qgtSbIwW6pE7DSlrrijv8NG7v21_5xw,4588
16
17
  liminal/connection/__init__.py,sha256=60SyUzDxiTv9wn7cNyoqB4b9BuI3E6susqanYGvLnG8,212
17
18
  liminal/connection/benchling_connection.py,sha256=PLiaI4v9EcJDNBEO5ZF3jERuI6AYo8NAYpqPYLxVYdQ,3237
18
- liminal/connection/benchling_service.py,sha256=v9sKYvwW6NX53a4OBpKJAmb4fZWaUN5AvcY2N_oArZU,12070
19
+ liminal/connection/benchling_service.py,sha256=gpZLGd7SwqyddWHLSoAd6PBxGqjdfQKYWhtVdpFnMeU,12425
19
20
  liminal/dropdowns/api.py,sha256=n5oxi1EhkmpmPpNi1LOI4xcIQmk1C069XFaGP5XSBx8,6959
20
21
  liminal/dropdowns/compare.py,sha256=-UbCkeTKx3THwvjMTUubyYVXBkhmvyhEKzwrIzBkthY,7141
21
22
  liminal/dropdowns/generate_files.py,sha256=zErD1jbbQxc5MpCPhgMnlXapyZ90S_0epE7FZD-sx4s,2519
@@ -27,18 +28,18 @@ liminal/entity_schemas/entity_schema_models.py,sha256=v5A1ELaiuBnUSl1HkUNAeMuIRQ
27
28
  liminal/entity_schemas/generate_files.py,sha256=j8JcGzbERCFdL85Xd5ljeH1O7S7l2ffsRxMwoaobzM4,10548
28
29
  liminal/entity_schemas/operations.py,sha256=mIMPvr9-eFaM603eOGn4PHfl7RblDpOzRtktBwqd5vQ,27189
29
30
  liminal/entity_schemas/tag_schema_models.py,sha256=HCtiJPMsPksX3wOBpfDdyIElNH3XybM7w25OUpIYoWM,24242
30
- liminal/entity_schemas/utils.py,sha256=ngWqBq9RKVjHAODok85yeuReHXaqmrexHiSmyVx30Vg,6244
31
+ liminal/entity_schemas/utils.py,sha256=voy5_dTvjdLO6K3c5ACr3ayUEL3BsUbZImIgLfIk9fs,6243
31
32
  liminal/enums/__init__.py,sha256=-szuqAwMED4ai0NaPVUfgihQJAJ27wPu_nDnj4cEgTk,518
32
- liminal/enums/benchling_api_field_type.py,sha256=0QamSWEMnxZtedZXlh6zNhSRogS9ZqvWskdHHN19xJo,633
33
+ liminal/enums/benchling_api_field_type.py,sha256=jwp6txwPo_n1AU8oyl7vR7LnakVpxPPicGS1krwsvVE,681
33
34
  liminal/enums/benchling_entity_type.py,sha256=H_6ZlHJsiVNMpezPBrNKo2eP0pDrt--HU-P7PgznaMA,846
34
- liminal/enums/benchling_field_type.py,sha256=kKbLR6_gTP3qI-bNOWDO3csfOXI50Y6p6buQH7cQqUg,1194
35
+ liminal/enums/benchling_field_type.py,sha256=mPRMAucNpR4dE75Dh9S-6GobiU9SifO0XK6DSzQrx1w,1236
35
36
  liminal/enums/benchling_folder_item_type.py,sha256=Jb-YxCvB8O86_qTsfwtLQOkKGjTWGKHFwIKf24eemYk,248
36
37
  liminal/enums/benchling_naming_strategy.py,sha256=jmaR-Vfj3MWhna8tANBNjAgYUyoQ5wMbz1AIy2bv6Zk,1258
37
38
  liminal/enums/benchling_sequence_type.py,sha256=TBI4C5c1XKE4ZXqsz1ApDUzy2wR-04u-M3VO_zLikjM,202
38
39
  liminal/enums/name_template_part_type.py,sha256=Z3Zv5PpzoUrIj_EvwPVgDDkY2G0kO-wE3-ZvEvnv86M,507
39
40
  liminal/enums/sequence_constraint.py,sha256=CT3msm8qzJpcivfbQZ3NOWNRsedH4mSlfhzvQBLrHWA,407
40
41
  liminal/external/__init__.py,sha256=EundQBe68_ZIhcsuSOhc-CznzYauNDYlNG1CjRDui_Y,1348
41
- liminal/mappers.py,sha256=TgPMQsLrESAI6D7KBl0UoBBpnxYgcgGOT7a2faWsuhY,9587
42
+ liminal/mappers.py,sha256=UYj8xqse1wXXkGedaqnGo6hkbOT9lntbQmju105MfaM,10059
42
43
  liminal/migrate/components.py,sha256=bzt-5eJbhWVNs_zk9WieKmTkGgQrn58sm9GOuHUlM3Q,3526
43
44
  liminal/migrate/revision.py,sha256=KppU0u-d0JsfPsXsmncxy9Q_XBJyf-o4e16wNZAJODM,7774
44
45
  liminal/migrate/revisions_timeline.py,sha256=FSKzjUnZwnD3v2o7qoilBUkmKmJVvLVqozo25WnTo-w,14456
@@ -59,6 +60,7 @@ liminal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
60
  liminal/results_schemas/generate_files.py,sha256=aBbt0_P_IUUpaDRWA2g5wTDoWa_GPUREyZ9O-BkOwns,8500
60
61
  liminal/results_schemas/models/results_schema_model.py,sha256=qZsCT_y327FnX1zBaUHQL2bXWSbuVokKTn0dnH3BRPA,5341
61
62
  liminal/results_schemas/utils.py,sha256=3oo7ZB34OXt8wAdxTrqRtauu9AHTfh-Ze0IGCDtC2Tw,2333
63
+ liminal/tests/.DS_Store,sha256=0sTLf7flLKL2_3KGceYriAB8_gXTcYwn0c2RVSYmLZk,6148
62
64
  liminal/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
65
  liminal/tests/conftest.py,sha256=B463eOfe1uCHDJsUNvG-6tY8Qx8FJMByGDOtuyM87lA,17669
64
66
  liminal/tests/from benchling_sdk.py,sha256=CjRUHFB3iaa4rUPLGOqDiBq5EPKldm-Fd8aQQr92zF4,147
@@ -68,8 +70,8 @@ liminal/unit_dictionary/utils.py,sha256=o3K06Yyt33iIUSMHPT8f1vSuUSgWjZLf51p78lx4
68
70
  liminal/utils.py,sha256=Eu_o5qfx1Thy26UaDOL-QnrB67FeJf3kOrTavGNRSo0,3248
69
71
  liminal/validation/__init__.py,sha256=NsjzmivSRwGki1k9ykJgjtcYNcILR_PHSf6RkI1w2n0,5290
70
72
  liminal/validation/validation_severity.py,sha256=ib03PTZCQHcbBDc01v4gJF53YtA-ANY6QSFnhTV-FbU,259
71
- liminal_orm-4.0.0.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
72
- liminal_orm-4.0.0.dist-info/METADATA,sha256=LIkT9psfBKP9GUqP-OCxnGzsfyo58xK9YmUMGhjy0tM,10989
73
- liminal_orm-4.0.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
74
- liminal_orm-4.0.0.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
75
- liminal_orm-4.0.0.dist-info/RECORD,,
73
+ liminal_orm-4.1.0.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
74
+ liminal_orm-4.1.0.dist-info/METADATA,sha256=py9yzLxXw5qJLAT3U_YW5zlsfuF2H5ceDnaNTLyk9Kc,10989
75
+ liminal_orm-4.1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
76
+ liminal_orm-4.1.0.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
77
+ liminal_orm-4.1.0.dist-info/RECORD,,