dxpy 0.399.1__tar.gz → 0.400.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 (190) hide show
  1. {dxpy-0.399.1 → dxpy-0.400.1}/PKG-INFO +1 -1
  2. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxproject.py +5 -1
  3. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/parsers.py +5 -0
  4. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/exceptions.py +3 -0
  5. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/app_asset_projects_ids_prod.json +2 -1
  6. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/app_asset_projects_ids_staging.json +2 -1
  7. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/awscli_assets.json +2 -1
  8. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/awscli_assets.staging.json +2 -1
  9. dxpy-0.400.1/dxpy/nextflow/default_nextflow_instance_types.json +10 -0
  10. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextaur_assets.json +2 -1
  11. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextaur_assets.staging.json +2 -1
  12. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextflow_assets.json +2 -1
  13. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextflow_assets.staging.json +2 -1
  14. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextflow_utils.py +9 -9
  15. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/scripts/dx.py +1 -0
  16. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/nextflow/src/nextflow.sh +61 -38
  17. dxpy-0.400.1/dxpy/toolkit_version.py +1 -0
  18. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/PKG-INFO +1 -1
  19. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/SOURCES.txt +1 -0
  20. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxclient.py +4 -3
  21. dxpy-0.399.1/dxpy/toolkit_version.py +0 -1
  22. {dxpy-0.399.1 → dxpy-0.400.1}/MANIFEST.in +0 -0
  23. {dxpy-0.399.1 → dxpy-0.400.1}/Readme.md +0 -0
  24. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/__init__.py +0 -0
  25. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/api.py +0 -0
  26. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/app_builder.py +0 -0
  27. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/app_categories.py +0 -0
  28. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/asset_builder.py +0 -0
  29. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/__init__.py +0 -0
  30. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/__init__.py +0 -0
  31. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/cmd_line_options_validator.py +0 -0
  32. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/data_transformations.py +0 -0
  33. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/dataset.py +0 -0
  34. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/json_validation_by_schema.py +0 -0
  35. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/schemas/__init__.py +0 -0
  36. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/schemas/assay_filtering_conditions.py +0 -0
  37. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/schemas/assay_filtering_json_schemas.py +0 -0
  38. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/schemas/input_arguments_validation_schemas.py +0 -0
  39. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/vizclient.py +0 -0
  40. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/vizserver_filters_from_json_parser.py +0 -0
  41. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/apollo/vizserver_payload_builder.py +0 -0
  42. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/auth.py +0 -0
  43. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/download_all_inputs.py +0 -0
  44. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxanalysis.py +0 -0
  45. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxapp.py +0 -0
  46. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxapp_container_functions.py +0 -0
  47. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxapplet.py +0 -0
  48. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxdatabase.py +0 -0
  49. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxdatabase_functions.py +0 -0
  50. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxdataobject_functions.py +0 -0
  51. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxfile.py +0 -0
  52. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxfile_functions.py +0 -0
  53. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxglobalworkflow.py +0 -0
  54. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxjob.py +0 -0
  55. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxrecord.py +0 -0
  56. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/dxworkflow.py +0 -0
  57. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/mount_all_inputs.py +0 -0
  58. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/bindings/search.py +0 -0
  59. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/__init__.py +0 -0
  60. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/cp.py +0 -0
  61. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/dataset_utilities.py +0 -0
  62. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/download.py +0 -0
  63. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/exec_io.py +0 -0
  64. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/help_messages.py +0 -0
  65. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/org.py +0 -0
  66. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/output_handling.py +0 -0
  67. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/cli/workflow.py +0 -0
  68. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/compat.py +0 -0
  69. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest.json +0 -0
  70. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging.json +0 -0
  71. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_staging_vep.json +0 -0
  72. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/Homo_sapiens_genes_manifest_vep.json +0 -0
  73. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/__init__.py +0 -0
  74. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/cohort_filter_payload.py +0 -0
  75. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/column_conditions.json +0 -0
  76. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/column_conversion.json +0 -0
  77. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/filter_to_payload.py +0 -0
  78. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/germline_utils.py +0 -0
  79. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/input_validation.py +0 -0
  80. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/input_validation_somatic.py +0 -0
  81. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/retrieve_allele_schema.json +0 -0
  82. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/retrieve_annotation_schema.json +0 -0
  83. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/retrieve_bins.py +0 -0
  84. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/retrieve_genotype_schema.json +0 -0
  85. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/return_columns_allele.json +0 -0
  86. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/return_columns_annotation.json +0 -0
  87. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/return_columns_genotype.json +0 -0
  88. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/return_columns_genotype_only.json +0 -0
  89. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dx_extract_utils/somatic_filter_payload.py +0 -0
  90. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/dxlog.py +0 -0
  91. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/executable_builder.py +0 -0
  92. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/ImageRef.py +0 -0
  93. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/ImageRefFactory.py +0 -0
  94. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/__init__.py +0 -0
  95. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/collect_images.py +0 -0
  96. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextflow_builder.py +0 -0
  97. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/nextflow/nextflow_templates.py +0 -0
  98. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/packages/__init__.py +0 -0
  99. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/scripts/__init__.py +0 -0
  100. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/scripts/dx_app_wizard.py +0 -0
  101. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/scripts/dx_build_app.py +0 -0
  102. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/scripts/dx_build_applet.py +0 -0
  103. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/ssh_tunnel_app_support.py +0 -0
  104. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/system_requirements.py +0 -0
  105. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/__init__.py +0 -0
  106. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/bash.py +0 -0
  107. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/python.py +0 -0
  108. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/Readme.md +0 -0
  109. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/basic/dxapp.json +0 -0
  110. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/basic/src/code.sh +0 -0
  111. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/parallelized/dxapp.json +0 -0
  112. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/parallelized/src/code.sh +0 -0
  113. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/scatter-process-gather/dxapp.json +0 -0
  114. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/bash/scatter-process-gather/src/code.sh +0 -0
  115. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/nextflow/dxapp.json +0 -0
  116. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/basic/dxapp.json +0 -0
  117. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/basic/src/code.py +0 -0
  118. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/basic/test/test.py +0 -0
  119. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/parallelized/dxapp.json +0 -0
  120. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/parallelized/src/code.py +0 -0
  121. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/parallelized/test/test.py +0 -0
  122. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/scatter-process-gather/dxapp.json +0 -0
  123. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/scatter-process-gather/src/code.py +0 -0
  124. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/templates/python/scatter-process-gather/test/test.py +0 -0
  125. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/templating/utils.py +0 -0
  126. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/__init__.py +0 -0
  127. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/batch_utils.py +0 -0
  128. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/completer.py +0 -0
  129. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/config.py +0 -0
  130. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/describe.py +0 -0
  131. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/exec_utils.py +0 -0
  132. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/executable_unbuilder.py +0 -0
  133. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/file_handle.py +0 -0
  134. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/file_load_utils.py +0 -0
  135. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/genomic_utils.py +0 -0
  136. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/job_log_client.py +0 -0
  137. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/local_exec_utils.py +0 -0
  138. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/pathmatch.py +0 -0
  139. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/pretty_print.py +0 -0
  140. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/printing.py +0 -0
  141. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/resolver.py +0 -0
  142. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/spelling_corrector.py +0 -0
  143. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/utils/version.py +0 -0
  144. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy/workflow_builder.py +0 -0
  145. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/dependency_links.txt +0 -0
  146. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/entry_points.txt +0 -0
  147. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/not-zip-safe +0 -0
  148. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/requires.txt +0 -0
  149. {dxpy-0.399.1 → dxpy-0.400.1}/dxpy.egg-info/top_level.txt +0 -0
  150. {dxpy-0.399.1 → dxpy-0.400.1}/requirements.txt +0 -0
  151. {dxpy-0.399.1 → dxpy-0.400.1}/requirements_setuptools.txt +0 -0
  152. {dxpy-0.399.1 → dxpy-0.400.1}/requirements_test.txt +0 -0
  153. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-clone-asset +0 -0
  154. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-docker +0 -0
  155. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-download-all-inputs +0 -0
  156. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-fetch-bundled-depends +0 -0
  157. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-generate-dxapp +0 -0
  158. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-add-output +0 -0
  159. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-dxlink +0 -0
  160. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-get-identity-token +0 -0
  161. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-new-job +0 -0
  162. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-parse-link +0 -0
  163. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-jobutil-report-error +0 -0
  164. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-log-stream +0 -0
  165. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-mount-all-inputs +0 -0
  166. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-notebook-reconnect +0 -0
  167. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-print-bash-vars +0 -0
  168. {dxpy-0.399.1 → dxpy-0.400.1}/scripts/dx-upload-all-outputs +0 -0
  169. {dxpy-0.399.1 → dxpy-0.400.1}/setup.cfg +0 -0
  170. {dxpy-0.399.1 → dxpy-0.400.1}/setup.py +0 -0
  171. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_batch.py +0 -0
  172. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_create_cohort.py +0 -0
  173. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_describe.py +0 -0
  174. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dx-docker.py +0 -0
  175. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dx_app_wizard.py +0 -0
  176. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dx_bash_helpers.py +0 -0
  177. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dx_completion.py +0 -0
  178. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dx_symlink.py +0 -0
  179. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxabs.py +0 -0
  180. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxasset.py +0 -0
  181. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxpy.py +0 -0
  182. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxpy_utils.py +0 -0
  183. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_dxunpack.py +0 -0
  184. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_extract_assay.py +0 -0
  185. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_extract_dataset.py +0 -0
  186. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_extract_expression.py +0 -0
  187. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_extract_somatic.py +0 -0
  188. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_nextflow.py +0 -0
  189. {dxpy-0.399.1 → dxpy-0.400.1}/test/test_nextflow_ImageRef.py +0 -0
  190. {dxpy-0.399.1 → dxpy-0.400.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.399.1
3
+ Version: 0.400.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
@@ -367,7 +367,7 @@ class DXProject(DXContainer):
367
367
  allowed_executables=None, unset_allowed_executables=None,
368
368
  database_ui_view_only=None, external_upload_restricted=None,
369
369
  database_results_restricted=None, unset_database_results_restricted=None,
370
- https_app_isolated_browsing=None, **kwargs):
370
+ https_app_isolated_browsing=None, https_app_isolated_browsing_options=None, **kwargs):
371
371
  """
372
372
  :param name: If provided, the new project name
373
373
  :type name: string
@@ -398,6 +398,8 @@ class DXProject(DXContainer):
398
398
  :param https_app_isolated_browsing: Whether all https access to jobs in this project should be wrapped in Isolated Browsing.
399
399
  If true, httpsApp-enabled executables must have httpsApp.shared_access set to 'NONE' to run in this project.
400
400
  :type https_app_isolated_browsing: boolean
401
+ :param https_app_isolated_browsing_options: Options for Isolated Browsing. See https://documentation.dnanexus.com/developer/api/data-containers/projects#api-method-project-xxxx-update for a list of supported keys.
402
+ :type https_app_isolated_browsing_options: dict
401
403
 
402
404
  Updates the project with the new fields. All fields are
403
405
  optional. Fields that are not provided are not changed.
@@ -435,6 +437,8 @@ class DXProject(DXContainer):
435
437
  update_hash["databaseResultsRestricted"] = None
436
438
  if https_app_isolated_browsing is not None:
437
439
  update_hash["httpsAppIsolatedBrowsing"] = https_app_isolated_browsing
440
+ if https_app_isolated_browsing_options is not None:
441
+ update_hash["httpsAppIsolatedBrowsingOptions"] = https_app_isolated_browsing_options
438
442
  dxpy.api.project_update(self._dxid, update_hash, **kwargs)
439
443
 
440
444
  def invite(self, invitee, level, send_email=True, **kwargs):
@@ -464,6 +464,11 @@ def get_update_project_args(args):
464
464
  input_params['externalUploadRestricted'] = args.external_upload_restricted == 'true'
465
465
  if args.https_app_isolated_browsing is not None:
466
466
  input_params['httpsAppIsolatedBrowsing'] = args.https_app_isolated_browsing == 'true'
467
+ if args.https_app_isolated_browsing_options is not None:
468
+ try:
469
+ input_params['httpsAppIsolatedBrowsingOptions'] = json.loads(args.https_app_isolated_browsing_options)
470
+ except ValueError as e:
471
+ raise DXParserError('Error while parsing the value for --https-app-isolated-browsing-options') from e
467
472
  return input_params
468
473
 
469
474
  def process_phi_param(args):
@@ -79,6 +79,9 @@ class PermissionDenied(DXAPIError):
79
79
  class SpendingLimitExceeded(DXAPIError):
80
80
  ''' Raised when the spending limit has been reached for the account that would be billed for this action. '''
81
81
 
82
+ class OrgExpired(DXAPIError):
83
+ ''' Raised when the organization that would be billed for this action has expired. '''
84
+
82
85
  class ResourceNotFound(DXAPIError):
83
86
  ''' Raised when a specified entity or resource could not be found. '''
84
87
 
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "project-GvGXBYV3pK4v9X7F2jv9zz94",
6
6
  "aws:us-east-1": "project-B6JG897KGbkGb6Z7pQ9Q02jG",
7
7
  "azure:westeurope": "project-FGZZFkjBPJqBXq1X84pq4VJf",
8
- "azure:westus": "project-F3vk1q09FX8Jxxp20pq6z8P9"
8
+ "azure:westus": "project-F3vk1q09FX8Jxxp20pq6z8P9",
9
+ "oci:us-ashburn-1": "project-J1q0ZJV6VQg98Q4Bz36JbQKJ"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "project-Gv8PVXk32gZ83kfp0pZ1v3V2",
6
6
  "aws:us-east-1": "project-G0zG4B808VFFYVz84FQkvF1K",
7
7
  "azure:westeurope": "project-G0zG4BQBq1XQby2F4FqQpPXv",
8
- "azure:westus": "project-G0zG4B09ZJ5gx1Vz4Fb8Q9XX"
8
+ "azure:westus": "project-G0zG4B09ZJ5gx1Vz4Fb8Q9XX",
9
+ "oci:us-ashburn-1": "project-J1q0ZJV6z2pJXY2Qqv8xvX5G"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-Gyv70B932Vy4bg78PFvbB4Q7",
6
6
  "aws:us-east-1": "record-Gyv6Q9j0PPgJQJ72226Gz7j7",
7
7
  "azure:westeurope": "record-Gyv73f0BKJkvjx5FPJq6F22b",
8
- "azure:westus": "record-Gyv77Vj9zv30Pfx8V890xQ6Q"
8
+ "azure:westus": "record-Gyv77Vj9zv30Pfx8V890xQ6Q",
9
+ "oci:us-ashburn-1": "record-J30Z62V6ZVX41GJBgkxbkFzp"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-Gyqp5F13fKQ44GfVP0VkKZ0z",
6
6
  "aws:us-east-1": "record-GyqkB3j08Gb14Pf0P8x5Xq5Q",
7
7
  "azure:westeurope": "record-Gyqp8g8B3BVZ4GfVP0VkKZ15",
8
- "azure:westus": "record-GyqpG7Q9Z3044GfVP0VkKZ1J"
8
+ "azure:westus": "record-GyqpG7Q9Z3044GfVP0VkKZ1J",
9
+ "oci:us-ashburn-1": "record-J30Xb1k6p6JxZFPzfpBfY6Qq"
9
10
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "aws:ap-southeast-2": "mem2_ssd1_v2_x4",
3
+ "aws:eu-central-1": "mem2_ssd1_v2_x4",
4
+ "aws:us-east-1": "mem2_ssd1_v2_x4",
5
+ "aws:me-south-1": "mem2_ssd1_v2_x4",
6
+ "azure:westeurope": "azure:mem2_ssd1_x4",
7
+ "azure:westus": "azure:mem2_ssd1_x4",
8
+ "aws:eu-west-2-g": "mem2_ssd1_v2_x4",
9
+ "oci:us-ashburn-1": "oci:mem2_ssd1_v3i_x4"
10
+ }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-GzyP85V306B9xkQ4Pv1yf7Kz",
6
6
  "aws:us-east-1": "record-GzyP6580KGjqV4gp6QXFGBzX",
7
7
  "azure:westeurope": "record-GzyP9z0BzJx8zjf6bpvY6Yqv",
8
- "azure:westus": "record-GzyP9vQ9zggPyfkj5GKKYVG5"
8
+ "azure:westus": "record-GzyP9vQ9zggPyfkj5GKKYVG5",
9
+ "oci:us-ashburn-1": "record-J30Z6396B086xYKfqQj5gG1j"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-GzyJ2GV311jBJYzx2XpgZXQ0",
6
6
  "aws:us-east-1": "record-GzyJ08002j9B36YfkbQQxpkf",
7
7
  "azure:westeurope": "record-GzyJ4B8B095jZ8F4BF5p2Ggz",
8
- "azure:westus": "record-GzyJ3q89X1QBpvfvgx9bZzgP"
8
+ "azure:westus": "record-GzyJ3q89X1QBpvfvgx9bZzgP",
9
+ "oci:us-ashburn-1": "record-J30XbBV6j7q0jq6q1Jfz5650"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-GzyP8593PgfZjYXPJP9FFqV4",
6
6
  "aws:us-east-1": "record-GzyP6X00F3gq8p88gP7PQFkx",
7
7
  "azure:westeurope": "record-GzyPB98BB2b867v2KK1BXx8p",
8
- "azure:westus": "record-GzyPB6j9b5Yy81G8XV89jkZX"
8
+ "azure:westus": "record-GzyPB6j9b5Yy81G8XV89jkZX",
9
+ "oci:us-ashburn-1": "record-J30Z63V67qG7Y9ZfxjPpp90G"
9
10
  }
@@ -5,5 +5,6 @@
5
5
  "aws:me-south-1": "record-GzyJ2Y93z3b2Q4202Jpx1j78",
6
6
  "aws:us-east-1": "record-GzyJ19j08Ffppvfvgx9bZzfz",
7
7
  "azure:westeurope": "record-GzyJ4QjByJz29GJg3K3Gv2yB",
8
- "azure:westus": "record-GzyJ45Q9xQPB36YfkbQQxpp8"
8
+ "azure:westus": "record-GzyJ45Q9xQPB36YfkbQQxpp8",
9
+ "oci:us-ashburn-1": "record-J30Xbb16kfQfgJqjXGf7561F"
9
10
  }
@@ -149,15 +149,14 @@ def get_regional_options(region, resources_dir, profile, cache_docker, nextflow_
149
149
 
150
150
 
151
151
  def get_instance_type(region):
152
- instance_type = {
153
- "aws:ap-southeast-2": "mem2_ssd1_v2_x4",
154
- "aws:eu-central-1": "mem2_ssd1_v2_x4",
155
- "aws:us-east-1": "mem2_ssd1_v2_x4",
156
- "aws:me-south-1": "mem2_ssd1_v2_x4",
157
- "azure:westeurope": "azure:mem2_ssd1_x4",
158
- "azure:westus": "azure:mem2_ssd1_x4",
159
- "aws:eu-west-2-g": "mem2_ssd1_v2_x4"
160
- }.get(region)
152
+ json_file_path = path.join(path.dirname(dxpy.__file__), 'nextflow', 'default_nextflow_instance_types.json')
153
+ try:
154
+ with open(json_file_path, 'r') as f:
155
+ instance_type_mapping = json.load(f)
156
+ except FileNotFoundError:
157
+ raise dxpy.exceptions.ResourceNotFound(f"Instance types file not found at {json_file_path}.")
158
+
159
+ instance_type = instance_type_mapping.get(region)
161
160
  if not instance_type:
162
161
  raise dxpy.exceptions.ResourceNotFound("Instance type is not specified for region {}.".format(region))
163
162
  return instance_type
@@ -184,6 +183,7 @@ def get_nextflow_assets(region):
184
183
  with open(nextaur_assets, 'r') as nextaur_f, open(nextflow_assets, 'r') as nextflow_f, open(awscli_assets, 'r') as awscli_f:
185
184
  return json.load(nextaur_f)[region], json.load(nextflow_f)[region], json.load(awscli_f)[region]
186
185
 
186
+
187
187
  def get_nested(args, arg_path):
188
188
  """
