dxpy 0.374.0__tar.gz → 0.375.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.374.0 → dxpy-0.375.1}/PKG-INFO +1 -1
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapplet.py +1 -1
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx.py +24 -5
- dxpy-0.375.1/dxpy/toolkit_version.py +1 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/PKG-INFO +1 -1
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-new-job +6 -3
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_bash_helpers.py +17 -47
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxclient.py +50 -16
- dxpy-0.374.0/dxpy/toolkit_version.py +0 -1
- {dxpy-0.374.0 → dxpy-0.375.1}/MANIFEST.in +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/Readme.md +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/api.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/app_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/app_categories.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/asset_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/cmd_line_options_validator.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/data_transformations.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/dataset.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/json_validation_by_schema.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/assay_filtering_conditions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/assay_filtering_json_schemas.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizclient.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizserver_filters_from_json_parser.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizserver_payload_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/auth.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/download_all_inputs.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxanalysis.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapp.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapp_container_functions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdatabase.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdatabase_functions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdataobject_functions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxfile.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxfile_functions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxglobalworkflow.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxjob.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxproject.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxrecord.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxworkflow.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/mount_all_inputs.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/search.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/cp.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/dataset_utilities.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/download.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/exec_io.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/help_messages.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/org.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/output_handling.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/parsers.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/workflow.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/compat.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_vep.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/cohort_filter_payload.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/column_conditions.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/column_conversion.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/filter_to_payload.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/germline_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/input_validation.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/input_validation_somatic.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_allele_schema.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_annotation_schema.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_bins.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_genotype_schema.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_allele.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_annotation.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_genotype.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_genotype_only.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/somatic_filter_payload.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dxlog.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/exceptions.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/executable_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/ImageRef.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/ImageRefFactory.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/awscli_assets.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/awscli_assets.staging.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/collect_images.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextaur_assets.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextaur_assets.staging.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_assets.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_assets.staging.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_templates.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/packages/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_app_wizard.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_build_app.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_build_applet.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/ssh_tunnel_app_support.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/system_requirements.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/bash.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/python.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/Readme.md +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/basic/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/basic/src/code.sh +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/parallelized/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/parallelized/src/code.sh +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/nextflow/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/nextflow/src/nextflow.sh +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/src/code.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/test/test.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/src/code.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/test/test.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/src/code.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/test/test.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/__init__.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/batch_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/completer.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/config.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/describe.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/exec_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/executable_unbuilder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/file_handle.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/file_load_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/genomic_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/job_log_client.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/local_exec_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/pathmatch.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/pretty_print.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/printing.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/resolver.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/spelling_corrector.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/version.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/workflow_builder.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/SOURCES.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/dependency_links.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/entry_points.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/not-zip-safe +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/requires.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/top_level.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/requirements.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/requirements_setuptools.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/requirements_test.txt +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-clone-asset +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-docker +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-download-all-inputs +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-fetch-bundled-depends +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-generate-dxapp +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-add-output +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-dxlink +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-get-identity-token +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-parse-link +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-report-error +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-log-stream +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-mount-all-inputs +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-notebook-reconnect +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-print-bash-vars +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-upload-all-outputs +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/setup.cfg +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/setup.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_batch.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_create_cohort.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_describe.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx-docker.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_app_wizard.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_completion.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_symlink.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxabs.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxasset.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxpy.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxpy_utils.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxunpack.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_assay.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_dataset.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_expression.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_somatic.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_nextflow.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/test/test_nextflow_ImageRef.py +0 -0
- {dxpy-0.374.0 → dxpy-0.375.1}/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.375.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
|
|
@@ -242,7 +242,7 @@ class DXExecutable:
|
|
|
242
242
|
:param preserve_job_outputs: Copy cloneable outputs of every non-reused job entering "done" state in this root execution to a folder in the project. If value is True it will place job outputs into the "intermediateJobOutputs" subfolder under the output folder for the root execution. If the value is dict, it may contains "folder" key with desired folder path. If the folder path starts with '/' it refers to an absolute path within the project, otherwise, it refers to a subfolder under root execution's output folder.
|
|
243
243
|
:type preserve_job_outputs: boolean or dict
|
|
244
244
|
:param detailed_job_metrics: Enable detailed job metrics for this root execution
|
|
245
|
-
:type
|
|
245
|
+
:type detailed_job_metrics: boolean
|
|
246
246
|
:param extra_args: If provided, a hash of options that will be merged into the underlying JSON given for the API call
|
|
247
247
|
:type extra_args: dict
|
|
248
248
|
:returns: Object handler of the newly created job
|
|
@@ -3181,7 +3181,7 @@ def run_batch_all_steps(args, executable, dest_proj, dest_path, input_json, run_
|
|
|
3181
3181
|
def run_body(args, executable, dest_proj, dest_path, preset_inputs=None, input_name_prefix=None):
|
|
3182
3182
|
input_json = _get_input_for_run(args, executable, preset_inputs)
|
|
3183
3183
|
|
|
3184
|
-
requested_instance_type, requested_cluster_spec = {}, {}
|
|
3184
|
+
requested_instance_type, requested_cluster_spec, requested_system_requirements_by_executable = {}, {}, {}
|
|
3185
3185
|
executable_describe = None
|
|
3186
3186
|
|
|
3187
3187
|
if args.cloned_job_desc:
|
|
@@ -3192,7 +3192,7 @@ def run_body(args, executable, dest_proj, dest_path, preset_inputs=None, input_n
|
|
|
3192
3192
|
cloned_instance_type = SystemRequirementsDict.from_sys_requirements(cloned_system_requirements, _type='instanceType')
|
|
3193
3193
|
cloned_cluster_spec = SystemRequirementsDict.from_sys_requirements(cloned_system_requirements, _type='clusterSpec')
|
|
3194
3194
|
cloned_fpga_driver = SystemRequirementsDict.from_sys_requirements(cloned_system_requirements, _type='fpgaDriver')
|
|
3195
|
-
cloned_system_requirements_by_executable = args.cloned_job_desc.get("mergedSystemRequirementsByExecutable", {})
|
|
3195
|
+
cloned_system_requirements_by_executable = args.cloned_job_desc.get("mergedSystemRequirementsByExecutable", {}) or {}
|
|
3196
3196
|
else:
|
|
3197
3197
|
cloned_system_requirements = {}
|
|
3198
3198
|
cloned_instance_type, cloned_cluster_spec, cloned_fpga_driver = SystemRequirementsDict({}), SystemRequirementsDict({}), SystemRequirementsDict({})
|
|
@@ -3231,10 +3231,25 @@ def run_body(args, executable, dest_proj, dest_path, preset_inputs=None, input_n
|
|
|
3231
3231
|
# into the runtime systemRequirements
|
|
3232
3232
|
requested_system_requirements = (requested_instance_type + requested_cluster_spec + requested_fpga_driver).as_dict()
|
|
3233
3233
|
|
|
3234
|
-
|
|
3234
|
+
if (args.instance_type and cloned_system_requirements_by_executable):
|
|
3235
|
+
warning = BOLD("WARNING") + ": --instance-type argument: {} may get overridden by".format(args.instance_type)
|
|
3236
|
+
warning += " {} mergedSystemRequirementsByExecutable: {}".format(args.cloned_job_desc.get('id'), json.dumps(cloned_system_requirements_by_executable))
|
|
3237
|
+
if (args.instance_type_by_executable):
|
|
3238
|
+
warning += " and runtime --instance-type-by-executable argument:{}\n".format(json.dumps(args.instance_type_by_executable))
|
|
3239
|
+
print(fill(warning))
|
|
3240
|
+
print()
|
|
3241
|
+
|
|
3242
|
+
# store runtime --instance-type-by-executable {executable:{entrypoint:xxx}} as systemRequirementsByExecutable
|
|
3235
3243
|
# Note: currently we don't have -by-executable options for other fields, for example --instance-count-by-executable
|
|
3236
3244
|
# so this runtime systemRequirementsByExecutable double mapping only contains instanceType under each executable.entrypoint
|
|
3237
|
-
|
|
3245
|
+
if args.instance_type_by_executable:
|
|
3246
|
+
requested_system_requirements_by_executable = {exec: SystemRequirementsDict.from_instance_type(sys_req_by_exec).as_dict(
|
|
3247
|
+
) for exec, sys_req_by_exec in args.instance_type_by_executable.items()}
|
|
3248
|
+
requested_system_requirements_by_executable = SystemRequirementsDict(merge(
|
|
3249
|
+
cloned_system_requirements_by_executable, requested_system_requirements_by_executable)).as_dict()
|
|
3250
|
+
else:
|
|
3251
|
+
requested_system_requirements_by_executable = cloned_system_requirements_by_executable
|
|
3252
|
+
|
|
3238
3253
|
|
|
3239
3254
|
if args.debug_on:
|
|
3240
3255
|
if 'All' in args.debug_on:
|
|
@@ -3603,7 +3618,11 @@ def run(args):
|
|
|
3603
3618
|
if args.clone is not None:
|
|
3604
3619
|
# Resolve job ID or name; both job-id and analysis-id can be described using job_describe()
|
|
3605
3620
|
if is_job_id(args.clone) or is_analysis_id(args.clone):
|
|
3606
|
-
clone_desc = dxpy.api.job_describe(args.clone
|
|
3621
|
+
clone_desc = dxpy.api.job_describe(args.clone, {"defaultFields": True,
|
|
3622
|
+
"fields": {"runSystemRequirements": True,
|
|
3623
|
+
"runSystemRequirementsByExecutable": True,
|
|
3624
|
+
"mergedSystemRequirementsByExecutable": True}})
|
|
3625
|
+
|
|
3607
3626
|
else:
|
|
3608
3627
|
iterators = []
|
|
3609
3628
|
if ":" in args.clone:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = '0.375.1'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dxpy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.375.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
|
|
@@ -54,11 +54,14 @@ def get_job_new_input(args):
|
|
|
54
54
|
if args.instance_type is not None:
|
|
55
55
|
try_call(process_instance_type_arg, args, False)
|
|
56
56
|
job_new_input["systemRequirements"] = SystemRequirementsDict.from_instance_type(args.instance_type, args.function).as_dict()
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
if args.instance_type_by_executable is not None:
|
|
59
59
|
try_call(process_instance_type_by_executable_arg, args)
|
|
60
|
-
job_new_input["systemRequirementsByExecutable"] =
|
|
61
|
-
|
|
60
|
+
job_new_input["systemRequirementsByExecutable"] = {
|
|
61
|
+
exec: SystemRequirementsDict.from_instance_type(sys_req_by_exec).as_dict()
|
|
62
|
+
for exec, sys_req_by_exec in args.instance_type_by_executable.items()
|
|
63
|
+
}
|
|
64
|
+
|
|
62
65
|
if args.head_job_on_demand is not None:
|
|
63
66
|
job_new_input['headJobOnDemand'] = args.head_job_on_demand
|
|
64
67
|
|
|
@@ -918,53 +918,23 @@ class TestDXJobutilNewJob(DXTestCase):
|
|
|
918
918
|
},
|
|
919
919
|
),
|
|
920
920
|
# instance type: mapping
|
|
921
|
-
(
|
|
922
|
-
"
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
{
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
"
|
|
937
|
-
|
|
938
|
-
json.dumps(
|
|
939
|
-
{
|
|
940
|
-
"my_applet": {
|
|
941
|
-
"main": {
|
|
942
|
-
"instanceType": "mem2_hdd2_x2",
|
|
943
|
-
"clusterSpec": {"initialInstanceCount": 3},
|
|
944
|
-
},
|
|
945
|
-
"other_function": {
|
|
946
|
-
"instanceType": "mem3_ssd2_fpga1_x8",
|
|
947
|
-
"fpgaDriver": "edico-1.4.5",
|
|
948
|
-
},
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
)
|
|
952
|
-
),
|
|
953
|
-
{
|
|
954
|
-
"systemRequirementsByExecutable": {
|
|
955
|
-
"my_applet": {
|
|
956
|
-
"main": {
|
|
957
|
-
"instanceType": "mem2_hdd2_x2",
|
|
958
|
-
"clusterSpec": {"initialInstanceCount": 3},
|
|
959
|
-
},
|
|
960
|
-
"other_function": {
|
|
961
|
-
"instanceType": "mem3_ssd2_fpga1_x8",
|
|
962
|
-
"fpgaDriver": "edico-1.4.5",
|
|
963
|
-
},
|
|
964
|
-
}
|
|
965
|
-
}
|
|
966
|
-
},
|
|
967
|
-
),
|
|
921
|
+
("--instance-type " +
|
|
922
|
+
pipes.quote(json.dumps({"main": "mem2_hdd2_x2" , "other_function": "mem2_hdd2_x1" })),
|
|
923
|
+
{"systemRequirements": {"main": { "instanceType": "mem2_hdd2_x2" },
|
|
924
|
+
"other_function": { "instanceType": "mem2_hdd2_x1" }}}),
|
|
925
|
+
("--instance-type-by-executable " +
|
|
926
|
+
pipes.quote(json.dumps({"my_applet": {"main": "mem2_hdd2_x2",
|
|
927
|
+
"other_function": "mem3_ssd2_fpga1_x8"}})),
|
|
928
|
+
{"systemRequirementsByExecutable": {"my_applet": {"main": {"instanceType": "mem2_hdd2_x2"},
|
|
929
|
+
"other_function": {"instanceType": "mem3_ssd2_fpga1_x8"}}}}),
|
|
930
|
+
("--instance-type-by-executable " +
|
|
931
|
+
pipes.quote(json.dumps({"my_applet": {"main": "mem1_ssd1_v2_x2",
|
|
932
|
+
"other_function": "mem3_ssd2_fpga1_x8"}})) +
|
|
933
|
+
" --extra-args " +
|
|
934
|
+
pipes.quote(json.dumps({"systemRequirementsByExecutable": {"my_applet": {"main": {"instanceType": "mem2_hdd2_x2", "clusterSpec": {"initialInstanceCount": 3}},
|
|
935
|
+
"other_function": {"fpgaDriver": "edico-1.4.5"}}}})),
|
|
936
|
+
{"systemRequirementsByExecutable": {"my_applet":{"main": { "instanceType": "mem2_hdd2_x2", "clusterSpec":{"initialInstanceCount": 3}},
|
|
937
|
+
"other_function": { "instanceType": "mem3_ssd2_fpga1_x8", "fpgaDriver": "edico-1.4.5"} }}}),
|
|
968
938
|
# properties - mapping
|
|
969
939
|
(
|
|
970
940
|
"--property foo=foo_value --property bar=bar_value",
|
|
@@ -3310,9 +3310,8 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3310
3310
|
applet_id = dxpy.api.applet_new(app_spec)['id']
|
|
3311
3311
|
requested_inst_type_by_exec = {
|
|
3312
3312
|
applet_id: {
|
|
3313
|
-
"main":
|
|
3314
|
-
|
|
3315
|
-
"clusterSpec": {"initialInstanceCount": 3}}}}
|
|
3313
|
+
"main": "mem2_ssd1_v2_x2",
|
|
3314
|
+
"other": "mem2_hdd2_x1"}}
|
|
3316
3315
|
|
|
3317
3316
|
(stdout, stderr) = run('_DX_DEBUG=2 dx run ' + applet_id + ' ' +
|
|
3318
3317
|
'--instance-type mem2_hdd2_x2 ' +
|
|
@@ -3322,7 +3321,10 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3322
3321
|
json.dumps(requested_inst_type_by_exec) + '\'',
|
|
3323
3322
|
also_return_stderr=True)
|
|
3324
3323
|
expected_sys_reqs_by_exec = '"systemRequirementsByExecutable": ' + \
|
|
3325
|
-
json.dumps(
|
|
3324
|
+
json.dumps({
|
|
3325
|
+
applet_id: {
|
|
3326
|
+
"main": {"instanceType": "mem2_ssd1_v2_x2"},
|
|
3327
|
+
"other": {"instanceType": "mem2_hdd2_x1"}}})
|
|
3326
3328
|
self.assertIn(expected_sys_reqs_by_exec, stderr)
|
|
3327
3329
|
|
|
3328
3330
|
# parsing error
|
|
@@ -3399,12 +3401,14 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3399
3401
|
orig_job_id = run("dx run " + applet_id +
|
|
3400
3402
|
' -inumber=32 --name jobname --folder /output ' +
|
|
3401
3403
|
'--instance-type mem2_hdd2_x2 ' +
|
|
3402
|
-
'--instance-type-by-executable \'{"' + applet_id + '": {"*":
|
|
3404
|
+
'--instance-type-by-executable \'{"' + applet_id + '": {"*": "mem1_ssd1_v2_x2"}}\' '
|
|
3403
3405
|
'--tag Ψ --tag $hello.world ' +
|
|
3404
3406
|
'--property Σ_1^n=n --property $hello.=world ' +
|
|
3405
3407
|
'--priority normal ' +
|
|
3406
|
-
'--brief -y').strip()
|
|
3407
|
-
orig_job_desc = dxpy.api.job_describe(orig_job_id, {"defaultFields": True,
|
|
3408
|
+
'--brief -y').strip().split('\n')[-1]
|
|
3409
|
+
orig_job_desc = dxpy.api.job_describe(orig_job_id, {"defaultFields": True,
|
|
3410
|
+
"fields":{
|
|
3411
|
+
"runSystemRequirements":True, "runSystemRequirementsByExecutable":True, "mergedSystemRequirementsByExecutable":True}} )
|
|
3408
3412
|
# control
|
|
3409
3413
|
self.assertEqual(orig_job_desc['name'], 'jobname')
|
|
3410
3414
|
self.assertEqual(orig_job_desc['project'], self.project)
|
|
@@ -3423,8 +3427,10 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3423
3427
|
check_new_job_metadata(new_job_desc, orig_job_desc)
|
|
3424
3428
|
|
|
3425
3429
|
def get_new_job_desc(cmd_suffix):
|
|
3426
|
-
new_job_id = run("dx run --clone " + orig_job_id + " --brief -y " + cmd_suffix).strip()
|
|
3427
|
-
return dxpy.api.job_describe(new_job_id
|
|
3430
|
+
new_job_id = run("dx run --clone " + orig_job_id + " --brief -y " + cmd_suffix).strip().split('\n')[-1]
|
|
3431
|
+
return dxpy.api.job_describe(new_job_id, {"defaultFields": True,
|
|
3432
|
+
"fields":{
|
|
3433
|
+
"runSystemRequirements":True, "runSystemRequirementsByExecutable":True, "mergedSystemRequirementsByExecutable":True}})
|
|
3428
3434
|
|
|
3429
3435
|
# override applet
|
|
3430
3436
|
new_job_desc = get_new_job_desc(other_applet_id)
|
|
@@ -3483,8 +3489,14 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3483
3489
|
self.assertEqual(new_job_desc['input'], {"number2": 42})
|
|
3484
3490
|
check_new_job_metadata(new_job_desc, orig_job_desc, overridden_fields=['input'])
|
|
3485
3491
|
|
|
3486
|
-
# --instance-type override: original job with universal instance type
|
|
3492
|
+
# --instance-type override: original job with universal instance type
|
|
3487
3493
|
# override the blanket instance type
|
|
3494
|
+
orig_job_id = run("dx run " + applet_id +
|
|
3495
|
+
' --instance-type mem1_ssd1_v2_x2 ' +
|
|
3496
|
+
'--brief -y').strip().split('\n')[-1]
|
|
3497
|
+
orig_job_desc = dxpy.api.job_describe(orig_job_id, {"defaultFields": True,
|
|
3498
|
+
"fields": {"runSystemRequirements": True,
|
|
3499
|
+
"runSystemRequirementsByExecutable": True, "mergedSystemRequirementsByExecutable": True}})
|
|
3488
3500
|
new_job_desc = get_new_job_desc("--instance-type mem2_hdd2_x1")
|
|
3489
3501
|
self.assertEqual(new_job_desc['systemRequirements'],
|
|
3490
3502
|
{'*': {'instanceType': 'mem2_hdd2_x1'}})
|
|
@@ -3640,6 +3652,28 @@ dx-jobutil-add-output record_array $second_record --array
|
|
|
3640
3652
|
self.assertEqual(new_job_desc['systemRequirements']['some_ep']['fpgaDriver'], 'edico-1.4.5')
|
|
3641
3653
|
self.assertEqual(new_job_desc['systemRequirements']['some_ep']['clusterSpec']['bootstrapScript'], 'z.sh')
|
|
3642
3654
|
|
|
3655
|
+
# --instance-type and --instance-type-by-executable override
|
|
3656
|
+
orig_job_id = run("dx run " + other_applet_id +
|
|
3657
|
+
" --instance-type mem2_hdd2_x2" +
|
|
3658
|
+
" --instance-type-by-executable \'" +
|
|
3659
|
+
json.dumps({other_applet_id: {"some_ep": "mem1_ssd1_v2_x2", "some_other_ep": "mem2_hdd2_x4"}}) + "\'" +
|
|
3660
|
+
" --brief -y").strip().split('\n')[-1]
|
|
3661
|
+
orig_job_desc = dxpy.api.job_describe(orig_job_id, {"defaultFields": True, "fields": {
|
|
3662
|
+
"runSystemRequirements": True, "runSystemRequirementsByExecutable": True, "mergedSystemRequirementsByExecutable": True}})
|
|
3663
|
+
|
|
3664
|
+
new_job_desc = get_new_job_desc("--instance-type-by-executable \'" +
|
|
3665
|
+
json.dumps({other_applet_id: {"some_ep": "mem1_ssd1_v2_x8", "*": "mem2_hdd2_x1"}}) + "\'")
|
|
3666
|
+
|
|
3667
|
+
# cloned from original job systemRequirements
|
|
3668
|
+
self.assertEqual(new_job_desc["runSystemRequirements"], orig_job_desc["systemRequirements"])
|
|
3669
|
+
self.assertEqual(
|
|
3670
|
+
new_job_desc['runSystemRequirementsByExecutable'][other_applet_id]['some_ep']['instanceType'], 'mem1_ssd1_v2_x8')
|
|
3671
|
+
self.assertEqual(
|
|
3672
|
+
new_job_desc['runSystemRequirementsByExecutable'][other_applet_id]['*']['instanceType'], 'mem2_hdd2_x1')
|
|
3673
|
+
# cloned from original job mergedSystemRequirements
|
|
3674
|
+
self.assertEqual(
|
|
3675
|
+
new_job_desc['runSystemRequirementsByExecutable'][other_applet_id]['some_other_ep']['instanceType'], 'mem2_hdd2_x4')
|
|
3676
|
+
|
|
3643
3677
|
@unittest.skipUnless(testutil.TEST_RUN_JOBS,
|
|
3644
3678
|
'skipping tests that would run jobs')
|
|
3645
3679
|
def test_dx_describe_job_with_resolved_jbors(self):
|
|
@@ -3882,9 +3916,9 @@ class TestDXClientWorkflow(DXTestCaseBuildWorkflows):
|
|
|
3882
3916
|
change_inst_type_analysis_id = run("dx run --clone " + analysis_id +
|
|
3883
3917
|
" --instance-type mem2_hdd2_x2 --brief -y").strip()
|
|
3884
3918
|
change_inst_type_by_exec_analysis_id = run("dx run --clone " + analysis_id +
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3919
|
+
" --instance-type-by-executable \'" +
|
|
3920
|
+
json.dumps({applet_id: {"*": "mem2_ssd1_v2_x2"}}) +
|
|
3921
|
+
"\' --brief -y").strip()
|
|
3888
3922
|
|
|
3889
3923
|
time.sleep(25) # May need to wait for any new jobs to be created in the system
|
|
3890
3924
|
|
|
@@ -4004,9 +4038,9 @@ class TestDXClientWorkflow(DXTestCaseBuildWorkflows):
|
|
|
4004
4038
|
'--instance-type second=mem2_hdd2_x1 -y --brief').strip()
|
|
4005
4039
|
|
|
4006
4040
|
# request for an executable
|
|
4007
|
-
exec_req_id = run("dx run myworkflow" +
|
|
4008
|
-
|
|
4009
|
-
|
|
4041
|
+
exec_req_id = run("dx run myworkflow" +
|
|
4042
|
+
" --instance-type-by-executable \'" +
|
|
4043
|
+
json.dumps({applet_id: {"*": "mem2_ssd1_v2_x2"}}) +
|
|
4010
4044
|
"\' --brief -y").strip()
|
|
4011
4045
|
|
|
4012
4046
|
time.sleep(10) # give time for all jobs to be populated
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = '0.374.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.374.0 → dxpy-0.375.1}/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
|
|
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.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json
RENAMED
|
File without changes
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json
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
|
|
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
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json
RENAMED
|
File without changes
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh
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
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json
RENAMED
|
File without changes
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/src/code.py
RENAMED
|
File without changes
|
{dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/test/test.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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|