dxpy 0.399.0__tar.gz → 0.399.1__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.
- {dxpy-0.399.0 → dxpy-0.399.1}/MANIFEST.in +1 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/PKG-INFO +14 -4
- dxpy-0.399.1/dxpy/toolkit_version.py +1 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/PKG-INFO +14 -4
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/SOURCES.txt +16 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/entry_points.txt +0 -1
- dxpy-0.399.1/scripts/dx-clone-asset +220 -0
- dxpy-0.399.1/scripts/dx-docker +492 -0
- dxpy-0.399.1/scripts/dx-download-all-inputs +77 -0
- dxpy-0.399.1/scripts/dx-fetch-bundled-depends +44 -0
- dxpy-0.399.1/scripts/dx-generate-dxapp +341 -0
- dxpy-0.399.1/scripts/dx-jobutil-add-output +187 -0
- dxpy-0.399.1/scripts/dx-jobutil-dxlink +29 -0
- dxpy-0.399.1/scripts/dx-jobutil-get-identity-token +69 -0
- dxpy-0.399.1/scripts/dx-jobutil-new-job +104 -0
- dxpy-0.399.1/scripts/dx-jobutil-parse-link +39 -0
- dxpy-0.399.1/scripts/dx-jobutil-report-error +40 -0
- dxpy-0.399.1/scripts/dx-log-stream +69 -0
- dxpy-0.399.1/scripts/dx-mount-all-inputs +77 -0
- dxpy-0.399.1/scripts/dx-notebook-reconnect +41 -0
- dxpy-0.399.1/scripts/dx-print-bash-vars +47 -0
- dxpy-0.399.1/scripts/dx-upload-all-outputs +445 -0
- dxpy-0.399.0/dxpy/toolkit_version.py +0 -1
- {dxpy-0.399.0 → dxpy-0.399.1}/Readme.md +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/api.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/app_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/app_categories.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/asset_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/cmd_line_options_validator.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/data_transformations.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/dataset.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/json_validation_by_schema.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/schemas/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/schemas/assay_filtering_conditions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/schemas/assay_filtering_json_schemas.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/vizclient.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/vizserver_filters_from_json_parser.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/apollo/vizserver_payload_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/auth.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/download_all_inputs.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxanalysis.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxapp.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxapp_container_functions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxapplet.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxdatabase.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxdatabase_functions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxdataobject_functions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxfile.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxfile_functions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxglobalworkflow.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxjob.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxproject.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxrecord.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/dxworkflow.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/mount_all_inputs.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/bindings/search.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/cp.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/dataset_utilities.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/download.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/exec_io.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/help_messages.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/org.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/output_handling.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/parsers.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/cli/workflow.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/compat.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_vep.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/cohort_filter_payload.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/column_conditions.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/column_conversion.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/filter_to_payload.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/germline_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/input_validation.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/input_validation_somatic.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/retrieve_allele_schema.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/retrieve_annotation_schema.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/retrieve_bins.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/retrieve_genotype_schema.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/return_columns_allele.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/return_columns_annotation.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/return_columns_genotype.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/return_columns_genotype_only.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dx_extract_utils/somatic_filter_payload.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/dxlog.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/exceptions.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/executable_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/ImageRef.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/ImageRefFactory.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/app_asset_projects_ids_prod.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/app_asset_projects_ids_staging.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/awscli_assets.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/awscli_assets.staging.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/collect_images.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextaur_assets.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextaur_assets.staging.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextflow_assets.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextflow_assets.staging.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextflow_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextflow_templates.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/nextflow/nextflow_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/packages/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/scripts/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/scripts/dx.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/scripts/dx_app_wizard.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/scripts/dx_build_app.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/scripts/dx_build_applet.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/ssh_tunnel_app_support.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/system_requirements.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/bash.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/python.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/Readme.md +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/basic/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/basic/src/code.sh +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/parallelized/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/parallelized/src/code.sh +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/nextflow/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/nextflow/src/nextflow.sh +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/basic/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/basic/src/code.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/basic/test/test.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/parallelized/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/parallelized/src/code.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/parallelized/test/test.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/scatter-process-gather/src/code.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/templates/python/scatter-process-gather/test/test.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/templating/utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/__init__.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/batch_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/completer.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/config.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/describe.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/exec_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/executable_unbuilder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/file_handle.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/file_load_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/genomic_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/job_log_client.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/local_exec_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/pathmatch.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/pretty_print.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/printing.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/resolver.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/spelling_corrector.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/utils/version.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy/workflow_builder.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/dependency_links.txt +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/not-zip-safe +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/requires.txt +6 -6
- {dxpy-0.399.0 → dxpy-0.399.1}/dxpy.egg-info/top_level.txt +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/requirements.txt +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/requirements_setuptools.txt +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/requirements_test.txt +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/setup.cfg +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/setup.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_batch.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_create_cohort.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_describe.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dx-docker.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dx_app_wizard.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dx_bash_helpers.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dx_completion.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dx_symlink.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxabs.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxasset.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxclient.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxpy.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxpy_utils.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_dxunpack.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_extract_assay.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_extract_dataset.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_extract_expression.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_extract_somatic.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_nextflow.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_nextflow_ImageRef.py +0 -0
- {dxpy-0.399.0 → dxpy-0.399.1}/test/test_nextflow_ImageRefFactory.py +0 -0
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dxpy
|
|
3
|
-
Version: 0.399.
|
|
3
|
+
Version: 0.399.1
|
|
4
4
|
Summary: DNAnexus Platform API bindings for Python
|
|
5
5
|
Home-page: https://github.com/dnanexus/dx-toolkit
|
|
6
6
|
Author: Aleksandra Zalcman, Andrey Kislyuk, Anurag Biyani, Geet Duggal, Katherine Lai, Kurt Jensen, Marek Hrvol, Ohad Rodeh, Phil Sung
|
|
7
7
|
Author-email: support@dnanexus.com
|
|
8
8
|
License: Apache Software License
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
Classifier: Environment :: Console
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -17,8 +16,21 @@ Classifier: Programming Language :: Unix Shell
|
|
|
17
16
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
17
|
Requires-Python: >=3.8
|
|
19
18
|
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: argcomplete>=2.0.0; python_version >= "3.10"
|
|
20
|
+
Requires-Dist: argcomplete<2.0.0,>=1.9.4; python_version < "3.10"
|
|
21
|
+
Requires-Dist: websocket-client<1.8.0,>=1.6.0
|
|
22
|
+
Requires-Dist: python-dateutil>=2.5
|
|
23
|
+
Requires-Dist: psutil>=5.9.3
|
|
24
|
+
Requires-Dist: certifi>=2024.7.4
|
|
25
|
+
Requires-Dist: urllib3<2.2,>=1.25
|
|
26
|
+
Requires-Dist: pyreadline3==3.4.1; sys_platform == "win32"
|
|
27
|
+
Requires-Dist: colorama<=0.4.6,>=0.4.4; sys_platform == "win32"
|
|
28
|
+
Requires-Dist: crc32c>=2.7.1
|
|
20
29
|
Provides-Extra: pandas
|
|
30
|
+
Requires-Dist: pandas==1.3.5; extra == "pandas"
|
|
31
|
+
Requires-Dist: numpy<2.0.0; extra == "pandas"
|
|
21
32
|
Provides-Extra: xattr
|
|
33
|
+
Requires-Dist: xattr==0.10.1; (sys_platform == "linux2" or sys_platform == "linux") and extra == "xattr"
|
|
22
34
|
|
|
23
35
|
dxpy: DNAnexus Python API
|
|
24
36
|
=========================
|
|
@@ -125,5 +137,3 @@ We have the following convention for these scripts:
|
|
|
125
137
|
if __name__ == '__main__':
|
|
126
138
|
main()
|
|
127
139
|
```
|
|
128
|
-
|
|
129
|
-
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = '0.399.1'
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dxpy
|
|
3
|
-
Version: 0.399.
|
|
3
|
+
Version: 0.399.1
|
|
4
4
|
Summary: DNAnexus Platform API bindings for Python
|
|
5
5
|
Home-page: https://github.com/dnanexus/dx-toolkit
|
|
6
6
|
Author: Aleksandra Zalcman, Andrey Kislyuk, Anurag Biyani, Geet Duggal, Katherine Lai, Kurt Jensen, Marek Hrvol, Ohad Rodeh, Phil Sung
|
|
7
7
|
Author-email: support@dnanexus.com
|
|
8
8
|
License: Apache Software License
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
Classifier: Environment :: Console
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -17,8 +16,21 @@ Classifier: Programming Language :: Unix Shell
|
|
|
17
16
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
17
|
Requires-Python: >=3.8
|
|
19
18
|
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: argcomplete>=2.0.0; python_version >= "3.10"
|
|
20
|
+
Requires-Dist: argcomplete<2.0.0,>=1.9.4; python_version < "3.10"
|
|
21
|
+
Requires-Dist: websocket-client<1.8.0,>=1.6.0
|
|
22
|
+
Requires-Dist: python-dateutil>=2.5
|
|
23
|
+
Requires-Dist: psutil>=5.9.3
|
|
24
|
+
Requires-Dist: certifi>=2024.7.4
|
|
25
|
+
Requires-Dist: urllib3<2.2,>=1.25
|
|
26
|
+
Requires-Dist: pyreadline3==3.4.1; sys_platform == "win32"
|
|
27
|
+
Requires-Dist: colorama<=0.4.6,>=0.4.4; sys_platform == "win32"
|
|
28
|
+
Requires-Dist: crc32c>=2.7.1
|
|
20
29
|
Provides-Extra: pandas
|
|
30
|
+
Requires-Dist: pandas==1.3.5; extra == "pandas"
|
|
31
|
+
Requires-Dist: numpy<2.0.0; extra == "pandas"
|
|
21
32
|
Provides-Extra: xattr
|
|
33
|
+
Requires-Dist: xattr==0.10.1; (sys_platform == "linux2" or sys_platform == "linux") and extra == "xattr"
|
|
22
34
|
|
|
23
35
|
dxpy: DNAnexus Python API
|
|
24
36
|
=========================
|
|
@@ -125,5 +137,3 @@ We have the following convention for these scripts:
|
|
|
125
137
|
if __name__ == '__main__':
|
|
126
138
|
main()
|
|
127
139
|
```
|
|
128
|
-
|
|
129
|
-
|
|
@@ -164,6 +164,22 @@ dxpy/utils/printing.py
|
|
|
164
164
|
dxpy/utils/resolver.py
|
|
165
165
|
dxpy/utils/spelling_corrector.py
|
|
166
166
|
dxpy/utils/version.py
|
|
167
|
+
scripts/dx-clone-asset
|
|
168
|
+
scripts/dx-docker
|
|
169
|
+
scripts/dx-download-all-inputs
|
|
170
|
+
scripts/dx-fetch-bundled-depends
|
|
171
|
+
scripts/dx-generate-dxapp
|
|
172
|
+
scripts/dx-jobutil-add-output
|
|
173
|
+
scripts/dx-jobutil-dxlink
|
|
174
|
+
scripts/dx-jobutil-get-identity-token
|
|
175
|
+
scripts/dx-jobutil-new-job
|
|
176
|
+
scripts/dx-jobutil-parse-link
|
|
177
|
+
scripts/dx-jobutil-report-error
|
|
178
|
+
scripts/dx-log-stream
|
|
179
|
+
scripts/dx-mount-all-inputs
|
|
180
|
+
scripts/dx-notebook-reconnect
|
|
181
|
+
scripts/dx-print-bash-vars
|
|
182
|
+
scripts/dx-upload-all-outputs
|
|
167
183
|
test/test_batch.py
|
|
168
184
|
test/test_create_cohort.py
|
|
169
185
|
test/test_describe.py
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from __future__ import print_function
|
|
4
|
+
import argparse
|
|
5
|
+
import subprocess
|
|
6
|
+
import multiprocessing
|
|
7
|
+
import traceback
|
|
8
|
+
import time
|
|
9
|
+
import functools
|
|
10
|
+
import sys
|
|
11
|
+
import json
|
|
12
|
+
|
|
13
|
+
import dxpy
|
|
14
|
+
|
|
15
|
+
ASSET_PROJECT_PREFIX = 'DNAnexus Assets for'
|
|
16
|
+
URL_DURATION = 60 * 60 * 24
|
|
17
|
+
SLEEP_TIME = 5
|
|
18
|
+
CLONE_ASSET_APP_NAME = '_clone_asset'
|
|
19
|
+
CLONE_ASSET_APP = dxpy.find_one_app(zero_ok=False, more_ok=False, name=CLONE_ASSET_APP_NAME, return_handler=True)
|
|
20
|
+
|
|
21
|
+
# Get the set of supported regions
|
|
22
|
+
SUPPORTED_REGIONS = set()
|
|
23
|
+
user_description = dxpy.api.user_describe(dxpy.whoami())
|
|
24
|
+
if user_description['billTo'].startswith('user-'):
|
|
25
|
+
SUPPORTED_REGIONS = set(user_description['permittedRegions'])
|
|
26
|
+
elif user_description['billTo'].startswith('org-'):
|
|
27
|
+
SUPPORTED_REGIONS = set(dxpy.api.org_describe(user_description['billTo'])['permittedRegions'])
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _parse_args():
|
|
31
|
+
"""
|
|
32
|
+
Parse the input arguments.
|
|
33
|
+
"""
|
|
34
|
+
ap = argparse.ArgumentParser(description='Clone an asset')
|
|
35
|
+
|
|
36
|
+
ap.add_argument('--record',
|
|
37
|
+
help='Record-id of asset to clone.',
|
|
38
|
+
required=True)
|
|
39
|
+
ap.add_argument('--regions',
|
|
40
|
+
help='Regions to clone asset into. Permitted regions are:\n[{supported_regions}]'.format(
|
|
41
|
+
supported_regions=', '.join(SUPPORTED_REGIONS)),
|
|
42
|
+
default=SUPPORTED_REGIONS,
|
|
43
|
+
nargs='+',
|
|
44
|
+
metavar='',
|
|
45
|
+
required=False)
|
|
46
|
+
ap.add_argument('--num-retries',
|
|
47
|
+
help='Number of attempts to transfer the asset to a given region.',
|
|
48
|
+
default=0,
|
|
49
|
+
type=int,
|
|
50
|
+
required=False)
|
|
51
|
+
ap.add_argument('--priority',
|
|
52
|
+
help='Priority with which to run the clone_asset app',
|
|
53
|
+
choices=['normal', 'high'],
|
|
54
|
+
required=False)
|
|
55
|
+
ap.add_argument('--brief',
|
|
56
|
+
help='Print only a mapping with the regions as keys and the cloned record ids as the values to stdout',
|
|
57
|
+
action="store_true",
|
|
58
|
+
required=False)
|
|
59
|
+
|
|
60
|
+
return ap.parse_args()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _find_asset_project(region):
|
|
64
|
+
"""
|
|
65
|
+
Returns the asset project for the given region, or None if a problem arises.
|
|
66
|
+
"""
|
|
67
|
+
project_name = '{project_prefix} {region}'.format(
|
|
68
|
+
project_prefix=ASSET_PROJECT_PREFIX, region=region)
|
|
69
|
+
|
|
70
|
+
# Try to find the asset project for the given region.
|
|
71
|
+
# If more than 1 project with the asset project name is found
|
|
72
|
+
# for the given region, or if no project is found and one
|
|
73
|
+
# can't be created, return None indicating there was a problem.
|
|
74
|
+
try:
|
|
75
|
+
cmd = 'dx find projects --level CONTRIBUTE --name "{proj_name}" --region "{region}" --brief '
|
|
76
|
+
projects = subprocess.check_output(
|
|
77
|
+
cmd.format(proj_name=project_name, region=region), shell=True).strip()
|
|
78
|
+
if not projects:
|
|
79
|
+
cmd = 'dx new project --region "{region}" "{proj_name}" --brief '
|
|
80
|
+
return subprocess.check_output(cmd.format(region=region, proj_name=project_name), shell=True).strip()
|
|
81
|
+
else:
|
|
82
|
+
projects = projects.decode().split('\n')
|
|
83
|
+
return projects[0]
|
|
84
|
+
except subprocess.CalledProcessError:
|
|
85
|
+
traceback.print_exc()
|
|
86
|
+
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _clone_asset_into_region(region, record_name, asset_properties, asset_file_name, url, num_retries, q, priority, brief):
|
|
91
|
+
"""
|
|
92
|
+
Run the _clone_asset app to clone the given asset information into a new asset in the given region.
|
|
93
|
+
The new asset will live in a project in the given region with a prefix given by ASSET_PROJECT_PREFIX.
|
|
94
|
+
This function will attempt to re-run the transfer app num_retries times before finally giving up.
|
|
95
|
+
|
|
96
|
+
The function will return the record_id of the new asset if successful, or None if it is not successful.
|
|
97
|
+
"""
|
|
98
|
+
# Get the official asset project for the given region.
|
|
99
|
+
project_id = _find_asset_project(region)
|
|
100
|
+
# If no official asset project is found and one can't be created,
|
|
101
|
+
# just return None.
|
|
102
|
+
if project_id is None:
|
|
103
|
+
return {region: None}
|
|
104
|
+
|
|
105
|
+
# Now try to run the CLONE_ASSET_APP num_retries + 1 times.
|
|
106
|
+
curr_try = 0
|
|
107
|
+
record_id = None
|
|
108
|
+
while curr_try <= num_retries:
|
|
109
|
+
cmd = ['dx', 'run', CLONE_ASSET_APP_NAME, '--project', project_id, '-iurl=' + url, '-irecord_name=' + record_name]
|
|
110
|
+
cmd += ['-iasset_file_name=' + asset_file_name, '-iasset_properties=' + json.dumps(asset_properties), '--brief']
|
|
111
|
+
job = subprocess.check_output(cmd).strip().decode()
|
|
112
|
+
if not brief:
|
|
113
|
+
print('{region}: {job_id}'.format(region=region, job_id=job), file=sys.stderr)
|
|
114
|
+
try:
|
|
115
|
+
cmd = 'dx wait {job_id} '.format(job_id=job)
|
|
116
|
+
subprocess.check_output(cmd, shell=True)
|
|
117
|
+
except subprocess.CalledProcessError:
|
|
118
|
+
traceback.print_exc()
|
|
119
|
+
|
|
120
|
+
cmd = 'dx describe {job_id} --json '.format(job_id=job)
|
|
121
|
+
job_desc = json.loads(subprocess.check_output(cmd, shell=True).strip())
|
|
122
|
+
|
|
123
|
+
if job_desc['state'] == 'done':
|
|
124
|
+
record_id = job_desc['output']['asset_bundle']
|
|
125
|
+
break
|
|
126
|
+
|
|
127
|
+
curr_try += 1
|
|
128
|
+
|
|
129
|
+
q.put(region)
|
|
130
|
+
return {region: record_id}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def clone_asset(record_id, regions, num_retries=0, priority=None, brief=False):
|
|
134
|
+
"""
|
|
135
|
+
This function will attempt to clone the given record into all of the given regions.
|
|
136
|
+
It will return a dictionary with the regions as keys and the record-ids of the
|
|
137
|
+
corresponding asset as the values. If an asset is not able to be created in a given
|
|
138
|
+
region, the value will be set to None.
|
|
139
|
+
"""
|
|
140
|
+
# Get the asset record
|
|
141
|
+
record = dxpy.DXRecord(record_id)
|
|
142
|
+
fid = record.get_details()['archiveFileId']['$dnanexus_link']
|
|
143
|
+
curr_region = dxpy.describe(record.project)['region']
|
|
144
|
+
|
|
145
|
+
# Only run once per region
|
|
146
|
+
regions = set(regions) - set([curr_region])
|
|
147
|
+
app_supported_regions = set(CLONE_ASSET_APP.describe()['regionalOptions'].keys())
|
|
148
|
+
if len(regions - app_supported_regions) > 0:
|
|
149
|
+
print('Currently no support for the following region(s): [{regions}]'.format(regions=', '.join(regions - app_supported_regions)), file=sys.stderr)
|
|
150
|
+
sys.exit(1)
|
|
151
|
+
|
|
152
|
+
# Get information about the asset
|
|
153
|
+
record_name = record.name
|
|
154
|
+
asset_properties = record.get_properties()
|
|
155
|
+
asset_properties['cloned_from'] = record_id
|
|
156
|
+
asset_file_name = dxpy.describe(fid)['name']
|
|
157
|
+
url = dxpy.DXFile(fid).get_download_url(preauthenticated=True,
|
|
158
|
+
project=dxpy.DXFile.NO_PROJECT_HINT,
|
|
159
|
+
duration=URL_DURATION)[0]
|
|
160
|
+
|
|
161
|
+
# Fire off a clone process for each region
|
|
162
|
+
pool = multiprocessing.Pool(len(regions))
|
|
163
|
+
manager = multiprocessing.Manager()
|
|
164
|
+
q = manager.Queue()
|
|
165
|
+
clone_asset_func = functools.partial(_clone_asset_into_region,
|
|
166
|
+
record_name=record_name, q=q,
|
|
167
|
+
asset_properties=asset_properties,
|
|
168
|
+
asset_file_name=asset_file_name,
|
|
169
|
+
url=url, num_retries=num_retries,
|
|
170
|
+
priority=priority,
|
|
171
|
+
brief=brief)
|
|
172
|
+
results = pool.map_async(clone_asset_func, regions)
|
|
173
|
+
|
|
174
|
+
# Get and return the results
|
|
175
|
+
remaining_regions = regions
|
|
176
|
+
if not brief:
|
|
177
|
+
print('Waiting on region(s): {regions} '.format(regions=' '.join(remaining_regions)))
|
|
178
|
+
while True:
|
|
179
|
+
if results.ready():
|
|
180
|
+
break
|
|
181
|
+
else:
|
|
182
|
+
if q.qsize() > 0:
|
|
183
|
+
for i in range(q.qsize()):
|
|
184
|
+
received = set([q.get()])
|
|
185
|
+
remaining_regions = remaining_regions - received
|
|
186
|
+
if not brief:
|
|
187
|
+
print('\nWaiting on region(s): {regions} '.format(regions=' '.join(remaining_regions)))
|
|
188
|
+
if not brief:
|
|
189
|
+
sys.stdout.write('.')
|
|
190
|
+
sys.stdout.flush()
|
|
191
|
+
time.sleep(SLEEP_TIME)
|
|
192
|
+
|
|
193
|
+
if not brief:
|
|
194
|
+
print('\nDone')
|
|
195
|
+
results = results.get()
|
|
196
|
+
record_ids = {}
|
|
197
|
+
for result in results:
|
|
198
|
+
for region in result:
|
|
199
|
+
if result[region] is None:
|
|
200
|
+
record_ids[region] = None
|
|
201
|
+
else:
|
|
202
|
+
record_ids[region] = result[region]['$dnanexus_link']
|
|
203
|
+
|
|
204
|
+
return record_ids
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def main(record, regions, num_retries=0, priority=None, brief=False):
|
|
208
|
+
record_ids = clone_asset(record, regions, num_retries, priority, brief)
|
|
209
|
+
|
|
210
|
+
for region in record_ids:
|
|
211
|
+
record_id = 'Failed' if record_ids[region] is None else record_ids[region]
|
|
212
|
+
if not brief:
|
|
213
|
+
print('{region}:\t{record_id}'.format(region=region, record_id=record_id))
|
|
214
|
+
|
|
215
|
+
if brief:
|
|
216
|
+
print(record_ids)
|
|
217
|
+
|
|
218
|
+
if __name__ == '__main__':
|
|
219
|
+
args = _parse_args()
|
|
220
|
+
main(args.record, args.regions, args.num_retries, args.priority, args.brief)
|