benchling-sdk 1.21.1__tar.gz → 1.22.0a0__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.
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/PKG-INFO +3 -2
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/canvas/types.py +8 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/framework.py +2 -2
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/helpers.py +6 -5
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/mock_config.py +4 -4
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/helpers/webhook_helpers.py +2 -2
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/status/framework.py +5 -5
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/status/helpers.py +2 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/auth/client_credentials_oauth2.py +5 -4
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/benchling.py +90 -14
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/errors.py +4 -3
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/retry_helpers.py +1 -1
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/serialization_helpers.py +6 -3
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/task_helpers.py +12 -9
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/models/__init__.py +1325 -329
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/models/webhooks/v0/__init__.py +12 -4
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/base_service.py +5 -4
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_data_frame_service.py +16 -8
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/aa_sequence_service.py +4 -0
- benchling_sdk-1.21.1/benchling_sdk/services/v2/beta/v2_beta_audit_service.py → benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/audit_service.py +6 -6
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/blob_service.py +6 -3
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/box_service.py +4 -0
- benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/connect_service.py +79 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/container_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/custom_entity_service.py +4 -0
- benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/data_frame_service.py +323 -0
- benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/dataset_service.py +132 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/dna_oligo_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/dna_sequence_service.py +4 -0
- benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/file_service.py +131 -0
- benchling_sdk-1.21.1/benchling_sdk/services/v2/stable/request_service.py → benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/legacy_request_service.py +25 -25
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/location_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/mixture_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/molecule_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/organization_service.py +10 -5
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/plate_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/rna_oligo_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/rna_sequence_service.py +4 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/task_service.py +1 -7
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/team_service.py +14 -7
- benchling_sdk-1.22.0a0/benchling_sdk/services/v2/stable/test_order_service.py +145 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/v2_alpha_service.py +2 -2
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/v2_beta_service.py +2 -16
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/v2_stable_service.py +104 -17
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2_service.py +1 -1
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/pyproject.toml +19 -38
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/LICENSE +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/README.md +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/canvas/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/canvas/errors.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/canvas/framework.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/cryptography_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/decryption_provider.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/errors.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/config/types.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/framework.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/helpers/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/helpers/manifest_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/status/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/status/errors.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/status/types.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/types.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/auth/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/auth/api_key_auth.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/auth/bearer_token_auth.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/docs/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/docs/__main__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/client_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/constants.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/decorators.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/file_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/logging_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/package_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/pagination_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/response_helpers.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/transaction_manager.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/models/webhooks/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/py.typed +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/alpha/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/alpha/v2_alpha_app_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/alpha/v2_alpha_assembly_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_analysis_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_app_definition_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_app_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_collaboration_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_entry_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_folder_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_project_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/beta/v2_beta_worklist_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/__init__.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/api_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/app_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/assay_result_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/assay_run_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/codon_usage_table_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/custom_notation_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/dna_alignments_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/dropdown_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/entity_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/entry_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/enzyme_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/event_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/export_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/feature_library_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/folder_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/instrument_query_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/inventory_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/lab_automation_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/label_template_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/monomer_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/oligo_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/printer_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/project_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/registry_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/schema_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/user_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/warehouse_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/workflow_flowchart_config_version_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/workflow_flowchart_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/workflow_output_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/workflow_task_group_service.py +0 -0
- {benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/services/v2/stable/workflow_task_service.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: benchling-sdk
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.22.0a0
|
4
4
|
Summary: SDK for interacting with the Benchling Platform.
|
5
5
|
License: Apache-2.0
|
6
6
|
Author: Benchling Support
|
@@ -16,7 +16,7 @@ Provides-Extra: python-jose
|
|
16
16
|
Requires-Dist: PyYAML (>=6.0,<7.0)
|
17
17
|
Requires-Dist: attrs (>=20.1.0)
|
18
18
|
Requires-Dist: backoff (>=1.10.0,<3)
|
19
|
-
Requires-Dist: benchling-api-client (==2.0.
|
19
|
+
Requires-Dist: benchling-api-client (==2.0.387)
|
20
20
|
Requires-Dist: certifi (>=2022.12.7)
|
21
21
|
Requires-Dist: cryptography (>=42.0.0) ; extra == "cryptography"
|
22
22
|
Requires-Dist: dataclasses-json (>=0.5.2,<0.6.0)
|
@@ -26,6 +26,7 @@ Requires-Dist: ordered-set (>=4.1.0,<5.0.0)
|
|
26
26
|
Requires-Dist: psutil (>=5.9.4,<6.0.0) ; python_version >= "3.11" and python_version < "4.0"
|
27
27
|
Requires-Dist: python-dateutil (>=2.8.0,<3.0.0)
|
28
28
|
Requires-Dist: python-jose[cryptography] (>=3.3.0,<4.0.0) ; extra == "python-jose"
|
29
|
+
Requires-Dist: setuptools (==68.0.0)
|
29
30
|
Description-Content-Type: text/markdown
|
30
31
|
|
31
32
|
# Benchling SDK
|
@@ -15,6 +15,9 @@ from benchling_sdk.models import (
|
|
15
15
|
DropdownUiBlock,
|
16
16
|
DropdownUiBlockCreate,
|
17
17
|
DropdownUiBlockUpdate,
|
18
|
+
FileUploadUiBlock,
|
19
|
+
FileUploadUiBlockCreate,
|
20
|
+
FileUploadUiBlockUpdate,
|
18
21
|
MarkdownUiBlock,
|
19
22
|
MarkdownUiBlockCreate,
|
20
23
|
MarkdownUiBlockUpdate,
|
@@ -46,6 +49,7 @@ UiBlock = Union[
|
|
46
49
|
ChipUiBlock,
|
47
50
|
DropdownMultiValueUiBlock,
|
48
51
|
DropdownUiBlock,
|
52
|
+
FileUploadUiBlock,
|
49
53
|
MarkdownUiBlock,
|
50
54
|
SearchInputMultiValueUiBlock,
|
51
55
|
SearchInputUiBlock,
|
@@ -67,6 +71,7 @@ _UiBlockCreate = Union[
|
|
67
71
|
ChipUiBlockCreate,
|
68
72
|
DropdownMultiValueUiBlockCreate,
|
69
73
|
DropdownUiBlockCreate,
|
74
|
+
FileUploadUiBlockCreate,
|
70
75
|
MarkdownUiBlockCreate,
|
71
76
|
SearchInputMultiValueUiBlockCreate,
|
72
77
|
SearchInputUiBlockCreate,
|
@@ -83,6 +88,7 @@ _UiBlockUpdate = Union[
|
|
83
88
|
ChipUiBlockUpdate,
|
84
89
|
DropdownMultiValueUiBlockUpdate,
|
85
90
|
DropdownUiBlockUpdate,
|
91
|
+
FileUploadUiBlockUpdate,
|
86
92
|
MarkdownUiBlockUpdate,
|
87
93
|
SearchInputMultiValueUiBlockUpdate,
|
88
94
|
SearchInputUiBlockUpdate,
|
@@ -99,6 +105,7 @@ _UI_BLOCK_MAPPINGS_CREATE = {
|
|
99
105
|
ChipUiBlock: ChipUiBlockCreate,
|
100
106
|
DropdownMultiValueUiBlock: DropdownMultiValueUiBlockCreate,
|
101
107
|
DropdownUiBlock: DropdownUiBlockCreate,
|
108
|
+
FileUploadUiBlock: FileUploadUiBlockCreate,
|
102
109
|
MarkdownUiBlock: MarkdownUiBlockCreate,
|
103
110
|
SearchInputMultiValueUiBlock: SearchInputMultiValueUiBlockCreate,
|
104
111
|
SearchInputUiBlock: SearchInputUiBlockCreate,
|
@@ -114,6 +121,7 @@ _UI_BLOCK_MAPPINGS_UPDATE = {
|
|
114
121
|
ChipUiBlock: ChipUiBlockUpdate,
|
115
122
|
DropdownMultiValueUiBlock: DropdownMultiValueUiBlockUpdate,
|
116
123
|
DropdownUiBlock: DropdownUiBlockUpdate,
|
124
|
+
FileUploadUiBlock: FileUploadUiBlockUpdate,
|
117
125
|
MarkdownUiBlock: MarkdownUiBlockUpdate,
|
118
126
|
SearchInputMultiValueUiBlock: SearchInputMultiValueUiBlockUpdate,
|
119
127
|
SearchInputUiBlock: SearchInputUiBlockUpdate,
|
@@ -228,7 +228,7 @@ class ConfigItemStore:
|
|
228
228
|
_configuration_provider: ConfigProvider
|
229
229
|
_configuration: Optional[List[ConfigurationReference]] = None
|
230
230
|
_configuration_dict: Optional[Dict[ConfigItemPath, ConfigItemWrapper]] = None
|
231
|
-
_array_path_row_names: Dict[Tuple[str, ...], OrderedSet[str]]
|
231
|
+
_array_path_row_names: Dict[Tuple[str, ...], OrderedSet[str]]
|
232
232
|
|
233
233
|
def __init__(self, configuration_provider: ConfigProvider):
|
234
234
|
"""
|
@@ -302,7 +302,7 @@ class ConfigItemStore:
|
|
302
302
|
# The +1 is the name of the array row
|
303
303
|
if len(config_item.path) >= len(path) + 1
|
304
304
|
# Ignoring flake8 error E203 because black keeps putting in whitespace padding :
|
305
|
-
and config_item.path[0 : len(path_tuple)] == path
|
305
|
+
and config_item.path[0 : len(path_tuple)] == path
|
306
306
|
and config_item.value is not None
|
307
307
|
]
|
308
308
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
from enum import Enum
|
3
|
-
from functools import
|
3
|
+
from functools import cache
|
4
4
|
from typing import cast, List, Optional, Union
|
5
5
|
|
6
6
|
from benchling_api_client.v2.beta.extensions import Enums
|
@@ -47,7 +47,8 @@ class _UnsupportedSubTypeError(Exception):
|
|
47
47
|
|
48
48
|
|
49
49
|
class _ScalarConfigTypes(Enums.KnownString):
|
50
|
-
"""
|
50
|
+
"""
|
51
|
+
Enum type copied from an earlier version of benchling-api-client, for internal use only.
|
51
52
|
|
52
53
|
See BNCH-108704.
|
53
54
|
"""
|
@@ -65,12 +66,12 @@ class _ScalarConfigTypes(Enums.KnownString):
|
|
65
66
|
return str(self.value)
|
66
67
|
|
67
68
|
@staticmethod
|
68
|
-
@
|
69
|
+
@cache
|
69
70
|
def of_unknown(val: str) -> "_ScalarConfigTypes":
|
70
71
|
if not isinstance(val, str):
|
71
72
|
raise ValueError(f"Value of _ScalarConfigTypes must be a string (encountered: {val})")
|
72
73
|
newcls = Enum("_ScalarConfigTypes", {"_UNKNOWN": val}, type=Enums.UnknownString) # type: ignore
|
73
|
-
return cast(_ScalarConfigTypes,
|
74
|
+
return cast(_ScalarConfigTypes, newcls._UNKNOWN)
|
74
75
|
|
75
76
|
|
76
77
|
def _field_definitions_from_dependency(
|
@@ -122,7 +123,7 @@ def _enum_from_dependency(
|
|
122
123
|
|
123
124
|
|
124
125
|
# TODO BNCH-57036 All element definitions currently deserialize to UnknownType. Hack around this temporarily
|
125
|
-
def _fix_element_definition_deserialization(
|
126
|
+
def _fix_element_definition_deserialization( # noqa:PLR0911
|
126
127
|
element: Union[UnknownType, _ArrayElementDependency]
|
127
128
|
) -> _ArrayElementDependency:
|
128
129
|
if isinstance(element, UnknownType):
|
@@ -345,7 +345,7 @@ def mock_text_app_config_item(path: List[str], value: Optional[str]) -> TextAppC
|
|
345
345
|
)
|
346
346
|
|
347
347
|
|
348
|
-
def _mock_dependency(
|
348
|
+
def _mock_dependency( # noqa:PLR0911
|
349
349
|
dependency: ManifestDependencies,
|
350
350
|
parent_path: Optional[List[str]] = None,
|
351
351
|
) -> List[AppConfigItem]:
|
@@ -451,7 +451,7 @@ def _convert_entity_subtype(manifest_subtype: SchemaDependencySubtypesBeta) -> S
|
|
451
451
|
return SchemaDependencySubtypes(source_value)
|
452
452
|
|
453
453
|
|
454
|
-
def _mock_scalar_dependency(
|
454
|
+
def _mock_scalar_dependency( # noqa:PLR0911
|
455
455
|
dependency: ManifestScalarConfig, parent_path: Optional[List[str]] = None
|
456
456
|
) -> AppConfigItem:
|
457
457
|
parent_path = parent_path if parent_path else []
|
@@ -502,7 +502,7 @@ def _mock_array_dependency(
|
|
502
502
|
) -> List[AppConfigItem]:
|
503
503
|
config_rows = []
|
504
504
|
parent_path = parent_path if parent_path else []
|
505
|
-
for
|
505
|
+
for _ in range(rows):
|
506
506
|
row = _mock_array_row(dependency, parent_path=parent_path)
|
507
507
|
elements = _element_definition_from_dependency(dependency)
|
508
508
|
element_configs = [_mock_dependency(element, row.path) for element in elements]
|
@@ -594,7 +594,7 @@ def _mock_linked_resource(id: str, name: Optional[str] = None) -> LinkedAppConfi
|
|
594
594
|
return LinkedAppConfigResourceSummary(id=id, name=name if name else _random_string("Resource Name"))
|
595
595
|
|
596
596
|
|
597
|
-
def _mock_scalar_value(
|
597
|
+
def _mock_scalar_value( # noqa:PLR0911
|
598
598
|
dependency: ManifestScalarConfig,
|
599
599
|
) -> Union[bool, date, datetime, int, float, str, Dict[str, Union[str, float]]]:
|
600
600
|
"""Mock a scalar config value from its manifest definition."""
|
{benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/apps/helpers/webhook_helpers.py
RENAMED
@@ -276,8 +276,8 @@ def _verify_timestamp(timestamp_header: str) -> None:
|
|
276
276
|
now = datetime.now(tz=timezone.utc)
|
277
277
|
try:
|
278
278
|
timestamp = datetime.fromtimestamp(float(timestamp_header), tz=timezone.utc)
|
279
|
-
except Exception:
|
280
|
-
raise WebhookVerificationError("Invalid Signature Headers")
|
279
|
+
except Exception as exc:
|
280
|
+
raise WebhookVerificationError("Invalid Signature Headers") from exc
|
281
281
|
if timestamp < (now - webhook_tolerance):
|
282
282
|
raise WebhookVerificationError("Message timestamp too old")
|
283
283
|
if timestamp > (now + webhook_tolerance):
|
@@ -286,10 +286,7 @@ class SessionClosingContextExitHandler(SessionContextExitHandler):
|
|
286
286
|
error_messages: Optional[Iterable[AppSessionMessageCreate]] = [
|
287
287
|
AppSessionMessageCreate(_DEFAULT_APP_ERROR_MESSAGE, style=AppSessionMessageStyle.ERROR)
|
288
288
|
],
|
289
|
-
error_processors: List[Type[SessionContextErrorProcessor]] =
|
290
|
-
AppUserFacingErrorProcessor,
|
291
|
-
BenchlingBadRequestErrorProcessor,
|
292
|
-
],
|
289
|
+
error_processors: Optional[List[Type[SessionContextErrorProcessor]]] = None,
|
293
290
|
enable_attached_canvas_on_error: bool = True,
|
294
291
|
):
|
295
292
|
"""
|
@@ -300,7 +297,10 @@ class SessionClosingContextExitHandler(SessionContextExitHandler):
|
|
300
297
|
"""
|
301
298
|
self._success_messages = success_messages
|
302
299
|
self._error_messages = error_messages
|
303
|
-
self._error_processors = error_processors
|
300
|
+
self._error_processors = error_processors or [
|
301
|
+
AppUserFacingErrorProcessor,
|
302
|
+
BenchlingBadRequestErrorProcessor,
|
303
|
+
]
|
304
304
|
self._enable_attached_canvas_on_error = enable_attached_canvas_on_error
|
305
305
|
|
306
306
|
def on_success(self, context: SessionContextManager) -> bool:
|
@@ -13,6 +13,7 @@ def ref(reference: ReferencedSessionLinkType) -> str:
|
|
13
13
|
Example:
|
14
14
|
dna_sequence = benchling.dna_sequences.get_by_id("seq_1234")
|
15
15
|
AppSessionMessageCreate(f"This is my DNA sequence {ref(dna_sequence)} for analysis")
|
16
|
+
|
16
17
|
"""
|
17
18
|
return ref_by_id(reference.id)
|
18
19
|
|
@@ -28,6 +29,7 @@ def ref_by_id(reference_id: str) -> str:
|
|
28
29
|
Example:
|
29
30
|
dna_sequence_id: str = "seq_asQya4lk"
|
30
31
|
AppSessionMessageCreate(f"This is my DNA sequence {ref_by_id(dna_sequence_id)} for analysis")
|
32
|
+
|
31
33
|
"""
|
32
34
|
assert reference_id, "reference_id cannot be empty or None"
|
33
35
|
return _encode_id(reference_id)
|
{benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/auth/client_credentials_oauth2.py
RENAMED
@@ -1,9 +1,10 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import base64
|
4
|
-
from datetime import datetime, timedelta
|
4
|
+
from datetime import datetime, timedelta, timezone
|
5
5
|
from json import JSONDecodeError
|
6
6
|
import threading
|
7
|
+
import typing
|
7
8
|
from typing import NoReturn, Optional
|
8
9
|
from urllib.parse import urljoin
|
9
10
|
|
@@ -31,7 +32,7 @@ class Token:
|
|
31
32
|
|
32
33
|
def valid(self) -> bool:
|
33
34
|
"""Return whether token is still valid for use or should be regenerated."""
|
34
|
-
return datetime.now() < self.refresh_time
|
35
|
+
return datetime.now(timezone.utc) < self.refresh_time
|
35
36
|
|
36
37
|
@classmethod
|
37
38
|
def from_token_response(cls, token_response) -> Token:
|
@@ -50,7 +51,7 @@ class Token:
|
|
50
51
|
# Add in a buffer to safeguard against race conditions with token expiration.
|
51
52
|
# Buffer is 10% of expires_in time, clamped between [1, MINIMUM_TOKEN_EXPIRY_BUFFER] seconds.
|
52
53
|
refresh_delta = expires_in - max(1, min(MINIMUM_TOKEN_EXPIRY_BUFFER, expires_in * 0.1))
|
53
|
-
refresh_time = datetime.now() + timedelta(seconds=refresh_delta)
|
54
|
+
refresh_time = datetime.now(timezone.utc) + timedelta(seconds=refresh_delta)
|
54
55
|
return cls(access_token, refresh_time)
|
55
56
|
|
56
57
|
|
@@ -62,7 +63,7 @@ class ClientCredentialsOAuth2(AuthorizationMethod):
|
|
62
63
|
type.
|
63
64
|
"""
|
64
65
|
|
65
|
-
_data_for_token_request = {
|
66
|
+
_data_for_token_request: typing.ClassVar[dict] = {
|
66
67
|
"grant_type": "client_credentials",
|
67
68
|
}
|
68
69
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Provides the Benchling class, which is the main interface for accessing Benchling's API functionality."""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
from functools import cached_property
|
@@ -18,12 +19,16 @@ if TYPE_CHECKING:
|
|
18
19
|
from benchling_sdk.services.v2.stable.app_service import AppService
|
19
20
|
from benchling_sdk.services.v2.stable.assay_result_service import AssayResultService
|
20
21
|
from benchling_sdk.services.v2.stable.assay_run_service import AssayRunService
|
22
|
+
from benchling_sdk.services.v2.stable.audit_service import AuditService
|
21
23
|
from benchling_sdk.services.v2.stable.blob_service import BlobService
|
22
24
|
from benchling_sdk.services.v2.stable.box_service import BoxService
|
23
25
|
from benchling_sdk.services.v2.stable.codon_usage_table_service import CodonUsageTableService
|
26
|
+
from benchling_sdk.services.v2.stable.connect_service import ConnectService
|
24
27
|
from benchling_sdk.services.v2.stable.container_service import ContainerService
|
25
28
|
from benchling_sdk.services.v2.stable.custom_entity_service import CustomEntityService
|
26
29
|
from benchling_sdk.services.v2.stable.custom_notation_service import CustomNotationService
|
30
|
+
from benchling_sdk.services.v2.stable.data_frame_service import DataFrameService
|
31
|
+
from benchling_sdk.services.v2.stable.dataset_service import DatasetService
|
27
32
|
from benchling_sdk.services.v2.stable.dna_alignments_service import DnaAlignmentsService
|
28
33
|
from benchling_sdk.services.v2.stable.dna_oligo_service import DnaOligoService
|
29
34
|
from benchling_sdk.services.v2.stable.dna_sequence_service import DnaSequenceService
|
@@ -34,11 +39,13 @@ if TYPE_CHECKING:
|
|
34
39
|
from benchling_sdk.services.v2.stable.event_service import EventService
|
35
40
|
from benchling_sdk.services.v2.stable.export_service import ExportService
|
36
41
|
from benchling_sdk.services.v2.stable.feature_library_service import FeatureLibraryService
|
42
|
+
from benchling_sdk.services.v2.stable.file_service import FileService
|
37
43
|
from benchling_sdk.services.v2.stable.folder_service import FolderService
|
38
44
|
from benchling_sdk.services.v2.stable.instrument_query_service import InstrumentQueryService
|
39
45
|
from benchling_sdk.services.v2.stable.inventory_service import InventoryService
|
40
46
|
from benchling_sdk.services.v2.stable.lab_automation_service import LabAutomationService
|
41
47
|
from benchling_sdk.services.v2.stable.label_template_service import LabelTemplateService
|
48
|
+
from benchling_sdk.services.v2.stable.legacy_request_service import LegacyRequestService
|
42
49
|
from benchling_sdk.services.v2.stable.location_service import LocationService
|
43
50
|
from benchling_sdk.services.v2.stable.mixture_service import MixtureService
|
44
51
|
from benchling_sdk.services.v2.stable.molecule_service import MoleculeService
|
@@ -50,12 +57,12 @@ if TYPE_CHECKING:
|
|
50
57
|
from benchling_sdk.services.v2.stable.printer_service import PrinterService
|
51
58
|
from benchling_sdk.services.v2.stable.project_service import ProjectService
|
52
59
|
from benchling_sdk.services.v2.stable.registry_service import RegistryService
|
53
|
-
from benchling_sdk.services.v2.stable.request_service import RequestService
|
54
60
|
from benchling_sdk.services.v2.stable.rna_oligo_service import RnaOligoService
|
55
61
|
from benchling_sdk.services.v2.stable.rna_sequence_service import RnaSequenceService
|
56
62
|
from benchling_sdk.services.v2.stable.schema_service import SchemaService
|
57
63
|
from benchling_sdk.services.v2.stable.task_service import TaskService
|
58
64
|
from benchling_sdk.services.v2.stable.team_service import TeamService
|
65
|
+
from benchling_sdk.services.v2.stable.test_order_service import TestOrderService
|
59
66
|
from benchling_sdk.services.v2.stable.user_service import UserService
|
60
67
|
from benchling_sdk.services.v2.stable.warehouse_service import WarehouseService
|
61
68
|
from benchling_sdk.services.v2.stable.workflow_flowchart_config_version_service import (
|
@@ -96,7 +103,7 @@ _DEFAULT_BASE_PATH = "/api/v2"
|
|
96
103
|
_DEFAULT_RETRY_STRATEGY = RetryStrategy()
|
97
104
|
|
98
105
|
|
99
|
-
class Benchling
|
106
|
+
class Benchling:
|
100
107
|
"""
|
101
108
|
A facade for interactions with the Benchling platform.
|
102
109
|
|
@@ -213,7 +220,7 @@ class Benchling(object):
|
|
213
220
|
|
214
221
|
See https://benchling.com/api/reference#/Apps
|
215
222
|
and https://docs.benchling.com/docs/getting-started-benchling-apps
|
216
|
-
"""
|
223
|
+
""" # noqa:RUF002 # Ruff gets confused by a trailing apostrophe with a plural noun
|
217
224
|
return self.v2.stable.apps
|
218
225
|
|
219
226
|
@property
|
@@ -239,6 +246,17 @@ class Benchling(object):
|
|
239
246
|
"""
|
240
247
|
return self.v2.stable.assay_runs
|
241
248
|
|
249
|
+
@property
|
250
|
+
def audit(self) -> AuditService:
|
251
|
+
"""
|
252
|
+
Audits.
|
253
|
+
|
254
|
+
Export audit log data for Benchling objects.
|
255
|
+
|
256
|
+
https://benchling.com/api/reference#/Audit
|
257
|
+
"""
|
258
|
+
return self.v2.stable.audit
|
259
|
+
|
242
260
|
@property
|
243
261
|
def blobs(self) -> BlobService:
|
244
262
|
"""
|
@@ -281,6 +299,17 @@ class Benchling(object):
|
|
281
299
|
"""
|
282
300
|
return self.v2.stable.codon_usage_tables
|
283
301
|
|
302
|
+
@property
|
303
|
+
def connect(self) -> ConnectService:
|
304
|
+
"""
|
305
|
+
Connect.
|
306
|
+
|
307
|
+
Connect endpoints support Benchling Connect actions, like instrument data conversion.
|
308
|
+
|
309
|
+
See https://benchling.com/api/reference#/Connect
|
310
|
+
"""
|
311
|
+
return self.v2.stable.connect
|
312
|
+
|
284
313
|
@property
|
285
314
|
def containers(self) -> ContainerService:
|
286
315
|
"""
|
@@ -323,6 +352,29 @@ class Benchling(object):
|
|
323
352
|
"""
|
324
353
|
return self.v2.stable.custom_notations
|
325
354
|
|
355
|
+
@property
|
356
|
+
def data_frames(self) -> DataFrameService:
|
357
|
+
"""
|
358
|
+
DataFrames.
|
359
|
+
|
360
|
+
DataFrames are Benchling objects that represent tabular data with typed columns and rows of data.
|
361
|
+
|
362
|
+
See https://benchling.com/api/v2/reference#/Data%20Frames
|
363
|
+
"""
|
364
|
+
return self.v2.stable.data_frames
|
365
|
+
|
366
|
+
@property
|
367
|
+
def datasets(self) -> DatasetService:
|
368
|
+
"""
|
369
|
+
Datasets.
|
370
|
+
|
371
|
+
Datasets are Benchling objects that represent tabular data with typed columns and rows of data. Unlike
|
372
|
+
Data Frames, Datasets are located in folders and can be searched in the UI.
|
373
|
+
|
374
|
+
See https://benchling.com/api/v2/reference#/Datasets
|
375
|
+
"""
|
376
|
+
return self.v2.stable.datasets
|
377
|
+
|
326
378
|
@property
|
327
379
|
def dna_alignments(self) -> DnaAlignmentsService:
|
328
380
|
"""
|
@@ -451,6 +503,19 @@ class Benchling(object):
|
|
451
503
|
"""
|
452
504
|
return self.v2.stable.feature_libraries
|
453
505
|
|
506
|
+
@property
|
507
|
+
def files(self) -> FileService:
|
508
|
+
"""
|
509
|
+
Files.
|
510
|
+
|
511
|
+
Files are Benchling objects that represent files and their metadata. Compared to Blobs, which are used
|
512
|
+
by most Benchling products for attachments, Files are primarily used in the Analysis and Connect
|
513
|
+
product.
|
514
|
+
|
515
|
+
See https://benchling.com/api/v2/reference#/Files
|
516
|
+
"""
|
517
|
+
return self.v2.stable.files
|
518
|
+
|
454
519
|
@property
|
455
520
|
def folders(self) -> FolderService:
|
456
521
|
"""
|
@@ -507,6 +572,17 @@ class Benchling(object):
|
|
507
572
|
"""
|
508
573
|
return self.v2.stable.label_templates
|
509
574
|
|
575
|
+
@property
|
576
|
+
def legacy_requests(self) -> LegacyRequestService:
|
577
|
+
"""
|
578
|
+
Legacy Requests.
|
579
|
+
|
580
|
+
Legacy Requests allow scientists and teams to collaborate around experimental assays and workflows.
|
581
|
+
|
582
|
+
See https://benchling.com/api/reference#/Legacy%20Requests
|
583
|
+
"""
|
584
|
+
return self.v2.stable.legacy_requests
|
585
|
+
|
510
586
|
@property
|
511
587
|
def locations(self) -> LocationService:
|
512
588
|
"""
|
@@ -642,17 +718,6 @@ class Benchling(object):
|
|
642
718
|
"""
|
643
719
|
return self.v2.stable.registry
|
644
720
|
|
645
|
-
@property
|
646
|
-
def requests(self) -> RequestService:
|
647
|
-
"""
|
648
|
-
Requests.
|
649
|
-
|
650
|
-
Requests allow scientists and teams to collaborate around experimental assays and workflows.
|
651
|
-
|
652
|
-
See https://benchling.com/api/reference#/Requests
|
653
|
-
"""
|
654
|
-
return self.v2.stable.requests
|
655
|
-
|
656
721
|
@property
|
657
722
|
def rna_oligos(self) -> RnaOligoService:
|
658
723
|
"""
|
@@ -706,6 +771,17 @@ class Benchling(object):
|
|
706
771
|
"""
|
707
772
|
return self.v2.stable.teams
|
708
773
|
|
774
|
+
@property
|
775
|
+
def test_orders(self) -> TestOrderService:
|
776
|
+
"""
|
777
|
+
Test Orders.
|
778
|
+
|
779
|
+
Test orders enable users to order tests for specific sample/container combinations that will be fulfilled in assays.
|
780
|
+
|
781
|
+
See https://benchling.com/api/reference?availability=la#/Test%20Orders/
|
782
|
+
"""
|
783
|
+
return self.v2.stable.test_orders
|
784
|
+
|
709
785
|
@property
|
710
786
|
def users(self) -> UserService:
|
711
787
|
"""
|
@@ -26,7 +26,8 @@ logger = default_logger()
|
|
26
26
|
|
27
27
|
@dataclass
|
28
28
|
class BenchlingError(Exception):
|
29
|
-
"""
|
29
|
+
"""
|
30
|
+
An error resulting from communicating with the Benchling API.
|
30
31
|
|
31
32
|
This could be an error returned from the API intentionally (e.g., 400 Bad Request) or an
|
32
33
|
unexpected transport error (e.g., 502 Bad Gateway)
|
@@ -53,7 +54,7 @@ class BenchlingError(Exception):
|
|
53
54
|
]
|
54
55
|
|
55
56
|
@classmethod
|
56
|
-
def from_response(cls, response: Response) ->
|
57
|
+
def from_response(cls, response: Response) -> BenchlingError:
|
57
58
|
"""Create a BenchlingError from a generated Response."""
|
58
59
|
json_body = _parse_error_body(response.content)
|
59
60
|
return cls(
|
@@ -95,7 +96,7 @@ class RegistrationError(Exception):
|
|
95
96
|
task_status: Optional[AsyncTaskStatus] = None
|
96
97
|
|
97
98
|
@classmethod
|
98
|
-
def from_task(cls, task: AsyncTask) ->
|
99
|
+
def from_task(cls, task: AsyncTask) -> RegistrationError:
|
99
100
|
"""Create a RegistrationError from a failed AsyncTask."""
|
100
101
|
task_errors = unset_as_none(task.errors)
|
101
102
|
errors_dict: Dict[Any, Any] = task_errors.to_dict() if task_errors else dict() # type: ignore
|
@@ -14,7 +14,7 @@ logging.getLogger("backoff").setLevel(logging.CRITICAL)
|
|
14
14
|
|
15
15
|
|
16
16
|
@dataclass(frozen=True, eq=True)
|
17
|
-
class RetryStrategy
|
17
|
+
class RetryStrategy:
|
18
18
|
"""Specify a strategy for automatically retrying failed HTTP calls."""
|
19
19
|
|
20
20
|
# Passing in None results in unbounded retries
|
{benchling_sdk-1.21.1 → benchling_sdk-1.22.0a0}/benchling_sdk/helpers/serialization_helpers.py
RENAMED
@@ -29,7 +29,8 @@ class SerializableModel(DataClassJsonMixin):
|
|
29
29
|
|
30
30
|
@dataclass
|
31
31
|
class DeserializableModel(DataClassJsonMixin):
|
32
|
-
"""
|
32
|
+
"""
|
33
|
+
Provide an interface for deserialization to a custom model.
|
33
34
|
|
34
35
|
For deserializing models when using raw API calls (e.g., Benchling.api)
|
35
36
|
Override deserialize() for customized behavior.
|
@@ -50,7 +51,8 @@ class DeserializableModelNoContent(DeserializableModel):
|
|
50
51
|
|
51
52
|
|
52
53
|
def optional_array_query_param(inputs: Optional[Iterable[str]]) -> Optional[str]:
|
53
|
-
"""
|
54
|
+
"""
|
55
|
+
Collapse an Iterable to a comma-separated string if present.
|
54
56
|
|
55
57
|
Add leading and trailing quotes if the item contains "," and not quoted
|
56
58
|
"""
|
@@ -58,7 +60,8 @@ def optional_array_query_param(inputs: Optional[Iterable[str]]) -> Optional[str]
|
|
58
60
|
|
59
61
|
|
60
62
|
def array_query_param(inputs: Iterable[str]) -> str:
|
61
|
-
"""
|
63
|
+
"""
|
64
|
+
Collapse an Iterable to a comma-separated string.
|
62
65
|
|
63
66
|
Add leading and trailing quotes if the item contains "," and not quoted
|
64
67
|
"""
|
@@ -1,10 +1,10 @@
|
|
1
1
|
from dataclasses import dataclass
|
2
|
-
from typing import Any, cast, Generic, Optional, Type, TypeVar
|
2
|
+
from typing import Any, cast, Generic, List, Optional, Type, TypeVar, Union
|
3
3
|
|
4
4
|
from benchling_api_client.v2.stable.client import Client
|
5
5
|
|
6
6
|
from benchling_sdk.helpers.serialization_helpers import unset_as_none
|
7
|
-
from benchling_sdk.models import AsyncTaskErrors, AsyncTaskLink, AsyncTaskStatus
|
7
|
+
from benchling_sdk.models import AsyncTaskErrors, AsyncTaskErrorsItem, AsyncTaskLink, AsyncTaskStatus
|
8
8
|
|
9
9
|
ResponseT = TypeVar("ResponseT")
|
10
10
|
|
@@ -14,7 +14,7 @@ class TaskCompletion(Generic[ResponseT]):
|
|
14
14
|
"""Return type for TaskHelper.wait_for_task, same as AsyncTask but with a typed response."""
|
15
15
|
|
16
16
|
success: bool
|
17
|
-
errors: Optional[AsyncTaskErrors] = None
|
17
|
+
errors: Optional[Union[AsyncTaskErrors, List[AsyncTaskErrorsItem]]] = None
|
18
18
|
message: Optional[str] = None
|
19
19
|
response: Optional[ResponseT] = None
|
20
20
|
|
@@ -23,7 +23,7 @@ class TaskCompletion(Generic[ResponseT]):
|
|
23
23
|
class TaskFailureException(Exception):
|
24
24
|
"""Exception type used by :py:class:`.TaskHelper` methods."""
|
25
25
|
|
26
|
-
errors: AsyncTaskErrors
|
26
|
+
errors: Union[AsyncTaskErrors, List[AsyncTaskErrorsItem]]
|
27
27
|
message: Optional[str]
|
28
28
|
|
29
29
|
|
@@ -37,7 +37,8 @@ EMPTY_TASK_RESPONSE = EmptyTaskResponse()
|
|
37
37
|
|
38
38
|
|
39
39
|
class TaskHelper(AsyncTaskLink, Generic[ResponseT]):
|
40
|
-
"""
|
40
|
+
"""
|
41
|
+
Used by Benchling async task endpoints to provide the task response in an appropriate type.
|
41
42
|
|
42
43
|
In the API spec, endpoints that create a long-running task are defined as returning an
|
43
44
|
:py:class:`benchling_sdk.models.AsyncTaskLink`, which can be used with
|
@@ -70,12 +71,13 @@ class TaskHelper(AsyncTaskLink, Generic[ResponseT]):
|
|
70
71
|
|
71
72
|
if response_class is not EmptyTaskResponse:
|
72
73
|
assert hasattr(response_class, "from_dict")
|
73
|
-
self._response_decoder = getattr(response_class, "from_dict")
|
74
|
+
self._response_decoder = getattr(response_class, "from_dict") # noqa: B009
|
74
75
|
|
75
76
|
def wait_for_completion(
|
76
77
|
self, interval_wait_seconds: int = 1, max_wait_seconds: int = 600
|
77
78
|
) -> TaskCompletion[ResponseT]:
|
78
|
-
"""
|
79
|
+
"""
|
80
|
+
Wait for the task to succeed or fail.
|
79
81
|
|
80
82
|
This is equivalent to the :py:meth:`benchling_sdk.services.v2.stable.task_service.TaskService.wait_for_task`
|
81
83
|
method in :py:class:`benchling_sdk.services.v2.stable.task_service.TaskService`, except that
|
@@ -110,13 +112,14 @@ class TaskHelper(AsyncTaskLink, Generic[ResponseT]):
|
|
110
112
|
message = None if task.status != AsyncTaskStatus.FAILED else unset_as_none(task.message)
|
111
113
|
return TaskCompletion(
|
112
114
|
success=task.status == AsyncTaskStatus.SUCCEEDED,
|
113
|
-
errors=errors,
|
115
|
+
errors=errors, # type: ignore
|
114
116
|
message=message,
|
115
117
|
response=response,
|
116
118
|
)
|
117
119
|
|
118
120
|
def wait_for_response(self, interval_wait_seconds: int = 1, max_wait_seconds: int = 600) -> ResponseT:
|
119
|
-
"""
|
121
|
+
"""
|
122
|
+
Wait for the task and return the response object on success, or raise an exception on failure.
|
120
123
|
|
121
124
|
This is a convenience method for calling :py:meth:`wait_for_completion` and then getting the
|
122
125
|
`response` property of the returned object if the task succeeded, in cases where you're not
|