liminal-orm 1.0.5__py3-none-any.whl → 1.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/base/base_operation.py +9 -11
- liminal/base/properties/base_field_properties.py +11 -0
- liminal/base/properties/base_schema_properties.py +15 -2
- liminal/cli/cli.py +4 -1
- liminal/cli/live_test_dropdown_migration.py +8 -9
- liminal/cli/live_test_entity_schema_migration.py +24 -27
- liminal/connection/benchling_connection.py +8 -2
- liminal/connection/benchling_service.py +18 -19
- liminal/dropdowns/operations.py +1 -1
- liminal/entity_schemas/compare.py +17 -7
- liminal/entity_schemas/entity_schema_models.py +6 -9
- liminal/entity_schemas/generate_files.py +9 -8
- liminal/entity_schemas/operations.py +77 -106
- liminal/entity_schemas/tag_schema_models.py +9 -2
- liminal/entity_schemas/utils.py +4 -2
- liminal/enums/benchling_api_field_type.py +3 -0
- liminal/enums/benchling_entity_type.py +1 -0
- liminal/enums/benchling_field_type.py +4 -0
- liminal/enums/benchling_folder_item_type.py +1 -0
- liminal/external/__init__.py +0 -2
- liminal/mappers.py +25 -1
- liminal/migrate/components.py +9 -4
- liminal/orm/base_model.py +8 -7
- liminal/orm/column.py +11 -4
- liminal/orm/mixins.py +9 -0
- liminal/orm/schema_properties.py +8 -2
- liminal/tests/conftest.py +52 -22
- liminal/tests/test_entity_schema_compare.py +11 -5
- liminal/utils.py +11 -4
- {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/METADATA +12 -5
- liminal_orm-1.1.0.dist-info/RECORD +61 -0
- liminal_orm-1.0.5.dist-info/RECORD +0 -61
- {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/LICENSE.md +0 -0
- {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/WHEEL +0 -0
- {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/entry_points.txt +0 -0
liminal/orm/mixins.py
CHANGED
@@ -87,3 +87,12 @@ class MixtureMixin:
|
|
87
87
|
project_id = SqlColumn("project_id$", String, nullable=True)
|
88
88
|
type = SqlColumn("type$", String, nullable=True)
|
89
89
|
validation_status = SqlColumn("validation_status$", String, nullable=True)
|
90
|
+
|
91
|
+
|
92
|
+
class MoleculeMixin:
|
93
|
+
canonical_smiles = SqlColumn("canonical_smiles$", String, nullable=True)
|
94
|
+
file_registry_id = SqlColumn("file_registry_id$", String, nullable=True)
|
95
|
+
is_registered = SqlColumn("is_registered$", Boolean, nullable=True)
|
96
|
+
project_id = SqlColumn("project_id$", String, nullable=True)
|
97
|
+
type = SqlColumn("type$", String, nullable=True)
|
98
|
+
validation_status = SqlColumn("validation_status$", String, nullable=True)
|
liminal/orm/schema_properties.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from pydantic import model_validator
|
4
6
|
|
5
7
|
from liminal.base.properties.base_schema_properties import (
|
6
8
|
BaseSchemaProperties,
|
@@ -22,7 +24,11 @@ class SchemaProperties(BaseSchemaProperties):
|
|
22
24
|
entity_type: BenchlingEntityType
|
23
25
|
naming_strategies: set[BenchlingNamingStrategy]
|
24
26
|
mixture_schema_config: MixtureSchemaConfig | None = None
|
25
|
-
_archived: bool
|
27
|
+
_archived: bool = False
|
28
|
+
|
29
|
+
def __init__(self, **data: Any):
|
30
|
+
super().__init__(**data)
|
31
|
+
self._archived = data.get("_archived", False)
|
26
32
|
|
27
33
|
@model_validator(mode="after")
|
28
34
|
def validate_mixture_schema_config(self) -> SchemaProperties:
|
liminal/tests/conftest.py
CHANGED
@@ -136,7 +136,8 @@ def mock_benchling_schema(
|
|
136
136
|
parent_link=False,
|
137
137
|
entity_link=None,
|
138
138
|
tooltip=None,
|
139
|
-
|
139
|
+
_archived=False,
|
140
|
+
),
|
140
141
|
"string_field_req": Props(
|
141
142
|
name="String Field Required",
|
142
143
|
type=Type.TEXT,
|
@@ -146,7 +147,8 @@ def mock_benchling_schema(
|
|
146
147
|
dropdown_link=None,
|
147
148
|
entity_link=None,
|
148
149
|
tooltip=None,
|
149
|
-
|
150
|
+
_archived=False,
|
151
|
+
),
|
150
152
|
"string_field_not_req": Props(
|
151
153
|
name="String Field Not Required",
|
152
154
|
type=Type.TEXT,
|
@@ -156,7 +158,8 @@ def mock_benchling_schema(
|
|
156
158
|
dropdown_link=None,
|
157
159
|
entity_link=None,
|
158
160
|
tooltip=None,
|
159
|
-
|
161
|
+
_archived=False,
|
162
|
+
),
|
160
163
|
"string_field_tooltip": Props(
|
161
164
|
name="String Field Not Required",
|
162
165
|
type=Type.TEXT,
|
@@ -166,7 +169,8 @@ def mock_benchling_schema(
|
|
166
169
|
dropdown_link=None,
|
167
170
|
entity_link=None,
|
168
171
|
tooltip="test tooltip",
|
169
|
-
|
172
|
+
_archived=False,
|
173
|
+
),
|
170
174
|
"float_field": Props(
|
171
175
|
name="Float Field",
|
172
176
|
type=Type.DECIMAL,
|
@@ -176,7 +180,8 @@ def mock_benchling_schema(
|
|
176
180
|
dropdown_link=None,
|
177
181
|
entity_link=None,
|
178
182
|
tooltip=None,
|
179
|
-
|
183
|
+
_archived=False,
|
184
|
+
),
|
180
185
|
"integer_field": Props(
|
181
186
|
name="Integer Field",
|
182
187
|
type=Type.INTEGER,
|
@@ -186,7 +191,8 @@ def mock_benchling_schema(
|
|
186
191
|
dropdown_link=None,
|
187
192
|
entity_link=None,
|
188
193
|
tooltip=None,
|
189
|
-
|
194
|
+
_archived=False,
|
195
|
+
),
|
190
196
|
"datetime_field": Props(
|
191
197
|
name="Datetime Field",
|
192
198
|
type=Type.DATE,
|
@@ -196,7 +202,8 @@ def mock_benchling_schema(
|
|
196
202
|
dropdown_link=None,
|
197
203
|
entity_link=None,
|
198
204
|
tooltip=None,
|
199
|
-
|
205
|
+
_archived=False,
|
206
|
+
),
|
200
207
|
"list_dropdown_field": Props(
|
201
208
|
name="List Dropdown Field",
|
202
209
|
type=Type.DROPDOWN,
|
@@ -206,7 +213,8 @@ def mock_benchling_schema(
|
|
206
213
|
parent_link=False,
|
207
214
|
entity_link=None,
|
208
215
|
tooltip=None,
|
209
|
-
|
216
|
+
_archived=False,
|
217
|
+
),
|
210
218
|
}
|
211
219
|
return [(schema_props, fields)]
|
212
220
|
|
@@ -229,32 +237,51 @@ def mock_benchling_schema_one(
|
|
229
237
|
required=False,
|
230
238
|
is_multi=False,
|
231
239
|
dropdown_link=mock_benchling_dropdown.__benchling_name__,
|
232
|
-
|
240
|
+
_archived=False,
|
241
|
+
),
|
233
242
|
"string_field_req": Props(
|
234
|
-
name="String Field Required",
|
235
|
-
|
243
|
+
name="String Field Required",
|
244
|
+
type=Type.TEXT,
|
245
|
+
required=True,
|
246
|
+
is_multi=False,
|
247
|
+
_archived=False,
|
248
|
+
),
|
236
249
|
"string_field_not_req": Props(
|
237
250
|
name="String Field Not Required",
|
238
251
|
type=Type.TEXT,
|
239
252
|
required=False,
|
240
253
|
is_multi=False,
|
241
|
-
|
254
|
+
_archived=False,
|
255
|
+
),
|
242
256
|
"float_field": Props(
|
243
|
-
name="Float Field",
|
244
|
-
|
257
|
+
name="Float Field",
|
258
|
+
type=Type.DECIMAL,
|
259
|
+
required=False,
|
260
|
+
is_multi=False,
|
261
|
+
_archived=False,
|
262
|
+
),
|
245
263
|
"integer_field": Props(
|
246
|
-
name="Integer Field",
|
247
|
-
|
264
|
+
name="Integer Field",
|
265
|
+
type=Type.INTEGER,
|
266
|
+
required=False,
|
267
|
+
is_multi=False,
|
268
|
+
_archived=False,
|
269
|
+
),
|
248
270
|
"datetime_field": Props(
|
249
|
-
name="Datetime Field",
|
250
|
-
|
271
|
+
name="Datetime Field",
|
272
|
+
type=Type.DATE,
|
273
|
+
required=False,
|
274
|
+
is_multi=False,
|
275
|
+
_archived=False,
|
276
|
+
),
|
251
277
|
"list_dropdown_field": Props(
|
252
278
|
name="List Dropdown Field",
|
253
279
|
type=Type.DROPDOWN,
|
254
280
|
required=False,
|
255
281
|
is_multi=True,
|
256
282
|
dropdown_link=mock_benchling_dropdown.__benchling_name__,
|
257
|
-
|
283
|
+
_archived=False,
|
284
|
+
),
|
258
285
|
}
|
259
286
|
return [(schema_props, fields)]
|
260
287
|
|
@@ -267,7 +294,8 @@ def mock_benchling_schema_archived() -> list[tuple[SchemaProperties, dict[str, P
|
|
267
294
|
prefix="MockEntitySmall",
|
268
295
|
entity_type=BenchlingEntityType.CUSTOM_ENTITY,
|
269
296
|
naming_strategies=[BenchlingNamingStrategy.NEW_IDS],
|
270
|
-
|
297
|
+
_archived=True,
|
298
|
+
)
|
271
299
|
fields = {
|
272
300
|
"string_field_req": Props(
|
273
301
|
name="String Field Required",
|
@@ -278,14 +306,16 @@ def mock_benchling_schema_archived() -> list[tuple[SchemaProperties, dict[str, P
|
|
278
306
|
tooltip=None,
|
279
307
|
dropdown_link=None,
|
280
308
|
entity_link=None,
|
281
|
-
|
309
|
+
_archived=False,
|
310
|
+
),
|
282
311
|
"string_field_req_2": Props(
|
283
312
|
name="String Field Required 2",
|
284
313
|
type=Type.TEXT,
|
285
314
|
required=True,
|
286
315
|
parent_link=False,
|
287
316
|
is_multi=False,
|
288
|
-
|
317
|
+
_archived=False,
|
318
|
+
),
|
289
319
|
}
|
290
320
|
return [(schema_props, fields)]
|
291
321
|
|
@@ -46,9 +46,10 @@ class TestCompareEntitySchemas:
|
|
46
46
|
invalid_models["mock_entity_two_wh"][0].op.schema_properties.name
|
47
47
|
== "Mock Entity Two"
|
48
48
|
)
|
49
|
-
assert
|
50
|
-
|
51
|
-
|
49
|
+
assert [
|
50
|
+
f.warehouse_name
|
51
|
+
for f in invalid_models["mock_entity_two_wh"][0].op.fields
|
52
|
+
] == ["parent_link_field"]
|
52
53
|
assert isinstance(
|
53
54
|
invalid_models["mock_entity_two_wh"][1].op, UpdateEntitySchema
|
54
55
|
)
|
@@ -152,8 +153,12 @@ class TestCompareEntitySchemas:
|
|
152
153
|
invalid_models["mock_entity"][0].op, CreateEntitySchemaField
|
153
154
|
)
|
154
155
|
assert (
|
155
|
-
invalid_models["mock_entity"][0].op.
|
156
|
+
invalid_models["mock_entity"][0].op.field_props.warehouse_name
|
157
|
+
== "string_field_req"
|
156
158
|
)
|
159
|
+
mock_benchling_subclass[0].get_columns_dict(exclude_base_columns=True)[
|
160
|
+
"string_field_req"
|
161
|
+
].properties.warehouse_name = None
|
157
162
|
|
158
163
|
# Test when the Benchling schema has an extra field compared to the table model
|
159
164
|
extra_field = copy.deepcopy(mock_benchling_schema)
|
@@ -163,7 +168,8 @@ class TestCompareEntitySchemas:
|
|
163
168
|
required=False,
|
164
169
|
is_multi=False,
|
165
170
|
dropdown_link=None,
|
166
|
-
|
171
|
+
_archived=False,
|
172
|
+
)
|
167
173
|
|
168
174
|
mock_get_benchling_entity_schemas.return_value = extra_field
|
169
175
|
invalid_models = compare_entity_schemas(mock_benchling_sdk)
|
liminal/utils.py
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
import random
|
1
2
|
import re
|
3
|
+
import string
|
2
4
|
from typing import Any
|
3
5
|
|
4
6
|
import requests
|
@@ -7,6 +9,11 @@ from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fi
|
|
7
9
|
from liminal.connection.benchling_service import BenchlingService
|
8
10
|
|
9
11
|
|
12
|
+
def generate_random_id(length: int = 8) -> str:
|
13
|
+
"""Generate a random ID with only lowercase letters."""
|
14
|
+
return "".join(random.choices(string.ascii_lowercase, k=length))
|
15
|
+
|
16
|
+
|
10
17
|
def pascalize(input_string: str) -> str:
|
11
18
|
return "".join(
|
12
19
|
re.sub(r"[\[\]{}():]", "", word).capitalize()
|
@@ -14,7 +21,9 @@ def pascalize(input_string: str) -> str:
|
|
14
21
|
)
|
15
22
|
|
16
23
|
|
17
|
-
def to_snake_case(input_string: str) -> str:
|
24
|
+
def to_snake_case(input_string: str | None) -> str:
|
25
|
+
if input_string is None:
|
26
|
+
return ""
|
18
27
|
return "_".join(
|
19
28
|
re.sub(r"[\[\]{}():]", "", word).lower()
|
20
29
|
for word in re.split(r"[ /_\-]", input_string)
|
@@ -46,9 +55,7 @@ def is_valid_prefix(prefix: str) -> bool:
|
|
46
55
|
It must be contain only alphanumeric characters and underscores, be less than 33 characters, and end with an alphabetic character.
|
47
56
|
"""
|
48
57
|
valid = (
|
49
|
-
all(c.isalnum() or c == "_" for c in prefix)
|
50
|
-
and prefix[-1].isalpha()
|
51
|
-
and len(prefix) <= 32
|
58
|
+
all(c.isalnum() or c == "_" or c == "-" for c in prefix) and len(prefix) <= 32
|
52
59
|
)
|
53
60
|
if not valid:
|
54
61
|
raise ValueError(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: liminal-orm
|
3
|
-
Version: 1.0
|
3
|
+
Version: 1.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
|
@@ -13,7 +13,9 @@ Classifier: Programming Language :: Python :: 3.11
|
|
13
13
|
Requires-Dist: benchling-sdk (>=1.8.0)
|
14
14
|
Requires-Dist: bs4 (>=0.0.2,<0.0.3)
|
15
15
|
Requires-Dist: lxml (>=5.3.0,<6.0.0)
|
16
|
-
Requires-Dist:
|
16
|
+
Requires-Dist: numpy (>=1.23.5,<2.0.0)
|
17
|
+
Requires-Dist: pandas (>=1.5.3,<2.0.0)
|
18
|
+
Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
|
17
19
|
Requires-Dist: pydantic (>=2,<=2.7)
|
18
20
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
19
21
|
Requires-Dist: rich (>=13.9.2,<14.0.0)
|
@@ -27,7 +29,12 @@ Description-Content-Type: text/markdown
|
|
27
29
|
|
28
30
|
# [Liminal ORM](#liminal-orm)
|
29
31
|
|
30
|
-
|
32
|
+
[](https://pypi.org/project/liminal-orm/)
|
33
|
+
[](https://github.com/dynotx/liminal-orm/blob/main/LICENSE.md)
|
34
|
+
[](https://github.com/dynotx/liminal-orm/actions/workflows/liminal.yml)
|
35
|
+
[](https://pepy.tech/project/liminal-orm)
|
36
|
+
|
37
|
+
Liminal ORM<sup>1</sup> is an open-source Python package that builds on [Benchling's](https://www.benchling.com/) LIMS<sup>2</sup> platform and provides a simple, code-first approach for synchronizing and managing your Benchling schemas. Check out the [**full documentation here**](https://dynotx.github.io/liminal-orm/) and join our [**Slack community here**](https://join.slack.com/t/liminalorm/shared_invite/zt-2ujrp07s3-bctook4e~cAjn1LgOLVY~Q)!
|
31
38
|
|
32
39
|
Liminal provides an ORM framework using [SQLAlchemy](https://github.com/sqlalchemy/sqlalchemy) along with a schema migration service inspired by [Alembic](https://alembic.sqlalchemy.org/en/latest/). This allows you to define your Benchling schemas in code and create a *single source of truth* that synchronizes between your upstream Benchling tenant(s) and downstream dependencies. By creating a standard interface and through using one-line CLI<sup>3</sup> commands, Liminal enables a code-first approach for managing Benchling tenants and accessing Benchling data. With the schemas defined in code, you can also take advantage of the additional capabilities that the Liminal toolkit provides. This includes:
|
33
40
|
|
@@ -38,10 +45,10 @@ Liminal provides an ORM framework using [SQLAlchemy](https://github.com/sqlalche
|
|
38
45
|
- CI/CD integration with GitHub Actions to ensure that your Benchling schemas and code are always in sync.
|
39
46
|
- And more based on community contributions/feedback :)
|
40
47
|
|
41
|
-
Benchling is an industry standard cloud platform for life sciences R&D. Liminal builds on top of Benchling's platform and assumes that you already have a Benchling tenant set up and have (or have access to) an admin user account. If not, learn more about getting started with Benchling [here](https://www.benchling.com/explore-benchling)!
|
42
|
-
|
43
48
|
If you are a Benchling user, try out Liminal by following the [**Quick Start Guide**](https://dynotx.github.io/liminal-orm/getting-started/prerequisites/)! Reach out in the [Discussions](https://github.com/dynotx/liminal-orm/discussions) forum with any questions or to simply introduce yourself! If there is something blocking you from using Liminal or you're having trouble setting Liminal up, please share in [Issues](https://github.com/dynotx/liminal-orm/issues) or reach out directly (contact information below). You can expect responses within 48 hours :)
|
44
49
|
|
50
|
+
Benchling is an industry standard cloud platform for life sciences R&D. Liminal builds on top of Benchling's platform and assumes that you already have a Benchling tenant set up and have (or have access to) an admin user account. If not, learn more about getting started with Benchling [here](https://www.benchling.com/explore-benchling)!
|
51
|
+
|
45
52
|
Nirmit Damania is the creator and current maintainer of Liminal (I post Liminal updates to [Discussions](https://github.com/dynotx/liminal-orm/discussions) and my [LinkedIn](https://www.linkedin.com/in/nirmit-damania/)). Most importantly, **you** have the ability to influence the future of Liminal! Any feedback, positive or negative, is highly encouraged and will be used to steer the direction of Liminal. Refer to the [Contributing guide](https://github.com/dynotx/liminal-orm/blob/main/CONTRIBUTING.md) to learn more about how you can contribute to Liminal.
|
46
53
|
|
47
54
|
⭐️ Leave a star on the repo to spread the word!
|
@@ -0,0 +1,61 @@
|
|
1
|
+
liminal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
liminal/base/base_dropdown.py,sha256=Unk4l_5Y8rj_eSWYqzFi2BAFSQToQDWW2qdXwiCHTg8,2523
|
3
|
+
liminal/base/base_operation.py,sha256=t16LqSPKQPkh1oJtJU1Wr8TPyflILfHqfrRa4Y8ohAM,3089
|
4
|
+
liminal/base/base_validation_filters.py,sha256=2Q4QhqDSloZqc313p_fc8dnSw0uMhk_iMtsEtsC_5LQ,536
|
5
|
+
liminal/base/compare_operation.py,sha256=hkpv4ewHhxy4dlTPKgJuzBjsAqO6Km7OrrKB44pRA_o,352
|
6
|
+
liminal/base/properties/base_field_properties.py,sha256=wSEZI3YlQw2jEAOCE0yemcwYZJJhcfnBXhXZR9YAz6o,4891
|
7
|
+
liminal/base/properties/base_schema_properties.py,sha256=IHfSEdghuLtRJvUDCl-Axgf0wgoCj71J134vVTxKWHQ,4425
|
8
|
+
liminal/base/str_enum.py,sha256=jF3d-Lo8zsHUe6GsctX2L-TSj92Y3qCYDrTD-saeJoc,210
|
9
|
+
liminal/cli/cli.py,sha256=JxWHLO9KMeMaOnOYwzdH0w71l0477ScFOkWNtTlc97Y,9045
|
10
|
+
liminal/cli/controller.py,sha256=QNj3QO9TMb9hfc6U-VhLuFa0_aohOHZUmvY4XkATPhw,10118
|
11
|
+
liminal/cli/live_test_dropdown_migration.py,sha256=87JwxGD4A5ExjfsEEev9jgBNuldUj4CLoaFwsZ-BjEI,2889
|
12
|
+
liminal/cli/live_test_entity_schema_migration.py,sha256=_JawaiJNHkAjIrtwe9_K15OoJSFq_4vaTK5vrmz-b6s,5576
|
13
|
+
liminal/connection/__init__.py,sha256=3z4pSANIOkc9mh1Xp763oYQuJZDEh4lauN901PU4vqI,166
|
14
|
+
liminal/connection/benchling_connection.py,sha256=a69pIwQX7t0wd6GnI1IwUG3VnNOb4u6vcBINs_V1o-Y,2743
|
15
|
+
liminal/connection/benchling_service.py,sha256=lEYCHF1U8nII8Rn3rMBPTffTFiVFjoFeNmX2Kq36-qE,7170
|
16
|
+
liminal/dropdowns/api.py,sha256=n5oxi1EhkmpmPpNi1LOI4xcIQmk1C069XFaGP5XSBx8,6959
|
17
|
+
liminal/dropdowns/compare.py,sha256=5cz8djtaStozUun_Cp8t_5PVjq-aovme2Qq5J8FXFg4,6829
|
18
|
+
liminal/dropdowns/generate_files.py,sha256=IqnBs-IyLsIZE0NUkdB99zd5EAF-1f9CPBeblz-GzJE,2041
|
19
|
+
liminal/dropdowns/operations.py,sha256=RKXgwO6NQacao6dqzk6__T1B9s-B2YHLPPUyM-0wf0U,13516
|
20
|
+
liminal/dropdowns/utils.py,sha256=1-H7bTszCUeqeRBpiYXjRjreDzhn1Fd1MFwIsrEI-o4,4109
|
21
|
+
liminal/entity_schemas/api.py,sha256=Dkd44NGJ4JqRTJLJtPsZ8Qan2owbEYf446A6EuP8iL0,2786
|
22
|
+
liminal/entity_schemas/compare.py,sha256=C5qr9amGCKvkV61pa29obN883vSdFzSoiebD7hKEHY4,14128
|
23
|
+
liminal/entity_schemas/entity_schema_models.py,sha256=SNScXY3SeF0lhdAXwqKXrrgpCphpLg6s5tU9fO3juB4,5239
|
24
|
+
liminal/entity_schemas/generate_files.py,sha256=WQUvK7VZkyVs6u1DNoscVgB9W-slGCDf6ZE62xyd3o4,8572
|
25
|
+
liminal/entity_schemas/operations.py,sha256=8uCBTwu-CqjHhy3ImmkKiqzic010GgBynZEEEHct5OI,23017
|
26
|
+
liminal/entity_schemas/tag_schema_models.py,sha256=rRCAvpjx7iAiIxOh9MRBrpH603zHbFxKOY7sLgOutnE,16260
|
27
|
+
liminal/entity_schemas/utils.py,sha256=X53KNfguWtu7z-tAliBHuCYpSwTqBGgRSGsdR_BU9Vc,4206
|
28
|
+
liminal/enums/__init__.py,sha256=jz_c-B_fifatvrYoESlHZ9ljYdz-3rNl0sBazoESiHI,523
|
29
|
+
liminal/enums/benchling_api_field_type.py,sha256=0QamSWEMnxZtedZXlh6zNhSRogS9ZqvWskdHHN19xJo,633
|
30
|
+
liminal/enums/benchling_entity_type.py,sha256=CXCxJzboEbABLMwxrGIoc8hC73LxoSJXHwJWfPjrjvY,435
|
31
|
+
liminal/enums/benchling_field_type.py,sha256=uinDm5Mn_yGK1jlmlRH3NlAlXUzA1guNk8wF6lbUKD4,947
|
32
|
+
liminal/enums/benchling_folder_item_type.py,sha256=Jb-YxCvB8O86_qTsfwtLQOkKGjTWGKHFwIKf24eemYk,248
|
33
|
+
liminal/enums/benchling_naming_strategy.py,sha256=wG3AfnPOui5Qfc0Fihszm5uKWjuc7gdpI8jptNB5A-w,1201
|
34
|
+
liminal/enums/benchling_report_level.py,sha256=HtnSW_yNuRpJ_iQHhzcZudb1Me4QubVg3n9sPSnJiNI,263
|
35
|
+
liminal/enums/benchling_sequence_type.py,sha256=TBI4C5c1XKE4ZXqsz1ApDUzy2wR-04u-M3VO_zLikjM,202
|
36
|
+
liminal/external/__init__.py,sha256=fXA-WM8eD4q8D0bhnGvRCV-eOzvppnd8d9w6xcH0iLA,991
|
37
|
+
liminal/mappers.py,sha256=O9gc95b7JvfaR8xVrn0X1d0Tcs6Iwh-yhBHXhWSX8i0,9616
|
38
|
+
liminal/migrate/components.py,sha256=2HuFp5KDNhofROMRI-BioUoA4CCjhQ_v_F0QmGJzUBU,3480
|
39
|
+
liminal/migrate/revision.py,sha256=KppU0u-d0JsfPsXsmncxy9Q_XBJyf-o4e16wNZAJODM,7774
|
40
|
+
liminal/migrate/revisions_timeline.py,sha256=06qf_7E1Hecucfczpm85rV3ATLDjpCf7y6TUfah5aLM,14450
|
41
|
+
liminal/migrate/utils.py,sha256=HdSr3N2WN_1S-PLRGVWSMYl-4gIcP-Ph2wPycGi2cGg,3404
|
42
|
+
liminal/orm/base.py,sha256=fFSpiNRYgK5UG7lbXdQGV8KgO8pwjMqt0pycM3rWJ2o,615
|
43
|
+
liminal/orm/base_model.py,sha256=8p-JnqBJYjLe3bJxgjhTteecRsxCeonljrAfxk4reFM,10963
|
44
|
+
liminal/orm/column.py,sha256=hYhEiT0n1MwK8xKf6IAQEVfFyy3W8qqzZj_31nnRLe8,4775
|
45
|
+
liminal/orm/mixins.py,sha256=yEeUDF1qEBLP523q8bZra4KtNVK0gwZN9mXJSNe3GEE,4802
|
46
|
+
liminal/orm/relationship.py,sha256=Zl4bMHbtDSPx1psGHYnojGGJpA8B8hwcPJdgjB1lmW0,2490
|
47
|
+
liminal/orm/schema_properties.py,sha256=UEIIayhiwHw7YexSGoKU9Z7gj57d7_C1CMUv51-HcGk,2158
|
48
|
+
liminal/orm/user.py,sha256=elRAHj7HgO3iVLK_pNCIwf_9Rl_9k6vkBgaYazoJSQc,818
|
49
|
+
liminal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
+
liminal/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
|
+
liminal/tests/conftest.py,sha256=QXVvNZps9gKZ2mYuOBT_NEBvyX2ptdzuPIXj61UG81c,16344
|
52
|
+
liminal/tests/from benchling_sdk.py,sha256=CjRUHFB3iaa4rUPLGOqDiBq5EPKldm-Fd8aQQr92zF4,147
|
53
|
+
liminal/tests/test_dropdown_compare.py,sha256=yHB0ovQlBLRu8-qYkqIPd8VtYEOmOft_93FQM86g_z8,8198
|
54
|
+
liminal/tests/test_entity_schema_compare.py,sha256=mnHD3mBJ-lW_MCwbqRNSBkrBfxztNF74bSvTRnpRcis,15768
|
55
|
+
liminal/utils.py,sha256=vMjSasDnEghwqULDo14joxxJ56G4-9cBsw719nQ8C7g,2798
|
56
|
+
liminal/validation/__init__.py,sha256=SBd48xxBMJrBzI48G2RcK056EMlevt5YjmZMkfCWN1I,6924
|
57
|
+
liminal_orm-1.1.0.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
|
58
|
+
liminal_orm-1.1.0.dist-info/METADATA,sha256=xRc0SSZkYct2RcE7uQlKSKkss-LxA2KFr4eH1RkJXXM,11211
|
59
|
+
liminal_orm-1.1.0.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
60
|
+
liminal_orm-1.1.0.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
|
61
|
+
liminal_orm-1.1.0.dist-info/RECORD,,
|
@@ -1,61 +0,0 @@
|
|
1
|
-
liminal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
liminal/base/base_dropdown.py,sha256=Unk4l_5Y8rj_eSWYqzFi2BAFSQToQDWW2qdXwiCHTg8,2523
|
3
|
-
liminal/base/base_operation.py,sha256=Yi0EOyLzXOFjiX4lGZW2mV_uo0lxfyRMs9-6HFVxf1w,3101
|
4
|
-
liminal/base/base_validation_filters.py,sha256=2Q4QhqDSloZqc313p_fc8dnSw0uMhk_iMtsEtsC_5LQ,536
|
5
|
-
liminal/base/compare_operation.py,sha256=hkpv4ewHhxy4dlTPKgJuzBjsAqO6Km7OrrKB44pRA_o,352
|
6
|
-
liminal/base/properties/base_field_properties.py,sha256=V9UlY_geSoOhx_Iwiw2eZ7kDKghYy4Xa5bbGcCOFDk8,4511
|
7
|
-
liminal/base/properties/base_schema_properties.py,sha256=XIgTZvWYjqpSXJ-_uSew0sp-wWRb62-McmJtJ5rdNg0,3925
|
8
|
-
liminal/base/str_enum.py,sha256=jF3d-Lo8zsHUe6GsctX2L-TSj92Y3qCYDrTD-saeJoc,210
|
9
|
-
liminal/cli/cli.py,sha256=Bv0H_RWLpPxaCNmD4X9l_0wYQ8VCDbAHwALvCTUxB1g,8998
|
10
|
-
liminal/cli/controller.py,sha256=QNj3QO9TMb9hfc6U-VhLuFa0_aohOHZUmvY4XkATPhw,10118
|
11
|
-
liminal/cli/live_test_dropdown_migration.py,sha256=i20JkY5xmLffHrB73WOl3Tjyb4V2RPb3rt7-wh-BwME,2826
|
12
|
-
liminal/cli/live_test_entity_schema_migration.py,sha256=X03tEYYHYDXeXHWgLc9tcwksKVvr0b7nlYQndDS4MvA,5683
|
13
|
-
liminal/connection/__init__.py,sha256=3z4pSANIOkc9mh1Xp763oYQuJZDEh4lauN901PU4vqI,166
|
14
|
-
liminal/connection/benchling_connection.py,sha256=ZcKmaQE6T_yjAaSPF69e2PnhoZz5yZ_0TywjVykr0TM,2358
|
15
|
-
liminal/connection/benchling_service.py,sha256=DQDeRjgoUHeFisY5xZXJJ-Vb0xE8lu6hXj--j5kEvnU,7413
|
16
|
-
liminal/dropdowns/api.py,sha256=n5oxi1EhkmpmPpNi1LOI4xcIQmk1C069XFaGP5XSBx8,6959
|
17
|
-
liminal/dropdowns/compare.py,sha256=5cz8djtaStozUun_Cp8t_5PVjq-aovme2Qq5J8FXFg4,6829
|
18
|
-
liminal/dropdowns/generate_files.py,sha256=IqnBs-IyLsIZE0NUkdB99zd5EAF-1f9CPBeblz-GzJE,2041
|
19
|
-
liminal/dropdowns/operations.py,sha256=U1pHLVWEj4Rgms9sV4rpDuvCVm_NsQxJKLhsezx2bMw,13479
|
20
|
-
liminal/dropdowns/utils.py,sha256=1-H7bTszCUeqeRBpiYXjRjreDzhn1Fd1MFwIsrEI-o4,4109
|
21
|
-
liminal/entity_schemas/api.py,sha256=Dkd44NGJ4JqRTJLJtPsZ8Qan2owbEYf446A6EuP8iL0,2786
|
22
|
-
liminal/entity_schemas/compare.py,sha256=EL5v82FEBxMIubhlQmsmQO7a-EZeMWXRU2pBt9HmzPI,13849
|
23
|
-
liminal/entity_schemas/entity_schema_models.py,sha256=X2ouBUWIonrWeB3hMVj0bCqchbcztrp3joaftv8yHWo,5393
|
24
|
-
liminal/entity_schemas/generate_files.py,sha256=ZiTk_6wqnW_5_uW6gfCP13qUGd8uqlIh-wi7ydSk8N0,8442
|
25
|
-
liminal/entity_schemas/operations.py,sha256=sub6rigZjro72EMqqsayOYNxPL6eDYwCCIlzMr9sNfQ,23306
|
26
|
-
liminal/entity_schemas/tag_schema_models.py,sha256=VVqI9iC7T_p1RZJSu09AsptK7Cr-YQvXjYP5cjhpeBo,15979
|
27
|
-
liminal/entity_schemas/utils.py,sha256=tJVEfpJ6CtpuYI1_LWOE5-pGzNe0bsrGluLbU8sc9EM,4192
|
28
|
-
liminal/enums/__init__.py,sha256=jz_c-B_fifatvrYoESlHZ9ljYdz-3rNl0sBazoESiHI,523
|
29
|
-
liminal/enums/benchling_api_field_type.py,sha256=DEMlkvKuc8kaslnKdWsdB8Z70OY3CGwOHfZNC3a1SOE,528
|
30
|
-
liminal/enums/benchling_entity_type.py,sha256=t00mcbzbfQ9oiHt8xPrmNYs9bK7Bmk6F1dcoQubzmUs,409
|
31
|
-
liminal/enums/benchling_field_type.py,sha256=aWiij-yAr9glEti2ndAz7WsB0GaaX3ntRHH6dBNJaA4,825
|
32
|
-
liminal/enums/benchling_folder_item_type.py,sha256=hd70LiCOBkKEMC_GZoCsGxlzdZf8eCUXn4HvBJp6M10,222
|
33
|
-
liminal/enums/benchling_naming_strategy.py,sha256=wG3AfnPOui5Qfc0Fihszm5uKWjuc7gdpI8jptNB5A-w,1201
|
34
|
-
liminal/enums/benchling_report_level.py,sha256=HtnSW_yNuRpJ_iQHhzcZudb1Me4QubVg3n9sPSnJiNI,263
|
35
|
-
liminal/enums/benchling_sequence_type.py,sha256=TBI4C5c1XKE4ZXqsz1ApDUzy2wR-04u-M3VO_zLikjM,202
|
36
|
-
liminal/external/__init__.py,sha256=5VrSpJ3wPedgoCrtMwvv2CM7u70KSwiTAt_1yU2Oje0,1052
|
37
|
-
liminal/mappers.py,sha256=gevTAWU5nJe8hgUuOezhwFvnaVqVnURamafmq3w1fDU,8539
|
38
|
-
liminal/migrate/components.py,sha256=ShkcYM3tfdfF01HbuPI_yrGpV8oxSLzJJ0tA1ZutQ3I,3328
|
39
|
-
liminal/migrate/revision.py,sha256=KppU0u-d0JsfPsXsmncxy9Q_XBJyf-o4e16wNZAJODM,7774
|
40
|
-
liminal/migrate/revisions_timeline.py,sha256=06qf_7E1Hecucfczpm85rV3ATLDjpCf7y6TUfah5aLM,14450
|
41
|
-
liminal/migrate/utils.py,sha256=HdSr3N2WN_1S-PLRGVWSMYl-4gIcP-Ph2wPycGi2cGg,3404
|
42
|
-
liminal/orm/base.py,sha256=fFSpiNRYgK5UG7lbXdQGV8KgO8pwjMqt0pycM3rWJ2o,615
|
43
|
-
liminal/orm/base_model.py,sha256=dLbhAFaD2hPEbEmAQTkMBRumkthGWdSd0YjHcbzE4hU,10925
|
44
|
-
liminal/orm/column.py,sha256=dSYtqjpPgF2ECvw7CJ1AiMLGF8TdYT7IdaebIA0U_t8,4509
|
45
|
-
liminal/orm/mixins.py,sha256=wm5DvI_6th94bfsgsbwzFSvTRbjEZfdT6R85J_NjvOc,4356
|
46
|
-
liminal/orm/relationship.py,sha256=Zl4bMHbtDSPx1psGHYnojGGJpA8B8hwcPJdgjB1lmW0,2490
|
47
|
-
liminal/orm/schema_properties.py,sha256=vZBOwS2SFtI6CjlYsaGno08TpXi47PC832mPmCJM3KI,2049
|
48
|
-
liminal/orm/user.py,sha256=elRAHj7HgO3iVLK_pNCIwf_9Rl_9k6vkBgaYazoJSQc,818
|
49
|
-
liminal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
-
liminal/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
|
-
liminal/tests/conftest.py,sha256=kKli52zn-J48Tsqbqejyd8Mtref5gVg3_Qex6KbLHd8,16038
|
52
|
-
liminal/tests/from benchling_sdk.py,sha256=CjRUHFB3iaa4rUPLGOqDiBq5EPKldm-Fd8aQQr92zF4,147
|
53
|
-
liminal/tests/test_dropdown_compare.py,sha256=yHB0ovQlBLRu8-qYkqIPd8VtYEOmOft_93FQM86g_z8,8198
|
54
|
-
liminal/tests/test_entity_schema_compare.py,sha256=FBYxqIB9oeFArWYKnbGV8I7NPzv2syziaPjEQg-wZ1o,15529
|
55
|
-
liminal/utils.py,sha256=UT07vILwm9fu8DLgwIxMm1DxEPFIIsW-0mgBU8oNrNY,2566
|
56
|
-
liminal/validation/__init__.py,sha256=SBd48xxBMJrBzI48G2RcK056EMlevt5YjmZMkfCWN1I,6924
|
57
|
-
liminal_orm-1.0.5.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
|
58
|
-
liminal_orm-1.0.5.dist-info/METADATA,sha256=BX2olNamEBmkc06pSsycFlFNiCAO74y2ouzl-Zm6ez8,10393
|
59
|
-
liminal_orm-1.0.5.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
60
|
-
liminal_orm-1.0.5.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
|
61
|
-
liminal_orm-1.0.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|