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.
Files changed (35) 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 +15 -2
  4. liminal/cli/cli.py +4 -1
  5. liminal/cli/live_test_dropdown_migration.py +8 -9
  6. liminal/cli/live_test_entity_schema_migration.py +24 -27
  7. liminal/connection/benchling_connection.py +8 -2
  8. liminal/connection/benchling_service.py +18 -19
  9. liminal/dropdowns/operations.py +1 -1
  10. liminal/entity_schemas/compare.py +17 -7
  11. liminal/entity_schemas/entity_schema_models.py +6 -9
  12. liminal/entity_schemas/generate_files.py +9 -8
  13. liminal/entity_schemas/operations.py +77 -106
  14. liminal/entity_schemas/tag_schema_models.py +9 -2
  15. liminal/entity_schemas/utils.py +4 -2
  16. liminal/enums/benchling_api_field_type.py +3 -0
  17. liminal/enums/benchling_entity_type.py +1 -0
  18. liminal/enums/benchling_field_type.py +4 -0
  19. liminal/enums/benchling_folder_item_type.py +1 -0
  20. liminal/external/__init__.py +0 -2
  21. liminal/mappers.py +25 -1
  22. liminal/migrate/components.py +9 -4
  23. liminal/orm/base_model.py +8 -7
  24. liminal/orm/column.py +11 -4
  25. liminal/orm/mixins.py +9 -0
  26. liminal/orm/schema_properties.py +8 -2
  27. liminal/tests/conftest.py +52 -22
  28. liminal/tests/test_entity_schema_compare.py +11 -5
  29. liminal/utils.py +11 -4
  30. {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/METADATA +12 -5
  31. liminal_orm-1.1.0.dist-info/RECORD +61 -0
  32. liminal_orm-1.0.5.dist-info/RECORD +0 -61
  33. {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/LICENSE.md +0 -0
  34. {liminal_orm-1.0.5.dist-info → liminal_orm-1.1.0.dist-info}/WHEEL +0 -0
  35. {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)
@@ -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,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.5
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: pandas (>=1.5.3)
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
- 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/)!
32
+ [![PyPI version](https://img.shields.io/pypi/v/liminal-orm.svg)](https://pypi.org/project/liminal-orm/)
33
+ [![License](https://img.shields.io/github/license/dynotx/liminal-orm)](https://github.com/dynotx/liminal-orm/blob/main/LICENSE.md)
34
+ [![CI](https://github.com/dynotx/liminal-orm/actions/workflows/liminal.yml/badge.svg)](https://github.com/dynotx/liminal-orm/actions/workflows/liminal.yml)
35
+ [![Downloads](https://static.pepy.tech/personalized-badge/liminal-orm?period=total&units=international_system&left_color=grey&right_color=blue&left_text=Downloads)](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,,