benchling-sdk 1.17.0a0__py3-none-any.whl → 1.17.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.
@@ -0,0 +1,73 @@
1
+ from typing import Iterable, Optional
2
+
3
+ from benchling_api_client.v2.stable.api.codon_usage_tables import list_codon_usage_tables
4
+ from benchling_api_client.v2.types import Response
5
+
6
+ from benchling_sdk.errors import raise_for_status
7
+ from benchling_sdk.helpers.decorators import api_method
8
+ from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
9
+ from benchling_sdk.helpers.serialization_helpers import none_as_unset, optional_array_query_param
10
+ from benchling_sdk.models import CodonUsageTable, CodonUsageTablesPaginatedList, ListCodonUsageTablesSort
11
+ from benchling_sdk.services.v2.base_service import BaseService
12
+
13
+
14
+ class CodonUsageTableService(BaseService):
15
+ """
16
+ Codon Usage Tables.
17
+
18
+ Benchling curates codon usage data for a variety of organisms to support operations such as Codon
19
+ Optimization and Back Translation.
20
+
21
+ See https://benchling.com/api/reference#/Codon%20Usage%20Tables
22
+ """
23
+
24
+ @api_method
25
+ def _list_page(
26
+ self,
27
+ sort: Optional[ListCodonUsageTablesSort] = None,
28
+ ids: Optional[Iterable[str]] = None,
29
+ name: Optional[str] = None,
30
+ name_includes: Optional[str] = None,
31
+ names_any_of: Optional[Iterable[str]] = [],
32
+ page_size: Optional[int] = None,
33
+ next_token: NextToken = None,
34
+ ) -> Response[CodonUsageTablesPaginatedList]:
35
+ response = list_codon_usage_tables.sync_detailed(
36
+ client=self.client,
37
+ ids=none_as_unset(optional_array_query_param(ids)),
38
+ name=none_as_unset(name),
39
+ name_includes=none_as_unset(name_includes),
40
+ namesany_of=none_as_unset(optional_array_query_param(names_any_of)),
41
+ next_token=none_as_unset(next_token),
42
+ page_size=none_as_unset(page_size),
43
+ sort=none_as_unset(sort),
44
+ )
45
+ return raise_for_status(response)
46
+
47
+ def list(
48
+ self,
49
+ sort: Optional[ListCodonUsageTablesSort] = None,
50
+ ids: Optional[Iterable[str]] = None,
51
+ name: Optional[str] = None,
52
+ name_includes: Optional[str] = None,
53
+ names_any_of: Optional[Iterable[str]] = None,
54
+ page_size: Optional[int] = None,
55
+ ) -> PageIterator[CodonUsageTable]:
56
+ """
57
+ List codon usage tables.
58
+
59
+ See https://benchling.com/api/reference#/Codon%20Usage%20Tables/listCodonUsageTables
60
+ """
61
+
62
+ def api_call(next_token: NextToken) -> Response[CodonUsageTablesPaginatedList]:
63
+ return self._list_page(
64
+ sort=sort,
65
+ ids=ids,
66
+ name=name,
67
+ name_includes=name_includes,
68
+ names_any_of=names_any_of,
69
+ page_size=page_size,
70
+ next_token=next_token,
71
+ )
72
+
73
+ return PageIterator(api_call, lambda result: result.codon_usage_tables)
@@ -15,6 +15,7 @@ from benchling_api_client.v2.stable.api.dna_sequences import (
15
15
  get_dna_sequence,
16
16
  list_dna_sequences,
17
17
  match_bases_dna_sequences,
18
+ optimize_codons,
18
19
  search_dna_sequences,
19
20
  unarchive_dna_sequences,
20
21
  update_dna_sequence,
@@ -54,6 +55,7 @@ from benchling_sdk.models import (
54
55
  EntityArchiveReason,
55
56
  ListDNASequencesSort,
56
57
  MatchBasesRequest,
58
+ OptimizeCodons,
57
59
  SearchBasesRequest,
58
60
  )
59
61
  from benchling_sdk.services.v2.base_service import BaseService
@@ -398,3 +400,13 @@ class DnaSequenceService(BaseService):
398
400
  client=self.client, json_body=find_matching_region
399
401
  )
