tol-sdk 1.8.5__tar.gz → 1.8.6__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 (372) hide show
  1. {tol_sdk-1.8.5/src/tol_sdk.egg-info → tol_sdk-1.8.6}/PKG-INFO +1 -1
  2. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/pyproject.toml +1 -1
  3. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/system.py +18 -0
  4. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/api_datasource.py +33 -12
  5. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/client.py +9 -6
  6. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/factory.py +2 -13
  7. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/requested_fields.py +20 -0
  8. tol_sdk-1.8.6/src/tol/dummy/__init__.py +6 -0
  9. tol_sdk-1.8.6/src/tol/dummy/client.py +88 -0
  10. tol_sdk-1.8.6/src/tol/dummy/converter.py +48 -0
  11. tol_sdk-1.8.6/src/tol/dummy/dummy_datasource.py +105 -0
  12. tol_sdk-1.8.6/src/tol/dummy/factory.py +95 -0
  13. tol_sdk-1.8.6/src/tol/dummy/parser.py +70 -0
  14. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/__init__.py +4 -0
  15. tol_sdk-1.8.6/src/tol/flows/converters/combine_fields_converter.py +45 -0
  16. tol_sdk-1.8.6/src/tol/flows/converters/default_field_value_if_missing_converter.py +43 -0
  17. tol_sdk-1.8.6/src/tol/flows/converters/prefix_field_converter.py +49 -0
  18. tol_sdk-1.8.6/src/tol/sources/dummy.py +17 -0
  19. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/blueprint.py +12 -5
  20. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sql_datasource.py +1 -20
  21. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/standard/factory.py +2 -0
  22. {tol_sdk-1.8.5 → tol_sdk-1.8.6/src/tol_sdk.egg-info}/PKG-INFO +1 -1
  23. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/SOURCES.txt +10 -0
  24. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/LICENSE +0 -0
  25. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/MANIFEST.in +0 -0
  26. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/README.md +0 -0
  27. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/setup.cfg +0 -0
  28. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/certs/cacert.pem +0 -0
  29. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/__init__.py +0 -0
  30. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/__init__.py +0 -0
  31. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/action.py +0 -0
  32. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/upsert_action.py +0 -0
  33. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/__init__.py +0 -0
  34. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/action.py +0 -0
  35. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/__init__.py +0 -0
  36. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/__init__.py +0 -0
  37. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/auth.py +0 -0
  38. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/authorisation.py +0 -0
  39. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/asserts.py +0 -0
  40. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/blueprint.py +0 -0
  41. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/composite.py +0 -0
  42. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/config.py +0 -0
  43. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/error.py +0 -0
  44. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/blueprint.py +0 -0
  45. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/controller.py +0 -0
  46. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/data_upload.py +0 -0
  47. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/__init__.py +0 -0
  48. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/aggregation_body.py +0 -0
  49. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
  50. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/auth_context.py +0 -0
  51. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/authenticate.py +0 -0
  52. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/data_body.py +0 -0
  53. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/filter_utils.py +0 -0
  54. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/list_get_parameters.py +0 -0
  55. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/relation_url.py +0 -0
  56. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/stats_parameters.py +0 -0
  57. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/pipeline_steps.py +0 -0
  58. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/__init__.py +0 -0
  59. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/converter.py +0 -0
  60. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/exception.py +0 -0
  61. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/filter.py +0 -0
  62. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/parser.py +0 -0
  63. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/validate.py +0 -0
  64. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/view.py +0 -0
  65. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/barcodes/__init__.py +0 -0
  66. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/barcodes/main.py +0 -0
  67. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/__init__.py +0 -0
  68. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_converter.py +0 -0
  69. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_datasource.py +0 -0
  70. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
  71. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/__init__.py +0 -0
  72. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_containers_dna.sql +0 -0
  73. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
  74. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
  75. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
  76. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
  77. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
  78. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
  79. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
  80. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
  81. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
  82. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
  83. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
  84. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sample.sql +0 -0
  85. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
  86. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
  87. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
  88. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
  89. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/tissue_prep.sql +0 -0
  90. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/board/__init__.py +0 -0
  91. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/board/blueprint.py +0 -0
  92. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/__init__.py +0 -0
  93. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/bold_datasource.py +0 -0
  94. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/client.py +0 -0
  95. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/converter.py +0 -0
  96. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/factory.py +0 -0
  97. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/parser.py +0 -0
  98. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/cli/__init__.py +0 -0
  99. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/cli/cli.py +0 -0
  100. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/__init__.py +0 -0
  101. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/__init__.py +0 -0
  102. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/model.py +0 -0
  103. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/yaml_converter.py +0 -0
  104. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/__init__.py +0 -0
  105. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/client.py +0 -0
  106. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/converter.py +0 -0
  107. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/copo_datasource.py +0 -0
  108. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/factory.py +0 -0
  109. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/parser.py +0 -0
  110. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/__init__.py +0 -0
  111. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/attribute_metadata.py +0 -0
  112. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/core_converter.py +0 -0
  113. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_loader.py +0 -0
  114. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_object.py +0 -0
  115. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_object_converter.py +0 -0
  116. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_source_attribute_metadata.py +0 -0
  117. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_source_dict.py +0 -0
  118. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource.py +0 -0
  119. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_error.py +0 -0
  120. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_filter.py +0 -0
  121. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_utils.py +0 -0
  122. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/factory.py +0 -0
  123. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/http_client.py +0 -0
  124. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/__init__.py +0 -0
  125. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/_filterable.py +0 -0
  126. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/_writer.py +0 -0
  127. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/aggregator.py +0 -0
  128. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/counter.py +0 -0
  129. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/cursor.py +0 -0
  130. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/declare.py +0 -0
  131. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/deleter.py +0 -0
  132. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/detail_getter.py +0 -0
  133. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/enricher.py +0 -0
  134. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/enum.py +0 -0
  135. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/group_statter.py +0 -0
  136. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/inserter.py +0 -0
  137. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/list_getter.py +0 -0
  138. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/operator_config.py +0 -0
  139. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/page_getter.py +0 -0
  140. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/relational.py +0 -0
  141. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/statter.py +0 -0
  142. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/summariser.py +0 -0
  143. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/updater.py +0 -0
  144. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/upserter.py +0 -0
  145. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/relationship.py +0 -0
  146. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/session.py +0 -0
  147. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/validate.py +0 -0
  148. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/__init__.py +0 -0
  149. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/elastic_datasource.py +0 -0
  150. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/runtime_fields.py +0 -0
  151. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/__init__.py +0 -0
  152. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/auth.py +0 -0
  153. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/eln_datasource.py +0 -0
  154. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/entities.py +0 -0
  155. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/generators.py +0 -0
  156. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/sanitise.py +0 -0
  157. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/__init__.py +0 -0
  158. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/client.py +0 -0
  159. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/converter.py +0 -0
  160. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/ena_datasource.py +0 -0
  161. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/ena_methods.py +0 -0
  162. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/factory.py +0 -0
  163. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/filter.py +0 -0
  164. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/parser.py +0 -0
  165. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/__init__.py +0 -0
  166. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/excel.py +0 -0
  167. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/excel_datasource.py +0 -0
  168. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/s3_factory.py +0 -0
  169. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/__init__.py +0 -0
  170. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/auto_detect_manifest_type_converter.py +0 -0
  171. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
  172. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
  173. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
  174. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
  175. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
  176. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  177. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
  178. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
  179. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
  180. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
  181. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
  182. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
  183. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
  184. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
  185. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
  186. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
  187. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
  188. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
  189. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
  190. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
  191. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
  192. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
  193. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
  194. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
  195. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
  196. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
  197. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
  198. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
  199. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
  200. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
  201. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
  202. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
  203. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
  204. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
  205. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
  206. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
  207. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
  208. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
  209. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
  210. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
  211. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
  212. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
  213. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
  214. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
  215. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
  216. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
  217. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
  218. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/time_string_to_time.py +0 -0
  219. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
  220. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
  221. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
  222. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
  223. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
  224. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
  225. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/logger.py +0 -0
  226. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/secrets.py +0 -0
  227. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/sequencing_submissions.py +0 -0
  228. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/gap/__init__.py +0 -0
  229. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/gap/gap_datasource.py +0 -0
  230. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/__init__.py +0 -0
  231. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/client.py +0 -0
  232. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/converter.py +0 -0
  233. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/factory.py +0 -0
  234. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/filter.py +0 -0
  235. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/goat_datasource.py +0 -0
  236. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/parser.py +0 -0
  237. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/google_sheets/__init__.py +0 -0
  238. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
  239. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/irods/__init__.py +0 -0
  240. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/irods/irods_datasource.py +0 -0
  241. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/__init__.py +0 -0
  242. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/client.py +0 -0
  243. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/converter.py +0 -0
  244. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/factory.py +0 -0
  245. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/filter.py +0 -0
  246. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/jira_datasource.py +0 -0
  247. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/mapper.py +0 -0
  248. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/parser.py +0 -0
  249. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/sort.py +0 -0
  250. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/__init__.py +0 -0
  251. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/json_datasource.py +0 -0
  252. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/s3_json_datasource.py +0 -0
  253. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/__init__.py +0 -0
  254. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/client.py +0 -0
  255. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/converter.py +0 -0
  256. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/factory.py +0 -0
  257. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/labwhere_datasource.py +0 -0
  258. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/parser.py +0 -0
  259. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/markdown.py +0 -0
  260. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/mlwh/__init__.py +0 -0
  261. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/mlwh/mlwh_datasource.py +0 -0
  262. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/__init__.py +0 -0
  263. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/converter.py +0 -0
  264. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/factory.py +0 -0
  265. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/filter.py +0 -0
  266. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/prefect_datasource.py +0 -0
  267. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/prefect_object.py +0 -0
  268. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/__init__.py +0 -0
  269. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/converter.py +0 -0
  270. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/factory.py +0 -0
  271. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/parser.py +0 -0
  272. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/s3_datasource.py +0 -0
  273. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/__init__.py +0 -0
  274. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/configuration.py +0 -0
  275. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/consumer.py +0 -0
  276. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/message_builder.py +0 -0
  277. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/messages.py +0 -0
  278. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/response_processors.py +0 -0
  279. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/sequencing_datasource.py +0 -0
  280. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/services/__init__.py +0 -0
  281. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/services/s3_client.py +0 -0
  282. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/__init__.py +0 -0
  283. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/benchling.py +0 -0
  284. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/benchling_warehouse.py +0 -0
  285. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan.py +0 -0
  286. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_extra.py +0 -0
  287. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_image.py +0 -0
  288. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_qc.py +0 -0
  289. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bold.py +0 -0
  290. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/copo.py +0 -0
  291. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/defaults.py +0 -0
  292. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/elastic.py +0 -0
  293. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/ena.py +0 -0
  294. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/gap.py +0 -0
  295. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/genome_notes.py +0 -0
  296. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/goat.py +0 -0
  297. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/grit.py +0 -0
  298. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/informatics.py +0 -0
  299. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/labwhere.py +0 -0
  300. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/mlwh.py +0 -0
  301. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portal.py +0 -0
  302. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portal_attributes.py +0 -0
  303. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portaldb.py +0 -0
  304. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/prefect.py +0 -0
  305. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sciops.py +0 -0
  306. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sts.py +0 -0
  307. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sts_legacy.py +0 -0
  308. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolid.py +0 -0
  309. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolqc.py +0 -0
  310. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolqc_legacy.py +0 -0
  311. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/treeofsex.py +0 -0
  312. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/uksi_qc.py.py +0 -0
  313. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/workflows.py +0 -0
  314. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/__init__.py +0 -0
  315. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/action/__init__.py +0 -0
  316. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/action/factory.py +0 -0
  317. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/__init__.py +0 -0
  318. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/models.py +0 -0
  319. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/cast.py +0 -0
  320. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/database.py +0 -0
  321. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/ds_session.py +0 -0
  322. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/exception.py +0 -0
  323. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/ext.py +0 -0
  324. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/factory.py +0 -0
  325. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/filter.py +0 -0
  326. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/model.py +0 -0
  327. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/pipeline_step/__init__.py +0 -0
  328. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/pipeline_step/factory.py +0 -0
  329. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/relationship.py +0 -0
  330. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/session.py +0 -0
  331. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sort.py +0 -0
  332. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sql_converter.py +0 -0
  333. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/standard/__init__.py +0 -0
  334. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/status/__init__.py +0 -0
  335. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/status/status_datasource.py +0 -0
  336. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/__init__.py +0 -0
  337. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts.py +0 -0
  338. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts_datasource.py +0 -0
  339. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts_requests.py +0 -0
  340. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/treeval/__init__.py +0 -0
  341. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/treeval/treeval_datasource.py +0 -0
  342. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/__init__.py +0 -0
  343. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/csv.py +0 -0
  344. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/s3.py +0 -0
  345. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/__init__.py +0 -0
  346. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_keys.py +0 -0
  347. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_values.py +0 -0
  348. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_values_from_datasource.py +0 -0
  349. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/assert_on_condition.py +0 -0
  350. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/branching.py +0 -0
  351. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/converter_and_validate.py +0 -0
  352. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/date_sorting.py +0 -0
  353. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/ena_checklist.py +0 -0
  354. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/ena_submittable.py +0 -0
  355. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/interfaces/__init__.py +0 -0
  356. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
  357. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/min_one_valid_value.py +0 -0
  358. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/mutually_exclusive.py +0 -0
  359. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/regex.py +0 -0
  360. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/regex_by_value.py +0 -0
  361. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/specimens_have_same_taxon.py +0 -0
  362. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/sts_fields.py +0 -0
  363. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/tolid.py +0 -0
  364. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/types.py +0 -0
  365. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_value_check.py +0 -0
  366. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_values.py +0 -0
  367. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_whole_organisms.py +0 -0
  368. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/value_check.py +0 -0
  369. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
  370. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/entry_points.txt +0 -0
  371. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/requires.txt +0 -0
  372. {tol_sdk-1.8.5 → tol_sdk-1.8.6}/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.5
3
+ Version: 1.8.6
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.5"
11
+ version = "1.8.6"
12
12
  description = "SDK for interaction with ToL, Sanger and external services"
13
13
  readme = "README.md"
14
14
  authors = [
@@ -2,6 +2,8 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
+ import glob
6
+
5
7
  from flask import Blueprint
6
8
 
7
9
 
@@ -16,6 +18,7 @@ def system_blueprint(
16
18
  By default includes:
17
19
  - /healthz - used for health probes in kubernetes
18
20
  - /environment - indicates the deployment environment
21
+ - /package-versions - indicates the deployment package versions
19
22
 
20
23
  Parameters:
21
24
  - url_prefix - the prefix under which to serve this blueprint's
@@ -40,4 +43,19 @@ def system_blueprint(
40
43
  k: env_vars.get(v) for k, v in env_map.items()
41
44
  }, 200
42
45
 
46
+ @system_blueprint.route('/package-versions')
47
+ def package_versions():
48
+ glob_paths = glob.glob('./**/requirements.txt', recursive=True)
49
+ with open(glob_paths[0], 'r') as f:
50
+ requirements = f.readlines()
51
+ for requirement in requirements:
52
+ if 'tol-sdk' in requirement:
53
+ tol_sdk_version = requirement.split('==')[1].strip()
54
+ break
55
+ f.close()
56
+
57
+ result = {'tol_sdk': tol_sdk_version}
58
+
59
+ return result, 200
60
+
43
61
  return system_blueprint
@@ -35,6 +35,7 @@ from ..core.operator import (
35
35
  Upserter,
36
36
  )
37
37
  from ..core.relationship import RelationshipConfig
38
+ from ..core.requested_fields import ReqFieldsTree, requested_fields_to_tree
38
39
 
39
40
  if typing.TYPE_CHECKING:
40
41
  from ..core.session import OperableSession
@@ -140,24 +141,38 @@ class ApiDataSource(
140
141
  object_ids: Iterable[str],
141
142
  session: Optional[OperableSession] = None,
142
143
  requested_fields: list[str] | None = None,
144
+ requested_tree: ReqFieldsTree | None = None,
143
145
  ) -> Iterable[Optional[DataObject]]:
144
146
 
145
147
  client = self.__client_factory()
148
+ # This would be better handled in the decorator but there is a slight
149
+ # difference in handling here with the requested_tree when requested_fields is None
150
+ requested_tree = (
151
+ ReqFieldsTree(
152
+ object_type,
153
+ self,
154
+ requested_fields=requested_fields,
155
+ )
156
+ if object_type
157
+ else None
158
+ )
159
+
146
160
  json_responses = (
147
161
  client.get_detail(
148
162
  object_type,
149
163
  id_,
150
- requested_fields=requested_fields,
164
+ requested_tree=requested_tree,
151
165
  )
152
166
  for id_ in object_ids
153
167
  )
154
- json_converter = self.__jc_factory(object_type, requested_fields)
168
+ json_converter = self.__jc_factory(object_type, requested_tree)
155
169
  return (
156
170
  json_converter.convert(r)
157
171
  if r is not None else None
158
172
  for r in json_responses
159
173
  )
160
174
 
175
+ @requested_fields_to_tree
161
176
  @validate('listGet')
162
177
  def get_list_page(
163
178
  self,
@@ -168,6 +183,7 @@ class ApiDataSource(
168
183
  sort_by: Optional[str] = None,
169
184
  session: Optional[OperableSession] = None,
170
185
  requested_fields: list[str] | None = None,
186
+ requested_tree: ReqFieldsTree | None = None,
171
187
  ) -> tuple[Iterable[DataObject], int]:
172
188
 
173
189
  filter_string = self.__get_filter_string(object_filters)
@@ -177,28 +193,31 @@ class ApiDataSource(
177
193
  page_size,
178
194
  filter_string=filter_string,
179
195
  sort_string=sort_by,
180
- requested_fields=requested_fields,
196
+ requested_tree=requested_tree,
181
197
  )
182
- return self.__jc_factory(object_type, requested_fields).convert_list(transfer)
183
198
 
199
+ return self.__jc_factory(object_type, requested_tree).convert_list(transfer)
200
+
201
+ @requested_fields_to_tree
184
202
  def get_list(
185
203
  self,
186
204
  object_type: str,
187
205
  object_filters: Optional[DataSourceFilter] = None,
188
206
  session: Optional[OperableSession] = None,
189
207
  requested_fields: list[str] | None = None,
208
+ requested_tree: ReqFieldsTree | None = None,
190
209
  ) -> Iterable[DataObject]:
191
210
  if self.__can_cursor(object_type, object_filters):
192
211
  return self._get_list_by_cursor(
193
212
  object_type,
194
213
  object_filters,
195
- requested_fields=requested_fields,
214
+ requested_tree=requested_tree,
196
215
  )
197
216
  else:
198
217
  return self.__get_list_regular(
199
218
  object_type,
200
219
  object_filters,
201
- requested_fields=requested_fields,
220
+ requested_tree=requested_tree,
202
221
  )
203
222
 
204
223
  @validate('count')
@@ -263,7 +282,7 @@ class ApiDataSource(
263
282
  object_filters: Optional[DataSourceFilter] = None,
264
283
  search_after: list[str] | None = None,
265
284
  session: Optional[OperableSession] = None,
266
- requested_fields: list[str] | None = None
285
+ requested_tree: ReqFieldsTree | None = None,
267
286
  ) -> tuple[Iterable[DataObject], list[str] | None]:
268
287
 
269
288
  filter_string = self.__get_filter_string(object_filters)
@@ -272,9 +291,10 @@ class ApiDataSource(
272
291
  page_size,
273
292
  search_after,
274
293
  filter_string=filter_string,
275
- requested_fields=requested_fields,
294
+ requested_tree=requested_tree,
276
295
  )
277
- return self.__jc_factory(object_type, requested_fields).convert_cursor_page(transfer)
296
+
297
+ return self.__jc_factory(object_type, requested_tree).convert_cursor_page(transfer)
278
298
 
279
299
  @validate('delete')
280
300
  def delete(
@@ -436,13 +456,14 @@ class ApiDataSource(
436
456
  self,
437
457
  object_type: str,
438
458
  object_filters: Optional[DataSourceFilter],
439
- requested_fields: list[str] | None = None,
459
+ requested_tree: ReqFieldsTree | None = None,
440
460
  ) -> Iterable[DataObject]:
441
461
 
442
462
  page = 1
443
463
  page_size = self.get_page_size()
444
464
  client = self.__client_factory()
445
- jc_converter = self.__jc_factory(object_type, requested_fields)
465
+
466
+ jc_converter = self.__jc_factory(object_type, requested_tree)
446
467
  filter_string = self.__get_filter_string(object_filters)
447
468
 
448
469
  while True:
@@ -451,7 +472,7 @@ class ApiDataSource(
451
472
  page,
452
473
  page_size,
453
474
  filter_string=filter_string,
454
- requested_fields=requested_fields,
475
+ requested_tree=requested_tree,
455
476
  )
456
477
  (results_page, _) = jc_converter.convert_list(transfer)
457
478
 
@@ -11,6 +11,7 @@ from .converter import JsonApiTransfer, JsonRelationshipConfig
11
11
  from ..core import HttpClient
12
12
  from ..core.datasource_error import DataSourceError
13
13
  from ..core.operator import OperatorDict
14
+ from ..core.requested_fields import ReqFieldsTree
14
15
 
15
16
 
16
17
  class JsonApiClient(HttpClient):
@@ -43,7 +44,7 @@ class JsonApiClient(HttpClient):
43
44
  self,
44
45
  object_type: str,
45
46
  object_id: str,
46
- requested_fields: list[str] | None = None,
47
+ requested_tree: ReqFieldsTree | None = None,
47
48
  ) -> Optional[JsonApiTransfer]:
48
49
  """
49
50
  Gets a single JSON:API transfer for the object of specified
@@ -56,7 +57,7 @@ class JsonApiClient(HttpClient):
56
57
  return self.__fetch_detail(
57
58
  url,
58
59
  params={
59
- 'requested_fields': requested_fields,
60
+ 'requested_fields': requested_tree.to_paths() if requested_tree else None,
60
61
  },
61
62
  headers=headers,
62
63
  )
@@ -68,7 +69,7 @@ class JsonApiClient(HttpClient):
68
69
  page_size: int,
69
70
  filter_string: Optional[str] = None,
70
71
  sort_string: Optional[str] = None,
71
- requested_fields: list[str] | None = None,
72
+ requested_tree: ReqFieldsTree | None = None,
72
73
  ) -> JsonApiTransfer:
73
74
  """
74
75
  Gets a (paged) list-JSON:API transfer for the objects of specified
@@ -81,7 +82,7 @@ class JsonApiClient(HttpClient):
81
82
  page_size=page_size,
82
83
  filter=filter_string,
83
84
  sort_by=sort_string,
84
- requested_fields=requested_fields
85
+ requested_fields=requested_tree.to_paths() if requested_tree else None,
85
86
  )
86
87
  headers = self._merge_headers()
87
88
  return self.__fetch_list(
@@ -157,7 +158,7 @@ class JsonApiClient(HttpClient):
157
158
  page_size: int,
158
159
  search_after: list[str] | None,
159
160
  filter_string: Optional[str] = None,
160
- requested_fields: list[str] | None = None,
161
+ requested_tree: ReqFieldsTree | None = None,
161
162
  ) -> JsonApiTransfer:
162
163
  """Cursor-pagination."""
163
164
 
@@ -165,7 +166,7 @@ class JsonApiClient(HttpClient):
165
166
  params = self.__no_none_value_dict(
166
167
  filter=filter_string,
167
168
  page_size=page_size,
168
- requested_fields=requested_fields,
169
+ requested_fields=requested_tree.to_paths() if requested_tree else None,
169
170
  )
170
171
  headers = self._merge_headers()
171
172
  body = {'search_after': search_after}
@@ -462,5 +463,7 @@ class JsonApiClient(HttpClient):
462
463
  for k, v in kwargs.items():
463
464
  if v is None:
464
465
  continue
466
+ if isinstance(v, list) and not v:
467
+ continue
465
468
  str_params[k] = ','.join([str(x) for x in v]) if isinstance(v, list) else str(v)
466
469
  return str_params
@@ -59,23 +59,12 @@ class _ConverterFactory:
59
59
  def json_converter_factory(
60
60
  self,
61
61
  object_type: str | None = None,
62
- requested_fields: list[str] | None = None,
62
+ requested_tree: ReqFieldsTree | None = None,
63
63
  ) -> JsonConverterFactory:
64
64
  """
65
65
  Returns an instantiated `JsonApiConverter`.
66
66
  """
67
-
68
- req_fields_tree = (
69
- ReqFieldsTree(
70
- object_type,
71
- self.__data_source,
72
- requested_fields=requested_fields,
73
- )
74
- if object_type
75
- else None
76
- )
77
-
78
- parser = DefaultParser(self.__ds_dict, req_fields_tree)
67
+ parser = DefaultParser(self.__ds_dict, requested_tree)
79
68
  return JsonApiConverter(parser)
80
69
 
81
70
  @property
@@ -11,6 +11,26 @@ from .operator import Relational
11
11
  from .relationship import RelationshipConfig
12
12
 
13
13
 
14
+ def requested_fields_to_tree(func):
15
+ """
16
+ Allows `requested_fields` keyword arguments to be supplied to methods if a
17
+ `requested_tree` object has not been given.
18
+ """
19
+
20
+ def wrapper(self, tablename, *args, **kwargs):
21
+ if 'requested_fields' in kwargs:
22
+ if 'requested_tree' in kwargs:
23
+ msg = 'Both requested_fields and requested_tree arguments given'
24
+ raise TypeError(msg)
25
+ flds = kwargs.pop('requested_fields')
26
+ kwargs['requested_tree'] = ReqFieldsTree(
27
+ tablename, self, requested_fields=flds
28
+ )
29
+ return func(self, tablename, *args, **kwargs)
30
+
31
+ return wrapper
32
+
33
+
14
34
  class ReqFieldsTree:
15
35
  """
16
36
  Acts as a template for which related objects and attributes to fetch from
@@ -0,0 +1,6 @@
1
+ # SPDX-FileCopyrightText: 2026 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from .dummy_datasource import DummyDataSource # noqa
6
+ from .factory import create_dummy_datasource # noqa
@@ -0,0 +1,88 @@
1
+ # SPDX-FileCopyrightText: 2024 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ import string
6
+ from typing import Iterable, Optional
7
+
8
+ from .converter import DummyTransfer
9
+ from ..core import HttpClient
10
+
11
+
12
+ class DummyClient(HttpClient):
13
+ """
14
+ Simulates dummy objects retrieval from a remote API.
15
+ """
16
+
17
+ def __init__(
18
+ self,
19
+ ) -> None:
20
+ super().__init__()
21
+
22
+ def get_detail(
23
+ self,
24
+ object_type: str,
25
+ object_ids: Iterable[str]
26
+ ) -> Optional[DummyTransfer]:
27
+ """
28
+ Gets a list of Dummy transfers for the objects of specified
29
+ `object_type` and `object_id`, or returns None if not found.
30
+ """
31
+ return self.__get_detail_data(object_type, object_ids)
32
+
33
+ def get_list(
34
+ self,
35
+ object_type: str
36
+ ) -> Optional[DummyTransfer]:
37
+ return self.__get_detail_data(object_type, range(10000))
38
+
39
+ def __get_detail_data(
40
+ self,
41
+ object_type: str,
42
+ object_ids: Iterable[str]
43
+ ) -> Optional[DummyTransfer]:
44
+ if object_type == 'category':
45
+ return self.__get_detail_category(object_type, object_ids)
46
+ return self.__get_detail_record(object_type, object_ids)
47
+
48
+ def __get_detail_record(
49
+ self,
50
+ object_type: str,
51
+ object_ids: Iterable[str]
52
+ ) -> Optional[DummyTransfer]:
53
+ """
54
+ Gets a list of dummy objects
55
+ """
56
+ ret = []
57
+ for object_id in object_ids:
58
+ if object_id < 10000:
59
+ ret.append({
60
+ 'id': object_id,
61
+ 'little_string': ['a', 'b', 'c'][int(object_id) % 3],
62
+ 'big_string': string.ascii_letters[int(object_id) % 52],
63
+ 'int': object_id,
64
+ 'bool': int(object_id) % 2 == 0,
65
+ 'date': f'2024-01-{(int(object_id) % 28) + 1:02d}',
66
+ 'type': object_type,
67
+ 'category': ['cat1', 'cat2', 'cat3', 'cat4'][int(object_id) % 4],
68
+ })
69
+ else:
70
+ ret.append(None)
71
+ return ret
72
+
73
+ def __get_detail_category(
74
+ self,
75
+ object_type: str,
76
+ object_ids: Iterable[str]
77
+ ) -> Optional[DummyTransfer]:
78
+ """
79
+ Gets a list of dummy objects
80
+ """
81
+ ret = []
82
+ for object_id in object_ids:
83
+ ret.append({
84
+ 'id': object_id,
85
+ 'name': object_id.upper(),
86
+ 'type': object_type
87
+ })
88
+ return ret
@@ -0,0 +1,48 @@
1
+ # SPDX-FileCopyrightText: 2024 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from typing import Any, List, Optional
6
+
7
+ from .parser import Parser
8
+ from ..core import DataObject
9
+
10
+
11
+ DummyObject = dict[str, Any]
12
+ DummyTransfer = List[DummyObject]
13
+
14
+
15
+ class DummyConverter():
16
+
17
+ """
18
+ Converts from Dummy transfers to instances of
19
+ `DataObject`.
20
+ """
21
+
22
+ def __init__(
23
+ self,
24
+ parser: Parser
25
+ ) -> None:
26
+
27
+ self.__parser = parser
28
+
29
+ def convert(self, input_: DummyTransfer) -> DataObject:
30
+ """
31
+ Converts a DummyTransfer containing a detail (single) result
32
+ """
33
+ return self.__parser.parse(input_)
34
+
35
+ def convert_list(
36
+ self,
37
+ input_: DummyTransfer
38
+ ) -> tuple[list[DataObject], Optional[int]]:
39
+ """
40
+ Converts a DummyTransfer containing a list of results. Also
41
+ returns a count of the total results meeting.
42
+ """
43
+
44
+ return [
45
+ self.__parser.parse(json_obj)
46
+ for json_obj in input_
47
+ if json_obj is not None
48
+ ], None
@@ -0,0 +1,105 @@
1
+ # SPDX-FileCopyrightText: 2026 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from __future__ import annotations
6
+
7
+ import typing
8
+ from functools import cache
9
+ from typing import Callable, Iterable, Optional
10
+
11
+ from .client import DummyClient
12
+ from .converter import (
13
+ DummyConverter
14
+ )
15
+ from ..core import DataObject, DataSource, DataSourceError, DataSourceFilter
16
+ from ..core.operator import (
17
+ DetailGetter,
18
+ ListGetter
19
+ )
20
+
21
+ if typing.TYPE_CHECKING:
22
+ from ..core.session import OperableSession
23
+
24
+ ClientFactory = Callable[[], DummyClient]
25
+ DummyConverterFactory = Callable[[], DummyConverter]
26
+
27
+
28
+ class DummyDataSource(
29
+ DataSource,
30
+
31
+ # the supported operators
32
+ DetailGetter,
33
+ ListGetter
34
+ ):
35
+ """
36
+ A `DataSource` that outputs dummy data.
37
+
38
+ Developers should likely use `create_dummy_datasource`
39
+ instead of this directly.
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ client_factory: ClientFactory,
45
+ dummy_converter_factory: DummyConverterFactory
46
+ ) -> None:
47
+
48
+ self.__client_factory = client_factory
49
+ self.__dummy_converter_factory = dummy_converter_factory
50
+ super().__init__({})
51
+
52
+ @property
53
+ @cache
54
+ def attribute_types(self) -> dict[str, dict[str, str]]:
55
+ return {
56
+ 'record': {
57
+ 'big_string': 'str',
58
+ 'little_string': 'str',
59
+ 'bool': 'bool',
60
+ 'date': 'datetime',
61
+ 'int': 'int',
62
+ 'list': 'list[str]'
63
+ },
64
+ 'category': {
65
+ 'name': 'str'
66
+ }
67
+ }
68
+
69
+ @property
70
+ @cache
71
+ def supported_types(self) -> list[str]:
72
+ return list(
73
+ self.attribute_types.keys()
74
+ )
75
+
76
+ def get_by_id(
77
+ self,
78
+ object_type: str,
79
+ object_ids: Iterable[str],
80
+ **kwargs
81
+ ) -> Iterable[Optional[DataObject]]:
82
+ if object_type not in self.supported_types:
83
+ raise DataSourceError(f'{object_type} is not supported')
84
+
85
+ client = self.__client_factory()
86
+ dummy_response = client.get_detail(object_type, object_ids)
87
+ dummy_converter = self.__dummy_converter_factory()
88
+
89
+ converted_objects, _ = dummy_converter.convert_list(dummy_response) \
90
+ if dummy_response is not None else ([], 0)
91
+ yield from self.sort_by_id(converted_objects, object_ids)
92
+
93
+ def get_list(
94
+ self,
95
+ object_type: str,
96
+ object_filters: Optional[DataSourceFilter] = None,
97
+ session: Optional[OperableSession] = None
98
+ ) -> Iterable[DataObject]:
99
+ if object_filters:
100
+ raise DataSourceError('Filtering is not supported')
101
+ objects = self.__client_factory().get_list(
102
+ object_type
103
+ )
104
+ converted_objects, _ = self.__dummy_converter_factory().convert_list(objects)
105
+ return iter(converted_objects)
@@ -0,0 +1,95 @@
1
+ # SPDX-FileCopyrightText: 2024 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from collections.abc import Mapping
6
+ from typing import Callable, Iterator, Optional
7
+
8
+ from .client import DummyClient
9
+ from .converter import (
10
+ DummyConverter
11
+ )
12
+ from .dummy_datasource import (
13
+ DummyConverterFactory,
14
+ DummyDataSource
15
+ )
16
+ from .parser import DefaultParser
17
+ from ..core import DataSource
18
+
19
+
20
+ class _DummyDSDict(Mapping):
21
+ def __init__(self, api_ds: DummyDataSource) -> None:
22
+ self.__ds = api_ds
23
+
24
+ def __getitem__(self, __k: str) -> DummyDataSource:
25
+ if __k not in self.__ds.supported_types:
26
+ raise KeyError()
27
+ return self.__ds
28
+
29
+ def __iter__(self) -> Iterator[str]:
30
+ return iter(self.__ds.supported_types)
31
+
32
+ def __len__(self) -> int:
33
+ return len(self.__ds.supported_types)
34
+
35
+
36
+ class _ConverterFactory:
37
+ """
38
+ Manges the instantation of:
39
+
40
+ - `DummyConverter`
41
+ """
42
+
43
+ def __init__(self) -> None:
44
+ self.__data_source: Optional[DataSource] = None
45
+
46
+ @property
47
+ def data_source(self) -> Optional[DataSource]:
48
+ return self.__data_source
49
+
50
+ @data_source.setter
51
+ def data_source(
52
+ self,
53
+ ds: DataSource
54
+ ) -> None:
55
+
56
+ self.__data_source = ds
57
+
58
+ def dummy_converter_factory(self) -> DummyConverterFactory:
59
+ """
60
+ Returns an instantiated `DummyConverter`.
61
+ """
62
+
63
+ parser = DefaultParser(self.__ds_dict)
64
+ return DummyConverter(parser)
65
+
66
+ @property
67
+ def __ds_dict(self) -> dict[str, DataSource]:
68
+ return _DummyDSDict(self.data_source)
69
+
70
+
71
+ def _get_client_factory() -> Callable[[], DummyClient]:
72
+ """
73
+ A resonable default for creating
74
+ a `DummyClient` instance
75
+ """
76
+
77
+ return lambda: DummyClient()
78
+
79
+
80
+ def create_dummy_datasource() -> DummyDataSource:
81
+ """
82
+ Instantiates `DummyDataSource`
83
+ """
84
+
85
+ client_factory = _get_client_factory()
86
+ manager = _ConverterFactory()
87
+
88
+ dummy_ds = DummyDataSource(
89
+ client_factory,
90
+ manager.dummy_converter_factory
91
+ )
92
+
93
+ manager.data_source = dummy_ds
94
+
95
+ return dummy_ds