tol-sdk 1.7.5b0__tar.gz → 1.7.5b2__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 (353) hide show
  1. {tol_sdk-1.7.5b0/src/tol_sdk.egg-info → tol_sdk-1.7.5b2}/PKG-INFO +1 -1
  2. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/pyproject.toml +1 -1
  3. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/client.py +3 -2
  4. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/__init__.py +2 -0
  5. tol_sdk-1.7.5b2/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +130 -0
  6. tol_sdk-1.7.5b2/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +46 -0
  7. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/__init__.py +1 -1
  8. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/allowed_values_from_datasource.py +7 -9
  9. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/assert_on_condition.py +5 -5
  10. tol_sdk-1.7.5b2/src/tol/validators/ena_checklist.py +73 -0
  11. tol_sdk-1.7.5b2/src/tol/validators/interfaces/__init__.py +5 -0
  12. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/interfaces/condition_evaluator.py +42 -1
  13. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/mutually_exclusive.py +11 -7
  14. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/regex.py +23 -2
  15. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/regex_by_value.py +22 -3
  16. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/tolid.py +1 -1
  17. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2/src/tol_sdk.egg-info}/PKG-INFO +1 -1
  18. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol_sdk.egg-info/SOURCES.txt +3 -0
  19. tol_sdk-1.7.5b0/src/tol/validators/interfaces/__init__.py +0 -5
  20. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/LICENSE +0 -0
  21. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/MANIFEST.in +0 -0
  22. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/README.md +0 -0
  23. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/setup.cfg +0 -0
  24. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/certs/cacert.pem +0 -0
  25. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/__init__.py +0 -0
  26. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/actions/__init__.py +0 -0
  27. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/actions/action.py +0 -0
  28. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/actions/upsert_action.py +0 -0
  29. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/__init__.py +0 -0
  30. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/action.py +0 -0
  31. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/__init__.py +0 -0
  32. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/abc/__init__.py +0 -0
  33. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/abc/auth.py +0 -0
  34. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  35. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/asserts.py +0 -0
  36. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/blueprint.py +0 -0
  37. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/composite.py +0 -0
  38. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/config.py +0 -0
  39. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/auth/error.py +0 -0
  40. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/blueprint.py +0 -0
  41. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/controller.py +0 -0
  42. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/data_upload.py +0 -0
  43. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/__init__.py +0 -0
  44. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/aggregation_body.py +0 -0
  45. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  46. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/auth_context.py +0 -0
  47. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/authenticate.py +0 -0
  48. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/data_body.py +0 -0
  49. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/filter_utils.py +0 -0
  50. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  51. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/relation_url.py +0 -0
  52. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/misc/stats_parameters.py +0 -0
  53. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/pipeline_steps.py +0 -0
  54. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_base/system.py +0 -0
  55. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/__init__.py +0 -0
  56. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/api_datasource.py +0 -0
  57. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/client.py +0 -0
  58. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/converter.py +0 -0
  59. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/exception.py +0 -0
  60. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/factory.py +0 -0
  61. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/filter.py +0 -0
  62. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/parser.py +0 -0
  63. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/validate.py +0 -0
  64. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/api_client/view.py +0 -0
  65. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/barcodes/__init__.py +0 -0
  66. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/barcodes/main.py +0 -0
  67. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/__init__.py +0 -0
  68. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/benchling_converter.py +0 -0
  69. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/benchling_datasource.py +0 -0
  70. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
  71. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/__init__.py +0 -0
  72. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
  73. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
  74. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  75. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  76. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  77. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  78. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  79. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  80. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  81. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  82. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  83. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/sample.sql +0 -0
  84. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  85. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
  86. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  87. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  88. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  89. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/board/__init__.py +0 -0
  90. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/board/blueprint.py +0 -0
  91. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/__init__.py +0 -0
  92. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/bold_datasource.py +0 -0
  93. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/client.py +0 -0
  94. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/converter.py +0 -0
  95. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/factory.py +0 -0
  96. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/bold/parser.py +0 -0
  97. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/cli/__init__.py +0 -0
  98. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/cli/cli.py +0 -0
  99. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/converter/__init__.py +0 -0
  100. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/converter/yaml/__init__.py +0 -0
  101. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/converter/yaml/model.py +0 -0
  102. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/converter/yaml/yaml_converter.py +0 -0
  103. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/__init__.py +0 -0
  104. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/client.py +0 -0
  105. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/converter.py +0 -0
  106. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/copo_datasource.py +0 -0
  107. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/factory.py +0 -0
  108. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/copo/parser.py +0 -0
  109. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/__init__.py +0 -0
  110. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/attribute_metadata.py +0 -0
  111. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/core_converter.py +0 -0
  112. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/data_loader.py +0 -0
  113. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/data_object.py +0 -0
  114. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/data_object_converter.py +0 -0
  115. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/data_source_attribute_metadata.py +0 -0
  116. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/data_source_dict.py +0 -0
  117. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/datasource.py +0 -0
  118. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/datasource_error.py +0 -0
  119. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/datasource_filter.py +0 -0
  120. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/datasource_utils.py +0 -0
  121. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/factory.py +0 -0
  122. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/http_client.py +0 -0
  123. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/__init__.py +0 -0
  124. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/_filterable.py +0 -0
  125. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/_writer.py +0 -0
  126. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/aggregator.py +0 -0
  127. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/counter.py +0 -0
  128. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/cursor.py +0 -0
  129. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/declare.py +0 -0
  130. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/deleter.py +0 -0
  131. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/detail_getter.py +0 -0
  132. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/enricher.py +0 -0
  133. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/enum.py +0 -0
  134. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/group_statter.py +0 -0
  135. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/inserter.py +0 -0
  136. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/list_getter.py +0 -0
  137. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/operator_config.py +0 -0
  138. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/page_getter.py +0 -0
  139. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/relational.py +0 -0
  140. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/statter.py +0 -0
  141. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/summariser.py +0 -0
  142. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/updater.py +0 -0
  143. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/operator/upserter.py +0 -0
  144. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/relationship.py +0 -0
  145. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/requested_fields.py +0 -0
  146. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/session.py +0 -0
  147. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/core/validate.py +0 -0
  148. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/elastic/__init__.py +0 -0
  149. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/elastic/elastic_datasource.py +0 -0
  150. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/elastic/runtime_fields.py +0 -0
  151. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/__init__.py +0 -0
  152. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/auth.py +0 -0
  153. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/eln_datasource.py +0 -0
  154. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/entities.py +0 -0
  155. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/generators.py +0 -0
  156. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/eln/sanitise.py +0 -0
  157. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/__init__.py +0 -0
  158. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/converter.py +0 -0
  159. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/ena_datasource.py +0 -0
  160. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/ena_methods.py +0 -0
  161. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/factory.py +0 -0
  162. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/filter.py +0 -0
  163. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/ena/parser.py +0 -0
  164. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/excel/__init__.py +0 -0
  165. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/excel/excel.py +0 -0
  166. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/excel/excel_datasource.py +0 -0
  167. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/excel/s3_factory.py +0 -0
  168. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/__init__.py +0 -0
  169. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  170. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  171. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  172. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  173. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  174. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  175. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  176. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  177. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  178. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  179. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  180. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  181. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  182. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  183. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  184. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  185. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  186. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  187. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  188. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  189. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
  190. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  191. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  192. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  193. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  194. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  195. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  196. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  197. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  198. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  199. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  200. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  201. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  202. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  203. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  204. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  205. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  206. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  207. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  208. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  209. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  210. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  211. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  212. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  213. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  214. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  215. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  216. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  217. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  218. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  219. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/logger.py +0 -0
  220. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/secrets.py +0 -0
  221. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/flows/sequencing_submissions.py +0 -0
  222. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/gap/__init__.py +0 -0
  223. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/gap/gap_datasource.py +0 -0
  224. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/__init__.py +0 -0
  225. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/client.py +0 -0
  226. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/converter.py +0 -0
  227. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/factory.py +0 -0
  228. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/filter.py +0 -0
  229. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/goat_datasource.py +0 -0
  230. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/goat/parser.py +0 -0
  231. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/google_sheets/__init__.py +0 -0
  232. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  233. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/irods/__init__.py +0 -0
  234. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/irods/irods_datasource.py +0 -0
  235. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/__init__.py +0 -0
  236. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/client.py +0 -0
  237. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/converter.py +0 -0
  238. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/factory.py +0 -0
  239. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/filter.py +0 -0
  240. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/jira_datasource.py +0 -0
  241. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/mapper.py +0 -0
  242. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/parser.py +0 -0
  243. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/jira/sort.py +0 -0
  244. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/json/__init__.py +0 -0
  245. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/json/json_datasource.py +0 -0
  246. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/json/s3_json_datasource.py +0 -0
  247. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/__init__.py +0 -0
  248. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/client.py +0 -0
  249. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/converter.py +0 -0
  250. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/factory.py +0 -0
  251. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/labwhere_datasource.py +0 -0
  252. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/labwhere/parser.py +0 -0
  253. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/markdown.py +0 -0
  254. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/mlwh/__init__.py +0 -0
  255. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/mlwh/mlwh_datasource.py +0 -0
  256. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/__init__.py +0 -0
  257. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/converter.py +0 -0
  258. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/factory.py +0 -0
  259. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/filter.py +0 -0
  260. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/prefect_datasource.py +0 -0
  261. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/prefect/prefect_object.py +0 -0
  262. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/s3/__init__.py +0 -0
  263. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/s3/converter.py +0 -0
  264. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/s3/factory.py +0 -0
  265. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/s3/parser.py +0 -0
  266. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/s3/s3_datasource.py +0 -0
  267. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/__init__.py +0 -0
  268. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/configuration.py +0 -0
  269. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/consumer.py +0 -0
  270. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/message_builder.py +0 -0
  271. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/messages.py +0 -0
  272. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/response_processors.py +0 -0
  273. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sciops/sequencing_datasource.py +0 -0
  274. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/services/__init__.py +0 -0
  275. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/services/s3_client.py +0 -0
  276. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/__init__.py +0 -0
  277. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/benchling.py +0 -0
  278. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/benchling_warehouse.py +0 -0
  279. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/bioscan.py +0 -0
  280. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/bioscan_extra.py +0 -0
  281. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/bioscan_image.py +0 -0
  282. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/bioscan_qc.py +0 -0
  283. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/bold.py +0 -0
  284. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/copo.py +0 -0
  285. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/defaults.py +0 -0
  286. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/elastic.py +0 -0
  287. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/ena.py +0 -0
  288. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/gap.py +0 -0
  289. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/genome_notes.py +0 -0
  290. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/goat.py +0 -0
  291. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/grit.py +0 -0
  292. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/informatics.py +0 -0
  293. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/labwhere.py +0 -0
  294. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/mlwh.py +0 -0
  295. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/portal.py +0 -0
  296. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/portal_attributes.py +0 -0
  297. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/portaldb.py +0 -0
  298. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/prefect.py +0 -0
  299. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/sciops.py +0 -0
  300. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/sts.py +0 -0
  301. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/sts_legacy.py +0 -0
  302. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/tolid.py +0 -0
  303. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/tolqc.py +0 -0
  304. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/tolqc_legacy.py +0 -0
  305. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/treeofsex.py +0 -0
  306. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/uksi_qc.py.py +0 -0
  307. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sources/workflows.py +0 -0
  308. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/__init__.py +0 -0
  309. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/action/__init__.py +0 -0
  310. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/action/factory.py +0 -0
  311. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/auth/__init__.py +0 -0
  312. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/auth/blueprint.py +0 -0
  313. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/auth/models.py +0 -0
  314. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/cast.py +0 -0
  315. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/database.py +0 -0
  316. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/ds_session.py +0 -0
  317. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/exception.py +0 -0
  318. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/ext.py +0 -0
  319. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/factory.py +0 -0
  320. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/filter.py +0 -0
  321. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/model.py +0 -0
  322. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/pipeline_step/__init__.py +0 -0
  323. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/pipeline_step/factory.py +0 -0
  324. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/relationship.py +0 -0
  325. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/session.py +0 -0
  326. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/sort.py +0 -0
  327. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/sql_converter.py +0 -0
  328. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/sql_datasource.py +0 -0
  329. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/standard/__init__.py +0 -0
  330. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sql/standard/factory.py +0 -0
  331. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/status/__init__.py +0 -0
  332. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/status/status_datasource.py +0 -0
  333. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sts/__init__.py +0 -0
  334. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sts/sts.py +0 -0
  335. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sts/sts_datasource.py +0 -0
  336. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/sts/sts_requests.py +0 -0
  337. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/treeval/__init__.py +0 -0
  338. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/treeval/treeval_datasource.py +0 -0
  339. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/utils/__init__.py +0 -0
  340. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/utils/csv.py +0 -0
  341. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/utils/s3.py +0 -0
  342. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/allowed_keys.py +0 -0
  343. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/allowed_values.py +0 -0
  344. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/ena_submittable.py +0 -0
  345. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/min_one_valid_value.py +0 -0
  346. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/specimens_have_same_taxon.py +0 -0
  347. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/sts_fields.py +0 -0
  348. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/unique_values.py +0 -0
  349. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol/validators/unique_whole_organisms.py +0 -0
  350. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  351. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  352. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol_sdk.egg-info/requires.txt +0 -0
  353. {tol_sdk-1.7.5b0 → tol_sdk-1.7.5b2}/src/tol_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.7.5b0