400
402
  return model_from_detailed(response)
403
+
404
+ @api_method
405
+ def optimize_codons(self, optimize_request: OptimizeCodons) -> AsyncTaskLink:
406
+ """
407
+ Create codon-optimized DNA sequences.
408
+
409
+ See https://benchling.com/api/reference#/DNA%20Sequences/optimizeCodons
410
+ """
411
+ response = optimize_codons.sync_detailed(client=self.client, json_body=optimize_request)
412
+ return model_from_detailed(response)
@@ -0,0 +1,72 @@
1
+ from typing import Iterable, Optional
2
+
3
+ from benchling_api_client.v2.stable.api.enzymes import list_enzymes
4
+ from benchling_api_client.v2.types import Response
5
+
6
+ from benchling_sdk.errors import raise_for_status
7
+ from benchling_sdk.helpers.decorators import api_method
8
+ from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
9
+ from benchling_sdk.helpers.serialization_helpers import none_as_unset, optional_array_query_param
10
+ from benchling_sdk.models import Enzyme, EnzymesPaginatedList, ListEnzymesSort
11
+ from benchling_sdk.services.v2.base_service import BaseService
12
+
13
+
14
+ class EnzymeService(BaseService):
15
+ """
16
+ Enzymes.
17
+
18
+ Restriction enzymes are curated by Benchling for operations such as Digests and Codon Optimization.
19
+
20
+ See https://benchling.com/api/reference#/Enzymes
21
+ """
22
+
23
+ @api_method
24
+ def _list_page(
25
+ self,
26
+ sort: Optional[ListEnzymesSort] = None,
27
+ ids: Optional[Iterable[str]] = None,
28
+ name: Optional[str] = None,
29
+ name_includes: Optional[str] = None,
30
+ names_any_of: Optional[Iterable[str]] = [],
31
+ page_size: Optional[int] = None,
32
+ next_token: NextToken = None,
33
+ ) -> Response[EnzymesPaginatedList]:
34
+ response = list_enzymes.sync_detailed(
35
+ client=self.client,
36
+ ids=none_as_unset(optional_array_query_param(ids)),
37
+ name=none_as_unset(name),
38
+ name_includes=none_as_unset(name_includes),
39
+ namesany_of=none_as_unset(optional_array_query_param(names_any_of)),
40
+ next_token=none_as_unset(next_token),
41
+ page_size=none_as_unset(page_size),
42
+ sort=none_as_unset(sort),
43
+ )
44
+ return raise_for_status(response)
45
+
46
+ def list(
47
+ self,
48
+ sort: Optional[ListEnzymesSort] = None,
49
+ ids: Optional[Iterable[str]] = None,
50
+ name: Optional[str] = None,
51
+ name_includes: Optional[str] = None,
52
+ names_any_of: Optional[Iterable[str]] = None,
53
+ page_size: Optional[int] = None,
54
+ ) -> PageIterator[Enzyme]:
55
+ """
56
+ List enzymes.
57
+
58
+ See https://benchling.com/api/reference#/Enzymes/listEnzymes
59
+ """
60
+
61
+ def api_call(next_token: NextToken) -> Response[EnzymesPaginatedList]:
62
+ return self._list_page(
63
+ sort=sort,
64
+ ids=ids,
65
+ name=name,
66
+ name_includes=name_includes,
67
+ names_any_of=names_any_of,
68
+ page_size=page_size,
69
+ next_token=next_token,
70
+ )
71
+
72
+ return PageIterator(api_call, lambda result: result.enzymes)
@@ -0,0 +1,144 @@
1
+ from typing import Iterable, Optional
2
+
3
+ from benchling_api_client.v2.stable.api.monomers import (
4
+ archive_monomers,
5
+ create_monomer,
6
+ list_monomers,
7
+ unarchive_monomers,
8
+ update_monomer,
9
+ )
10
+ from benchling_api_client.v2.types import Response
11
+
12
+ from benchling_sdk.errors import raise_for_status
13
+ from benchling_sdk.helpers.decorators import api_method
14
+ from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
15
+ from benchling_sdk.helpers.response_helpers import model_from_detailed
16
+ from benchling_sdk.helpers.serialization_helpers import none_as_unset, optional_array_query_param
17
+ from benchling_sdk.models import (
18
+ Monomer,
19
+ MonomerCreate,
20
+ MonomersArchivalChange,
21
+ MonomersArchive,
22
+ MonomersArchiveReason,
23
+ MonomersPaginatedList,
24
+ MonomersUnarchive,
25
+ MonomerUpdate,
26
+ )
27
+ from benchling_sdk.services.v2.base_service import BaseService
28
+
29
+
30
+ class MonomerService(BaseService):
31
+ """
32
+ Monomers.
33
+
34
+ Monomers are chemical building blocks with specified structures used to compose modified
35
+ nucleotides. Note that monomer write endpoints require tenant admin permissions.
36
+
37
+ See https://benchling.com/api/reference#/Monomers
38
+ """
39
+
40
+ @api_method
41
+ def _list_page(
42
+ self,
43
+ page_size: Optional[int] = None,
44
+ next_token: NextToken = None,
45
+ returning: Optional[Iterable[str]] = None,
46
+ ) -> Response[MonomersPaginatedList]:
47
+ response = list_monomers.sync_detailed(
48
+ client=self.client,
49
+ next_token=none_as_unset(next_token),
50
+ page_size=none_as_unset(page_size),
51
+ returning=none_as_unset(optional_array_query_param(returning)),
52
+ )
53
+ return raise_for_status(response)
54
+
55
+ def list(
56
+ self,
57
+ page_size: Optional[int] = None,
58
+ returning: Optional[Iterable[str]] = None,
59
+ ) -> PageIterator[Monomer]:
60
+ """
61
+ List monomers.
62
+
63
+ See https://benchling.com/api/reference#/Monomers/listMonomers
64
+ """
65
+
66
+ def api_call(next_token: NextToken) -> Response[MonomersPaginatedList]:
67
+ return self._list_page(
68
+ page_size=page_size,
69
+ next_token=next_token,
70
+ returning=returning,
71
+ )
72
+
73
+ return PageIterator(api_call, lambda result: result.monomers)
74
+
75
+ @api_method
76
+ def create(
77
+ self,
78
+ monomer: MonomerCreate,
79
+ returning: Optional[Iterable[str]] = None,
80
+ ) -> Monomer:
81
+ """
82
+ Create a monomer.
83
+
84
+ See https://benchling.com/api/reference#/Monomers/createMonomer
85
+ """
86
+ response = create_monomer.sync_detailed(
87
+ client=self.client,
88
+ json_body=monomer,
89
+ returning=none_as_unset(optional_array_query_param(returning)),
90
+ )
91
+ return model_from_detailed(response)
92
+
93
+ @api_method
94
+ def update(
95
+ self,
96
+ monomer_id: str,
97
+ monomer: MonomerUpdate,
98
+ returning: Optional[Iterable[str]] = None,
99
+ ) -> Monomer:
100
+ """
101
+ Update a Monomer.
102
+
103
+ See https://benchling.com/api/reference#/Monomers/updateMonomer
104
+ """
105
+ response = update_monomer.sync_detailed(
106
+ client=self.client,
107
+ monomer_id=monomer_id,
108
+ json_body=monomer,
109
+ returning=none_as_unset(optional_array_query_param(returning)),
110
+ )
111
+ return model_from_detailed(response)
112
+
113
+ @api_method
114
+ def archive(
115
+ self,
116
+ monomer_ids: Iterable[str],
117
+ reason: MonomersArchiveReason,
118
+ ) -> MonomersArchivalChange:
119
+ """
120
+ Archive Monomers.
121
+
122
+ See https://benchling.com/api/reference#/Monomers/archiveMonomers
123
+ """
124
+ response = archive_monomers.sync_detailed(
125
+ client=self.client,
126
+ json_body=MonomersArchive(monomer_ids=list(monomer_ids), reason=reason),
127
+ )
128
+ return model_from_detailed(response)
129
+
130
+ @api_method
131
+ def unarchive(
132
+ self,
133
+ monomer_ids: Iterable[str],
134
+ ) -> MonomersArchivalChange:
135
+ """
136
+ Unarchive Monomers.
137
+
138
+ See https://benchling.com/api/reference#/Monomers/unarchiveMonomers
139
+ """
140
+ response = unarchive_monomers.sync_detailed(
141
+ client=self.client,
142
+ json_body=MonomersUnarchive(monomer_ids=list(monomer_ids)),
143
+ )
144
+ return model_from_detailed(response)
@@ -1,6 +1,14 @@
1
1
  from typing import Iterable, List, Optional, Union
