sapiopycommons 2025.4.24a495__tar.gz → 2025.4.25a497__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 (107) hide show
  1. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/tool_service_base.py +164 -2
  4. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/.gitignore +0 -0
  5. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/LICENSE +0 -0
  6. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/README.md +0 -0
  7. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/__init__.py +0 -0
  8. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/__init__.py +0 -0
  9. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.py +0 -0
  10. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.pyi +0 -0
  11. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2_grpc.py +0 -0
  12. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.py +0 -0
  13. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.pyi +0 -0
  14. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2_grpc.py +0 -0
  15. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_pb2.py +0 -0
  16. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_pb2.pyi +0 -0
  17. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/proto/step_pb2_grpc.py +0 -0
  18. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.py +0 -0
  19. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.pyi +0 -0
  20. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py +0 -0
  21. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py +0 -0
  22. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi +0 -0
  23. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2_grpc.py +0 -0
  24. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +0 -0
  25. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +0 -0
  26. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py +0 -0
  27. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py +0 -0
  28. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi +0 -0
  29. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2_grpc.py +0 -0
  30. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/ai/tool_of_tools.py +0 -0
  31. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/callbacks/__init__.py +0 -0
  32. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  33. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  34. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  35. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/chem/Molecules.py +0 -0
  36. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/chem/__init__.py +0 -0
  37. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/customreport/__init__.py +0 -0
  38. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  39. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/customreport/column_builder.py +0 -0
  40. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  41. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/customreport/term_builder.py +0 -0
  42. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/datatype/__init__.py +0 -0
  43. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  44. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/datatype/data_fields.py +0 -0
  45. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  46. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/eln/__init__.py +0 -0
  47. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  48. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  49. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  50. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/eln/plate_designer.py +0 -0
  51. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/__init__.py +0 -0
  52. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  53. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_bridge.py +0 -0
  54. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  55. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_data_handler.py +0 -0
  56. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_util.py +0 -0
  57. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_validator.py +0 -0
  58. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/files/file_writer.py +0 -0
  59. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  60. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  61. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/__init__.py +0 -0
  62. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/accession_service.py +0 -0
  63. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/aliases.py +0 -0
  64. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/audit_log.py +0 -0
  65. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/custom_report_util.py +0 -0
  66. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/directive_util.py +0 -0
  67. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/exceptions.py +0 -0
  68. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/html_formatter.py +0 -0
  69. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/popup_util.py +0 -0
  70. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/sapio_links.py +0 -0
  71. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/storage_util.py +0 -0
  72. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/general/time_util.py +0 -0
  73. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  74. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  75. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/processtracking/__init__.py +0 -0
  76. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  77. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  78. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  79. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  80. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/rules/__init__.py +0 -0
  81. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  82. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  83. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/samples/aliquot.py +0 -0
  84. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  85. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  86. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/webhook/__init__.py +0 -0
  87. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  88. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  89. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/src/sapiopycommons/webhook/webservice_handlers.py +0 -0
  90. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  91. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/_do_not_add_init_py_here +0 -0
  92. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/accession_test.py +0 -0
  93. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/aliquot_test.py +0 -0
  94. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/bio_reg_test.py +0 -0
  95. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/chem_test.py +0 -0
  96. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/chem_test_curation_queue.py +0 -0
  97. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/curation_queue_test.sdf +0 -0
  98. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/data_type_models.py +0 -0
  99. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  100. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  101. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  102. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto/8_color_ICS.wsp +0 -0
  103. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  104. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/flowcyto_test.py +0 -0
  105. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/kappa.chains.fasta +0 -0
  106. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/mafft_test.py +0 -0
  107. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a497}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.4.24a495
3
+ Version: 2025.4.25a497
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.04.24a495'
7
+ version='2025.04.25a497'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -7,7 +7,8 @@ from typing import Any
7
7
 
8
8
  from grpc import ServicerContext
9
9
 
10
- from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import VeloxFieldDefProto
10
+ from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import VeloxFieldDefProto, FieldTypeProto, \
11
+ IntegerProperties, DoubleProperties, SelectionProperties, BooleanProperties
11
12
  from sapiopycommons.general.aliases import FieldMap
12
13
  from sapiopylib.rest.User import SapioUser
13
14
 
@@ -359,6 +360,110 @@ class ToolBase(ABC):
359
360
  """
360
361
  self.configs.append(field)
361
362
 
363
+ def add_integer_config_field(self, field_name: str, display_name: str, description: str,
364
+ default_value: int, min_value: int = -2**31, max_value: int = 2**31-1) -> None:
365
+ """
366
+ Add an integer configuration field to the tool. This field will be used to configure the tool in the plan
367
+ manager.
368
+
369
+ :param field_name: The name of the field.
370
+ :param display_name: The display name of the field.
371
+ :param description: The description of the field.
372
+ :param default_value: The default value of the field.
373
+ :param min_value: The minimum value of the field.
374
+ :param max_value: The maximum value of the field.
375
+ """
376
+ self.configs.append(VeloxFieldDefProto(
377
+ data_field_type=FieldTypeProto.INTEGER,
378
+ data_field_name=field_name,
379
+ display_name=display_name,
380
+ description=description,
381
+ required=True,
382
+ editable=True,
383
+ integer_properties=IntegerProperties(
384
+ default_value=default_value,
385
+ min_value=min_value,
386
+ max_value=max_value
387
+ )
388
+ ))
389
+
390
+ def add_double_config_field(self, field_name: str, display_name: str, description: str, default_value: float,
391
+ min_value: float = -10.**120, max_value: float = 10.**120, precision: int = 2) -> None:
392
+ """
393
+ Add a double configuration field to the tool. This field will be used to configure the tool in the plan
394
+ manager.
395
+
396
+ :param field_name: The name of the field.
397
+ :param display_name: The display name of the field.
398
+ :param description: The description of the field.
399
+ :param default_value: The default value of the field.
400
+ :param min_value: The minimum value of the field.
401
+ :param max_value: The maximum value of the field.
402
+ :param precision: The precision of the field.
403
+ """
404
+ self.configs.append(VeloxFieldDefProto(
405
+ data_field_type=FieldTypeProto.DOUBLE,
406
+ data_field_name=field_name,
407
+ display_name=display_name,
408
+ description=description,
409
+ required=True,
410
+ editable=True,
411
+ double_properties=DoubleProperties(
412
+ default_value=default_value,
413
+ min_value=min_value,
414
+ max_value=max_value,
415
+ precision=precision
416
+ )
417
+ ))
418
+
419
+ def add_list_config_field(self, field_name: str, display_name: str, description: str, default_value: str,
420
+ allowed_values: list[str]) -> None:
421
+ """
422
+ Add a list configuration field to the tool. This field will be used to configure the tool in the plan
423
+ manager.
424
+
425
+ :param field_name: The name of the field.
426
+ :param display_name: The display name of the field.
427
+ :param description: The description of the field.
428
+ :param default_value: The default value of the field.
429
+ :param allowed_values: The list of allowed values for the field.
430
+ """
431
+ self.configs.append(VeloxFieldDefProto(
432
+ data_field_type=FieldTypeProto.SELECTION,
433
+ data_field_name=field_name,
434
+ display_name=display_name,
435
+ description=description,
436
+ required=True,
437
+ editable=True,
438
+ selection_properties=SelectionProperties(
439
+ default_value=default_value,
440
+ static_list_values=allowed_values,
441
+ )
442
+ ))
443
+
444
+ def add_boolean_config_field(self, field_name: str, display_name: str, description: str, default_value: bool) \
445
+ -> None:
446
+ """
447
+ Add a boolean configuration field to the tool. This field will be used to configure the tool in the plan
448
+ manager.
449
+
450
+ :param field_name: The name of the field.
451
+ :param display_name: The display name of the field.
452
+ :param description: The description of the field.
453
+ :param default_value: The default value of the field.
454
+ """
455
+ self.configs.append(VeloxFieldDefProto(
456
+ data_field_type=FieldTypeProto.BOOLEAN,
457
+ data_field_name=field_name,
458
+ display_name=display_name,
459
+ description=description,
460
+ required=True,
461
+ editable=True,
462
+ boolean_properties=BooleanProperties(
463
+ default_value=default_value
464
+ )
465
+ ))
466
+
362
467
  def to_proto(self) -> ToolDetails:
363
468
  """
364
469
  :return: The ToolDetails proto object representing this tool.
@@ -378,7 +483,7 @@ class ToolBase(ABC):
378
483
 
379
484
  :param message: The message to log.
380
485
  """
381
- self.logs.append(message)
486
+ self.logs.append(f"{self.name}: {message}")
382
487
 
383
488
  @abstractmethod
384
489
  def run(self, user: SapioUser, request: ProcessStepRequest, context: ServicerContext) -> list[SapioToolResult]:
@@ -392,3 +497,60 @@ class ToolBase(ABC):
392
497
  :return: A SapioToolResults object containing the response data.
393
498
  """
394
499
  pass
500
+
501
+ @staticmethod
502
+ def get_request_json(request: ProcessStepRequest, index: int = 0) -> list[Any]:
503
+ """
504
+ Parse the JSON data from the request object.
505
+
506
+ :param request: The request object containing the input data.
507
+ :param index: The index of the input to parse. Defaults to 0.
508
+ :return: A list of parsed JSON objects. Each entry in the list represents a separate JSON entry from the input.
509
+ """
510
+ entry_data = request.entry_data
511
+ input_data: list[Any] = [json.loads(x) for x in entry_data[index].entry_data.json_data.entries]
512
+ return input_data
513
+
514
+ @staticmethod
515
+ def read_from_json(json_data: list[dict[str, Any]], key: str) -> list[Any]:
516
+ """
517
+ From a list of dictionaries, return a list of values for the given key from each dictionary. Skips null values.
518
+
519
+ :param json_data: The JSON data to read from.
520
+ :param key: The key to read the values from.
521
+ :return: A list of values corresponding to the given key in the JSON data.
522
+ """
523
+ ret_val: list[Any] = []
524
+ for entry in json_data:
525
+ if key in entry:
526
+ value = entry[key]
527
+ if isinstance(value, list):
528
+ ret_val.extend(value)
529
+ elif value is not None:
530
+ ret_val.append(value)
531
+ return ret_val
532
+
533
+ def get_config_fields(self, request: ProcessStepRequest) -> dict[str, Any]:
534
+ """
535
+ Get the configuration fields from the request object.
536
+
537
+ :param request: The request object containing the input data.
538
+ :return: A dictionary of configuration field names and their values.
539
+ """
540
+ config_fields: dict[str, Any] = {}
541
+ # noinspection PyUnresolvedReferences,PyTypeChecker
542
+ field_defs: dict[str, VeloxFieldDefProto] = {x.data_field_name: x for x in self.to_proto().config_fields}
543
+ for field, value in request.config_field_values.items():
544
+ if field not in field_defs:
545
+ continue
546
+ field_type: FieldTypeProto = field_defs[field].data_field_type
547
+ if field_type == FieldTypeProto.BOOLEAN:
548
+ value = value.bool_value
549
+ elif field_type == FieldTypeProto.DOUBLE:
550
+ value = value.double_value
551
+ elif field_type in [FieldTypeProto.INTEGER, FieldTypeProto.SHORT, FieldTypeProto.LONG, FieldTypeProto.ENUM]:
552
+ value = value.int_value
553
+ else:
554
+ value = value.string_value
555
+ config_fields[field] = value
556
+ return config_fields