3
+ Version: 1.7.5b2
4
4
  Summary: SDK for interaction with ToL, Sanger and external services
5
5
  Author-email: ToL Platforms Team <tol-platforms@sanger.ac.uk>
6
6
  License: MIT
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "tol-sdk"
11
- version = "1.7.5-beta"
11
+ version = "1.7.5-beta2"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -116,12 +116,13 @@ class EnaApiClient(HttpClient):
116
116
  Returns the URL and parameters for a detail query.
117
117
  """
118
118
  if object_type == 'checklist':
119
- ids = ','.join(object_ids)
119
+ ids = ','.join(str(id_) for id_ in object_ids)
120
120
  url = f'{self.__ena_url}/ena/browser/api/xml/{ids}'
121
121
  params = {}
122
122
  return url, params
123
123
  if object_type == 'submittable_taxon':
124
- ids = ','.join(object_ids)
124
+ # This is actually called separately for each taxon id
125
+ ids = ','.join(str(id_) for id_ in object_ids)
125
126
  url = f'{self.__ena_url}/ena/taxonomy/rest/tax-id/{ids}'
126
127
  params = {}
127
128
  return url, params
@@ -34,6 +34,8 @@ from .gap_assembly_to_elastic_assembly_analysis_converter import GapAssemblyToEl
34
34
  from .genome_notes_genome_note_to_elastic_genome_note_converter import GenomeNotesGenomeNoteToElasticGenomeNoteConverter # noqa F401
35
35
  from .goat_taxon_to_elastic_species_converter import GoatTaxonToElasticSpeciesConverter # noqa F401
36
36
  from .grit_issue_to_elastic_curation_converter import GritIssueToElasticCurationConverter # noqa F401
37
+ from .incoming_sample_to_ena_sample_converter import IncomingSampleToEnaSampleConverter # noqa
38
+ from .incoming_sample_to_incoming_sample_with_lists_converter import IncomingSampleToIncomingSampleWithListsConverter # noqa F401
37
39
  from .informatics_tolid_to_elastic_tolid_converter import InformaticsTolidToElasticTolidConverter # noqa F401
38
40
  from .labwhere_location_to_elastic_sample_update_converter import LabwhereLocationToElasticSampleUpdateConverter # noqa F401
39
41
  from .labwhere_location_to_sts_tray_converter import LabwhereLocationToStsTrayConverter # noqa F401
@@ -0,0 +1,130 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ import re
5
+ from dataclasses import dataclass
6
+ from typing import Iterable
7
+
8
+ from tol.core import DataObject, DataObjectToDataObjectOrUpdateConverter
9
+
10
+
11
+ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter):
12
+
13
+ @dataclass(slots=True, frozen=True, kw_only=True)
14
+ class Config:
15
+ ena_checklist_id: str
16
+ project_name: str
17
+
18
+ __slots__ = ['__config']
19
+ __config: Config
20
+
21
+ def __init__(self, data_object_factory, config: Config) -> None:
22
+ super().__init__(data_object_factory)
23
+ self.__config = config
24
+ self._data_object_factory = data_object_factory
25
+
26
+ def convert(self, data_object: DataObject) -> Iterable[DataObject]:
27
+ """
28
+ converting the samples DataObject into ENA format
29
+ """
30
+ s = data_object
31
+ attributes = {
32
+ 'ENA-CHECKLIST': self.__config.ena_checklist_id,
33
+ 'organism part': self.__replace_underscores(
34
+ s.attributes.get('ORGANISM_PART')),
35
+ 'lifestage': (
36
+ 'spore-bearing structure'
37
+ if s.attributes.get('LIFESTAGE') == 'SPORE_BEARING_STRUCTURE'
38
+ else self.__replace_underscores(
39
+ s.attributes.get('LIFESTAGE'))
40
+ ),
41
+ 'project name':
42
+ self.__config.project_name,
43
+ 'collected by':
44
+ self.__replace_underscores(
45
+ s.attributes.get('COLLECTED_BY')),
46
+ 'collection date':
47
+ self.__replace_underscores(
48
+ s.attributes.get('DATE_OF_COLLECTION')).lower(),
49
+ 'geographic location (country and/or sea)':
50
+ self.__collection_country(s).replace('_', ' '),
51
+ 'geographic location (latitude)':
52
+ self.__replace_underscores(
53
+ s.attributes.get('DECIMAL_LATITUDE')).lower(),
54
+ 'geographic location (latitude) units':
55
+ 'DD',
56
+ 'geographic location (longitude)':
57
+ self.__replace_underscores(
58
+ s.attributes.get('DECIMAL_LONGITUDE')).lower(),
59
+ 'geographic location (longitude) units':
60
+ 'DD',
61
+ 'geographic location (region and locality)':
62
+ self.__collection_region(s).replace('_', ' '),
63
+ 'identified_by':
64
+ self.__replace_underscores(
65
+ s.attributes.get('IDENTIFIED_BY')),
66
+ 'habitat':
67
+ self.__replace_underscores(
68
+ s.attributes.get('HABITAT')),
69
+ 'identifier_affiliation':
70
+ self.__replace_underscores(
71
+ s.attributes.get('IDENTIFIER_AFFILIATION')),
72
+ 'sex':
73
+ self.__replace_underscores(
74
+ s.attributes.get('SEX')),
75
+ 'relationship':
76
+ self.__replace_underscores(
77
+ s.attributes.get('RELATIONSHIP')),
78
+ 'SYMBIONT':
79
+ 'Y' if s.attributes.get('SYMBIONT') == 'SYMBIONT' else 'N',
80
+ 'collecting institution':
81
+ self.__replace_underscores(
82
+ s.attributes.get('COLLECTOR_AFFILIATION'))
83
+ }
84
+ if self.__sanitise(s.attributes.get('DEPTH')) != '':
85
+ attributes['geographic location (depth)'] = s.attributes.get('DEPTH')
86
+ attributes['geographic location (depth) units'] = 'm'
87
+ if self.__sanitise(s.attributes.get('ELEVATION')) != '':
88
+ attributes['geographic location (elevation)'] = s.attributes.get('ELEVATION')
89
+ attributes['geographic location (elevation) units'] = 'm'
90
+ if self.__sanitise(s.attributes.get('ORIGINAL_COLLECTION_DATE')) != '':
91
+ attributes['original collection date'] = s.attributes.get('ORIGINAL_COLLECTION_DATE')
92
+ if self.__sanitise(s.attributes.get('ORIGINAL_GEOGRAPHIC_LOCATION')) != '':
93
+ attributes['original geographic location'] = self.__replace_underscores(s.attributes.get('ORIGINAL_GEOGRAPHIC_LOCATION')) # noqa
94
+ if s.attributes.get('GAL') is not None:
95
+ attributes['GAL'] = s.attributes.get('GAL')
96
+ if s.attributes.get('VOUCHER_ID') is not None:
97
+ attributes['specimen_voucher'] = s.attributes.get('VOUCHER_ID')
98
+ if s.attributes.get('SPECIMEN_ID') is not None:
99
+ attributes['specimen_id'] = s.attributes.get('SPECIMEN_ID')
100
+ if s.attributes.get('GAL_SAMPLE_ID') is not None:
101
+ attributes['GAL_sample_id'] = s.attributes.get('GAL_SAMPLE_ID')
102
+ if s.attributes.get('CULTURE_OR_STRAIN_ID') is not None:
103
+ attributes['culture_or_strain_id'] = s.attributes.get('CULTURE_OR_STRAIN_ID')
104
+
105
+ ret = self._data_object_factory(
106
+ 'sample',
107
+ s.id,
108
+ attributes=attributes,
109
+ )
110
+ yield ret
111
+
112
+ def __collection_country(self, data_object: DataObject):
113
+ return re.split(
114
+ r'\s*\|\s*',
115
+ data_object.attributes.get('COLLECTION_LOCATION'))[0]
116
+
117
+ def __collection_region(self, data_object: DataObject):
118
+ return ' | '.join(re.split(
119
+ r'\s*\|\s*',
120
+ data_object.attributes.get('COLLECTION_LOCATION'))[1:])
121
+
122
+ def __replace_underscores(self, value):
123
+ if type(value) != str:
124
+ return value
125
+ return self.__sanitise(value, '').replace('_', ' ')
126
+
127
+ def __sanitise(self, value, default_value=''):
128
+ if value is None:
129
+ return default_value
130
+ return value
@@ -0,0 +1,46 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ from dataclasses import dataclass
5
+ from typing import Iterable
6
+
7
+ from tol.core import DataObject, DataObjectToDataObjectOrUpdateConverter
8
+
9
+
10
+ class IncomingSampleToIncomingSampleWithListsConverter(DataObjectToDataObjectOrUpdateConverter):
11
+
12
+ @dataclass(slots=True, frozen=True, kw_only=True)
13
+ class Config:
14
+ fields_to_convert: str
15
+ separator: str = '|'
16
+
17
+ __slots__ = ['__config']
18
+ __config: Config
19
+
20
+ def __init__(self, data_object_factory, config: Config) -> None:
21
+ super().__init__(data_object_factory)
22
+ self.__config = config
23
+ self._data_object_factory = data_object_factory
24
+
25
+ def convert(self, data_object: DataObject) -> Iterable[DataObject]:
26
+ """
27
+ converting the samples DataObject into ENA format
28
+ """
29
+
30
+ ret = self._data_object_factory(
31
+ data_object.type,
32
+ data_object.id,
33
+ attributes={
34
+ k: v for k, v in data_object.attributes.items()
35
+ if k not in self.__config.fields_to_convert
36
+ } | {
37
+ field: self.__convert_to_list(data_object.get_field_by_name(field))
38
+ for field in self.__config.fields_to_convert
39
+ }
40
+ )
41
+ yield ret
42
+
43
+ def __convert_to_list(self, value: str | None) -> list[str]:
44
+ if not value:
45
+ return []
46
+ return [item.strip() for item in value.split(self.__config.separator)]
@@ -6,6 +6,7 @@ from .allowed_keys import AllowedKeysValidator # noqa
6
6
  from .allowed_values import AllowedValuesValidator # noqa
7
7
  from .allowed_values_from_datasource import AllowedValuesFromDataSourceValidator # noqa
8
8
  from .assert_on_condition import AssertOnConditionValidator # noqa
9
+ from .ena_checklist import EnaChecklistValidator # noqa
9
10
  from .mutually_exclusive import MutuallyExclusiveValidator # noqa
10
11
  from .ena_submittable import EnaSubmittableValidator # noqa
11
12
  from .regex import Regex, RegexValidator # noqa
@@ -15,6 +16,5 @@ from .sts_fields import StsFieldsValidator # noqa
15
16
  from .tolid import TolidValidator # noqa
16
17
  from .unique_values import UniqueValuesValidator # noqa
17
18
  from .unique_whole_organisms import UniqueWholeOrganismsValidator # noqa
18
- # Conditions are used where validators are defined, not just within validators
19
19
  from .interfaces import Condition # noqa
20
20
  from .min_one_valid_value import MinOneValidValueValidator # noqa
@@ -17,7 +17,6 @@ class AllowedValuesFromDataSourceValidator(Validator):
17
17
  """