2
2
 
3
- from benchling_api_client.v2.stable.api.organizations import get_organization, list_organizations
3
+ from benchling_api_client.v2.stable.api.organizations import (
4
+ create_organization_membership,
5
+ delete_organization_membership,
6
+ get_organization,
7
+ get_organization_membership,
8
+ list_organization_memberships,
9
+ list_organizations,
10
+ update_organization_membership,
11
+ )
4
12
  from benchling_api_client.v2.types import Response
5
13
 
6
14
  from benchling_sdk.errors import raise_for_status
@@ -10,7 +18,15 @@ from benchling_sdk.helpers.logging_helpers import log_not_implemented
10
18
  from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
11
19
  from benchling_sdk.helpers.response_helpers import model_from_detailed
12
20
  from benchling_sdk.helpers.serialization_helpers import none_as_unset, optional_array_query_param
13
- from benchling_sdk.models import ListOrganizationsSort, Organization, OrganizationsPaginatedList
21
+ from benchling_sdk.models import (
22
+ ListOrganizationsSort,
23
+ Membership,
24
+ MembershipCreate,
25
+ MembershipsPaginatedList,
26
+ MembershipUpdate,
27
+ Organization,
28
+ OrganizationsPaginatedList,
29
+ )
14
30
  from benchling_sdk.services.v2.base_service import BaseService
