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.
- {tol_sdk-1.8.5/src/tol_sdk.egg-info → tol_sdk-1.8.6}/PKG-INFO +1 -1
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/pyproject.toml +1 -1
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/system.py +18 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/api_datasource.py +33 -12
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/client.py +9 -6
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/factory.py +2 -13
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/requested_fields.py +20 -0
- tol_sdk-1.8.6/src/tol/dummy/__init__.py +6 -0
- tol_sdk-1.8.6/src/tol/dummy/client.py +88 -0
- tol_sdk-1.8.6/src/tol/dummy/converter.py +48 -0
- tol_sdk-1.8.6/src/tol/dummy/dummy_datasource.py +105 -0
- tol_sdk-1.8.6/src/tol/dummy/factory.py +95 -0
- tol_sdk-1.8.6/src/tol/dummy/parser.py +70 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/__init__.py +4 -0
- tol_sdk-1.8.6/src/tol/flows/converters/combine_fields_converter.py +45 -0
- tol_sdk-1.8.6/src/tol/flows/converters/default_field_value_if_missing_converter.py +43 -0
- tol_sdk-1.8.6/src/tol/flows/converters/prefix_field_converter.py +49 -0
- tol_sdk-1.8.6/src/tol/sources/dummy.py +17 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/blueprint.py +12 -5
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sql_datasource.py +1 -20
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/standard/factory.py +2 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6/src/tol_sdk.egg-info}/PKG-INFO +1 -1
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/SOURCES.txt +10 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/LICENSE +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/MANIFEST.in +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/README.md +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/setup.cfg +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/certs/cacert.pem +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/action.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/actions/upsert_action.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/action.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/auth.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/abc/authorisation.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/asserts.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/blueprint.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/composite.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/config.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/auth/error.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/blueprint.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/controller.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/data_upload.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/aggregation_body.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/auth_context.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/authenticate.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/data_body.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/filter_utils.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/list_get_parameters.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/relation_url.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/misc/stats_parameters.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_base/pipeline_steps.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/exception.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/validate.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/api_client/view.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/barcodes/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/barcodes/main.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_containers_dna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sample.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/benchling/sql/tissue_prep.sql +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/board/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/board/blueprint.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/bold_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/bold/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/cli/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/cli/cli.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/model.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/converter/yaml/yaml_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/copo_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/copo/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/attribute_metadata.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/core_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_loader.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_object.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_object_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_source_attribute_metadata.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/data_source_dict.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_error.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/datasource_utils.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/http_client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/_filterable.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/_writer.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/aggregator.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/counter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/cursor.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/declare.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/deleter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/detail_getter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/enricher.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/enum.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/group_statter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/inserter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/list_getter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/operator_config.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/page_getter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/relational.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/statter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/summariser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/updater.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/operator/upserter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/relationship.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/session.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/core/validate.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/elastic_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/elastic/runtime_fields.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/auth.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/eln_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/entities.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/generators.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/eln/sanitise.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/ena_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/ena_methods.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/ena/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/excel.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/excel_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/excel/s3_factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/auto_detect_manifest_type_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
- {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
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
- {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
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
- {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
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
- {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
- {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
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/time_string_to_time.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/logger.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/secrets.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/flows/sequencing_submissions.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/gap/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/gap/gap_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/goat_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/goat/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/google_sheets/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/irods/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/irods/irods_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/jira_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/mapper.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/jira/sort.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/json_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/json/s3_json_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/labwhere_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/labwhere/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/markdown.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/mlwh/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/mlwh/mlwh_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/prefect_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/prefect/prefect_object.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/parser.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/s3/s3_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/configuration.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/consumer.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/message_builder.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/messages.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/response_processors.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sciops/sequencing_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/services/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/services/s3_client.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/benchling.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/benchling_warehouse.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_extra.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_image.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bioscan_qc.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/bold.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/copo.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/defaults.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/elastic.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/ena.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/gap.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/genome_notes.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/goat.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/grit.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/informatics.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/labwhere.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/mlwh.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portal.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portal_attributes.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/portaldb.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/prefect.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sciops.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sts.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/sts_legacy.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolid.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolqc.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/tolqc_legacy.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/treeofsex.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/uksi_qc.py.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sources/workflows.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/action/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/action/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/auth/models.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/cast.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/database.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/ds_session.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/exception.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/ext.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/filter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/model.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/pipeline_step/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/pipeline_step/factory.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/relationship.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/session.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sort.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/sql_converter.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sql/standard/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/status/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/status/status_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/sts/sts_requests.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/treeval/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/treeval/treeval_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/csv.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/utils/s3.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_keys.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_values.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/allowed_values_from_datasource.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/assert_on_condition.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/branching.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/converter_and_validate.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/date_sorting.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/ena_checklist.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/ena_submittable.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/interfaces/__init__.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/min_one_valid_value.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/mutually_exclusive.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/regex.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/regex_by_value.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/specimens_have_same_taxon.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/sts_fields.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/tolid.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/types.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_value_check.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_values.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/unique_whole_organisms.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol/validators/value_check.py +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/entry_points.txt +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/requires.txt +0 -0
- {tol_sdk-1.8.5 → tol_sdk-1.8.6}/src/tol_sdk.egg-info/top_level.txt +0 -0
|
@@ -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
|
-
|
|
164
|
+
requested_tree=requested_tree,
|
|
151
165
|
)
|
|
152
166
|
for id_ in object_ids
|
|
153
167
|
)
|
|
154
|
-
json_converter = self.__jc_factory(object_type,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
294
|
+
requested_tree=requested_tree,
|
|
276
295
|
)
|
|
277
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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':
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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,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
|