tol-sdk 1.8.0__tar.gz → 1.8.2__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 (357) hide show
  1. {tol_sdk-1.8.0/src/tol_sdk.egg-info → tol_sdk-1.8.2}/PKG-INFO +1 -1
  2. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/pyproject.toml +1 -1
  3. tol_sdk-1.8.0/src/tol/benchling/sql/extraction_extraction_type_dna.sql → tol_sdk-1.8.2/src/tol/benchling/sql/extraction_containers_dna.sql +54 -64
  4. tol_sdk-1.8.2/src/tol/benchling/sql/extraction_extraction_type_dna.sql +68 -0
  5. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +11 -3
  6. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/excel_datasource.py +4 -0
  7. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/pipeline_step/factory.py +14 -4
  8. tol_sdk-1.8.2/src/tol/validators/sts_fields.py +229 -0
  9. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/types.py +4 -1
  10. {tol_sdk-1.8.0 → tol_sdk-1.8.2/src/tol_sdk.egg-info}/PKG-INFO +1 -1
  11. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/SOURCES.txt +1 -0
  12. tol_sdk-1.8.0/src/tol/validators/sts_fields.py +0 -95
  13. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/LICENSE +0 -0
  14. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/MANIFEST.in +0 -0
  15. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/README.md +0 -0
  16. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/setup.cfg +0 -0
  17. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/certs/cacert.pem +0 -0
  18. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/__init__.py +0 -0
  19. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/__init__.py +0 -0
  20. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/action.py +0 -0
  21. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/upsert_action.py +0 -0
  22. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/__init__.py +0 -0
  23. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/action.py +0 -0
  24. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/__init__.py +0 -0
  25. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/__init__.py +0 -0
  26. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/auth.py +0 -0
  27. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  28. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/asserts.py +0 -0
  29. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/blueprint.py +0 -0
  30. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/composite.py +0 -0
  31. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/config.py +0 -0
  32. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/error.py +0 -0
  33. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/blueprint.py +0 -0
  34. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/controller.py +0 -0
  35. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/data_upload.py +0 -0
  36. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/__init__.py +0 -0
  37. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/aggregation_body.py +0 -0
  38. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  39. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/auth_context.py +0 -0
  40. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/authenticate.py +0 -0
  41. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/data_body.py +0 -0
  42. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/filter_utils.py +0 -0
  43. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  44. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/relation_url.py +0 -0
  45. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/stats_parameters.py +0 -0
  46. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/pipeline_steps.py +0 -0
  47. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/system.py +0 -0
  48. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/__init__.py +0 -0
  49. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/api_datasource.py +0 -0
  50. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/client.py +0 -0
  51. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/converter.py +0 -0
  52. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/exception.py +0 -0
  53. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/factory.py +0 -0
  54. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/filter.py +0 -0
  55. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/parser.py +0 -0
  56. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/validate.py +0 -0
  57. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/view.py +0 -0
  58. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/barcodes/__init__.py +0 -0
  59. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/barcodes/main.py +0 -0
  60. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/__init__.py +0 -0
  61. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_converter.py +0 -0
  62. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_datasource.py +0 -0
  63. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
  64. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/__init__.py +0 -0
  65. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  66. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  67. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  68. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  69. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  70. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  71. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  72. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  73. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  74. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sample.sql +0 -0
  75. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  76. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
  77. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  78. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  79. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  80. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/board/__init__.py +0 -0
  81. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/board/blueprint.py +0 -0
  82. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/__init__.py +0 -0
  83. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/bold_datasource.py +0 -0
  84. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/client.py +0 -0
  85. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/converter.py +0 -0
  86. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/factory.py +0 -0
  87. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/parser.py +0 -0
  88. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/cli/__init__.py +0 -0
  89. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/cli/cli.py +0 -0
  90. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/__init__.py +0 -0
  91. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/__init__.py +0 -0
  92. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/model.py +0 -0
  93. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/yaml_converter.py +0 -0
  94. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/__init__.py +0 -0
  95. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/client.py +0 -0
  96. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/converter.py +0 -0
  97. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/copo_datasource.py +0 -0
  98. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/factory.py +0 -0
  99. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/parser.py +0 -0
  100. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/__init__.py +0 -0
  101. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/attribute_metadata.py +0 -0
  102. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/core_converter.py +0 -0
  103. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_loader.py +0 -0
  104. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_object.py +0 -0
  105. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_object_converter.py +0 -0
  106. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_source_attribute_metadata.py +0 -0
  107. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_source_dict.py +0 -0
  108. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource.py +0 -0
  109. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_error.py +0 -0
  110. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_filter.py +0 -0
  111. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_utils.py +0 -0
  112. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/factory.py +0 -0
  113. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/http_client.py +0 -0
  114. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/__init__.py +0 -0
  115. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/_filterable.py +0 -0
  116. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/_writer.py +0 -0
  117. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/aggregator.py +0 -0
  118. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/counter.py +0 -0
  119. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/cursor.py +0 -0
  120. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/declare.py +0 -0
  121. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/deleter.py +0 -0
  122. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/detail_getter.py +0 -0
  123. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/enricher.py +0 -0
  124. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/enum.py +0 -0
  125. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/group_statter.py +0 -0
  126. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/inserter.py +0 -0
  127. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/list_getter.py +0 -0
  128. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/operator_config.py +0 -0
  129. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/page_getter.py +0 -0
  130. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/relational.py +0 -0
  131. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/statter.py +0 -0
  132. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/summariser.py +0 -0
  133. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/updater.py +0 -0
  134. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/upserter.py +0 -0
  135. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/relationship.py +0 -0
  136. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/requested_fields.py +0 -0
  137. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/session.py +0 -0
  138. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/validate.py +0 -0
  139. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/__init__.py +0 -0
  140. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/elastic_datasource.py +0 -0
  141. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/runtime_fields.py +0 -0
  142. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/__init__.py +0 -0
  143. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/auth.py +0 -0
  144. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/eln_datasource.py +0 -0
  145. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/entities.py +0 -0
  146. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/generators.py +0 -0
  147. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/sanitise.py +0 -0
  148. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/__init__.py +0 -0
  149. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/client.py +0 -0
  150. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/converter.py +0 -0
  151. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/ena_datasource.py +0 -0
  152. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/ena_methods.py +0 -0
  153. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/factory.py +0 -0
  154. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/filter.py +0 -0
  155. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/parser.py +0 -0
  156. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/__init__.py +0 -0
  157. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/excel.py +0 -0
  158. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/s3_factory.py +0 -0
  159. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/__init__.py +0 -0
  160. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/__init__.py +0 -0
  161. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  162. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  163. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  164. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  165. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  166. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  167. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  168. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  169. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  170. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  171. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  172. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  173. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  174. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  175. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  176. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  177. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  178. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  179. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  180. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  181. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
  182. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  183. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  184. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  185. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  186. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  187. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  188. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  189. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  190. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  191. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  192. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
  193. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
  194. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  195. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  196. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  197. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  198. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  199. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  200. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
  201. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  202. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  203. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  204. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  205. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  206. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  207. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  208. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  209. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  210. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  211. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  212. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  213. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  214. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/logger.py +0 -0
  215. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/secrets.py +0 -0
  216. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/sequencing_submissions.py +0 -0
  217. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/gap/__init__.py +0 -0
  218. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/gap/gap_datasource.py +0 -0
  219. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/__init__.py +0 -0
  220. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/client.py +0 -0
  221. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/converter.py +0 -0
  222. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/factory.py +0 -0
  223. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/filter.py +0 -0
  224. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/goat_datasource.py +0 -0
  225. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/parser.py +0 -0
  226. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/google_sheets/__init__.py +0 -0
  227. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  228. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/irods/__init__.py +0 -0
  229. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/irods/irods_datasource.py +0 -0
  230. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/__init__.py +0 -0
  231. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/client.py +0 -0
  232. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/converter.py +0 -0
  233. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/factory.py +0 -0
  234. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/filter.py +0 -0
  235. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/jira_datasource.py +0 -0
  236. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/mapper.py +0 -0
  237. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/parser.py +0 -0
  238. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/sort.py +0 -0
  239. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/__init__.py +0 -0
  240. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/json_datasource.py +0 -0
  241. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/s3_json_datasource.py +0 -0
  242. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/__init__.py +0 -0
  243. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/client.py +0 -0
  244. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/converter.py +0 -0
  245. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/factory.py +0 -0
  246. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/labwhere_datasource.py +0 -0
  247. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/parser.py +0 -0
  248. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/markdown.py +0 -0
  249. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/mlwh/__init__.py +0 -0
  250. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/mlwh/mlwh_datasource.py +0 -0
  251. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/__init__.py +0 -0
  252. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/converter.py +0 -0
  253. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/factory.py +0 -0
  254. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/filter.py +0 -0
  255. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/prefect_datasource.py +0 -0
  256. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/prefect_object.py +0 -0
  257. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/__init__.py +0 -0
  258. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/converter.py +0 -0
  259. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/factory.py +0 -0
  260. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/parser.py +0 -0
  261. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/s3_datasource.py +0 -0
  262. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/__init__.py +0 -0
  263. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/configuration.py +0 -0
  264. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/consumer.py +0 -0
  265. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/message_builder.py +0 -0
  266. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/messages.py +0 -0
  267. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/response_processors.py +0 -0
  268. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/sequencing_datasource.py +0 -0
  269. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/services/__init__.py +0 -0
  270. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/services/s3_client.py +0 -0
  271. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/__init__.py +0 -0
  272. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/benchling.py +0 -0
  273. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/benchling_warehouse.py +0 -0
  274. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan.py +0 -0
  275. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_extra.py +0 -0
  276. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_image.py +0 -0
  277. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_qc.py +0 -0
  278. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bold.py +0 -0
  279. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/copo.py +0 -0
  280. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/defaults.py +0 -0
  281. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/elastic.py +0 -0
  282. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/ena.py +0 -0
  283. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/gap.py +0 -0
  284. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/genome_notes.py +0 -0
  285. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/goat.py +0 -0
  286. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/grit.py +0 -0
  287. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/informatics.py +0 -0
  288. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/labwhere.py +0 -0
  289. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/mlwh.py +0 -0
  290. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portal.py +0 -0
  291. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portal_attributes.py +0 -0
  292. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portaldb.py +0 -0
  293. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/prefect.py +0 -0
  294. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sciops.py +0 -0
  295. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sts.py +0 -0
  296. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sts_legacy.py +0 -0
  297. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolid.py +0 -0
  298. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolqc.py +0 -0
  299. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolqc_legacy.py +0 -0
  300. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/treeofsex.py +0 -0
  301. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/uksi_qc.py.py +0 -0
  302. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/workflows.py +0 -0
  303. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/__init__.py +0 -0
  304. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/action/__init__.py +0 -0
  305. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/action/factory.py +0 -0
  306. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/__init__.py +0 -0
  307. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/blueprint.py +0 -0
  308. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/models.py +0 -0
  309. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/cast.py +0 -0
  310. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/database.py +0 -0
  311. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/ds_session.py +0 -0
  312. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/exception.py +0 -0
  313. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/ext.py +0 -0
  314. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/factory.py +0 -0
  315. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/filter.py +0 -0
  316. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/model.py +0 -0
  317. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/pipeline_step/__init__.py +0 -0
  318. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/relationship.py +0 -0
  319. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/session.py +0 -0
  320. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sort.py +0 -0
  321. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sql_converter.py +0 -0
  322. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sql_datasource.py +0 -0
  323. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/standard/__init__.py +0 -0
  324. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/standard/factory.py +0 -0
  325. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/status/__init__.py +0 -0
  326. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/status/status_datasource.py +0 -0
  327. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/__init__.py +0 -0
  328. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts.py +0 -0
  329. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts_datasource.py +0 -0
  330. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts_requests.py +0 -0
  331. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/treeval/__init__.py +0 -0
  332. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/treeval/treeval_datasource.py +0 -0
  333. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/__init__.py +0 -0
  334. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/csv.py +0 -0
  335. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/s3.py +0 -0
  336. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/__init__.py +0 -0
  337. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_keys.py +0 -0
  338. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_values.py +0 -0
  339. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_values_from_datasource.py +0 -0
  340. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/assert_on_condition.py +0 -0
  341. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/converter_and_validate.py +0 -0
  342. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/ena_checklist.py +0 -0
  343. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/ena_submittable.py +0 -0
  344. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/interfaces/__init__.py +0 -0
  345. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
  346. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/min_one_valid_value.py +0 -0
  347. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/mutually_exclusive.py +0 -0
  348. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/regex.py +0 -0
  349. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/regex_by_value.py +0 -0
  350. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/specimens_have_same_taxon.py +0 -0
  351. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/tolid.py +0 -0
  352. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/unique_values.py +0 -0
  353. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/unique_whole_organisms.py +0 -0
  354. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  355. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  356. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/requires.txt +0 -0
  357. {tol_sdk-1.8.0 → tol_sdk-1.8.2}/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.0
3
+ Version: 1.8.2
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.0"
11
+ version = "1.8.2"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -1,48 +1,43 @@
1
1
  /*
2
- ## SQL Query: DNA extractions Benchling Warehouse (BWH)
2
+ ## SQL Query: DNA Extraction Containers (Benchling Warehouse)
3
3
 
4
- This SQL query retrieves all the information of DNA extractions performed by the ToL Core Laboratory.
4
+ This SQL query retrieves detailed information about DNA extraction containers managed by the ToL Core Laboratory, including metadata, container details, and the latest QC measurements.
5
5
 
6
- The table produced also contains the eln_dna_extract_id and eln_file_registry_id which uniquely idenfied each dna extract entity in Benchling Warehouse (BWH).
6
+ The resulting table includes identifiers for tissues, tissue preps, extractions, containers, and locations, as well as the most recent QC results (Nanodrop, Qubit, Femto, Yield, and Decision Making).
7
7
 
8
- The eln_dna_extract_id should be used as the foreign key to the DNA extract entity the submission is derived from.
8
+ Output: Table with columns:
9
9
 
10
- Output: Table with cols:
10
+ 1) taxon_id: [character] Tissue metadata. Origin: STS
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.
11
34
 
12
- 1) sts_id: [integer] Tissue metadata. Origin: STS
13
- 2) taxon_id: [character] Tissue metadata. Origin: STS
14
- 3) eln_tissue_id: [character] Benchling id for the tissue the extractions is derived from.
15
- 4) eln_tissue_prep_id: [character] Benchling id for the tissue prep the extractions is derived from.
16
- 5) eln_file_registry_id: [character] id in Benchling Registry.
17
- 6) extraction_id: [character] Primary key.
18
- 7) programme_id: [character] ToLID. Origin: BWH
19
- 8) specimen_id: [character] Specimen ID. Origin: STS
20
- 9) completion_date: [date] Extraction date. This field coalesces created_at$ and created_on fields. Created_on is for bnt legacy data.
21
- 10) extraction_name: [character] Entity name.
22
- 11) fluidx_id: [character] Fluidx ID.
23
- 12) volume_ul: [double] volume of DNA available in the fluidx tube.
24
- 13) location: [character] Physical locationo of the DNA extraction. Freezer shelf.
25
- 14) rack: [character] Physical locationo of the DNA extraction. Rack barcode.
26
- 15) bnt_id: [character] Batches and Tracking legacy id.
27
- 16) manual_vs_automatic: [character].
28
- 17) extraction_protocol: [character] DNA extraction protocol as recorded at the time of extraction
29
- 18) tube_type: [character] Type of tube. Marked NULL or voucher.
30
- 19) extraction_type: [character] dna.
31
- 20) name: [character] Folder name.
32
- 21) archive_purpose: [character] Reason for archiving the DNA extraction.
33
- 22) nanodrop_concentration_ngul: [double] Concentration of DNA as measured by Nanodrop.
34
- 23) dna_260_280_ratio: [double] Ratio of absorbance at 260:280nm as measured by spectrophotometer.
35
- 24) dna_260_230_ratio: [double] Ratio of absorbance at 260:230nm as measured by spectrophotometer.
36
- 25) qubit_concentration_ngul: [double] Concentration of DNA as measured by Qubit.
37
- 26) yield_ng: [double] DNA yield after extraction.
38
- 27) femto_date_code: [character] Femto date code.
39
- 28) femto_description:[character] Categorical description of the femto pulse profile.
40
- 29) gqn_index: [character] Genomic Quality Number (GQN) index, calculated by the Femto software.
41
- 30) extraction_qc_result: [character] QC result: Yes = Extraction passed; No = Extraction failed.
42
-
43
- NOTES:
44
- 1) Data types were casted explicitly to conserved the data type stored in BWH.
45
- 2) To add the Fluidx ID of the original DNA extract a few filters were applied to delete Vouchers, tubes archived because they were made in error, and invalid container names.
35
+ NOTES:
36
+ 1) Only extractions from the 'ToL Core Lab' project and relevant folders are included.
37
+ 2) Containers archived as 'Made in error' or with names matching '%Nuclei isolation and tagmentation%' are excluded.
38
+ 3) Latest QC results are joined from their respective measurement tables.
39
+ 4) Volume is set to 0 for archived/expended extractions.
40
+ 5) Data types are preserved as in the Benchling Warehouse.
46
41
 
47
42
  */
