liminal-orm 4.0.1__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/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,10 +25,10 @@ from liminal.enums import (
25
25
  BenchlingNamingStrategy,
26
26
  )
27
27
 
28
- logger = logging.getLogger(__name__)
28
+ LOGGER = logging.getLogger(__name__)
29
29
  logging.getLogger("httpx").setLevel(logging.WARNING)
30
30
 
31
- REMOTE_LIMINAL_SCHEMA_NAME = "_liminal_remote"
31
+ REMOTE_LIMINAL_SCHEMA_NAME = "liminal_remote"
32
32
  REMOTE_REVISION_ID_FIELD_WH_NAME = "revision_id"
33
33
 
34
34
 
@@ -71,7 +71,7 @@ class BenchlingService(Benchling):
71
71
  super().__init__(
72
72
  url=url, auth_method=auth_method, retry_strategy=retry_strategy
73
73
  )
74
- logger.info(f"Tenant {connection.tenant_name}: Connected to Benchling API.")
74
+ LOGGER.info(f"Tenant {connection.tenant_name}: Connected to Benchling API.")
75
75
  self.use_db = use_db
76
76
  if use_db:
77
77
  if connection.warehouse_connection_string:
@@ -79,7 +79,7 @@ class BenchlingService(Benchling):
79
79
  connection.warehouse_connection_string
80
80
  )
81
81
  configure_mappers()
82
- logger.info(
82
+ LOGGER.info(
83
83
  f"Tenant {connection.tenant_name}: Connected to Benchling read-only Postgres warehouse."
84
84
  )
85
85
  else:
@@ -105,7 +105,7 @@ class BenchlingService(Benchling):
105
105
  "Referer": f"https://{connection.tenant_name}.benchling.com/",
106
106
  "Content-Type": "application/json",
107
107
  }
108
- logger.info(
108
+ LOGGER.info(
109
109
  f"Tenant {connection.tenant_name}: Connected to Benchling internal API."
110
110
  )
111
111
  else:
@@ -151,7 +151,7 @@ class BenchlingService(Benchling):
151
151
 
152
152
  def get_remote_revision_id(self) -> str:
153
153
  """
154
- 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.
155
155
  This schema contains the remote revision_id in the name of the revision_id field.
156
156
 
157
157
  Returns the remote revision_id stored on the entity.
@@ -180,8 +180,8 @@ class BenchlingService(Benchling):
180
180
 
181
181
  def upsert_remote_revision_id(self, revision_id: str) -> None:
182
182
  """Updates or inserts a remote Liminal schema into your tenant with the given revision_id stored in the name of a field.
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.
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.
185
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.
186
186
 
187
187
  Parameters
@@ -199,20 +199,20 @@ class BenchlingService(Benchling):
199
199
  try:
200
200
  liminal_schema = TagSchemaModel.get_one(self, REMOTE_LIMINAL_SCHEMA_NAME)
201
201
  except Exception:
202
- # No _liminal_remote schema found. Create schema.
202
+ # No liminal_remote schema found. Create schema.
203
203
  from liminal.entity_schemas.operations import CreateEntitySchema
204
204
 
205
205
  CreateEntitySchema(
206
206
  schema_properties=BaseSchemaProperties(
207
- name={REMOTE_LIMINAL_SCHEMA_NAME},
208
- warehouse_name={REMOTE_LIMINAL_SCHEMA_NAME},
209
- prefix={REMOTE_LIMINAL_SCHEMA_NAME},
207
+ name=REMOTE_LIMINAL_SCHEMA_NAME,
208
+ warehouse_name=REMOTE_LIMINAL_SCHEMA_NAME,
209
+ prefix=REMOTE_LIMINAL_SCHEMA_NAME,
210
210
  entity_type=BenchlingEntityType.CUSTOM_ENTITY,
211
211
  naming_strategies={BenchlingNamingStrategy.NEW_IDS},
212
212
  ),
213
213
  fields=[
214
214
  BaseFieldProperties(
215
- name={revision_id},
215
+ name=revision_id,
216
216
  warehouse_name=REMOTE_REVISION_ID_FIELD_WH_NAME,
217
217
  type=BenchlingFieldType.TEXT,
218
218
  parent_link=False,
@@ -221,14 +221,18 @@ class BenchlingService(Benchling):
221
221
  )
222
222
  ],
223
223
  ).execute(self)
224
- # _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.
225
229
  revision_id_fields = [
226
230
  f
227
231
  for f in liminal_schema.fields
228
232
  if f.systemName == REMOTE_REVISION_ID_FIELD_WH_NAME
229
233
  ]
230
234
  if len(revision_id_fields) == 1:
231
- # _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.
232
236
  from liminal.entity_schemas.operations import UpdateEntitySchemaField
233
237
 
234
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)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: liminal-orm
3
- Version: 4.0.1
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
@@ -9,14 +9,14 @@ liminal/base/properties/base_field_properties.py,sha256=2I3L8mhoxOD1nzEAzwWJzUFe
9
9
  liminal/base/properties/base_name_template.py,sha256=AOtaW4QEDRC-mjZOZk6jgc_mopUMsHS2Fj6VVsO07WY,3150