189
189
  :param args: extra args from command input
@@ -5416,6 +5416,7 @@ parser_update_project.add_argument('--https-app-isolated-browsing',
5416
5416
  help="Whether all https access to jobs in this project should be wrapped in Isolated Browsing."
5417
5417
  " If true, httpsApp-enabled executables must have httpsApp.shared_access set to 'NONE' to run in this project.",
5418
5418
  choices=["true", "false"])
5419
+ parser_update_project.add_argument('--https-app-isolated-browsing-options', help="A JSON string with options for Isolated Browsing. See https://documentation.dnanexus.com/developer/api/data-containers/projects#api-method-project-xxxx-update for a list of supported keys.", type=str)
5419
5420
  allowed_executables_group = parser_update_project.add_mutually_exclusive_group()
5420
5421
  allowed_executables_group.add_argument('--allowed-executables', help='Executable ID(s) this project is allowed to run. This operation overrides any existing list of executables.', type=str, nargs="+")
5421
5422
  allowed_executables_group.add_argument('--unset-allowed-executables', help='Removes any restriction to run executables as set by --allowed-executables', action='store_true')
@@ -104,7 +104,7 @@ main() {
104
104
  $nextflow_pipeline_params)"
105
105
 
106
106
  NEXTFLOW_CMD_ENV+=("${applet_runtime_inputs[@]}")