48
43
 
@@ -112,30 +107,23 @@ latest_decision_making AS (
112
107
  )
113
108
 
114
109
  SELECT DISTINCT
115
- t.sts_id,
116
110
  t.taxon_id,
117
111
  t.id AS eln_tissue_id,
118
112
  tp.id AS eln_tissue_prep_id,
119
- dna.file_registry_id$ AS eln_file_registry_id,
120
113
  dna.id AS extraction_id,
121
114
  t.programme_id,
122
115
  t.specimen_id,
123
- COALESCE(DATE(dna.created_on), DATE(dna.created_at$)) AS completion_date, -- Homogenising BnT and Benchling dates
124
- dna.name$ AS extraction_name,
116
+ DATE(con.created_at) AS creation_date,
117
+ con.id AS fluidx_container_id, -- primary key
125
118
  con.barcode AS fluidx_id,
126
- con.id AS fluidx_container_id,
119
+ tube.type AS tube_type,
127
120
  CASE
128
121
  WHEN con.archive_purpose$ IN ('Retired', 'Expended') THEN 0 -- Retired or expended DNA extractions have a weight of 0
129
122
  ELSE con.volume_si * 1000000
130
123
  END AS volume_ul,
131
124
  loc.name AS location,
132
125
  box.barcode AS rack,
