liminal-orm 4.5.1__tar.gz → 4.6.1__tar.gz

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 (79) hide show
  1. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/PKG-INFO +1 -1
  2. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/connection/benchling_service.py +10 -3
  3. liminal_orm-4.6.1/liminal/tests/test_benchling_service.py +34 -0
  4. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/pyproject.toml +1 -1
  5. liminal_orm-4.5.1/liminal/entity_schemas/api_v3.py +0 -160
  6. liminal_orm-4.5.1/liminal/entity_schemas/entity_schema_models_v3.py +0 -86
  7. liminal_orm-4.5.1/liminal/enums/benchling_api_entity_type.py +0 -18
  8. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/.gitignore +0 -0
  9. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/LICENSE.md +0 -0
  10. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/README.md +0 -0
  11. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/__init__.py +0 -0
  12. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/base_dropdown.py +0 -0
  13. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/base_operation.py +0 -0
  14. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/base_validation_filters.py +0 -0
  15. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/compare_operation.py +0 -0
  16. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/name_template_parts.py +0 -0
  17. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/properties/base_field_properties.py +0 -0
  18. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/properties/base_name_template.py +0 -0
  19. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/properties/base_schema_properties.py +0 -0
  20. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/base/str_enum.py +0 -0
  21. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/cli/cli.py +0 -0
  22. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/cli/controller.py +0 -0
  23. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/cli/live_test_dropdown_migration.py +0 -0
  24. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/cli/live_test_entity_schema_migration.py +0 -0
  25. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/cli/utils.py +0 -0
  26. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/connection/__init__.py +0 -0
  27. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/connection/benchling_connection.py +0 -0
  28. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/dropdowns/api.py +0 -0
  29. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/dropdowns/compare.py +0 -0
  30. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/dropdowns/generate_files.py +0 -0
  31. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/dropdowns/operations.py +0 -0
  32. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/dropdowns/utils.py +0 -0
  33. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/api.py +0 -0
  34. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/compare.py +0 -0
  35. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/entity_schema_models.py +0 -0
  36. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/generate_files.py +0 -0
  37. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/operations.py +0 -0
  38. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/tag_schema_models.py +0 -0
  39. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/entity_schemas/utils.py +0 -0
  40. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/__init__.py +0 -0
  41. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_api_field_type.py +0 -0
  42. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_entity_type.py +0 -0
  43. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_field_type.py +0 -0
  44. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_folder_item_type.py +0 -0
  45. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_naming_strategy.py +0 -0
  46. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/benchling_sequence_type.py +0 -0
  47. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/name_template_part_type.py +0 -0
  48. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/enums/sequence_constraint.py +0 -0
  49. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/external/__init__.py +0 -0
  50. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/mappers.py +0 -0
  51. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/migrate/components.py +0 -0
  52. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/migrate/revision.py +0 -0
  53. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/migrate/revisions_timeline.py +0 -0
  54. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base.py +0 -0
  55. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base_model.py +0 -0
  56. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base_results_model.py +0 -0
  57. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base_tables/registry_entity.py +0 -0
  58. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base_tables/schema.py +0 -0
  59. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/base_tables/user.py +0 -0
  60. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/column.py +0 -0
  61. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/mixins.py +0 -0
  62. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/name_template.py +0 -0
  63. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/name_template_parts.py +0 -0
  64. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/relationship.py +0 -0
  65. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/results_schema_properties.py +0 -0
  66. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/orm/schema_properties.py +0 -0
  67. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/py.typed +0 -0
  68. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/results_schemas/generate_files.py +0 -0
  69. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/results_schemas/models/results_schema_model.py +0 -0
  70. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/results_schemas/utils.py +0 -0
  71. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/tests/__init__.py +0 -0
  72. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/tests/conftest.py +0 -0
  73. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/tests/from benchling_sdk.py +0 -0
  74. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/tests/test_dropdown_compare.py +0 -0
  75. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/tests/test_entity_schema_compare.py +0 -0
  76. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/unit_dictionary/utils.py +0 -0
  77. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/utils.py +0 -0
  78. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/validation/__init__.py +0 -0
  79. {liminal_orm-4.5.1 → liminal_orm-4.6.1}/liminal/validation/validation_severity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: liminal-orm
3
- Version: 4.5.1
3
+ Version: 4.6.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
  Project-URL: Homepage, https://github.com/dynotx/liminal-orm
6
6
  Project-URL: Repository, https://github.com/dynotx/liminal-orm
@@ -7,7 +7,7 @@ from urllib.parse import urlparse
7
7
  from playwright.async_api import async_playwright, Request
8
8
  import requests
9
9
  from benchling_sdk.auth.client_credentials_oauth2 import ClientCredentialsOAuth2
10
- from benchling_sdk.benchling import Benchling
10
+ from benchling_sdk.benchling import Benchling, BenchlingApiClientDecorator
11
11
  from benchling_sdk.helpers.retry_helpers import RetryStrategy
12
12
  from bs4 import BeautifulSoup
13
13
  from sqlalchemy import create_engine
@@ -43,7 +43,6 @@ class SSODisabledError(ValueError):
43
43
  class BenchlingService(Benchling):
44
44
  """
45
45
  Class that creates a connection object that can be used to connect to Benchling's API, database, or internal API.
46
- This inherits from LiminalBenchlingService, which takes in credentials and connects the specified services.
47
46
 
48
47
  Parameters
49
48
  ----------
@@ -55,6 +54,10 @@ class BenchlingService(Benchling):
55
54
  Whether to connect to the Benchling Postgres database. Requires warehouse_connection_string from the connection object.
56
55
  use_internal_api: bool = False
57
56
  Whether to connect to the Benchling internal API. Requires internal_api_admin_email and internal_api_admin_password from the connection object.
57
+ client_decorator: BenchlingApiClientDecorator | None = None
58
+ An optional function that receives the default BenchlingApiClient and returns a
59
+ customized one. Forwarded to the Benchling SDK. A common use is raising the HTTP
60
+ timeout, which otherwise defaults to 10 seconds: ``lambda c: c.with_timeout(60)``.
58
61
  """
59
62
 
60
63
  def __init__(
@@ -63,6 +66,7 @@ class BenchlingService(Benchling):
63
66
  use_api: bool = True,
64
67
  use_db: bool = False,
65
68
  use_internal_api: bool = False,
69
+ client_decorator: BenchlingApiClientDecorator | None = None,
66
70
  ) -> None:
67
71
  self.connection = connection
68
72
  self._session: Session | None = None
@@ -77,7 +81,10 @@ class BenchlingService(Benchling):
77
81
  )
78
82
  url = f"https://{connection.tenant_name}.benchling.com"
79
83
  super().__init__(
80
- url=url, auth_method=auth_method, retry_strategy=retry_strategy
84
+ url=url,
85
+ auth_method=auth_method,
86
+ retry_strategy=retry_strategy,
87
+ client_decorator=client_decorator,
81
88
  )
82
89
  LOGGER.info(f"Tenant {connection.tenant_name}: Connected to Benchling API.")
83
90
  self.use_db = use_db
