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.
Files changed (34) hide show
  1. liminal/base/base_operation.py +9 -11
  2. liminal/base/properties/base_field_properties.py +11 -0
  3. liminal/base/properties/base_schema_properties.py +6 -2
  4. liminal/cli/live_test_dropdown_migration.py +8 -9
  5. liminal/cli/live_test_entity_schema_migration.py +24 -27
  6. liminal/connection/benchling_connection.py +8 -2
  7. liminal/connection/benchling_service.py +11 -18
  8. liminal/dropdowns/operations.py +1 -1
  9. liminal/entity_schemas/compare.py +17 -7
  10. liminal/entity_schemas/entity_schema_models.py +6 -9
  11. liminal/entity_schemas/generate_files.py +7 -6
  12. liminal/entity_schemas/operations.py +77 -102
  13. liminal/entity_schemas/tag_schema_models.py +7 -2
  14. liminal/entity_schemas/utils.py +4 -2
  15. liminal/enums/benchling_api_field_type.py +3 -0
  16. liminal/enums/benchling_entity_type.py +1 -0
  17. liminal/enums/benchling_field_type.py +4 -0
  18. liminal/enums/benchling_folder_item_type.py +1 -0
  19. liminal/external/__init__.py +0 -2
  20. liminal/mappers.py +25 -1
  21. liminal/migrate/components.py +9 -4
  22. liminal/orm/base_model.py +8 -7
  23. liminal/orm/column.py +15 -5
  24. liminal/orm/mixins.py +9 -0
  25. liminal/orm/schema_properties.py +8 -2
  26. liminal/tests/conftest.py +84 -22
  27. liminal/tests/test_entity_schema_compare.py +22 -5
  28. liminal/utils.py +11 -4
  29. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/METADATA +5 -2
  30. liminal_orm-1.1.1.dist-info/RECORD +61 -0
  31. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/WHEEL +1 -1
  32. liminal_orm-1.0.6.dist-info/RECORD +0 -61
  33. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/LICENSE.md +0 -0
  34. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from pydantic import PrivateAttr, model_validator
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 | None = PrivateAttr(default=None)
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(False),
258
+ _archived=False,
259
+ ),
233
260
  "string_field_req": Props(
234
- name="String Field Required", type=Type.TEXT, required=True, is_multi=False
235
- ).set_archived(False),
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
- ).set_archived(False),
272
+ _archived=False,
273
+ ),
242
274
  "float_field": Props(
243
- name="Float Field", type=Type.DECIMAL, required=False, is_multi=False
244
- ).set_archived(False),
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", type=Type.INTEGER, required=False, is_multi=False
247
- ).set_archived(False),
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", type=Type.DATE, required=False, is_multi=False
250
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(True)
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
- ).set_archived(False),
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
- ).set_archived(False),
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 list(invalid_models["mock_entity_two_wh"][0].op.fields.keys()) == [
50
- "parent_link_field"
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.wh_field_name == "string_field_req"
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
- ).set_archived(False)
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.0.6
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: pandas (>=1.5.3)
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,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.5.1
2
+ Generator: poetry-core 1.9.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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,,