18
18
  @dataclass(slots=True, frozen=True, kw_only=True)
19
19
  class Config:
20
- allowed_values: List[str | int | float] | None = None
21
20
  datasource_instance_id: int
22
21
  datasource_object_type: str
23
22
  datasource_field_name: str
@@ -30,19 +29,15 @@ class AllowedValuesFromDataSourceValidator(Validator):
30
29
  def __init__(
31
30
  self,
32
31
  config: Config,
32
+ allowed_values: List[str | int | float] | None = None # For testing
33
33
  ) -> None:
34
34
 
35
35
  super().__init__()
36
36
 
37
37
  self.__config = config
38
- self.__cached_list = self.__config.allowed_values \
38
+ self.__cached_list = allowed_values \
39
39
  or self.__initialize_list_from_datasource()
40
40
 
41
- if self.__config.allowed_values is None:
42
- self.__cached_list = self.__initialize_list_from_datasource()
43
- else:
44
- self.__cached_list = self.__config.allowed_values
45
-
46
41
  def __initialize_list_from_datasource(self) -> List[str | int | float]:
47
42
  dsi = portaldb().get_one('data_source_instance', self.__config.datasource_instance_id)
48
43
  ds = DataSourceUtils.get_data_source_by_data_source_instance(dsi)
@@ -59,8 +54,11 @@ class AllowedValuesFromDataSourceValidator(Validator):
59
54
  obj: DataObject
60
55
  ) -> None:
61
56
  field_value = obj.get_field_by_name(self.__config.field_name)
62
- if field_value not in self.__cached_list:
63
- print(self.__cached_list)
57
+ if not field_value:
58
+ return
59
+ if not isinstance(field_value, list):
60
+ field_value = [field_value]
61
+ if any(value not in self.__cached_list for value in field_value):
64
62
  multiple_cached_values = len(self.__cached_list) > 1
65
63
 
66
64
  cached_list_str = ''
@@ -7,7 +7,7 @@ from typing import List
7
7
 
8
8
  from tol.core import DataObject, Validator
9
9
 
10
- from .interfaces import Condition, ConditionEvaluator
10
+ from .interfaces import Condition, ConditionDict, ConditionEvaluator
11
11
 
12
12
 
13
13
  class AssertOnConditionValidator(Validator, ConditionEvaluator):
@@ -19,8 +19,8 @@ class AssertOnConditionValidator(Validator, ConditionEvaluator):
19
19
  """
20
20
  @dataclass(slots=True, frozen=True, kw_only=True)
21
21
  class Config:
22
- condition: Condition
23
- assertions: List[Condition]
22
+ condition: ConditionDict
23
+ assertions: List[ConditionDict]
24
24
 
25
25
  __slots__ = ['__config']
26
26
  __config: Config
@@ -33,10 +33,10 @@ class AssertOnConditionValidator(Validator, ConditionEvaluator):
33
33
  def _validate_data_object(self, obj: DataObject) -> None:
34
34
  # Check condition atribute
35
35
  # (only perform the assertions if the condition passes)
36
- if self._does_condition_pass(self.__config.condition, obj):
36
+ if self._does_condition_pass(Condition.from_dict(self.__config.condition), obj):
37
37
  # Perform each assertion
38
38
  for assertion in self.__config.assertions:
39
- self.__perform_assertion(obj, assertion)
39
+ self.__perform_assertion(obj, Condition.from_dict(assertion))
40
40
 
41
41
  def __perform_assertion(self, obj: DataObject, assertion: Condition) -> None:
42
42
  # There's only an error or warning if the assertion condition fails
@@ -0,0 +1,73 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ import re
6
+ from dataclasses import dataclass
7
+
8
+ from tol.core import DataSource
9
+ from tol.core.data_object import DataObject
10
+ from tol.core.validate import Validator
11
+ from tol.sources.ena import ena
12
+
13
+
14
+ class EnaChecklistValidator(Validator):
15
+ """
16
+ validates the ENA_CHECKLIST for each samples
17
+ """
18
+
19
+ @dataclass(slots=True, frozen=True, kw_only=True)
20
+ class Config:
21
+ ena_checklist_id: str
22
+
23
+ __slots__ = ['__config']
24
+ __config: Config
25
+
26
+ def __init__(self, config: Config, datasource: DataSource = ena()) -> None:
27
+ super().__init__()
28
+ self.__config = config
29
+ self._datasource = datasource
30
+
31
+ def _validate_data_object(self, obj: DataObject) -> None:
32
+ ena_datasource = self._datasource
33
+ ena_checklist = ena_datasource.get_one('checklist', self.__config.ena_checklist_id)
34
+
35
+ validations = ena_checklist.attributes['checklist']
36
+ for key in validations:
37
+ field_name = key
38
+ if 'field' in validations[key]:
39
+ field_name = validations[key]['field']
40
+ if 'mandatory' in validations[key] and key not in obj.attributes:
41
+ self.add_error(object_id=obj.id, detail='Must be given', field=[field_name])
42
+ continue
43
+ if 'mandatory' in validations[key] and obj.attributes[key] is None:
44
+ self.add_error(object_id=obj.id, detail='Must be given', field=[field_name])
45
+ continue
46
+ if 'mandatory' in validations[key] and obj.attributes.get(key) == '':
47
+ self.add_error(
48
+ object_id=obj.id,
49
+ detail='Must not be empty', field=[field_name]
50
+ )
51
+
52
+ if 'restricted text' in validations[key] and key in obj.attributes:
53
+ for condition in validations[key]:
54
+ if type(condition) == str and '(' in condition:
55
+ regex = condition
56
+ compiled_re = re.compile(regex)
57
+ if not compiled_re.search(obj.attributes.get(key)):
58
+ self.add_error(
59
+ object_id=obj.id,
60
+ detail='Must match specific pattern', field=[field_name]
61
+ )
62
+
63
+ # Check against allowed values
64
+ if 'text choice' in validations[key] and key in obj.attributes:
65
+ for condition in validations[key]:
66
+ if type(condition) == list:
67
+ allowed_values = condition
68
+ if obj.attributes.get(key).lower() not in \
69
+ [x.lower() for x in allowed_values]:
70
+ self.add_error(
71
+ object_id=obj.id,
72
+ detail='Must be in allowed values', field=[field_name]
73
+ )
@@ -0,0 +1,5 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from .condition_evaluator import Condition, ConditionDict, ConditionEvaluator # noqa
@@ -4,11 +4,18 @@
4
4
 
5
5
  from abc import ABC
6
6
  from dataclasses import dataclass
7
- from typing import Any, Tuple
7
+ from typing import Any, Dict, Tuple, cast
8
8
 
9
9
  from tol.core import DataObject
10
10
 
11
11
 
12
+ ConditionDict = Dict[str, str | Any | bool]
13
+ """
14
+ The dict representation of a Condition. Conditions can be constructed
15
+ from such a dict through Condition.from_dict(condition_dict)
16
+ """
17
+
18
+
12
19
  @dataclass(slots=True)
13
20
  class Condition:
14
21
  field: str
@@ -21,6 +28,40 @@ class Condition:
21
28
  def __repr__(self) -> str:
22
29
  return f'{self.field} {self.operator} {self.value}'
23
30
 
31
+ @staticmethod
32
+ def from_dict(condition_dict: ConditionDict) -> 'Condition':
33
+ """
34
+ A means of instantiating a Condition from a dictionary.
35
+ This is a separate method (rather than constructing with kwargs
36
+ like `Condition(**condition_dict))`) to allow for both precense
37
+ and type checking for each field.
38
+ """
39
+ try:
40
+ # Extract fields
41
+ field = condition_dict['field']
42
+ operator = condition_dict['operator']
43
+ value = condition_dict['value']
44
+ is_error = condition_dict.get('is_error', True)
45
+
46
+ # Ensure fields are the correct type
47
+ if not isinstance(field, str) and not isinstance(operator, str):
48
+ raise Exception(
49
+ f'Dictionary {condition_dict} not in valid format '
50
+ f'to convert to Condition (type of condition dict incorrect)'
51
+ )
52
+
53
+ return Condition(
54
+ cast(str, field),
55
+ cast(str, operator),
56
+ value,
57
+ cast(bool, is_error),
58
+ )
59
+ except IndexError as e:
60
+ raise Exception(
61
+ f'Dictionary {condition_dict} not in valid format '
62
+ f'to convert to Condition (key "{e.args[0]}" not found)'
63
+ )
64
+
24
65
 
25
66
  class ConditionEvaluator(ABC):
26
67
  """