133
- dna.bt_id AS bnt_id,
134
- dna.manual_vs_automatic AS manual_vs_automatic,
135
- dna.extraction_protocol,
136
- tube.type AS tube_type,
137
- 'dna'::varchar AS extraction_type,
138
- f.name, dna.archive_purpose$,
126
+ con.archive_purpose$ AS archive_purpose,
139
127
  latest_nanodrop_conc.nanodrop_concentration_ngul,
140
128
  latest_nanodrop_conc.dna_260_280_ratio,
141
129
  latest_nanodrop_conc.dna_260_230_ratio,
@@ -147,20 +135,20 @@ SELECT DISTINCT
147
135
  latest_decision_making.next_step,
148
136
  latest_decision_making.extraction_qc_result
149
137
  FROM dna_extract$raw AS dna
150
- LEFT JOIN container_content$raw AS cc
138
+ INNER JOIN container_content$raw AS cc -- Start of container/tube join
151
139
  ON cc.entity_id = dna.id
152
140
  LEFT JOIN container$raw AS con
153
141
  ON con.id = cc.container_id
142
+ LEFT JOIN tube$raw AS tube
143
+ ON cc.container_id = tube.id -- End of container/tube join
144
+ LEFT JOIN box$raw AS box -- Location chunk
145
+ ON con.box_id = box.id
146
+ LEFT JOIN location$raw AS loc
147
+ ON loc.id = box.location_id -- End of location chunk
154
148
  LEFT JOIN tissue_prep$raw AS tp
155
149
  ON tp.id = dna.tissue_prep
156
150
  LEFT JOIN tissue$raw AS t
157
151
  ON t.id = tp.tissue
158
- LEFT JOIN tube$raw AS tube
159
- ON cc.container_id = tube.id
160
- LEFT JOIN folder$raw AS f
161
- ON dna.folder_id$ = f.id
162
- LEFT JOIN project$raw AS proj
163
- ON dna.project_id$ = proj.id
164
152
  LEFT JOIN latest_nanodrop_conc -- Results chunk
165
153
  ON dna.id = latest_nanodrop_conc.sample_id
166
154
  LEFT JOIN latest_qubit_conc
@@ -171,13 +159,15 @@ LEFT JOIN latest_femto
171
159
  ON dna.id = latest_femto.sample_id
172
160
  LEFT JOIN latest_decision_making
173
161
  ON dna.id = latest_decision_making.sample_id -- End Results chunk
174
- LEFT JOIN box$raw AS box -- Location chunk
175
- ON con.box_id = box.id
176
- LEFT JOIN location$raw AS loc
177
- ON loc.id = box.location_id -- End of location chunk
162
+ LEFT JOIN folder$raw AS f
163
+ ON dna.folder_id$ = f.id
164
+ LEFT JOIN project$raw AS proj
165
+ ON dna.project_id$ = proj.id
166
+ LEFT JOIN registration_origin$raw AS reg
167
+ ON reg.entity_id = dna.id
168
+ LEFT JOIN entry$raw AS ent
169
+ ON reg.origin_entry_id = ent.id
178
170
  WHERE proj.name = 'ToL Core Lab'
179
171
  AND (f.name IN ('Routine Throughput', 'DNA', 'Core Lab Entities', 'Benchling MS Project Move') OR f.name IS NULL)
180
- AND (dna.archive_purpose$ != ('Made in error') OR dna.archive_purpose$ IS NULL)
181
172
  AND (con.archive_purpose$ != ('Made in error') OR con.archive_purpose$ IS NULL)
182
- AND con.barcode NOT LIKE 'CON%'
183
- ORDER BY completion_date DESC
173
+ AND ent.name NOT LIKE '%Nuclei isolation and tagmentation%'
@@ -0,0 +1,68 @@
1
+ /*
2
+ ## SQL Query: DNA extractions Benchling Warehouse (BWH)
3
+
4
+ This SQL query retrieves all the information of DNA extractions performed by the ToL Core Laboratory.
5
+
6
+ The table produced also contains the eln_dna_extract_id and eln_file_registry_id which uniquely idenfied each dna extract entity in Benchling Warehouse (BWH).
7
+
8
+ The eln_dna_extract_id should be used as the foreign key to the DNA extract entity the submission is derived from.
9
+
10
+ Output: Table with cols:
11
+
12
+ 1) sts_id: [integer] Tissue metadata. Origin: STS
13
+ 2) taxon_id: [character] Tissue metadata. Origin: STS
14
+ 3) eln_tissue_id: [character] Benchling id for the tissue the extraction is derived from.
15
+ 4) eln_tissue_prep_id: [character] Benchling id for the tissue prep the extraction is derived from.
16
+ 5) eln_file_registry_id: [character] id in Benchling Registry.
17
+ 6) extraction_id: [character] Primary key.
18
+ 7) programme_id: [character] ToLID. Origin: BWH
19
+ 8) specimen_id: [character] Specimen ID. Origin: STS
20
+ 9) completion_date: [date] Extraction date. This field coalesces created_at$ and created_on fields. Created_on is for bnt legacy data.
21
+ 10) extraction_name: [character] Entity name.
22
+ 11) bnt_id: [character] Batches and Tracking legacy id.
23
+ 12) manual_vs_automatic: [character] Extraction method indicator.
24
+ 13) extraction_protocol: [character] DNA extraction protocol as recorded at the time of extraction.
25
+ 14) extraction_type: [character] Type of extraction, set to 'dna'.
26
+ 15) folder_name: [character] Folder name.
27
+ 16) archive_purpose: [character] Reason for archiving the DNA extraction.
28
+
29
+ NOTES:
30
+ 1) Data types were casted explicitly to conserved the data type stored in BWH.
31
+ 2) To add the Fluidx ID of the original DNA extract a few filters were applied to delete Vouchers, tubes archived because they were made in error, and invalid container names.
32
+
33
+ */
34
+
35
+ SELECT DISTINCT
36
+ t.sts_id,
37
+ t.taxon_id,
38
+ t.id AS eln_tissue_id,
39
+ tp.id AS eln_tissue_prep_id,
40
+ dna.file_registry_id$ AS eln_file_registry_id,
41
+ dna.id AS extraction_id,
42
+ t.programme_id,
43
+ t.specimen_id,
44
+ COALESCE(DATE(dna.created_on), DATE(dna.created_at$)) AS completion_date, -- Homogenising BnT and Benchling dates
45
+ dna.name$ AS extraction_name,
46
+ dna.bt_id AS bnt_id,
47
+ dna.manual_vs_automatic AS manual_vs_automatic,
48
+ dna.extraction_protocol,
49
+ 'dna'::varchar AS extraction_type,
50
+ f.name AS folder_name
51
+ FROM dna_extract$raw AS dna
52
+ LEFT JOIN tissue_prep$raw AS tp
53
+ ON tp.id = dna.tissue_prep
54
+ LEFT JOIN tissue$raw AS t
55
+ ON t.id = tp.tissue
56
+ LEFT JOIN folder$raw AS f
57
+ ON dna.folder_id$ = f.id
58
+ LEFT JOIN project$raw AS proj
59
+ ON dna.project_id$ = proj.id
60
+ LEFT JOIN registration_origin$raw AS reg
61
+ ON reg.entity_id = dna.id
62
+ LEFT JOIN entry$raw AS ent
63
+ ON reg.origin_entry_id = ent.id
64
+ WHERE proj.name = 'ToL Core Lab'
65
+ AND (f.name IN ('Routine Throughput', 'DNA', 'Core Lab Entities', 'Benchling MS Project Move') OR f.name IS NULL)
66
+ AND (dna.archive_purpose$ != ('Made in error') OR dna.archive_purpose$ IS NULL)
67
+ AND ent.name NOT LIKE '%Nuclei isolation and tagmentation%'
68
+ ORDER BY completion_date DESC
@@ -28,8 +28,8 @@ SELECT DISTINCT
28
28
  tp.name$ AS eln_tissue_prep_name,
29
29
  ssid.sanger_sample_id,
30
30
  ssid.sanger_sample_id AS extraction_id,
31
- c.barcode AS fluidx_id,
32
- c.id AS fluidx_container_id,
31
+ sub_con.barcode AS fluidx_id,
32
+ sub_con.id AS fluidx_container_id,
33
33
  DATE(tpsub.submitted_submission_date) AS completion_date,
34
34
  'lres'::varchar AS extraction_type
35
35
  FROM tissue_prep$raw AS tp
@@ -41,8 +41,16 @@ LEFT JOIN container$raw AS c
41
41
  ON cc.container_id = c.id
42
42
  LEFT JOIN tissue_prep_submission_workflow_output$raw AS tpsub
43
43
  ON c.id = tpsub.sample_tube_id
44
+ LEFT JOIN container$raw AS sub_con
45
+ ON tpsub.sample_tube_id = sub_con.id
44
46
  LEFT JOIN storage$raw AS stor
45
47
  ON c.location_id = stor.id
46
48
  LEFT JOIN sanger_sample_id$raw AS ssid
47
49
  ON c.id = ssid.sample_tube
48
- WHERE stor.name$ = 'SciOps ToL Lab'
50
+ LEFT JOIN project$raw AS proj
51
+ ON tp.project_id$ = proj.id
52
+ LEFT JOIN folder$raw AS f
53
+ ON tp.folder_id$ = f.id
54
+ WHERE sub_con.id IS NOT NULL
55
+ AND proj.name = 'ToL Core Lab'
56
+ AND f.name = 'Sample Prep'
@@ -119,6 +119,10 @@ class ExcelDataSource(
119
119
  if isinstance(__v, pd.Timestamp):
120
120
  __v = datetime.fromtimestamp(__v.timestamp())
121
121
 
122
+ # If float and is whole number, convert to int
123
+ if isinstance(__v, float) and __v.is_integer():
124
+ __v = int(__v)
125
+
122
126
  if __k not in self.__mappings:
123
127
  return __v
124
128
 
@@ -64,7 +64,7 @@ def create_pipeline_step_models(
64
64
  class Pipeline(base_model_class):
65
65
  __tablename__ = 'pipeline'
66
66
 
67
- id: Mapped[int] = mapped_column( # noqa A003
67
+ id: Mapped[int] = mapped_column( # noqa A003
68
68
  primary_key=True,
69
69
  autoincrement=True
70
70
  )
@@ -100,7 +100,7 @@ def create_pipeline_step_models(
100
100
  ),
101
101
  )
102
102
 
103
- id: Mapped[int] = mapped_column( # noqa A003
103
+ id: Mapped[int] = mapped_column( # noqa A003
104
104
  primary_key=True,
105
105
  autoincrement=True
106
106
  )
@@ -121,6 +121,11 @@ def create_pipeline_step_models(
121
121
  nullable=False
122
122
  )
123
123
 
124
+ is_visible: Mapped[bool] = mapped_column(
125
+ nullable=False,
126
+ default=True
127
+ )
128
+
124
129
  config: Mapped[dict[str, Any]] = mapped_column(
125
130
  JSONB,
126
131
  nullable=False,
@@ -135,7 +140,7 @@ def create_pipeline_step_models(
135
140
  class Upload(base_model_class):
136
141
  __tablename__ = 'upload'
137
142
 
138
- id: Mapped[int] = mapped_column( # noqa A003
143
+ id: Mapped[int] = mapped_column( # noqa A003
139
144
  primary_key=True,
140
145
  autoincrement=True
141
146
  )
@@ -173,6 +178,11 @@ def create_pipeline_step_models(
173
178
  default=False
174
179
  )
175
180
 
181
+ is_ready: Mapped[bool] = mapped_column(
182
+ nullable=False,
183
+ default=False
184
+ )
185
+
176
186
  failure_message: Mapped[str | None] = mapped_column(
177
187
  nullable=True,
178
188
  )
@@ -182,7 +192,7 @@ def create_pipeline_step_models(
182
192
  foreign_keys=[pipeline_id]
183
193
  )
184
194
 
185
- user: Mapped['User'] = relationship( # noqa F821
195
+ user: Mapped['User'] = relationship( # noqa F821
186
196
  back_populates='user_uploads',
187
197
  foreign_keys=[user_id]
188
198
  )
@@ -0,0 +1,229 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from dataclasses import dataclass
6
+ from datetime import datetime, timedelta
7
+ from typing import List
8
+
9
+ from tol.core import DataObject, DataSource
10
+ from tol.core.validate import Validator
11
+ from tol.sources.sts import sts
12
+
13
+
14
+ class StsFieldsValidator(Validator):
15
+ """
16
+ Validates that a stream of `DataObject` instances
17
+ contains fields that observe the validations in STS
18
+ """
19
+ @dataclass(slots=True, frozen=True, kw_only=True)
20
+ class Config:
21
+ project_code: str
22
+
23
+ __slots__ = ['__config', '__datasource', '__fields']
24
+ __config: Config
25
+ __datasource: DataSource
26
+ __fields: List[str | int | float]
27
+
28
+ def __init__(
29
+ self,
30
+ config: Config,
31
+ datasource: DataSource = sts(), # For testing
32
+ **kwargs
33
+ ) -> None:
34
+
35
+ super().__init__()
36
+
37
+ self.__config = config
38
+ self.__datasource = datasource
39
+ self.__fields = self.__initialize_fields_from_datasource()
40
+
41
+ def __initialize_fields_from_datasource(self) -> List[str | int | float]:
42
+ return {
43
+ field.get('data_input_key'): field
44
+ for field in self.__datasource.get_one(
45
+ 'project', self.__config.project_code
46
+ ).template.get('data_fields', [])
47
+ if field.get('in_manifest')
48
+ }
49
+
50
+ def _validate_data_object(
51
+ self,
52
+ obj: DataObject
53
+ ) -> None:
54
+ for field in self.__fields.values():
55
+ # Ignore inactive fields
56
+ if field.get('status') == 'Inactive':
57
+ continue
58
+ # Get the value from the data object
59
+ field_value = obj.get_field_by_name(field.get('data_input_key'))
60
+ if isinstance(field_value, list):
61
+ field_value = ' | '.join(str(v) for v in field_value)
62
+
63
+ # mandatory_input fields must be present
64
+ if field.get('mandatory_input') and field.get('data_input_key') not in obj.attributes:
65
+ self.add_error(
66
+ object_id=obj.id,
67
+ detail=f'Field {field.get("data_input_key")} is required '
68
+ f'for project {self.__config.project_code}',
69
+ field=field.get('data_input_key'),
70
+ )
71
+ continue
72
+
73
+ # Skip further validations if validation is not mandatory
74
+ if not field.get('mandatory_validation'):
75
+ continue
76
+
77
+ # Mandatory validation fields must have a value
78
+ if field_value is None or field_value == '':
79
+ self.add_error(
80
+ object_id=obj.id,
81
+ detail=f'Field {field.get("data_input_key")} is required to have a value '
82
+ f'for project {self.__config.project_code}',
83
+ field=field.get('data_input_key'),
84
+ )
85
+ continue
86
+
87
+ # Allowed values
88
+ if field.get('allowed_values'):
89
+ allowed_values = [
90
+ value.get('value') for value in field.get('allowed_values', [])
91
+ ]
92
+ if field_value not in allowed_values:
93
+ self.add_error(
94
+ object_id=obj.id,
95
+ detail=f'Field {field.get("data_input_key")} value '
96
+ f'"{field_value}" not found in allowed values '
97
+ f'{allowed_values} for project '
98
+ f'{self.__config.project_code}',
99
+ field=field.get('data_input_key'),
100
+ )
101
+
102
+ if field.get('type') in ['String', 'TextArea']:
103
+ self.__validate_string(obj, field, field_value)
104
+
105
+ if field.get('type') in ['Integer', 'Decimal', 'Percentage']:
106
+ self.__validate_number(obj, field, field_value)
107
+
108
+ if field.get('type') in ['Boolean']:
109
+ self.__validate_boolean(obj, field, field_value)
110
+
111
+ if field.get('type') in ['Date']:
112
+ self.__validate_date(obj, field, field_value)
113
+
114
+ def __validate_string(
115
+ self,
116
+ obj: DataObject,
117
+ field: dict,
118
+ field_value: str | int | float | None
119
+ ) -> None:
120
+ # Check type is a string
121
+ # if not isinstance(field_value, str):
122
+ # self.add_error(
123
+ # object_id=obj.id,
124
+ # detail=f'Field {field.get("data_input_key")} value '
125
+ # f'"{field_value}" is not a string for project '
126
+ # f'{self.__config.project_code}',
127
+ # field=field.get('data_input_key'),
128
+ # )
129
+ # return
130
+
131
+ # Min/Max validations for string
132
+ if field.get('min') and len(field_value) < field.get('min'):
133
+ self.add_error(
134
+ object_id=obj.id,
135
+ detail=f'Field {field.get("data_input_key")} value '
136
+ f'"{field_value}" is shorter than minimum length '
137
+ f'"{field.get("min")}" for project '
138
+ f'{self.__config.project_code}',
139
+ field=field.get('data_input_key'),
140
+ )
141
+ if field.get('max') and len(field_value) > field.get('max'):
142
+ self.add_error(
143
+ object_id=obj.id,
144
+ detail=f'Field {field.get("data_input_key")} value '
145
+ f'"{field_value}" is longer than maximum length '
146
+ f'"{field.get("max")}" for project '
147
+ f'{self.__config.project_code}',
148
+ field=field.get('data_input_key'),
149
+ )
150
+
151
+ def __validate_number(
152
+ self,
153
+ obj: DataObject,
154
+ field: dict,
155
+ field_value: str | int | float | None
156
+ ) -> None:
157
+ # Check type is a number
158
+ if not isinstance(field_value, (int, float)):
159
+ self.add_error(
160
+ object_id=obj.id,
161
+ detail=f'Field {field.get("data_input_key")} value '
162
+ f'"{field_value}" is not a number for project '
163
+ f'{self.__config.project_code}',
164
+ field=field.get('data_input_key'),
165
+ )
166
+ return
167
+
168
+ # Min/Max validations for number
169
+ if field.get('min') is not None and field_value < field.get('min'):
170
+ self.add_error(
171
+ object_id=obj.id,
172
+ detail=f'Field {field.get("data_input_key")} value '
173
+ f'"{field_value}" is less than minimum value '
174
+ f'"{field.get("min")}" for project '
175
+ f'{self.__config.project_code}',
176
+ field=field.get('data_input_key'),
177
+ )
178
+ if field.get('max') is not None and field_value > field.get('max'):
179
+ self.add_error(
180
+ object_id=obj.id,
181
+ detail=f'Field {field.get("data_input_key")} value '
182
+ f'"{field_value}" is greater than maximum value '
183
+ f'"{field.get("max")}" for project '
184
+ f'{self.__config.project_code}',
185
+ field=field.get('data_input_key'),
186
+ )
187
+
188
+ def __validate_boolean(
189
+ self,
190
+ obj: DataObject,
191
+ field: dict,
192
+ field_value: str | int | float | None
193
+ ) -> None:
194
+ # Check type is a boolean
195
+ if field_value not in ['Y', 'N']:
196
+ self.add_error(
197
+ object_id=obj.id,
198
+ detail=f'Field {field.get("data_input_key")} value '
199
+ f'"{field_value}" is not a boolean (Y/N) for project '
200
+ f'{self.__config.project_code}',
201
+ field=field.get('data_input_key'),
202
+ )
203
+
204
+ def __validate_date(
205
+ self,
206
+ obj: DataObject,
207
+ field: dict,
208
+ field_value: str | int | float | None
209
+ ) -> None:
210
+ if not isinstance(field_value, datetime):
211
+ self.add_error(
212
+ object_id=obj.id,
213
+ detail=f'Field {field.get("data_input_key")} value '
214
+ f'"{field_value}" is not a date string for project '
215
+ f'{self.__config.project_code}',
216
+ field=field.get('data_input_key'),
217
+ )
218
+ return
219
+ if field.get('range_limit'):
220
+ earliest_date = datetime.now() - timedelta(days=field.get('min'))
221
+ latest_date = datetime.now() + timedelta(days=field.get('max'))
222
+ if field_value < earliest_date or field_value > latest_date:
223
+ self.add_error(
224
+ object_id=obj.id,
225
+ detail=f'Field {field.get("data_input_key")} value '
226
+ f'"{field_value}" is not within the allowed date '
227
+ f'range for project {self.__config.project_code}',
228
+ field=field.get('data_input_key'),
229
+ )
@@ -58,6 +58,8 @@ class TypesValidator(Validator):
58
58
  self.__add_result(
59
59
  obj,
60
60
  key,
61
+ detail=f'Field {key} value "{actual_value}" is not of type '
62
+ f'"{expected_type}"',
61
63
  )
62
64
  if type_class and isinstance(actual_value, type_class):
63
65
  # Special case for bool since isinstance(True, int) is True
@@ -71,12 +73,13 @@ class TypesValidator(Validator):
71
73
  self,
72
74
  obj: DataObject,
73
75
  key: str,
76
+ detail: str = None,
74
77
  ) -> None:
75
78
 
76
79
  if self.__config.is_error:
77
80
  self.add_error(
78
81
  object_id=obj.id,
79
- detail=self.__config.detail,
82
+ detail=detail or self.__config.detail,
80
83
  field=key,
81
84
  )
82
85
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.8.0
3
+ Version: 1.8.2
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,6 +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
56
  src/tol/benchling/sql/extraction_extraction_type_dna.sql
56
57
  src/tol/benchling/sql/extraction_extraction_type_lres.sql
57
58
  src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql