tol-sdk 1.7.5b4__tar.gz → 1.8.0__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 (355) hide show
  1. {tol_sdk-1.7.5b4/src/tol_sdk.egg-info → tol_sdk-1.8.0}/PKG-INFO +3 -1
  2. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/pyproject.toml +2 -1
  3. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/data_object_converter.py +6 -0
  4. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/excel/excel_datasource.py +5 -1
  5. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +46 -21
  6. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/__init__.py +1 -0
  7. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/converter_and_validate.py +4 -4
  8. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/ena_checklist.py +16 -16
  9. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/regex.py +2 -3
  10. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/sts_fields.py +20 -14
  11. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/tolid.py +1 -1
  12. tol_sdk-1.8.0/src/tol/validators/types.py +87 -0
  13. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0/src/tol_sdk.egg-info}/PKG-INFO +3 -1
  14. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol_sdk.egg-info/SOURCES.txt +1 -0
  15. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol_sdk.egg-info/requires.txt +3 -0
  16. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/LICENSE +0 -0
  17. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/MANIFEST.in +0 -0
  18. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/README.md +0 -0
  19. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/setup.cfg +0 -0
  20. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/certs/cacert.pem +0 -0
  21. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/__init__.py +0 -0
  22. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/actions/__init__.py +0 -0
  23. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/actions/action.py +0 -0
  24. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/actions/upsert_action.py +0 -0
  25. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/__init__.py +0 -0
  26. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/action.py +0 -0
  27. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/__init__.py +0 -0
  28. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/abc/__init__.py +0 -0
  29. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/abc/auth.py +0 -0
  30. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  31. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/asserts.py +0 -0
  32. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/blueprint.py +0 -0
  33. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/composite.py +0 -0
  34. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/config.py +0 -0
  35. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/auth/error.py +0 -0
  36. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/blueprint.py +0 -0
  37. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/controller.py +0 -0
  38. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/data_upload.py +0 -0
  39. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/__init__.py +0 -0
  40. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/aggregation_body.py +0 -0
  41. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  42. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/auth_context.py +0 -0
  43. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/authenticate.py +0 -0
  44. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/data_body.py +0 -0
  45. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/filter_utils.py +0 -0
  46. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  47. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/relation_url.py +0 -0
  48. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/misc/stats_parameters.py +0 -0
  49. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/pipeline_steps.py +0 -0
  50. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_base/system.py +0 -0
  51. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/__init__.py +0 -0
  52. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/api_datasource.py +0 -0
  53. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/client.py +0 -0
  54. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/converter.py +0 -0
  55. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/exception.py +0 -0
  56. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/factory.py +0 -0
  57. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/filter.py +0 -0
  58. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/parser.py +0 -0
  59. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/validate.py +0 -0
  60. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/api_client/view.py +0 -0
  61. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/barcodes/__init__.py +0 -0
  62. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/barcodes/main.py +0 -0
  63. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/__init__.py +0 -0
  64. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/benchling_converter.py +0 -0
  65. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/benchling_datasource.py +0 -0
  66. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
  67. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/__init__.py +0 -0
  68. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
  69. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
  70. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  71. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  72. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  73. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  74. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  75. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  76. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  77. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  78. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  79. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/sample.sql +0 -0
  80. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  81. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
  82. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  83. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  84. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  85. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/board/__init__.py +0 -0
  86. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/board/blueprint.py +0 -0
  87. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/__init__.py +0 -0
  88. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/bold_datasource.py +0 -0
  89. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/client.py +0 -0
  90. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/converter.py +0 -0
  91. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/factory.py +0 -0
  92. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/bold/parser.py +0 -0
  93. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/cli/__init__.py +0 -0
  94. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/cli/cli.py +0 -0
  95. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/converter/__init__.py +0 -0
  96. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/converter/yaml/__init__.py +0 -0
  97. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/converter/yaml/model.py +0 -0
  98. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/converter/yaml/yaml_converter.py +0 -0
  99. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/__init__.py +0 -0
  100. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/client.py +0 -0
  101. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/converter.py +0 -0
  102. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/copo_datasource.py +0 -0
  103. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/factory.py +0 -0
  104. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/copo/parser.py +0 -0
  105. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/__init__.py +0 -0
  106. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/attribute_metadata.py +0 -0
  107. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/core_converter.py +0 -0
  108. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/data_loader.py +0 -0
  109. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/data_object.py +0 -0
  110. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/data_source_attribute_metadata.py +0 -0
  111. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/data_source_dict.py +0 -0
  112. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/datasource.py +0 -0
  113. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/datasource_error.py +0 -0
  114. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/datasource_filter.py +0 -0
  115. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/datasource_utils.py +0 -0
  116. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/factory.py +0 -0
  117. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/http_client.py +0 -0
  118. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/__init__.py +0 -0
  119. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/_filterable.py +0 -0
  120. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/_writer.py +0 -0
  121. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/aggregator.py +0 -0
  122. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/counter.py +0 -0
  123. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/cursor.py +0 -0
  124. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/declare.py +0 -0
  125. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/deleter.py +0 -0
  126. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/detail_getter.py +0 -0
  127. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/enricher.py +0 -0
  128. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/enum.py +0 -0
  129. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/group_statter.py +0 -0
  130. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/inserter.py +0 -0
  131. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/list_getter.py +0 -0
  132. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/operator_config.py +0 -0
  133. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/page_getter.py +0 -0
  134. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/relational.py +0 -0
  135. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/statter.py +0 -0
  136. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/summariser.py +0 -0
  137. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/updater.py +0 -0
  138. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/operator/upserter.py +0 -0
  139. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/relationship.py +0 -0
  140. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/requested_fields.py +0 -0
  141. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/session.py +0 -0
  142. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/core/validate.py +0 -0
  143. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/elastic/__init__.py +0 -0
  144. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/elastic/elastic_datasource.py +0 -0
  145. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/elastic/runtime_fields.py +0 -0
  146. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/__init__.py +0 -0
  147. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/auth.py +0 -0
  148. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/eln_datasource.py +0 -0
  149. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/entities.py +0 -0
  150. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/generators.py +0 -0
  151. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/eln/sanitise.py +0 -0
  152. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/__init__.py +0 -0
  153. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/client.py +0 -0
  154. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/converter.py +0 -0
  155. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/ena_datasource.py +0 -0
  156. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/ena_methods.py +0 -0
  157. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/factory.py +0 -0
  158. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/filter.py +0 -0
  159. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/ena/parser.py +0 -0
  160. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/excel/__init__.py +0 -0
  161. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/excel/excel.py +0 -0
  162. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/excel/s3_factory.py +0 -0
  163. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/__init__.py +0 -0
  164. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/__init__.py +0 -0
  165. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  166. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  167. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  168. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  169. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  170. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  171. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  172. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  173. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  174. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  175. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  176. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  177. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  178. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  179. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  180. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  181. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  182. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  183. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  184. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  185. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
  186. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  187. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  188. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  189. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  190. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  191. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  192. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  193. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  194. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  195. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  196. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
  197. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  198. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  199. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  200. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  201. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  202. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  203. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
  204. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  205. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  206. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  207. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  208. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  209. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  210. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  211. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  212. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  213. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  214. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  215. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  216. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  217. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/logger.py +0 -0
  218. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/secrets.py +0 -0
  219. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/flows/sequencing_submissions.py +0 -0
  220. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/gap/__init__.py +0 -0
  221. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/gap/gap_datasource.py +0 -0
  222. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/__init__.py +0 -0
  223. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/client.py +0 -0
  224. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/converter.py +0 -0
  225. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/factory.py +0 -0
  226. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/filter.py +0 -0
  227. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/goat_datasource.py +0 -0
  228. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/goat/parser.py +0 -0
  229. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/google_sheets/__init__.py +0 -0
  230. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  231. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/irods/__init__.py +0 -0
  232. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/irods/irods_datasource.py +0 -0
  233. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/__init__.py +0 -0
  234. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/client.py +0 -0
  235. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/converter.py +0 -0
  236. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/factory.py +0 -0
  237. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/filter.py +0 -0
  238. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/jira_datasource.py +0 -0
  239. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/mapper.py +0 -0
  240. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/parser.py +0 -0
  241. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/jira/sort.py +0 -0
  242. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/json/__init__.py +0 -0
  243. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/json/json_datasource.py +0 -0
  244. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/json/s3_json_datasource.py +0 -0
  245. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/__init__.py +0 -0
  246. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/client.py +0 -0
  247. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/converter.py +0 -0
  248. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/factory.py +0 -0
  249. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/labwhere_datasource.py +0 -0
  250. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/labwhere/parser.py +0 -0
  251. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/markdown.py +0 -0
  252. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/mlwh/__init__.py +0 -0
  253. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/mlwh/mlwh_datasource.py +0 -0
  254. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/__init__.py +0 -0
  255. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/converter.py +0 -0
  256. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/factory.py +0 -0
  257. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/filter.py +0 -0
  258. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/prefect_datasource.py +0 -0
  259. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/prefect/prefect_object.py +0 -0
  260. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/s3/__init__.py +0 -0
  261. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/s3/converter.py +0 -0
  262. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/s3/factory.py +0 -0
  263. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/s3/parser.py +0 -0
  264. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/s3/s3_datasource.py +0 -0
  265. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/__init__.py +0 -0
  266. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/configuration.py +0 -0
  267. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/consumer.py +0 -0
  268. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/message_builder.py +0 -0
  269. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/messages.py +0 -0
  270. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/response_processors.py +0 -0
  271. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sciops/sequencing_datasource.py +0 -0
  272. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/services/__init__.py +0 -0
  273. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/services/s3_client.py +0 -0
  274. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/__init__.py +0 -0
  275. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/benchling.py +0 -0
  276. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/benchling_warehouse.py +0 -0
  277. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/bioscan.py +0 -0
  278. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/bioscan_extra.py +0 -0
  279. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/bioscan_image.py +0 -0
  280. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/bioscan_qc.py +0 -0
  281. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/bold.py +0 -0
  282. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/copo.py +0 -0
  283. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/defaults.py +0 -0
  284. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/elastic.py +0 -0
  285. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/ena.py +0 -0
  286. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/gap.py +0 -0
  287. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/genome_notes.py +0 -0
  288. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/goat.py +0 -0
  289. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/grit.py +0 -0
  290. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/informatics.py +0 -0
  291. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/labwhere.py +0 -0
  292. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/mlwh.py +0 -0
  293. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/portal.py +0 -0
  294. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/portal_attributes.py +0 -0
  295. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/portaldb.py +0 -0
  296. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/prefect.py +0 -0
  297. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/sciops.py +0 -0
  298. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/sts.py +0 -0
  299. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/sts_legacy.py +0 -0
  300. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/tolid.py +0 -0
  301. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/tolqc.py +0 -0
  302. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/tolqc_legacy.py +0 -0
  303. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/treeofsex.py +0 -0
  304. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/uksi_qc.py.py +0 -0
  305. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sources/workflows.py +0 -0
  306. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/__init__.py +0 -0
  307. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/action/__init__.py +0 -0
  308. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/action/factory.py +0 -0
  309. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/auth/__init__.py +0 -0
  310. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/auth/blueprint.py +0 -0
  311. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/auth/models.py +0 -0
  312. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/cast.py +0 -0
  313. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/database.py +0 -0
  314. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/ds_session.py +0 -0
  315. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/exception.py +0 -0
  316. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/ext.py +0 -0
  317. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/factory.py +0 -0
  318. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/filter.py +0 -0
  319. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/model.py +0 -0
  320. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/pipeline_step/__init__.py +0 -0
  321. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/pipeline_step/factory.py +0 -0
  322. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/relationship.py +0 -0
  323. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/session.py +0 -0
  324. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/sort.py +0 -0
  325. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/sql_converter.py +0 -0
  326. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/sql_datasource.py +0 -0
  327. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/standard/__init__.py +0 -0
  328. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sql/standard/factory.py +0 -0
  329. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/status/__init__.py +0 -0
  330. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/status/status_datasource.py +0 -0
  331. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sts/__init__.py +0 -0
  332. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sts/sts.py +0 -0
  333. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sts/sts_datasource.py +0 -0
  334. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/sts/sts_requests.py +0 -0
  335. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/treeval/__init__.py +0 -0
  336. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/treeval/treeval_datasource.py +0 -0
  337. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/utils/__init__.py +0 -0
  338. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/utils/csv.py +0 -0
  339. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/utils/s3.py +0 -0
  340. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/allowed_keys.py +0 -0
  341. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/allowed_values.py +0 -0
  342. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/allowed_values_from_datasource.py +0 -0
  343. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/assert_on_condition.py +0 -0
  344. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/ena_submittable.py +0 -0
  345. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/interfaces/__init__.py +0 -0
  346. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
  347. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/min_one_valid_value.py +0 -0
  348. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/mutually_exclusive.py +0 -0
  349. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/regex_by_value.py +0 -0
  350. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/specimens_have_same_taxon.py +0 -0
  351. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/unique_values.py +0 -0
  352. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol/validators/unique_whole_organisms.py +0 -0
  353. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  354. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  355. {tol_sdk-1.7.5b4 → tol_sdk-1.8.0}/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.5b4
