benchling-sdk 1.10.0a5__tar.gz → 1.10.0a7__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 (122) hide show
  1. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/PKG-INFO +2 -2
  2. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/canvas/framework.py +34 -0
  3. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/decryption_provider.py +0 -3
  4. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/framework.py +12 -11
  5. benchling_sdk-1.10.0a5/benchling_sdk/apps/helpers/config_helpers.py → benchling_sdk-1.10.0a7/benchling_sdk/apps/config/helpers.py +16 -97
  6. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/mock_config.py +68 -68
  7. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/status/framework.py +1 -21
  8. benchling_sdk-1.10.0a7/benchling_sdk/apps/status/helpers.py +20 -0
  9. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/status/types.py +1 -1
  10. benchling_sdk-1.10.0a7/benchling_sdk/apps/types.py +3 -0
  11. benchling_sdk-1.10.0a7/benchling_sdk/services/v2/stable/__init__.py +0 -0
  12. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/assay_result_service.py +18 -0
  13. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/pyproject.toml +2 -2
  14. benchling_sdk-1.10.0a5/benchling_sdk/apps/config/__init__.py +0 -3
  15. benchling_sdk-1.10.0a5/benchling_sdk/apps/config/scalars.py +0 -190
  16. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/LICENSE +0 -0
  17. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/README.md +0 -0
  18. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/__init__.py +0 -0
  19. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/__init__.py +0 -0
  20. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/canvas/__init__.py +0 -0
  21. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/canvas/errors.py +0 -0
  22. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/canvas/types.py +0 -0
  23. {benchling_sdk-1.10.0a5/benchling_sdk/apps/helpers → benchling_sdk-1.10.0a7/benchling_sdk/apps/config}/__init__.py +0 -0
  24. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/cryptography_helpers.py +0 -0
  25. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/errors.py +0 -0
  26. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/config/types.py +0 -0
  27. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/framework.py +0 -0
  28. {benchling_sdk-1.10.0a5/benchling_sdk/apps/status → benchling_sdk-1.10.0a7/benchling_sdk/apps/helpers}/__init__.py +0 -0
  29. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/helpers/manifest_helpers.py +0 -0
  30. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/helpers/webhook_helpers.py +0 -0
  31. {benchling_sdk-1.10.0a5/benchling_sdk/helpers → benchling_sdk-1.10.0a7/benchling_sdk/apps/status}/__init__.py +0 -0
  32. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/apps/status/errors.py +0 -0
  33. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/auth/__init__.py +0 -0
  34. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/auth/api_key_auth.py +0 -0
  35. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/auth/bearer_token_auth.py +0 -0
  36. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/auth/client_credentials_oauth2.py +0 -0
  37. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/benchling.py +0 -0
  38. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/docs/__init__.py +0 -0
  39. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/docs/__main__.py +0 -0
  40. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/errors.py +0 -0
  41. {benchling_sdk-1.10.0a5/benchling_sdk/models/webhooks → benchling_sdk-1.10.0a7/benchling_sdk/helpers}/__init__.py +0 -0
  42. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/client_helpers.py +0 -0
  43. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/constants.py +0 -0
  44. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/decorators.py +0 -0
  45. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/file_helpers.py +0 -0
  46. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/logging_helpers.py +0 -0
  47. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/package_helpers.py +0 -0
  48. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/pagination_helpers.py +0 -0
  49. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/response_helpers.py +0 -0
  50. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/retry_helpers.py +0 -0
  51. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/serialization_helpers.py +0 -0
  52. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/helpers/transaction_manager.py +0 -0
  53. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/models/__init__.py +0 -0
  54. {benchling_sdk-1.10.0a5/benchling_sdk/services/v2 → benchling_sdk-1.10.0a7/benchling_sdk/models/webhooks}/__init__.py +0 -0
  55. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/models/webhooks/v0/__init__.py +0 -0
  56. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/py.typed +0 -0
  57. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/__init__.py +0 -0
  58. {benchling_sdk-1.10.0a5/benchling_sdk/services/v2/alpha → benchling_sdk-1.10.0a7/benchling_sdk/services/v2}/__init__.py +0 -0
  59. {benchling_sdk-1.10.0a5/benchling_sdk/services/v2/beta → benchling_sdk-1.10.0a7/benchling_sdk/services/v2/alpha}/__init__.py +0 -0
  60. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/alpha/v2_alpha_app_service.py +0 -0
  61. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/alpha/v2_alpha_dna_sequence_service.py +0 -0
  62. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/base_service.py +0 -0
  63. {benchling_sdk-1.10.0a5/benchling_sdk/services/v2/stable → benchling_sdk-1.10.0a7/benchling_sdk/services/v2/beta}/__init__.py +0 -0
  64. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_aa_sequence_service.py +0 -0
  65. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_app_service.py +0 -0
  66. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_collaboration_service.py +0 -0
  67. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_custom_entity_service.py +0 -0
  68. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_dataset_service.py +0 -0
  69. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_dna_oligo_service.py +0 -0
  70. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_dna_sequence_service.py +0 -0
  71. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_entity_service.py +0 -0
  72. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_entry_service.py +0 -0
  73. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_folder_service.py +0 -0
  74. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_project_service.py +0 -0
  75. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_rna_oligo_service.py +0 -0
  76. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/beta/v2_beta_worklist_service.py +0 -0
  77. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/aa_sequence_service.py +0 -0
  78. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/api_service.py +0 -0
  79. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/app_service.py +0 -0
  80. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/assay_run_service.py +0 -0
  81. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/blob_service.py +0 -0
  82. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/box_service.py +0 -0
  83. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/container_service.py +0 -0
  84. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/custom_entity_service.py +0 -0
  85. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/custom_notation_service.py +0 -0
  86. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/dna_alignments_service.py +0 -0
  87. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/dna_oligo_service.py +0 -0
  88. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/dna_sequence_service.py +0 -0
  89. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/dropdown_service.py +0 -0
  90. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/entry_service.py +0 -0
  91. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/event_service.py +0 -0
  92. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/export_service.py +0 -0
  93. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/feature_library_service.py +0 -0
  94. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/folder_service.py +0 -0
  95. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/inventory_service.py +0 -0
  96. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/lab_automation_service.py +0 -0
  97. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/label_template_service.py +0 -0
  98. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/location_service.py +0 -0
  99. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/mixture_service.py +0 -0
  100. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/molecule_service.py +0 -0
  101. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +0 -0
  102. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/oligo_service.py +0 -0
  103. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/organization_service.py +0 -0
  104. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/plate_service.py +0 -0
  105. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/printer_service.py +0 -0
  106. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/project_service.py +0 -0
  107. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/registry_service.py +0 -0
  108. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/request_service.py +0 -0
  109. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/rna_oligo_service.py +0 -0
  110. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/rna_sequence_service.py +0 -0
  111. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/schema_service.py +0 -0
  112. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/task_service.py +0 -0
  113. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/team_service.py +0 -0
  114. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/user_service.py +0 -0
  115. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/warehouse_service.py +0 -0
  116. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/workflow_output_service.py +0 -0
  117. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/workflow_task_group_service.py +0 -0
  118. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/stable/workflow_task_service.py +0 -0
  119. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/v2_alpha_service.py +0 -0
  120. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/v2_beta_service.py +0 -0
  121. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/benchling_sdk/services/v2/v2_stable_service.py +0 -0
  122. {benchling_sdk-1.10.0a5 → benchling_sdk-1.10.0a7}/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.0a5
3
+ Version: 1.10.0a7
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.232)
20
+ Requires-Dist: benchling-api-client (==2.0.243)
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)
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  from typing import cast, Dict, Generic, List, Optional, Protocol, Set, Type, TypeVar, Union
4
5
 
5
6
  from benchling_api_client.v2.extensions import UnknownType
@@ -13,6 +14,7 @@ from benchling_sdk.apps.canvas.types import (
13
14
  UiBlock,
14
15
  UiBlockType,
15
16
  )
17
+ from benchling_sdk.apps.types import JsonType
16
18
  from benchling_sdk.models import (
17
19
  AppCanvas,
18
20
  AppCanvasApp,
@@ -366,6 +368,7 @@ class CanvasBuilder:
366
368
  enabled: bool = True,
367
369
  session_id: Optional[str] = None,
368
370
  blocks: Optional[List[UiBlock]] = None,
371
+ data: Optional[JsonType] = None,
369
372
  ):
370
373
  """
371
374
  Init AppCanvas.
@@ -379,6 +382,7 @@ class CanvasBuilder:
379
382
  enabled=enabled,
380
383
  session_id=session_id,
381
384
  blocks=blocks if blocks else [],
385
+ data=json.dumps(data) if data is not None else None,
382
386
  )
383
387
 
384
388
  @classmethod
@@ -395,6 +399,7 @@ class CanvasBuilder:
395
399
  enabled=canvas.enabled,
396
400
  session_id=canvas.session_id,
397
401
  blocks=canvas.blocks,
402
+ data=json.loads(canvas.data) if canvas.data is not None else None,
398
403
  )
399
404
 
400
405
  def _with_enabled(self, value: bool) -> CanvasBuilder:
@@ -406,6 +411,7 @@ class CanvasBuilder:
406
411
  enabled=value,
407
412
  session_id=self._source_canvas.session_id,
408
413
  blocks=self._source_canvas.blocks,
414
+ data=self._source_canvas.data,
409
415
  )
410
416
 
411
417
  def with_enabled(self, enabled: bool = True) -> CanvasBuilder:
@@ -430,6 +436,23 @@ class CanvasBuilder:
430
436
  enabled=self._source_canvas.enabled,
431
437
  session_id=self._source_canvas.session_id,
432
438
  blocks=new_blocks,
439
+ data=self._source_canvas.data,
440
+ )
441
+
442
+ def with_data(self, new_data: Optional[JsonType]) -> CanvasBuilder:
443
+ """
444
+ Return a new CanvasBuilder with the underlying data replaced.
445
+
446
+ This does not call the API, it only assigns state in the CanvasBuilder.
447
+ """
448
+ return CanvasBuilder(
449
+ app_id=self._source_canvas.app.id,
450
+ feature_id=self._source_canvas.feature_id,
451
+ resource_id=self._source_canvas.resource_id,
452
+ enabled=self._source_canvas.enabled,
453
+ session_id=self._source_canvas.session_id,
454
+ blocks=self._source_canvas.blocks,
455
+ data=new_data,
433
456
  )
434
457
 
435
458
  def with_session_id(self, session_id: Optional[str]) -> CanvasBuilder:
@@ -445,6 +468,7 @@ class CanvasBuilder:
445
468
  enabled=self._source_canvas.enabled,
446
469
  session_id=session_id,
447
470
  blocks=self._source_canvas.blocks,
471
+ data=self._source_canvas.data,
448
472
  )
449
473
 
450
474
  def inputs_to_dict(self) -> Dict[str, Union[str, List[str]]]:
@@ -574,6 +598,7 @@ class CanvasBuilder:
574
598
  enabled=self._source_canvas.enabled,
575
599
  session_id=self._source_canvas.session_id,
576
600
  blocks=[_ui_block_to_update(block) for block in self._source_canvas.blocks],
601
+ data=self._source_canvas.data,
577
602
  )
578
603
 
579
604
  def to_create(self) -> AppCanvasCreate:
@@ -585,6 +610,7 @@ class CanvasBuilder:
585
610
  enabled=self._source_canvas.enabled,
586
611
  session_id=self._source_canvas.session_id,
587
612
  blocks=[_ui_block_to_create(block) for block in self._source_canvas.blocks],
613
+ data=self._source_canvas.data,
588
614
  )
589
615
 
590
616
  @property
@@ -597,6 +623,14 @@ class CanvasBuilder:
597
623
  """
598
624
  return CanvasBuilderBlockStream.from_builder(self)
599
625
 
626
+ def data_to_json(self) -> Optional[JsonType]:
627
+ """
628
+ Convert Canvas data to JSON.
629
+
630
+ Return a JSON object parsed from the string of the canvas's `data`, if present. Otherwise, return None.
631
+ """
632
+ return json.loads(self._source_canvas.data) if self._source_canvas.data is not None else None
633
+
600
634
 
601
635
  def _is_included_class(included_classes: Set[Type[UiBlock]], target_class: UiBlock) -> bool:
602
636
  return isinstance(target_class, tuple(c for c in included_classes))
@@ -11,9 +11,6 @@ class BaseDecryptionProvider(ABC):
11
11
  Various implementations might use AWS KMS, Azure, etc.
12
12
  """
13
13
 
14
- # TODO BNCH-52772 should we loosen this method to accept None and not attempt decryption,
15
- # now that config is no longer type safe?
16
-
17
14
  @abstractmethod
18
15
  def decrypt(self, ciphertext: str) -> str:
19
16
  """
@@ -77,7 +77,8 @@ class BenchlingConfigProvider(ConfigProvider):
77
77
 
78
78
  # Eager load all config items for now since we don't yet have a way of lazily querying by path
79
79
  all_config_pages = list(app_pages)
80
- # Punt on UnknownType for now as apps using manifests with new types + older client could lead to unpredictable results
80
+ # Punt on UnknownType for now as apps using manifests with new types +
81
+ # older client could lead to unpredictable results
81
82
  all_config_items = [
82
83
  _supported_config_item(config_item) for page in all_config_pages for config_item in page
83
84
  ]
@@ -220,13 +221,13 @@ class ConfigItemStore:
220
221
  """
221
222
  Dependency Link Store.
222
223
 
223
- Marshals an app configuration from the configuration provider into an indexable structure.
224
+ Marshals an app configuration from the configuration provider into an indexed structure.
224
225
  Only retrieves app configuration once unless its cache is invalidated.
225
226
  """
226
227
 
227
228
  _configuration_provider: ConfigProvider
228
229
  _configuration: Optional[List[ConfigurationReference]] = None
229
- _configuration_map: Optional[Dict[ConfigItemPath, ConfigItemWrapper]] = None
230
+ _configuration_dict: Optional[Dict[ConfigItemPath, ConfigItemWrapper]] = None
230
231
  _array_path_row_names: Dict[Tuple[str, ...], OrderedSet[str]] = dict()
231
232
 
232
233
  def __init__(self, configuration_provider: ConfigProvider):
@@ -252,17 +253,17 @@ class ConfigItemStore:
252
253
  return self._configuration
253
254
 
254
255
  @property
255
- def configuration_path_map(self) -> Dict[ConfigItemPath, ConfigItemWrapper]:
256
+ def configuration_path_dict(self) -> Dict[ConfigItemPath, ConfigItemWrapper]:
256
257
  """
257
258
  Config links.
258
259
 
259
- Return a map of configuration item paths to their corresponding configuration items.
260
+ Return a dict of configuration item paths to their corresponding configuration items.
260
261
  """
261
- if not self._configuration_map:
262
- self._configuration_map = {
262
+ if not self._configuration_dict:
263
+ self._configuration_dict = {
263
264
  tuple(item.path): ConfigItemWrapper(item, item.path) for item in self.configuration
264
265
  }
265
- return self._configuration_map
266
+ return self._configuration_dict
266
267
 
267
268
  def config_by_path(self, path: List[str]) -> ConfigItemWrapper:
268
269
  """
@@ -272,7 +273,7 @@ class ConfigItemStore:
272
273
  """
273
274
  # Since we eager load all config now, we know that missing path means it's not configured in Benchling
274
275
  # Later if we support lazy loading, we'll need to differentiate what's in our cache versus missing
275
- return self.configuration_path_map.get(tuple(path), ConfigItemWrapper(None, path))
276
+ return self.configuration_path_dict.get(tuple(path), ConfigItemWrapper(None, path))
276
277
 
277
278
  def config_keys_by_path(self, path: List[str]) -> OrderedSet[str]:
278
279
  """
@@ -296,7 +297,7 @@ class ConfigItemStore:
296
297
  self._array_path_row_names[path_tuple] = OrderedSet(
297
298
  [
298
299
  config_item.path[len(path)]
299
- # Use the list instead of configuration_map to preserve order
300
+ # Use the list instead of configuration_dict to preserve order
300
301
  for config_item in self.configuration
301
302
  # The +1 is the name of the array row
302
303
  if len(config_item.path) >= len(path) + 1
@@ -330,7 +331,7 @@ class ConfigItemStore:
330
331
  Will force retrieval of configuration from the ConfigProvider the next time the link store is accessed.
331
332
  """
332
333
  self._configuration = None
333
- self._configuration_map = None
334
+ self._configuration_dict = None
334
335
  self._array_path_row_names = dict()
335
336
 
336
337
 
@@ -1,7 +1,6 @@
1
- from datetime import date, datetime
1
+ from datetime import datetime
2
2
  from typing import List, Optional, Union
3
3
 
4
- from benchling_api_client.v2.beta.models.app_config_field_type import AppConfigFieldType
5
4
  from benchling_api_client.v2.beta.models.base_manifest_config import BaseManifestConfig
6
5
  from benchling_api_client.v2.beta.models.dropdown_dependency import DropdownDependency
7
6
  from benchling_api_client.v2.beta.models.dropdown_dependency_types import DropdownDependencyTypes
@@ -29,92 +28,7 @@ from benchling_api_client.v2.beta.models.workflow_task_schema_dependency_type im
29
28
  from benchling_api_client.v2.extensions import UnknownType
30
29
  from benchling_api_client.v2.stable.extensions import NotPresentError
31
30
 
32
- from benchling_sdk.apps.config.scalars import JsonType
33
- from benchling_sdk.models import (
34
- AaSequence,
35
- AssayResult,
36
- AssayRun,
37
- Box,
38
- Container,
39
- CustomEntity,
40
- DnaOligo,
41
- DnaSequence,
42
- Entry,
43
- Location,
44
- Mixture,
45
- Molecule,
46
- Plate,
47
- Request,
48
- RnaOligo,
49
- RnaSequence,
50
- WorkflowTask,
51
- )
52
-
53
- _MODEL_TYPES_FROM_SCHEMA_TYPE = {
54
- SchemaDependencyTypes.CONTAINER_SCHEMA: Container,
55
- SchemaDependencyTypes.PLATE_SCHEMA: Plate,
56
- SchemaDependencyTypes.BOX_SCHEMA: Box,
57
- SchemaDependencyTypes.LOCATION_SCHEMA: Location,
58
- SchemaDependencyTypes.ENTRY_SCHEMA: Entry,
59
- SchemaDependencyTypes.REQUEST_SCHEMA: Request,
60
- SchemaDependencyTypes.RESULT_SCHEMA: AssayResult,
61
- SchemaDependencyTypes.RUN_SCHEMA: AssayRun,
62
- SchemaDependencyTypes.WORKFLOW_TASK_SCHEMA: WorkflowTask,
63
- }
64
-
65
-
66
- _SCALAR_TYPES_FROM_CONFIG = {
67
- ScalarConfigTypes.BOOLEAN: bool,
68
- ScalarConfigTypes.DATE: date,
69
- ScalarConfigTypes.DATETIME: datetime,
70
- ScalarConfigTypes.FLOAT: float,
71
- ScalarConfigTypes.INTEGER: int,
72
- ScalarConfigTypes.JSON: JsonType,
73
- ScalarConfigTypes.TEXT: str,
74
- }
75
-
76
-
77
- _FIELD_SCALAR_TYPES_FROM_CONFIG = {
78
- AppConfigFieldType.BOOLEAN: bool,
79
- AppConfigFieldType.DATE: date,
80
- AppConfigFieldType.DATETIME: datetime,
81
- AppConfigFieldType.FLOAT: float,
82
- AppConfigFieldType.INTEGER: int,
83
- AppConfigFieldType.JSON: JsonType,
84
- AppConfigFieldType.TEXT: str,
85
- }
86
-
87
-
88
- ModelType = Union[AssayResult, AssayRun, Box, Container, Entry, Location, Plate, Request]
89
-
90
- _INSTANCE_FROM_SCHEMA_SUBTYPE = {
91
- SchemaDependencySubtypes.AA_SEQUENCE: AaSequence,
92
- SchemaDependencySubtypes.CUSTOM_ENTITY: CustomEntity,
93
- SchemaDependencySubtypes.DNA_SEQUENCE: DnaSequence,
94
- SchemaDependencySubtypes.DNA_OLIGO: DnaOligo,
95
- SchemaDependencySubtypes.MIXTURE: Mixture,
96
- SchemaDependencySubtypes.MOLECULE: Molecule,
97
- SchemaDependencySubtypes.RNA_OLIGO: RnaOligo,
98
- SchemaDependencySubtypes.RNA_SEQUENCE: RnaSequence,
99
- }
100
-
101
- EntitySubtype = Union[
102
- AaSequence, CustomEntity, DnaOligo, DnaSequence, Mixture, Molecule, RnaOligo, RnaSequence
103
- ]
104
-
105
- AnyDependency = Union[
106
- BaseManifestConfig,
107
- DropdownDependency,
108
- EntitySchemaDependency,
109
- FieldDefinitionsManifest,
110
- ManifestArrayConfig,
111
- ManifestScalarConfig,
112
- ResourceDependency,
113
- SchemaDependency,
114
- WorkflowTaskSchemaDependency,
115
- ]
116
-
117
- ArrayElementDependency = Union[
31
+ _ArrayElementDependency = Union[
118
32
  SchemaDependency,
119
33
  EntitySchemaDependency,
120
34
  WorkflowTaskSchemaDependency,
@@ -124,13 +38,13 @@ ArrayElementDependency = Union[
124
38
  ]
125
39
 
126
40
 
127
- class UnsupportedSubTypeError(Exception):
41
+ class _UnsupportedSubTypeError(Exception):
128
42
  """Error when an unsupported subtype is encountered."""
129
43
 
130
44
  pass
131
45
 
132
46
 
133
- def field_definitions_from_dependency(
47
+ def _field_definitions_from_dependency(
134
48
  dependency: Union[
135
49
  EntitySchemaDependency,
136
50
  SchemaDependency,
@@ -148,7 +62,7 @@ def field_definitions_from_dependency(
148
62
  return []
149
63
 
150
64
 
151
- def element_definition_from_dependency(dependency: ManifestArrayConfig) -> List[ArrayElementDependency]:
65
+ def _element_definition_from_dependency(dependency: ManifestArrayConfig) -> List[_ArrayElementDependency]:
152
66
  """Safely return an element definition as a list of dependencies from an array dependency or empty list."""
153
67
  try:
154
68
  if hasattr(dependency, "element_definition"):
@@ -161,7 +75,7 @@ def element_definition_from_dependency(dependency: ManifestArrayConfig) -> List[
161
75
  return []
162
76
 
163
77
 
164
- def enum_from_dependency(
78
+ def _enum_from_dependency(
165
79
  dependency: Union[
166
80
  ManifestFloatScalarConfig,
167
81
  ManifestIntegerScalarConfig,
@@ -180,8 +94,8 @@ def enum_from_dependency(
180
94
 
181
95
  # TODO BNCH-57036 All element definitions currently deserialize to UnknownType. Hack around this temporarily
182
96
  def _fix_element_definition_deserialization(
183
- element: Union[UnknownType, ArrayElementDependency]
184
- ) -> ArrayElementDependency:
97
+ element: Union[UnknownType, _ArrayElementDependency]
98
+ ) -> _ArrayElementDependency:
185
99
  if isinstance(element, UnknownType):
186
100
  if "type" in element.value:
187
101
  element_type = element.value["type"]
@@ -201,7 +115,7 @@ def _fix_element_definition_deserialization(
201
115
  return element
202
116
 
203
117
 
204
- def workflow_task_schema_output_from_dependency(
118
+ def _workflow_task_schema_output_from_dependency(
205
119
  dependency: WorkflowTaskSchemaDependency,
206
120
  ) -> Optional[WorkflowTaskSchemaDependencyOutput]:
207
121
  """Safely return a workflow task schema output from a workflow task schema or None."""
@@ -214,7 +128,7 @@ def workflow_task_schema_output_from_dependency(
214
128
  return None
215
129
 
216
130
 
217
- def options_from_dependency(dependency: DropdownDependency) -> List[BaseManifestConfig]:
131
+ def _options_from_dependency(dependency: DropdownDependency) -> List[BaseManifestConfig]:
218
132
  """Safely return a list of options from a dropdown dependency or empty list."""
219
133
  try:
220
134
  if hasattr(dependency, "options"):
@@ -225,7 +139,7 @@ def options_from_dependency(dependency: DropdownDependency) -> List[BaseManifest
225
139
  return []
226
140
 
227
141
 
228
- def subtype_from_entity_schema_dependency(
142
+ def _subtype_from_entity_schema_dependency(
229
143
  dependency: EntitySchemaDependency,
230
144
  ) -> Optional[SchemaDependencySubtypes]:
231
145
  """Safely return an entity schema dependency's subtype, if present."""
@@ -236,3 +150,8 @@ def subtype_from_entity_schema_dependency(
236
150
  except NotPresentError:
237
151
  pass
238
152
  return None
153
+
154
+
155
+ def datetime_config_value_to_str(value: datetime) -> str:
156
+ """Convert a datetime value to a valid string accepted by a datetime app config item."""
157
+ return value.strftime("%Y-%m-%d %I:%M:%S %p")