benchling-sdk 1.10.0a9__tar.gz → 1.10.0a11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/PKG-INFO +2 -2
  2. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/canvas/framework.py +4 -1
  3. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/framework.py +0 -3
  4. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/helpers/webhook_helpers.py +2 -2
  5. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/status/errors.py +3 -0
  6. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/errors.py +4 -4
  7. benchling_sdk-1.10.0a9/benchling_sdk/services/v2/beta/v2_beta_dataset_service.py → benchling_sdk-1.10.0a11/benchling_sdk/services/v2/beta/v2_beta_data_frame_service.py +126 -116
  8. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/v2_beta_service.py +11 -11
  9. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/pyproject.toml +2 -2
  10. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/LICENSE +0 -0
  11. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/README.md +0 -0
  12. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/__init__.py +0 -0
  13. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/__init__.py +0 -0
  14. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/canvas/__init__.py +0 -0
  15. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/canvas/errors.py +0 -0
  16. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/canvas/types.py +0 -0
  17. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/__init__.py +0 -0
  18. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/cryptography_helpers.py +0 -0
  19. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/decryption_provider.py +0 -0
  20. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/errors.py +0 -0
  21. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/framework.py +0 -0
  22. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/helpers.py +0 -0
  23. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/mock_config.py +0 -0
  24. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/config/types.py +0 -0
  25. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/helpers/__init__.py +0 -0
  26. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/helpers/manifest_helpers.py +0 -0
  27. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/status/__init__.py +0 -0
  28. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/status/framework.py +0 -0
  29. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/status/helpers.py +0 -0
  30. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/status/types.py +0 -0
  31. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/apps/types.py +0 -0
  32. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/auth/__init__.py +0 -0
  33. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/auth/api_key_auth.py +0 -0
  34. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/auth/bearer_token_auth.py +0 -0
  35. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/auth/client_credentials_oauth2.py +0 -0
  36. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/benchling.py +0 -0
  37. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/docs/__init__.py +0 -0
  38. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/docs/__main__.py +0 -0
  39. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/__init__.py +0 -0
  40. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/client_helpers.py +0 -0
  41. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/constants.py +0 -0
  42. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/decorators.py +0 -0
  43. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/file_helpers.py +0 -0
  44. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/logging_helpers.py +0 -0
  45. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/package_helpers.py +0 -0
  46. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/pagination_helpers.py +0 -0
  47. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/response_helpers.py +0 -0
  48. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/retry_helpers.py +0 -0
  49. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/serialization_helpers.py +0 -0
  50. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/helpers/transaction_manager.py +0 -0
  51. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/models/__init__.py +0 -0
  52. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/models/webhooks/__init__.py +0 -0
  53. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/models/webhooks/v0/__init__.py +0 -0
  54. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/py.typed +0 -0
  55. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/__init__.py +0 -0
  56. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/__init__.py +0 -0
  57. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/alpha/__init__.py +0 -0
  58. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/alpha/v2_alpha_app_service.py +0 -0
  59. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/alpha/v2_alpha_dna_sequence_service.py +0 -0
  60. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/base_service.py +0 -0
  61. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/__init__.py +0 -0
  62. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_aa_sequence_service.py +0 -0
  63. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_app_service.py +0 -0
  64. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_collaboration_service.py +0 -0
  65. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_custom_entity_service.py +0 -0
  66. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_dna_oligo_service.py +0 -0
  67. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_dna_sequence_service.py +0 -0
  68. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_entity_service.py +0 -0
  69. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_entry_service.py +0 -0
  70. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_folder_service.py +0 -0
  71. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_project_service.py +0 -0
  72. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_rna_oligo_service.py +0 -0
  73. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/beta/v2_beta_worklist_service.py +0 -0
  74. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/__init__.py +0 -0
  75. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/aa_sequence_service.py +0 -0
  76. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/api_service.py +0 -0
  77. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/app_service.py +0 -0
  78. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/assay_result_service.py +0 -0
  79. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/assay_run_service.py +0 -0
  80. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/blob_service.py +0 -0
  81. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/box_service.py +0 -0
  82. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/container_service.py +0 -0
  83. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/custom_entity_service.py +0 -0
  84. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/custom_notation_service.py +0 -0
  85. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/dna_alignments_service.py +0 -0
  86. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/dna_oligo_service.py +0 -0
  87. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/dna_sequence_service.py +0 -0
  88. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/dropdown_service.py +0 -0
  89. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/entry_service.py +0 -0
  90. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/event_service.py +0 -0
  91. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/export_service.py +0 -0
  92. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/feature_library_service.py +0 -0
  93. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/folder_service.py +0 -0
  94. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/inventory_service.py +0 -0
  95. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/lab_automation_service.py +0 -0
  96. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/label_template_service.py +0 -0
  97. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/location_service.py +0 -0
  98. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/mixture_service.py +0 -0
  99. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/molecule_service.py +0 -0
  100. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +0 -0
  101. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/oligo_service.py +0 -0
  102. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/organization_service.py +0 -0
  103. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/plate_service.py +0 -0
  104. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/printer_service.py +0 -0
  105. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/project_service.py +0 -0
  106. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/registry_service.py +0 -0
  107. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/request_service.py +0 -0
  108. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/rna_oligo_service.py +0 -0
  109. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/rna_sequence_service.py +0 -0
  110. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/schema_service.py +0 -0
  111. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/task_service.py +0 -0
  112. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/team_service.py +0 -0
  113. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/user_service.py +0 -0
  114. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/warehouse_service.py +0 -0
  115. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/workflow_output_service.py +0 -0
  116. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/workflow_task_group_service.py +0 -0
  117. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/stable/workflow_task_service.py +0 -0
  118. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/v2_alpha_service.py +0 -0
  119. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2/v2_stable_service.py +0 -0
  120. {benchling_sdk-1.10.0a9 → benchling_sdk-1.10.0a11}/benchling_sdk/services/v2_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: benchling-sdk
