tol-sdk 1.8.6__tar.gz → 1.8.7__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 (374) hide show
  1. {tol_sdk-1.8.6/src/tol_sdk.egg-info → tol_sdk-1.8.7}/PKG-INFO +1 -1
  2. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/pyproject.toml +1 -1
  3. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/api_datasource.py +1 -14
  4. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/client.py +5 -3
  5. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/factory.py +8 -0
  6. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/benchling_warehouse_datasource.py +6 -3
  7. tol_sdk-1.8.6/src/tol/benchling/sql/extraction_containers_dna.sql → tol_sdk-1.8.7/src/tol/benchling/sql/extraction_container_extraction_extraction_type_dna.sql +25 -23
  8. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +8 -8
  9. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/factory.py +1 -1
  10. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/requested_fields.py +4 -3
  11. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/__init__.py +1 -0
  12. tol_sdk-1.8.7/src/tol/flows/converters/benchling_extraction_container_to_elastic_extraction_container_converter.py +53 -0
  13. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +8 -1
  14. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +8 -0
  15. tol_sdk-1.8.7/src/tol/flows/converters/time_string_to_time.py +44 -0
  16. {tol_sdk-1.8.6 → tol_sdk-1.8.7/src/tol_sdk.egg-info}/PKG-INFO +1 -1
  17. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol_sdk.egg-info/SOURCES.txt +2 -1
  18. tol_sdk-1.8.6/src/tol/flows/converters/time_string_to_time.py +0 -35
  19. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/LICENSE +0 -0
  20. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/MANIFEST.in +0 -0
  21. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/README.md +0 -0
  22. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/setup.cfg +0 -0
  23. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/certs/cacert.pem +0 -0
  24. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/__init__.py +0 -0
  25. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/actions/__init__.py +0 -0
  26. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/actions/action.py +0 -0
  27. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/actions/upsert_action.py +0 -0
  28. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/__init__.py +0 -0
  29. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/action.py +0 -0
  30. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/__init__.py +0 -0
  31. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/abc/__init__.py +0 -0
  32. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/abc/auth.py +0 -0
  33. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  34. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/asserts.py +0 -0
  35. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/blueprint.py +0 -0
  36. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/composite.py +0 -0
  37. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/config.py +0 -0
  38. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/auth/error.py +0 -0
  39. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/blueprint.py +0 -0
  40. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/controller.py +0 -0
  41. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/data_upload.py +0 -0
  42. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/__init__.py +0 -0
  43. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/aggregation_body.py +0 -0
  44. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  45. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/auth_context.py +0 -0
  46. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/authenticate.py +0 -0
  47. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/data_body.py +0 -0
  48. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/filter_utils.py +0 -0
  49. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  50. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/relation_url.py +0 -0
  51. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/misc/stats_parameters.py +0 -0
  52. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/pipeline_steps.py +0 -0
  53. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_base/system.py +0 -0
  54. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/__init__.py +0 -0
  55. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/converter.py +0 -0
  56. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/exception.py +0 -0
  57. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/filter.py +0 -0
  58. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/parser.py +0 -0
  59. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/validate.py +0 -0
  60. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/api_client/view.py +0 -0
  61. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/barcodes/__init__.py +0 -0
  62. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/barcodes/main.py +0 -0
  63. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/__init__.py +0 -0
  64. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/benchling_converter.py +0 -0
  65. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/benchling_datasource.py +0 -0
  66. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/__init__.py +0 -0
  67. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
  68. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
  69. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  70. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  71. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  72. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  73. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  74. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  75. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  76. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  77. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  78. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/sample.sql +0 -0
  79. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  80. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  81. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  82. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  83. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/board/__init__.py +0 -0
  84. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/board/blueprint.py +0 -0
  85. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/__init__.py +0 -0
  86. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/bold_datasource.py +0 -0
  87. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/client.py +0 -0
  88. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/converter.py +0 -0
  89. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/factory.py +0 -0
  90. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/bold/parser.py +0 -0
  91. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/cli/__init__.py +0 -0
  92. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/cli/cli.py +0 -0
  93. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/converter/__init__.py +0 -0
  94. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/converter/yaml/__init__.py +0 -0
  95. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/converter/yaml/model.py +0 -0
  96. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/converter/yaml/yaml_converter.py +0 -0
  97. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/__init__.py +0 -0
  98. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/client.py +0 -0
  99. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/converter.py +0 -0
  100. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/copo_datasource.py +0 -0
  101. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/factory.py +0 -0
  102. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/copo/parser.py +0 -0
  103. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/__init__.py +0 -0
  104. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/attribute_metadata.py +0 -0
  105. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/core_converter.py +0 -0
  106. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/data_loader.py +0 -0
  107. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/data_object.py +0 -0
  108. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/data_object_converter.py +0 -0
  109. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/data_source_attribute_metadata.py +0 -0
  110. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/data_source_dict.py +0 -0
  111. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/datasource.py +0 -0
  112. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/datasource_error.py +0 -0
  113. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/datasource_filter.py +0 -0
  114. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/datasource_utils.py +0 -0
  115. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/http_client.py +0 -0
  116. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/__init__.py +0 -0
  117. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/_filterable.py +0 -0
  118. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/_writer.py +0 -0
  119. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/aggregator.py +0 -0
  120. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/counter.py +0 -0
  121. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/cursor.py +0 -0
  122. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/declare.py +0 -0
  123. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/deleter.py +0 -0
  124. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/detail_getter.py +0 -0
  125. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/enricher.py +0 -0
  126. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/enum.py +0 -0
  127. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/group_statter.py +0 -0
  128. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/inserter.py +0 -0
  129. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/list_getter.py +0 -0
  130. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/operator_config.py +0 -0
  131. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/page_getter.py +0 -0
  132. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/relational.py +0 -0
  133. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/statter.py +0 -0
  134. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/summariser.py +0 -0
  135. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/updater.py +0 -0
  136. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/operator/upserter.py +0 -0
  137. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/relationship.py +0 -0
  138. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/session.py +0 -0
  139. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/core/validate.py +0 -0
  140. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/__init__.py +0 -0
  141. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/client.py +0 -0
  142. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/converter.py +0 -0
  143. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/dummy_datasource.py +0 -0
  144. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/factory.py +0 -0
  145. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/dummy/parser.py +0 -0
  146. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/elastic/__init__.py +0 -0
  147. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/elastic/elastic_datasource.py +0 -0
  148. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/elastic/runtime_fields.py +0 -0
  149. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/__init__.py +0 -0
  150. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/auth.py +0 -0
  151. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/eln_datasource.py +0 -0
  152. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/entities.py +0 -0
  153. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/generators.py +0 -0
  154. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/eln/sanitise.py +0 -0
  155. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/__init__.py +0 -0
  156. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/client.py +0 -0
  157. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/converter.py +0 -0
  158. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/ena_datasource.py +0 -0
  159. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/ena_methods.py +0 -0
  160. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/factory.py +0 -0
  161. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/filter.py +0 -0
  162. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/ena/parser.py +0 -0
  163. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/excel/__init__.py +0 -0
  164. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/excel/excel.py +0 -0
  165. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/excel/excel_datasource.py +0 -0
  166. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/excel/s3_factory.py +0 -0
  167. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/__init__.py +0 -0
  168. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/auto_detect_manifest_type_converter.py +0 -0
  169. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  170. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  171. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  172. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  173. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  174. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  175. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  176. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  177. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  178. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  179. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  180. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  181. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  182. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/combine_fields_converter.py +0 -0
  183. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/default_field_value_if_missing_converter.py +0 -0
  184. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  185. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  186. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  187. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  188. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  189. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  190. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  191. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  192. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  193. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  194. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  195. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  196. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  197. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  198. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  199. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  200. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
  201. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
  202. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  203. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  204. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  205. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  206. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  207. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  208. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/prefix_field_converter.py +0 -0
  209. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
  210. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  211. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  212. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  213. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  214. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  215. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  216. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  217. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  218. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  219. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  220. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  221. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  222. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  223. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/logger.py +0 -0
  224. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/secrets.py +0 -0
  225. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/flows/sequencing_submissions.py +0 -0
  226. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/gap/__init__.py +0 -0
  227. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/gap/gap_datasource.py +0 -0
  228. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/__init__.py +0 -0
  229. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/client.py +0 -0
  230. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/converter.py +0 -0
  231. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/factory.py +0 -0
  232. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/filter.py +0 -0
  233. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/goat_datasource.py +0 -0
  234. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/goat/parser.py +0 -0
  235. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/google_sheets/__init__.py +0 -0
  236. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  237. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/irods/__init__.py +0 -0
  238. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/irods/irods_datasource.py +0 -0
  239. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/__init__.py +0 -0
  240. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/client.py +0 -0
  241. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/converter.py +0 -0
  242. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/factory.py +0 -0
  243. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/filter.py +0 -0
  244. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/jira_datasource.py +0 -0
  245. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/mapper.py +0 -0
  246. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/parser.py +0 -0
  247. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/jira/sort.py +0 -0
  248. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/json/__init__.py +0 -0
  249. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/json/json_datasource.py +0 -0
  250. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/json/s3_json_datasource.py +0 -0
  251. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/__init__.py +0 -0
  252. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/client.py +0 -0
  253. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/converter.py +0 -0
  254. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/factory.py +0 -0
  255. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/labwhere_datasource.py +0 -0
  256. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/labwhere/parser.py +0 -0
  257. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/markdown.py +0 -0
  258. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/mlwh/__init__.py +0 -0
  259. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/mlwh/mlwh_datasource.py +0 -0
  260. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/__init__.py +0 -0
  261. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/converter.py +0 -0
  262. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/factory.py +0 -0
  263. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/filter.py +0 -0
  264. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/prefect_datasource.py +0 -0
  265. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/prefect/prefect_object.py +0 -0
  266. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/s3/__init__.py +0 -0
  267. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/s3/converter.py +0 -0
  268. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/s3/factory.py +0 -0
  269. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/s3/parser.py +0 -0
  270. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/s3/s3_datasource.py +0 -0
  271. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/__init__.py +0 -0
  272. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/configuration.py +0 -0
  273. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/consumer.py +0 -0
  274. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/message_builder.py +0 -0
  275. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/messages.py +0 -0
  276. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/response_processors.py +0 -0
  277. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sciops/sequencing_datasource.py +0 -0
  278. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/services/__init__.py +0 -0
  279. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/services/s3_client.py +0 -0
  280. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/__init__.py +0 -0
  281. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/benchling.py +0 -0
  282. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/benchling_warehouse.py +0 -0
  283. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/bioscan.py +0 -0
  284. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/bioscan_extra.py +0 -0
  285. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/bioscan_image.py +0 -0
  286. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/bioscan_qc.py +0 -0
  287. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/bold.py +0 -0
  288. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/copo.py +0 -0
  289. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/defaults.py +0 -0
  290. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/dummy.py +0 -0
  291. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/elastic.py +0 -0
  292. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/ena.py +0 -0
  293. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/gap.py +0 -0
  294. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/genome_notes.py +0 -0
  295. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/goat.py +0 -0
  296. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/grit.py +0 -0
  297. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/informatics.py +0 -0
  298. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/labwhere.py +0 -0
  299. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/mlwh.py +0 -0
  300. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/portal.py +0 -0
  301. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/portal_attributes.py +0 -0
  302. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/portaldb.py +0 -0
  303. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/prefect.py +0 -0
  304. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/sciops.py +0 -0
  305. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/sts.py +0 -0
  306. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/sts_legacy.py +0 -0
  307. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/tolid.py +0 -0
  308. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/tolqc.py +0 -0
  309. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/tolqc_legacy.py +0 -0
  310. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/treeofsex.py +0 -0
  311. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/uksi_qc.py.py +0 -0
  312. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sources/workflows.py +0 -0
  313. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/__init__.py +0 -0
  314. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/action/__init__.py +0 -0
  315. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/action/factory.py +0 -0
  316. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/auth/__init__.py +0 -0
  317. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/auth/blueprint.py +0 -0
  318. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/auth/models.py +0 -0
  319. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/cast.py +0 -0
  320. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/database.py +0 -0
  321. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/ds_session.py +0 -0
  322. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/exception.py +0 -0
  323. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/ext.py +0 -0
  324. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/factory.py +0 -0
  325. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/filter.py +0 -0
  326. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/model.py +0 -0
  327. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/pipeline_step/__init__.py +0 -0
  328. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/pipeline_step/factory.py +0 -0
  329. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/relationship.py +0 -0
  330. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/session.py +0 -0
  331. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/sort.py +0 -0
  332. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/sql_converter.py +0 -0
  333. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/sql_datasource.py +0 -0
  334. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/standard/__init__.py +0 -0
  335. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sql/standard/factory.py +0 -0
  336. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/status/__init__.py +0 -0
  337. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/status/status_datasource.py +0 -0
  338. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sts/__init__.py +0 -0
  339. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sts/sts.py +0 -0
  340. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sts/sts_datasource.py +0 -0
  341. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/sts/sts_requests.py +0 -0
  342. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/treeval/__init__.py +0 -0
  343. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/treeval/treeval_datasource.py +0 -0
  344. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/utils/__init__.py +0 -0
  345. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/utils/csv.py +0 -0
  346. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/utils/s3.py +0 -0
  347. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/__init__.py +0 -0
  348. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/allowed_keys.py +0 -0
  349. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/allowed_values.py +0 -0
  350. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/allowed_values_from_datasource.py +0 -0
  351. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/assert_on_condition.py +0 -0
  352. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/branching.py +0 -0
  353. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/converter_and_validate.py +0 -0
  354. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/date_sorting.py +0 -0
  355. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/ena_checklist.py +0 -0
  356. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/ena_submittable.py +0 -0
  357. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/interfaces/__init__.py +0 -0
  358. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
  359. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/min_one_valid_value.py +0 -0
  360. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/mutually_exclusive.py +0 -0
  361. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/regex.py +0 -0
  362. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/regex_by_value.py +0 -0
  363. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/specimens_have_same_taxon.py +0 -0
  364. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/sts_fields.py +0 -0
  365. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/tolid.py +0 -0
  366. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/types.py +0 -0
  367. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/unique_value_check.py +0 -0
  368. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/unique_values.py +0 -0
  369. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/unique_whole_organisms.py +0 -0
  370. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol/validators/value_check.py +0 -0
  371. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  372. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  373. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/src/tol_sdk.egg-info/requires.txt +0 -0
  374. {tol_sdk-1.8.6 → tol_sdk-1.8.7}/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.8.6
