dxpy 0.399.0__tar.gz → 0.399.1__tar.gz

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