15
31
 
16
32
 
@@ -116,3 +132,89 @@ class OrganizationService(BaseService):
116
132
  return body.organizations
117
133
 
118
134
  return PageIterator(api_call, results_extractor)
135
+
136
+ @api_method
137
+ def _list_memberships_page(
138
+ self,
139
+ organization_id: str,
140
+ role: Optional[str],
141
+ page_size: Optional[int],
142
+ next_token: NextToken,
143
+ ) -> Response[MembershipsPaginatedList]:
144
+ response = list_organization_memberships.sync_detailed(
145
+ client=self.client,
146
+ organization_id=organization_id,
147
+ page_size=none_as_unset(page_size),
148
+ next_token=next_token,
149
+ role=none_as_unset(role),
150
+ )
151
+ raise_for_status(response)
152
+ return response # type: ignore
153
+
154
+ def list_memberships(
155
+ self,
156
+ organization_id: str,
157
+ role: Optional[str] = None,
158
+ page_size: Optional[int] = None,
159
+ ) -> PageIterator[MembershipsPaginatedList]:
160
+ """Return all organization memberships in the given organization.
161
+
162
+ See https://benchling.com/api/reference#/Organizations/listOrganizationMemberships
163
+ """
164
+
165
+ def api_call(next_token: NextToken) -> Response[MembershipsPaginatedList]:
166
+ return self._list_memberships_page(organization_id, role, page_size, next_token)
167
+
168
+ return PageIterator(api_call, lambda body: body.memberships)
169
+
170
+ @api_method
171
+ def get_membership(self, organization_id: str, user_id: str) -> Membership:
172
+ """Get organization membership.
173
+
174
+ See https://benchling.com/api/reference#/Organizations/getOrganizationMembership
175
+ """
176
+ response = get_organization_membership.sync_detailed(
177
+ client=self.client, organization_id=organization_id, user_id=user_id
178
+ )
179
+ return model_from_detailed(response)
180
+
181
+ @api_method
182
+ def create_membership(self, organization_id: str, membership: MembershipCreate) -> Membership:
183
+ """Create organization membership.
184
+
185
+ See https://benchling.com/api/reference#/Organizations/createOrganizationMembership
186
+ """
187
+ response = create_organization_membership.sync_detailed(
188
+ client=self.client,
189
+ organization_id=organization_id,
190
+ json_body=membership,
191
+ )
192
+ return model_from_detailed(response)
193
+
194
+ @api_method
195
+ def update_membership(
196
+ self, organization_id: str, user_id: str, membership: MembershipUpdate
197
+ ) -> Membership:
198
+ """Update organization membership by user ID and organization ID.
199
+
200
+ See https://benchling.com/api/reference#/Organizations/updateOrganizationMembership
201
+ """
202
+ response = update_organization_membership.sync_detailed(
203
+ client=self.client,
204
+ organization_id=organization_id,
205
+ user_id=user_id,
206
+ json_body=membership,
207
+ )
208
+ return model_from_detailed(response)
209
+
210
+ @api_method
211
+ def delete_membership(self, organization_id: str, user_id: str) -> None:
212
+ """Delete a single team membership.
213
+
214
+ See https://benchling.com/api/reference#/Organizations/deleteOrganizationMembership
215
+ """
216
+ raise_for_status(
217
+ delete_organization_membership.sync_detailed(
218
+ client=self.client, organization_id=organization_id, user_id=user_id
219
+ )
220
+ )
@@ -1,6 +1,16 @@
1
1
  from typing import Iterable, List, Optional, Union
2
2
 
3
- from benchling_api_client.v2.stable.api.teams import get_team, list_teams
3
+ from benchling_api_client.v2.stable.api.teams import (
4
+ create_team,
5
+ create_team_membership,
6
+ delete_team_membership,
7
+ get_team,
8
+ get_team_membership,
9
+ list_team_memberships,
10
+ list_teams,
11
+ update_team,
12
+ update_team_membership,
13
+ )
4
14
  from benchling_api_client.v2.types import Response
5
15
 
6
16
  from benchling_sdk.errors import raise_for_status
@@ -9,7 +19,17 @@ from benchling_sdk.helpers.decorators import api_method
9
19
  from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
10
20
  from benchling_sdk.helpers.response_helpers import model_from_detailed
11
21
  from benchling_sdk.helpers.serialization_helpers import none_as_unset, optional_array_query_param
12
- from benchling_sdk.models import ListTeamsSort, Team, TeamsPaginatedList
22
+ from benchling_sdk.models import (
23
+ ListTeamsSort,
24
+ Membership,
25
+ MembershipCreate,
26
+ MembershipsPaginatedList,
27
+ MembershipUpdate,
28
+ Team,
29
+ TeamCreate,
30
+ TeamsPaginatedList,
31
+ TeamUpdate,
32
+ )
13
33
  from benchling_sdk.services.v2.base_service import BaseService
14
34
 
15
35
 
@@ -116,3 +136,101 @@ class TeamService(BaseService):
116
136
  return body.teams
117
137
 
118
138
  return PageIterator(api_call, results_extractor)