3
+ Version: 1.8.7
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.8.6"
11
+ version = "1.8.7"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -134,28 +134,17 @@ class ApiDataSource(
134
134
  for k, v in transfer.items()
135
135
  }
136
136
 
137
+ @requested_fields_to_tree
137
138
  @validate('detailGet')
138
139
  def get_by_id(
139
140
  self,
140
141
  object_type: str,
141
142
  object_ids: Iterable[str],
142
143
  session: Optional[OperableSession] = None,
143
- requested_fields: list[str] | None = None,
144
144
  requested_tree: ReqFieldsTree | None = None,
145
145
  ) -> Iterable[Optional[DataObject]]:
146
146
 
147
147
  client = self.__client_factory()
148
- # This would be better handled in the decorator but there is a slight
149
- # difference in handling here with the requested_tree when requested_fields is None
150
- requested_tree = (
151
- ReqFieldsTree(
152
- object_type,
153
- self,
154
- requested_fields=requested_fields,
155
- )
156
- if object_type
157
- else None
158
- )
159
148
 
160
149
  json_responses = (
161
150
  client.get_detail(
@@ -182,7 +171,6 @@ class ApiDataSource(
182
171
  object_filters: Optional[DataSourceFilter] = None,
183
172
  sort_by: Optional[str] = None,
184
173
  session: Optional[OperableSession] = None,
185
- requested_fields: list[str] | None = None,
186
174
  requested_tree: ReqFieldsTree | None = None,
187
175
  ) -> tuple[Iterable[DataObject], int]:
188
176
 
@@ -204,7 +192,6 @@ class ApiDataSource(
204
192
  object_type: str,
205
193
  object_filters: Optional[DataSourceFilter] = None,
206
194
  session: Optional[OperableSession] = None,
207
- requested_fields: list[str] | None = None,
208
195
  requested_tree: ReqFieldsTree | None = None,
209
196
  ) -> Iterable[DataObject]:
210
197
  if self.__can_cursor(object_type, object_filters):
@@ -54,11 +54,13 @@ class JsonApiClient(HttpClient):
54
54
  url = self.__detail_url(object_type, object_id)
55
55
  headers = self._merge_headers()
56
56
 
57
+ params = {}
58
+ if requested_tree:
59
+ params['requested_fields'] = requested_tree.to_paths()
60
+
57
61
  return self.__fetch_detail(
58
62
  url,
59
- params={
60
- 'requested_fields': requested_tree.to_paths() if requested_tree else None,
61
- },
63
+ params=params,
62
64
  headers=headers,
63
65
  )
64
66
 
@@ -64,6 +64,14 @@ class _ConverterFactory:
64
64
  """
65
65
  Returns an instantiated `JsonApiConverter`.
66
66
  """
67
+
68
+ # If we're going to parse a JSON:API data object (i.e. we have been
69
+ # passed an `object_type`), we need to add a ReqFieldsTree so that
70
+ # DataSources with default loading of to-one objects correctly
71
+ # process the to-ones from the `included` array.
72
+ if object_type and not requested_tree:
73
+ requested_tree = ReqFieldsTree(object_type, self.__data_source)
74
+
67
75
  parser = DefaultParser(self.__ds_dict, requested_tree)
68
76
  return JsonApiConverter(parser)
69
77
 
@@ -45,6 +45,7 @@ class BenchlingWarehouseDataSource(DataSource, ListGetter):
45
45
  'sample': 'sts_id',
46
46
  'sequencing_request': 'sanger_sample_id',
47
47
  'extraction': 'extraction_id',
48
+ 'extraction_container': 'fluidx_container_id',
48
49
  'tissue_prep': 'eln_tissue_prep_id'
49
50
  }
50
51
 
@@ -70,7 +71,7 @@ class BenchlingWarehouseDataSource(DataSource, ListGetter):
70
71
  yield self.data_object_factory(
71
72
  object_type,
72
73
  id_=obj[id_col],
73
- attributes=obj
74
+ attributes={k: v for k, v in obj.items() if k != id_col}
74
75
  )
75
76
 
76
77
  def get_list(
@@ -82,7 +83,9 @@ class BenchlingWarehouseDataSource(DataSource, ListGetter):
82
83
  file_suffix = ''
83
84
  if object_filters is not None:
84
85
  if isinstance(object_filters.and_, dict):
85
- for field_name in ['sequencing_platform', 'extraction_type']:
86
+ for field_name in [
87
+ 'sequencing_platform', 'extraction_type', 'extraction.extraction_type'
88
+ ]:
86
89
  if field_name in object_filters.and_:
87
90
  # For an in_list, treat as multiple eq
88
91
  if 'in_list' in object_filters.and_[field_name]:
@@ -101,7 +104,7 @@ class BenchlingWarehouseDataSource(DataSource, ListGetter):
101
104
  ) for val in object_filters.and_[field_name]['in_list']['value']
102
105
  )
