tol-sdk 1.7.3__tar.gz → 1.7.5b0__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.7.3/src/tol_sdk.egg-info → tol_sdk-1.7.5b0}/PKG-INFO +1 -1
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/pyproject.toml +1 -1
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/__init__.py +1 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/blueprint.py +19 -8
- tol_sdk-1.7.5b0/src/tol/api_base/data_upload.py +98 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/pipeline_steps.py +12 -9
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/api_datasource.py +8 -8
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/converter.py +38 -52
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/factory.py +21 -19
- tol_sdk-1.7.5b0/src/tol/api_client/parser.py +251 -0
- tol_sdk-1.7.5b0/src/tol/api_client/view.py +267 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/__init__.py +2 -1
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/data_object.py +27 -9
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/data_object_converter.py +37 -2
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/factory.py +51 -62
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/validate.py +1 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/client.py +60 -10
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/ena_datasource.py +16 -10
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/ena_methods.py +33 -32
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/parser.py +15 -2
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/services/s3_client.py +5 -3
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/model.py +1 -1
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/pipeline_step/factory.py +2 -2
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/sql_converter.py +7 -1
- tol_sdk-1.7.5b0/src/tol/validators/__init__.py +20 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/validators/allowed_keys.py +17 -12
- tol_sdk-1.7.5b0/src/tol/validators/allowed_values.py +63 -0
- tol_sdk-1.7.5b0/src/tol/validators/allowed_values_from_datasource.py +91 -0
- tol_sdk-1.7.5b0/src/tol/validators/assert_on_condition.py +56 -0
- tol_sdk-1.7.5b0/src/tol/validators/ena_submittable.py +61 -0
- tol_sdk-1.7.5b0/src/tol/validators/interfaces/__init__.py +5 -0
- tol_sdk-1.7.5b0/src/tol/validators/interfaces/condition_evaluator.py +61 -0
- tol_sdk-1.7.5b0/src/tol/validators/min_one_valid_value.py +55 -0
- tol_sdk-1.7.5b0/src/tol/validators/mutually_exclusive.py +107 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/validators/regex.py +10 -24
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/validators/regex_by_value.py +14 -33
- tol_sdk-1.7.5b0/src/tol/validators/specimens_have_same_taxon.py +60 -0
- tol_sdk-1.7.5b0/src/tol/validators/sts_fields.py +88 -0
- tol_sdk-1.7.5b0/src/tol/validators/tolid.py +110 -0
- tol_sdk-1.7.5b0/src/tol/validators/unique_values.py +108 -0
- tol_sdk-1.7.5b0/src/tol/validators/unique_whole_organisms.py +109 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0/src/tol_sdk.egg-info}/PKG-INFO +1 -1
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol_sdk.egg-info/SOURCES.txt +12 -0
- tol_sdk-1.7.3/src/tol/api_client/parser.py +0 -211
- tol_sdk-1.7.3/src/tol/api_client/view.py +0 -192
- tol_sdk-1.7.3/src/tol/validators/__init__.py +0 -9
- tol_sdk-1.7.3/src/tol/validators/allowed_values.py +0 -105
- tol_sdk-1.7.3/src/tol/validators/unique_values.py +0 -72
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/LICENSE +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/MANIFEST.in +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/README.md +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/setup.cfg +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/certs/cacert.pem +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/actions/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/actions/action.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/actions/upsert_action.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/action.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/abc/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/abc/auth.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/abc/authorisation.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/asserts.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/blueprint.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/composite.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/config.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/auth/error.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/controller.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/aggregation_body.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/auth_context.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/authenticate.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/data_body.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/filter_utils.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/list_get_parameters.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/relation_url.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/misc/stats_parameters.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_base/system.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/exception.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/api_client/validate.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/barcodes/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/barcodes/main.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/benchling_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/benchling_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/sample.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/benchling/sql/tissue_prep.sql +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/board/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/board/blueprint.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/bold_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/bold/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/cli/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/cli/cli.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/converter/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/converter/yaml/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/converter/yaml/model.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/converter/yaml/yaml_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/copo_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/copo/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/attribute_metadata.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/core_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/data_loader.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/data_source_attribute_metadata.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/data_source_dict.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/datasource_error.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/datasource_filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/datasource_utils.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/http_client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/_filterable.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/_writer.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/aggregator.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/counter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/cursor.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/declare.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/deleter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/detail_getter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/enricher.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/enum.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/group_statter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/inserter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/list_getter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/operator_config.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/page_getter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/relational.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/statter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/summariser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/updater.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/operator/upserter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/relationship.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/requested_fields.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/core/session.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/elastic/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/elastic/elastic_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/elastic/runtime_fields.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/auth.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/eln_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/entities.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/generators.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/eln/sanitise.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/ena/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/excel/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/excel/excel.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/excel/excel_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/excel/s3_factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/logger.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/secrets.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/flows/sequencing_submissions.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/gap/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/gap/gap_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/goat_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/goat/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/google_sheets/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/irods/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/irods/irods_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/jira_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/mapper.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/jira/sort.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/json/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/json/json_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/json/s3_json_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/client.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/labwhere_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/labwhere/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/markdown.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/mlwh/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/mlwh/mlwh_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/prefect_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/prefect/prefect_object.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/s3/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/s3/converter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/s3/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/s3/parser.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/s3/s3_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/configuration.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/consumer.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/message_builder.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/messages.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/response_processors.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sciops/sequencing_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/services/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/benchling.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/benchling_warehouse.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/bioscan.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/bioscan_extra.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/bioscan_image.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/bioscan_qc.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/bold.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/copo.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/defaults.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/elastic.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/ena.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/gap.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/genome_notes.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/goat.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/grit.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/informatics.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/labwhere.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/mlwh.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/portal.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/portal_attributes.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/portaldb.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/prefect.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/sciops.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/sts.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/sts_legacy.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/tolid.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/tolqc.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/tolqc_legacy.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/treeofsex.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/uksi_qc.py.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sources/workflows.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/action/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/action/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/auth/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/auth/blueprint.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/auth/models.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/cast.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/database.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/ds_session.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/exception.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/ext.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/filter.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/pipeline_step/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/relationship.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/session.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/sort.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/sql_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/standard/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sql/standard/factory.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/status/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/status/status_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sts/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sts/sts.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sts/sts_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/sts/sts_requests.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/treeval/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/treeval/treeval_datasource.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/utils/__init__.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/utils/csv.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol/utils/s3.py +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol_sdk.egg-info/entry_points.txt +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol_sdk.egg-info/requires.txt +0 -0
- {tol_sdk-1.7.3 → tol_sdk-1.7.5b0}/src/tol_sdk.egg-info/top_level.txt +0 -0
|
@@ -251,6 +251,18 @@ def _core_blueprint(
|
|
|
251
251
|
)
|
|
252
252
|
return Controller(data_source, view, req_fields_tree, auth_inspector=auth_inspector)
|
|
253
253
|
|
|
254
|
+
def __new_parser(
|
|
255
|
+
object_type: str,
|
|
256
|
+
):
|
|
257
|
+
data_source = data_source_dict[object_type]
|
|
258
|
+
# Build a ReqFieldsTree template for the request
|
|
259
|
+
req_fields_tree = ReqFieldsTree(
|
|
260
|
+
object_type,
|
|
261
|
+
data_source,
|
|
262
|
+
include_all_to_ones=include_all_to_ones,
|
|
263
|
+
)
|
|
264
|
+
return DefaultParser(data_source_dict, requested_tree=req_fields_tree)
|
|
265
|
+
|
|
254
266
|
@data_handler.route('/<object_type>/<path:object_id>', methods=['GET']) # Allow slashes
|
|
255
267
|
def get_detail(*, object_type: str, object_id: str):
|
|
256
268
|
"""Get details of a specific object by ID."""
|
|
@@ -311,19 +323,17 @@ def _core_blueprint(
|
|
|
311
323
|
def post_inserts(*, object_type: str):
|
|
312
324
|
"""Insert new objects of the specified type."""
|
|
313
325
|
controller = __new_controller(object_type)
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
objects = parser.parse_iterable(request_body.data)
|
|
326
|
+
parser = __new_parser(object_type)
|
|
327
|
+
objects = parser.parse_json_doc(request.json)
|
|
317
328
|
return controller.post_inserts(object_type, objects)
|
|
318
329
|
|
|
319
330
|
@data_handler.route('/<object_type>:upsert', methods=['POST'])
|
|
320
331
|
def post_upserts(*, object_type: str):
|
|
321
332
|
"""Insert or update objects of the specified type."""
|
|
322
|
-
controller = __new_controller(object_type)
|
|
323
333
|
request_args = ListGetParameters(request.args)
|
|
324
|
-
|
|
325
|
-
parser =
|
|
326
|
-
objects = parser.
|
|
334
|
+
controller = __new_controller(object_type)
|
|
335
|
+
parser = __new_parser(object_type)
|
|
336
|
+
objects = parser.parse_json_doc(request.json)
|
|
327
337
|
return controller.post_upserts(
|
|
328
338
|
object_type,
|
|
329
339
|
objects,
|
|
@@ -347,7 +357,8 @@ def _core_blueprint(
|
|
|
347
357
|
requested_fields=request_args.requested_fields,
|
|
348
358
|
)
|
|
349
359
|
search_after = request.json.get('search_after')
|
|
350
|
-
|
|
360
|
+
page = controller.get_cursor_page(object_type, request_args, search_after)
|
|
361
|
+
return page
|
|
351
362
|
|
|
352
363
|
@data_handler.route('/<object_type>:to-one/<object_id>/<path:hops_suffix>', methods=['GET'])
|
|
353
364
|
def get_to_one_relation(*, object_type: str, object_id: str, hops_suffix: str):
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import uuid
|
|
7
|
+
from tempfile import NamedTemporaryFile
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from flask import Blueprint, request, send_file
|
|
11
|
+
|
|
12
|
+
from .blueprint import (
|
|
13
|
+
custom_blueprint,
|
|
14
|
+
)
|
|
15
|
+
from ..services.s3_client import S3Client
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
ALLOWED_EXTENSIONS: set[str] = {'csv', 'json', 'xlsx'}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def allowed_file(filename: str) -> bool:
|
|
22
|
+
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def set_filename(filename: str) -> str:
|
|
26
|
+
environment = os.getenv('ENVIRONMENT', 'dev')
|
|
27
|
+
unique_id = str(uuid.uuid4())[:8]
|
|
28
|
+
return f'{environment}_{unique_id}_{filename}'
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_original_filename(s3_filename: str) -> str:
|
|
32
|
+
return s3_filename.split('_', maxsplit=2)[2]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def data_upload_blueprint(
|
|
36
|
+
url_prefix: str = '/pipeline/data_upload',
|
|
37
|
+
) -> Blueprint:
|
|
38
|
+
|
|
39
|
+
data_upload_blueprint = custom_blueprint(
|
|
40
|
+
name='data_upload',
|
|
41
|
+
url_prefix=url_prefix
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
@data_upload_blueprint.route('/upload', methods=['POST'])
|
|
45
|
+
def upload_file() -> tuple[dict[str, str], int]:
|
|
46
|
+
file = request.files['file']
|
|
47
|
+
s3_bucket: str = request.form.get('s3_bucket')
|
|
48
|
+
|
|
49
|
+
if not file:
|
|
50
|
+
return {'error': 'No file provided'}, 400
|
|
51
|
+
|
|
52
|
+
if not allowed_file(file.filename):
|
|
53
|
+
return {'error': 'File type not allowed'}, 400
|
|
54
|
+
|
|
55
|
+
if not s3_bucket:
|
|
56
|
+
return {'error': 'S3 bucket not specified'}, 400
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
s3_client = S3Client()
|
|
60
|
+
new_filename = set_filename(file.filename)
|
|
61
|
+
|
|
62
|
+
with NamedTemporaryFile() as temp_file:
|
|
63
|
+
file.save(temp_file.name)
|
|
64
|
+
s3_client.put_object(s3_bucket, new_filename, temp_file.name)
|
|
65
|
+
|
|
66
|
+
return {'message': 'File uploaded successfully', 'file_name': new_filename}, 200
|
|
67
|
+
|
|
68
|
+
except Exception as e:
|
|
69
|
+
return {'error': f'Failed to upload file: {str(e)}'}, 500
|
|
70
|
+
|
|
71
|
+
@data_upload_blueprint.route('/download', methods=['POST'])
|
|
72
|
+
def download_file() -> tuple[dict[str, str], int]:
|
|
73
|
+
body: dict[str, Any] = request.json.get('data', {})
|
|
74
|
+
|
|
75
|
+
if 's3_bucket' not in body or 'file_name' not in body:
|
|
76
|
+
return {'error': 'S3 bucket or file name not specified'}, 400
|
|
77
|
+
|
|
78
|
+
bucket_name = body['s3_bucket']
|
|
79
|
+
file_name = body['file_name']
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
s3_client = S3Client()
|
|
83
|
+
|
|
84
|
+
with NamedTemporaryFile() as temp_file:
|
|
85
|
+
s3_client.get_object(bucket_name, file_name, temp_file.name)
|
|
86
|
+
|
|
87
|
+
original = get_original_filename(file_name)
|
|
88
|
+
|
|
89
|
+
return send_file(
|
|
90
|
+
temp_file.name,
|
|
91
|
+
as_attachment=True,
|
|
92
|
+
download_name=original,
|
|
93
|
+
mimetype='application/octet-stream'
|
|
94
|
+
)
|
|
95
|
+
except Exception as e:
|
|
96
|
+
return {'error': f'Failed to download file: {str(e)}'}, 500
|
|
97
|
+
|
|
98
|
+
return data_upload_blueprint
|
|
@@ -27,7 +27,7 @@ if typing.TYPE_CHECKING:
|
|
|
27
27
|
|
|
28
28
|
@dataclass
|
|
29
29
|
class UploadData:
|
|
30
|
-
|
|
30
|
+
s3_bucket: str
|
|
31
31
|
s3_filename: str
|
|
32
32
|
spreadsheet_config: str
|
|
33
33
|
pipeline_id: int
|
|
@@ -37,7 +37,7 @@ class UploadData:
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
REQUIRED_FIELDS: List = [
|
|
40
|
-
'
|
|
40
|
+
's3_bucket',
|
|
41
41
|
's3_filename',
|
|
42
42
|
'spreadsheet_config',
|
|
43
43
|
'pipeline_id',
|
|
@@ -49,7 +49,7 @@ REQUIRED_FIELDS: List = [
|
|
|
49
49
|
def pipeline_steps_blueprint(
|
|
50
50
|
sql_ds: SqlDataSource,
|
|
51
51
|
prefect_ds: PrefectDataSource,
|
|
52
|
-
role: str | None =
|
|
52
|
+
role: str | None = None,
|
|
53
53
|
url_prefix: str = '/run-pipeline',
|
|
54
54
|
|
|
55
55
|
ctx_getter: CtxGetter = default_ctx_getter,
|
|
@@ -105,7 +105,7 @@ def pipeline_steps_blueprint(
|
|
|
105
105
|
upload = sql_ds.data_object_factory(
|
|
106
106
|
'upload',
|
|
107
107
|
attributes={
|
|
108
|
-
'
|
|
108
|
+
's3_bucket': upload_data.s3_bucket,
|
|
109
109
|
's3_filename': upload_data.s3_filename,
|
|
110
110
|
'spreadsheet_config': upload_data.spreadsheet_config,
|
|
111
111
|
'pipeline_id': upload_data.pipeline_id,
|
|
@@ -155,7 +155,7 @@ def pipeline_steps_blueprint(
|
|
|
155
155
|
'deployment_name': flow_name,
|
|
156
156
|
'parameters': flow_params,
|
|
157
157
|
'tags': [
|
|
158
|
-
'app_name:
|
|
158
|
+
f'app_name: {os.environ.get("APP_NAME", "tol")}',
|
|
159
159
|
],
|
|
160
160
|
}
|
|
161
161
|
)
|
|
@@ -190,10 +190,13 @@ def pipeline_steps_blueprint(
|
|
|
190
190
|
def run_pipeline_steps() -> tuple[dict[str, Any], int]:
|
|
191
191
|
|
|
192
192
|
ctx = ctx_getter()
|
|
193
|
-
|
|
193
|
+
if role is not None:
|
|
194
|
+
if not ctx or not ctx.authenticated:
|
|
195
|
+
raise ForbiddenError()
|
|
196
|
+
if role not in ctx.roles:
|
|
197
|
+
raise ForbiddenError()
|
|
194
198
|
|
|
195
|
-
|
|
196
|
-
raise ForbiddenError()
|
|
199
|
+
user_id = ctx.user_id if ctx and ctx.authenticated else None
|
|
197
200
|
|
|
198
201
|
body: dict[str, Any] = request.json.get('data', {})
|
|
199
202
|
|
|
@@ -204,7 +207,7 @@ def pipeline_steps_blueprint(
|
|
|
204
207
|
__get_pipeline(pipeline_id)
|
|
205
208
|
|
|
206
209
|
upload_data = UploadData(
|
|
207
|
-
|
|
210
|
+
s3_bucket=body['s3_bucket'],
|
|
208
211
|
s3_filename=body['s3_filename'],
|
|
209
212
|
spreadsheet_config=body['spreadsheet_config'],
|
|
210
213
|
pipeline_id=pipeline_id,
|
|
@@ -151,7 +151,7 @@ class ApiDataSource(
|
|
|
151
151
|
)
|
|
152
152
|
for id_ in object_ids
|
|
153
153
|
)
|
|
154
|
-
json_converter = self.__jc_factory()
|
|
154
|
+
json_converter = self.__jc_factory(object_type, requested_fields)
|
|
155
155
|
return (
|
|
156
156
|
json_converter.convert(r)
|
|
157
157
|
if r is not None else None
|
|
@@ -179,7 +179,7 @@ class ApiDataSource(
|
|
|
179
179
|
sort_string=sort_by,
|
|
180
180
|
requested_fields=requested_fields,
|
|
181
181
|
)
|
|
182
|
-
return self.__jc_factory().convert_list(transfer)
|
|
182
|
+
return self.__jc_factory(object_type, requested_fields).convert_list(transfer)
|
|
183
183
|
|
|
184
184
|
def get_list(
|
|
185
185
|
self,
|
|
@@ -274,7 +274,7 @@ class ApiDataSource(
|
|
|
274
274
|
filter_string=filter_string,
|
|
275
275
|
requested_fields=requested_fields,
|
|
276
276
|
)
|
|
277
|
-
return self.__jc_factory().convert_cursor_page(transfer)
|
|
277
|
+
return self.__jc_factory(object_type, requested_fields).convert_cursor_page(transfer)
|
|
278
278
|
|
|
279
279
|
@validate('delete')
|
|
280
280
|
def delete(
|
|
@@ -304,7 +304,7 @@ class ApiDataSource(
|
|
|
304
304
|
merge_collections=merge_collections,
|
|
305
305
|
)
|
|
306
306
|
if self.return_mode[object_type] == ReturnMode.POPULATED:
|
|
307
|
-
converted, _ = self.__jc_factory().convert_list(returned)
|
|
307
|
+
converted, _ = self.__jc_factory(object_type).convert_list(returned)
|
|
308
308
|
return converted
|
|
309
309
|
return [] # when the underlying DataSource doesn't return anything
|
|
310
310
|
|
|
@@ -325,7 +325,7 @@ class ApiDataSource(
|
|
|
325
325
|
)
|
|
326
326
|
if transfer is None:
|
|
327
327
|
return None
|
|
328
|
-
return self.__jc_factory().convert(transfer)
|
|
328
|
+
return self.__jc_factory(source.type).convert(transfer)
|
|
329
329
|
|
|
330
330
|
@validate('relational', direct_object=True)
|
|
331
331
|
@validate_id
|
|
@@ -359,7 +359,7 @@ class ApiDataSource(
|
|
|
359
359
|
page,
|
|
360
360
|
page_size
|
|
361
361
|
)
|
|
362
|
-
return self.__jc_factory().convert_list(transfer)
|
|
362
|
+
return self.__jc_factory(source.type).convert_list(transfer)
|
|
363
363
|
|
|
364
364
|
@validate('relational', direct_object=True)
|
|
365
365
|
@validate_id
|
|
@@ -406,7 +406,7 @@ class ApiDataSource(
|
|
|
406
406
|
transfer
|
|
407
407
|
)
|
|
408
408
|
if self.return_mode[object_type] == ReturnMode.POPULATED:
|
|
409
|
-
converted, _ = self.__jc_factory().convert_list(returned)
|
|
409
|
+
converted, _ = self.__jc_factory(object_type).convert_list(returned)
|
|
410
410
|
return converted
|
|
411
411
|
|
|
412
412
|
@property
|
|
@@ -442,7 +442,7 @@ class ApiDataSource(
|
|
|
442
442
|
page = 1
|
|
443
443
|
page_size = self.get_page_size()
|
|
444
444
|
client = self.__client_factory()
|
|
445
|
-
jc_converter = self.__jc_factory()
|
|
445
|
+
jc_converter = self.__jc_factory(object_type, requested_fields)
|
|
446
446
|
filter_string = self.__get_filter_string(object_filters)
|
|
447
447
|
|
|
448
448
|
while True:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
#
|
|
3
3
|
# SPDX-License-Identifier: MIT
|
|
4
4
|
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from .parser import Parser
|
|
8
8
|
from .view import DefaultView
|
|
@@ -11,22 +11,18 @@ from ..core.relationship import RelationshipConfig
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
JsonApiObject = dict[str, Any]
|
|
14
|
-
JsonApiTransfer = dict[
|
|
15
|
-
str,
|
|
16
|
-
Union[JsonApiObject, list[JsonApiObject]]
|
|
17
|
-
]
|
|
14
|
+
JsonApiTransfer = dict[str, JsonApiObject | list[JsonApiObject]]
|
|
18
15
|
JsonRelationship = dict[
|
|
19
16
|
str, # "one" or "many"
|
|
20
|
-
dict[str, str] # relationship_name:target_type
|
|
17
|
+
dict[str, str], # relationship_name:target_type
|
|
21
18
|
]
|
|
22
19
|
JsonRelationshipConfig = dict[
|
|
23
20
|
str, # the object_type
|
|
24
|
-
JsonRelationship
|
|
21
|
+
JsonRelationship,
|
|
25
22
|
]
|
|
26
23
|
|
|
27
24
|
|
|
28
25
|
class JsonApiConverter:
|
|
29
|
-
|
|
30
26
|
"""
|
|
31
27
|
Converts from JSON:API transfers to instances of
|
|
32
28
|
`DataObject`.
|
|
@@ -35,89 +31,82 @@ class JsonApiConverter:
|
|
|
35
31
|
def __init__(
|
|
36
32
|
self,
|
|
37
33
|
parser: Parser,
|
|
38
|
-
data_key: str = 'data',
|
|
39
|
-
meta_key: str = 'meta'
|
|
40
34
|
) -> None:
|
|
41
|
-
|
|
42
35
|
self.__parser = parser
|
|
43
|
-
self.__data_key = data_key
|
|
44
|
-
self.__meta_key = meta_key
|
|
45
36
|
|
|
46
|
-
def convert(
|
|
37
|
+
def convert(
|
|
38
|
+
self,
|
|
39
|
+
json_xfer: JsonApiTransfer,
|
|
40
|
+
) -> DataObject:
|
|
47
41
|
"""
|
|
48
42
|
Converts a JsonApiTransfer containing a detail (single) result
|
|
49
43
|
"""
|
|
50
44
|
|
|
51
|
-
|
|
52
|
-
return
|
|
45
|
+
obj_list = self.__parser.parse_json_doc(json_xfer)
|
|
46
|
+
return obj_list[0] if obj_list else None
|
|
53
47
|
|
|
54
48
|
def convert_list(
|
|
55
49
|
self,
|
|
56
|
-
|
|
57
|
-
) -> tuple[list[DataObject],
|
|
50
|
+
json_xfer: JsonApiTransfer,
|
|
51
|
+
) -> tuple[list[DataObject], int | None]:
|
|
58
52
|
"""
|
|
59
53
|
Converts a JsonApiTransfer containing a list of results. Also
|
|
60
54
|
returns a count of the total results meeting.
|
|
61
55
|
"""
|
|
62
56
|
|
|
63
|
-
|
|
64
|
-
total_count =
|
|
65
|
-
return
|
|
66
|
-
self.__parser.parse(json_obj)
|
|
67
|
-
for json_obj in json_obj_list
|
|
68
|
-
], total_count
|
|
57
|
+
objs = self.__parser.parse_json_doc(json_xfer)
|
|
58
|
+
total_count = json_xfer.get('meta', {}).get('total', None)
|
|
59
|
+
return objs, total_count
|
|
69
60
|
|
|
70
61
|
def convert_count(
|
|
71
62
|
self,
|
|
72
|
-
|
|
73
|
-
) ->
|
|
63
|
+
json_xfer: JsonApiTransfer,
|
|
64
|
+
) -> dict[str, Any]:
|
|
74
65
|
"""
|
|
75
66
|
Converts a JsonApiTransfer containing a list of stats.
|
|
76
67
|
"""
|
|
77
68
|
|
|
78
|
-
stats =
|
|
69
|
+
stats = json_xfer['meta']
|
|
79
70
|
return stats['total']
|
|
80
71
|
|
|
81
72
|
def convert_stats(
|
|
82
73
|
self,
|
|
83
|
-
|
|
84
|
-
) ->
|
|
74
|
+
json_xfer: JsonApiTransfer,
|
|
75
|
+
) -> dict[str, Any]:
|
|
85
76
|
"""
|
|
86
77
|
Converts a JsonApiTransfer containing a list of stats.
|
|
87
78
|
"""
|
|
88
79
|
|
|
89
|
-
stats =
|
|
80
|
+
stats = json_xfer['meta']
|
|
90
81
|
return self.__parser.parse_stats(stats)
|
|
91
82
|
|
|
92
83
|
def convert_group_stats(
|
|
93
84
|
self,
|
|
94
|
-
|
|
95
|
-
) ->
|
|
85
|
+
json_xfer: JsonApiTransfer,
|
|
86
|
+
) -> dict[str, Any]:
|
|
96
87
|
"""
|
|
97
88
|
Converts a JsonApiTransfer containing a list of grouped stats.
|
|
98
89
|
"""
|
|
99
90
|
|
|
100
|
-
stats =
|
|
91
|
+
stats = json_xfer['meta']
|
|
101
92
|
return self.__parser.parse_group_stats(stats)
|
|
102
93
|
|
|
103
94
|
def convert_cursor_page(
|
|
104
95
|
self,
|
|
105
|
-
|
|
96
|
+
json_xfer: JsonApiTransfer,
|
|
106
97
|
) -> tuple[list[DataObject], list[str] | None]:
|
|
107
98
|
"""
|
|
108
99
|
Converts a `JsonApiTransfer` of a cursor-page
|
|
109
100
|
"""
|
|
110
101
|
|
|
111
|
-
objs = self.__parser.
|
|
112
|
-
|
|
113
|
-
)
|
|
114
|
-
search_after = input_.get('meta', {}).get('search_after')
|
|
102
|
+
objs = self.__parser.parse_json_doc(json_xfer)
|
|
103
|
+
search_after = json_xfer.get('meta', {}).get('search_after')
|
|
115
104
|
|
|
116
105
|
return objs, search_after
|
|
117
106
|
|
|
118
107
|
def convert_relationship_config(
|
|
119
108
|
self,
|
|
120
|
-
config_transfer: JsonRelationshipConfig
|
|
109
|
+
config_transfer: JsonRelationshipConfig,
|
|
121
110
|
) -> dict[str, RelationshipConfig]:
|
|
122
111
|
"""
|
|
123
112
|
Converts a `JsonRelationshipConfig` dict, returned from
|
|
@@ -127,23 +116,20 @@ class JsonApiConverter:
|
|
|
127
116
|
|
|
128
117
|
return {
|
|
129
118
|
type_: self.__convert_relationship(rel)
|
|
130
|
-
for type_, rel
|
|
131
|
-
in config_transfer.items()
|
|
119
|
+
for type_, rel in config_transfer.items()
|
|
132
120
|
}
|
|
133
121
|
|
|
134
122
|
def __convert_relationship(
|
|
135
123
|
self,
|
|
136
|
-
rel: JsonRelationship
|
|
124
|
+
rel: JsonRelationship,
|
|
137
125
|
) -> RelationshipConfig:
|
|
138
|
-
|
|
139
126
|
return RelationshipConfig(
|
|
140
127
|
to_one=rel.get('one'),
|
|
141
|
-
to_many=rel.get('many')
|
|
128
|
+
to_many=rel.get('many'),
|
|
142
129
|
)
|
|
143
130
|
|
|
144
131
|
|
|
145
132
|
class DataObjectConverter:
|
|
146
|
-
|
|
147
133
|
"""
|
|
148
134
|
Converts from instances of `DataObject` to
|
|
149
135
|
JSON:API transfers.
|
|
@@ -161,21 +147,21 @@ class DataObjectConverter:
|
|
|
161
147
|
req_fields_tree = ReqFieldsTree(object_type, self.__data_source)
|
|
162
148
|
return DefaultView(req_fields_tree, self.__prefix)
|
|
163
149
|
|
|
164
|
-
def convert(self,
|
|
150
|
+
def convert(self, data_obj: DataObject) -> JsonApiTransfer:
|
|
165
151
|
"""
|
|
166
152
|
Converts a single `DataObject` instance to a JsonApiTransfer
|
|
167
153
|
"""
|
|
168
154
|
|
|
169
|
-
view = self.__build_view(
|
|
170
|
-
return view.dump(
|
|
155
|
+
view = self.__build_view(data_obj.type)
|
|
156
|
+
return view.dump(data_obj)
|
|
171
157
|
|
|
172
|
-
def convert_list(self,
|
|
158
|
+
def convert_list(self, data_obj_list: list[DataObject]) -> JsonApiTransfer:
|
|
173
159
|
"""
|
|
174
160
|
Converts a `list` of `DataObject` instances to a JsonApiTransfer
|
|
175
161
|
"""
|
|
176
162
|
|
|
177
|
-
if not
|
|
163
|
+
if not data_obj_list:
|
|
178
164
|
msg = 'Cannot convert empty list'
|
|
179
165
|
raise ValueError(msg)
|
|
180
|
-
view = self.__build_view(
|
|
181
|
-
return view.dump_bulk(
|
|
166
|
+
view = self.__build_view(data_obj_list[0].type)
|
|
167
|
+
return view.dump_bulk(data_obj_list)
|
|
@@ -5,19 +5,12 @@
|
|
|
5
5
|
from collections.abc import Mapping
|
|
6
6
|
from typing import Callable, Iterator, Optional
|
|
7
7
|
|
|
8
|
-
from .api_datasource import
|
|
9
|
-
ApiDataSource,
|
|
10
|
-
DOConverterFactory,
|
|
11
|
-
JsonConverterFactory
|
|
12
|
-
)
|
|
8
|
+
from .api_datasource import ApiDataSource, DOConverterFactory, JsonConverterFactory
|
|
13
9
|
from .client import JsonApiClient
|
|
14
|
-
from .converter import
|
|
15
|
-
DataObjectConverter,
|
|
16
|
-
JsonApiConverter
|
|
17
|
-
)
|
|
10
|
+
from .converter import DataObjectConverter, JsonApiConverter
|
|
18
11
|
from .filter import DefaultApiFilter
|
|
19
12
|
from .parser import DefaultParser
|
|
20
|
-
from ..core import DataSource
|
|
13
|
+
from ..core import DataSource, ReqFieldsTree
|
|
21
14
|
|
|
22
15
|
|
|
23
16
|
class _ApiDSDict(Mapping):
|
|
@@ -53,11 +46,7 @@ class _ConverterFactory:
|
|
|
53
46
|
return self.__data_source
|
|
54
47
|
|
|
55
48
|
@data_source.setter
|
|
56
|
-
def data_source(
|
|
57
|
-
self,
|
|
58
|
-
ds: DataSource
|
|
59
|
-
) -> None:
|
|
60
|
-
|
|
49
|
+
def data_source(self, ds: DataSource) -> None:
|
|
61
50
|
self.__data_source = ds
|
|
62
51
|
|
|
63
52
|
def do_converter_factory(self) -> DOConverterFactory:
|
|
@@ -67,12 +56,26 @@ class _ConverterFactory:
|
|
|
67
56
|
|
|
68
57
|
return DataObjectConverter(self.__data_source, prefix=self.__prefix)
|
|
69
58
|
|
|
70
|
-
def json_converter_factory(
|
|
59
|
+
def json_converter_factory(
|
|
60
|
+
self,
|
|
61
|
+
object_type: str | None = None,
|
|
62
|
+
requested_fields: list[str] | None = None,
|
|
63
|
+
) -> JsonConverterFactory:
|
|
71
64
|
"""
|
|
72
65
|
Returns an instantiated `JsonApiConverter`.
|
|
73
66
|
"""
|
|
74
67
|
|
|
75
|
-
|
|
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)
|
|
76
79
|
return JsonApiConverter(parser)
|
|
77
80
|
|
|
78
81
|
@property
|
|
@@ -110,7 +113,6 @@ def _filter_factory() -> DefaultApiFilter:
|
|
|
110
113
|
def create_api_datasource(
|
|
111
114
|
api_url: str,
|
|
112
115
|
token: Optional[str] = None,
|
|
113
|
-
|
|
114
116
|
data_prefix: str = '/data',
|
|
115
117
|
retries: int = 5,
|
|
116
118
|
status_forcelist: Optional[list[int]] = None,
|
|
@@ -137,7 +139,7 @@ def create_api_datasource(
|
|
|
137
139
|
client_factory,
|
|
138
140
|
manager.json_converter_factory,
|
|
139
141
|
manager.do_converter_factory,
|
|
140
|
-
_filter_factory
|
|
142
|
+
_filter_factory,
|
|
141
143
|
)
|
|
142
144
|
|
|
143
145
|
manager.data_source = api_ds
|