benchling-sdk 1.21.1__py3-none-any.whl → 1.22.0a0__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 (49) hide show
  1. benchling_sdk/apps/canvas/types.py +8 -0
  2. benchling_sdk/apps/config/framework.py +2 -2
  3. benchling_sdk/apps/config/helpers.py +6 -5
  4. benchling_sdk/apps/config/mock_config.py +4 -4
  5. benchling_sdk/apps/helpers/webhook_helpers.py +2 -2
  6. benchling_sdk/apps/status/framework.py +5 -5
  7. benchling_sdk/apps/status/helpers.py +2 -0
  8. benchling_sdk/auth/client_credentials_oauth2.py +5 -4
  9. benchling_sdk/benchling.py +90 -14
  10. benchling_sdk/errors.py +4 -3
  11. benchling_sdk/helpers/retry_helpers.py +1 -1
  12. benchling_sdk/helpers/serialization_helpers.py +6 -3
  13. benchling_sdk/helpers/task_helpers.py +12 -9
  14. benchling_sdk/models/__init__.py +1325 -329
  15. benchling_sdk/models/webhooks/v0/__init__.py +12 -4
  16. benchling_sdk/services/v2/base_service.py +5 -4
  17. benchling_sdk/services/v2/beta/v2_beta_data_frame_service.py +16 -8
  18. benchling_sdk/services/v2/stable/aa_sequence_service.py +4 -0
  19. benchling_sdk/services/v2/{beta/v2_beta_audit_service.py → stable/audit_service.py} +6 -6
  20. benchling_sdk/services/v2/stable/blob_service.py +6 -3
  21. benchling_sdk/services/v2/stable/box_service.py +4 -0
  22. benchling_sdk/services/v2/stable/connect_service.py +79 -0
  23. benchling_sdk/services/v2/stable/container_service.py +4 -0
  24. benchling_sdk/services/v2/stable/custom_entity_service.py +4 -0
  25. benchling_sdk/services/v2/stable/data_frame_service.py +323 -0
  26. benchling_sdk/services/v2/stable/dataset_service.py +132 -0
  27. benchling_sdk/services/v2/stable/dna_oligo_service.py +4 -0
  28. benchling_sdk/services/v2/stable/dna_sequence_service.py +4 -0
  29. benchling_sdk/services/v2/stable/file_service.py +131 -0
  30. benchling_sdk/services/v2/stable/{request_service.py → legacy_request_service.py} +25 -25
  31. benchling_sdk/services/v2/stable/location_service.py +4 -0
  32. benchling_sdk/services/v2/stable/mixture_service.py +4 -0
  33. benchling_sdk/services/v2/stable/molecule_service.py +4 -0
  34. benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +4 -0
  35. benchling_sdk/services/v2/stable/organization_service.py +10 -5
  36. benchling_sdk/services/v2/stable/plate_service.py +4 -0
  37. benchling_sdk/services/v2/stable/rna_oligo_service.py +4 -0
  38. benchling_sdk/services/v2/stable/rna_sequence_service.py +4 -0
  39. benchling_sdk/services/v2/stable/task_service.py +1 -7
  40. benchling_sdk/services/v2/stable/team_service.py +14 -7
  41. benchling_sdk/services/v2/stable/test_order_service.py +145 -0
  42. benchling_sdk/services/v2/v2_alpha_service.py +2 -2
  43. benchling_sdk/services/v2/v2_beta_service.py +2 -16
  44. benchling_sdk/services/v2/v2_stable_service.py +104 -17
  45. benchling_sdk/services/v2_service.py +1 -1
  46. {benchling_sdk-1.21.1.dist-info → benchling_sdk-1.22.0a0.dist-info}/METADATA +3 -2
  47. {benchling_sdk-1.21.1.dist-info → benchling_sdk-1.22.0a0.dist-info}/RECORD +49 -44
  48. {benchling_sdk-1.21.1.dist-info → benchling_sdk-1.22.0a0.dist-info}/LICENSE +0 -0
  49. {benchling_sdk-1.21.1.dist-info → benchling_sdk-1.22.0a0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
1
1
  from typing import Iterable, List, Optional
2
2
 
3
- from benchling_api_client.v2.stable.api.requests import (
3
+ from benchling_api_client.v2.stable.api.legacy_requests import (
4
4
  bulk_create_request_tasks,
5
5
  bulk_get_requests,
6
6
  bulk_update_request_tasks,
@@ -40,21 +40,21 @@ from benchling_sdk.models import (
40
40
  from benchling_sdk.services.v2.base_service import BaseService
41
41
 
42
42
 
43
- class RequestService(BaseService):
43
+ class LegacyRequestService(BaseService):
44
44
  """
45
- Requests.
45
+ Legacy Requests.
46
46
 
47
- Requests allow scientists and teams to collaborate around experimental assays and workflows.
47
+ Legacy Requests allow scientists and teams to collaborate around experimental assays and workflows.
48
48
 
49
- See https://benchling.com/api/reference#/Requests
49
+ See https://benchling.com/api/reference#/Legacy%20Requests
50
50
  """
51
51
 
52
52
  @api_method
53
53
  def get_by_id(self, request_id: str, returning: Optional[Iterable[str]] = None) -> Request:
54
54
  """
55
- Get a Request by ID.
55
+ Get a Legacy Request by ID.
56
56
 
57
- See https://benchling.com/api/reference#/Requests/getRequest
57
+ See https://benchling.com/api/reference#/Legacy%20Requests/getRequest
58
58
  """
59
59
  returning_string = optional_array_query_param(returning)
60
60
  response = get_request.sync_detailed(
@@ -98,7 +98,7 @@ class RequestService(BaseService):
98
98
  """
99
99
  List Requests.
100
100
 
101
- See https://benchling.com/api/reference#/Requests/listRequests
101
+ See https://benchling.com/api/reference#/Legacy%20Requests/listRequests
102
102
  """
103
103
 
104
104
  def api_call(next_token: NextToken) -> Response[RequestsPaginatedList]:
@@ -128,7 +128,7 @@ class RequestService(BaseService):
128
128
  """
129
129
  Bulk get Requests.
130
130
 
131
- See https://benchling.com/api/reference#/Requests/bulkGetRequests
131
+ See https://benchling.com/api/reference#/Legacy%20Requests/bulkGetRequests
132
132
  """
133
133
  request_id_string = optional_array_query_param(request_ids)
134
134
  display_id_string = optional_array_query_param(display_ids)
@@ -145,9 +145,9 @@ class RequestService(BaseService):
145
145
  @api_method
146
146
  def request_response(self, request_id: str) -> RequestResponse:
147
147
  """
148
- Get a Request's response.
148
+ Get a Legacy Request's response.
149
149
 
150
- See https://benchling.com/api/reference#/Requests/getRequestResponse
150
+ See https://benchling.com/api/reference#/Legacy%20Requests/getRequestResponse
151
151
  """
152
152
  response = get_request_response.sync_detailed(client=self.client, request_id=request_id)
153
153
  return model_from_detailed(response)
@@ -155,9 +155,9 @@ class RequestService(BaseService):
155
155
  @api_method
156
156
  def create(self, request: RequestCreate) -> Request:
157
157
  """
158
- Create a Request.
158
+ Create a Legacy Request.
159
159
 
160
- See https://benchling.com/api/reference#/Requests/createRequest
160
+ See https://benchling.com/api/reference#/Legacy%20Requests/createRequest
161
161
  """
162
162
  response = create_request.sync_detailed(client=self.client, json_body=request)
163
163
  return model_from_detailed(response)
@@ -165,9 +165,9 @@ class RequestService(BaseService):
165
165
  @api_method
166
166
  def update(self, request_id: str, request: RequestUpdate) -> Request:
167
167
  """
168
- Update a Request.
168
+ Update a Legacy Request.
169
169
 
170
- See https://benchling.com/api/reference#/Requests/patchRequest
170
+ See https://benchling.com/api/reference#/Legacy%20Requests/patchRequest
171
171
  """
172
172
  response = patch_request.sync_detailed(client=self.client, request_id=request_id, json_body=request)
173
173
  return model_from_detailed(response)
@@ -175,9 +175,9 @@ class RequestService(BaseService):
175
175
  @api_method
176
176
  def execute_sample_groups(self, request_id: str, sample_groups: SampleGroupsStatusUpdate) -> None:
177
177
  """
178
- Update the status of sample groups in a Request.
178
+ Update the status of sample groups in a Legacy Request.
179
179
 
180
- See https://benchling.com/api/reference#/Requests/executeRequestsSampleGroups
180
+ See https://benchling.com/api/reference#/Legacy%20Requests/executeRequestsSampleGroups
181
181
  """
182
182
  response = execute_requests_sample_groups.sync_detailed(
183
183
  client=self.client, request_id=request_id, json_body=sample_groups
@@ -187,9 +187,9 @@ class RequestService(BaseService):
187
187
  @api_method
188
188
  def request_fulfillment(self, request_fulfillment_id: str) -> RequestFulfillment:
189
189
  """
190
- Get a Request's fulfillment.
190
+ Get a Legacy Request's fulfillment.
191
191
 
192
- See https://benchling.com/api/reference#/Requests/getRequestFulfillment
192
+ See https://benchling.com/api/reference#/Legacy%20Requests/getRequestFulfillment
193
193
  """
194
194
  response = get_request_fulfillment.sync_detailed(
195
195
  client=self.client, request_fulfillment_id=request_fulfillment_id
@@ -218,9 +218,9 @@ class RequestService(BaseService):
218
218
  self, entry_id: str, modified_at: Optional[str] = None, page_size: Optional[int] = None
219
219
  ) -> PageIterator[RequestFulfillment]:
220
220
  """
221
- List Request Fulfillments.
221
+ List Legacy Request Fulfillments.
222
222
 
223
- See https://benchling.com/api/reference#/Requests/listRequestFulfillments
223
+ See https://benchling.com/api/reference#/Legacy%20Requests/listRequestFulfillments
224
224
  """
225
225
 
226
226
  def api_call(next_token: NextToken) -> Response[RequestFulfillmentsPaginatedList]:
@@ -241,9 +241,9 @@ class RequestService(BaseService):
241
241
  self, request_id: str, tasks: Iterable[RequestTasksBulkCreate]
242
242
  ) -> RequestTasksBulkCreateResponse:
243
243
  """
244
- Create tasks for a Request.
244
+ Create tasks for a Legacy Request.
245
245
 
246
- See https://benchling.com/api/reference#/Requests/bulkCreateRequestTasks
246
+ See https://benchling.com/api/reference#/Legacy%20Requests/bulkCreateRequestTasks
247
247
  """
248
248
  create = RequestTasksBulkCreateRequest(tasks=list(tasks))
249
249
  response = bulk_create_request_tasks.sync_detailed(
@@ -256,9 +256,9 @@ class RequestService(BaseService):
256
256
  self, request_id: str, tasks: Iterable[RequestTaskBase]
257
257
  ) -> RequestTasksBulkUpdateResponse:
258
258
  """
259
- Update tasks for a Request.
259
+ Update tasks for a Legacy Request.
260
260
 
261
- See https://benchling.com/api/reference#/Requests/bulkUpdateRequestTasks
261
+ See https://benchling.com/api/reference#/Legacy%20Requests/bulkUpdateRequestTasks
262
262
  """
263
263
  update = RequestTasksBulkUpdateRequest(tasks=list(tasks))
264
264
  response = bulk_update_request_tasks.sync_detailed(
@@ -63,6 +63,7 @@ class LocationService(BaseService):
63
63
  sort: Optional[ListLocationsSort] = None,
64
64
  schema_id: Optional[str] = None,
65
65
  modified_at: Optional[str] = None,
66
+ created_at: Optional[str] = None,
66
67
  name: Optional[str] = None,
67
68
  name_includes: Optional[str] = None,
68
69
  ancestor_storage_id: Optional[str] = None,
@@ -79,6 +80,7 @@ class LocationService(BaseService):
79
80
  sort=none_as_unset(sort),
80
81
  schema_id=none_as_unset(schema_id),
81
82
  modified_at=none_as_unset(modified_at),
83
+ created_at=none_as_unset(created_at),
82
84
  name=none_as_unset(name),
83
85
  name_includes=none_as_unset(name_includes),
84
86
  ancestor_storage_id=none_as_unset(ancestor_storage_id),
@@ -101,6 +103,7 @@ class LocationService(BaseService):
101
103
  sort: Optional[Union[str, ListLocationsSort]] = None,
102
104
  schema_id: Optional[str] = None,
103
105
  modified_at: Optional[str] = None,
106
+ created_at: Optional[str] = None,
104
107
  name: Optional[str] = None,
105
108
  name_includes: Optional[str] = None,
106
109
  ancestor_storage_id: Optional[str] = None,
@@ -124,6 +127,7 @@ class LocationService(BaseService):
124
127
  sort=_translate_to_string_enum(ListLocationsSort, sort),
125
128
  schema_id=schema_id,
126
129
  modified_at=modified_at,
130
+ created_at=created_at,
127
131
  name=name,
128
132
  name_includes=name_includes,
129
133
  ancestor_storage_id=ancestor_storage_id,
@@ -65,6 +65,7 @@ class MixtureService(BaseService):
65
65
  def _mixtures_page(
66
66
  self,
67
67
  modified_at: Optional[str] = None,
68
+ created_at: Optional[str] = None,
68
69
  name: Optional[str] = None,
69
70
  name_includes: Optional[str] = None,
70
71
  folder_id: Optional[str] = None,
@@ -89,6 +90,7 @@ class MixtureService(BaseService):
89
90
  response = list_mixtures.sync_detailed(
90
91
  client=self.client,
91
92
  modified_at=none_as_unset(modified_at),
93
+ created_at=none_as_unset(created_at),
92
94
  name=none_as_unset(name),
93
95
  name_includes=none_as_unset(name_includes),
94
96
  folder_id=none_as_unset(folder_id),
@@ -120,6 +122,7 @@ class MixtureService(BaseService):
120
122
  def list(
121
123
  self,
122
124
  modified_at: Optional[str] = None,
125
+ created_at: Optional[str] = None,
123
126
  name: Optional[str] = None,
124
127
  name_includes: Optional[str] = None,
125
128
  folder_id: Optional[str] = None,
@@ -151,6 +154,7 @@ class MixtureService(BaseService):
151
154
  def api_call(next_token: NextToken) -> Response[MixturesPaginatedList]:
152
155
  return self._mixtures_page(
153
156
  modified_at=modified_at,
157
+ created_at=created_at,
154
158
  name=name,
155
159
  name_includes=name_includes,
156
160
  folder_id=folder_id,
@@ -69,6 +69,7 @@ class MoleculeService(BaseService):
69
69
  def _molecules_page(
70
70
  self,
71
71
  modified_at: Optional[str] = None,
72
+ created_at: Optional[str] = None,
72
73
  name: Optional[str] = None,
73
74
  name_includes: Optional[str] = None,
74
75
  folder_id: Optional[str] = None,
@@ -92,6 +93,7 @@ class MoleculeService(BaseService):
92
93
  response = list_molecules.sync_detailed(
93
94
  client=self.client,
94
95
  modified_at=none_as_unset(modified_at),
96
+ created_at=none_as_unset(created_at),
95
97
  name=none_as_unset(name),
96
98
  name_includes=none_as_unset(name_includes),
97
99
  folder_id=none_as_unset(folder_id),
@@ -118,6 +120,7 @@ class MoleculeService(BaseService):
118
120
  def list(
119
121
  self,
120
122
  modified_at: Optional[str] = None,
123
+ created_at: Optional[str] = None,
121
124
  name: Optional[str] = None,
122
125
  name_includes: Optional[str] = None,
123
126
  folder_id: Optional[str] = None,
@@ -148,6 +151,7 @@ class MoleculeService(BaseService):
148
151
  def api_call(next_token: NextToken) -> Response[MoleculesPaginatedList]:
149
152
  return self._molecules_page(
150
153
  modified_at=modified_at,
154
+ created_at=created_at,
151
155
  name=name,
152
156
  name_includes=name_includes,
153
157
  folder_id=folder_id,
@@ -50,6 +50,7 @@ class NucleotideAlignmentsService(BaseService):
50
50
  def _nucleotide_alignments_page(
51
51
  self,
52
52
  modified_at: Optional[str] = None,
53
+ created_at: Optional[str] = None,
53
54
  name: Optional[str] = None,
54
55
  name_includes: Optional[str] = None,
55
56
  ids: Optional[List[str]] = None,
@@ -63,6 +64,7 @@ class NucleotideAlignmentsService(BaseService):
63
64
  response = list_nucleotide_alignments.sync_detailed(
64
65
  client=self.client,
65
66
  modified_at=none_as_unset(modified_at),
67
+ created_at=none_as_unset(created_at),
66
68
  name=none_as_unset(name),
67
69
  name_includes=none_as_unset(name_includes),
68
70
  ids=none_as_unset(optional_array_query_param(ids)),
@@ -79,6 +81,7 @@ class NucleotideAlignmentsService(BaseService):
79
81
  def list(
80
82
  self,
81
83
  modified_at: Optional[str] = None,
84
+ created_at: Optional[str] = None,
82
85
  name: Optional[str] = None,
83
86
  name_includes: Optional[str] = None,
84
87
  ids: Optional[List[str]] = None,
@@ -97,6 +100,7 @@ class NucleotideAlignmentsService(BaseService):
97
100
  def api_call(next_token: NextToken) -> Response[NucleotideAlignmentsPaginatedList]:
98
101
  return self._nucleotide_alignments_page(
99
102
  modified_at=modified_at,
103
+ created_at=created_at,
100
104
  name=name,
101
105
  name_includes=name_includes,
102
106
  ids=ids,
@@ -157,7 +157,8 @@ class OrganizationService(BaseService):
157
157
  role: Optional[str] = None,
158
158
  page_size: Optional[int] = None,
159
159
  ) -> PageIterator[MembershipsPaginatedList]:
160
- """Return all organization memberships in the given organization.
160
+ """
161
+ Return all organization memberships in the given organization.
161
162
 
162
163
  See https://benchling.com/api/reference#/Organizations/listOrganizationMemberships
163
164
  """
@@ -169,7 +170,8 @@ class OrganizationService(BaseService):
169
170
 
170
171
  @api_method
171
172
  def get_membership(self, organization_id: str, user_id: str) -> Membership:
172
- """Get organization membership.
173
+ """
174
+ Get organization membership.
173
175
 
174
176
  See https://benchling.com/api/reference#/Organizations/getOrganizationMembership
175
177
  """
@@ -180,7 +182,8 @@ class OrganizationService(BaseService):
180
182
 
181
183
  @api_method
182
184
  def create_membership(self, organization_id: str, membership: MembershipCreate) -> Membership:
183
- """Create organization membership.
185
+ """
186
+ Create organization membership.
184
187
 
185
188
  See https://benchling.com/api/reference#/Organizations/createOrganizationMembership
186
189
  """
@@ -195,7 +198,8 @@ class OrganizationService(BaseService):
195
198
  def update_membership(
196
199
  self, organization_id: str, user_id: str, membership: MembershipUpdate
197
200
  ) -> Membership:
198
- """Update organization membership by user ID and organization ID.
201
+ """
202
+ Update organization membership by user ID and organization ID.
199
203
 
200
204
  See https://benchling.com/api/reference#/Organizations/updateOrganizationMembership
201
205
  """
@@ -209,7 +213,8 @@ class OrganizationService(BaseService):
209
213
 
210
214
  @api_method
211
215
  def delete_membership(self, organization_id: str, user_id: str) -> None:
212
- """Delete a single team membership.
216
+ """
217
+ Delete a single team membership.
213
218
 
214
219
  See https://benchling.com/api/reference#/Organizations/deleteOrganizationMembership
215
220
  """
@@ -78,6 +78,7 @@ class PlateService(BaseService):
78
78
  sort: Optional[ListPlatesSort] = None,
79
79
  schema_id: Optional[str] = None,
80
80
  modified_at: Optional[str] = None,
81
+ created_at: Optional[str] = None,
81
82
  name: Optional[str] = None,
82
83
  name_includes: Optional[str] = None,
83
84
  ancestor_storage_id: Optional[str] = None,
@@ -109,6 +110,7 @@ class PlateService(BaseService):
109
110
  sort=none_as_unset(sort),
110
111
  schema_id=none_as_unset(schema_id),
111
112
  modified_at=none_as_unset(modified_at),
113
+ created_at=none_as_unset(created_at),
112
114
  name=none_as_unset(name),
113
115
  name_includes=none_as_unset(name_includes),
114
116
  ancestor_storage_id=none_as_unset(ancestor_storage_id),
@@ -144,6 +146,7 @@ class PlateService(BaseService):
144
146
  sort: Optional[Union[str, ListPlatesSort]] = None,
145
147
  schema_id: Optional[str] = None,
146
148
  modified_at: Optional[str] = None,
149
+ created_at: Optional[str] = None,
147
150
  name: Optional[str] = None,
148
151
  name_includes: Optional[str] = None,
149
152
  ancestor_storage_id: Optional[str] = None,
@@ -188,6 +191,7 @@ class PlateService(BaseService):
188
191
  sort=_translate_to_string_enum(ListPlatesSort, sort),
189
192
  schema_id=schema_id,
190
193
  modified_at=modified_at,
194
+ created_at=created_at,
191
195
  name=name,
192
196
  name_includes=name_includes,
193
197
  ancestor_storage_id=ancestor_storage_id,
@@ -80,6 +80,7 @@ class RnaOligoService(BaseService):
80
80
  def _rna_oligos_page(
81
81
  self,
82
82
  modified_at: Optional[str] = None,
83
+ created_at: Optional[str] = None,
83
84
  name: Optional[str] = None,
84
85
  bases: Optional[str] = None,
85
86
  folder_id: Optional[str] = None,
@@ -106,6 +107,7 @@ class RnaOligoService(BaseService):
106
107
  response = list_rna_oligos.sync_detailed(
107
108
  client=self.client,
108
109
  modified_at=none_as_unset(modified_at),
110
+ created_at=none_as_unset(created_at),
109
111
  name=none_as_unset(name),
110
112
  bases=none_as_unset(bases),
111
113
  folder_id=none_as_unset(folder_id),
@@ -135,6 +137,7 @@ class RnaOligoService(BaseService):
135
137
  def list(
136
138
  self,
137
139
  modified_at: Optional[str] = None,
140
+ created_at: Optional[str] = None,
138
141
  name: Optional[str] = None,
139
142
  bases: Optional[str] = None,
140
143
  folder_id: Optional[str] = None,
@@ -166,6 +169,7 @@ class RnaOligoService(BaseService):
166
169
  def api_call(next_token: NextToken) -> Response[RnaOligosPaginatedList]:
167
170
  return self._rna_oligos_page(
168
171
  modified_at=modified_at,
172
+ created_at=created_at,
169
173
  name=name,
170
174
  bases=bases,
171
175
  folder_id=folder_id,
@@ -86,6 +86,7 @@ class RnaSequenceService(BaseService):
86
86
  def _rna_sequences_page(
87
87
  self,
88
88
  modified_at: Optional[str] = None,
89
+ created_at: Optional[str] = None,
89
90
  name: Optional[str] = None,
90
91
  bases: Optional[str] = None,
91
92
  folder_id: Optional[str] = None,
@@ -112,6 +113,7 @@ class RnaSequenceService(BaseService):
112
113
  response = list_rna_sequences.sync_detailed(
113
114
  client=self.client,
114
115
  modified_at=none_as_unset(modified_at),
116
+ created_at=none_as_unset(created_at),
115
117
  name=none_as_unset(name),
116
118
  bases=none_as_unset(bases),
117
119
  folder_id=none_as_unset(folder_id),
@@ -141,6 +143,7 @@ class RnaSequenceService(BaseService):
141
143
  def list(
142
144
  self,
143
145
  modified_at: Optional[str] = None,
146
+ created_at: Optional[str] = None,
144
147
  name: Optional[str] = None,
145
148
  bases: Optional[str] = None,
146
149
  folder_id: Optional[str] = None,
@@ -174,6 +177,7 @@ class RnaSequenceService(BaseService):
174
177
  def api_call(next_token: NextToken) -> Response[RnaSequencesPaginatedList]:
175
178
  return self._rna_sequences_page(
176
179
  modified_at=modified_at,
180
+ created_at=created_at,
177
181
  name=name,
178
182
  bases=bases,
179
183
  folder_id=folder_id,
@@ -103,13 +103,7 @@ def _deserialize_task_from_instance(task_instance) -> AsyncTask:
103
103
  return AsyncTask.from_dict(serialized)
104
104
  except (NotPresentErrorAlpha, NotPresentErrorBeta, NotPresentError):
105
105
  pass
106
+
106
107
  serialized = task_instance.to_dict()
107
- # AsyncErrors data is always in additional_properties,
108
- # It has no modeled properties of its own. They don't copy over properly so manually move them
109
- try:
110
- if hasattr(task_instance, "errors") and task_instance.errors is not None:
111
- serialized["errors"] = task_instance.errors.additional_properties
112
- except (NotPresentErrorAlpha, NotPresentErrorBeta, NotPresentError):
113
- pass
114
108
  serialized["response"] = UNSET
115
109
  return AsyncTask.from_dict(serialized)
@@ -139,7 +139,8 @@ class TeamService(BaseService):
139
139
 
140
140
  @api_method
141
141
  def create(self, team: TeamCreate) -> Team:
142
- """Create team.
142
+ """
143
+ Create team.
143
144
 
144
145
  See https://benchling.com/api/reference#/Teams/createTeam
145
146
  """
@@ -148,7 +149,8 @@ class TeamService(BaseService):
148
149
 
149
150
  @api_method
150
151
  def update(self, team_id: str, team: TeamUpdate) -> Team:
151
- """Update team.
152
+ """
153
+ Update team.
152
154
 
153
155
  See https://benchling.com/api/reference#/Teams/updateTeam
154
156
  """
@@ -179,7 +181,8 @@ class TeamService(BaseService):
179
181
  role: Optional[str] = None,
180
182
  page_size: Optional[int] = None,
181
183
  ) -> PageIterator[MembershipsPaginatedList]:
182
- """Return all team memberships in the given team.
184
+ """
185
+ Return all team memberships in the given team.
183
186
 
184
187
  See https://benchling.com/api/reference#/Teams/listTeamMemberships
185
188
  """
@@ -191,7 +194,8 @@ class TeamService(BaseService):
191
194
 
192
195
  @api_method
193
196
  def get_membership(self, team_id: str, user_id: str) -> Membership:
194
- """Get team membership.
197
+ """
198
+ Get team membership.
195
199
 
196
200
  See https://benchling.com/api/reference#/Teams/getTeamMembership
197
201
  """
@@ -200,7 +204,8 @@ class TeamService(BaseService):
200
204
 
201
205
  @api_method
202
206
  def create_membership(self, team_id: str, membership: MembershipCreate) -> Membership:
203
- """Create team membership for the given user, role, and team.
207
+ """
208
+ Create team membership for the given user, role, and team.
204
209
 
205
210
  See https://benchling.com/api/reference#/Teams/createTeamMembership
206
211
  """
@@ -213,7 +218,8 @@ class TeamService(BaseService):
213
218
 
214
219
  @api_method
215
220
  def update_membership(self, team_id: str, user_id: str, membership: MembershipUpdate) -> Membership:
216
- """Update a single team membership.
221
+ """
222
+ Update a single team membership.
217
223
 
218
224
  See https://benchling.com/api/reference#/Teams/updateTeamMembership
219
225
  """
@@ -227,7 +233,8 @@ class TeamService(BaseService):
227
233
 
228
234
  @api_method
229
235
  def delete_membership(self, team_id: str, user_id: str) -> None:
230
- """Delete a single team membership.
236
+ """
237
+ Delete a single team membership.
231
238
 
232
239
  See https://benchling.com/api/reference#/Teams/deleteTeamMembership
233
240
  """
@@ -0,0 +1,145 @@
1
+ from typing import Iterable, List, Optional
2
+
3
+ from benchling_api_client.v2.stable.api.test_orders import (
4
+ bulk_update_test_orders,
5
+ list_test_orders,
6
+ update_test_order,
7
+ )
8
+ from benchling_api_client.v2.stable.models.async_task_link import AsyncTaskLink
9
+ from benchling_api_client.v2.stable.models.list_test_orders_sort import ListTestOrdersSort
10
+ from benchling_api_client.v2.stable.models.test_order import TestOrder
11
+ from benchling_api_client.v2.stable.models.test_order_bulk_update import TestOrderBulkUpdate
12
+ from benchling_api_client.v2.stable.models.test_order_status import TestOrderStatus
13
+ from benchling_api_client.v2.stable.models.test_order_update import TestOrderUpdate
14
+ from benchling_api_client.v2.stable.models.test_orders_bulk_update_request import TestOrdersBulkUpdateRequest
15
+ from benchling_api_client.v2.stable.models.test_orders_paginated_list import TestOrdersPaginatedList
16
+ from benchling_api_client.v2.types import Response
17
+
18
+ from benchling_sdk.errors import raise_for_status
19
+ from benchling_sdk.helpers.decorators import api_method
20
+ from benchling_sdk.helpers.pagination_helpers import NextToken, PageIterator
21
+ from benchling_sdk.helpers.response_helpers import model_from_detailed
22
+ from benchling_sdk.helpers.serialization_helpers import none_as_unset
23
+ from benchling_sdk.services.v2.base_service import BaseService
24
+
25
+
26
+ class TestOrderService(BaseService):
27
+ """
28
+ Test Orders.
29
+
30
+ Test orders enable users to order tests for specific sample/container combinations that will be fulfilled in assays.
31
+
32
+ See https://benchling.com/api/reference?availability=la#/Test%20Orders/
33
+ """
34
+
35
+ @api_method
36
+ def bulk_update(self, test_orders: Iterable[TestOrderBulkUpdate]) -> AsyncTaskLink:
37
+ """
38
+ Bulk update Test Orders.
39
+
40
+ See https://benchling.com/api/reference?availability=la#/Test%20Orders/bulkUpdateTestOrders
41
+ """
42
+ body = TestOrdersBulkUpdateRequest(list(test_orders))
43
+ response = bulk_update_test_orders.sync_detailed(client=self.client, json_body=body)
44
+ return model_from_detailed(response)
45
+
46
+ @api_method
47
+ def _test_orders_page(
48
+ self,
49
+ page_size: Optional[int] = 50,
50
+ next_token: Optional[str] = None,
51
+ sort: Optional[ListTestOrdersSort] = ListTestOrdersSort.MODIFIEDATDESC,
52
+ created_atlt: Optional[str] = None,
53
+ created_atgt: Optional[str] = None,
54
+ created_atlte: Optional[str] = None,
55
+ created_atgte: Optional[str] = None,
56
+ modified_atlt: Optional[str] = None,
57
+ modified_atgt: Optional[str] = None,
58
+ modified_atlte: Optional[str] = None,
59
+ modified_atgte: Optional[str] = None,
60
+ ids: Optional[str] = None,
61
+ container_idsany_of: Optional[str] = None,
62
+ sample_idsany_of: Optional[str] = None,
63
+ status: Optional[TestOrderStatus] = None,
64
+ ) -> Response[TestOrdersPaginatedList]:
65
+ response = list_test_orders.sync_detailed(
66
+ client=self.client,
67
+ page_size=none_as_unset(page_size),
68
+ next_token=none_as_unset(next_token),
69
+ sort=none_as_unset(sort),
70
+ created_atlt=none_as_unset(created_atlt),
71
+ created_atgt=none_as_unset(created_atgt),
72
+ created_atlte=none_as_unset(created_atlte),
73
+ created_atgte=none_as_unset(created_atgte),
74
+ modified_atlt=none_as_unset(modified_atlt),
75
+ modified_atgt=none_as_unset(modified_atgt),
76
+ modified_atlte=none_as_unset(modified_atlte),
77
+ modified_atgte=none_as_unset(modified_atgte),
78
+ ids=none_as_unset(ids),
79
+ container_idsany_of=none_as_unset(container_idsany_of),
80
+ sample_idsany_of=none_as_unset(sample_idsany_of),
81
+ status=none_as_unset(status),
82
+ )
83
+ raise_for_status(response)
84
+ return response # type: ignore
85
+
86
+ def list(
87
+ self,
88
+ *,
89
+ page_size: Optional[int] = 50,
90
+ next_token: Optional[str] = None,
91
+ sort: Optional[ListTestOrdersSort] = ListTestOrdersSort.MODIFIEDATDESC,
92
+ created_atlt: Optional[str] = None,
93
+ created_atgt: Optional[str] = None,
94
+ created_atlte: Optional[str] = None,
95
+ created_atgte: Optional[str] = None,
96
+ modified_atlt: Optional[str] = None,
97
+ modified_atgt: Optional[str] = None,
98
+ modified_atlte: Optional[str] = None,
99
+ modified_atgte: Optional[str] = None,
100
+ ids: Optional[str] = None,
101
+ container_idsany_of: Optional[str] = None,
102
+ sample_idsany_of: Optional[str] = None,
103
+ status: Optional[TestOrderStatus] = None,
104
+ ) -> PageIterator[TestOrder]:
105
+ """
106
+ List Test Orders.
107
+
108
+ See https://benchling.com/api/reference?availability=la#/Test%20Orders/listTestOrders
109
+ """
110
+
111
+ def api_call(next_token: NextToken) -> Response[TestOrdersPaginatedList]:
112
+ return self._test_orders_page(
113
+ page_size=page_size,
114
+ next_token=next_token,
115
+ sort=sort,
116
+ created_atlt=created_atlt,
117
+ created_atgt=created_atgt,
118
+ created_atlte=created_atlte,
119
+ created_atgte=created_atgte,
120
+ modified_atlt=modified_atlt,
121
+ modified_atgt=modified_atgt,
122
+ modified_atlte=modified_atlte,
123
+ modified_atgte=modified_atgte,
124
+ ids=ids,
125
+ container_idsany_of=container_idsany_of,
126
+ sample_idsany_of=sample_idsany_of,
127
+ status=status,
128
+ )
129
+
130
+ def results_extractor(body: TestOrdersPaginatedList) -> Optional[List[TestOrder]]:
131
+ return body.test_orders
132
+
133
+ return PageIterator(api_call, results_extractor)
134
+
135
+ @api_method
136
+ def update(self, test_order_id: str, test_order: TestOrderUpdate) -> TestOrder:
137
+ """
138
+ Update a TestOrder.
139
+
140
+ See https://benchling.com/api/reference?availability=la#/Test%20Orders/updateTestOrder
141
+ """
142
+ response = update_test_order.sync_detailed(
143
+ client=self.client, test_order_id=test_order_id, json_body=test_order
144
+ )
145
+ return model_from_detailed(response)
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from functools import cached_property
4
- from typing import TYPE_CHECKING
4
+ from typing import Optional, TYPE_CHECKING
5
5
 
6
6
  from benchling_api_client.v2.stable.client import Client
7
7
 
@@ -26,7 +26,7 @@ class V2AlphaService(BaseService):
26
26
 
27
27
  _alpha_client: Client
28
28
 
29
- def __init__(self, client: Client, retry_strategy: RetryStrategy = RetryStrategy()):
29
+ def __init__(self, client: Client, retry_strategy: Optional[RetryStrategy] = None):
30
30
  """
31
31
  Initialize a v2-alpha service.
32
32