3
+ Version: 1.8.0
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
@@ -50,6 +50,8 @@ Requires-Dist: openpyxl>=3.0.10; extra == "sheets"
50
50
  Requires-Dist: XlsxWriter==3.1.9; extra == "sheets"
51
51
  Requires-Dist: xlrd==2.0.1; extra == "sheets"
52
52
  Requires-Dist: gspread>=5.12.0; extra == "sheets"
53
+ Provides-Extra: s3
54
+ Requires-Dist: minio==7.2.15; extra == "s3"
53
55
  Provides-Extra: all
54
56
  Requires-Dist: tol-sdk[api-base]; extra == "all"
55
57
  Requires-Dist: tol-sdk[benchling]; extra == "all"
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "tol-sdk"
11
- version = "1.7.5-beta4"
11
+ version = "1.8.0"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -53,6 +53,7 @@ sheets = [
53
53
  "xlrd == 2.0.1",
54
54
  "gspread >= 5.12.0"
55
55
  ]
56
+ s3 = ["minio == 7.2.15"]
56
57
  all = [
57
58
  "tol-sdk[api-base]",
58
59
  "tol-sdk[benchling]",
@@ -3,6 +3,7 @@
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
5
  from abc import ABC, abstractmethod
6
+ from dataclasses import dataclass
6
7
  from typing import Iterable
7
8
 
8
9
  from more_itertools import flatten
@@ -95,9 +96,14 @@ class DefaultDataObjectToDataObjectConverter(DataObjectToDataObjectOrUpdateConve
95
96
 
96
97
  class SanitisingConverter(DataObjectToDataObjectOrUpdateConverter):
97
98
 
99
+ @dataclass(slots=True, frozen=True, kw_only=True)
100
+ class Config:
101
+ pass
102
+
98
103
  def __init__(
99
104
  self,
100
105
  data_object_factory: DataObjectFactory,
106
+ config: Config,
101
107
  **kwargs
102
108
  ):
103
109
  super().__init__(data_object_factory)
@@ -65,7 +65,7 @@ class ExcelDataSource(
65
65
  ) -> Iterable[DataObject]:
66
66
 
67
67
  return (
68
- self.__marshal_row(row_index + 1, row)
68
+ self.__marshal_row(row_index + 2, row) # Add 1 for header, 1 for 1-based ID
69
69
  for row_index, row
70
70
  in self.__df.iterrows()
71
71
  )
@@ -115,6 +115,10 @@ class ExcelDataSource(
115
115
  __v: Any,
116
116
  ) -> Any:
117
117
 
118
+ # Convert pandas Timestamp to Python datetime
119
+ if isinstance(__v, pd.Timestamp):
120
+ __v = datetime.fromtimestamp(__v.timestamp())
121
+
118
122
  if __k not in self.__mappings:
119
123
  return __v
120
124
 
@@ -3,6 +3,7 @@
3
3
 
4
4
  import re
5
5
  from dataclasses import dataclass
6
+ from datetime import datetime
6
7
  from typing import Iterable
7
8
 
8
9
  from tol.core import DataObject, DataObjectToDataObjectOrUpdateConverter
@@ -30,8 +31,10 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
30
31
  s = data_object
31
32
  attributes = {
32
33
  'ENA-CHECKLIST': self.__config.ena_checklist_id,
33
- 'organism part': self.__replace_underscores(
34
- s.attributes.get('ORGANISM_PART')),
34
+ 'organism part': self.__join_list([
35
+ self.__replace_underscores(v)
36
+ for v in s.attributes.get('ORGANISM_PART', [])
37
+ ]),
35
38
  'lifestage': (
36
39
  'spore-bearing structure'
37
40
  if s.attributes.get('LIFESTAGE') == 'SPORE_BEARING_STRUCTURE'
@@ -40,35 +43,38 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
40
43
  ),
41
44
  'project name':
42
45
  self.__config.project_name,
43
- 'collected by':
44
- self.__replace_underscores(
45
- s.attributes.get('COLLECTED_BY')),
46
+ 'collected_by': self.__join_list([
47
+ self.__replace_underscores(v)
48
+ for v in s.attributes.get('COLLECTED_BY', [])
49
+ ]),
46
50
  'collection date':
47
- self.__replace_underscores(
48
- s.attributes.get('DATE_OF_COLLECTION')).lower(),
51
+ self.__format_date(
52
+ s.attributes.get('DATE_OF_COLLECTION')),
49
53
  'geographic location (country and/or sea)':
50
54
  self.__collection_country(s).replace('_', ' '),
51
55
  'geographic location (latitude)':
52
56
  self.__replace_underscores(
53
- s.attributes.get('DECIMAL_LATITUDE')).lower(),
57
+ str(s.attributes.get('DECIMAL_LATITUDE'))).lower(),
54
58
  'geographic location (latitude) units':
55
59
  'DD',
56
60
  'geographic location (longitude)':
57
61
  self.__replace_underscores(
58
- s.attributes.get('DECIMAL_LONGITUDE')).lower(),
62
+ str(s.attributes.get('DECIMAL_LONGITUDE'))).lower(),
59
63
  'geographic location (longitude) units':
60
64
  'DD',
61
65
  'geographic location (region and locality)':
62
66
  self.__collection_region(s).replace('_', ' '),
63
- 'identified_by':
64
- self.__replace_underscores(
65
- s.attributes.get('IDENTIFIED_BY')),
67
+ 'identified_by': self.__join_list([
68
+ self.__replace_underscores(v)
69
+ for v in s.attributes.get('IDENTIFIED_BY', [])
70
+ ]),
66
71
  'habitat':
67
72
  self.__replace_underscores(
68
73
  s.attributes.get('HABITAT')),
69
- 'identifier_affiliation':
70
- self.__replace_underscores(
71
- s.attributes.get('IDENTIFIER_AFFILIATION')),
74
+ 'identifier_affiliation': self.__join_list([
75
+ self.__replace_underscores(v)
76
+ for v in s.attributes.get('IDENTIFIER_AFFILIATION', [])
77
+ ]),
72
78
  'sex':
73
79
  self.__replace_underscores(
74
80
  s.attributes.get('SEX')),
@@ -77,9 +83,10 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
77
83
  s.attributes.get('RELATIONSHIP')),
78
84
  'SYMBIONT':
79
85
  'Y' if s.attributes.get('SYMBIONT') == 'SYMBIONT' else 'N',
80
- 'collecting institution':
81
- self.__replace_underscores(
82
- s.attributes.get('COLLECTOR_AFFILIATION'))
86
+ 'collecting institution': self.__join_list([
87
+ self.__replace_underscores(v)
88
+ for v in s.attributes.get('COLLECTOR_AFFILIATION', [])
89
+ ]),
83
90
  }
84
91
  if self.__sanitise(s.attributes.get('DEPTH')) != '':
85
92
  attributes['geographic location (depth)'] = s.attributes.get('DEPTH')
@@ -88,9 +95,11 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
88
95
  attributes['geographic location (elevation)'] = s.attributes.get('ELEVATION')
89
96
  attributes['geographic location (elevation) units'] = 'm'
90
97
  if self.__sanitise(s.attributes.get('ORIGINAL_COLLECTION_DATE')) != '':
91
- attributes['original collection date'] = s.attributes.get('ORIGINAL_COLLECTION_DATE')
98
+ attributes['original collection date'] = \
99
+ self.__format_date(s.attributes.get('ORIGINAL_COLLECTION_DATE'))
92
100
  if self.__sanitise(s.attributes.get('ORIGINAL_GEOGRAPHIC_LOCATION')) != '':
