tol-sdk 1.7.3__tar.gz → 1.7.4__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 (340) hide show
  1. {tol_sdk-1.7.3/src/tol_sdk.egg-info → tol_sdk-1.7.4}/PKG-INFO +1 -1
  2. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/pyproject.toml +1 -1
  3. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/pipeline_steps.py +8 -5
  4. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/s3/__init__.py +1 -0
  5. tol_sdk-1.7.4/src/tol/s3/data_upload/__init__.py +3 -0
  6. tol_sdk-1.7.4/src/tol/s3/data_upload/blueprint.py +83 -0
  7. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/services/s3_client.py +5 -3
  8. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/pipeline_step/factory.py +1 -1
  9. tol_sdk-1.7.4/src/tol/validators/unique_values.py +100 -0
  10. {tol_sdk-1.7.3 → tol_sdk-1.7.4/src/tol_sdk.egg-info}/PKG-INFO +1 -1
  11. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol_sdk.egg-info/SOURCES.txt +2 -0
  12. tol_sdk-1.7.3/src/tol/validators/unique_values.py +0 -72
  13. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/LICENSE +0 -0
  14. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/MANIFEST.in +0 -0
  15. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/README.md +0 -0
  16. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/setup.cfg +0 -0
  17. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/certs/cacert.pem +0 -0
  18. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/__init__.py +0 -0
  19. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/actions/__init__.py +0 -0
  20. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/actions/action.py +0 -0
  21. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/actions/upsert_action.py +0 -0
  22. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/__init__.py +0 -0
  23. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/action.py +0 -0
  24. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/__init__.py +0 -0
  25. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/abc/__init__.py +0 -0
  26. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/abc/auth.py +0 -0
  27. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  28. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/asserts.py +0 -0
  29. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/blueprint.py +0 -0
  30. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/composite.py +0 -0
  31. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/config.py +0 -0
  32. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/auth/error.py +0 -0
  33. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/blueprint.py +0 -0
  34. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/controller.py +0 -0
  35. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/__init__.py +0 -0
  36. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/aggregation_body.py +0 -0
  37. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  38. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/auth_context.py +0 -0
  39. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/authenticate.py +0 -0
  40. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/data_body.py +0 -0
  41. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/filter_utils.py +0 -0
  42. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  43. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/relation_url.py +0 -0
  44. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/misc/stats_parameters.py +0 -0
  45. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_base/system.py +0 -0
  46. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/__init__.py +0 -0
  47. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/api_datasource.py +0 -0
  48. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/client.py +0 -0
  49. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/converter.py +0 -0
  50. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/exception.py +0 -0
  51. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/factory.py +0 -0
  52. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/filter.py +0 -0
  53. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/parser.py +0 -0
  54. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/validate.py +0 -0
  55. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/api_client/view.py +0 -0
  56. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/barcodes/__init__.py +0 -0
  57. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/barcodes/main.py +0 -0
  58. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/__init__.py +0 -0
  59. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/benchling_converter.py +0 -0
  60. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/benchling_datasource.py +0 -0
  61. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
  62. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/__init__.py +0 -0
  63. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
  64. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
  65. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  66. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  67. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  68. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  69. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  70. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  71. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  72. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  73. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  74. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/sample.sql +0 -0
  75. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  76. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
  77. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  78. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  79. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  80. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/board/__init__.py +0 -0
  81. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/board/blueprint.py +0 -0
  82. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/__init__.py +0 -0
  83. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/bold_datasource.py +0 -0
  84. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/client.py +0 -0
  85. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/converter.py +0 -0
  86. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/factory.py +0 -0
  87. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/bold/parser.py +0 -0
  88. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/cli/__init__.py +0 -0
  89. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/cli/cli.py +0 -0
  90. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/converter/__init__.py +0 -0
  91. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/converter/yaml/__init__.py +0 -0
  92. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/converter/yaml/model.py +0 -0
  93. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/converter/yaml/yaml_converter.py +0 -0
  94. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/__init__.py +0 -0
  95. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/client.py +0 -0
  96. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/converter.py +0 -0
  97. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/copo_datasource.py +0 -0
  98. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/factory.py +0 -0
  99. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/copo/parser.py +0 -0
  100. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/__init__.py +0 -0
  101. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/attribute_metadata.py +0 -0
  102. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/core_converter.py +0 -0
  103. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/data_loader.py +0 -0
  104. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/data_object.py +0 -0
  105. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/data_object_converter.py +0 -0
  106. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/data_source_attribute_metadata.py +0 -0
  107. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/data_source_dict.py +0 -0
  108. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/datasource.py +0 -0
  109. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/datasource_error.py +0 -0
  110. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/datasource_filter.py +0 -0
  111. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/datasource_utils.py +0 -0
  112. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/factory.py +0 -0
  113. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/http_client.py +0 -0
  114. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/__init__.py +0 -0
  115. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/_filterable.py +0 -0
  116. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/_writer.py +0 -0
  117. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/aggregator.py +0 -0
  118. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/counter.py +0 -0
  119. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/cursor.py +0 -0
  120. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/declare.py +0 -0
  121. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/deleter.py +0 -0
  122. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/detail_getter.py +0 -0
  123. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/enricher.py +0 -0
  124. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/enum.py +0 -0
  125. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/group_statter.py +0 -0
  126. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/inserter.py +0 -0
  127. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/list_getter.py +0 -0
  128. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/operator_config.py +0 -0
  129. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/page_getter.py +0 -0
  130. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/relational.py +0 -0
  131. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/statter.py +0 -0
  132. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/summariser.py +0 -0
  133. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/updater.py +0 -0
  134. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/operator/upserter.py +0 -0
  135. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/relationship.py +0 -0
  136. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/requested_fields.py +0 -0
  137. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/session.py +0 -0
  138. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/core/validate.py +0 -0
  139. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/elastic/__init__.py +0 -0
  140. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/elastic/elastic_datasource.py +0 -0
  141. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/elastic/runtime_fields.py +0 -0
  142. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/__init__.py +0 -0
  143. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/auth.py +0 -0
  144. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/eln_datasource.py +0 -0
  145. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/entities.py +0 -0
  146. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/generators.py +0 -0
  147. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/eln/sanitise.py +0 -0
  148. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/__init__.py +0 -0
  149. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/client.py +0 -0
  150. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/converter.py +0 -0
  151. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/ena_datasource.py +0 -0
  152. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/ena_methods.py +0 -0
  153. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/factory.py +0 -0
  154. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/filter.py +0 -0
  155. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/ena/parser.py +0 -0
  156. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/excel/__init__.py +0 -0
  157. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/excel/excel.py +0 -0
  158. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/excel/excel_datasource.py +0 -0
  159. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/excel/s3_factory.py +0 -0
  160. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/__init__.py +0 -0
  161. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/__init__.py +0 -0
  162. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  163. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  164. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  165. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  166. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  167. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  168. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  169. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  170. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  171. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  172. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  173. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  174. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  175. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  176. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  177. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  178. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  179. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  180. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  181. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  182. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
  183. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  184. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  185. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  186. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  187. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  188. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  189. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  190. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  191. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  192. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  193. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  194. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  195. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  196. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  197. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  198. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  199. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  200. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  201. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  202. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  203. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  204. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  205. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  206. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  207. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  208. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  209. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  210. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  211. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  212. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/logger.py +0 -0
  213. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/secrets.py +0 -0
  214. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/flows/sequencing_submissions.py +0 -0
  215. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/gap/__init__.py +0 -0
  216. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/gap/gap_datasource.py +0 -0
  217. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/__init__.py +0 -0
  218. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/client.py +0 -0
  219. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/converter.py +0 -0
  220. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/factory.py +0 -0
  221. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/filter.py +0 -0
  222. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/goat_datasource.py +0 -0
  223. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/goat/parser.py +0 -0
  224. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/google_sheets/__init__.py +0 -0
  225. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  226. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/irods/__init__.py +0 -0
  227. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/irods/irods_datasource.py +0 -0
  228. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/__init__.py +0 -0
  229. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/client.py +0 -0
  230. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/converter.py +0 -0
  231. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/factory.py +0 -0
  232. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/filter.py +0 -0
  233. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/jira_datasource.py +0 -0
  234. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/mapper.py +0 -0
  235. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/parser.py +0 -0
  236. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/jira/sort.py +0 -0
  237. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/json/__init__.py +0 -0
  238. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/json/json_datasource.py +0 -0
  239. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/json/s3_json_datasource.py +0 -0
  240. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/__init__.py +0 -0
  241. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/client.py +0 -0
  242. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/converter.py +0 -0
  243. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/factory.py +0 -0
  244. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/labwhere_datasource.py +0 -0
  245. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/labwhere/parser.py +0 -0
  246. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/markdown.py +0 -0
  247. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/mlwh/__init__.py +0 -0
  248. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/mlwh/mlwh_datasource.py +0 -0
  249. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/__init__.py +0 -0
  250. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/converter.py +0 -0
  251. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/factory.py +0 -0
  252. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/filter.py +0 -0
  253. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/prefect_datasource.py +0 -0
  254. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/prefect/prefect_object.py +0 -0
  255. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/s3/converter.py +0 -0
  256. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/s3/factory.py +0 -0
  257. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/s3/parser.py +0 -0
  258. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/s3/s3_datasource.py +0 -0
  259. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/__init__.py +0 -0
  260. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/configuration.py +0 -0
  261. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/consumer.py +0 -0
  262. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/message_builder.py +0 -0
  263. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/messages.py +0 -0
  264. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/response_processors.py +0 -0
  265. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sciops/sequencing_datasource.py +0 -0
  266. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/services/__init__.py +0 -0
  267. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/__init__.py +0 -0
  268. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/benchling.py +0 -0
  269. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/benchling_warehouse.py +0 -0
  270. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/bioscan.py +0 -0
  271. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/bioscan_extra.py +0 -0
  272. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/bioscan_image.py +0 -0
  273. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/bioscan_qc.py +0 -0
  274. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/bold.py +0 -0
  275. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/copo.py +0 -0
  276. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/defaults.py +0 -0
  277. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/elastic.py +0 -0
  278. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/ena.py +0 -0
  279. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/gap.py +0 -0
  280. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/genome_notes.py +0 -0
  281. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/goat.py +0 -0
  282. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/grit.py +0 -0
  283. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/informatics.py +0 -0
  284. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/labwhere.py +0 -0
  285. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/mlwh.py +0 -0
  286. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/portal.py +0 -0
  287. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/portal_attributes.py +0 -0
  288. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/portaldb.py +0 -0
  289. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/prefect.py +0 -0
  290. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/sciops.py +0 -0
  291. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/sts.py +0 -0
  292. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/sts_legacy.py +0 -0
  293. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/tolid.py +0 -0
  294. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/tolqc.py +0 -0
  295. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/tolqc_legacy.py +0 -0
  296. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/treeofsex.py +0 -0
  297. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/uksi_qc.py.py +0 -0
  298. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sources/workflows.py +0 -0
  299. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/__init__.py +0 -0
  300. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/action/__init__.py +0 -0
  301. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/action/factory.py +0 -0
  302. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/auth/__init__.py +0 -0
  303. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/auth/blueprint.py +0 -0
  304. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/auth/models.py +0 -0
  305. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/cast.py +0 -0
  306. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/database.py +0 -0
  307. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/ds_session.py +0 -0
  308. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/exception.py +0 -0
  309. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/ext.py +0 -0
  310. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/factory.py +0 -0
  311. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/filter.py +0 -0
  312. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/model.py +0 -0
  313. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/pipeline_step/__init__.py +0 -0
  314. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/relationship.py +0 -0
  315. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/session.py +0 -0
  316. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/sort.py +0 -0
  317. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/sql_converter.py +0 -0
  318. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/sql_datasource.py +0 -0
  319. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/standard/__init__.py +0 -0
  320. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sql/standard/factory.py +0 -0
  321. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/status/__init__.py +0 -0
  322. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/status/status_datasource.py +0 -0
  323. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sts/__init__.py +0 -0
  324. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sts/sts.py +0 -0
  325. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sts/sts_datasource.py +0 -0
  326. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/sts/sts_requests.py +0 -0
  327. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/treeval/__init__.py +0 -0
  328. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/treeval/treeval_datasource.py +0 -0
  329. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/utils/__init__.py +0 -0
  330. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/utils/csv.py +0 -0
  331. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/utils/s3.py +0 -0
  332. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/validators/__init__.py +0 -0
  333. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/validators/allowed_keys.py +0 -0
  334. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/validators/allowed_values.py +0 -0
  335. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/validators/regex.py +0 -0
  336. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol/validators/regex_by_value.py +0 -0
  337. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  338. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  339. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol_sdk.egg-info/requires.txt +0 -0
  340. {tol_sdk-1.7.3 → tol_sdk-1.7.4}/src/tol_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.7.3
3
+ Version: 1.7.4
4
4
  Summary: SDK for interaction with ToL, Sanger and external services
5
5
  Author-email: ToL Platforms Team <tol-platforms@sanger.ac.uk>
6
6
  License: MIT
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "tol-sdk"
11
- version = "1.7.3"
11
+ version = "1.7.4"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -49,7 +49,7 @@ REQUIRED_FIELDS: List = [
49
49
  def pipeline_steps_blueprint(
50
50
  sql_ds: SqlDataSource,
51
51
  prefect_ds: PrefectDataSource,
52
- role: str | None = 'exporter',
52
+ role: str | None = None,
53
53
  url_prefix: str = '/run-pipeline',
54
54
 
55
55
  ctx_getter: CtxGetter = default_ctx_getter,
@@ -155,7 +155,7 @@ def pipeline_steps_blueprint(
155
155
  'deployment_name': flow_name,
156
156
  'parameters': flow_params,
157
157
  'tags': [
158
- 'app_name:treeofsex',
158
+ f'app_name: {os.environ.get("APP_NAME", "tol")}',
159
159
  ],
160
160
  }
161
161
  )
@@ -190,10 +190,13 @@ def pipeline_steps_blueprint(
190
190
  def run_pipeline_steps() -> tuple[dict[str, Any], int]:
191
191
 
192
192
  ctx = ctx_getter()
193
- user_id = ctx.user_id
193
+ if role is not None:
194
+ if not ctx or not ctx.authenticated:
195
+ raise ForbiddenError()
196
+ if role not in ctx.roles:
197
+ raise ForbiddenError()
194
198
 
195
- if role is not None and role not in ctx.roles:
196
- raise ForbiddenError()
199
+ user_id = ctx.user_id if ctx and ctx.authenticated else None
197
200
 
198
201
  body: dict[str, Any] = request.json.get('data', {})
199
202
 
@@ -6,3 +6,4 @@ from .parser import Parser # noqa F401
6
6
  from .converter import S3Converter # noqa F401
7
7
  from .factory import create_s3_datasource # noqa F401
8
8
  from .s3_datasource import S3DataSource # noqa F401
9
+ from .data_upload.blueprint import data_upload_blueprint # noqa F401
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
@@ -0,0 +1,83 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from tempfile import NamedTemporaryFile
6
+ from typing import Any
7
+
8
+ from flask import Blueprint, request, send_file
9
+
10
+ from ...api_base import (
11
+ custom_blueprint,
12
+ )
13
+ from ...services.s3_client import S3Client
14
+
15
+
16
+ ALLOWED_EXTENSIONS: set[str] = {'csv', 'json', 'xlsx'}
17
+
18
+
19
+ def allowed_file(filename: str) -> bool:
20
+ return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
21
+
22
+
23
+ def data_upload_blueprint(
24
+ url_prefix: str = '/pipeline/data_upload',
25
+ ) -> Blueprint:
26
+
27
+ data_upload_blueprint = custom_blueprint(
28
+ name='data_upload',
29
+ url_prefix=url_prefix
30
+ )
31
+
32
+ @data_upload_blueprint.route('/upload', methods=['POST'])
33
+ def upload_file() -> tuple[dict[str, str], int]:
34
+ file = request.files['file']
35
+ s3_bucket: str = request.form.get('s3_bucket')
36
+
37
+ if not file:
38
+ return {'error': 'No file provided'}, 400
39
+
40
+ if not allowed_file(file.filename):
41
+ return {'error': 'File type not allowed'}, 400
42
+
43
+ if not s3_bucket:
44
+ return {'error': 'S3 bucket not specified'}, 400
45
+
46
+ try:
47
+ s3_client = S3Client()
48
+ with NamedTemporaryFile() as temp_file:
49
+ file.save(temp_file.name)
50
+ s3_client.put_object(s3_bucket, file.filename, temp_file.name)
51
+
52
+ return {'message': 'File uploaded successfully'}, 200
53
+
54
+ except Exception as e:
55
+ return {'error': f'Failed to upload file: {str(e)}'}, 500
56
+
57
+ @data_upload_blueprint.route('/download', methods=['POST'])
58
+ def download_file() -> tuple[dict[str, str], int]:
59
+ body: dict[str, Any] = request.json.get('data', {})
60
+
61
+ if 's3_bucket' not in body or 'file_name' not in body:
62
+ return {'error': 'S3 bucket or file name not specified'}, 400
63
+
64
+ bucket_name = body['s3_bucket']
65
+ file_name = body['file_name']
66
+
67
+ try:
68
+ s3_client = S3Client()
69
+
70
+ with NamedTemporaryFile() as temp_file:
71
+ s3_client.get_object(bucket_name, file_name, temp_file.name)
72
+ download_name = request.json.get('download_name', file_name)
73
+
74
+ return send_file(
75
+ temp_file.name,
76
+ as_attachment=True,
77
+ download_name=download_name,
78
+ mimetype='application/octet-stream'
79
+ )
80
+ except Exception as e:
81
+ return {'error': f'Failed to download file: {str(e)}'}, 500
82
+
83
+ return data_upload_blueprint
@@ -26,7 +26,7 @@ class S3Client:
26
26
  secure = os.getenv('S3_SECURE', 'true').lower() == 'true'
27
27
 
28
28
  self.client = Minio(
29
- self.s3_uri,
29
+ endpoint=self.s3_uri,
30
30
  access_key=self.access_key,
31
31
  secret_key=self.secret_key,
32
32
  secure=secure
@@ -39,7 +39,8 @@ class S3Client:
39
39
  file_path: str
40
40
  ) -> None:
41
41
 
42
- self.client.fget_object(bucket_name, object_name, file_path)
42
+ self.client.fget_object(bucket_name=bucket_name,
43
+ object_name=object_name, file_path=file_path)
43
44
 
44
45
  def list_objects(
45
46
  self,
@@ -55,4 +56,5 @@ class S3Client:
55
56
  file_path: str
56
57
  ) -> None:
57
58
 
58
- self.client.fput_object(bucket_name, object_name, file_path)
59
+ self.client.fput_object(bucket_name=bucket_name,
60
+ object_name=object_name, file_path=file_path)
@@ -146,7 +146,7 @@ def create_pipeline_step_models(
146
146
 
147
147
  user_id: Mapped[int] = mapped_column(
148
148
  ForeignKey('user.id'),
149
- nullable=False
149
+ nullable=True
150
150
  )
151
151
 
152
152
  pipeline_id: Mapped[int] = mapped_column(
@@ -0,0 +1,100 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from tol.core import DataObject
6
+ from tol.core.validate import Validator
7
+
8
+
9
+ class UniqueValuesValidator(Validator):
10
+ """
11
+ Validates that a stream of `DataObject` instances
12
+ contains unique values for specified keys.
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ unique_keys: list[list[str] | str],
18
+ *,
19
+ detail: str = 'Value is not unique',
20
+ is_error: bool = True,
21
+ ) -> None:
22
+
23
+ super().__init__()
24
+
25
+ self.__keys = unique_keys
26
+ self.__detail = detail
27
+ self.__is_error = is_error
28
+ self.__duplicates: dict[str, list[str]] = {}
29
+ self.__existing_values: dict[str, set] = {}
30
+ for key in self.__keys:
31
+ if isinstance(key, str):
32
+ self.__existing_values[key] = set()
33
+ elif isinstance(key, list):
34
+ concat_key = '/'.join(key)
35
+ self.__existing_values[concat_key] = set()
36
+
37
+ def _validate_data_object(
38
+ self,
39
+ obj: DataObject
40
+ ) -> None:
41
+
42
+ for unique_key in self.__keys:
43
+ if isinstance(unique_key, list):
44
+ concat = ''
45
+ for key in unique_key:
46
+ concat = concat + '/' + (str(obj.attributes[key]))
47
+ if concat in self.__existing_values['/'.join(unique_key)]:
48
+ self._duplicate_checks(
49
+ key=key,
50
+ value=concat
51
+ )
52
+ else:
53
+ self.__existing_values['/'.join(unique_key)].add(concat)
54
+
55
+ else:
56
+ if obj.attributes[unique_key] in self.__existing_values[unique_key]:
57
+ self._duplicate_checks(
58
+ key=unique_key,
59
+ value=obj.attributes[unique_key]
60
+ )
61
+ else:
62
+ self.__existing_values[unique_key].add(obj.attributes[unique_key])
63
+
64
+ def _duplicate_checks(
65
+ self,
66
+ key: str,
67
+ value: str
68
+ ):
69
+ if key not in self.__duplicates:
70
+ self.__duplicates[key] = []
71
+ self.__duplicates[key].append(value)
72
+
73
+ def _post_validation(
74
+ self,
75
+ obj: DataObject,
76
+ ) -> None:
77
+ for key in self.__duplicates:
78
+ self.__add_result(
79
+ obj=obj,
80
+ key=key,
81
+ )
82
+
83
+ def __add_result(
84
+ self,
85
+ obj: DataObject,
86
+ key: str,
87
+ ) -> None:
88
+
89
+ if self.__is_error:
90
+ self.add_error(
91
+ object_id=obj.id,
92
+ detail=self.__detail,
93
+ field=key,
94
+ )
95
+ else:
96
+ self.add_warning(
97
+ object_id=obj.id,
98
+ detail=self.__detail,
99
+ field=key,
100
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.7.3
3
+ Version: 1.7.4
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
@@ -247,6 +247,8 @@ src/tol/s3/converter.py
247
247
  src/tol/s3/factory.py
248
248
  src/tol/s3/parser.py
249
249
  src/tol/s3/s3_datasource.py
250
+ src/tol/s3/data_upload/__init__.py
251
+ src/tol/s3/data_upload/blueprint.py
250
252
  src/tol/sciops/__init__.py
251
253
  src/tol/sciops/configuration.py
252
254
  src/tol/sciops/consumer.py
@@ -1,72 +0,0 @@
1
- # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- from tol.core import DataObject
6
- from tol.core.validate import Validator
7
-
8
-
9
- class UniqueValuesValidator(Validator):
10
- """
11
- Validates that a stream of `DataObject` instances
12
- contains unique values for specified keys.
13
- """
14
-
15
- def __init__(
16
- self,
17
- unique_keys: list[str],
18
- *,
19
- detail: str = 'Value is not unique',
20
- is_error: bool = True,
21
- ) -> None:
22
-
23
- super().__init__()
24
-
25
- self.__keys = unique_keys
26
- self.__detail = detail
27
- self.__is_error = is_error
28
- self.__duplicates: dict[str, list[str]] = {}
29
- self.__existing_values: dict[str, set] = {key: set() for key in unique_keys}
30
-
31
- def _validate_data_object(
32
- self,
33
- obj: DataObject
34
- ) -> None:
35
-
36
- for key in obj.attributes:
37
- if key in self.__keys:
38
- if obj.attributes[key] in self.__existing_values[key]:
39
- if key not in self.__duplicates:
40
- self.__duplicates[key] = []
41
- self.__duplicates[key].append(obj.attributes[key])
42
- else:
43
- self.__existing_values[key].add(obj.attributes[key])
44
-
45
- def _post_validation(
46
- self,
47
- obj: DataObject,
48
- ) -> None:
49
- for key in self.__duplicates:
50
- self.__add_result(
51
- obj=obj,
52
- key=key,
53
- )
54
-
55
- def __add_result(
56
- self,
57
- obj: DataObject,
58
- key: str,
59
- ) -> None:
60
-
61
- if self.__is_error:
62
- self.add_error(
63
- object_id=obj.id,
64
- detail=self.__detail,
65
- field=key,
66
- )
67
- else:
68
- self.add_warning(
69
- object_id=obj.id,
70
- detail=self.__detail,
71
- field=key,
72
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes