liminal-orm 1.0.6__py3-none-any.whl → 1.1.1__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 +6 -2
- 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 +11 -18
- 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 +7 -6
- liminal/entity_schemas/operations.py +77 -102
- liminal/entity_schemas/tag_schema_models.py +7 -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 +15 -5
- liminal/orm/mixins.py +9 -0
- liminal/orm/schema_properties.py +8 -2
- liminal/tests/conftest.py +84 -22
- liminal/tests/test_entity_schema_compare.py +22 -5
- liminal/utils.py +11 -4
- {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/METADATA +5 -2
- liminal_orm-1.1.1.dist-info/RECORD +61 -0
- {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/WHEEL +1 -1
- liminal_orm-1.0.6.dist-info/RECORD +0 -61
- {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/LICENSE.md +0 -0
- {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/entry_points.txt +0 -0
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,26 @@ def mock_benchling_schema(
|
|
206
213
|
parent_link=False,
|
207
214
|
entity_link=None,
|
208
215
|
tooltip=None,
|
209
|
-
|
216
|
+
_archived=False,
|
217
|
+
),
|
218
|
+
"archived_field": Props(
|
219
|
+
name="Archived Field",
|
220
|
+
type=Type.TEXT,
|
221
|
+
required=False,
|
222
|
+
is_multi=False,
|
223
|
+
_archived=True,
|
224
|
+
),
|
225
|
+
"wh_name_field_different": Props(
|
226
|
+
name="Different Wh Name Field",
|
227
|
+
type=Type.TEXT,
|
228
|
+
required=False,
|
229
|
+
is_multi=False,
|
230
|
+
parent_link=False,
|
231
|
+
dropdown_link=None,
|
232
|
+
entity_link=None,
|
233
|
+
tooltip=None,
|
234
|
+
_archived=False,
|
235
|
+
),
|
210
236
|
}
|
211
237
|
return [(schema_props, fields)]
|
212
238
|
|
@@ -229,32 +255,51 @@ def mock_benchling_schema_one(
|
|
229
255
|
required=False,
|
230
256
|
is_multi=False,
|
231
257
|
dropdown_link=mock_benchling_dropdown.__benchling_name__,
|
232
|
-
|
258
|
+
_archived=False,
|
259
|
+
),
|
233
260
|
"string_field_req": Props(
|
234
|
-
name="String Field Required",
|
235
|
-
|
261
|
+
name="String Field Required",
|
262
|
+
type=Type.TEXT,
|
263
|
+
required=True,
|
264
|
+
is_multi=False,
|
265
|
+
_archived=False,
|
266
|
+
),
|
236
267
|
"string_field_not_req": Props(
|
237
268
|
name="String Field Not Required",
|
238
269
|
type=Type.TEXT,
|
239
270
|
required=False,
|
240
271
|
is_multi=False,
|
241
|
-
|
272
|
+
_archived=False,
|
273
|
+
),
|
242
274
|
"float_field": Props(
|
243
|
-
name="Float Field",
|
244
|
-
|
275
|
+
name="Float Field",
|
276
|
+
type=Type.DECIMAL,
|
277
|
+
required=False,
|
278
|
+
is_multi=False,
|
279
|
+
_archived=False,
|
280
|
+
),
|
245
281
|
"integer_field": Props(
|
246
|
-
name="Integer Field",
|
247
|
-
|
282
|
+
name="Integer Field",
|
283
|
+
type=Type.INTEGER,
|
284
|
+
required=False,
|
285
|
+
is_multi=False,
|
286
|
+
_archived=False,
|
287
|
+
),
|
248
288
|
"datetime_field": Props(
|
249
|
-
name="Datetime Field",
|
250
|
-
|
289
|
+
name="Datetime Field",
|
290
|
+
type=Type.DATE,
|
291
|
+
required=False,
|
292
|
+
is_multi=False,
|
293
|
+
_archived=False,
|
294
|
+
),
|
251
295
|
"list_dropdown_field": Props(
|
252
296
|
name="List Dropdown Field",
|
253
297
|
type=Type.DROPDOWN,
|
254
298
|
required=False,
|
255
299
|
is_multi=True,
|
256
300
|
dropdown_link=mock_benchling_dropdown.__benchling_name__,
|
257
|
-
|
301
|
+
_archived=False,
|
302
|
+
),
|
258
303
|
}
|
259
304
|
return [(schema_props, fields)]
|
260
305
|
|
@@ -267,7 +312,8 @@ def mock_benchling_schema_archived() -> list[tuple[SchemaProperties, dict[str, P
|
|
267
312
|
prefix="MockEntitySmall",
|
268
313
|
entity_type=BenchlingEntityType.CUSTOM_ENTITY,
|
269
314
|
naming_strategies=[BenchlingNamingStrategy.NEW_IDS],
|
270
|
-
|
315
|
+
_archived=True,
|
316
|
+
)
|
271
317
|
fields = {
|
272
318
|
"string_field_req": Props(
|
273
319
|
name="String Field Required",
|
@@ -278,14 +324,16 @@ def mock_benchling_schema_archived() -> list[tuple[SchemaProperties, dict[str, P
|
|
278
324
|
tooltip=None,
|
279
325
|
dropdown_link=None,
|
280
326
|
entity_link=None,
|
281
|
-
|
327
|
+
_archived=False,
|
328
|
+
),
|
282
329
|
"string_field_req_2": Props(
|
283
330
|
name="String Field Required 2",
|
284
331
|
type=Type.TEXT,
|
285
332
|
required=True,
|
286
333
|
parent_link=False,
|
287
334
|
is_multi=False,
|
288
|
-
|
335
|
+
_archived=False,
|
336
|
+
),
|
289
337
|
}
|
290
338
|
return [(schema_props, fields)]
|
291
339
|
|
@@ -339,6 +387,20 @@ def mock_benchling_subclass(mock_benchling_dropdown) -> list[type[BaseModel]]:
|
|
339
387
|
is_multi=True,
|
340
388
|
dropdown=mock_benchling_dropdown,
|
341
389
|
)
|
390
|
+
archived_field: SqlColumn = Column(
|
391
|
+
name="Archived Field",
|
392
|
+
type=Type.TEXT,
|
393
|
+
required=False,
|
394
|
+
is_multi=False,
|
395
|
+
_archived=True,
|
396
|
+
)
|
397
|
+
different_wh_name_field: SqlColumn = Column(
|
398
|
+
name="Different Wh Name Field",
|
399
|
+
type=Type.TEXT,
|
400
|
+
required=False,
|
401
|
+
is_multi=False,
|
402
|
+
_warehouse_name="wh_name_field_different",
|
403
|
+
)
|
342
404
|
|
343
405
|
def __init__(
|
344
406
|
self,
|
@@ -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)
|
@@ -324,3 +330,14 @@ class TestCompareEntitySchemas:
|
|
324
330
|
assert isinstance(
|
325
331
|
invalid_models["mock_entity"][0].op, ReorderEntitySchemaFields
|
326
332
|
)
|
333
|
+
|
334
|
+
# Test when the Benchling schema archived field becomes unarchived
|
335
|
+
benchling_rearchived_field = copy.deepcopy(mock_benchling_schema)
|
336
|
+
benchling_rearchived_field[0][1]["archived_field"].set_archived(False)
|
337
|
+
mock_get_benchling_entity_schemas.return_value = benchling_rearchived_field
|
338
|
+
invalid_models = compare_entity_schemas(mock_benchling_sdk)
|
339
|
+
assert len(invalid_models["mock_entity"]) == 1
|
340
|
+
assert isinstance(
|
341
|
+
invalid_models["mock_entity"][0].op, ArchiveEntitySchemaField
|
342
|
+
)
|
343
|
+
assert invalid_models["mock_entity"][0].op.wh_field_name == "archived_field"
|
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.
|
3
|
+
Version: 1.1.1
|
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
|
@@ -10,10 +10,13 @@ Classifier: Programming Language :: Python :: 3
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.9
|
11
11
|
Classifier: Programming Language :: Python :: 3.10
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
13
15
|
Requires-Dist: benchling-sdk (>=1.8.0)
|
14
16
|
Requires-Dist: bs4 (>=0.0.2,<0.0.3)
|
15
17
|
Requires-Dist: lxml (>=5.3.0,<6.0.0)
|
16
|
-
Requires-Dist:
|
18
|
+
Requires-Dist: numpy (>=1.23.5,<2.0.0)
|
19
|
+
Requires-Dist: pandas (>=1.5.3,<2.0.0)
|
17
20
|
Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
|
18
21
|
Requires-Dist: pydantic (>=2,<=2.7)
|
19
22
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
@@ -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=e4JWn97s_4EVJ1LOO5l6iucHQUd39Vl0stqMEj0uet8,5114
|
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=1RGiI_h8izLjT9txJ1IkRHYf8yrN_r6yjUn5SI2bxr8,17311
|
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=p-9inAZM4GOm4e1cadO191LNsnqceUGGyy0YVIXXxVw,16440
|
55
|
+
liminal/utils.py,sha256=vMjSasDnEghwqULDo14joxxJ56G4-9cBsw719nQ8C7g,2798
|
56
|
+
liminal/validation/__init__.py,sha256=SBd48xxBMJrBzI48G2RcK056EMlevt5YjmZMkfCWN1I,6924
|
57
|
+
liminal_orm-1.1.1.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
|
58
|
+
liminal_orm-1.1.1.dist-info/METADATA,sha256=-GObmj3sShq8Isn7h2M-6BT-ssmbsSc3UFebxvWEkRE,11313
|
59
|
+
liminal_orm-1.1.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
60
|
+
liminal_orm-1.1.1.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
|
61
|
+
liminal_orm-1.1.1.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=fM4wT60yUggT32xS_F8u31bidjBWOS9Xpn0I6FlXZaQ,4335
|
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=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=HNL-5CpL9vA3XH-MybCJMCswNhYxZV3e8h0HJMV7eoA,7511
|
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=O8SPg4lQDYsfz7NPHH3AJdRj9naDy_13hGH9cQStXt8,8484
|
25
|
-
liminal/entity_schemas/operations.py,sha256=piimMjnEFnKpucb2mLvPAXmUKjTbTEI7ZZD5B7amydE,23220
|
26
|
-
liminal/entity_schemas/tag_schema_models.py,sha256=jl6J_3iB0mxE51FbRKdwScRF24fRAumKpQDhfHGcqy8,16057
|
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=YjFORf_DF4COE80kX40OFuDMSeZ6M2je6b_iUaUOtKs,4678
|
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.6.dist-info/LICENSE.md,sha256=oVA877F_D1AV44dpjsv4f-4k690uNGApX1EtzOo3T8U,11353
|
58
|
-
liminal_orm-1.0.6.dist-info/METADATA,sha256=Jwa6P74ZUhDNYtMvI3y4jvcn_wvJluQ1kHAZXOtuoqo,11165
|
59
|
-
liminal_orm-1.0.6.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
60
|
-
liminal_orm-1.0.6.dist-info/entry_points.txt,sha256=atIrU63rrzH81dWC2sjUbFLlc5FWMmYRdMxXEWexIZA,47
|
61
|
-
liminal_orm-1.0.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|