10
10
  liminal/base/properties/base_schema_properties.py,sha256=jm7dG218gzHITOPdnILY4BUnOCW-KA8yiQjgz5FgQUI,5906
11
11
  liminal/base/str_enum.py,sha256=jF3d-Lo8zsHUe6GsctX2L-TSj92Y3qCYDrTD-saeJoc,210
12
- liminal/cli/cli.py,sha256=dqEnoIzz72YwzNiLacD7g_uE8nUtjkhksapODXQJvfo,14587
12
+ liminal/cli/cli.py,sha256=mh86uHRL7pidrtxHVzxgdcvRCVZjPYumLbkDc_aJXYM,14578
13
13
  liminal/cli/controller.py,sha256=2eRP-SDapjDsTYaipxhQyXwBYKtoJcbKNbd4rZCQNlk,11501
14
14
  liminal/cli/live_test_dropdown_migration.py,sha256=XLeFZaR4acLOQ6LmTMWjZHIIUnB6ysZMUu6kaSRcQiA,2913
15
15
  liminal/cli/live_test_entity_schema_migration.py,sha256=_JawaiJNHkAjIrtwe9_K15OoJSFq_4vaTK5vrmz-b6s,5576
16
16
  liminal/cli/utils.py,sha256=zaUkNW0P3ZU2qgtSbIwW6pE7DSlrrijv8NG7v21_5xw,4588
17
17
  liminal/connection/__init__.py,sha256=60SyUzDxiTv9wn7cNyoqB4b9BuI3E6susqanYGvLnG8,212
18
18
  liminal/connection/benchling_connection.py,sha256=PLiaI4v9EcJDNBEO5ZF3jERuI6AYo8NAYpqPYLxVYdQ,3237
19
- liminal/connection/benchling_service.py,sha256=1SWieCH5mTlNgx0C_XG75lhVJBfvoDlN4-4-yAdTbSw,12123
19
+ liminal/connection/benchling_service.py,sha256=gpZLGd7SwqyddWHLSoAd6PBxGqjdfQKYWhtVdpFnMeU,12425
20
20
  liminal/dropdowns/api.py,sha256=n5oxi1EhkmpmPpNi1LOI4xcIQmk1C069XFaGP5XSBx8,6959
21
21
  liminal/dropdowns/compare.py,sha256=-UbCkeTKx3THwvjMTUubyYVXBkhmvyhEKzwrIzBkthY,7141
22
22
  liminal/dropdowns/generate_files.py,sha256=zErD1jbbQxc5MpCPhgMnlXapyZ90S_0epE7FZD-sx4s,2519
@@ -28,18 +28,18 @@ liminal/entity_schemas/entity_schema_models.py,sha256=v5A1ELaiuBnUSl1HkUNAeMuIRQ
28
28
  liminal/entity_schemas/generate_files.py,sha256=j8JcGzbERCFdL85Xd5ljeH1O7S7l2ffsRxMwoaobzM4,10548
29
29
  liminal/entity_schemas/operations.py,sha256=mIMPvr9-eFaM603eOGn4PHfl7RblDpOzRtktBwqd5vQ,27189
30
30
  liminal/entity_schemas/tag_schema_models.py,sha256=HCtiJPMsPksX3wOBpfDdyIElNH3XybM7w25OUpIYoWM,24242