93
- attributes['original geographic location'] = self.__replace_underscores(s.attributes.get('ORIGINAL_GEOGRAPHIC_LOCATION')) # noqa
101
+ attributes['original geographic location'] = \
102
+ self.__replace_underscores(s.attributes.get('ORIGINAL_GEOGRAPHIC_LOCATION'))
94
103
  if s.attributes.get('GAL') is not None:
95
104
  attributes['GAL'] = s.attributes.get('GAL')
96
105
  if s.attributes.get('VOUCHER_ID') is not None:
@@ -103,7 +112,7 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
103
112
  attributes['culture_or_strain_id'] = s.attributes.get('CULTURE_OR_STRAIN_ID')
104
113
 
105
114
  ret = self._data_object_factory(
106
- 'sample',
115
+ data_object.type,
107
116
  s.id,
108
117
  attributes=attributes,
109
118
  )
@@ -128,3 +137,19 @@ class IncomingSampleToEnaSampleConverter(DataObjectToDataObjectOrUpdateConverter
128
137
  if value is None:
129
138
  return default_value
130
139
  return value
140
+
141
+ def __join_list(self, value_list):
142
+ if value_list is None:
143
+ return ''
144
+ if not isinstance(value_list, list):
145
+ return str(value_list)
146
+ return ' | '.join(str(v) for v in value_list)
147
+
148
+ def __format_date(self, value):
149
+ """Format date to YYYY-mm-dd format"""
150
+ if value is None:
151
+ return ''
152
+ if isinstance(value, datetime):
153
+ return value.strftime('%Y-%m-%d')
154
+
155
+ return str(value)
@@ -15,6 +15,7 @@ from .regex_by_value import RegexByValueValidator # noqa
15
15
  from .specimens_have_same_taxon import SpecimensHaveSameTaxonValidator # noqa
16
16
  from .sts_fields import StsFieldsValidator # noqa
17
17
  from .tolid import TolidValidator # noqa
18
+ from .types import TypesValidator # noqa
18
19
  from .unique_values import UniqueValuesValidator # noqa
19
20
  from .unique_whole_organisms import UniqueWholeOrganismsValidator # noqa
20
21
  from .interfaces import Condition # noqa
@@ -19,12 +19,12 @@ class ConverterAndValidateValidator(Validator):
19
19
  "converters": [{
20
20
  "module": "<path.to.module>",
21
21
  "class_name": "<path.to.ConverterClass>",
22
- "config": { ... }
22
+ "config_details": { ... }
23
23
  }],
24
24
  "validators": [{
25
25
  "module": "<path.to.module>",
26
26
  "class_name": "<path.to.ValidatorClass>",
27
- "config": { ... }
27
+ "config_details": { ... }
28
28
  }]
29
29
  }