103
106
  elif 'eq' in object_filters.and_[field_name]:
104
- file_suffix = '_' + field_name + '_' \
107
+ file_suffix = '_' + field_name.replace('.', '_') + '_' \
105
108
  + object_filters.and_[field_name]['eq']['value']
106
109
  else:
107
110
  raise DataSourceError('Filtering only on sequencing platform and extraction '
@@ -9,28 +9,29 @@ Output: Table with columns:
9
9
 
10
10
  1) taxon_id: [character] Tissue metadata. Origin: STS
11
11
  2) eln_tissue_id: [character] Benchling ID for the tissue the extraction is derived from.
12
- 3) eln_tissue_prep_id: [character] Benchling ID for the tissue prep the extraction is derived from.
13
- 4) extraction_id: [character] DNA extraction entity ID (Benchling).
14
- 5) programme_id: [character] ToLID. Origin: BWH.
15
- 6) specimen_id: [character] Specimen ID. Origin: STS.
16
- 7) creation_date: [date] Date the container was created.
17
- 8) fluidx_container_id: [character] Primary key for the FluidX container.
18
- 9) fluidx_id: [character] FluidX barcode.
19
- 10) tube_type: [character] Type of tube/container.
20
- 11) volume_ul: [numeric] Volume in microliters (0 if archived as 'Retired' or 'Expended').
21
- 12) location: [character] Storage location name.
22
- 13) rack: [character] Box/rack barcode.
23
- 14) archive_purpose: [character] Reason for archiving the DNA extraction.
24
- 15) nanodrop_concentration_ngul: [numeric] Latest Nanodrop concentration (ng/µL).
25
- 16) dna_260_280_ratio: [numeric] Latest Nanodrop 260/280 ratio.
26
- 17) dna_260_230_ratio: [numeric] Latest Nanodrop 260/230 ratio.
27
- 18) qubit_concentration_ngul: [numeric] Latest Qubit concentration (ng/µL).
28
- 19) yield_ng: [numeric] Latest yield (ng).
29
- 20) femto_date_code: [character] Latest Femto date code.
30
- 21) femto_description: [character] Latest Femto profile description.
31
- 22) gqn_index: [numeric] Latest GQN index from Femto.
32
- 23) next_step: [character] Latest decision making next step.
33
- 24) extraction_qc_result: [character] Latest extraction QC result.
12
+ 3) tissue_sts_id: [character] STS ID for the tissue the extraction is derived from.
13
+ 4) eln_tissue_prep_id: [character] Benchling ID for the tissue prep the extraction is derived from.
14
+ 5) extraction_id: [character] DNA extraction entity ID (Benchling).
15
+ 6) programme_id: [character] ToLID. Origin: BWH.
16
+ 7) specimen_id: [character] Specimen ID. Origin: STS.
17
+ 8) creation_date: [date] Date the container was created.
18
+ 9) fluidx_container_id: [character] Primary key for the FluidX container.
19
+ 10) fluidx_id: [character] FluidX barcode.
20
+ 11) tube_type: [character] Type of tube/container.
21
+ 12) volume_ul: [numeric] Volume in microliters (0 if archived as 'Retired' or 'Expended').
22
+ 13) location: [character] Storage location name.
23
+ 14) rack: [character] Box/rack barcode.
24
+ 15) archive_purpose: [character] Reason for archiving the DNA extraction.
25
+ 16) nanodrop_concentration_ngul: [numeric] Latest Nanodrop concentration (ng/µL).
26
+ 17) dna_260_280_ratio: [numeric] Latest Nanodrop 260/280 ratio.
27
+ 18) dna_260_230_ratio: [numeric] Latest Nanodrop 260/230 ratio.
28
+ 19) qubit_concentration_ngul: [numeric] Latest Qubit concentration (ng/µL).
29
+ 20) yield_ng: [numeric] Latest yield (ng).
30
+ 21) femto_date_code: [character] Latest Femto date code.
31
+ 22) femto_description: [character] Latest Femto profile description.
32
+ 23) gqn_index: [numeric] Latest GQN index from Femto.
33
+ 24) next_step: [character] Latest decision making next step.
34
+ 25) extraction_qc_result: [character] Latest extraction QC result.
34
35
 
