liminal-orm 1.0.6__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.
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 +6 -3
  24. liminal/orm/mixins.py +9 -0
  25. liminal/orm/schema_properties.py +8 -2
  26. liminal/tests/conftest.py +52 -22
  27. liminal/tests/test_entity_schema_compare.py +11 -5
  28. liminal/utils.py +11 -4
  29. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.0.dist-info}/METADATA +3 -2
  30. liminal_orm-1.1.0.dist-info/RECORD +61 -0
  31. liminal_orm-1.0.6.dist-info/RECORD +0 -61
  32. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.0.dist-info}/LICENSE.md +0 -0
  33. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.0.dist-info}/WHEEL +0 -0
  34. {liminal_orm-1.0.6.dist-info → liminal_orm-1.1.0.dist-info}/entry_points.txt +0 -0
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,8 @@ 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
+ ),
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
- ).set_archived(False),
240
+ _archived=False,
241
+ ),
233
242
  "string_field_req": Props(
234
- name="String Field Required", type=Type.TEXT, required=True, is_multi=False
235
- ).set_archived(False),
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
- ).set_archived(False),
254
+ _archived=False,
255
+ ),
242
256
  "float_field": Props(
243
- name="Float Field", type=Type.DECIMAL, required=False, is_multi=False
244
- ).set_archived(False),
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", type=Type.INTEGER, required=False, is_multi=False
247
- ).set_archived(False),
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", type=Type.DATE, required=False, is_multi=False
250
- ).set_archived(False),
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
- ).set_archived(False),
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
- ).set_archived(True)
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
- ).set_archived(False),
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
- ).set_archived(False),
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 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)
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.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,8 @@ 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: pandas (>=1.5.3)
16
+ Requires-Dist: numpy (>=1.23.5,<2.0.0)
17
+ Requires-Dist: pandas (>=1.5.3,<2.0.0)
17
18
  Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
18
19
  Requires-Dist: pydantic (>=2,<=2.7)
19
20
  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=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=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,,