benchling-sdk 1.19.0__tar.gz → 1.21.0__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 (125) hide show
  1. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/PKG-INFO +3 -4
  2. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/canvas/errors.py +6 -0
  3. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/canvas/framework.py +30 -10
  4. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/helpers/webhook_helpers.py +15 -10
  5. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/auth/client_credentials_oauth2.py +1 -1
  6. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/aa_sequence_service.py +1 -1
  7. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/app_service.py +2 -2
  8. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/assay_result_service.py +1 -1
  9. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/assay_run_service.py +3 -3
  10. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/codon_usage_table_service.py +1 -1
  11. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/custom_entity_service.py +1 -1
  12. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/dna_alignments_service.py +1 -1
  13. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/dna_oligo_service.py +1 -1
  14. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/dna_sequence_service.py +1 -1
  15. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/enzyme_service.py +1 -1
  16. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/event_service.py +1 -1
  17. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/feature_library_service.py +2 -2
  18. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/lab_automation_service.py +3 -3
  19. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/mixture_service.py +1 -1
  20. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/molecule_service.py +1 -1
  21. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/monomer_service.py +1 -1
  22. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +1 -1
  23. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/oligo_service.py +1 -1
  24. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/request_service.py +2 -2
  25. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/rna_oligo_service.py +1 -1
  26. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/rna_sequence_service.py +1 -1
  27. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/workflow_flowchart_service.py +1 -1
  28. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/workflow_output_service.py +1 -1
  29. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/workflow_task_group_service.py +1 -1
  30. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/workflow_task_service.py +1 -1
  31. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/pyproject.toml +5 -5
  32. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/LICENSE +0 -0
  33. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/README.md +0 -0
  34. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/__init__.py +0 -0
  35. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/__init__.py +0 -0
  36. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/canvas/__init__.py +0 -0
  37. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/canvas/types.py +0 -0
  38. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/__init__.py +0 -0
  39. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/cryptography_helpers.py +0 -0
  40. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/decryption_provider.py +0 -0
  41. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/errors.py +0 -0
  42. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/framework.py +0 -0
  43. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/helpers.py +0 -0
  44. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/mock_config.py +0 -0
  45. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/config/types.py +0 -0
  46. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/framework.py +0 -0
  47. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/helpers/__init__.py +0 -0
  48. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/helpers/manifest_helpers.py +0 -0
  49. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/status/__init__.py +0 -0
  50. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/status/errors.py +0 -0
  51. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/status/framework.py +0 -0
  52. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/status/helpers.py +0 -0
  53. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/status/types.py +0 -0
  54. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/apps/types.py +0 -0
  55. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/auth/__init__.py +0 -0
  56. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/auth/api_key_auth.py +0 -0
  57. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/auth/bearer_token_auth.py +0 -0
  58. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/benchling.py +0 -0
  59. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/docs/__init__.py +0 -0
  60. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/docs/__main__.py +0 -0
  61. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/errors.py +0 -0
  62. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/__init__.py +0 -0
  63. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/client_helpers.py +0 -0
  64. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/constants.py +0 -0
  65. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/decorators.py +0 -0
  66. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/file_helpers.py +0 -0
  67. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/logging_helpers.py +0 -0
  68. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/package_helpers.py +0 -0
  69. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/pagination_helpers.py +0 -0
  70. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/response_helpers.py +0 -0
  71. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/retry_helpers.py +0 -0
  72. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/serialization_helpers.py +0 -0
  73. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/task_helpers.py +0 -0
  74. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/helpers/transaction_manager.py +0 -0
  75. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/models/__init__.py +0 -0
  76. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/models/webhooks/__init__.py +0 -0
  77. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/models/webhooks/v0/__init__.py +0 -0
  78. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/py.typed +0 -0
  79. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/__init__.py +0 -0
  80. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/__init__.py +0 -0
  81. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/alpha/__init__.py +0 -0
  82. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/alpha/v2_alpha_app_service.py +0 -0
  83. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/alpha/v2_alpha_assembly_service.py +0 -0
  84. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/base_service.py +0 -0
  85. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/__init__.py +0 -0
  86. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_analysis_service.py +0 -0
  87. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_app_definition_service.py +0 -0
  88. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_app_service.py +0 -0
  89. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_audit_service.py +0 -0
  90. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_collaboration_service.py +0 -0
  91. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_data_frame_service.py +0 -0
  92. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_entry_service.py +0 -0
  93. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_folder_service.py +0 -0
  94. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_project_service.py +0 -0
  95. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/beta/v2_beta_worklist_service.py +0 -0
  96. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/__init__.py +0 -0
  97. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/api_service.py +0 -0
  98. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/blob_service.py +0 -0
  99. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/box_service.py +0 -0
  100. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/container_service.py +0 -0
  101. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/custom_notation_service.py +0 -0
  102. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/dropdown_service.py +0 -0
  103. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/entity_service.py +0 -0
  104. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/entry_service.py +0 -0
  105. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/export_service.py +0 -0
  106. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/folder_service.py +0 -0
  107. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/instrument_query_service.py +0 -0
  108. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/inventory_service.py +0 -0
  109. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/label_template_service.py +0 -0
  110. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/location_service.py +0 -0
  111. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/organization_service.py +0 -0
  112. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/plate_service.py +0 -0
  113. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/printer_service.py +0 -0
  114. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/project_service.py +0 -0
  115. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/registry_service.py +0 -0
  116. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/schema_service.py +0 -0
  117. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/task_service.py +0 -0
  118. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/team_service.py +0 -0
  119. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/user_service.py +0 -0
  120. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/warehouse_service.py +0 -0
  121. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/stable/workflow_flowchart_config_version_service.py +0 -0
  122. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/v2_alpha_service.py +0 -0
  123. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/v2_beta_service.py +0 -0
  124. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2/v2_stable_service.py +0 -0
  125. {benchling_sdk-1.19.0 → benchling_sdk-1.21.0}/benchling_sdk/services/v2_service.py +0 -0
@@ -1,14 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: benchling-sdk
3
- Version: 1.19.0
3
+ Version: 1.21.0
4
4
  Summary: SDK for interacting with the Benchling Platform.
5
5
  License: Apache-2.0
6
6
  Author: Benchling Support
7
7
  Author-email: support@benchling.com
8
- Requires-Python: >=3.8,<4.0
8
+ Requires-Python: >=3.9,<4.0
9
9
  Classifier: License :: OSI Approved :: Apache Software License
10
10
  Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.8
12
11
  Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
@@ -17,7 +16,7 @@ Provides-Extra: python-jose
17
16
  Requires-Dist: PyYAML (>=6.0,<7.0)
18
17
  Requires-Dist: attrs (>=20.1.0)
19
18
  Requires-Dist: backoff (>=1.10.0,<3)
20
- Requires-Dist: benchling-api-client (==2.0.338)
19
+ Requires-Dist: benchling-api-client (==2.0.342)
21
20
  Requires-Dist: certifi (>=2022.12.7)
22
21
  Requires-Dist: cryptography (>=42.0.0) ; extra == "cryptography"
23
22
  Requires-Dist: dataclasses-json (>=0.5.2,<0.6.0)
@@ -12,3 +12,9 @@ class NoMatchingBlocksError(Exception):
12
12
  """
13
13
 
14
14
  pass
15
+
16
+
17
+ class MissingResourceIdError(Exception):
18
+ """Error indicating that a resource ID was expected to be present for the operation."""
19
+
20
+ pass
@@ -4,8 +4,13 @@ import json
4
4
  from typing import cast, Dict, Generic, List, Optional, Protocol, Set, Type, TypeVar, Union
5
5
 
6
6
  from benchling_api_client.v2.extensions import UnknownType
7
+ from benchling_api_client.v2.stable.types import UNSET, Unset
7
8
 
8
- from benchling_sdk.apps.canvas.errors import DuplicateBlockIdError, NoMatchingBlocksError
9
+ from benchling_sdk.apps.canvas.errors import (
10
+ DuplicateBlockIdError,
11
+ MissingResourceIdError,
12
+ NoMatchingBlocksError,
13
+ )
9
14
  from benchling_sdk.apps.canvas.types import (
10
15
  _UI_BLOCK_MAPPINGS_CREATE,
11
16
  _UI_BLOCK_MAPPINGS_UPDATE,
@@ -359,12 +364,13 @@ class CanvasBuilder:
359
364
  """
360
365
 
361
366
  _source_canvas: AppCanvas
367
+ _resource_id: str | Unset
362
368
 
363
369
  def __init__(
364
370
  self,
365
371
  app_id: str,
366
372
  feature_id: str,
367
- resource_id: str,
373
+ resource_id: Optional[str] = None,
368
374
  enabled: bool = True,
369
375
  session_id: Optional[str] = None,
370
376
  blocks: Optional[List[UiBlock]] = None,
@@ -378,12 +384,17 @@ class CanvasBuilder:
378
384
  self._source_canvas = AppCanvas(
379
385
  app=AppCanvasApp(id=app_id),
380
386
  feature_id=feature_id,
381
- resource_id=resource_id,
382
387
  enabled=enabled,
383
388
  session_id=session_id,
384
389
  blocks=blocks if blocks else [],
385
390
  data=json.dumps(data) if data is not None else None,
386
391
  )
392
+ self._resource_id = resource_id if resource_id is not None else UNSET
393
+
394
+ @property
395
+ def resource_id(self):
396
+ """Returns the underlying resource_id of this CanvasBuilder."""
397
+ return self._resource_id if self._resource_id is not UNSET else None
387
398
 
388
399
  @classmethod
389
400
  def from_canvas(cls, canvas: AppCanvas) -> CanvasBuilder:
@@ -407,7 +418,7 @@ class CanvasBuilder:
407
418
  return CanvasBuilder(
408
419
  app_id=self._source_canvas.app.id,
409
420
  feature_id=self._source_canvas.feature_id,
410
- resource_id=self._source_canvas.resource_id,
421
+ resource_id=self.resource_id,
411
422
  enabled=value,
412
423
  session_id=self._source_canvas.session_id,
413
424
  blocks=self._source_canvas.blocks,
@@ -432,7 +443,7 @@ class CanvasBuilder:
432
443
  return CanvasBuilder(
433
444
  app_id=self._source_canvas.app.id,
434
445
  feature_id=self._source_canvas.feature_id,
435
- resource_id=self._source_canvas.resource_id,
446
+ resource_id=self.resource_id,
436
447
  enabled=self._source_canvas.enabled,
437
448
  session_id=self._source_canvas.session_id,
438
449
  blocks=new_blocks,
@@ -448,7 +459,7 @@ class CanvasBuilder:
448
459
  return CanvasBuilder(
449
460
  app_id=self._source_canvas.app.id,
450
461
  feature_id=self._source_canvas.feature_id,
451
- resource_id=self._source_canvas.resource_id,
462
+ resource_id=self.resource_id,
452
463
  enabled=self._source_canvas.enabled,
453
464
  session_id=self._source_canvas.session_id,
454
465
  blocks=self._source_canvas.blocks,
@@ -464,7 +475,7 @@ class CanvasBuilder:
464
475
  return CanvasBuilder(
465
476
  app_id=self._source_canvas.app.id,
466
477
  feature_id=self._source_canvas.feature_id,
467
- resource_id=self._source_canvas.resource_id,
478
+ resource_id=self.resource_id,
468
479
  enabled=self._source_canvas.enabled,
469
480
  session_id=session_id,
470
481
  blocks=self._source_canvas.blocks,
@@ -594,7 +605,7 @@ class CanvasBuilder:
594
605
  """Return an AppCanvasUpdate API model from the current state of the canvas managed by CanvasBuilder."""
595
606
  return AppCanvasUpdate(
596
607
  feature_id=self._source_canvas.feature_id,
597
- resource_id=self._source_canvas.resource_id,
608
+ resource_id=self._resource_id,
598
609
  enabled=self._source_canvas.enabled,
599
610
  session_id=self._source_canvas.session_id,
600
611
  blocks=[_ui_block_to_update(block) for block in self._source_canvas.blocks],
@@ -602,11 +613,20 @@ class CanvasBuilder:
602
613
  )
603
614
 
604
615
  def to_create(self) -> AppCanvasCreate:
605
- """Return an AppCanvasCreate API model from the current state of the canvas managed by CanvasBuilder."""
616
+ """
617
+ Return an AppCanvasCreate API model from the current state of the canvas managed by CanvasBuilder.
618
+
619
+ Raise MissingResourceIdError if the current state of the canvas managed by CanvasBuilder does not include
620
+ a resource ID. Without a resource ID indicating the Benchling object on which to place the new canvas,
621
+ canvas creation is underspecified and cannot be completed successfully.
622
+ """
623
+ if self.resource_id is None:
624
+ raise MissingResourceIdError
625
+
606
626
  return AppCanvasCreate(
607
627
  app_id=self._source_canvas.app.id,
608
628
  feature_id=self._source_canvas.feature_id,
609
- resource_id=self._source_canvas.resource_id,
629
+ resource_id=self.resource_id,
610
630
  enabled=self._source_canvas.enabled,
611
631
  session_id=self._source_canvas.session_id,
612
632
  blocks=[_ui_block_to_create(block) for block in self._source_canvas.blocks],
@@ -1,6 +1,6 @@
1
1
  import base64
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import cast, List, Protocol, Union
3
+ from typing import Any, cast, List, Mapping, Optional, Protocol, Union
4
4
 
5
5
  from benchling_api_client.v2.benchling_client import BenchlingApiClient
6
6
  import httpx
@@ -93,7 +93,7 @@ def _production_webhook_jwks(app_definition_id: str) -> str:
93
93
  def _retrieve_jwks(
94
94
  app_installation_or_definition_id: str,
95
95
  jwk_url_provider: Union[JwkUrlProvider, LegacyJwkUrlProvider],
96
- httpx_client: httpx.Client = None,
96
+ httpx_client: Optional[httpx.Client] = None,
97
97
  ):
98
98
  if httpx_client is None:
99
99
  httpx_client = _default_httpx_webhook_client()
@@ -106,8 +106,8 @@ def _retrieve_jwks(
106
106
 
107
107
  def jwks_by_app(
108
108
  app_id: str,
109
- httpx_client: httpx.Client = None,
110
- jwk_url_provider: LegacyJwkUrlProvider = None,
109
+ httpx_client: Optional[httpx.Client] = None,
110
+ jwk_url_provider: Optional[LegacyJwkUrlProvider] = None,
111
111
  ) -> jwk.JWKSet:
112
112
  """
113
113
  Get JWKs by App (Deprecated).
@@ -128,8 +128,8 @@ def jwks_by_app(
128
128
 
129
129
  def jwks_by_app_definition(
130
130
  app_definition_id: str,
131
- httpx_client: httpx.Client = None,
132
- jwk_url_provider: JwkUrlProvider = None,
131
+ httpx_client: Optional[httpx.Client] = None,
132
+ jwk_url_provider: Optional[JwkUrlProvider] = None,
133
133
  ) -> jwk.JWKSet:
134
134
  """
135
135
  Get JWKs for a Benchling App from its global app_definition_id.
@@ -146,7 +146,7 @@ def jwks_by_app_definition(
146
146
 
147
147
 
148
148
  def verify_app_installation(
149
- app_id: str, data: str, headers: dict, jwk_function: LegacyGetJwksFunction = None
149
+ app_id: str, data: str, headers: Mapping[str, Any], jwk_function: Optional[LegacyGetJwksFunction] = None
150
150
  ) -> None:
151
151
  """
152
152
  Verify a webhook for an app installation (Deprecated).
@@ -162,7 +162,12 @@ def verify_app_installation(
162
162
  _verify(app_id, data, headers, jwk_function)
163
163
 
164
164
 
165
- def verify(app_definition_id: str, data: str, headers: dict, jwk_function: GetJwksFunction = None) -> None:
165
+ def verify(
166
+ app_definition_id: str,
167
+ data: str,
168
+ headers: Mapping[str, Any],
169
+ jwk_function: Optional[GetJwksFunction] = None,
170
+ ) -> None:
166
171
  """
167
172
  Verify a webhook for a Benchling App from its global app_definition_id.
168
173
 
@@ -196,7 +201,7 @@ def _has_valid_signature(to_verify: str, jwks: jwk.JWKSet, encoded_signatures: L
196
201
  def _verify(
197
202
  app_installation_or_definition_id: str,
198
203
  data: str,
199
- headers: dict,
204
+ headers: Mapping[str, Any],
200
205
  jwk_function: Union[GetJwksFunction, LegacyGetJwksFunction],
201
206
  ) -> None:
202
207
  _verify_headers_present(headers)
@@ -226,7 +231,7 @@ def _der_signatures_from_versioned_signatures(versioned_signatures: str) -> List
226
231
  return der_signatures
227
232
 
228
233
 
229
- def _verify_headers_present(headers: dict) -> None:
234
+ def _verify_headers_present(headers: Mapping[str, Any]) -> None:
230
235
  """
231
236
  Verify Headers Present.
232
237
 
@@ -70,7 +70,7 @@ class ClientCredentialsOAuth2(AuthorizationMethod):
70
70
  self,
71
71
  client_id: str,
72
72
  client_secret: str,
73
- token_url: str = None,
73
+ token_url: Optional[str] = None,
74
74
  httpx_client: Optional[httpx.Client] = None,
75
75
  ):
76
76
  """
@@ -111,7 +111,7 @@ class AaSequenceService(BaseService):
111
111
  creator_ids: Optional[Iterable[str]] = None,
112
112
  sort: Optional[ListAASequencesSort] = None,
113
113
  page_size: Optional[int] = None,
114
- next_token: NextToken = None,
114
+ next_token: Optional[NextToken] = None,
115
115
  author_idsany_of: Optional[Iterable[str]] = None,
116
116
  returning: Optional[Iterable[str]] = None,
117
117
  ) -> Response[AaSequencesPaginatedList]:
@@ -389,7 +389,7 @@ class AppService(BaseService):
389
389
  enabled: Optional[ListAppCanvasesEnabled] = None,
390
390
  archive_reason: Optional[str] = None,
391
391
  sort: Optional[Union[str, ListAppCanvasesSort]] = None,
392
- next_token: NextToken = None,
392
+ next_token: Optional[NextToken] = None,
393
393
  page_size: Optional[int] = None,
394
394
  ) -> Response[AppCanvasesPaginatedList]:
395
395
  response = list_app_canvases.sync_detailed(
@@ -555,7 +555,7 @@ class AppService(BaseService):
555
555
  modified_at_gte: Optional[datetime] = None,
556
556
  sort: Optional[ListAppSessionsSort] = None,
557
557
  returning: Optional[Iterable[str]] = None,
558
- next_token: NextToken = None,
558
+ next_token: Optional[NextToken] = None,
559
559
  page_size: Optional[int] = None,
560
560
  ) -> Response[AppSessionsPaginatedList]:
561
561
  response = list_app_sessions.sync_detailed(
@@ -71,7 +71,7 @@ class AssayResultService(BaseService):
71
71
  max_created_time: Optional[int] = None,
72
72
  entity_ids: Optional[Iterable[str]] = None,
73
73
  assay_run_ids: Optional[Iterable[str]] = None,
74
- next_token: NextToken = None,
74
+ next_token: Optional[NextToken] = None,
75
75
  page_size: Optional[int] = None,
76
76
  ids: Optional[Iterable[str]] = None,
77
77
  storage_ids: Optional[Iterable[str]] = None,
@@ -67,7 +67,7 @@ class AssayRunService(BaseService):
67
67
  schema_id: str,
68
68
  min_created_time: Optional[int] = None,
69
69
  max_created_time: Optional[int] = None,
70
- next_token: NextToken = None,
70
+ next_token: Optional[NextToken] = None,
71
71
  page_size: Optional[int] = None,
72
72
  ids: Optional[Iterable[str]] = None,
73
73
  ) -> Response[AssayRunsPaginatedList]:
@@ -152,7 +152,7 @@ class AssayRunService(BaseService):
152
152
  self,
153
153
  assay_run_id: str,
154
154
  modified_at: Optional[str] = None,
155
- next_token: NextToken = None,
155
+ next_token: Optional[NextToken] = None,
156
156
  ) -> Response[AutomationFileInputsPaginatedList]:
157
157
  response = list_automation_input_generators.sync_detailed(
158
158
  client=self.client,
@@ -186,7 +186,7 @@ class AssayRunService(BaseService):
186
186
  def _automation_output_processors_page(
187
187
  self,
188
188
  assay_run_id: str,
189
- next_token: NextToken = None,
189
+ next_token: Optional[NextToken] = None,
190
190
  ) -> Response[AutomationOutputProcessorsPaginatedList]:
191
191
  """Deprecated in favor of lab_automation.automation_output_processors."""
192
192
  log_deprecation(
@@ -30,7 +30,7 @@ class CodonUsageTableService(BaseService):
30
30
  name_includes: Optional[str] = None,
31
31
  names_any_of: Optional[Iterable[str]] = [],
32
32
  page_size: Optional[int] = None,
33
- next_token: NextToken = None,
33
+ next_token: Optional[NextToken] = None,
34
34
  ) -> Response[CodonUsageTablesPaginatedList]:
35
35
  response = list_codon_usage_tables.sync_detailed(
36
36
  client=self.client,
@@ -93,7 +93,7 @@ class CustomEntityService(BaseService):
93
93
  creator_ids: Optional[Iterable[str]] = None,
94
94
  schema_fields: Optional[Dict[str, Any]] = None,
95
95
  page_size: Optional[int] = None,
96
- next_token: NextToken = None,
96
+ next_token: Optional[NextToken] = None,
97
97
  author_idsany_of: Optional[Iterable[str]] = None,
98
98
  returning: Optional[Iterable[str]] = None,
99
99
  ) -> Response[CustomEntitiesPaginatedList]:
@@ -66,7 +66,7 @@ class DnaAlignmentsService(BaseService):
66
66
  sequence_ids: Optional[List[str]] = None,
67
67
  sort: Optional[ListDNAAlignmentsSort] = None,
68
68
  page_size: Optional[int] = None,
69
- next_token: NextToken = None,
69
+ next_token: Optional[NextToken] = None,
70
70
  ) -> Response[DnaAlignmentsPaginatedList]:
71
71
  response = list_dna_alignments.sync_detailed(
72
72
  client=self.client,
@@ -89,7 +89,7 @@ class DnaOligoService(BaseService):
89
89
  schema_fields: Optional[Dict[str, Any]] = None,
90
90
  creator_ids: Optional[Iterable[str]] = None,
91
91
  page_size: Optional[int] = None,
92
- next_token: NextToken = None,
92
+ next_token: Optional[NextToken] = None,
93
93
  author_idsany_of: Optional[Iterable[str]] = None,
94
94
  returning: Optional[Iterable[str]] = None,
95
95
  custom_notation_id: Optional[str] = None,
@@ -109,7 +109,7 @@ class DnaSequenceService(BaseService):
109
109
  creator_ids: Optional[Iterable[str]] = None,
110
110
  schema_fields: Optional[Dict[str, Any]] = None,
111
111
  page_size: Optional[int] = None,
112
- next_token: NextToken = None,
112
+ next_token: Optional[NextToken] = None,
113
113
  author_idsany_of: Optional[Iterable[str]] = None,
114
114
  returning: Optional[Iterable[str]] = None,
115
115
  ) -> Response[DnaSequencesPaginatedList]:
@@ -29,7 +29,7 @@ class EnzymeService(BaseService):
29
29
  name_includes: Optional[str] = None,
30
30
  names_any_of: Optional[Iterable[str]] = [],
31
31
  page_size: Optional[int] = None,
32
- next_token: NextToken = None,
32
+ next_token: Optional[NextToken] = None,
33
33
  ) -> Response[EnzymesPaginatedList]:
34
34
  response = list_enzymes.sync_detailed(
35
35
  client=self.client,
@@ -29,7 +29,7 @@ class EventService(BaseService):
29
29
  event_types: Optional[str] = None,
30
30
  poll: Optional[bool] = None,
31
31
  page_size: Optional[int] = None,
32
- next_token: NextToken = None,
32
+ next_token: Optional[NextToken] = None,
33
33
  ) -> Response[EventsPaginatedList]:
34
34
  response = list_events.sync_detailed(
35
35
  client=self.client,
@@ -73,7 +73,7 @@ class FeatureLibraryService(BaseService):
73
73
  sort: Optional[ListFeatureLibrariesSort] = None,
74
74
  page_size: Optional[int] = None,
75
75
  returning: Optional[Iterable[str]] = None,
76
- next_token: NextToken = None,
76
+ next_token: Optional[NextToken] = None,
77
77
  ) -> Response[FeatureLibrariesPaginatedList]:
78
78
  response = list_feature_libraries.sync_detailed(
79
79
  client=self.client,
@@ -166,7 +166,7 @@ class FeatureLibraryService(BaseService):
166
166
  def _features_page(
167
167
  self,
168
168
  page_size: Optional[int] = None,
169
- next_token: NextToken = None,
169
+ next_token: Optional[NextToken] = None,
170
170
  name: Optional[str] = None,
171
171
  ids: Optional[Iterable[str]] = None,
172
172
  namesany_ofcase_sensitive: Optional[Iterable[str]] = None,
@@ -131,7 +131,7 @@ class LabAutomationService(BaseService):
131
131
  automation_file_config_name: Optional[str],
132
132
  archive_reason: Optional[str],
133
133
  modified_at: Optional[str],
134
- next_token: NextToken = None,
134
+ next_token: Optional[NextToken] = None,
135
135
  ) -> Response[AutomationOutputProcessorsPaginatedList]:
136
136
  response = list_automation_output_processors.sync_detailed(
137
137
  client=self.client,
@@ -147,8 +147,8 @@ class LabAutomationService(BaseService):
147
147
  def automation_output_processors(
148
148
  self,
149
149
  assay_run_id: str,
150
- automation_file_config_name: str = None,
151
- archive_reason: str = None,
150
+ automation_file_config_name: Optional[str] = None,
151
+ archive_reason: Optional[str] = None,
152
152
  modified_at: Optional[str] = None,
153
153
  ) -> PageIterator[AutomationOutputProcessor]:
154
154
  """
@@ -83,7 +83,7 @@ class MixtureService(BaseService):
83
83
  names_any_of_case_sensitive: Optional[Iterable[str]] = None,
84
84
  schema_fields: Optional[Dict[str, Any]] = None,
85
85
  page_size: Optional[int] = None,
86
- next_token: NextToken = None,
86
+ next_token: Optional[NextToken] = None,
87
87
  author_idsany_of: Optional[Iterable[str]] = None,
88
88
  ) -> Response[MixturesPaginatedList]:
89
89
  response = list_mixtures.sync_detailed(
@@ -84,7 +84,7 @@ class MoleculeService(BaseService):
84
84
  names_any_of: Optional[Iterable[str]] = None,
85
85
  schema_fields: Optional[Dict[str, Any]] = None,
86
86
  page_size: Optional[int] = None,
87
- next_token: NextToken = None,
87
+ next_token: Optional[NextToken] = None,
88
88
  author_idsany_of: Optional[Iterable[str]] = None,
89
89
  chemical_substructuremol: Optional[str] = None,
90
90
  chemical_substructuresmiles: Optional[str] = None,
@@ -41,7 +41,7 @@ class MonomerService(BaseService):
41
41
  def _list_page(
42
42
  self,
43
43
  page_size: Optional[int] = None,
44
- next_token: NextToken = None,
44
+ next_token: Optional[NextToken] = None,
45
45
  returning: Optional[Iterable[str]] = None,
46
46
  ) -> Response[MonomersPaginatedList]:
47
47
  response = list_monomers.sync_detailed(
@@ -58,7 +58,7 @@ class NucleotideAlignmentsService(BaseService):
58
58
  sequence_ids: Optional[List[str]] = None,
59
59
  sort: Optional[ListNucleotideAlignmentsSort] = None,
60
60
  page_size: Optional[int] = None,
61
- next_token: NextToken = None,
61
+ next_token: Optional[NextToken] = None,
62
62
  ) -> Response[NucleotideAlignmentsPaginatedList]:
63
63
  response = list_nucleotide_alignments.sync_detailed(
64
64
  client=self.client,
@@ -95,7 +95,7 @@ class OligoService(BaseService):
95
95
  schema_fields: Optional[Dict[str, Any]] = None,
96
96
  creator_ids: Optional[Iterable[str]] = None,
97
97
  page_size: Optional[int] = None,
98
- next_token: NextToken = None,
98
+ next_token: Optional[NextToken] = None,
99
99
  returning: Optional[Iterable[str]] = None,
100
100
  ) -> Response[OligosPaginatedList]:
101
101
  """Deprecate in favor of dna_oligos._dna_oligos_page or rna_oligos._rna_oligos_page."""
@@ -69,7 +69,7 @@ class RequestService(BaseService):
69
69
  request_status: Optional[RequestStatus] = None,
70
70
  min_created_time: Optional[int] = None,
71
71
  max_created_time: Optional[int] = None,
72
- next_token: NextToken = None,
72
+ next_token: Optional[NextToken] = None,
73
73
  page_size: Optional[int] = None,
74
74
  returning: Optional[Iterable[str]] = None,
75
75
  ) -> Response[RequestsPaginatedList]:
@@ -201,7 +201,7 @@ class RequestService(BaseService):
201
201
  self,
202
202
  entry_id: str,
203
203
  modified_at: Optional[str] = None,
204
- next_token: NextToken = None,
204
+ next_token: Optional[NextToken] = None,
205
205
  page_size: Optional[int] = None,
206
206
  ) -> Response[RequestFulfillmentsPaginatedList]:
207
207
  response = list_request_fulfillments.sync_detailed(
@@ -98,7 +98,7 @@ class RnaOligoService(BaseService):
98
98
  schema_fields: Optional[Dict[str, Any]] = None,
99
99
  creator_ids: Optional[Iterable[str]] = None,
100
100
  page_size: Optional[int] = None,
101
- next_token: NextToken = None,
101
+ next_token: Optional[NextToken] = None,
102
102
  author_idsany_of: Optional[Iterable[str]] = None,
103
103
  returning: Optional[Iterable[str]] = None,
104
104
  custom_notation_id: Optional[str] = None,
@@ -104,7 +104,7 @@ class RnaSequenceService(BaseService):
104
104
  creator_ids: Optional[Iterable[str]] = None,
105
105
  schema_fields: Optional[Dict[str, Any]] = None,
106
106
  page_size: Optional[int] = None,
107
- next_token: NextToken = None,
107
+ next_token: Optional[NextToken] = None,
108
108
  author_idsany_of: Optional[Iterable[str]] = None,
109
109
  returning: Optional[Iterable[str]] = None,
110
110
  custom_notation_id: Optional[str] = None,
@@ -44,7 +44,7 @@ class WorkflowFlowchartService(BaseService):
44
44
  ids: Optional[Iterable[str]] = None,
45
45
  created_at: Optional[datetime.date] = None,
46
46
  page_size: Optional[int] = None,
47
- next_token: NextToken = None,
47
+ next_token: Optional[NextToken] = None,
48
48
  ) -> Response[WorkflowFlowchartPaginatedList]:
49
49
  response = list_workflow_flowcharts.sync_detailed(
50
50
  client=self.client,
@@ -81,7 +81,7 @@ class WorkflowOutputService(BaseService):
81
81
  linked_item_ids_none_of: Optional[Iterable[str]] = None,
82
82
  archive_reason: Optional[str] = None,
83
83
  page_size: Optional[int] = None,
84
- next_token: NextToken = None,
84
+ next_token: Optional[NextToken] = None,
85
85
  ) -> Response[WorkflowOutputsPaginatedList]:
86
86
  response = list_workflow_outputs.sync_detailed(
87
87
  client=self.client,
@@ -70,7 +70,7 @@ class WorkflowTaskGroupService(BaseService):
70
70
  display_ids: Optional[Iterable[str]] = None,
71
71
  archive_reason: Optional[str] = None,
72
72
  page_size: Optional[int] = None,
73
- next_token: NextToken = None,
73
+ next_token: Optional[NextToken] = None,
74
74
  ) -> Response[WorkflowTaskGroupsPaginatedList]:
75
75
  response = list_workflow_task_groups.sync_detailed(
76
76
  client=self.client,
@@ -92,7 +92,7 @@ class WorkflowTaskService(BaseService):
92
92
  linked_item_ids_none_of: Optional[Iterable[str]] = None,
93
93
  archive_reason: Optional[str] = None,
94
94
  page_size: Optional[int] = None,
95
- next_token: NextToken = None,
95
+ next_token: Optional[NextToken] = None,
96
96
  ) -> Response[WorkflowTasksPaginatedList]:
97
97
  response = list_workflow_tasks.sync_detailed(
98
98
  client=self.client,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "benchling-sdk"
3
- version = "1.19.0" # NOTE: This version number is ignored and does not correspond to releases (see README)
3
+ version = "1.21.0" # 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"}]
@@ -18,7 +18,7 @@ testpaths = [
18
18
  ]
19
19
 
20
20
  [tool.poetry.dependencies]
21
- python = "^3.8"
21
+ python = "^3.9"
22
22
  backoff = ">=1.10.0, <3"
23
23
  dataclasses-json = "^0.5.2"
24
24
  httpx = ">=0.23.0"
@@ -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.5.1"
31
- benchling-api-client = "2.0.338"
31
+ benchling-api-client = "2.0.342"
32
32
  # Minimum version due to vulnerability in 2022.9.24
33
33
  certifi = ">=2022.12.7"
34
34
  # Cryptography extras - see ExtrasPackage.CRYPTOGRAPHY
@@ -48,7 +48,7 @@ black = "^22.3.0"
48
48
  isort = "^5.10.1"
49
49
  pre-commit = "^2.6.0"
50
50
  ipython = "^7.16.1"
51
- mypy = "^0.960"
51
+ mypy = "^1.13"
52
52
  flake8 = "^3.8.3"
53
53
  taskipy = "^1.6.0"
54
54
  Jinja2 = "^3.1.2"
@@ -70,7 +70,7 @@ botocore-stubs = "1.28.4"
70
70
  # Used by flake8, version pinning is because v5 removes a deprecated call flake is currently using.
71
71
  importlib-metadata = "^4.13.0"
72
72
  sphinx-multiversion-pre-post-build = "^0.2.4"
73
- time-machine = "^2.8.2"
73
+ time-machine = "^2.15.0" # change to >=2.15.0 once we drop Python 3.8 support
74
74
  python-jose = "^3.3.0"
75
75
  gitpython = "^3.1.31"
76
76
  pytest-rerunfailures = "^12.0"
File without changes
File without changes