35
36
  NOTES:
36
37
  1) Only extractions from the 'ToL Core Lab' project and relevant folders are included.
@@ -109,6 +110,7 @@ latest_decision_making AS (
109
110
  SELECT DISTINCT
110
111
  t.taxon_id,
111
112
  t.id AS eln_tissue_id,
113
+ t.sts_id AS tissue_sts_id,
112
114
  tp.id AS eln_tissue_prep_id,
113
115
  dna.id AS extraction_id,
114
116
  t.programme_id,
@@ -170,4 +172,4 @@ LEFT JOIN entry$raw AS ent
170
172
  WHERE proj.name = 'ToL Core Lab'
171
173
  AND (f.name IN ('Routine Throughput', 'DNA', 'Core Lab Entities', 'Benchling MS Project Move') OR f.name IS NULL)
172
174
  AND (con.archive_purpose$ != ('Made in error') OR con.archive_purpose$ IS NULL)
173
- AND ent.name NOT LIKE '%Nuclei isolation and tagmentation%'
175
+ AND COALESCE(ent.name, '') NOT LIKE '%Nuclei isolation and tagmentation%'
@@ -24,7 +24,7 @@ Output: Table with cols:
24
24
  4) eln_file_registry_id: [character] id in Benchling Registry. Origin: BWH
25
25
  5) extraction_id: [character] Original DNA extract entity name. For pooled samples, the first DNA extract pooled. Origin: BWH
26
26
  6) submission_sample_name: [character] Entity name. Origin: BWH
27
- 7) fluidx_id: [character] Container barcode of the DNA fluidx tube. Origin: BWH
27
+ 7) fluidx_container_id: [character] Container id of the DNA fluidx tube. Origin: BWH
28
28
  8) programme_id: [character] ToLID. Origin: BWH
29
29
  9) specimen_id: [character] Specimen ID. Origin: STS
30
30
  10) tube_name: [character] Name of the submission tube/container.
@@ -73,7 +73,7 @@ pacbio_submissions_container_routine AS (
73
73
  subsam.file_registry_id$ AS eln_file_registry_id,
74
74
  subsam.original_dna_extract AS extraction_id,
75
75
  subsam.name$ AS submission_sample_name,
76
- c_dna.barcode AS fluidx_id,
76
+ c_dna.id AS fluidx_container_id,
77
77
  t.programme_id,
78
78
  t.specimen_id,
79
79
  con.name AS tube_name,
@@ -145,7 +145,7 @@ pacbio_submissions_container_pooled AS (
145
145
  subsam.file_registry_id$ AS eln_file_registry_id,
146
146
  subsam.pooled_sample AS extraction_id,
147
147
  subsam.name$ AS eln_submission_sample_name,
148
- c_pool.barcode AS fluidx_id,
148
+ c_pool.id AS fluidx_container_id,
149
149
  t.programme_id,
150
150
  t.specimen_id,
151
151
  con.name AS tube_name,
@@ -219,7 +219,7 @@ pacbio_submissions_container_legacy_deprecated AS (
219
219
  subsam.file_registry_id$ AS eln_file_registry_id,
220
220
  subsam.original_dna_extract AS extraction_id,
221
221
  subsam.name$ AS submission_sample_name,
222
- c_dna.barcode AS fluidx_id,
222
+ c_dna.id AS fluidx_container_id,
223
223
  t.programme_id,
224
224
  t.specimen_id,
225
225
  con.name AS tube_name,
@@ -283,7 +283,7 @@ pacbio_submissions_plate_automated_manifest AS (
283
283
  subsam.file_registry_id$ AS eln_file_registry_id,
284
284
  subsam.originaL_dna_extract AS extraction_id,
285
285
  subsam.name$ AS submission_sample_name,
286
- c_dna.barcode AS fluidx_id,
286
+ c_dna.id AS fluidx_container_id,
287
287
  t.programme_id,
288
288
  t.specimen_id,
289
289
  con.name AS tube_name,
@@ -350,7 +350,7 @@ pacbio_submissions_plate_automated_manifest_pooled AS (
350
350
  subsam.file_registry_id$ AS eln_file_registry_id,
351
351
  subsam.pooled_sample AS extraction_id,
352
352
  subsam.name$ AS submission_sample_name,
353
- c_pool.barcode AS fluidx_id,
353
+ c_pool.id AS fluidx_container_id,
354
354
  t.programme_id,
355
355
  t.specimen_id,
356
356
  con.name AS tube_name,
@@ -415,7 +415,7 @@ pacbio_submissions_plate_routine AS (
415
415
  subsam.file_registry_id$ AS eln_file_registry_id,
416
416
  subsam.original_dna_extract AS extraction_id,
417
417
  subsam.name$ AS submission_sample_name,
418
- c_dna.barcode AS fluidx_id,
418
+ c_dna.id AS fluidx_container_id,
419
419
  t.programme_id,
420
420
  t.specimen_id,
421
421
  c_subsam.name AS tube_name,
@@ -485,7 +485,7 @@ pacbio_submissions_plate_routine_pooled AS (
485
485
  subsam.file_registry_id$ AS eln_file_registry_id,
486
486
  subsam.pooled_sample AS extraction_id,
487
487
  subsam.name$ AS submission_sample_name,
488
- c_pool.barcode AS fluidx_id,
488
+ c_pool.id AS fluidx_container_id,
489
489
  t.programme_id,
490
490
  t.specimen_id,
491
491
  c_subsam.name AS tube_name,
@@ -189,7 +189,7 @@ def core_data_object(
189
189
  if object_from_datasource is not None:
190
190
  self.__type = object_from_datasource.type
191
191
  self.__attributes = object_from_datasource.attributes
192
- self.__to_one_objects = object_from_datasource.to_one_objects
192
+ self.__to_one_objects = object_from_datasource._to_one_objects
193
193
  break
194
194
 
195
195
  @property
@@ -23,9 +23,10 @@ def requested_fields_to_tree(func):
23
23
  msg = 'Both requested_fields and requested_tree arguments given'
24
24
  raise TypeError(msg)
25
25
  flds = kwargs.pop('requested_fields')
26
- kwargs['requested_tree'] = ReqFieldsTree(
27
- tablename, self, requested_fields=flds
28
- )
26
+ if flds and tablename:
27
+ kwargs['requested_tree'] = ReqFieldsTree(
28
+ tablename, self, requested_fields=flds
29
+ )
29
30
  return func(self, tablename, *args, **kwargs)
30
31
 
31
32
  return wrapper
@@ -2,6 +2,7 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
+ from .benchling_extraction_container_to_elastic_extraction_container_converter import BenchlingExtractionContainerToElasticExtractionContainerConverter # noqa F401
5
6
  from .benchling_extraction_to_elastic_extraction_converter import BenchlingExtractionToElasticExtractionConverter # noqa F401
6
7
  from .benchling_extraction_to_elastic_sequencing_request_converter import BenchlingExtractionToElasticSequencingRequestConverter # noqa F401
7
8
  from .benchling_sequencing_request_to_elastic_sequencing_request_converter import ( # noqa F401
@@ -0,0 +1,53 @@
1
+ # SPDX-FileCopyrightText: 2026 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from typing import Iterable
6
+
7
+ from ...core import (
8
+ DataObject,
9
+ DataObjectToDataObjectOrUpdateConverter
10
+ )
11
+
12
+
13
+ class BenchlingExtractionContainerToElasticExtractionContainerConverter(
14
+ DataObjectToDataObjectOrUpdateConverter):
15
+ def convert(self, data_object: DataObject) -> Iterable[DataObject]:
16
+ if data_object.tissue_sts_id is not None:
17
+ ret = self._data_object_factory(
18
+ 'extraction_container',
19
+ data_object.id,
20
+ attributes={
21
+ **{k: v
22
+ for k, v in data_object.attributes.items()
23
+ if k not in ['tissue_sts_id', 'specimen_id', 'taxon_id',
24
+ 'programme_id', 'eln_tissue_prep_id', 'extraction_id']}
25
+ },
26
+ to_one={
27
+ 'sample': self._data_object_factory(
28
+ 'sample',
29
+ data_object.tissue_sts_id
30
+ ) if data_object.tissue_sts_id is not None else None,
31
+ 'species': self._data_object_factory(
32
+ 'species',
33
+ data_object.taxon_id
34
+ ) if data_object.taxon_id is not None else None,
35
+ 'specimen': self._data_object_factory(
36
+ 'specimen',
37
+ data_object.specimen_id
38
+ ) if data_object.specimen_id is not None else None,
39
+ 'tolid': self._data_object_factory(
40
+ 'tolid',
41
+ data_object.programme_id
42
+ ) if data_object.programme_id is not None else None,
43
+ 'tissue_prep': self._data_object_factory(
44
+ 'tissue_prep',
45
+ data_object.eln_tissue_prep_id
46
+ ) if data_object.eln_tissue_prep_id is not None else None,
47
+ 'extraction': self._data_object_factory(
48
+ 'extraction',
49
+ data_object.extraction_id
50
+ ) if data_object.extraction_id is not None else None,
51
+ }
52
+ )
53
+ yield ret
@@ -15,12 +15,18 @@ class BenchlingSequencingRequestToElasticSequencingRequestConverter(
15
15
  def convert(self, data_object: DataObject) -> Iterable[DataObject]:
16
16
  if data_object.sts_id is not None:
17
17
  extraction = None
18
+ extraction_container = None
18
19
  tissue_prep = None
19
20
  if 'extraction_id' in data_object.attributes:
20
21
  extraction = self._data_object_factory(
21
22
  'extraction',
22
23
  data_object.extraction_id
23
24
  )
25
+ if 'fluidx_container_id' in data_object.attributes:
26
+ extraction_container = self._data_object_factory(
27
+ 'extraction_container',
28
+ data_object.fluidx_container_id
29
+ )
24
30
  if 'tissue_prep_id' in data_object.attributes:
25
31
  tissue_prep = self._data_object_factory(
26
32
  'tissue_prep',
@@ -34,7 +40,7 @@ class BenchlingSequencingRequestToElasticSequencingRequestConverter(
34
40
  for k, v in data_object.attributes.items()
35
41
  if k not in ['sanger_sample_id', 'sts_id',
36
42
  'specimen_id', 'taxon_id', 'extraction_id',
37
- 'programme_id', 'tissue_prep_id']}
43
+ 'programme_id', 'tissue_prep_id', 'fluidx_container_id']}
38
44
  },
39
45
  to_one={
40
46
  'sample': self._data_object_factory(
@@ -54,6 +60,7 @@ class BenchlingSequencingRequestToElasticSequencingRequestConverter(
54
60
  data_object.programme_id
55
61
  ) if data_object.programme_id is not None else None,
56
62
  'extraction': extraction,
63
+ 'extraction_container': extraction_container,
57
64
  'tissue_prep': tissue_prep,
58
65
  })
59
66
  yield ret
@@ -29,5 +29,13 @@ class ElasticSequencingRequestToElasticRunDataUpdateConverter(
29
29
  'extraction',
30
30
  extraction.id
31
31
  )
32
+ if 'benchling_extraction_container' in data_object.to_one_relationships:
33
+ extraction_container = \
34
+ data_object.to_one_relationships['benchling_extraction_container']
35
+ if extraction_container is not None:
36
+ to_ones['benchling_extraction_container'] = self._data_object_factory(
37
+ 'extraction_container',
38
+ extraction_container.id
39
+ )
32
40
  yield (None, to_ones | {
33
41
  'mlwh_sequencing_request.id': data_object.id}) # The candidate key
@@ -0,0 +1,44 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ import re
6
+ from dataclasses import dataclass
7
+ from datetime import time
8
+ from typing import Iterable
9
+
10
+ from tol.core import DataObject, DataObjectToDataObjectOrUpdateConverter
11
+
12
+
13
+ class TimeStringToTimeConverter(DataObjectToDataObjectOrUpdateConverter):
14
+
15
+ @dataclass(slots=True, frozen=True, kw_only=True)
16
+ class Config:
17
+ field_names: list[str]
18
+
19
+ __slots__ = ['__config']
20
+ __config: Config
21
+
22
+ def __init__(self, data_object_factory, config: Config) -> None:
23
+ super().__init__(data_object_factory)
24
+ self.__config = config
25
+ self._data_object_factory = data_object_factory
26
+
27
+ def convert(self, data_object: DataObject) -> Iterable[DataObject]:
28
+ """
29
+ Converts string fields representing time in HH:MM (24-hour) format to Python time objects.
30
+ If the string is not in HH:MM, tries to append ':00' and parse as HH:MM:SS.
31
+ """
32
+
33
+ for field_name in self.__config.field_names:
34
+ value = data_object.attributes.get(field_name)
35
+ if isinstance(value, str):
36
+ match = re.match(r'^(\d{1,2}):(\d{2})(?::(\d{2}))?$', value)
37
+ if match:
38
+ h, m = int(match.group(1)), int(match.group(2))
39
+ s = int(match.group(3)) if match.group(3) else 0
40
+ try:
41
+ data_object.attributes[field_name] = time(h, m, s)
42
+ except ValueError:
43
+ pass
44
+ yield data_object
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.8.6
3
+ Version: 1.8.7
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
@@ -52,7 +52,7 @@ src/tol/benchling/benchling_converter.py
52
52
  src/tol/benchling/benchling_datasource.py
53
53
  src/tol/benchling/benchling_warehouse_datasource.py
54
54
  src/tol/benchling/sql/__init__.py
55
- src/tol/benchling/sql/extraction_containers_dna.sql
55
+ src/tol/benchling/sql/extraction_container_extraction_extraction_type_dna.sql
56
56
  src/tol/benchling/sql/extraction_extraction_type_dna.sql
57
57
  src/tol/benchling/sql/extraction_extraction_type_lres.sql
58
58
  src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql
@@ -163,6 +163,7 @@ src/tol/flows/sequencing_submissions.py
163
163
  src/tol/flows/converters/__init__.py
164
164
  src/tol/flows/converters/auto_detect_manifest_type_converter.py
165
165
  src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py
166
+ src/tol/flows/converters/benchling_extraction_container_to_elastic_extraction_container_converter.py
166
167
  src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py
167
168
  src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py
168
169
  src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py
@@ -1,35 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- import re
6
- from datetime import time
7
-
8
- from tol.core import DataObject
9
-
10
-
11
- class Converter:
12
- def convert(self, obj):
13
- raise NotImplementedError()
14
-
15
-
16
- class TimeStringToTimeConverter(Converter):
17
- """
18
- Converts string fields representing time in HH:MM (24-hour) format to Python time objects.
19
- If the string is not in HH:MM, tries to append ':00' and parse as HH:MM:SS.
20
- """
21
- def __init__(self, field: str):
22
- self.field = field
23
-
24
- def convert(self, obj: DataObject) -> DataObject:
25
- value = obj.attributes.get(self.field)
26
- if isinstance(value, str):
27
- match = re.match(r'^(\d{1,2}):(\d{2})(?::(\d{2}))?$', value)
28
- if match:
29
- h, m = int(match.group(1)), int(match.group(2))
30
- s = int(match.group(3)) if match.group(3) else 0
31
- try:
32
- obj.attributes[self.field] = time(h, m, s)
33
- except ValueError:
34
- pass
35
- return obj
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes