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 +7 -7
- liminal/connection/benchling_service.py +19 -15
- liminal/entity_schemas/utils.py +1 -1
- liminal/enums/benchling_api_field_type.py +2 -0
- liminal/enums/benchling_field_type.py +2 -0
- liminal/mappers.py +9 -1
- {liminal_orm-4.0.1.dist-info → liminal_orm-4.1.0.dist-info}/METADATA +1 -1
- {liminal_orm-4.0.1.dist-info → liminal_orm-4.1.0.dist-info}/RECORD +11 -11
- {liminal_orm-4.0.1.dist-info → liminal_orm-4.1.0.dist-info}/LICENSE.md +0 -0
- {liminal_orm-4.0.1.dist-info → liminal_orm-4.1.0.dist-info}/WHEEL +0 -0
- {liminal_orm-4.0.1.dist-info → liminal_orm-4.1.0.dist-info}/entry_points.txt +0 -0
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 '
|
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 '
|
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 '
|
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 '
|
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}
|
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 '
|
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}
|
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
|
-
|
28
|
+
LOGGER = logging.getLogger(__name__)
|
29
29
|
logging.getLogger("httpx").setLevel(logging.WARNING)
|
30
30
|
|
31
|
-
REMOTE_LIMINAL_SCHEMA_NAME = "
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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 '
|
184
|
-
If no schema is found, create the
|
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
|
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=
|
208
|
-
warehouse_name=
|
209
|
-
prefix=
|
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=
|
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
|
-
|
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
|
-
#
|
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]
|
liminal/entity_schemas/utils.py
CHANGED
@@ -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 != "
|
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
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
74
|
-
liminal_orm-4.0.
|
75
|
-
liminal_orm-4.0.
|
76
|
-
liminal_orm-4.0.
|
77
|
-
liminal_orm-4.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|