31
- liminal/entity_schemas/utils.py,sha256=ngWqBq9RKVjHAODok85yeuReHXaqmrexHiSmyVx30Vg,6244
31
+ liminal/entity_schemas/utils.py,sha256=voy5_dTvjdLO6K3c5ACr3ayUEL3BsUbZImIgLfIk9fs,6243
32
32
  liminal/enums/__init__.py,sha256=-szuqAwMED4ai0NaPVUfgihQJAJ27wPu_nDnj4cEgTk,518
33
- liminal/enums/benchling_api_field_type.py,sha256=0QamSWEMnxZtedZXlh6zNhSRogS9ZqvWskdHHN19xJo,633
33
+ liminal/enums/benchling_api_field_type.py,sha256=jwp6txwPo_n1AU8oyl7vR7LnakVpxPPicGS1krwsvVE,681
34
34
  liminal/enums/benchling_entity_type.py,sha256=H_6ZlHJsiVNMpezPBrNKo2eP0pDrt--HU-P7PgznaMA,846
35
- liminal/enums/benchling_field_type.py,sha256=kKbLR6_gTP3qI-bNOWDO3csfOXI50Y6p6buQH7cQqUg,1194
35
+ liminal/enums/benchling_field_type.py,sha256=mPRMAucNpR4dE75Dh9S-6GobiU9SifO0XK6DSzQrx1w,1236
36
36
  liminal/enums/benchling_folder_item_type.py,sha256=Jb-YxCvB8O86_qTsfwtLQOkKGjTWGKHFwIKf24eemYk,248
37
37
  liminal/enums/benchling_naming_strategy.py,sha256=jmaR-Vfj3MWhna8tANBNjAgYUyoQ5wMbz1AIy2bv6Zk,1258
38
38
  liminal/enums/benchling_sequence_type.py,sha256=TBI4C5c1XKE4ZXqsz1ApDUzy2wR-04u-M3VO_zLikjM,202
39
39
  liminal/enums/name_template_part_type.py,sha256=Z3Zv5PpzoUrIj_EvwPVgDDkY2G0kO-wE3-ZvEvnv86M,507
40
40
  liminal/enums/sequence_constraint.py,sha256=CT3msm8qzJpcivfbQZ3NOWNRsedH4mSlfhzvQBLrHWA,407
41
41
  liminal/external/__init__.py,sha256=EundQBe68_ZIhcsuSOhc-CznzYauNDYlNG1CjRDui_Y,1348
42
- liminal/mappers.py,sha256=TgPMQsLrESAI6D7KBl0UoBBpnxYgcgGOT7a2faWsuhY,9587
42
+ liminal/mappers.py,sha256=UYj8xqse1wXXkGedaqnGo6hkbOT9lntbQmju105MfaM,10059
43
43
  liminal/migrate/components.py,sha256=bzt-5eJbhWVNs_zk9WieKmTkGgQrn58sm9GOuHUlM3Q,3526
44
44
  liminal/migrate/revision.py,sha256=KppU0u-d0JsfPsXsmncxy9Q_XBJyf-o4e16wNZAJODM,7774
45
45
  liminal/migrate/revisions_timeline.py,sha256=FSKzjUnZwnD3v2o7qoilBUkmKmJVvLVqozo25WnTo-w,14456
@@ -70,8 +70,8 @@ liminal/unit_dictionary/utils.py,sha256=o3K06Yyt33iIUSMHPT8f1vSuUSgWjZLf51p78lx4
70
70
  liminal/utils.py,sha256=Eu_o5qfx1Thy26UaDOL-QnrB67FeJf3kOrTavGNRSo0,3248
71
71
  liminal/validation/__init__.py,sha256=NsjzmivSRwGki1k9ykJgjtcYNcILR_PHSf6RkI1w2n0,5290
72
72
  liminal/validation/validation_severity.py,sha256=ib03PTZCQHcbBDc01v4gJF53YtA-ANY6QSFnhTV-FbU,259
73
- liminal_orm-4.0.1.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
74
- liminal_orm-4.0.1.dist-info/METADATA,sha256=kC2TXuXpSa0_WrnCid8_TAdiiV_ZxJgJaF3K3iTPk4Y,10989
75
- liminal_orm-4.0.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
76
- liminal_orm-4.0.1.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
77
- liminal_orm-4.0.1.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,,