dxpy 0.385.0__tar.gz → 0.387.0__tar.gz

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