@@ -7,7 +7,7 @@ from typing import Any, List
7
7
 
8
8
  from tol.core import DataObject, Validator
9
9
 
10
- from .interfaces import Condition, ConditionEvaluator
10
+ from .interfaces import Condition, ConditionDict, ConditionEvaluator
11
11
 
12
12
 
13
13
  class MutuallyExclusiveValidator(Validator, ConditionEvaluator):
@@ -19,12 +19,16 @@ class MutuallyExclusiveValidator(Validator, ConditionEvaluator):
19
19
  """
20
20
  @dataclass(slots=True, frozen=True, kw_only=True)
21
21
  class Config:
22
- first_field_where: Condition
23
- second_field_where: Condition
22
+ first_field_where: ConditionDict
23
+ second_field_where: ConditionDict
24
24
  target_fields: List[str]
25
25
  detail: str | None = None
26
26
 
27
27
  def _get_error_message(self) -> str:
28
+ # Extract conditions
29
+ first_condition = Condition.from_dict(self.first_field_where)
30
+ second_condition = Condition.from_dict(self.second_field_where)
31
+
28
32
  # Use a pre-defined, hard-coded detail message if one was not provided
29
33
  if self.detail is None:
30
34
  multiple_target_fields = len(self.target_fields) > 1
@@ -47,8 +51,8 @@ class MutuallyExclusiveValidator(Validator, ConditionEvaluator):
47
51
 
48
52
  return (
49
53
  f'The field{possible_plural} {target_fields_str} cannot have the same '
50
- f'value{possible_plural} both when {self.first_field_where} and when '
51
- f'{self.second_field_where}'
54
+ f'value{possible_plural} both when {first_condition} and when '
55
+ f'{second_condition}'
52
56
  )
53
57
  else:
54
58
  return self.detail
@@ -67,7 +71,7 @@ class MutuallyExclusiveValidator(Validator, ConditionEvaluator):
67
71
 
68
72
  def _validate_data_object(self, obj: DataObject) -> None:
69
73
  # Check first field
70
- if self._does_condition_pass(self.__config.first_field_where, obj):
74
+ if self._does_condition_pass(Condition.from_dict(self.__config.first_field_where), obj):
71
75
  # Check whether the values of the target fields were found in the second list
72
76
  if [
73
77
  obj.get_field_by_name(target_field)
@@ -86,7 +90,7 @@ class MutuallyExclusiveValidator(Validator, ConditionEvaluator):
86
90
  ]
87
91
  )
88
92
  # Check second field (same as the first condition, but for the second!)
89
- elif self._does_condition_pass(self.__config.second_field_where, obj):
93
+ elif self._does_condition_pass(Condition.from_dict(self.__config.second_field_where), obj):
90
94
  # Check whether the values of the target fields were found in the first list
91
95
  if [
92
96
  obj.get_field_by_name(target_field)
@@ -10,6 +10,12 @@ from tol.core import DataObject
10
10
  from tol.core.validate import Validator
11
11
 
12
12
 
13
+ RegexDict = dict[
14
+ str,
15
+ str | bool | list[Any],
16
+ ]
17
+
18
+
13
19
  @dataclass(frozen=True, kw_only=True)
14
20
  class Regex:
15
21
  key: str
@@ -31,7 +37,7 @@ class RegexValidator(Validator):
31
37
  """