30
30
 
@@ -54,7 +54,7 @@ class ConverterAndValidateValidator(Validator):
54
54
  converter_class = getattr(__module, conv.get('class_name'))
55
55
 
56
56
  converter_conf = converter_class.Config(
57
- **conv.get('config')
57
+ **conv.get('config_details')
58
58
  )
59
59
  self.__converters.append(converter_class(
60
60
  data_object_factory=data_object_factory,
@@ -65,7 +65,7 @@ class ConverterAndValidateValidator(Validator):
65
65
  validator_class = getattr(__module, val.get('class_name'))
66
66
 
67
67
  validator_conf = validator_class.Config(
68
- **val.get('config')
68
+ **val.get('config_details')
69
69
  )
70
70
  self.__validators.append(validator_class(
71
71
  data_object_factory=data_object_factory,
@@ -27,31 +27,31 @@ class EnaChecklistValidator(Validator):
27
27
  super().__init__()
28
28
  self.__config = config
29
29
  self._datasource = datasource
30
+ self.__ena_checklist = datasource.get_one(
31
+ 'checklist',
32
+ self.__config.ena_checklist_id
33
+ ).checklist
30
34
 
31
35
  def _validate_data_object(self, obj: DataObject) -> None:
32
- ena_datasource = self._datasource
33
- ena_checklist = ena_datasource.get_one('checklist', self.__config.ena_checklist_id)
34
-
35
- validations = ena_checklist.attributes['checklist']
36
- for key in validations:
36
+ for key, validation in self.__ena_checklist.items():
37
37
  field_name = key
38
- if 'field' in validations[key]:
39
- field_name = validations[key]['field']
40
- if 'mandatory' in validations[key] and key not in obj.attributes:
38
+ if 'field' in validation:
39
+ field_name = validation['field']
40
+ if 'mandatory' in validation and key not in obj.attributes:
41
41
  self.add_error(object_id=obj.id, detail='Must be given', field=[field_name])
42
42
  continue
43
- if 'mandatory' in validations[key] and obj.attributes[key] is None:
43
+ if 'mandatory' in validation and obj.attributes[key] is None:
44
44
  self.add_error(object_id=obj.id, detail='Must be given', field=[field_name])
45
45
  continue
46
- if 'mandatory' in validations[key] and obj.attributes.get(key) == '':
46
+ if 'mandatory' in validation and obj.attributes.get(key) == '':
47
47
  self.add_error(
48
48
  object_id=obj.id,
49
49
  detail='Must not be empty', field=[field_name]
50
50
  )
51
51
 
52
- if 'restricted text' in validations[key] and key in obj.attributes:
53
- for condition in validations[key]:
54
- if type(condition) == str and '(' in condition:
52
+ if 'restricted text' in validation and key in obj.attributes:
53
+ for condition in validation:
54
+ if isinstance(condition, str) and '(' in condition:
55
55
  regex = condition
56
56
  compiled_re = re.compile(regex)
57
57
  if not compiled_re.search(obj.attributes.get(key)):
@@ -61,9 +61,9 @@ class EnaChecklistValidator(Validator):
61
61
  )
62
62
 
63
63
  # Check against allowed values
64
- if 'text choice' in validations[key] and key in obj.attributes:
65
- for condition in validations[key]:
66
- if type(condition) == list:
64
+ if 'text choice' in validation and key in obj.attributes:
65
+ for condition in validation:
66
+ if isinstance(condition, list):
67
67
  allowed_values = condition
68
68
  if obj.attributes.get(key).lower() not in \
69
69
  [x.lower() for x in allowed_values]:
@@ -26,9 +26,9 @@ class Regex:
26
26
 
27
27
  def is_allowed(self, __v: Any) -> bool:
28
28
  # Check regex
29
- return bool(re.search(
29
+ return __v is None or __v == '' or bool(re.search(
30
30
  self.regex,
31
- str(__v) if __v is not None else ''
31
+ str(__v)
32
32
  ))
33
33
 
34
34
 
@@ -90,7 +90,6 @@ class RegexValidator(Validator):
90
90
  obj: DataObject,
91
91
  c: Regex,
92
92
  ) -> None:
93
-
94
93
  if c.is_error:
95
94
  self.add_error(
96
95
  object_id=obj.id,
@@ -53,36 +53,42 @@ class StsFieldsValidator(Validator):
53
53
  for field in self.__fields.values():
54
54
  # Get the value from the data object
55
55
  field_value = obj.get_field_by_name(field.get('data_input_key'))
56
- if field.get('mandatory_input') and (field_value is None or field_value == ''):
56
+ if field.get('mandatory_validation') and (field_value is None or field_value == ''):
57
57
  self.add_error(
58
58
  object_id=obj.id,
59
59
  detail=f'Field {field.get("data_input_key")} is required '
60
60
  f'for project {self.__config.project_code}',
61
61
  field=field.get('data_input_key'),
62
62
  )
63
- elif field.get('allowed_values') and field_value not in field.get('allowed_values'):
63
+ elif field.get('allowed_values'):
64
+ allowed_values = [
65
+ value.get('value') for value in field.get('allowed_values', [])
66
+ ]
67
+ if field_value not in allowed_values:
68
+ self.add_error(
69
+ object_id=obj.id,
70
+ detail=f'Field {field.get("data_input_key")} value '
71
+ f'"{field_value}" not found in allowed values '
72
+ f'{allowed_values} for project '
73
+ f'{self.__config.project_code}',
74
+ field=field.get('data_input_key'),
75
+ )
76
+ elif field.get('min') and field.get('type') == 'String' \
77
+ and field_value is not None and len(field_value) < field.get('min'):
64
78
  self.add_error(
65
79
  object_id=obj.id,
66
80
  detail=f'Field {field.get("data_input_key")} value '
67
- f'"{field_value}" not found in allowed values '
68
- f'{field.get("allowed_values")} for project '
69
- f'{self.__config.project_code}',
70
- field=field.get('data_input_key'),
71
- )
72
- elif field.get('min') and field_value < field.get('min'):
73
- self.add_error(
74
- object_id=obj.id,
75
- detail=f'Field {field.get("data_input_key")} value '
76
- f'"{field_value}" is less than minimum value '
81
+ f'"{field_value}" is shorter than minimum length '
77
82
  f'"{field.get("min")}" for project '
78
83
  f'{self.__config.project_code}',
79
84
  field=field.get('data_input_key'),
80
85
  )
81
- elif field.get('max') and field_value > field.get('max'):
86
+ elif field.get('max') and field.get('type') == 'String' \
87
+ and field_value is not None and len(field_value) > field.get('max'):
82
88
  self.add_error(
83
89
  object_id=obj.id,
84
90
  detail=f'Field {field.get("data_input_key")} value '
85
- f'"{field_value}" is greater than maximum value '
91
+ f'"{field_value}" is longer than maximum length '
86
92
  f'"{field.get("max")}" for project '
87
93
  f'{self.__config.project_code}',
88
94
  field=field.get('data_input_key'),
@@ -103,7 +103,7 @@ class TolidValidator(Validator):
103
103
 
104
104
  if str(obj.get_field_by_name(self.__config.species_id_field)) not in taxons:
105
105
  self.add_error(
106
- object_id=obj.id,
106
+ object_id=obj.id + 1,
107
107
  detail=f'Specimen ID {specimen_id} does not match Taxon ID '
108
108
  f'{obj.get_field_by_name(self.__config.species_id_field)}'
109
109
  'in TolID source',
@@ -0,0 +1,87 @@
1
+ # SPDX-FileCopyrightText: 2025 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from dataclasses import dataclass
6
+ from datetime import datetime, time
7
+
8
+ from tol.core import DataObject
9
+ from tol.core.validate import Validator
10
+
11
+
12
+ class TypesValidator(Validator):
13
+ """
14
+ Validates an incoming stream of `DataObject` instances,
15
+ ensuring that they only have attributes of the given
16
+ allowed keys.
17
+ """
18
+ @dataclass(slots=True, frozen=True, kw_only=True)
19
+ class Config:
20
+ allowed_types: dict[str, str]
21
+ is_error: bool = True
22
+ detail: str = 'Value is of incorrect type'
23
+
24
+ __slots__ = ['__config']
25
+ __config: Config
26
+
27
+ def __init__(
28
+ self,
29
+ config: Config,
30
+ **kwargs
31
+ ) -> None:
32
+
33
+ super().__init__()
34
+ self.__config = config
35
+
36
+ def _validate_data_object(
37
+ self,
38
+ obj: DataObject
39
+ ) -> None:
40
+
41
+ type_map = {
42
+ 'str': str,
43
+ 'int': int,
44
+ 'float': float,
45
+ 'bool': bool,
46
+ 'list': list,
47
+ 'dict': dict,
48
+ 'datetime': datetime,
49
+ 'time': time
50
+ }
51
+ for key, expected_type in self.__config.allowed_types.items():
52
+ if key in obj.attributes:
53
+ actual_value = obj.get_field_by_name(key)
54
+ if actual_value is None:
55
+ continue
56
+ type_class = type_map.get(expected_type)
57
+ if type_class and not isinstance(actual_value, type_class):
58
+ self.__add_result(
59
+ obj,
60
+ key,
61
+ )
62
+ if type_class and isinstance(actual_value, type_class):
63
+ # Special case for bool since isinstance(True, int) is True
64
+ if expected_type == 'int' and isinstance(actual_value, bool):
65
+ self.__add_result(
66
+ obj,
67
+ key,
68
+ )
69
+
70
+ def __add_result(
71
+ self,
72
+ obj: DataObject,
73
+ key: str,
74
+ ) -> None:
75
+
76
+ if self.__config.is_error:
77
+ self.add_error(
78
+ object_id=obj.id,
79
+ detail=self.__config.detail,
80
+ field=key,
81
+ )
82
+ else:
83
+ self.add_warning(
84
+ object_id=obj.id,
85
+ detail=self.__config.detail,
86
+ field=key,
87
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.7.5b4
3
+ Version: 1.8.0
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
@@ -50,6 +50,8 @@ Requires-Dist: openpyxl>=3.0.10; extra == "sheets"
50
50
  Requires-Dist: XlsxWriter==3.1.9; extra == "sheets"
51
51
  Requires-Dist: xlrd==2.0.1; extra == "sheets"
52
52
  Requires-Dist: gspread>=5.12.0; extra == "sheets"
53
+ Provides-Extra: s3
54
+ Requires-Dist: minio==7.2.15; extra == "s3"
53
55
  Provides-Extra: all
54
56
  Requires-Dist: tol-sdk[api-base]; extra == "all"
55
57
  Requires-Dist: tol-sdk[benchling]; extra == "all"
@@ -341,6 +341,7 @@ src/tol/validators/regex_by_value.py
341
341
  src/tol/validators/specimens_have_same_taxon.py
342
342
  src/tol/validators/sts_fields.py
343
343
  src/tol/validators/tolid.py
344
+ src/tol/validators/types.py
344
345
  src/tol/validators/unique_values.py
345
346
  src/tol/validators/unique_whole_organisms.py
346
347
  src/tol/validators/interfaces/__init__.py
@@ -57,6 +57,9 @@ psycopg2-binary==2.9.9
57
57
  prefect==2.20.18
58
58
  griffe<1.0.0
59
59
 
60
+ [s3]
61
+ minio==7.2.15
62
+
60
63
  [sheets]
61
64
  pandas==2.1.4
62
65
  openpyxl>=3.0.10
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes