benchling-sdk 1.17.0a0__py3-none-any.whl → 1.18.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 (27) hide show
  1. benchling_sdk/benchling.py +50 -0
  2. benchling_sdk/errors.py +2 -1
  3. benchling_sdk/models/__init__.py +159 -3
  4. benchling_sdk/models/webhooks/v0/__init__.py +27 -37
  5. benchling_sdk/services/v2/alpha/v2_alpha_assembly_service.py +62 -0
  6. benchling_sdk/services/v2/beta/v2_beta_analysis_service.py +46 -0
  7. benchling_sdk/services/v2/beta/v2_beta_app_definition_service.py +45 -0
  8. benchling_sdk/services/v2/beta/v2_beta_app_service.py +1 -1
  9. benchling_sdk/services/v2/beta/v2_beta_audit_service.py +41 -0
  10. benchling_sdk/services/v2/beta/v2_beta_entry_service.py +13 -8
  11. benchling_sdk/services/v2/stable/aa_sequence_service.py +63 -6
  12. benchling_sdk/services/v2/stable/codon_usage_table_service.py +73 -0
  13. benchling_sdk/services/v2/stable/dna_sequence_service.py +12 -0
  14. benchling_sdk/services/v2/stable/enzyme_service.py +72 -0
  15. benchling_sdk/services/v2/stable/instrument_query_service.py +28 -0
  16. benchling_sdk/services/v2/stable/monomer_service.py +144 -0
  17. benchling_sdk/services/v2/stable/organization_service.py +104 -2
  18. benchling_sdk/services/v2/stable/team_service.py +120 -2
  19. benchling_sdk/services/v2/v2_alpha_service.py +15 -0
  20. benchling_sdk/services/v2/v2_beta_service.py +43 -1
  21. benchling_sdk/services/v2/v2_stable_service.py +58 -0
  22. {benchling_sdk-1.17.0a0.dist-info → benchling_sdk-1.18.0.dist-info}/METADATA +3 -3
  23. {benchling_sdk-1.17.0a0.dist-info → benchling_sdk-1.18.0.dist-info}/RECORD +25 -19
  24. benchling_sdk/apps/config/helpers.py +0 -157
  25. benchling_sdk/apps/config/mock_config.py +0 -635
  26. {benchling_sdk-1.17.0a0.dist-info → benchling_sdk-1.18.0.dist-info}/LICENSE +0 -0
  27. {benchling_sdk-1.17.0a0.dist-info → benchling_sdk-1.18.0.dist-info}/WHEEL +0 -0
@@ -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,28 @@
1
+ from benchling_api_client.v2.stable.api.instrument_queries import get_instrument_query
2
+
3
+ from benchling_sdk.helpers.decorators import api_method
4
+ from benchling_sdk.helpers.response_helpers import model_from_detailed
5
+ from benchling_sdk.models import InstrumentQuery
6
+ from benchling_sdk.services.v2.base_service import BaseService
7
+
8
+
9
+ class InstrumentQueryService(BaseService):
10
+ """
11
+ Instrument Queries.
12
+
13
+ Instrument Queries are used to query the instrument service.
14
+
15
+ See https://benchling.com/api/reference#/Instrument%20Queries
16
+ """
17
+
18
+ @api_method
19
+ def get_by_id(self, instrument_query_id: str) -> InstrumentQuery:
20
+ """
21
+ Get an instrument query.
22
+
23
+ See https://benchling.com/api/reference#/Instrument%20Queries/getInstrumentQuery
24
+ """
25
+ response = get_instrument_query.sync_detailed(
26
+ client=self.client, instrument_query_id=instrument_query_id
27
+ )
28
+ return model_from_detailed(response)
@@ -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
+ )
@@ -10,6 +10,7 @@ from benchling_sdk.helpers.retry_helpers import RetryStrategy
10
10
 
11
11
  if TYPE_CHECKING:
12
12
  from benchling_sdk.services.v2.alpha.v2_alpha_app_service import V2AlphaAppService
13
+ from benchling_sdk.services.v2.alpha.v2_alpha_assembly_service import V2AlphaAssemblyService
13
14
 
14
15
  from benchling_sdk.services.v2.base_service import BaseService
15
16
 
@@ -48,6 +49,20 @@ class V2AlphaService(BaseService):
48
49
 
