dxpy 0.385.0__tar.gz → 0.387.0__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.385.0 → dxpy-0.387.0}/PKG-INFO +1 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxproject.py +18 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/exec_io.py +2 -2
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/parsers.py +4 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/scripts/dx.py +9 -2
- dxpy-0.387.0/dxpy/toolkit_version.py +1 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/__init__.py +2 -2
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/describe.py +3 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/exec_utils.py +2 -2
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/file_load_utils.py +2 -6
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/local_exec_utils.py +4 -4
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/PKG-INFO +1 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dx_app_wizard.py +0 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dx_bash_helpers.py +10 -10
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxclient.py +22 -22
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxpy.py +6 -2
- dxpy-0.385.0/dxpy/toolkit_version.py +0 -1
- {dxpy-0.385.0 → dxpy-0.387.0}/MANIFEST.in +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/Readme.md +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/api.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/app_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/app_categories.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/asset_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/cmd_line_options_validator.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/data_transformations.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/dataset.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/json_validation_by_schema.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/schemas/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/schemas/assay_filtering_conditions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/schemas/assay_filtering_json_schemas.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/vizclient.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/vizserver_filters_from_json_parser.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/vizserver_payload_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/auth.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/download_all_inputs.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxanalysis.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxapp.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxapp_container_functions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxapplet.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxdatabase.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxdatabase_functions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxdataobject_functions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxfile.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxfile_functions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxglobalworkflow.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxjob.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxrecord.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/dxworkflow.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/mount_all_inputs.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/search.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/cp.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/dataset_utilities.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/download.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/help_messages.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/org.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/output_handling.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/cli/workflow.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/compat.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_vep.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/cohort_filter_payload.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/column_conditions.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/column_conversion.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/filter_to_payload.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/germline_utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/input_validation.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/input_validation_somatic.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/retrieve_allele_schema.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/retrieve_annotation_schema.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/retrieve_bins.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/retrieve_genotype_schema.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/return_columns_allele.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/return_columns_annotation.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/return_columns_genotype.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/return_columns_genotype_only.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dx_extract_utils/somatic_filter_payload.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/dxlog.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/exceptions.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/executable_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/ImageRef.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/ImageRefFactory.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/awscli_assets.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/awscli_assets.staging.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/collect_images.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextaur_assets.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextaur_assets.staging.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextflow_assets.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextflow_assets.staging.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextflow_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextflow_templates.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/nextflow/nextflow_utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/packages/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/scripts/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/scripts/dx_app_wizard.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/scripts/dx_build_app.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/scripts/dx_build_applet.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/ssh_tunnel_app_support.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/system_requirements.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/__init__.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/bash.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/python.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/Readme.md +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/basic/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/basic/src/code.sh +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/parallelized/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/parallelized/src/code.sh +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/nextflow/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/nextflow/src/nextflow.sh +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/basic/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/basic/src/code.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/basic/test/test.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/parallelized/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/parallelized/src/code.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/parallelized/test/test.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/scatter-process-gather/src/code.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/templates/python/scatter-process-gather/test/test.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/templating/utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/batch_utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/completer.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/config.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/executable_unbuilder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/file_handle.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/genomic_utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/job_log_client.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/pathmatch.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/pretty_print.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/printing.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/resolver.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/spelling_corrector.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/utils/version.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy/workflow_builder.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/SOURCES.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/dependency_links.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/entry_points.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/not-zip-safe +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/requires.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/dxpy.egg-info/top_level.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/requirements.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/requirements_setuptools.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/requirements_test.txt +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-clone-asset +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-docker +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-download-all-inputs +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-fetch-bundled-depends +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-generate-dxapp +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-add-output +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-dxlink +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-get-identity-token +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-new-job +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-parse-link +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-jobutil-report-error +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-log-stream +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-mount-all-inputs +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-notebook-reconnect +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-print-bash-vars +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/scripts/dx-upload-all-outputs +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/setup.cfg +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/setup.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_batch.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_create_cohort.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_describe.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dx-docker.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dx_completion.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dx_symlink.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxabs.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxasset.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxpy_utils.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_dxunpack.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_extract_assay.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_extract_dataset.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_extract_expression.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_extract_somatic.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_nextflow.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_nextflow_ImageRef.py +0 -0
- {dxpy-0.385.0 → dxpy-0.387.0}/test/test_nextflow_ImageRefFactory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dxpy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.387.0
|
|
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
|
|
@@ -285,6 +285,7 @@ class DXProject(DXContainer):
|
|
|
285
285
|
restricted=None, download_restricted=None, contains_phi=None,
|
|
286
286
|
tags=None, properties=None, bill_to=None, database_ui_view_only=None,
|
|
287
287
|
external_upload_restricted=None, default_symlink=None,
|
|
288
|
+
database_results_restricted=None,
|
|
288
289
|
**kwargs):
|
|
289
290
|
"""
|
|
290
291
|
:param name: The name of the project
|
|
@@ -313,6 +314,8 @@ class DXProject(DXContainer):
|
|
|
313
314
|
:type database_ui_view_only: boolean
|
|
314
315
|
:param external_upload_restricted: If provided, whether project members can upload data to project from external sources, e.g. outside of job
|
|
315
316
|
:type external_upload_restricted: boolean
|
|
317
|
+
:param database_results_restricted: If provided, minimum amount of data that project members with VIEW access can see from databases in the project
|
|
318
|
+
:type database_results_restricted: int
|
|
316
319
|
:param default_symlink: If provided, the details needed to have writable symlinks in the project. Dict must include drive, container, and optional prefix.
|
|
317
320
|
:type default_symlink: dict
|
|
318
321
|
|
|
@@ -346,6 +349,8 @@ class DXProject(DXContainer):
|
|
|
346
349
|
input_hash["databaseUIViewOnly"] = database_ui_view_only
|
|
347
350
|
if external_upload_restricted is not None:
|
|
348
351
|
input_hash["externalUploadRestricted"] = external_upload_restricted
|
|
352
|
+
if database_results_restricted is not None:
|
|
353
|
+
input_hash["databaseResultsRestricted"] = database_results_restricted
|
|
349
354
|
if tags is not None:
|
|
350
355
|
input_hash["tags"] = tags
|
|
351
356
|
if properties is not None:
|
|
@@ -360,7 +365,9 @@ class DXProject(DXContainer):
|
|
|
360
365
|
def update(self, name=None, summary=None, description=None, protected=None,
|
|
361
366
|
restricted=None, download_restricted=None, version=None,
|
|
362
367
|
allowed_executables=None, unset_allowed_executables=None,
|
|
363
|
-
database_ui_view_only=None, external_upload_restricted=None,
|
|
368
|
+
database_ui_view_only=None, external_upload_restricted=None,
|
|
369
|
+
database_results_restricted=None, unset_database_results_restricted=None,
|
|
370
|
+
**kwargs):
|
|
364
371
|
"""
|
|
365
372
|
:param name: If provided, the new project name
|
|
366
373
|
:type name: string
|
|
@@ -376,10 +383,16 @@ class DXProject(DXContainer):
|
|
|
376
383
|
:type download_restricted: boolean
|
|
377
384
|
:param allowed_executables: If provided, these are the only executable ID(s) allowed to run as root executions in this project
|
|
378
385
|
:type allowed_executables: list
|
|
386
|
+
:param unset_allowed_executables: If provided, removes any restrictions set by allowed_executables
|
|
387
|
+
:type unset_allowed_executables: boolean
|
|
379
388
|
:param database_ui_view_only: If provided, whether the viewers on the project can access the database data directly
|
|
380
389
|
:type database_ui_view_only: boolean
|
|
381
390
|
:param external_upload_restricted: If provided, whether project members can upload data to project from external sources, e.g. outside of job
|
|
382
391
|
:type external_upload_restricted: boolean
|
|
392
|
+
:param database_results_restricted: If provided, minimum amount of data that project members with VIEW access can see from databases in the project
|
|
393
|
+
:type database_results_restricted: int
|
|
394
|
+
:param unset_database_results_restricted: If provided, removes any restrictions set by database_results_restricted
|
|
395
|
+
:type unset_database_results_restricted: boolean
|
|
383
396
|
:param version: If provided, the update will only occur if the value matches the current project's version number
|
|
384
397
|
:type version: int
|
|
385
398
|
|
|
@@ -413,6 +426,10 @@ class DXProject(DXContainer):
|
|
|
413
426
|
update_hash["databaseUIViewOnly"] = database_ui_view_only
|
|
414
427
|
if external_upload_restricted is not None:
|
|
415
428
|
update_hash["externalUploadRestricted"] = external_upload_restricted
|
|
429
|
+
if database_results_restricted is not None:
|
|
430
|
+
update_hash["databaseResultsRestricted"] = database_results_restricted
|
|
431
|
+
if unset_database_results_restricted is not None:
|
|
432
|
+
update_hash["databaseResultsRestricted"] = None
|
|
416
433
|
dxpy.api.project_update(self._dxid, update_hash, **kwargs)
|
|
417
434
|
|
|
418
435
|
def invite(self, invitee, level, send_email=True, **kwargs):
|
|
@@ -22,7 +22,7 @@ from __future__ import print_function, unicode_literals, division, absolute_impo
|
|
|
22
22
|
|
|
23
23
|
# TODO: refactor all dx run helper functions here
|
|
24
24
|
|
|
25
|
-
import os, sys, json, collections,
|
|
25
|
+
import os, sys, json, collections, shlex
|
|
26
26
|
from ..bindings.dxworkflow import DXWorkflow
|
|
27
27
|
|
|
28
28
|
import dxpy
|
|
@@ -327,7 +327,7 @@ def format_choices_or_suggestions(header, items, obj_class, initial_indent=' ' *
|
|
|
327
327
|
# TODO: in interactive prompts the quotes here may be a bit
|
|
328
328
|
# misleading. Perhaps it should be a separate mode to print
|
|
329
329
|
# "interactive-ready" suggestions.
|
|
330
|
-
return fill(header + ' ' + ', '.join([
|
|
330
|
+
return fill(header + ' ' + ', '.join([shlex.quote(str(item)) for item in items]),
|
|
331
331
|
initial_indent=initial_indent,
|
|
332
332
|
subsequent_indent=subsequent_indent)
|
|
333
333
|
|
|
@@ -446,6 +446,10 @@ def get_update_project_args(args):
|
|
|
446
446
|
input_params['allowedExecutables'] = args.allowed_executables
|
|
447
447
|
if args.unset_allowed_executables:
|
|
448
448
|
input_params['allowedExecutables'] = None
|
|
449
|
+
if args.database_results_restricted is not None:
|
|
450
|
+
input_params['databaseResultsRestricted'] = args.database_results_restricted
|
|
451
|
+
if args.unset_database_results_restricted:
|
|
452
|
+
input_params['databaseResultsRestricted'] = None
|
|
449
453
|
if args.external_upload_restricted is not None:
|
|
450
454
|
input_params['externalUploadRestricted'] = args.external_upload_restricted == 'true'
|
|
451
455
|
return input_params
|
|
@@ -1432,6 +1432,8 @@ def new_project(args):
|
|
|
1432
1432
|
inputs["containsPHI"] = True
|
|
1433
1433
|
if args.database_ui_view_only:
|
|
1434
1434
|
inputs["databaseUIViewOnly"] = True
|
|
1435
|
+
if args.database_results_restricted is not None:
|
|
1436
|
+
inputs["databaseResultsRestricted"] = args.database_results_restricted
|
|
1435
1437
|
if args.monthly_compute_limit is not None:
|
|
1436
1438
|
inputs["monthlyComputeLimit"] = args.monthly_compute_limit
|
|
1437
1439
|
if args.monthly_egress_bytes_limit is not None:
|
|
@@ -2479,7 +2481,7 @@ def find_data(args):
|
|
|
2479
2481
|
visibility=args.visibility,
|
|
2480
2482
|
properties=args.properties,
|
|
2481
2483
|
name=args.name,
|
|
2482
|
-
name_mode=
|
|
2484
|
+
name_mode=args.name_mode,
|
|
2483
2485
|
typename=args.type,
|
|
2484
2486
|
tags=args.tag, link=args.link,
|
|
2485
2487
|
project=args.project,
|
|
@@ -5427,6 +5429,9 @@ parser_update_project.add_argument('--bill-to', help="Update the user or org ID
|
|
|
5427
5429
|
allowed_executables_group = parser_update_project.add_mutually_exclusive_group()
|
|
5428
5430
|
allowed_executables_group.add_argument('--allowed-executables', help='Executable ID(s) this project is allowed to run. This operation overrides any existing list of executables.', type=str, nargs="+")
|
|
5429
5431
|
allowed_executables_group.add_argument('--unset-allowed-executables', help='Removes any restriction to run executables as set by --allowed-executables', action='store_true')
|
|
5432
|
+
database_results_restricted_group = parser_update_project.add_mutually_exclusive_group()
|
|
5433
|
+
database_results_restricted_group.add_argument('--database-results-restricted', help='Viewers on the project can access only more than specified size of visual data from databases', type=positive_integer)
|
|
5434
|
+
database_results_restricted_group.add_argument('--unset-database-results-restricted', help='Removes any restriction to return data from databases as set by --database-results-restricted', action='store_true')
|
|
5430
5435
|
|
|
5431
5436
|
parser_update_project.set_defaults(func=update_project)
|
|
5432
5437
|
register_parser(parser_update_project, subparsers_action=subparsers_update, categories="metadata")
|
|
@@ -5813,6 +5818,7 @@ parser_new_project.add_argument('--phi', help='Add PHI protection to project', d
|
|
|
5813
5818
|
action='store_true')
|
|
5814
5819
|
parser_new_project.add_argument('--database-ui-view-only', help='Viewers on the project cannot access database data directly', default=False,
|
|
5815
5820
|
action='store_true')
|
|
5821
|
+
parser_new_project.add_argument('--database-results-restricted', help='Viewers on the project can access only more than specified size of visual data from databases', type=positive_integer)
|
|
5816
5822
|
parser_new_project.add_argument('--monthly-compute-limit', type=positive_integer, help='Monthly project spending limit for compute')
|
|
5817
5823
|
parser_new_project.add_argument('--monthly-egress-bytes-limit', type=positive_integer, help='Monthly project spending limit for egress (in Bytes)')
|
|
5818
5824
|
parser_new_project.add_argument('--monthly-storage-limit', type=positive_number, help='Monthly project spending limit for storage')
|
|
@@ -6137,7 +6143,8 @@ parser_find_data.add_argument('--class', dest='classname', choices=['record', 'f
|
|
|
6137
6143
|
)
|
|
6138
6144
|
parser_find_data.add_argument('--state', choices=['open', 'closing', 'closed', 'any'], help='State of the object')
|
|
6139
6145
|
parser_find_data.add_argument('--visibility', choices=['hidden', 'visible', 'either'], default='visible', help='Whether the object is hidden or not')
|
|
6140
|
-
parser_find_data.add_argument('--name', help='
|
|
6146
|
+
parser_find_data.add_argument('--name', help='Search criteria for the object name, interpreted according to the --name-mode')
|
|
6147
|
+
parser_find_data.add_argument('--name-mode', default='glob', help='Name mode to use for searching', choices=['glob', 'exact', 'regexp'])
|
|
6141
6148
|
parser_find_data.add_argument('--type', help='Type of the data object')
|
|
6142
6149
|
parser_find_data.add_argument('--link', help='Object ID that the data object links to')
|
|
6143
6150
|
parser_find_data.add_argument('--all-projects', '--allprojects', help='Extend search to all projects (excluding public projects)', action='store_true')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = '0.387.0'
|
|
@@ -292,10 +292,10 @@ class Nonce:
|
|
|
292
292
|
'''
|
|
293
293
|
def __init__(self):
|
|
294
294
|
try:
|
|
295
|
-
self.nonce = "%s%f" % (
|
|
295
|
+
self.nonce = "%s%f" % (binascii.hexlify(os.urandom(32)).decode('utf-8'), time.time())
|
|
296
296
|
except:
|
|
297
297
|
random.seed(time.time())
|
|
298
|
-
self.nonce = "%s%f" % (
|
|
298
|
+
self.nonce = "%s%f" % (random.getrandbits(8*26), time.time())
|
|
299
299
|
|
|
300
300
|
def __str__(self):
|
|
301
301
|
return self.nonce
|
|
@@ -415,7 +415,7 @@ def print_project_desc(desc, verbose=False):
|
|
|
415
415
|
'containsPHI', 'databaseUIViewOnly', 'externalUploadRestricted', 'region', 'storageCost', 'pendingTransfer',
|
|
416
416
|
'atSpendingLimit', 'currentMonthComputeAvailableBudget', 'currentMonthEgressBytesAvailableBudget',
|
|
417
417
|
'currentMonthStorageAvailableBudget', 'currentMonthComputeUsage', 'currentMonthEgressBytesUsage',
|
|
418
|
-
'currentMonthExpectedStorageUsage', 'defaultSymlink'
|
|
418
|
+
'currentMonthExpectedStorageUsage', 'defaultSymlink', 'databaseResultsRestricted',
|
|
419
419
|
# Following are app container-specific
|
|
420
420
|
'destroyAt', 'project', 'type', 'app', 'appName'
|
|
421
421
|
]
|
|
@@ -455,6 +455,8 @@ def print_project_desc(desc, verbose=False):
|
|
|
455
455
|
print_json_field('External Upload Restricted', desc['externalUploadRestricted'])
|
|
456
456
|
if 'defaultSymlink' in desc and verbose:
|
|
457
457
|
print_json_field('Default Symlink', desc['defaultSymlink'])
|
|
458
|
+
if 'databaseResultsRestricted' in desc and desc['databaseResultsRestricted']:
|
|
459
|
+
print_json_field('Database Results Restricted', desc['databaseResultsRestricted'])
|
|
458
460
|
|
|
459
461
|
# Usage
|
|
460
462
|
print_field("Created", render_timestamp(desc['created']))
|
|
@@ -23,7 +23,7 @@ from __future__ import print_function, unicode_literals, division, absolute_impo
|
|
|
23
23
|
import os, sys, json, re, collections, logging, argparse, string, itertools, subprocess, tempfile
|
|
24
24
|
from functools import wraps
|
|
25
25
|
from collections import namedtuple
|
|
26
|
-
import
|
|
26
|
+
import shlex
|
|
27
27
|
|
|
28
28
|
import dxpy
|
|
29
29
|
from ..compat import USING_PYTHON2, open, Mapping
|
|
@@ -435,7 +435,7 @@ class DXExecDependencyInstaller(object):
|
|
|
435
435
|
dxpy.download_dxfile(bundle["id"], bundle["name"], project=dxpy.WORKSPACE_ID)
|
|
436
436
|
except dxpy.exceptions.ResourceNotFound:
|
|
437
437
|
dxpy.download_dxfile(bundle["id"], bundle["name"])
|
|
438
|
-
self.run("dx-unpack {}".format(
|
|
438
|
+
self.run("dx-unpack {}".format(shlex.quote(bundle["name"])))
|
|
439
439
|
else:
|
|
440
440
|
self.log('Skipping bundled dependency "{name}" because it does not refer to a file'.format(**bundle))
|
|
441
441
|
|
|
@@ -83,7 +83,7 @@ will download into the execution environment:
|
|
|
83
83
|
from __future__ import print_function, unicode_literals, division, absolute_import
|
|
84
84
|
|
|
85
85
|
import json
|
|
86
|
-
import
|
|
86
|
+
import shlex
|
|
87
87
|
import os
|
|
88
88
|
import fnmatch
|
|
89
89
|
import sys
|
|
@@ -401,10 +401,6 @@ def analyze_bash_vars(job_input_file, job_homedir):
|
|
|
401
401
|
return file_key_descs, rest_hash
|
|
402
402
|
|
|
403
403
|
|
|
404
|
-
#
|
|
405
|
-
# Note: pipes.quote() to be replaced with shlex.quote() in Python 3
|
|
406
|
-
# (see http://docs.python.org/2/library/pipes.html#pipes.quote)
|
|
407
|
-
#
|
|
408
404
|
def gen_bash_vars(job_input_file, job_homedir=None, check_name_collision=True):
|
|
409
405
|
"""
|
|
410
406
|
:param job_input_file: path to a JSON file describing the job inputs
|
|
@@ -427,7 +423,7 @@ def gen_bash_vars(job_input_file, job_homedir=None, check_name_collision=True):
|
|
|
427
423
|
result = json.dumps(dxpy.dxlink(elem))
|
|
428
424
|
else:
|
|
429
425
|
result = json.dumps(elem)
|
|
430
|
-
return
|
|
426
|
+
return shlex.quote(result)
|
|
431
427
|
|
|
432
428
|
def string_of_value(val):
|
|
433
429
|
if isinstance(val, list):
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import print_function, unicode_literals, division, absolute_import
|
|
18
18
|
|
|
19
|
-
import os, sys, json, subprocess,
|
|
19
|
+
import os, sys, json, subprocess, shlex
|
|
20
20
|
import collections, datetime
|
|
21
21
|
|
|
22
22
|
import dxpy
|
|
@@ -351,9 +351,9 @@ def run_one_entry_point(job_id, function, input_hash, run_spec, depends_on, name
|
|
|
351
351
|
if [[ $(type -t {function}) == "function" ]];
|
|
352
352
|
then {function};
|
|
353
353
|
else echo "$0: Global scope execution complete. Not invoking entry point function {function} because it was not found" 1>&2;
|
|
354
|
-
fi'''.format(homedir=
|
|
355
|
-
env_path=
|
|
356
|
-
code_path=
|
|
354
|
+
fi'''.format(homedir=shlex.quote(job_homedir),
|
|
355
|
+
env_path=shlex.quote(os.path.join(job_env['HOME'], 'environment')),
|
|
356
|
+
code_path=shlex.quote(environ['DX_TEST_CODE_PATH']),
|
|
357
357
|
function=function)
|
|
358
358
|
invocation_args = ['bash', '-c', '-e'] + (['-x'] if environ.get('DX_TEST_X_FLAG') else []) + [script]
|
|
359
359
|
elif run_spec['interpreter'] == 'python2.7':
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dxpy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.387.0
|
|
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
|
|
@@ -23,7 +23,7 @@ import dxpy
|
|
|
23
23
|
import dxpy_testutil as testutil
|
|
24
24
|
import json
|
|
25
25
|
import os
|
|
26
|
-
import
|
|
26
|
+
import shlex
|
|
27
27
|
import pytest
|
|
28
28
|
import shutil
|
|
29
29
|
import tempfile
|
|
@@ -42,7 +42,7 @@ from dxpy.bindings.download_all_inputs import _get_num_parallel_threads
|
|
|
42
42
|
def run(command, **kwargs):
|
|
43
43
|
try:
|
|
44
44
|
if isinstance(command, list) or isinstance(command, tuple):
|
|
45
|
-
print("$ %s" % " ".join(
|
|
45
|
+
print("$ %s" % " ".join(shlex.quote(f) for f in command))
|
|
46
46
|
output = check_output(command, **kwargs)
|
|
47
47
|
else:
|
|
48
48
|
print("$ %s" % (command,))
|
|
@@ -919,30 +919,30 @@ class TestDXJobutilNewJob(DXTestCase):
|
|
|
919
919
|
),
|
|
920
920
|
# instance type: mapping
|
|
921
921
|
("--instance-type " +
|
|
922
|
-
|
|
922
|
+
shlex.quote(json.dumps({"main": "mem2_hdd2_x2" , "other_function": "mem2_hdd2_x1" })),
|
|
923
923
|
{"systemRequirements": {"main": { "instanceType": "mem2_hdd2_x2" },
|
|
924
924
|
"other_function": { "instanceType": "mem2_hdd2_x1" }}}),
|
|
925
925
|
("--instance-type-by-executable " +
|
|
926
|
-
|
|
926
|
+
shlex.quote(json.dumps({"my_applet": {"main": "mem2_hdd2_x2",
|
|
927
927
|
"other_function": "mem3_ssd2_fpga1_x8"}})),
|
|
928
928
|
{"systemRequirementsByExecutable": {"my_applet": {"main": {"instanceType": "mem2_hdd2_x2"},
|
|
929
929
|
"other_function": {"instanceType": "mem3_ssd2_fpga1_x8"}}}}),
|
|
930
930
|
("--instance-type-by-executable " +
|
|
931
|
-
|
|
931
|
+
shlex.quote(json.dumps({"my_applet": {"main": "mem1_ssd1_v2_x2",
|
|
932
932
|
"other_function": "mem3_ssd2_fpga1_x8"}})) +
|
|
933
933
|
" --extra-args " +
|
|
934
|
-
|
|
934
|
+
shlex.quote(json.dumps({"systemRequirementsByExecutable": {"my_applet": {"main": {"instanceType": "mem2_hdd2_x2", "clusterSpec": {"initialInstanceCount": 3}},
|
|
935
935
|
"other_function": {"fpgaDriver": "edico-1.4.5"}}}})),
|
|
936
936
|
{"systemRequirementsByExecutable": {"my_applet":{"main": { "instanceType": "mem2_hdd2_x2", "clusterSpec":{"initialInstanceCount": 3}},
|
|
937
937
|
"other_function": { "instanceType": "mem3_ssd2_fpga1_x8", "fpgaDriver": "edico-1.4.5"} }}}),
|
|
938
938
|
# nvidia driver
|
|
939
939
|
("--instance-type-by-executable " +
|
|
940
|
-
|
|
940
|
+
shlex.quote(json.dumps({
|
|
941
941
|
"my_applet": {
|
|
942
942
|
"main": "mem1_ssd1_v2_x2",
|
|
943
943
|
"other_function": "mem2_ssd1_gpu_x16"}})) +
|
|
944
944
|
" --extra-args " +
|
|
945
|
-
|
|
945
|
+
shlex.quote(json.dumps({
|
|
946
946
|
"systemRequirementsByExecutable": {
|
|
947
947
|
"my_applet": {
|
|
948
948
|
"main": {"instanceType": "mem2_hdd2_x2"},
|
|
@@ -963,14 +963,14 @@ class TestDXJobutilNewJob(DXTestCase):
|
|
|
963
963
|
self.assertNewJobInputHash(cmd_snippet, arguments_hash)
|
|
964
964
|
|
|
965
965
|
def test_extra_arguments(self):
|
|
966
|
-
cmd_snippet = "--extra-args " +
|
|
966
|
+
cmd_snippet = "--extra-args " + shlex.quote(
|
|
967
967
|
json.dumps({"details": {"d1": "detail1", "d2": 1234}, "foo": "foo_value"})
|
|
968
968
|
)
|
|
969
969
|
arguments_hash = {"details": {"d1": "detail1", "d2": 1234}, "foo": "foo_value"}
|
|
970
970
|
self.assertNewJobInputHash(cmd_snippet, arguments_hash)
|
|
971
971
|
|
|
972
972
|
# override previously specified args
|
|
973
|
-
cmd_snippet = "--name JobName --extra-args " +
|
|
973
|
+
cmd_snippet = "--name JobName --extra-args " + shlex.quote(
|
|
974
974
|
json.dumps({"name": "FinalName"})
|
|
975
975
|
)
|
|
976
976
|
arguments_hash = {"name": "FinalName"}
|
|
@@ -21,7 +21,7 @@ from __future__ import print_function, unicode_literals, division, absolute_impo
|
|
|
21
21
|
|
|
22
22
|
import os, sys, unittest, json, tempfile, subprocess, shutil, re, base64, random, time
|
|
23
23
|
import filecmp
|
|
24
|
-
import
|
|
24
|
+
import shlex
|
|
25
25
|
import stat
|
|
26
26
|
import hashlib
|
|
27
27
|
import collections
|
|
@@ -380,14 +380,14 @@ class TestDXClient(DXTestCase):
|
|
|
380
380
|
|
|
381
381
|
# Test -f with valid JSON file.
|
|
382
382
|
record_id = run("dx new record Ψ2 --brief").strip()
|
|
383
|
-
run("dx set_details Ψ2 -f " +
|
|
383
|
+
run("dx set_details Ψ2 -f " + shlex.quote(tmp_file.name))
|
|
384
384
|
dxrecord = dxpy.DXRecord(record_id)
|
|
385
385
|
details = dxrecord.get_details()
|
|
386
386
|
self.assertEqual({"foo": "bar"}, details, msg="dx set_details -f with valid JSON input file failed.")
|
|
387
387
|
|
|
388
388
|
# Test --details-file with valid JSON file.
|
|
389
389
|
record_id = run("dx new record Ψ3 --brief").strip()
|
|
390
|
-
run("dx set_details Ψ3 --details-file " +
|
|
390
|
+
run("dx set_details Ψ3 --details-file " + shlex.quote(tmp_file.name))
|
|
391
391
|
dxrecord = dxpy.DXRecord(record_id)
|
|
392
392
|
details = dxrecord.get_details()
|
|
393
393
|
self.assertEqual({"foo": "bar"}, details,
|
|
@@ -400,16 +400,16 @@ class TestDXClient(DXTestCase):
|
|
|
400
400
|
# Test above with invalid JSON file.
|
|
401
401
|
record_id = run("dx new record Ψ4 --brief").strip()
|
|
402
402
|
with self.assertSubprocessFailure(stderr_regexp="JSON", exit_code=3):
|
|
403
|
-
run("dx set_details Ψ4 -f " +
|
|
403
|
+
run("dx set_details Ψ4 -f " + shlex.quote(tmp_invalid_file.name))
|
|
404
404
|
|
|
405
405
|
# Test command with (-f or --details-file) and CL JSON.
|
|
406
406
|
with self.assertSubprocessFailure(stderr_regexp="Error: Cannot provide both -f/--details-file and details",
|
|
407
407
|
exit_code=3):
|
|
408
|
-
run("dx set_details Ψ4 '{ \"foo\":\"bar\" }' -f " +
|
|
408
|
+
run("dx set_details Ψ4 '{ \"foo\":\"bar\" }' -f " + shlex.quote(tmp_file.name))
|
|
409
409
|
|
|
410
410
|
# Test piping JSON from STDIN.
|
|
411
411
|
record_id = run("dx new record Ψ5 --brief").strip()
|
|
412
|
-
run("cat " +
|
|
412
|
+
run("cat " + shlex.quote(tmp_file.name) + " | dx set_details Ψ5 -f -")
|
|
413
413
|
dxrecord = dxpy.DXRecord(record_id)
|
|
414
414
|
details = dxrecord.get_details()
|
|
415
415
|
self.assertEqual({"foo": "bar"}, details, msg="dx set_details -f - with valid JSON input failed.")
|
|
@@ -5504,11 +5504,11 @@ class TestDXClientFind(DXTestCase):
|
|
|
5504
5504
|
def test_dx_find_projects(self):
|
|
5505
5505
|
unique_project_name = 'dx find projects test ' + str(time.time())
|
|
5506
5506
|
with temporary_project(unique_project_name) as unique_project:
|
|
5507
|
-
self.assertEqual(run("dx find projects --name " +
|
|
5507
|
+
self.assertEqual(run("dx find projects --name " + shlex.quote(unique_project_name)),
|
|
5508
5508
|
unique_project.get_id() + ' : ' + unique_project_name + ' (ADMINISTER)\n')
|
|
5509
|
-
self.assertEqual(run("dx find projects --brief --name " +
|
|
5509
|
+
self.assertEqual(run("dx find projects --brief --name " + shlex.quote(unique_project_name)),
|
|
5510
5510
|
unique_project.get_id() + '\n')
|
|
5511
|
-
json_output = json.loads(run("dx find projects --json --name " +
|
|
5511
|
+
json_output = json.loads(run("dx find projects --json --name " + shlex.quote(unique_project_name)))
|
|
5512
5512
|
self.assertEqual(len(json_output), 1)
|
|
5513
5513
|
self.assertEqual(json_output[0]['id'], unique_project.get_id())
|
|
5514
5514
|
|
|
@@ -5529,15 +5529,15 @@ class TestDXClientFind(DXTestCase):
|
|
|
5529
5529
|
created_project_name = 'dx find projects test ' + str(time.time())
|
|
5530
5530
|
with temporary_project(created_project_name) as unique_project:
|
|
5531
5531
|
self.assertEqual(run("dx find projects --created-after=-1d --brief --name " +
|
|
5532
|
-
|
|
5532
|
+
shlex.quote(created_project_name)), unique_project.get_id() + '\n')
|
|
5533
5533
|
self.assertEqual(run("dx find projects --created-before=" + str(int(time.time() + 1000) * 1000) +
|
|
5534
|
-
" --brief --name " +
|
|
5534
|
+
" --brief --name " + shlex.quote(created_project_name)),
|
|
5535
5535
|
unique_project.get_id() + '\n')
|
|
5536
5536
|
self.assertEqual(run("dx find projects --created-after=-1d --created-before=" +
|
|
5537
5537
|
str(int(time.time() + 1000) * 1000) + " --brief --name " +
|
|
5538
|
-
|
|
5538
|
+
shlex.quote(created_project_name)), unique_project.get_id() + '\n')
|
|
5539
5539
|
self.assertEqual(run("dx find projects --created-after=" + str(int(time.time() + 1000) * 1000) + " --name "
|
|
5540
|
-
+
|
|
5540
|
+
+ shlex.quote(created_project_name)), "")
|
|
5541
5541
|
|
|
5542
5542
|
def test_dx_find_projects_by_region(self):
|
|
5543
5543
|
awseast = "aws:us-east-1"
|
|
@@ -5545,7 +5545,7 @@ class TestDXClientFind(DXTestCase):
|
|
|
5545
5545
|
created_project_name = 'dx find projects test ' + str(time.time())
|
|
5546
5546
|
with temporary_project(created_project_name, region=awseast) as unique_project:
|
|
5547
5547
|
self.assertEqual(run("dx find projects --region {} --brief --name {}".format(
|
|
5548
|
-
awseast,
|
|
5548
|
+
awseast, shlex.quote(created_project_name))),
|
|
5549
5549
|
unique_project.get_id() + '\n')
|
|
5550
5550
|
self.assertIn(unique_project.get_id(),
|
|
5551
5551
|
run("dx find projects --region {} --brief".format(awseast)))
|
|
@@ -5635,10 +5635,10 @@ class TestDXClientFind(DXTestCase):
|
|
|
5635
5635
|
def test_dx_find_projects_phi(self):
|
|
5636
5636
|
projectName = "tempProject+{t}".format(t=time.time())
|
|
5637
5637
|
with temporary_project(name=projectName) as project_1:
|
|
5638
|
-
res = run('dx find projects --phi true --brief --name ' +
|
|
5638
|
+
res = run('dx find projects --phi true --brief --name ' + shlex.quote(projectName))
|
|
5639
5639
|
self.assertTrue(len(res) == 0, "Expected no PHI projects to be found")
|
|
5640
5640
|
|
|
5641
|
-
res = run('dx find projects --phi false --brief --name ' +
|
|
5641
|
+
res = run('dx find projects --phi false --brief --name ' + shlex.quote(projectName)).strip().split('\n')
|
|
5642
5642
|
self.assertTrue(len(res) == 1, "Expected to find one project")
|
|
5643
5643
|
self.assertTrue(res[0] == project_1.get_id())
|
|
5644
5644
|
|
|
@@ -6287,10 +6287,10 @@ class TestDXClientFindInOrg(DXTestCaseBuildApps):
|
|
|
6287
6287
|
project1_id = project_1.get_id()
|
|
6288
6288
|
dxpy.api.project_update(project1_id, {"billTo": self.org_id})
|
|
6289
6289
|
|
|
6290
|
-
res = run('dx find org projects org-piratelabs --phi true --brief --name ' +
|
|
6290
|
+
res = run('dx find org projects org-piratelabs --phi true --brief --name ' + shlex.quote(projectName))
|
|
6291
6291
|
self.assertTrue(len(res) == 0, "Expected no PHI projects to be found")
|
|
6292
6292
|
|
|
6293
|
-
res = run('dx find org projects org-piratelabs --phi false --brief --name ' +
|
|
6293
|
+
res = run('dx find org projects org-piratelabs --phi false --brief --name ' + shlex.quote(projectName)).strip().split("\n")
|
|
6294
6294
|
|
|
6295
6295
|
self.assertTrue(len(res) == 1, "Expected to find one project")
|
|
6296
6296
|
self.assertEqual(res[0], project1_id)
|
|
@@ -7431,7 +7431,7 @@ class TestDXClientUpdateProject(DXTestCase):
|
|
|
7431
7431
|
|
|
7432
7432
|
#Update items one by one.
|
|
7433
7433
|
for item in update_items:
|
|
7434
|
-
run(self.cmd.format(pid=self.project, item=item, n=
|
|
7434
|
+
run(self.cmd.format(pid=self.project, item=item, n=shlex.quote(update_items[item])))
|
|
7435
7435
|
describe_input = {}
|
|
7436
7436
|
describe_input[item] = 'true'
|
|
7437
7437
|
self.assertEqual(self.project_describe(describe_input)[item],
|
|
@@ -7447,14 +7447,14 @@ class TestDXClientUpdateProject(DXTestCase):
|
|
|
7447
7447
|
'protected': 'false'}
|
|
7448
7448
|
|
|
7449
7449
|
update_project_output = check_output(["dx", "update", "project", self.project, "--name",
|
|
7450
|
-
|
|
7450
|
+
shlex.quote(update_items['name']), "--summary", update_items['summary'], "--description",
|
|
7451
7451
|
update_items['description'], "--protected", update_items['protected']])
|
|
7452
7452
|
update_project_json = json.loads(update_project_output);
|
|
7453
7453
|
self.assertTrue("id" in update_project_json)
|
|
7454
7454
|
self.assertEqual(self.project, update_project_json["id"])
|
|
7455
7455
|
|
|
7456
7456
|
update_project_output = check_output(["dx", "update", "project", self.project, "--name",
|
|
7457
|
-
|
|
7457
|
+
shlex.quote(update_items['name']), "--summary", update_items['summary'], "--description",
|
|
7458
7458
|
update_items['description'], "--protected", update_items['protected'], "--brief"])
|
|
7459
7459
|
self.assertEqual(self.project, update_project_output.rstrip("\n"))
|
|
7460
7460
|
|
|
@@ -7479,7 +7479,7 @@ class TestDXClientUpdateProject(DXTestCase):
|
|
|
7479
7479
|
project_name = self.project_describe(describe_input)['name']
|
|
7480
7480
|
new_name = 'Another Project Name' + str(time.time())
|
|
7481
7481
|
|
|
7482
|
-
run(self.cmd.format(pid=project_name, item='name', n=
|
|
7482
|
+
run(self.cmd.format(pid=project_name, item='name', n=shlex.quote(new_name)))
|
|
7483
7483
|
result = self.project_describe(describe_input)
|
|
7484
7484
|
self.assertEqual(result['name'], new_name)
|
|
7485
7485
|
|
|
@@ -139,6 +139,7 @@ class TestDXProject(unittest.TestCase):
|
|
|
139
139
|
self.assertEqual(desc["databaseUIViewOnly"], False)
|
|
140
140
|
self.assertEqual(desc["externalUploadRestricted"], False)
|
|
141
141
|
self.assertEqual(desc["tags"], [])
|
|
142
|
+
self.assertEqual(desc["databaseResultsRestricted"], None)
|
|
142
143
|
prop = dxpy.api.project_describe(dxproject.get_id(),
|
|
143
144
|
{'fields': {'properties': True}})
|
|
144
145
|
self.assertEqual(prop['properties'], {})
|
|
@@ -192,6 +193,7 @@ class TestDXProject(unittest.TestCase):
|
|
|
192
193
|
download_restricted=True,
|
|
193
194
|
external_upload_restricted=False,
|
|
194
195
|
allowed_executables=["applet-abcdefghijklmnopqrstuzwx"],
|
|
196
|
+
database_results_restricted=10,
|
|
195
197
|
description="new description")
|
|
196
198
|
desc = dxproject.describe()
|
|
197
199
|
self.assertEqual(desc["id"], self.proj_id)
|
|
@@ -203,13 +205,15 @@ class TestDXProject(unittest.TestCase):
|
|
|
203
205
|
self.assertEqual(desc["externalUploadRestricted"], False)
|
|
204
206
|
self.assertEqual(desc["description"], "new description")
|
|
205
207
|
self.assertEqual(desc["allowedExecutables"][0], "applet-abcdefghijklmnopqrstuzwx")
|
|
208
|
+
self.assertEqual(desc["databaseResultsRestricted"], 10)
|
|
206
209
|
self.assertTrue("created" in desc)
|
|
207
210
|
|
|
208
|
-
dxproject.update(restricted=False, download_restricted=False, unset_allowed_executables=True)
|
|
211
|
+
dxproject.update(restricted=False, download_restricted=False, unset_allowed_executables=True, unset_database_results_restricted=True)
|
|
209
212
|
desc = dxproject.describe()
|
|
210
213
|
self.assertEqual(desc["restricted"], False)
|
|
211
214
|
self.assertEqual(desc["downloadRestricted"], False)
|
|
212
|
-
self.
|
|
215
|
+
self.assertEqual(desc["allowedExecutables"], None)
|
|
216
|
+
self.assertEqual(desc["databaseResultsRestricted"], None)
|
|
213
217
|
|
|
214
218
|
def test_new_list_remove_folders(self):
|
|
215
219
|
dxproject = dxpy.DXProject()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = '0.385.0'
|
|
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
|
{dxpy-0.385.0 → dxpy-0.387.0}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py
RENAMED
|
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
|