@@ -0,0 +1,34 @@
1
+ from typing import cast
2
+
3
+ from benchling_api_client.v2.benchling_client import BenchlingApiClient
4
+
5
+ from liminal.connection.benchling_connection import BenchlingConnection
6
+ from liminal.connection.benchling_service import BenchlingService
7
+
8
+ # The Benchling SDK defaults the per-request HTTP timeout to 10 seconds.
9
+ SDK_DEFAULT_TIMEOUT_SECONDS = 10
10
+
11
+
12
+ def _connection() -> BenchlingConnection:
13
+ return BenchlingConnection(
14
+ tenant_name="test-tenant",
15
+ api_client_id="test-id",
16
+ api_client_secret="test-secret",
17
+ )
18
+
19
+
20
+ class TestBenchlingServiceClientDecorator:
21
+ def test_default_timeout_is_sdk_default(self) -> None:
22
+ service = BenchlingService(_connection(), use_db=False)
23
+ assert service._client.get_timeout() == SDK_DEFAULT_TIMEOUT_SECONDS
24
+
25
+ def test_client_decorator_is_forwarded_to_sdk(self) -> None:
26
+ def raise_timeout(client: BenchlingApiClient) -> BenchlingApiClient:
27
+ # with_timeout is typed to return the base Client but preserves the subclass.
28
+ return cast(BenchlingApiClient, client.with_timeout(60))
29
+
30
+ service = BenchlingService(
31
+ _connection(), use_db=False, client_decorator=raise_timeout
32
+ )
33
+
34
+ assert service._client.get_timeout() == 60
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "liminal-orm"
3
- version = "4.5.1"
3
+ version = "4.6.1"
4
4
  description = "An ORM and toolkit that builds on top of Benchling's platform to keep your schemas and downstream code dependencies in sync."
5
5
  authors = [{ name = "DynoTx Open Source", email = "opensource@dynotx.com" }]
6
6
  requires-python = ">=3.9,<4"