107
-
107
+
108
108
  AWS_ENV="$HOME/.dx-aws.env"
109
109
 
110
110
  get_nextflow_environment "${NEXTFLOW_CMD_ENV[@]}"
@@ -112,10 +112,10 @@ main() {
112
112
 
113
113
  # Login to AWS, if configured
114
114
  aws_login
115
- aws_relogin_loop & AWS_RELOGIN_PID=$!
115
+ refresh_web_identity_token_loop & TOKEN_REFRESH_PID=$!
116
116
 
117
117
  set_vars_session_and_cache
118
-
118
+
119
119
  if [[ $preserve_cache == true ]]; then
120
120
  set_job_properties_cache
121
121
  check_cache_db_storage_limit
@@ -168,7 +168,7 @@ main() {
168
168
  wait $NXF_EXEC_PID
169
169
  ret=$?
170
170
 
171
- kill "$AWS_RELOGIN_PID"
171
+ kill "$TOKEN_REFRESH_PID" 2>/dev/null || true
172
172
  exit $ret
173
173
  }
174
174
 
@@ -243,7 +243,7 @@ nf_task_entry() {
243
243
  [[ -f $CREDENTIALS ]] && docker_registry_login || echo "no docker credential available"
244
244
  dx download "$DX_WORKSPACE_ID:/.dx-aws.env" -o $AWS_ENV -f --no-progress 2>/dev/null || true
245
245
  aws_login
246
- aws_relogin_loop & AWS_RELOGIN_PID=$!
246
+ refresh_web_identity_token_loop & TOKEN_REFRESH_PID=$!
247
247
  # capture the exit code
248
248
  trap nf_task_exit EXIT
249
249
 
@@ -256,12 +256,13 @@ nf_task_entry() {
256
256
  set +e
257
257
  bash .command.run > >(tee .command.log) 2>&1
258
258
  export exit_code=$?
259
- kill "$AWS_RELOGIN_PID"
260
259
  dx set_properties ${DX_JOB_ID} nextflow_exit_code=$exit_code
261
260
  set -e
262
261
  }
263
262
 
264
263
  nf_task_exit() {
264
+ kill "$TOKEN_REFRESH_PID" 2>/dev/null || true
265
+
265
266
  if [ -f .command.log ]; then
266
267
  if [[ $USING_S3_WORKDIR == true ]]; then
267
268
  aws s3 cp .command.log "${cmd_log_file}"
@@ -336,34 +337,56 @@ aws_login() {
336
337
  if [ -f "$AWS_ENV" ]; then
337
338
  source $AWS_ENV
338
339
  detect_if_using_s3_workdir
339
-
340
- # aws env file example values:
341
- # "iamRoleArnToAssume", "jobTokenAudience", "jobTokenSubjectClaims", "awsRegion"
342
- roleSessionName="dnanexus_${DX_JOB_ID}"
343
- job_id_token=$(dx-jobutil-get-identity-token --aud ${jobTokenAudience} --subject_claims ${jobTokenSubjectClaims})
344
- output=$(aws sts assume-role-with-web-identity --role-arn $iamRoleArnToAssume --role-session-name $roleSessionName --web-identity-token $job_id_token --duration-seconds 3600)
345
- mkdir -p /home/dnanexus/.aws/
346
-
347
- cat <<EOF > /home/dnanexus/.aws/credentials
348
- [default]
349
- aws_access_key_id = $(echo "$output" | jq -r '.Credentials.AccessKeyId')
350
- aws_secret_access_key = $(echo "$output" | jq -r '.Credentials.SecretAccessKey')
351
- aws_session_token = $(echo "$output" | jq -r '.Credentials.SessionToken')
352
- EOF
353
- cat <<EOF > /home/dnanexus/.aws/config
354
- [default]
355
- region = $awsRegion
356
- EOF
357
- echo "Successfully authenticated to AWS - $(aws sts get-caller-identity)"
340
+
341
+ local web_identity_token_file="/tmp/aws_web_identity_token"
342
+
343
+ dx-jobutil-get-identity-token --aud ${jobTokenAudience} --subject_claims ${jobTokenSubjectClaims} > ${web_identity_token_file}
344
+
345
+ export AWS_REGION="$awsRegion"
346
+ export AWS_ROLE_ARN="$iamRoleArnToAssume"
347
+ export AWS_ROLE_SESSION_NAME="dnanexus_${DX_JOB_ID}"
348
+ export AWS_WEB_IDENTITY_TOKEN_FILE="$web_identity_token_file"
349
+
350
+ # Clean up any old AWS config files to avoid conflicts. The SDK will now ignore ~/.aws/config and ~/.aws/credentials because the environment variables take precedence.
351
+ rm -rf /home/dnanexus/.aws/
352
+
353
+ # This explicit check is added to ensure that existing pytest tests for invalid credentials still fail correctly.
354
+ # In the new model, the AWS SDK would normally handle this lazily, but the tests expect an immediate failure.
355
+ aws sts assume-role-with-web-identity --role-arn "$iamRoleArnToAssume" \
356
+ --role-session-name "dnanexus_${DX_JOB_ID}" \
357
+ --web-identity-token "$(cat "${web_identity_token_file}")" > /dev/null
358
+
359
+ echo "Successfully configured AWS with Web Identity Token File."
360
+ # Optional sanity check; SDK/CLI will now do STS AssumeRoleWithWebIdentity on demand
361
+ aws sts get-caller-identity >/dev/null 2>&1 || echo "Note: initial STS call deferred to Nextflow/AWS SDK."
358
362
  fi
359
363
  }
360
364
 
361
- aws_relogin_loop() {
365
+ refresh_web_identity_token_loop() {
366
+ # The DNAnexus job identity token expires in ~5 minutes.
367
+ # Refresh the OIDC token file proactively so the AWS SDK v2 can re-assume the role on demand.
368
+
362
369
  while true; do
363
- sleep 3300 # relogin every 55 minutes, first login is done separately, so we wait before the login
364
- if [ -f "$AWS_ENV" ]; then
365
- aws_login
366
- fi
370
+ sleep 240 # 4 minutes
371
+
372
+ if [ -f "$AWS_ENV" ]; then
373
+ source "$AWS_ENV"
374
+
375
+ local tmp_token_file="${AWS_WEB_IDENTITY_TOKEN_FILE}.tmp"
376
+ local attempt=0
377
+
378
+ while [ "$attempt" -le 3 ]; do
379
+ if dx-jobutil-get-identity-token --aud "${jobTokenAudience}" --subject_claims "${jobTokenSubjectClaims}" > "$tmp_token_file"; then
380
+ mv -f "$tmp_token_file" "$AWS_WEB_IDENTITY_TOKEN_FILE"
381
+
382
+ break
383
+ else
384
+ echo "WARNING: AWS token refresh failed (attempt $((attempt+1))/3)" >&2
385
+ sleep 5 # wait 5s before retry
386
+ fi
387
+ attempt=$((attempt+1))
388
+ done
389
+ fi
367
390
  done
368
391
  }
369
392
 
@@ -553,8 +576,8 @@ get_resume_session_id() {
553
576
 
554
577
  valid_id_pattern='^\{?[A-Z0-9a-z]{8}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{12}\}?$'
555
578
  [[ "$PREV_JOB_SESSION_ID" =~ $valid_id_pattern ]] ||
556
- dx-jobutil-report-error "Invalid resume value. Please provide either \"true\", \"last\", or \"sessionID\".
557
- If a sessionID was provided, Nextflow cached content could not be found under $DX_CACHEDIR/$PREV_JOB_SESSION_ID/.
579
+ dx-jobutil-report-error "Invalid resume value. Please provide either \"true\", \"last\", or \"sessionID\".
580
+ If a sessionID was provided, Nextflow cached content could not be found under $DX_CACHEDIR/$PREV_JOB_SESSION_ID/.
558
581
  Please provide the exact sessionID for \"resume\" or run without resume."
559
582
 
560
583
  NXF_UUID=$PREV_JOB_SESSION_ID
@@ -596,8 +619,8 @@ check_no_concurrent_job_same_cache() {
596
619
  )
597
620
 
598
621
  [[ -n $FIRST_RESUMED_JOB && $DX_JOB_ID == $FIRST_RESUMED_JOB ]] ||
599
- dx-jobutil-report-error "There is at least one other non-terminal state job with the same sessionID $NXF_UUID.
600
- Please wait until all other jobs sharing the same sessionID to enter their terminal state and rerun,
622
+ dx-jobutil-report-error "There is at least one other non-terminal state job with the same sessionID $NXF_UUID.
623
+ Please wait until all other jobs sharing the same sessionID to enter their terminal state and rerun,
601
624
  or run without preserve_cache set to true."
602
625
  }
603
626
 
@@ -605,12 +628,12 @@ restore_cache_and_set_resume_cmd() {
605
628
  # download latest cache.tar from $DX_CACHEDIR/$PREV_JOB_SESSION_ID/
606
629
  PREV_JOB_CACHE_FILE=$(
607
630
  dx api system findDataObjects \
608
- '{"visibility": "either",
631
+ '{"visibility": "either",
609
632
  "name":"cache.tar",
610
633
  "scope": {
611
- "project": "'$DX_PROJECT_CONTEXT_ID'",
612
- "folder": "/.nextflow_cache_db/'$NXF_UUID'",
613
- "recurse": false},
634
+ "project": "'$DX_PROJECT_CONTEXT_ID'",
635
+ "folder": "/.nextflow_cache_db/'$NXF_UUID'",
636
+ "recurse": false},
614
637
  "describe": true}' 2>/dev/null |
615
638
  jq -r '.results | sort_by(.describe.created)[-1] | .id // empty'
616
639
  )
@@ -0,0 +1 @@
1
+ version = '0.400.1'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dxpy
3
- Version: 0.399.1
3
+ Version: 0.400.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
@@ -111,6 +111,7 @@ dxpy/nextflow/app_asset_projects_ids_staging.json
111
111
  dxpy/nextflow/awscli_assets.json
112
112
  dxpy/nextflow/awscli_assets.staging.json
113
113
  dxpy/nextflow/collect_images.py
114
+ dxpy/nextflow/default_nextflow_instance_types.json
114
115
  dxpy/nextflow/nextaur_assets.json
115
116
  dxpy/nextflow/nextaur_assets.staging.json
116
117
  dxpy/nextflow/nextflow_assets.json
@@ -11112,10 +11112,11 @@ class TestDXCp(DXTestCase):
11112
11112
  fname1 = self.gen_uniq_fname()
11113
11113
  create_file_in_project(fname1, self.proj_id1)
11114
11114
 
11115
- # The file {proj_id1}:/{f} exists, however, {proj_id1}/{f} does not
11116
- expected_err_msg = "ResolutionError: The specified folder could not be found in {p}".format(p=self.project)
11115
+ # The file {proj_id1}:/{f} exists, however, {proj_id1}/non_existing_folder/{f} does not
11116
+ non_existing_folder_name = "/non_existing_folder"
11117
+ expected_err_msg = "Folder \"{fn}\" does not exist in project \"{p1}\"".format(p1=self.proj_id1, fn=non_existing_folder_name)
11117
11118
  with self.assertSubprocessFailure(stderr_regexp=expected_err_msg, exit_code=3):
11118
- run("dx cp {p1}/{f} {p2}:/".format(p1=self.proj_id1, f=fname1, p2=self.proj_id2))
11119
+ run("dx cp {p1}:{fn}/{f} {p2}:/".format(p1=self.proj_id1, fn=non_existing_folder_name , f=fname1, p2=self.proj_id2))
11119
11120
 
11120
11121
  with self.assertSubprocessFailure(stderr_regexp="The destination folder does not exist",
11121
11122
  exit_code=3):
@@ -1 +0,0 @@
1
- version = '0.399.1'
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