3
- Version: 1.10.0a9
3
+ Version: 1.10.0a11
4
4
  Summary: SDK for interacting with the Benchling Platform.
5
5
  License: Apache-2.0
6
6
  Author: Benchling Support
@@ -17,7 +17,7 @@ Provides-Extra: python-jose
17
17
  Requires-Dist: PyYAML (>=6.0,<7.0)
18
18
  Requires-Dist: attrs (>=20.1.0,<23)
19
19
  Requires-Dist: backoff (>=1.10.0,<2.0.0)
20
- Requires-Dist: benchling-api-client (==2.0.243)
20
+ Requires-Dist: benchling-api-client (==2.0.244)
21
21
  Requires-Dist: certifi (>=2022.12.7)
22
22
  Requires-Dist: cryptography (>=41.0.3,<42.0.0) ; extra == "cryptography"
23
23
  Requires-Dist: dataclasses-json (>=0.5.2,<0.6.0)
@@ -399,7 +399,7 @@ class CanvasBuilder:
399
399
  enabled=canvas.enabled,
400
400
  session_id=canvas.session_id,
401
401
  blocks=canvas.blocks,
402
- data=json.loads(canvas.data) if canvas.data is not None else None,
402
+ data=json.loads(canvas.data) if isinstance(canvas.data, str) else None,
403
403
  )
404
404
 
405
405
  def _with_enabled(self, value: bool) -> CanvasBuilder:
@@ -631,6 +631,9 @@ class CanvasBuilder:
631
631
  """
632
632
  return json.loads(self._source_canvas.data) if self._source_canvas.data is not None else None
633
633
 
634
+ def __eq__(self, other) -> bool:
635
+ return isinstance(other, CanvasBuilder) and self._source_canvas == other._source_canvas
636
+
634
637
 
635
638
  def _is_included_class(included_classes: Set[Type[UiBlock]], target_class: UiBlock) -> bool:
636
639
  return isinstance(target_class, tuple(c for c in included_classes))
@@ -11,9 +11,6 @@ from benchling_sdk.apps.status.framework import (
11
11
  SessionContextManager,
12
12
  )
13
13
  from benchling_sdk.benchling import Benchling
14
- from benchling_sdk.helpers.logging_helpers import log_stability_warning, StabilityLevel
15
-
16
- log_stability_warning(StabilityLevel.ALPHA)
17
14
 
18
15
 
19
16
  class App:
@@ -11,7 +11,7 @@ from benchling_sdk.helpers.logging_helpers import log_stability_warning, Stabili
11
11
  from benchling_sdk.helpers.package_helpers import _required_packages_context, ExtrasPackage
12
12
  from benchling_sdk.services.v2.stable.api_service import build_json_response
13
13
 
14
- log_stability_warning(StabilityLevel.ALPHA)
14
+ log_stability_warning(StabilityLevel.BETA)
15
15
 
16
16
 
17
17
  class WebhookVerificationError(Exception):
@@ -104,7 +104,7 @@ def verify_app_installation(
104
104
  Resolves JWKs from Benchling with default settings. Pass jwk_function for customization.
105
105
 
106
106
  This method will eventually be replaced with verify(app_definition_id) once Benchling Apps
107
- are migrated to global.
107
+ have global JWKs available for their app definition id.
108
108
  """
109
109
  _verify_headers_present(headers)
110
110
  _verify_timestamp(headers["webhook-timestamp"])
@@ -80,3 +80,6 @@ class AppUserFacingError(Exception):
80
80
  AppSessionMessageCreate(content=message, style=AppSessionMessageStyle.ERROR)
81
81
  for message in self._messages
82
82
  ]
83
+
84
+ def __str__(self) -> str:
85
+ return "\n".join(self._messages) if self._messages else ""
@@ -183,8 +183,8 @@ class AppSessionClosedError(ExtendedBenchlingErrorBase):
183
183
 
184
184
 
185
185
  @dataclass
186
- class InvalidDatasetError(Exception):
187
- """A general error related to Benchling Datasets."""
186
+ class InvalidDataFrameError(Exception):
187
+ """A general error related to Benchling DataFrames."""
188
188
 
189
189
  message: str
190
190
 
@@ -193,8 +193,8 @@ class InvalidDatasetError(Exception):
193
193
 
194
194
 
195
195
  @dataclass
196
- class DatasetInProgressError(Exception):
197
- """An error for Benchling datasets for unavailable data operations on a Dataset in progress."""
196
+ class DataFrameInProgressError(Exception):
197
+ """An error for Benchling data frames for unavailable data operations on a DataFrame in progress."""
198
198
 
199
199
  message: str
200
200
 
@@ -4,77 +4,79 @@ from pathlib import Path
4
4
  import tempfile
5
5
  from typing import Dict, List, Optional, Union
6
6
 
7
- from benchling_api_client.v2.beta.api.datasets import create_dataset, get_dataset, patch_dataset
8
- from benchling_api_client.v2.beta.models.dataset import Dataset
9
- from benchling_api_client.v2.beta.models.dataset_create import DatasetCreate
10
- from benchling_api_client.v2.beta.models.dataset_create_manifest_manifest_item import (
11
- DatasetCreateManifestManifestItem,
7
+ from benchling_api_client.v2.beta.api.data_frames import create_data_frame, get_data_frame, patch_data_frame
8
+ from benchling_api_client.v2.beta.models.data_frame import DataFrame
9
+ from benchling_api_client.v2.beta.models.data_frame_create import DataFrameCreate
10
+ from benchling_api_client.v2.beta.models.data_frame_create_manifest_manifest_item import (
11
+ DataFrameCreateManifestManifestItem,
12
12
  )
13
- from benchling_api_client.v2.beta.models.dataset_update import DatasetUpdate
14
- from benchling_api_client.v2.beta.models.dataset_update_upload_status import DatasetUpdateUploadStatus
13
+ from benchling_api_client.v2.beta.models.data_frame_update import DataFrameUpdate
14
+ from benchling_api_client.v2.beta.models.data_frame_update_upload_status import DataFrameUpdateUploadStatus
15
15
  from benchling_api_client.v2.beta.models.file_status_upload_status import FileStatusUploadStatus
16
16
  from benchling_api_client.v2.types import Response
17
17
  import httpx
18
18
 
19
- from benchling_sdk.errors import DatasetInProgressError, InvalidDatasetError, raise_for_status
19
+ from benchling_sdk.errors import DataFrameInProgressError, InvalidDataFrameError, raise_for_status
20
20
  from benchling_sdk.helpers.decorators import api_method
21
21
  from benchling_sdk.helpers.response_helpers import model_from_detailed
22
22
  from benchling_sdk.models import AsyncTaskLink
23
23
  from benchling_sdk.services.v2.base_service import BaseService
24
24
 
25
- _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET: float = 60.0
25
+ _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME: float = 60.0
26
26
 
27
27
 
28
- class V2BetaDatasetService(BaseService):
28
+ class V2BetaDataFrameService(BaseService):
29
29
  """
30
- V2-Beta Datasets.
30
+ V2-Beta Data Frames.
31
31
 
32
- Datasets are Benchling objects that represent tabular data with typed columns and rows of data.
32
+ Data Frames are Benchling objects that represent tabular data with typed columns and rows of data.
33
33
 
34
- See https://benchling.com/api/v2-beta/reference#/Dataset
34
+ See https://benchling.com/api/v2-beta/reference#/Data%20Frames
35
35
  """
36
36
 
37
37
  @api_method
38
- def get_by_id(self, dataset_id: str) -> Dataset:
38
+ def get_by_id(self, data_frame_id: str) -> DataFrame:
39
39
  """
40
- Get a dataset and URLs to download its data.
40
+ Get a data frame and URLs to download its data.
41
41
 
42
- See https://benchling.com/api/v2-beta/reference#/Datasets/getDataset
42
+ See https://benchling.com/api/v2-beta/reference#/Data%20Frames/getDataFrame
43
43
  """
44
- response = get_dataset.sync_detailed(client=self.client, dataset_id=dataset_id)
44
+ response = get_data_frame.sync_detailed(client=self.client, data_frame_id=data_frame_id)
45
45
  return model_from_detailed(response)
46
46
 
47
47
  @api_method
48
- def create(self, dataset: DatasetCreate) -> Dataset:
48
+ def create(self, data_frame: DataFrameCreate) -> DataFrame:
49
49
  """
50
- Create a dataset.
50
+ Create a data frame.
51
51
 
52
- See https://benchling.com/api/v2-beta/reference#/Datasets/createDataset
52
+ See https://benchling.com/api/v2-beta/reference#/Data%20Frames/createDataFrame
53
53
  """
54
- response = create_dataset.sync_detailed(client=self.client, json_body=dataset)
54
+ response = create_data_frame.sync_detailed(client=self.client, json_body=data_frame)
55
55
  return model_from_detailed(response)
56
56
 
57
57
  @api_method
58
- def update(self, dataset_id: str, dataset: DatasetUpdate) -> AsyncTaskLink:
58
+ def update(self, data_frame_id: str, data_frame: DataFrameUpdate) -> AsyncTaskLink:
59
59
  """
60
- Update a dataset.
60
+ Update a data frame.
61
61
 
62
- See https://benchling.com/api/v2-beta/reference#/Datasets/patchDataset
62
+ See https://benchling.com/api/v2-beta/reference#/Data%20Frames/patchDataFrame
63
63
  """
64
- response = patch_dataset.sync_detailed(client=self.client, dataset_id=dataset_id, json_body=dataset)
64
+ response = patch_data_frame.sync_detailed(
65
+ client=self.client, data_frame_id=data_frame_id, json_body=data_frame
66
+ )
65
67
  return model_from_detailed(response)
66
68
 
67
69
  def upload_bytes(
68
70
  self,
69
71
  url: str,
70
72
  input_bytes: Union[BytesIO, bytes],
71
- timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET,
73
+ timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME,
72
74
  ) -> None:
73
- """Upload bytes to an existing dataset.
75
+ """Upload bytes to an existing data frame.
74
76
 
75
- :param url: The url provided by Benchling for uploading to the dataset
77
+ :param url: The url provided by Benchling for uploading to the data frame
76
78
  :param input_bytes: Data to upload as bytes or BytesIO
77
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
79
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
78
80
  Use this to extend even further if streams are very large
79
81
  """
80
82
  # Use a completely different client instead of our configured self.client.httpx_client
@@ -86,17 +88,19 @@ class V2BetaDatasetService(BaseService):
86
88
  raise_for_status(response)
87
89
 
88
90
  def upload_file(
89
- self, url: str, file: Path, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET
91
+ self, url: str, file: Path, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME
90
92
  ) -> None:
91
- """Upload a file to an existing dataset.
93
+ """Upload a file to an existing data frame.
92
94
 
93
- :param url: The url provided by Benchling for uploading to the dataset
95
+ :param url: The url provided by Benchling for uploading to the data frame
94
96
  :param file: A valid Path to an existing file containing the data to upload
95
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
97
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
96
98
  Use this to extend even further if streams are very large
97
99
  """
98
100
  if file.is_dir():
99
- raise IsADirectoryError(f"Cannot write dataset from directory '{file}', specify a file instead")
101
+ raise IsADirectoryError(
102
+ f"Cannot write data frame from directory '{file}', specify a file instead"
103
+ )
100
104
  # Use a completely different client instead of our configured self.client.httpx_client
101
105
  # Amazon will reject clients sending other headers besides the ones it expects
102
106
  files = {"file": open(file, "rb")}
@@ -107,113 +111,117 @@ class V2BetaDatasetService(BaseService):
107
111
  @api_method
108
112
  def create_from_bytes(
109
113
  self,
110
- dataset: DatasetCreate,
114
+ data_frame: DataFrameCreate,
111
115
  input_bytes: Union[BytesIO, bytes],
112
- timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET,
116
+ timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME,
113
117
  ) -> AsyncTaskLink:
114
- """Create a dataset from bytes or BytesIO data.
118
+ """Create a data frame from bytes or BytesIO data.
115
119
 
116
- :param dataset: The DatasetCreate specification for the data. This must be provided, as it cannot be inferred from file names.
120
+ :param data_frame: The DataFrameCreate specification for the data. This must be provided, as it cannot be inferred from file names.
117
121
  :param input_bytes: Data to upload as bytes or BytesIO
118
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
122
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
119
123
  Use this to extend even further if streams are very large
120
- :return: An AsyncTaskLink that can be polled to know when the dataset has completed processing
124
+ :return: An AsyncTaskLink that can be polled to know when the data frame has completed processing
121
125
  :rtype: AsyncTaskLink
122
126
  """
123
- # This is a current limit of the Dataset API. We may need additional methods in the future
127
+ # This is a current limit of the DataFrame API. We may need additional methods in the future
124
128
  # to allow multi upload
125
- if not dataset.manifest:
126
- raise InvalidDatasetError("The dataset manifest must contain exactly 1 item")
127
- elif len(dataset.manifest) != 1:
128
- raise InvalidDatasetError(
129
- f"The dataset manifest contains {len(dataset.manifest)} items. It must contain exactly 1"
129
+ if not data_frame.manifest:
130
+ raise InvalidDataFrameError("The data frame manifest must contain exactly 1 item")
131
+ elif len(data_frame.manifest) != 1:
132
+ raise InvalidDataFrameError(
133
+ f"The data frame manifest contains {len(data_frame.manifest)} items. It must contain exactly 1"
130
134
  )
131
- created_dataset = self.create(dataset)
132
- manifest_item = created_dataset.manifest[0]
135
+ created_data_frame = self.create(data_frame)
136
+ manifest_item = created_data_frame.manifest[0]
133
137
 
134
138
  # This would be unexpected and probably an error from the API return. Likely not a user error. This check appeases MyPy.
135
139
  if manifest_item.url is None:
136
- raise InvalidDatasetError(
137
- f"The dataset manifest URL is None. The dataset {created_dataset.id} is not available for data upload."
140
+ raise InvalidDataFrameError(
141
+ f"The data frame manifest URL is None. The data frame {created_data_frame.id} is not available for data upload."
138
142
  )
139
143
  self.upload_bytes(url=manifest_item.url, input_bytes=input_bytes, timeout_seconds=timeout_seconds)
140
- dataset_update = DatasetUpdate(upload_status=DatasetUpdateUploadStatus.IN_PROGRESS)
141
- return self.update(dataset_id=created_dataset.id, dataset=dataset_update)
144
+ data_frame_update = DataFrameUpdate(upload_status=DataFrameUpdateUploadStatus.IN_PROGRESS)
145
+ return self.update(data_frame_id=created_data_frame.id, data_frame=data_frame_update)
142
146
 
143
147
  @api_method
144
148
  def create_from_file(
145
149
  self,
146
150
  file: Path,
147
- dataset: Optional[DatasetCreate] = None,
148
- timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET,
151
+ data_frame: Optional[DataFrameCreate] = None,
152
+ timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME,
149
153
  ) -> AsyncTaskLink:
150
- """Create a dataset from file data.
154
+ """Create a data frame from file data.
151
155
 
152
156
  :param file: A valid Path to an existing file containing the data to upload
153
- :param dataset: The DatasetCreate specification for the data. If not provided, it will be inferred from the file name
154
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
157
+ :param data_frame: The DataFrameCreate specification for the data. If not provided, it will be inferred from the file name
158
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
155
159
  Use this to extend even further if streams are very large
156
- :return: An AsyncTaskLink that can be polled to know when the dataset has completed processing
160
+ :return: An AsyncTaskLink that can be polled to know when the data frame has completed processing
157
161
  :rtype: AsyncTaskLink
158
162
  """
159
163
  if file.is_dir():
160
- raise IsADirectoryError(f"Cannot write dataset from directory '{file}', specify a file instead")
164
+ raise IsADirectoryError(
165
+ f"Cannot write data frame from directory '{file}', specify a file instead"
166
+ )
161
167
  with open(file, "rb") as file_handle:
162
168
  input_bytes = file_handle.read()
163
- if not dataset:
164
- dataset = DatasetCreate(
169
+ if not data_frame:
170
+ data_frame = DataFrameCreate(
165
171
  name=f"{datetime.now()} {file.name}",
166
- manifest=[DatasetCreateManifestManifestItem(file_name=file.name)],
172
+ manifest=[DataFrameCreateManifestManifestItem(file_name=file.name)],
167
173
  )
168
174
  return self.create_from_bytes(
169
- dataset=dataset, input_bytes=input_bytes, timeout_seconds=timeout_seconds
175
+ data_frame=data_frame, input_bytes=input_bytes, timeout_seconds=timeout_seconds
170
176
  )
171
177
 
172
- def download_dataset_bytes(
173
- self, dataset: Dataset, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET
178
+ def download_data_frame_bytes(
179
+ self, data_frame: DataFrame, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME
174
180
  ) -> List[BytesIO]:
175
- """Download dataset data to bytes.
181
+ """Download data frame data to bytes.
176
182
 
177
- :param dataset: The dataset to download
178
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
183
+ :param data_frame: The data frame to download
184
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
179
185
  Use this to extend even further if streams are very large
180
- :return: An ordered list of BytesIO streams corresponding to a manifest item in the dataset
186
+ :return: An ordered list of BytesIO streams corresponding to a manifest item in the data frame
181
187
  :rtype: List[BytesIO]
182
188
  """
183
- if dataset.upload_status != FileStatusUploadStatus.SUCCEEDED:
184
- raise DatasetInProgressError(
185
- f"The dataset data cannot be downloaded until the status is {FileStatusUploadStatus.SUCCEEDED}. "
186
- f"The status of dataset {dataset.id} is {dataset.upload_status}"
189
+ if data_frame.upload_status != FileStatusUploadStatus.SUCCEEDED:
190
+ raise DataFrameInProgressError(
191
+ f"The data frame data cannot be downloaded until the status is {FileStatusUploadStatus.SUCCEEDED}. "
192
+ f"The status of data frame {data_frame.id} is {data_frame.upload_status}"
187
193
  )
188
- dataset_bytes = []
189
- for manifest_item in dataset.manifest:
194
+ data_frame_bytes = []
195
+ for manifest_item in data_frame.manifest:
190
196
  # This should be present based on the status check above. Assertion satisfies MyPy
191
- assert manifest_item.url is not None, f"Unable to download dataset {dataset.id}, URL was empty"
197
+ assert (
198
+ manifest_item.url is not None
199
+ ), f"Unable to download data frame {data_frame.id}, URL was empty"
192
200
  with httpx.stream("GET", manifest_item.url, timeout=timeout_seconds) as download_stream:
193
201
  target_bytes = BytesIO()
194
202
  for chunk in download_stream.iter_bytes():
195
203
  target_bytes.write(chunk)
196
204
  target_bytes.seek(0)
197
- dataset_bytes.append(target_bytes)
198
- return dataset_bytes
205
+ data_frame_bytes.append(target_bytes)
206
+ return data_frame_bytes
199
207
 
200
- def download_dataset_files(
208
+ def download_data_frame_files(
201
209
  self,
202
- dataset: Dataset,
210
+ data_frame: DataFrame,
203
211
  destination_path: Optional[Path] = None,
204
- timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET,
212
+ timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME,
205
213
  ) -> List[Path]:
206
- """Download dataset data to files.
214
+ """Download data frame data to files.
207
215
 
208
- :param dataset: The dataset to download
216
+ :param data_frame: The data frame to download
209
217
  :param destination_path: A target directory to place the files. File names will be created based on the manifest item file names.
210
218
  If not specified, a temp directory will be created. The caller is responsible for deleting this directory.
211
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
219
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
212
220
  Use this to extend even further if streams are very large
213
- :return: An ordered list of downloaded file paths corresponding to a manifest item in the dataset
221
+ :return: An ordered list of downloaded file paths corresponding to a manifest item in the data frame
214
222
  :rtype: List[Path]
215
223
  """
216
- dataset_files = []
224
+ data_frame_files = []
217
225
  if not destination_path:
218
226
  destination_path = Path(tempfile.mkdtemp())
219
227
  elif destination_path.is_file():
@@ -222,61 +230,63 @@ class V2BetaDatasetService(BaseService):
222
230
  )
223
231
  elif not destination_path.exists():
224
232
  raise NotADirectoryError(f"The destination path '{destination_path}' does not exist")
225
- if dataset.upload_status != FileStatusUploadStatus.SUCCEEDED:
226
- raise DatasetInProgressError(
227
- f"The dataset data cannot be downloaded until the status is {FileStatusUploadStatus.SUCCEEDED}. "
228
- f"The status of dataset {dataset.id} is {dataset.upload_status}"
233
+ if data_frame.upload_status != FileStatusUploadStatus.SUCCEEDED:
234
+ raise DataFrameInProgressError(
235
+ f"The data frame data cannot be downloaded until the status is {FileStatusUploadStatus.SUCCEEDED}. "
236
+ f"The status of data frame {data_frame.id} is {data_frame.upload_status}"
229
237
  )
230
- for manifest_item in dataset.manifest:
238
+ for manifest_item in data_frame.manifest:
231
239
  target_path = destination_path / manifest_item.file_name
232
- dataset_files.append(target_path)
240
+ data_frame_files.append(target_path)
233
241
  # This should be present based on the status check above. Assertion satisfies MyPy
234
- assert manifest_item.url is not None, f"Unable to download dataset {dataset.id}, URL was empty"
235
- with open(target_path, "wb") as dataset_handle:
242
+ assert (
243
+ manifest_item.url is not None
244
+ ), f"Unable to download data frame {data_frame.id}, URL was empty"
245
+ with open(target_path, "wb") as data_frame_handle:
236
246
  with httpx.stream("GET", manifest_item.url, timeout=timeout_seconds) as download_stream:
237
247
  for chunk in download_stream.iter_bytes():
238
- dataset_handle.write(chunk)
239
- return dataset_files
248
+ data_frame_handle.write(chunk)
249
+ return data_frame_files
240
250
 
241
251
  @api_method
242
- def download_dataset_bytes_by_id(
243
- self, dataset_id: str, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET
252
+ def download_data_frame_bytes_by_id(
253
+ self, data_frame_id: str, timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME
244
254
  ) -> List[BytesIO]:
245
- """Download dataset data to files by dataset_id.
255
+ """Download data frame data to files by data_frame_id.
246
256
 
247
- Fetches the dataset first, then downloads the files.
257
+ Fetches the data frame first, then downloads the files.
248
258
 
249
- :param dataset_id: The id of the dataset to download
250
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
259
+ :param data_frame_id: The id of the data frame to download
260
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
251
261
  Use this to extend even further if streams are very large
252
- :return: An ordered list of BytesIO streams corresponding to a manifest item in the dataset
262
+ :return: An ordered list of BytesIO streams corresponding to a manifest item in the data frame
253
263
  :rtype: List[BytesIO]
254
264
  """
255
- dataset = self.get_by_id(dataset_id=dataset_id)
256
- return self.download_dataset_bytes(dataset=dataset, timeout_seconds=timeout_seconds)
265
+ data_frame = self.get_by_id(data_frame_id=data_frame_id)
266
+ return self.download_data_frame_bytes(data_frame=data_frame, timeout_seconds=timeout_seconds)
257
267
 
258
268
  @api_method
259
- def download_dataset_files_by_id(
269
+ def download_data_frame_files_by_id(
260
270
  self,
261
- dataset_id: str,
271
+ data_frame_id: str,
262
272
  destination_path: Optional[Path] = None,
263
- timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATASET,
273
+ timeout_seconds: float = _DEFAULT_HTTP_TIMEOUT_UPLOAD_DATA_FRAME,
264
274
  ) -> List[Path]:
265
- """Download dataset data to files by dataset_id.
275
+ """Download data frame data to files by data_frame_id.
266
276
 
267
- Fetches the dataset first, then downloads the files.
277
+ Fetches the data frame first, then downloads the files.
268
278
 
269
- :param dataset_id: The id of the dataset to download
279
+ :param data_frame_id: The id of the data frame to download
270
280
  :param destination_path: A target directory to place the files. File names will be created based on the manifest item file names.
271
281
  If not specified, a temp directory will be created. The caller is responsible for deleting this directory.
272
- :param timeout_seconds: Extends the normal HTTP timeout settings since Dataset uploads can be large
282
+ :param timeout_seconds: Extends the normal HTTP timeout settings since DataFrame uploads can be large
273
283
  Use this to extend even further if streams are very large
274
- :return: An ordered list of downloaded file paths corresponding to a manifest item in the dataset
284
+ :return: An ordered list of downloaded file paths corresponding to a manifest item in the data frame
275
285
  :rtype: List[Path]
276
286
  """
277
- dataset = self.get_by_id(dataset_id=dataset_id)
278
- return self.download_dataset_files(
279
- dataset=dataset, destination_path=destination_path, timeout_seconds=timeout_seconds
287
+ data_frame = self.get_by_id(data_frame_id=data_frame_id)
288
+ return self.download_data_frame_files(
289
+ data_frame=data_frame, destination_path=destination_path, timeout_seconds=timeout_seconds
280
290
  )
281
291
 
282
292
 
@@ -7,7 +7,7 @@ from benchling_api_client.v2.stable.client import Client
7
7
  from benchling_sdk.helpers.client_helpers import v2_beta_client
8
8
  from benchling_sdk.helpers.retry_helpers import RetryStrategy
9
9
  from benchling_sdk.services.v2.base_service import BaseService
10
- from benchling_sdk.services.v2.beta.v2_beta_dataset_service import V2BetaDatasetService
10
+ from benchling_sdk.services.v2.beta.v2_beta_data_frame_service import V2BetaDataFrameService
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from benchling_sdk.services.v2.beta.v2_beta_aa_sequence_service import V2BetaAaSequenceService
@@ -37,7 +37,7 @@ class V2BetaService(BaseService):
37
37
  _app_service: Optional[V2BetaAppService]
38
38
  _collaboration_service: Optional[V2BetaCollaborationService]
39
39
  _custom_entity_service: Optional[V2BetaCustomEntityService]
40
- _dataset_service: Optional[V2BetaDatasetService]
40
+ _data_frame_service: Optional[V2BetaDataFrameService]
41
41
  _dna_oligo_service: Optional[V2BetaDnaOligoService]
42
42
  _dna_sequence_service: Optional[V2BetaDnaSequenceService]
43
43
  _entity_service: Optional[V2BetaEntityService]
@@ -61,7 +61,7 @@ class V2BetaService(BaseService):
61
61
  self._app_service = None
62
62
  self._collaboration_service = None
63
63
  self._custom_entity_service = None
64
- self._dataset_service = None
64
+ self._data_frame_service = None
65
65
  self._dna_sequence_service = None
66
66
  self._dna_oligo_service = None
67
67
  self._entity_service = None
@@ -137,19 +137,19 @@ class V2BetaService(BaseService):
137
137
  return self._custom_entity_service
138
138
 
139
139
  @property
140
- def datasets(self) -> V2BetaDatasetService:
140
+ def data_frames(self) -> V2BetaDataFrameService:
141
141
  """
142
- V2-Beta Datasets.
142
+ V2-Beta DataFrames.
143
143
 
144
- Datasets are Benchling objects that represent tabular data with typed columns and rows of data.
144
+ DataFrames are Benchling objects that represent tabular data with typed columns and rows of data.
145
145
 
146
- See https://benchling.com/api/v2-beta/reference#/Datasets
146
+ See https://benchling.com/api/v2-beta/reference#/Data%20Frames
147
147
  """
148
- if self._dataset_service is None:
149
- from benchling_sdk.services.v2.beta.v2_beta_dataset_service import V2BetaDatasetService
148
+ if self._data_frame_service is None:
149
+ from benchling_sdk.services.v2.beta.v2_beta_data_frame_service import V2BetaDataFrameService
150
150
 
151
- self._dataset_service = V2BetaDatasetService(self._beta_client, self.retry_strategy)
152
- return self._dataset_service
151
+ self._data_frame_service = V2BetaDataFrameService(self._beta_client, self.retry_strategy)
152
+ return self._data_frame_service
153
153
 
154
154
  @property
155
155
  def dna_oligos(self) -> V2BetaDnaOligoService:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "benchling-sdk"
3
- version = "1.10.0a9" # NOTE: This version number is ignored and does not correspond to releases (see README)
3
+ version = "1.10.0a11" # NOTE: This version number is ignored and does not correspond to releases (see README)
4
4
  description = "SDK for interacting with the Benchling Platform."
5
5
  authors = ["Benchling Support <support@benchling.com>"]
6
6
  packages = [{include = "benchling_sdk"}]
@@ -28,7 +28,7 @@ PyYAML = "^6.0"
28
28
  # See issue: https://github.com/giampaolo/psutil/issues/2165
29
29
  psutil = {version = "^5.9.4", python = "^3.11" }
30
30
  jwcrypto = "^1.4.2"
31
- benchling-api-client = "2.0.243"
31
+ benchling-api-client = "2.0.244"
32
32
  # Minimum version due to vulnerability in 2022.9.24
33
33
  certifi = ">=2022.12.7"
34
34
  # Cryptography extras - see ExtrasPackage.CRYPTOGRAPHY