tol-sdk 1.8.1__tar.gz → 1.8.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tol_sdk-1.8.1/src/tol_sdk.egg-info → tol_sdk-1.8.4}/PKG-INFO +1 -1
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/pyproject.toml +1 -1
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/client.py +2 -2
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/http_client.py +2 -2
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/__init__.py +1 -0
- tol_sdk-1.8.4/src/tol/flows/converters/auto_detect_manifest_type_converter.py +46 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/auth/blueprint.py +7 -1
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/pipeline_step/factory.py +20 -5
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/__init__.py +4 -0
- tol_sdk-1.8.4/src/tol/validators/branching.py +160 -0
- tol_sdk-1.8.4/src/tol/validators/date_sorting.py +58 -0
- tol_sdk-1.8.4/src/tol/validators/unique_value_check.py +41 -0
- tol_sdk-1.8.4/src/tol/validators/value_check.py +36 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4/src/tol_sdk.egg-info}/PKG-INFO +1 -1
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol_sdk.egg-info/SOURCES.txt +5 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/LICENSE +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/MANIFEST.in +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/README.md +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/setup.cfg +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/certs/cacert.pem +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/actions/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/actions/action.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/actions/upsert_action.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/action.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/abc/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/abc/auth.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/abc/authorisation.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/asserts.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/blueprint.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/composite.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/config.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/auth/error.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/blueprint.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/controller.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/data_upload.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/aggregation_body.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/auth_context.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/authenticate.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/data_body.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/filter_utils.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/list_get_parameters.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/relation_url.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/misc/stats_parameters.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/pipeline_steps.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_base/system.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/api_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/exception.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/validate.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/api_client/view.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/barcodes/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/barcodes/main.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/benchling_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/benchling_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/extraction_containers_dna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/extraction_extraction_type_dna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/sample.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/benchling/sql/tissue_prep.sql +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/board/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/board/blueprint.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/bold_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/bold/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/cli/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/cli/cli.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/converter/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/converter/yaml/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/converter/yaml/model.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/converter/yaml/yaml_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/copo_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/copo/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/attribute_metadata.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/core_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/data_loader.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/data_object.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/data_object_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/data_source_attribute_metadata.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/data_source_dict.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/datasource_error.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/datasource_filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/datasource_utils.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/_filterable.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/_writer.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/aggregator.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/counter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/cursor.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/declare.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/deleter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/detail_getter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/enricher.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/enum.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/group_statter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/inserter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/list_getter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/operator_config.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/page_getter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/relational.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/statter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/summariser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/updater.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/operator/upserter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/relationship.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/requested_fields.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/session.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/core/validate.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/elastic/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/elastic/elastic_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/elastic/runtime_fields.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/auth.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/eln_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/entities.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/generators.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/eln/sanitise.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/ena_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/ena_methods.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/ena/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/excel/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/excel/excel.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/excel/excel_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/excel/s3_factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/logger.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/secrets.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/flows/sequencing_submissions.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/gap/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/gap/gap_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/goat_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/goat/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/google_sheets/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/irods/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/irods/irods_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/jira_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/mapper.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/jira/sort.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/json/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/json/json_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/json/s3_json_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/labwhere_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/labwhere/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/markdown.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/mlwh/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/mlwh/mlwh_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/prefect_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/prefect/prefect_object.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/s3/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/s3/converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/s3/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/s3/parser.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/s3/s3_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/configuration.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/consumer.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/message_builder.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/messages.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/response_processors.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sciops/sequencing_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/services/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/services/s3_client.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/benchling.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/benchling_warehouse.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/bioscan.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/bioscan_extra.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/bioscan_image.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/bioscan_qc.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/bold.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/copo.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/defaults.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/elastic.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/ena.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/gap.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/genome_notes.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/goat.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/grit.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/informatics.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/labwhere.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/mlwh.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/portal.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/portal_attributes.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/portaldb.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/prefect.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/sciops.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/sts.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/sts_legacy.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/tolid.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/tolqc.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/tolqc_legacy.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/treeofsex.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/uksi_qc.py.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sources/workflows.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/action/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/action/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/auth/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/auth/models.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/cast.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/database.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/ds_session.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/exception.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/ext.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/filter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/model.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/pipeline_step/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/relationship.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/session.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/sort.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/sql_converter.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/sql_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/standard/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sql/standard/factory.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/status/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/status/status_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sts/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sts/sts.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sts/sts_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/sts/sts_requests.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/treeval/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/treeval/treeval_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/utils/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/utils/csv.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/utils/s3.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/allowed_keys.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/allowed_values.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/allowed_values_from_datasource.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/assert_on_condition.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/converter_and_validate.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/ena_checklist.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/ena_submittable.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/interfaces/__init__.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/min_one_valid_value.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/mutually_exclusive.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/regex.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/regex_by_value.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/specimens_have_same_taxon.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/sts_fields.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/tolid.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/types.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/unique_values.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol/validators/unique_whole_organisms.py +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol_sdk.egg-info/entry_points.txt +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol_sdk.egg-info/requires.txt +0 -0
- {tol_sdk-1.8.1 → tol_sdk-1.8.4}/src/tol_sdk.egg-info/top_level.txt +0 -0
|
@@ -206,7 +206,7 @@ class JsonApiClient(HttpClient):
|
|
|
206
206
|
)
|
|
207
207
|
|
|
208
208
|
headers = self._merge_headers()
|
|
209
|
-
session = self.
|
|
209
|
+
session = self.get_session()
|
|
210
210
|
r = session.post(
|
|
211
211
|
url,
|
|
212
212
|
headers=headers,
|
|
@@ -228,7 +228,7 @@ class JsonApiClient(HttpClient):
|
|
|
228
228
|
|
|
229
229
|
url = self.__insert_url(object_type)
|
|
230
230
|
headers = self._merge_headers()
|
|
231
|
-
session = self.
|
|
231
|
+
session = self.get_session()
|
|
232
232
|
r = session.post(url, headers=headers, json=transfer)
|
|
233
233
|
self.__assert_no_error(r)
|
|
234
234
|
return r.json()
|
|
@@ -55,7 +55,7 @@ class HttpClient:
|
|
|
55
55
|
**__empty_if_none(self.__token)
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
def
|
|
58
|
+
def get_session(self) -> requests.Session:
|
|
59
59
|
|
|
60
60
|
cert_path = os.path.join(
|
|
61
61
|
os.path.dirname(__file__),
|
|
@@ -74,7 +74,7 @@ class HttpClient:
|
|
|
74
74
|
"""
|
|
75
75
|
Attempts a call to the endpoint 5 times, with a delay of 1 second
|
|
76
76
|
"""
|
|
77
|
-
session = self.
|
|
77
|
+
session = self.get_session()
|
|
78
78
|
|
|
79
79
|
retry_strategy = Retry(
|
|
80
80
|
total=self.__retries,
|
|
@@ -56,3 +56,4 @@ from .sts_sample_to_casm_benchling_converter import StsSampleToCasmBenchlingConv
|
|
|
56
56
|
from .treeofsex_species_to_treeofsexwh_species_converter import TreeofsexSpeciesToTreeofsexwhSpeciesConverter # noqa F401
|
|
57
57
|
from .treeofsex_upload_to_treeofsex_attribute_converter import TreeofsexUploadToTreeofsexAttributeConverter # noqa F401
|
|
58
58
|
from .skip_null_fields_converter import SkipNullFieldsConverter # noqa F401
|
|
59
|
+
from .auto_detect_manifest_type_converter import AutoDetectManifestTypeConverter # noqa F401
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 Genome Research Ltd.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Iterable
|
|
7
|
+
|
|
8
|
+
from tol.core import DataObject, DataObjectToDataObjectOrUpdateConverter
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AutoDetectManifestTypeConverter(DataObjectToDataObjectOrUpdateConverter):
|
|
12
|
+
|
|
13
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
14
|
+
class Config:
|
|
15
|
+
rack_or_plate: str
|
|
16
|
+
|
|
17
|
+
__slots__ = ['__config']
|
|
18
|
+
__config: Config
|
|
19
|
+
|
|
20
|
+
def __init__(self, data_object_factory, config: Config) -> None:
|
|
21
|
+
super().__init__(data_object_factory)
|
|
22
|
+
self.__config = config
|
|
23
|
+
self._data_object_factory = data_object_factory
|
|
24
|
+
|
|
25
|
+
def convert(self, data_object: DataObject) -> Iterable[DataObject]:
|
|
26
|
+
"""
|
|
27
|
+
converting the samples DataObject into ENA format
|
|
28
|
+
"""
|
|
29
|
+
s = data_object
|
|
30
|
+
attributes = {}
|
|
31
|
+
rack_or_plate_based_manifest = bool(
|
|
32
|
+
re.fullmatch(r'^[A-P][12]?[0-9]$',
|
|
33
|
+
s.attributes.get(self.__config.rack_or_plate))
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
if rack_or_plate_based_manifest:
|
|
37
|
+
attributes['manifest_type'] = 'PLATE_WELL'
|
|
38
|
+
else:
|
|
39
|
+
attributes['manifest_type'] = 'RACK_TUBE'
|
|
40
|
+
|
|
41
|
+
ret = self._data_object_factory(
|
|
42
|
+
data_object.type,
|
|
43
|
+
s.id,
|
|
44
|
+
attributes=attributes,
|
|
45
|
+
)
|
|
46
|
+
yield ret
|
|
@@ -22,6 +22,7 @@ from ...api_base.auth import (
|
|
|
22
22
|
)
|
|
23
23
|
from ...api_base.auth.abc import AuthorisationManager
|
|
24
24
|
from ...api_base.misc import AuthContext
|
|
25
|
+
from ...core import HttpClient
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
class DbAuthManager(AuthManager):
|
|
@@ -194,7 +195,12 @@ class DbAuthManager(AuthManager):
|
|
|
194
195
|
Raises:
|
|
195
196
|
requests.HTTPError: If the revocation request fails
|
|
196
197
|
"""
|
|
197
|
-
|
|
198
|
+
|
|
199
|
+
client = HttpClient()
|
|
200
|
+
|
|
201
|
+
session = client.get_session()
|
|
202
|
+
|
|
203
|
+
r = session.post(
|
|
198
204
|
self.__config.revoke_url,
|
|
199
205
|
data={
|
|
200
206
|
'token': token,
|
|
@@ -9,7 +9,7 @@ from dataclasses import dataclass
|
|
|
9
9
|
from datetime import datetime
|
|
10
10
|
from typing import Any, Dict, Iterator, List
|
|
11
11
|
|
|
12
|
-
from sqlalchemy import ForeignKey, UniqueConstraint
|
|
12
|
+
from sqlalchemy import ForeignKey, Text, UniqueConstraint
|
|
13
13
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
14
14
|
from sqlalchemy.orm import (
|
|
15
15
|
Mapped,
|
|
@@ -64,7 +64,7 @@ def create_pipeline_step_models(
|
|
|
64
64
|
class Pipeline(base_model_class):
|
|
65
65
|
__tablename__ = 'pipeline'
|
|
66
66
|
|
|
67
|
-
id: Mapped[int] = mapped_column(
|
|
67
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
68
68
|
primary_key=True,
|
|
69
69
|
autoincrement=True
|
|
70
70
|
)
|
|
@@ -100,7 +100,7 @@ def create_pipeline_step_models(
|
|
|
100
100
|
),
|
|
101
101
|
)
|
|
102
102
|
|
|
103
|
-
id: Mapped[int] = mapped_column(
|
|
103
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
104
104
|
primary_key=True,
|
|
105
105
|
autoincrement=True
|
|
106
106
|
)
|
|
@@ -121,6 +121,16 @@ def create_pipeline_step_models(
|
|
|
121
121
|
nullable=False
|
|
122
122
|
)
|
|
123
123
|
|
|
124
|
+
description: Mapped[str | None] = mapped_column(
|
|
125
|
+
Text,
|
|
126
|
+
nullable=True
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
is_visible: Mapped[bool] = mapped_column(
|
|
130
|
+
nullable=False,
|
|
131
|
+
default=True
|
|
132
|
+
)
|
|
133
|
+
|
|
124
134
|
config: Mapped[dict[str, Any]] = mapped_column(
|
|
125
135
|
JSONB,
|
|
126
136
|
nullable=False,
|
|
@@ -135,7 +145,7 @@ def create_pipeline_step_models(
|
|
|
135
145
|
class Upload(base_model_class):
|
|
136
146
|
__tablename__ = 'upload'
|
|
137
147
|
|
|
138
|
-
id: Mapped[int] = mapped_column(
|
|
148
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
139
149
|
primary_key=True,
|
|
140
150
|
autoincrement=True
|
|
141
151
|
)
|
|
@@ -173,6 +183,11 @@ def create_pipeline_step_models(
|
|
|
173
183
|
default=False
|
|
174
184
|
)
|
|
175
185
|
|
|
186
|
+
is_ready: Mapped[bool] = mapped_column(
|
|
187
|
+
nullable=False,
|
|
188
|
+
default=False
|
|
189
|
+
)
|
|
190
|
+
|
|
176
191
|
failure_message: Mapped[str | None] = mapped_column(
|
|
177
192
|
nullable=True,
|
|
178
193
|
)
|
|
@@ -182,7 +197,7 @@ def create_pipeline_step_models(
|
|
|
182
197
|
foreign_keys=[pipeline_id]
|
|
183
198
|
)
|
|
184
199
|
|
|
185
|
-
user: Mapped['User'] = relationship(
|
|
200
|
+
user: Mapped['User'] = relationship( # noqa F821
|
|
186
201
|
back_populates='user_uploads',
|
|
187
202
|
foreign_keys=[user_id]
|
|
188
203
|
)
|
|
@@ -20,3 +20,7 @@ from .unique_values import UniqueValuesValidator # noqa
|
|
|
20
20
|
from .unique_whole_organisms import UniqueWholeOrganismsValidator # noqa
|
|
21
21
|
from .interfaces import Condition # noqa
|
|
22
22
|
from .min_one_valid_value import MinOneValidValueValidator # noqa
|
|
23
|
+
from .value_check import ValueCheckValidator # noqa
|
|
24
|
+
from .branching import BranchingValidator # noqa
|
|
25
|
+
from .unique_value_check import UniqueValueCheckValidator # noqa
|
|
26
|
+
from .date_sorting import DateSortingValidator # noqa
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2026 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Dict, List, cast
|
|
8
|
+
|
|
9
|
+
from tol.core import DataObject
|
|
10
|
+
from tol.core.validate import ValidationResult, Validator
|
|
11
|
+
|
|
12
|
+
from .interfaces import Condition, ConditionDict, ConditionEvaluator
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Subvalidation = Dict[str, ConditionDict | str | Dict]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BranchingValidator(Validator, ConditionEvaluator):
|
|
19
|
+
"""
|
|
20
|
+
This validator is configured with a list of conditions.
|
|
21
|
+
If a condition passes, the corresponding sub-validator will be run.
|
|
22
|
+
"""
|
|
23
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
24
|
+
class Config:
|
|
25
|
+
"""
|
|
26
|
+
```
|
|
27
|
+
validations=[
|
|
28
|
+
{
|
|
29
|
+
'condition': {
|
|
30
|
+
'field': 'column_name',
|
|
31
|
+
'operator': '==',
|
|
32
|
+
'value': 'expected_value',
|
|
33
|
+
},
|
|
34
|
+
'module': '<path.to.module>',
|
|
35
|
+
'class_name': '<path.to.ValidatorClass>',
|
|
36
|
+
'config_details': { ... },
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
...
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
validations: List[Subvalidation]
|
|
45
|
+
|
|
46
|
+
__slots__ = ['__config', '_cached_validators']
|
|
47
|
+
__config: Config
|
|
48
|
+
_cached_validators: Dict[int, Validator]
|
|
49
|
+
"""
|
|
50
|
+
Stores all sub-validators that have already been seen so that they can be used again.
|
|
51
|
+
Their keys are their indexes in the `validations` list in the validator config
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
config: Config,
|
|
57
|
+
**kwargs
|
|
58
|
+
) -> None:
|
|
59
|
+
super().__init__()
|
|
60
|
+
|
|
61
|
+
del kwargs
|
|
62
|
+
self.__config = config
|
|
63
|
+
self._cached_validators = {}
|
|
64
|
+
|
|
65
|
+
def _validate_data_object(
|
|
66
|
+
self,
|
|
67
|
+
obj: DataObject
|
|
68
|
+
) -> None:
|
|
69
|
+
for subvalidator_index, subvalidation in enumerate(self.__config.validations):
|
|
70
|
+
# Do not run this sub-validation if its condition does not pass
|
|
71
|
+
condition_dict = cast(ConditionDict, subvalidation['condition'])
|
|
72
|
+
if not self._does_condition_pass(Condition.from_dict(condition_dict), obj):
|
|
73
|
+
continue
|
|
74
|
+
|
|
75
|
+
# Obtain validator, either from cache or anew
|
|
76
|
+
validator: Validator
|
|
77
|
+
if subvalidator_index in self._cached_validators:
|
|
78
|
+
# Use existing validator to perform subvalidation
|
|
79
|
+
validator = self._cached_validators[subvalidator_index]
|
|
80
|
+
else:
|
|
81
|
+
# Create a new validator and use that for the subvalidation
|
|
82
|
+
validator = self.__instantiate_validator(subvalidation)
|
|
83
|
+
|
|
84
|
+
# Add the new validator to the store of cached validators
|
|
85
|
+
self._cached_validators[subvalidator_index] = validator
|
|
86
|
+
|
|
87
|
+
# Validate data object
|
|
88
|
+
validator._validate_data_object(obj)
|
|
89
|
+
|
|
90
|
+
# At this point, I initially added `break` so that once a condition passed, the rest
|
|
91
|
+
# did not need to be checked. However, I decided against it because it is more flexible
|
|
92
|
+
# to have the opportunity to allow multiple conditions to pass, and thus execute
|
|
93
|
+
# multiple subvalidations, on the same `DataObject` in the same iteration
|
|
94
|
+
|
|
95
|
+
def __instantiate_validator(self, subvalidation: Subvalidation) -> Validator:
|
|
96
|
+
# Before attempting to extract items from the subvalidation, ensure all of the required
|
|
97
|
+
# keys are there and that they contain values of the correct types.
|
|
98
|
+
# This allows the dictionary to be safely queried thereafter
|
|
99
|
+
try:
|
|
100
|
+
# Accessing with square brackets will also check whether the key exists or not
|
|
101
|
+
if not isinstance(subvalidation['module'], str):
|
|
102
|
+
raise TypeError('module')
|
|
103
|
+
elif not isinstance(subvalidation['class_name'], str):
|
|
104
|
+
raise TypeError('class_name')
|
|
105
|
+
except (KeyError, TypeError) as e:
|
|
106
|
+
# Make errors more specific to validators
|
|
107
|
+
if isinstance(e, KeyError):
|
|
108
|
+
raise KeyError(
|
|
109
|
+
f'Invalid config in BranchingValidator: `{e.args[0]}` not found'
|
|
110
|
+
)
|
|
111
|
+
else:
|
|
112
|
+
raise TypeError(
|
|
113
|
+
f'Invalid config in BranchingValidator: '
|
|
114
|
+
f'`{e.args[0]}` contains an erroneous value type'
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# Dynamically retrieve the validator class
|
|
118
|
+
validator_module = importlib.import_module(subvalidation['module'])
|
|
119
|
+
validator_class = getattr(validator_module, subvalidation['class_name'])
|
|
120
|
+
|
|
121
|
+
# Construct and return the new validator
|
|
122
|
+
validator_config = validator_class.Config(
|
|
123
|
+
subvalidation['config_details']
|
|
124
|
+
)
|
|
125
|
+
return validator_class(
|
|
126
|
+
config=validator_config,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def results(self) -> List[ValidationResult]:
|
|
131
|
+
"""
|
|
132
|
+
Fetches results from all sub-validators, collated into a single list
|
|
133
|
+
"""
|
|
134
|
+
return [
|
|
135
|
+
result
|
|
136
|
+
for validator in self._cached_validators.values()
|
|
137
|
+
for result in validator.results
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def warnings(self) -> List[ValidationResult]:
|
|
142
|
+
"""
|
|
143
|
+
Fetches warnings from all sub-validators, collated into a single list
|
|
144
|
+
"""
|
|
145
|
+
return [
|
|
146
|
+
warning
|
|
147
|
+
for validator in self._cached_validators.values()
|
|
148
|
+
for warning in validator.warnings
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def errors(self) -> List[ValidationResult]:
|
|
153
|
+
"""
|
|
154
|
+
Fetches errors from all sub-validators, collated into a single list
|
|
155
|
+
"""
|
|
156
|
+
return [
|
|
157
|
+
error
|
|
158
|
+
for validator in self._cached_validators.values()
|
|
159
|
+
for error in validator.errors
|
|
160
|
+
]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2026 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import date, datetime
|
|
7
|
+
|
|
8
|
+
from tol.core import Validator
|
|
9
|
+
from tol.core.data_object import DataObject
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DateSortingValidator(Validator):
|
|
13
|
+
"""
|
|
14
|
+
Validates an incoming stream of `DataObject` instances.
|
|
15
|
+
For each data object (sample) check the collection date
|
|
16
|
+
is not preceding the plating date
|
|
17
|
+
"""
|
|
18
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
19
|
+
class Config:
|
|
20
|
+
dates: list[str]
|
|
21
|
+
|
|
22
|
+
__slots__ = ['__config']
|
|
23
|
+
__config: Config
|
|
24
|
+
|
|
25
|
+
def __init__(self, config: Config, **kwargs) -> None:
|
|
26
|
+
super().__init__()
|
|
27
|
+
self.__config = config
|
|
28
|
+
|
|
29
|
+
def _validate_data_object(self, obj: DataObject) -> None:
|
|
30
|
+
# This function is used to check if the dates obtained
|
|
31
|
+
# are in the standard format and the date of collection
|
|
32
|
+
# is not preceding the date of plating
|
|
33
|
+
|
|
34
|
+
previous_date = None
|
|
35
|
+
|
|
36
|
+
for date_field in self.__config.dates:
|
|
37
|
+
date_value = obj.get_field_by_name(date_field)
|
|
38
|
+
|
|
39
|
+
# Validate that the value is a date or datetime object
|
|
40
|
+
if not isinstance(date_value, (date, datetime)):
|
|
41
|
+
self.add_error(
|
|
42
|
+
object_id=obj.id,
|
|
43
|
+
detail=f'{date_field} of {date_value} is not in the right date format',
|
|
44
|
+
field=self.__config.dates,
|
|
45
|
+
)
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
# Check if dates are in ascending order
|
|
49
|
+
if previous_date is not None and date_value < previous_date:
|
|
50
|
+
self.add_error(
|
|
51
|
+
object_id=obj.id,
|
|
52
|
+
detail=f'Date {date_field} ({date_value})'
|
|
53
|
+
f'is before previous date ({previous_date})',
|
|
54
|
+
field=self.__config.dates,
|
|
55
|
+
)
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
previous_date = date_value
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from tol.core import Validator
|
|
8
|
+
from tol.core.data_object import DataObject
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class UniqueValueCheckValidator(Validator):
|
|
12
|
+
"""
|
|
13
|
+
Validates an incoming stream of `DataObject` instances.
|
|
14
|
+
For each data object (sample) it checks if the GAL column has only one value
|
|
15
|
+
"""
|
|
16
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
17
|
+
class Config:
|
|
18
|
+
field: str
|
|
19
|
+
|
|
20
|
+
__slots__ = ['__config', '_cached']
|
|
21
|
+
__config: Config
|
|
22
|
+
_cached: str | None
|
|
23
|
+
|
|
24
|
+
def __init__(self, config: Config, **kwargs) -> None:
|
|
25
|
+
super().__init__()
|
|
26
|
+
self.__config = config
|
|
27
|
+
self._cached = None
|
|
28
|
+
|
|
29
|
+
def _validate_data_object(self, obj: DataObject) -> None:
|
|
30
|
+
# This function is used to check if the data object has a single value for GAL column
|
|
31
|
+
|
|
32
|
+
if not self._cached:
|
|
33
|
+
self._cached = obj.attributes.get(self.__config.field)
|
|
34
|
+
|
|
35
|
+
else:
|
|
36
|
+
if obj.attributes.get(self.__config.field) != self._cached:
|
|
37
|
+
self.add_error(
|
|
38
|
+
object_id=obj.id,
|
|
39
|
+
detail=f'More than one value detected in {self.__config.field}',
|
|
40
|
+
field=self.__config.field,
|
|
41
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from tol.core import Validator
|
|
8
|
+
from tol.core.data_object import DataObject
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ValueCheckValidator(Validator):
|
|
12
|
+
"""
|
|
13
|
+
Validates an incoming stream of `DataObject` instances.
|
|
14
|
+
For each data object (sample) it checks if it is a SYMBIONT
|
|
15
|
+
"""
|
|
16
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
17
|
+
class Config:
|
|
18
|
+
field: str
|
|
19
|
+
value: str
|
|
20
|
+
|
|
21
|
+
__slots__ = ['__config']
|
|
22
|
+
__config: Config
|
|
23
|
+
|
|
24
|
+
def __init__(self, config: Config, **kwargs) -> None:
|
|
25
|
+
super().__init__()
|
|
26
|
+
self.__config = config
|
|
27
|
+
|
|
28
|
+
def _validate_data_object(self, obj: DataObject) -> None:
|
|
29
|
+
# This function is used to check if the data object is SYMBIONT or not
|
|
30
|
+
|
|
31
|
+
if obj.attributes.get(self.__config.field) == self.__config.value:
|
|
32
|
+
self.add_error(
|
|
33
|
+
object_id=obj.id,
|
|
34
|
+
detail=f'{self.__config.value} is detected',
|
|
35
|
+
field=self.__config.field,
|
|
36
|
+
)
|
|
@@ -155,6 +155,7 @@ src/tol/flows/logger.py
|
|
|
155
155
|
src/tol/flows/secrets.py
|
|
156
156
|
src/tol/flows/sequencing_submissions.py
|
|
157
157
|
src/tol/flows/converters/__init__.py
|
|
158
|
+
src/tol/flows/converters/auto_detect_manifest_type_converter.py
|
|
158
159
|
src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py
|
|
159
160
|
src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py
|
|
160
161
|
src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py
|
|
@@ -332,7 +333,9 @@ src/tol/validators/allowed_keys.py
|
|
|
332
333
|
src/tol/validators/allowed_values.py
|
|
333
334
|
src/tol/validators/allowed_values_from_datasource.py
|
|
334
335
|
src/tol/validators/assert_on_condition.py
|
|
336
|
+
src/tol/validators/branching.py
|
|
335
337
|
src/tol/validators/converter_and_validate.py
|
|
338
|
+
src/tol/validators/date_sorting.py
|
|
336
339
|
src/tol/validators/ena_checklist.py
|
|
337
340
|
src/tol/validators/ena_submittable.py
|
|
338
341
|
src/tol/validators/min_one_valid_value.py
|
|
@@ -343,8 +346,10 @@ src/tol/validators/specimens_have_same_taxon.py
|
|
|
343
346
|
src/tol/validators/sts_fields.py
|
|
344
347
|
src/tol/validators/tolid.py
|
|
345
348
|
src/tol/validators/types.py
|
|
349
|
+
src/tol/validators/unique_value_check.py
|
|
346
350
|
src/tol/validators/unique_values.py
|
|
347
351
|
src/tol/validators/unique_whole_organisms.py
|
|
352
|
+
src/tol/validators/value_check.py
|
|
348
353
|
src/tol/validators/interfaces/__init__.py
|
|
349
354
|
src/tol/validators/interfaces/condition_evaluator.py
|
|
350
355
|
src/tol_sdk.egg-info/PKG-INFO
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|