sapiopycommons 2025.7.22a639__tar.gz → 2025.7.22a651__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.

Potentially problematic release.


This version of sapiopycommons might be problematic. Click here for more details.

Files changed (115) hide show
  1. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/test_client.py +19 -3
  4. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/tool_service_base.py +7 -2
  5. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/webhook/webservice_handlers.py +1 -1
  6. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/.gitignore +0 -0
  7. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/LICENSE +0 -0
  8. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/README.md +0 -0
  9. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/__init__.py +0 -0
  10. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/__init__.py +0 -0
  11. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.py +0 -0
  12. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.pyi +0 -0
  13. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2_grpc.py +0 -0
  14. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.py +0 -0
  15. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.pyi +0 -0
  16. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2_grpc.py +0 -0
  17. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.py +0 -0
  18. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.pyi +0 -0
  19. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2_grpc.py +0 -0
  20. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_pb2.py +0 -0
  21. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_pb2.pyi +0 -0
  22. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/proto/step_pb2_grpc.py +0 -0
  23. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.py +0 -0
  24. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.pyi +0 -0
  25. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py +0 -0
  26. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py +0 -0
  27. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi +0 -0
  28. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2_grpc.py +0 -0
  29. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +0 -0
  30. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +0 -0
  31. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py +0 -0
  32. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py +0 -0
  33. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi +0 -0
  34. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2_grpc.py +0 -0
  35. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/ai/protobuf_utils.py +0 -0
  36. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/callbacks/__init__.py +0 -0
  37. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  38. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  39. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  40. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/chem/Molecules.py +0 -0
  41. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/chem/__init__.py +0 -0
  42. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/customreport/__init__.py +0 -0
  43. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  44. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/customreport/column_builder.py +0 -0
  45. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  46. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/customreport/term_builder.py +0 -0
  47. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/datatype/__init__.py +0 -0
  48. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  49. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/datatype/data_fields.py +0 -0
  50. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  51. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/__init__.py +0 -0
  52. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/experiment_cache.py +0 -0
  53. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  54. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  55. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/experiment_step_factory.py +0 -0
  56. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  57. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/plate_designer.py +0 -0
  58. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/eln/step_creation.py +0 -0
  59. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/__init__.py +0 -0
  60. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  61. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_bridge.py +0 -0
  62. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  63. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_data_handler.py +0 -0
  64. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_util.py +0 -0
  65. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_validator.py +0 -0
  66. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/files/file_writer.py +0 -0
  67. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  68. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  69. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/__init__.py +0 -0
  70. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/accession_service.py +0 -0
  71. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/aliases.py +0 -0
  72. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/audit_log.py +0 -0
  73. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/custom_report_util.py +0 -0
  74. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/data_structure_util.py +0 -0
  75. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/directive_util.py +0 -0
  76. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/exceptions.py +0 -0
  77. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/html_formatter.py +0 -0
  78. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/popup_util.py +0 -0
  79. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/sapio_links.py +0 -0
  80. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/storage_util.py +0 -0
  81. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/general/time_util.py +0 -0
  82. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  83. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  84. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/processtracking/__init__.py +0 -0
  85. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  86. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  87. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  88. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  89. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/rules/__init__.py +0 -0
  90. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  91. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  92. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/samples/aliquot.py +0 -0
  93. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  94. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  95. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/webhook/__init__.py +0 -0
  96. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  97. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  98. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  99. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/_do_not_add_init_py_here +0 -0
  100. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/accession_test.py +0 -0
  101. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/aliquot_test.py +0 -0
  102. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/bio_reg_test.py +0 -0
  103. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/chem_test.py +0 -0
  104. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/chem_test_curation_queue.py +0 -0
  105. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/curation_queue_test.sdf +0 -0
  106. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/data_type_models.py +0 -0
  107. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  108. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  109. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  110. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto/8_color_ICS.wsp +0 -0
  111. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  112. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/flowcyto_test.py +0 -0
  113. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/kappa.chains.fasta +0 -0
  114. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/mafft_test.py +0 -0
  115. {sapiopycommons-2025.7.22a639 → sapiopycommons-2025.7.22a651}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.7.22a639
3
+ Version: 2025.7.22a651
4
4
  Summary: Official Sapio Python API Utilities Package
5
5
  Project-URL: Homepage, https://github.com/sapiosciences
6
6
  Author-email: Jonathan Steck <jsteck@sapiosciences.com>, Yechen Qiao <yqiao@sapiosciences.com>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sapiopycommons"
7
- version='2025.07.22a639'
7
+ version='2025.07.22a651'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -10,7 +10,7 @@ from sapiopycommons.ai.api.plan.tool.proto.entry_pb2 import DataTypePbo, StepBin
10
10
  StepCsvHeaderRowPbo, StepCsvContainerPbo, StepJsonContainerPbo, StepImageContainerPbo, StepTextContainerPbo, \
11
11
  StepItemContainerPbo, StepInputBatchPbo
12
12
  from sapiopycommons.ai.api.plan.tool.proto.tool_pb2 import ProcessStepResponsePbo, ProcessStepRequestPbo, \
13
- ToolDetailsRequestPbo, ToolDetailsResponsePbo
13
+ ToolDetailsRequestPbo, ToolDetailsResponsePbo, ProcessStepResponseStatusPbo
14
14
  from sapiopycommons.ai.api.plan.tool.proto.tool_pb2_grpc import ToolServiceStub
15
15
  from sapiopycommons.ai.api.session.proto.sapio_conn_info_pb2 import SapioConnectionInfoPbo, SapioUserSecretTypePbo
16
16
 
@@ -23,6 +23,9 @@ class ToolOutput:
23
23
  """
24
24
  tool_name: str
25
25
 
26
+ status: str
27
+ message: str
28
+
26
29
  binary_output: list[bytes]
27
30
  csv_output: list[dict[str, Any]]
28
31
  json_output: list[Any]
@@ -45,6 +48,8 @@ class ToolOutput:
45
48
 
46
49
  def __str__(self):
47
50
  ret_val: str = f"{self.tool_name} Output:\n"
51
+ ret_val += f"\tStatus: {self.status}\n"
52
+ ret_val += f"\tMessage: {self.message}\n"
48
53
  ret_val += "-" * 25 + "\n"
49
54
  ret_val += f"Binary Output: {len(self.binary_output)} item(s)\n"
50
55
  for binary in self.binary_output:
@@ -215,12 +220,13 @@ class TestClient:
215
220
  stub = ToolServiceStub(channel)
216
221
  return stub.GetToolDetails(ToolDetailsRequestPbo(sapio_conn_info=self.connection))
217
222
 
218
- def call_tool(self, tool_name: str) -> ToolOutput:
223
+ def call_tool(self, tool_name: str, is_dry_run: bool = False) -> ToolOutput:
219
224
  """
220
225
  Send the request to the tool service for a particular tool name. This will send all the inputs that have been
221
226
  added using the add_X_input functions.
222
227
 
223
228
  :param tool_name: The name of the tool to call on the server.
229
+ :param is_dry_run: If True, the tool will not be executed, but the request will be validated.
224
230
  :return: A ToolOutput object containing the results of the tool service call.
225
231
  """
226
232
  with grpc.insecure_channel(self.grpc_server_url) as channel:
@@ -234,11 +240,21 @@ class TestClient:
234
240
  input=[
235
241
  StepInputBatchPbo(is_partial=False, item_container=item)
236
242
  for item in self._request_inputs
237
- ]
243
+ ],
244
+ dry_run=is_dry_run,
245
+ verbose_logging=True
238
246
  )
239
247
  )
240
248
 
241
249
  results = ToolOutput(tool_name)
250
+ match response.status:
251
+ case ProcessStepResponseStatusPbo.SUCCESS:
252
+ results.status = "Success"
253
+ case ProcessStepResponseStatusPbo.FAILURE:
254
+ results.status = "Failure"
255
+ case _:
256
+ results.status = "Unknown"
257
+ results.message = response.status_message
242
258
  for item in response.output:
243
259
  container = item.item_container
244
260
 
@@ -252,7 +252,7 @@ class ToolServiceBase(ToolServiceServicer, ABC):
252
252
  secret: str = info.secret
253
253
  if secret.startswith("Basic "):
254
254
  secret = secret[6:]
255
- credentials: list[str] = base64.b64decode(secret).decode().split(":")
255
+ credentials: list[str] = base64.b64decode(secret).decode().split(":", 1)
256
256
  user.username = credentials[0]
257
257
  user.password = credentials[1]
258
258
  case _:
@@ -301,7 +301,12 @@ class ToolServiceBase(ToolServiceServicer, ABC):
301
301
  # Setup the tool with details from the request.
302
302
  tool.setup(user, request, context)
303
303
  # Validate that the provided inputs match the tool's expected inputs.
304
- msg: str = tool.validate_input()
304
+ if not request.input:
305
+ msg: str = "No inputs provided to this tool!"
306
+ elif len(request.input) != len(tool.inputs):
307
+ msg: str = f"Expected {len(tool.inputs)} inputs for this tool, but got {len(request.input)} instead."
308
+ else:
309
+ msg: str = tool.validate_input()
305
310
  # If there is no error message, then the inputs are valid.
306
311
  success: bool = not bool(msg)
307
312
  # If this is a dry run, then provide the fixed dry run output.
@@ -140,7 +140,7 @@ class AbstractWebserviceHandler(AbstractWebhookHandler):
140
140
  # Get the login credentials from the headers.
141
141
  auth: str = headers.get("Authorization")
142
142
  if auth and auth.startswith("Basic "):
143
- credentials: list[str] = b64decode(auth.split("Basic ")[1]).decode().split(":")
143
+ credentials: list[str] = b64decode(auth.split("Basic ")[1]).decode().split(":", 1)
144
144
  user = self.basic_auth(url, credentials[0], credentials[1])
145
145
  elif auth and auth.startswith("Bearer "):
146
146
  user = self.bearer_token_auth(url, auth.split("Bearer ")[1])