139
+
140
+ @api_method
141
+ def create(self, team: TeamCreate) -> Team:
142
+ """Create team.
143
+
144
+ See https://benchling.com/api/reference#/Teams/createTeam
145
+ """
146
+ response = create_team.sync_detailed(client=self.client, json_body=team)
147
+ return model_from_detailed(response)
148
+
149
+ @api_method
150
+ def update(self, team_id: str, team: TeamUpdate) -> Team:
151
+ """Update team.
152
+
153
+ See https://benchling.com/api/reference#/Teams/updateTeam
154
+ """
155
+ response = update_team.sync_detailed(client=self.client, team_id=team_id, json_body=team)
156
+ return model_from_detailed(response)
157
+
158
+ @api_method
159
+ def _list_memberships_page(
160
+ self,
161
+ team_id: str,
162
+ role: Optional[str],
163
+ page_size: Optional[int],
164
+ next_token: NextToken,
165
+ ) -> Response[MembershipsPaginatedList]:
166
+ response = list_team_memberships.sync_detailed(
167
+ client=self.client,
168
+ team_id=team_id,
169
+ page_size=none_as_unset(page_size),
170
+ next_token=next_token,
171
+ role=none_as_unset(role),
172
+ )
173
+ raise_for_status(response)
174
+ return response # type: ignore
175
+
176
+ def list_memberships(
177
+ self,
178
+ team_id: str,
179
+ role: Optional[str] = None,
180
+ page_size: Optional[int] = None,
181
+ ) -> PageIterator[MembershipsPaginatedList]:
182
+ """Return all team memberships in the given team.
183
+
184
+ See https://benchling.com/api/reference#/Teams/listTeamMemberships
185
+ """
186
+
187
+ def api_call(next_token: NextToken) -> Response[MembershipsPaginatedList]:
188
+ return self._list_memberships_page(team_id, role, page_size, next_token)
189
+
190
+ return PageIterator(api_call, lambda body: body.memberships)
191
+
192
+ @api_method
193
+ def get_membership(self, team_id: str, user_id: str) -> Membership:
194
+ """Get team membership.
195
+
196
+ See https://benchling.com/api/reference#/Teams/getTeamMembership
197
+ """
198
+ response = get_team_membership.sync_detailed(client=self.client, team_id=team_id, user_id=user_id)
199
+ return model_from_detailed(response)
200
+
201
+ @api_method
202
+ def create_membership(self, team_id: str, membership: MembershipCreate) -> Membership:
203
+ """Create team membership for the given user, role, and team.
204
+
205
+ See https://benchling.com/api/reference#/Teams/createTeamMembership
206
+ """
207
+ response = create_team_membership.sync_detailed(
208
+ client=self.client,
209
+ team_id=team_id,
210
+ json_body=membership,
211
+ )
212
+ return model_from_detailed(response)
213
+
214
+ @api_method
215
+ def update_membership(self, team_id: str, user_id: str, membership: MembershipUpdate) -> Membership:
216
+ """Update a single team membership.
217
+
218
+ See https://benchling.com/api/reference#/Teams/updateTeamMembership
219
+ """
220
+ response = update_team_membership.sync_detailed(
221
+ client=self.client,
222
+ team_id=team_id,
223
+ user_id=user_id,
224
+ json_body=membership,
225
+ )
226
+ return model_from_detailed(response)
227
+
228
+ @api_method
229
+ def delete_membership(self, team_id: str, user_id: str) -> None:
230
+ """Delete a single team membership.
231
+
232
+ See https://benchling.com/api/reference#/Teams/deleteTeamMembership
233
+ """
234
+ raise_for_status(
235
+ delete_team_membership.sync_detailed(client=self.client, team_id=team_id, user_id=user_id)
236
+ )
@@ -16,6 +16,7 @@ if TYPE_CHECKING:
16
16
  from benchling_sdk.services.v2.stable.assay_run_service import AssayRunService
17
17
  from benchling_sdk.services.v2.stable.blob_service import BlobService
18
18
  from benchling_sdk.services.v2.stable.box_service import BoxService
19
+ from benchling_sdk.services.v2.stable.codon_usage_table_service import CodonUsageTableService
19
20
  from benchling_sdk.services.v2.stable.container_service import ContainerService
20
21
  from benchling_sdk.services.v2.stable.custom_entity_service import CustomEntityService
21
22
  from benchling_sdk.services.v2.stable.custom_notation_service import CustomNotationService
@@ -25,6 +26,7 @@ if TYPE_CHECKING:
25
26
  from benchling_sdk.services.v2.stable.dropdown_service import DropdownService
26
27
  from benchling_sdk.services.v2.stable.entity_service import EntityService
27
28
  from benchling_sdk.services.v2.stable.entry_service import EntryService
29
+ from benchling_sdk.services.v2.stable.enzyme_service import EnzymeService
28
30
  from benchling_sdk.services.v2.stable.event_service import EventService
29
31
  from benchling_sdk.services.v2.stable.export_service import ExportService
30
32
  from benchling_sdk.services.v2.stable.feature_library_service import FeatureLibraryService
@@ -35,6 +37,7 @@ if TYPE_CHECKING:
35
37
  from benchling_sdk.services.v2.stable.location_service import LocationService
36
38
  from benchling_sdk.services.v2.stable.mixture_service import MixtureService
37
39
  from benchling_sdk.services.v2.stable.molecule_service import MoleculeService
40
+ from benchling_sdk.services.v2.stable.monomer_service import MonomerService
38
41
  from benchling_sdk.services.v2.stable.nucleotide_alignments_service import NucleotideAlignmentsService
39
42
  from benchling_sdk.services.v2.stable.oligo_service import OligoService
40
43
  from benchling_sdk.services.v2.stable.organization_service import OrganizationService
@@ -179,6 +182,20 @@ class V2StableService(BaseService):
179
182
 
180
183
  return self._create_service(BoxService)
181
184
 
185
+ @cached_property
186
+ def codon_usage_tables(self) -> CodonUsageTableService:
187
+ """
188
+ Codon Usage Tables.
189
+
190
+ Benchling curates codon usage data for a variety of organisms to support operations such as Codon
191
+ Optimization and Back Translation.
192
+
193
+ See https://benchling.com/api/reference#/Codon%20Usage%20Tables
194
+ """
195
+ from .stable.codon_usage_table_service import CodonUsageTableService
196
+
197
+ return self._create_service(CodonUsageTableService)
198
+
182
199
  @cached_property
183
200
  def containers(self) -> ContainerService:
184
201
  """
@@ -323,6 +340,19 @@ class V2StableService(BaseService):
323
340
 
324
341
  return self._create_service(EntryService)
325
342
 
343
+ @cached_property
344
+ def enzymes(self) -> EnzymeService:
345
+ """
346
+ Enzymes.
347
+
348
+ Restriction enzymes are curated by Benchling for operations such as Digests and Codon Optimization.
349
+
350
+ See https://benchling.com/api/reference#/Enzymes
351
+ """
352
+ from .stable.enzyme_service import EnzymeService
353
+
354
+ return self._create_service(EnzymeService)
355
+
326
356
  @cached_property
327
357
  def events(self) -> EventService:
328
358
  """
@@ -444,6 +474,20 @@ class V2StableService(BaseService):
444
474
 
445
475
  return self._create_service(MixtureService)
446
476
 
477
+ @cached_property
478
+ def monomers(self) -> MonomerService:
479
+ """
480
+ Monomers.
481
+
482
+ Monomers are chemical building blocks with specified structures used to compose modified
483
+ nucleotides. Note that monomer write endpoints require tenant admin permissions.
484
+
485
+ See https://benchling.com/api/reference#/Monomers
486
+ """
487
+ from .stable.monomer_service import MonomerService
488
+
489
+ return self._create_service(MonomerService)
490
+
447
491
  @cached_property
448
492
  def molecules(self) -> MoleculeService:
449
493
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: benchling-sdk
3
- Version: 1.17.0a0
3
+ Version: 1.17.1
4
4
  Summary: SDK for interacting with the Benchling Platform.
5
5
  License: Apache-2.0
6
6
  Author: Benchling Support
@@ -15,9 +15,9 @@ Classifier: Programming Language :: Python :: 3.11
15
15
  Provides-Extra: cryptography
16
16
  Provides-Extra: python-jose
17
17
  Requires-Dist: PyYAML (>=6.0,<7.0)
18
- Requires-Dist: attrs (>=20.1.0,<24)
18
+ Requires-Dist: attrs (>=20.1.0)
19
19
  Requires-Dist: backoff (>=1.10.0,<3)
20
- Requires-Dist: benchling-api-client (==2.0.313)
20
+ Requires-Dist: benchling-api-client (==2.0.317)
21
21
  Requires-Dist: certifi (>=2022.12.7)
22
22
  Requires-Dist: cryptography (>=42.0.0) ; extra == "cryptography"
23
23
  Requires-Dist: dataclasses-json (>=0.5.2,<0.6.0)