@@ -1,160 +0,0 @@
1
- import json
2
- from typing import Any
3
-
4
- import requests
5
-
6
- from liminal.connection import BenchlingService
7
- from liminal.enums.benchling_api_entity_type import BenchlingAPIEntityType
8
- from liminal.utils import await_queued_response
9
-
10
-
11
- def create_entity_schema(
12
- benchling_service: BenchlingService,
13
- api_entity_type: BenchlingAPIEntityType,
14
- payload: dict[str, Any],
15
- ) -> dict[str, Any]:
16
- """
17
- Create a new entity schema.
18
- """
19
- response = benchling_service.api.post_response(
20
- url=f"/api/v3-alpha/benchling/{api_entity_type.value}", body=payload
21
- )
22
- if not (200 <= response.status_code < 300):
23
- raise Exception("Failed to create entity schema:", response.content)
24
- return json.loads(response.content)
25
-
26
-
27
- def get_entity_schema(
28
- benchling_service: BenchlingService,
29
- api_entity_type: BenchlingAPIEntityType,
30
- entity_schema_id: str,
31
- ) -> dict[str, Any]:
32
- """
33
- Get an entity schema.
34
- """
35
- response = benchling_service.api.get_response(
36
- url=f"/api/v3-alpha/benchling/{api_entity_type.value}/{entity_schema_id}"
37
- )
38
- if not (200 <= response.status_code < 300):
39
- raise Exception("Failed to get entity schema:", response.content)
40
- return json.loads(response.content)
41
-
42
-
43
- def list_entity_schemas(
44
- benchling_service: BenchlingService,
45
- ) -> dict[str, Any]:
46
- """
47
- List all entity schemas.
48
- """
49
- response = benchling_service.api.get_response(
50
- url="/api/v3-alpha/benchling/entity-schema/items"
51
- )
52
- if not (200 <= response.status_code < 300):
53
- raise Exception("Failed to get entity schema:", response.content)
54
- return json.loads(response.content)
55
-
56
-
57
- def get_entity_schema_field_definitions(
58
- benchling_service: BenchlingService,
59
- api_entity_type: BenchlingAPIEntityType,
60
- entity_schema_id: str,
61
- ) -> dict[str, Any]:
62
- """
63
- Get the field definitions for an entity schema.
64
- """
65
- response = benchling_service.api.get_response(
66
- url=f"/api/v3-alpha/benchling/{api_entity_type.value}/{entity_schema_id}/field-definitions/items"
67
- )
68
- if not (200 <= response.status_code < 300):
69
- raise Exception("Failed to get entity schema:", response.content)
70
- return json.loads(response.content)
71
-
72
-
73
- def get_entity_schema_fieldsets(
74
- benchling_service: BenchlingService,
75
- api_entity_type: BenchlingAPIEntityType,
76
- entity_schema_id: str,
77
- ) -> dict[str, Any]:
78
- """
79
- Get the fieldsets for an entity schema.
80
- """
81
- response = benchling_service.api.get_response(
82
- url=f"/api/v3-alpha/benchling/{api_entity_type.value}/{entity_schema_id}/fieldsets/items"
83
- )
84
- if not (200 <= response.status_code < 300):
85
- raise Exception("Failed to get entity schema:", response.content)
86
- return json.loads(response.content)
87
-
88
-
89
- # def archive_tag_schemas(
90
- # benchling_service: BenchlingService, entity_schema_ids: list[str]
91
- # ) -> dict[str, Any]:
92
- # """
93
- # Archive a list of entity schema ids.
94
- # """
95
- # with requests.Session() as session:
96
- # response = session.post(
97
- # f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/tag-schemas:bulk-archive",
98
- # data=json.dumps({"ids": entity_schema_ids, "purpose": "Made in error"}),
99
- # headers=benchling_service.custom_post_headers,
100
- # cookies=benchling_service.custom_post_cookies,
101
- # )
102
- # if not response.ok:
103
- # raise Exception("Failed to archive tag schemas:", response.content)
104
- # return response.json()
105
-
106
-
107
- # def unarchive_tag_schemas(
108
- # benchling_service: BenchlingService, entity_schema_ids: list[str]
109
- # ) -> dict[str, Any]:
110
- # """
111
- # Unarchive a list of entity schema ids.
112
- # """
113
- # with requests.Session() as session:
114
- # response = session.post(
115
- # f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/tag-schemas:bulk-unarchive",
116
- # data=json.dumps({"ids": entity_schema_ids}),
117
- # headers=benchling_service.custom_post_headers,
118
- # cookies=benchling_service.custom_post_cookies,
119
- # )
120
- # if not response.ok:
121
- # raise Exception("Failed to unarchive tag schemas:", response.content)
122
- # return response.json()
123
-
124
-
125
- # def update_tag_schema(
126
- # benchling_service: BenchlingService, entity_schema_id: str, payload: dict[str, Any]
127
- # ) -> dict[str, Any]:
128
- # """
129
- # Update the tag schema with a new field.
130
- # """
131
- # with requests.Session() as session:
132
- # queued_response = session.post(
133
- # f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/tag-schemas/{entity_schema_id}/actions/update",
134
- # data=json.dumps(payload),
135
- # headers=benchling_service.custom_post_headers,
136
- # cookies=benchling_service.custom_post_cookies,
137
- # )
138
- # if not queued_response.ok:
139
- # raise Exception("Failed to update tag schema:", queued_response.content)
140
- # return await_queued_response(
141
- # queued_response.json()["status_url"], benchling_service
142
- # )
143
-
144
-
145
- # def set_tag_schema_name_template(
146
- # benchling_service: BenchlingService, entity_schema_id: str, payload: dict[str, Any]
147
- # ) -> dict[str, Any]:
148
- # """
149
- # Update the tag schema name template. Must be in a separate endpoint compared to update_tag_schema.
150
- # """
151
- # with requests.Session() as session:
152
- # response = session.post(
153
- # f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/tag-schemas/{entity_schema_id}/actions/set-name-template",
154
- # data=json.dumps(payload),
155
- # headers=benchling_service.custom_post_headers,
156
- # cookies=benchling_service.custom_post_cookies,
157
- # )
158
- # if not response.ok:
159
- # raise Exception("Failed to set tag schema name template:", response.content)
160
- # return response.json()
@@ -1,86 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any
4
-
5
- from pydantic import BaseModel, ConfigDict, Field
6
- from liminal.connection import BenchlingService
7
-
8
-
9
- class EntitySchemaOrganizationRefV2(BaseModel):
10
- id: str
11
-
12
-
13
- class EntitySchemaConstraintV2(BaseModel):
14
- fieldDefinitionNames: list[str] = Field(default_factory=list)
15
- hasUniqueResidues: bool | None = None
16
-
17
-
18
- class FieldDefinitionLinkRefV2(BaseModel):
19
- id: str
20
-
21
-
22
- class EntitySchemaFieldDefinitionV2(BaseModel):
23
- id: str
24
- name: str
25
- archived: bool
26
- systemName: str
27
- isMulti: bool | None = None
28
- isRequired: bool
29
- derivationType: str
30
- isParent: bool | None = None
31
- archiveReason: str | None = None
32
- description: str | None = None
33
- linkDefinition: FieldDefinitionLinkRefV2 | None = None
34
- __typename: str | None = None
35
-
36
-
37
- class EntitySchemaModelV2(BaseModel):
38
- """Pydantic model for Benchling entity schema API payloads (e.g. RnaSequenceSchema)."""
39
-
40
- model_config = ConfigDict(extra="ignore")
41
-
42
- id: str
43
- fieldDefinitions: str
44
- fields: list[EntitySchemaFieldDefinitionV2] = Field(default_factory=list)
45
- systemName: str
46
- itemIdPrefix: str
47
- containableType: str
48
- fieldsets: str
49
- systemCategories: list[Any] = Field(default_factory=list)
50
- organization: EntitySchemaOrganizationRefV2
51
- modifiedAt: str
52
- includeRegistryIdInChips: bool | None = None
53
- useRegistryIdForItemDisplayLabel: bool | None = None
54
- availableRegistrationNamingOptions: list[str] = Field(default_factory=list)
55
- archived: bool | None = None
56
- name: str
57
- description: str | None = None
58
- showResidues: bool | None = None
59
- createdAt: str
60
- constraint: EntitySchemaConstraintV2 | None = None
61
- archiveReason: str | None = None
62
- __typename: str | None = None
63
-
64
- @classmethod
65
- def get_one(
66
- cls,
67
- benchling_service: BenchlingService,
68
- wh_schema_name: str,
69
- schemas_data: list[dict[str, Any]] | None = None,
70
- ) -> EntitySchemaModelV2:
71
- if schemas_data is None:
72
- schemas_data = cls.get_all_json(benchling_service)
73
- schema = next(
74
- (
75
- schema
76
- for schema in schemas_data
77
- if schema["sqlIdentifier"] == wh_schema_name
78
- and schema["registryId"] == benchling_service.registry_id
79
- ),
80
- None,
81
- )
82
- if schema is None:
83
- raise ValueError(
84
- f"Schema {wh_schema_name} not found in Benchling {benchling_service.benchling_tenant}."
85
- )
86
- return cls.model_validate(schema)
@@ -1,18 +0,0 @@
1
- from liminal.base.str_enum import StrEnum
2
-
3
-
4
- class BenchlingAPIEntityType(StrEnum):
5
- """This enum represents the different types a Benchling field can have on an entity schema.
6
- These are ONLY USED FOR THE INTERNAL BENCHLING API."""
7
-
8
- CUSTOM_ENTITY_SCHEMA = "custom-entity-schema"
9
- AA_SEQUENCE_SCHEMA = "aa-sequence-schema"
10
- DNA_OLIGO_SCHEMA = "dna-oligo-schema"
11
- DNA_SEQUENCE_SCHEMA = "dna-sequence-schema"
12
- OLIGO_CONJUGATE_SCHEMA = "oligo-conjugate-schema"
13
- OLIGO_DUPLEX_SCHEMA = "oligo-duplex-schema"
14
- RNA_OLIGO_SCHEMA = "rna-oligo-schema"
15
- RNA_SEQUENCE_SCHEMA = "rna-sequence-schema"
16
- MIXTURE_SCHEMA = "mixture-schema"
17
- MOLECULE_SCHEMA = "molecule-schema"
18
- EQUIPMENT_SCHEMA = "equipment-schema"
File without changes
File without changes
File without changes