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.
Files changed (187) hide show
  1. {dxpy-0.374.0 → dxpy-0.375.1}/PKG-INFO +1 -1
  2. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapplet.py +1 -1
  3. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx.py +24 -5
  4. dxpy-0.375.1/dxpy/toolkit_version.py +1 -0
  5. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/PKG-INFO +1 -1
  6. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-new-job +6 -3
  7. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_bash_helpers.py +17 -47
  8. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxclient.py +50 -16
  9. dxpy-0.374.0/dxpy/toolkit_version.py +0 -1
  10. {dxpy-0.374.0 → dxpy-0.375.1}/MANIFEST.in +0 -0
  11. {dxpy-0.374.0 → dxpy-0.375.1}/Readme.md +0 -0
  12. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/__init__.py +0 -0
  13. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/api.py +0 -0
  14. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/app_builder.py +0 -0
  15. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/app_categories.py +0 -0
  16. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/asset_builder.py +0 -0
  17. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/__init__.py +0 -0
  18. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/__init__.py +0 -0
  19. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/cmd_line_options_validator.py +0 -0
  20. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/data_transformations.py +0 -0
  21. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/dataset.py +0 -0
  22. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/json_validation_by_schema.py +0 -0
  23. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/__init__.py +0 -0
  24. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/assay_filtering_conditions.py +0 -0
  25. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/assay_filtering_json_schemas.py +0 -0
  26. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py +0 -0
  27. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizclient.py +0 -0
  28. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizserver_filters_from_json_parser.py +0 -0
  29. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/apollo/vizserver_payload_builder.py +0 -0
  30. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/auth.py +0 -0
  31. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/download_all_inputs.py +0 -0
  32. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxanalysis.py +0 -0
  33. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapp.py +0 -0
  34. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxapp_container_functions.py +0 -0
  35. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdatabase.py +0 -0
  36. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdatabase_functions.py +0 -0
  37. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxdataobject_functions.py +0 -0
  38. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxfile.py +0 -0
  39. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxfile_functions.py +0 -0
  40. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxglobalworkflow.py +0 -0
  41. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxjob.py +0 -0
  42. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxproject.py +0 -0
  43. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxrecord.py +0 -0
  44. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/dxworkflow.py +0 -0
  45. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/mount_all_inputs.py +0 -0
  46. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/bindings/search.py +0 -0
  47. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/__init__.py +0 -0
  48. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/cp.py +0 -0
  49. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/dataset_utilities.py +0 -0
  50. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/download.py +0 -0
  51. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/exec_io.py +0 -0
  52. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/help_messages.py +0 -0
  53. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/org.py +0 -0
  54. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/output_handling.py +0 -0
  55. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/parsers.py +0 -0
  56. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/cli/workflow.py +0 -0
  57. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/compat.py +0 -0
  58. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest.json +0 -0
  59. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json +0 -0
  60. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json +0 -0
  61. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_vep.json +0 -0
  62. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/__init__.py +0 -0
  63. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/cohort_filter_payload.py +0 -0
  64. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/column_conditions.json +0 -0
  65. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/column_conversion.json +0 -0
  66. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/filter_to_payload.py +0 -0
  67. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/germline_utils.py +0 -0
  68. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/input_validation.py +0 -0
  69. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/input_validation_somatic.py +0 -0
  70. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_allele_schema.json +0 -0
  71. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_annotation_schema.json +0 -0
  72. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_bins.py +0 -0
  73. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/retrieve_genotype_schema.json +0 -0
  74. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_allele.json +0 -0
  75. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_annotation.json +0 -0
  76. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_genotype.json +0 -0
  77. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/return_columns_genotype_only.json +0 -0
  78. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dx_extract_utils/somatic_filter_payload.py +0 -0
  79. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/dxlog.py +0 -0
  80. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/exceptions.py +0 -0
  81. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/executable_builder.py +0 -0
  82. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/ImageRef.py +0 -0
  83. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/ImageRefFactory.py +0 -0
  84. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/__init__.py +0 -0
  85. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/awscli_assets.json +0 -0
  86. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/awscli_assets.staging.json +0 -0
  87. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/collect_images.py +0 -0
  88. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextaur_assets.json +0 -0
  89. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextaur_assets.staging.json +0 -0
  90. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_assets.json +0 -0
  91. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_assets.staging.json +0 -0
  92. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_builder.py +0 -0
  93. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_templates.py +0 -0
  94. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/nextflow/nextflow_utils.py +0 -0
  95. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/packages/__init__.py +0 -0
  96. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/__init__.py +0 -0
  97. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_app_wizard.py +0 -0
  98. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_build_app.py +0 -0
  99. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/scripts/dx_build_applet.py +0 -0
  100. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/ssh_tunnel_app_support.py +0 -0
  101. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/system_requirements.py +0 -0
  102. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/__init__.py +0 -0
  103. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/bash.py +0 -0
  104. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/python.py +0 -0
  105. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/Readme.md +0 -0
  106. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/basic/dxapp.json +0 -0
  107. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/basic/src/code.sh +0 -0
  108. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/parallelized/dxapp.json +0 -0
  109. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/parallelized/src/code.sh +0 -0
  110. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json +0 -0
  111. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh +0 -0
  112. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/nextflow/dxapp.json +0 -0
  113. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/nextflow/src/nextflow.sh +0 -0
  114. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/dxapp.json +0 -0
  115. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/src/code.py +0 -0
  116. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/basic/test/test.py +0 -0
  117. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/dxapp.json +0 -0
  118. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/src/code.py +0 -0
  119. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/parallelized/test/test.py +0 -0
  120. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json +0 -0
  121. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/src/code.py +0 -0
  122. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/templates/python/scatter-process-gather/test/test.py +0 -0
  123. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/templating/utils.py +0 -0
  124. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/__init__.py +0 -0
  125. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/batch_utils.py +0 -0
  126. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/completer.py +0 -0
  127. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/config.py +0 -0
  128. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/describe.py +0 -0
  129. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/exec_utils.py +0 -0
  130. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/executable_unbuilder.py +0 -0
  131. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/file_handle.py +0 -0
  132. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/file_load_utils.py +0 -0
  133. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/genomic_utils.py +0 -0
  134. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/job_log_client.py +0 -0
  135. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/local_exec_utils.py +0 -0
  136. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/pathmatch.py +0 -0
  137. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/pretty_print.py +0 -0
  138. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/printing.py +0 -0
  139. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/resolver.py +0 -0
  140. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/spelling_corrector.py +0 -0
  141. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/utils/version.py +0 -0
  142. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy/workflow_builder.py +0 -0
  143. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/SOURCES.txt +0 -0
  144. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/dependency_links.txt +0 -0
  145. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/entry_points.txt +0 -0
  146. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/not-zip-safe +0 -0
  147. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/requires.txt +0 -0
  148. {dxpy-0.374.0 → dxpy-0.375.1}/dxpy.egg-info/top_level.txt +0 -0
  149. {dxpy-0.374.0 → dxpy-0.375.1}/requirements.txt +0 -0
  150. {dxpy-0.374.0 → dxpy-0.375.1}/requirements_setuptools.txt +0 -0
  151. {dxpy-0.374.0 → dxpy-0.375.1}/requirements_test.txt +0 -0
  152. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-clone-asset +0 -0
  153. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-docker +0 -0
  154. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-download-all-inputs +0 -0
  155. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-fetch-bundled-depends +0 -0
  156. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-generate-dxapp +0 -0
  157. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-add-output +0 -0
  158. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-dxlink +0 -0
  159. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-get-identity-token +0 -0
  160. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-parse-link +0 -0
  161. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-jobutil-report-error +0 -0
  162. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-log-stream +0 -0
  163. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-mount-all-inputs +0 -0
  164. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-notebook-reconnect +0 -0
  165. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-print-bash-vars +0 -0
  166. {dxpy-0.374.0 → dxpy-0.375.1}/scripts/dx-upload-all-outputs +0 -0
  167. {dxpy-0.374.0 → dxpy-0.375.1}/setup.cfg +0 -0
  168. {dxpy-0.374.0 → dxpy-0.375.1}/setup.py +0 -0
  169. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_batch.py +0 -0
  170. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_create_cohort.py +0 -0
  171. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_describe.py +0 -0
  172. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx-docker.py +0 -0
  173. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_app_wizard.py +0 -0
  174. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_completion.py +0 -0
  175. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dx_symlink.py +0 -0
  176. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxabs.py +0 -0
  177. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxasset.py +0 -0
  178. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxpy.py +0 -0
  179. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxpy_utils.py +0 -0
  180. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_dxunpack.py +0 -0
  181. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_assay.py +0 -0
  182. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_dataset.py +0 -0
  183. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_expression.py +0 -0
  184. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_extract_somatic.py +0 -0
  185. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_nextflow.py +0 -0
  186. {dxpy-0.374.0 → dxpy-0.375.1}/test/test_nextflow_ImageRef.py +0 -0
  187. {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.374.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 preserve_job_outputs: boolean
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
- # store runtime --instance-type-by-executable {executable:{entrypoint:{'instanceType':xxx}}} as systemRequirementsByExecutable
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
- requested_system_requirements_by_executable = SystemRequirementsDict(args.instance_type_by_executable).as_dict() or cloned_system_requirements_by_executable
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.374.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"] = SystemRequirementsDict(args.instance_type_by_executable).as_dict()
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
- "--instance-type "
923
- + pipes.quote(
924
- json.dumps(
925
- {"main": "mem2_hdd2_x2", "other_function": "mem2_hdd2_x1"}
926
- )
927
- ),
928
- {
929
- "systemRequirements": {
930
- "main": {"instanceType": "mem2_hdd2_x2"},
931
- "other_function": {"instanceType": "mem2_hdd2_x1"},
932
- }
933
- },
934
- ),
935
- (
936
- "--instance-type-by-executable "
937
- + pipes.quote(
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
- "instanceType": "mem2_ssd1_v2_x2",
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(requested_inst_type_by_exec)
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 + '": {"*": {"instanceType": "mem1_ssd1_v2_x2"}}}\' '
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, "fields":{"runSystemRequirements":True, "runSystemRequirementsByExecutable":True, "mergedSystemRequirementsByExecutable":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
- " --instance-type-by-executable \'" +
3886
- json.dumps({applet_id:{"*": {"instanceType": "mem2_ssd1_v2_x2"}}}) +
3887
- "\' --brief -y").strip()
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
- " --instance-type-by-executable \'" +
4009
- json.dumps({applet_id:{"*": {"instanceType": "mem2_ssd1_v2_x2"}}}) +
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
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