32
38
  @dataclass(slots=True, frozen=True, kw_only=True)
33
39
  class Config:
34
- regexes: List[Regex]
40
+ regexes: List[Regex | RegexDict]
35
41
 
36
42
  __slots__ = ['__config']
37
43
  __config: Config
@@ -43,7 +49,7 @@ class RegexValidator(Validator):
43
49
 
44
50
  super().__init__()
45
51
 
46
- self.__config = config
52
+ self.__config = self.__get_config(config)
47
53
 
48
54
  def _validate_data_object(
49
55
  self,
@@ -93,3 +99,18 @@ class RegexValidator(Validator):
93
99
  detail=c.detail,
94
100
  field=c.key,
95
101
  )
102
+
103
+ def __get_config(
104
+ self,
105
+ config: Config,
106
+ ) -> Config:
107
+
108
+ # Ensure config is in Regex format
109
+ # (as you can either pass in a list of Regex or a RegexDict,
110
+ # which can be used to initialize a Regex)
111
+ return self.Config(
112
+ regexes=[
113
+ c if isinstance(c, Regex) else Regex(**c)
114
+ for c in config.regexes
115
+ ]
116
+ )
@@ -8,7 +8,7 @@ from typing import Dict, List
8
8
  from tol.core import DataObject
9
9
  from tol.core.validate import Validator
10
10
 
11
- from .regex import Regex
11
+ from .regex import Regex, RegexDict
12
12
 
13
13
 
14
14
  class RegexByValueValidator(Validator):
@@ -20,7 +20,7 @@ class RegexByValueValidator(Validator):
20
20
  @dataclass(slots=True, frozen=True, kw_only=True)
21
21
  class Config:
22
22
  key_column: str
23
- regexes: Dict[str, List[Regex]]
23
+ regexes: Dict[str, List[Regex | RegexDict]]
24
24
 
25
25
  __slots__ = ['__config']
26
26
  config: Config
@@ -32,7 +32,7 @@ class RegexByValueValidator(Validator):
32
32
 
33
33
  super().__init__()
34
34
 
35
- self.__config = config
35
+ self.__config = self.__get_config(config)
36
36
 
37
37
  def _validate_data_object(
38
38
  self,
@@ -78,3 +78,22 @@ class RegexByValueValidator(Validator):
78
78
  detail=c.detail,
79
79
  field=c.key,
80
80
  )
81
+
82
+ def __get_config(
83
+ self,
84
+ config: Config,
85
+ ) -> Config:
86
+
87
+ # Ensure config is in Regex format
88
+ # (as you can either pass in a list of Regex or a RegexDict,
89
+ # which can be used to initialize a Regex)
90
+ return self.Config(
91
+ key_column=config.key_column,
92
+ regexes={
93
+ k: [
94
+ c if isinstance(c, Regex) else Regex(**c)
95
+ for c in v
96
+ ]
97
+ for k, v in config.regexes.items()
98
+ }
99
+ )
@@ -90,7 +90,7 @@ class TolidValidator(Validator):
90
90
  f.and_ = {'specimen_id': {'eq': {'value': specimen_id}}}
91
91
  self.__cached_tolids[specimen_id] = list(self.__datasource.get_list(
92
92
  object_type='specimen',
93
- filters=f
93
+ object_filters=f
94
94
  ))
95
95
 
96
96
  if (len(self.__cached_tolids[specimen_id]) == 0):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.7.5b0
3
+ Version: 1.7.5b2
4
4
  Summary: SDK for interaction with ToL, Sanger and external services
5
5
  Author-email: ToL Platforms Team <tol-platforms@sanger.ac.uk>
6
6
  License: MIT
@@ -185,6 +185,8 @@ src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py
185
185
  src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py
186
186
  src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py
187
187
  src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py
188
+ src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py
189
+ src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py
188
190
  src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py
189
191
  src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py
190
192
  src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py
@@ -328,6 +330,7 @@ src/tol/validators/allowed_keys.py
328
330
  src/tol/validators/allowed_values.py
329
331
  src/tol/validators/allowed_values_from_datasource.py
330
332
  src/tol/validators/assert_on_condition.py
333
+ src/tol/validators/ena_checklist.py
331
334
  src/tol/validators/ena_submittable.py
332
335
  src/tol/validators/min_one_valid_value.py
333
336
  src/tol/validators/mutually_exclusive.py
@@ -1,5 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- from .condition_evaluator import Condition, ConditionEvaluator # noqa
File without changes
File without changes
File without changes
File without changes