49
50
  return self._create_service(V2AlphaAppService)
50
51
 
52
+ @cached_property
53
+ def assemblies(self) -> V2AlphaAssemblyService:
54
+ """
55
+ V2-Alpha Assemblies.
56
+
57
+ In Benchling, Assemblies are records of a process in which many fragment sequences are
58
+ assembled in silico to create new construct sequences.
59
+
60
+ https://benchling.com/api/v2-alpha/reference#/Assemblies
61
+ """
62
+ from .alpha.v2_alpha_assembly_service import V2AlphaAssemblyService
63
+
64
+ return self._create_service(V2AlphaAssemblyService)
65
+
51
66
  def _create_service(self, cls):
52
67
  """Instantiate a service using the alpha client."""
53
68
  return cls(self._alpha_client, self._retry_strategy)
@@ -11,7 +11,10 @@ from benchling_sdk.services.v2.base_service import BaseService
11
11
  from benchling_sdk.services.v2.beta.v2_beta_data_frame_service import V2BetaDataFrameService
12
12
 
13
13
  if TYPE_CHECKING:
14
+ from benchling_sdk.services.v2.beta.v2_beta_analysis_service import V2BetaAnalysisService
15
+ from benchling_sdk.services.v2.beta.v2_beta_app_definition_service import V2BetaAppDefinitionService
14
16
  from benchling_sdk.services.v2.beta.v2_beta_app_service import V2BetaAppService
17
+ from benchling_sdk.services.v2.beta.v2_beta_audit_service import V2BetaAuditService
15
18
  from benchling_sdk.services.v2.beta.v2_beta_collaboration_service import V2BetaCollaborationService
16
19
  from benchling_sdk.services.v2.beta.v2_beta_entry_service import V2BetaEntryService
17
20
  from benchling_sdk.services.v2.beta.v2_beta_folder_service import V2BetaFolderService
@@ -40,6 +43,19 @@ class V2BetaService(BaseService):
40
43
  super().__init__(client, retry_strategy)
41
44
  self._beta_client = v2_beta_client(self.client)
42
45
 
46
+ @cached_property
47
+ def analyses(self) -> V2BetaAnalysisService:
48
+ """
49
+ V2-Beta Analyses.
50
+
51
+ Analyses allow experimental data to be viewed, analyzed, and visualized.
52
+
53
+ https://benchling.com/api/v2-beta/reference#/Analyses
54
+ """
55
+ from .beta.v2_beta_analysis_service import V2BetaAnalysisService
56
+
57
+ return self._create_service(V2BetaAnalysisService)
58
+
43
59
  @cached_property
44
60
  def apps(self) -> V2BetaAppService:
45
61
  """
@@ -47,12 +63,38 @@ class V2BetaService(BaseService):
47
63
 
48
64
  Create and manage Apps on your tenant.
49
65
 
50
- https://benchling.com/api/v2-beta/reference?stability=not-available#/Apps
66
+ https://benchling.com/api/v2-beta/reference#/Apps
51
67
  """
52
68
  from .beta.v2_beta_app_service import V2BetaAppService
53
69
 
54
70
  return self._create_service(V2BetaAppService)
55
71
 
72
+ @cached_property
73
+ def app_definitions(self) -> V2BetaAppDefinitionService:
74
+ """
75
+ V2-Beta App Definitions.
76
+
77
+ Create and manage Benchling app definitions on your tenant.
78
+
79
+ https://benchling.com/api/v2-beta/reference#/App%20Definitions
80
+ """
81
+ from .beta.v2_beta_app_definition_service import V2BetaAppDefinitionService
82
+
83
+ return self._create_service(V2BetaAppDefinitionService)
84
+
85
+ @cached_property
86
+ def audit(self) -> V2BetaAuditService:
87
+ """
88
+ V2-Beta Audit.
89
+
90
+ Export audit log data for Benchling objects.
91
+
92
+ https://benchling.com/api/v2-beta/reference#/Audit
93
+ """
94
+ from .beta.v2_beta_audit_service import V2BetaAuditService
95
+
96
+ return self._create_service(V2BetaAuditService)
97
+
56
98
  @cached_property
57
99
  def collaborations(self) -> V2BetaCollaborationService:
58
100
  """