aignostics 0.2.61__tar.gz → 0.2.64__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 (210) hide show
  1. {aignostics-0.2.61 → aignostics-0.2.64}/PKG-INFO +4 -4
  2. {aignostics-0.2.61 → aignostics-0.2.64}/examples/notebook.py +1 -1
  3. {aignostics-0.2.61 → aignostics-0.2.64}/pyproject.toml +5 -5
  4. aignostics-0.2.64/src/aignostics/application/_gui/assets/.gitignore +1 -0
  5. aignostics-0.2.64/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  6. aignostics-0.2.64/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  7. aignostics-0.2.64/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  8. aignostics-0.2.64/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  9. aignostics-0.2.64/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  10. aignostics-0.2.64/src/aignostics/bucket/_cli.py +324 -0
  11. aignostics-0.2.64/src/aignostics/bucket/_gui.py +414 -0
  12. aignostics-0.2.64/src/aignostics/bucket/_service.py +627 -0
  13. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/dataset/_gui.py +1 -1
  14. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_authentication.py +4 -1
  15. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_service.py +1 -1
  16. aignostics-0.2.61/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  17. aignostics-0.2.61/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  18. aignostics-0.2.61/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  19. aignostics-0.2.61/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  20. aignostics-0.2.61/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  21. aignostics-0.2.61/src/aignostics/bucket/_cli.py +0 -148
  22. aignostics-0.2.61/src/aignostics/bucket/_gui.py +0 -172
  23. aignostics-0.2.61/src/aignostics/bucket/_service.py +0 -387
  24. {aignostics-0.2.61 → aignostics-0.2.64}/.gitignore +0 -0
  25. {aignostics-0.2.61 → aignostics-0.2.64}/LICENSE +0 -0
  26. {aignostics-0.2.61 → aignostics-0.2.64}/README.md +0 -0
  27. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/.openapi-generator/FILES +0 -0
  28. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/.openapi-generator/VERSION +0 -0
  29. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  30. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/api_client.py +0 -0
  31. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/api_response.py +0 -0
  32. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/configuration.py +0 -0
  33. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/exceptions.py +0 -0
  34. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  35. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  36. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  37. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  38. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  39. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  40. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  41. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  42. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  43. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  44. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  45. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  46. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  47. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  48. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  49. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  50. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  51. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  52. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  53. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  54. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  55. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  56. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  57. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/aignx/codegen/rest.py +0 -0
  58. {aignostics-0.2.61 → aignostics-0.2.64}/codegen/out/docs/PublicApi.md +0 -0
  59. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  60. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/s3.rst +0 -0
  61. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  62. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  63. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  64. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  65. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  66. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  67. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  68. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  69. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  70. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  71. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  72. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  73. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  74. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  75. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  76. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  77. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  78. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  79. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  80. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  81. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  82. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  83. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  84. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  85. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  86. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  87. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  88. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  89. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  90. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  91. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  92. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  93. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  94. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  95. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  96. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  97. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  98. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  99. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  100. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  101. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  102. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  103. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  104. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  105. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  106. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  107. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  108. {aignostics-0.2.61 → aignostics-0.2.64}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  109. {aignostics-0.2.61 → aignostics-0.2.64}/examples/__init__.py +0 -0
  110. {aignostics-0.2.61 → aignostics-0.2.64}/examples/notebook.ipynb +0 -0
  111. {aignostics-0.2.61 → aignostics-0.2.64}/examples/script.py +0 -0
  112. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/__init__.py +0 -0
  113. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/__init__.py +0 -0
  114. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_cli.py +0 -0
  115. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_frame.py +0 -0
  116. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
  117. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  118. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_page_builder.py +0 -0
  119. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_page_index.py +0 -0
  120. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/_utils.py +0 -0
  121. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  122. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  123. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  124. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  125. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  126. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  127. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  128. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  129. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  130. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  131. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_service.py +0 -0
  132. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_settings.py +0 -0
  133. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/application/_utils.py +0 -0
  134. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/bucket/__init__.py +0 -0
  135. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/bucket/_settings.py +0 -0
  136. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  137. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  138. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/cli.py +0 -0
  139. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/constants.py +0 -0
  140. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/dataset/__init__.py +0 -0
  141. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/dataset/_cli.py +0 -0
  142. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/dataset/_service.py +0 -0
  143. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  144. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/gui/__init__.py +0 -0
  145. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/gui/_frame.py +0 -0
  146. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/gui/_theme.py +0 -0
  147. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  148. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/gui/assets/logo.png +0 -0
  149. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/notebook/__init__.py +0 -0
  150. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/notebook/_gui.py +0 -0
  151. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/notebook/_notebook.py +0 -0
  152. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/notebook/_service.py +0 -0
  153. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/notebook/assets/python.lottie +0 -0
  154. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/__init__.py +0 -0
  155. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_cli.py +0 -0
  156. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_client.py +0 -0
  157. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_constants.py +0 -0
  158. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_messages.py +0 -0
  159. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_settings.py +0 -0
  160. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/_utils.py +0 -0
  161. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/resources/__init__.py +0 -0
  162. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/resources/applications.py +0 -0
  163. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/resources/runs.py +0 -0
  164. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/platform/resources/utils.py +0 -0
  165. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/__init__.py +0 -0
  166. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/_cli.py +0 -0
  167. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/_gui.py +0 -0
  168. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/_service.py +0 -0
  169. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/_settings.py +0 -0
  170. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/assets/download.lottie +0 -0
  171. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  172. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/assets/update.lottie +0 -0
  173. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/scripts/add.groovy +0 -0
  174. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  175. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  176. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/qupath/scripts/test.groovy +0 -0
  177. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/__init__.py +0 -0
  178. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/_cli.py +0 -0
  179. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/_exceptions.py +0 -0
  180. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/_gui.py +0 -0
  181. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/_service.py +0 -0
  182. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/_settings.py +0 -0
  183. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/system/assets/system.lottie +0 -0
  184. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/third_party/bottle.py +0 -0
  185. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/third_party/idc_index.py +0 -0
  186. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/__init__.py +0 -0
  187. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_cli.py +0 -0
  188. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_console.py +0 -0
  189. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_constants.py +0 -0
  190. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_di.py +0 -0
  191. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_fs.py +0 -0
  192. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_gui.py +0 -0
  193. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_health.py +0 -0
  194. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_log.py +0 -0
  195. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_logfire.py +0 -0
  196. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_notebook.py +0 -0
  197. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_process.py +0 -0
  198. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_sentry.py +0 -0
  199. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_service.py +0 -0
  200. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/_settings.py +0 -0
  201. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/utils/boot.py +0 -0
  202. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/__init__.py +0 -0
  203. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_cli.py +0 -0
  204. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_gui.py +0 -0
  205. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_openslide_handler.py +0 -0
  206. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  207. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_service.py +0 -0
  208. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/_utils.py +0 -0
  209. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics/wsi/assets/fallback.png +0 -0
  210. {aignostics-0.2.61 → aignostics-0.2.64}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.61
3
+ Version: 0.2.64
4
4
  Summary: 🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library.
5
5
  Project-URL: Homepage, https://aignostics.readthedocs.io/en/latest/
6
6
  Project-URL: Documentation, https://aignostics.readthedocs.io/en/latest/
@@ -50,11 +50,11 @@ Classifier: Typing :: Typed
50
50
  Requires-Python: <4.0,>=3.11
51
51
  Requires-Dist: appdirs>=1.4.4
52
52
  Requires-Dist: auth0-python>=4.10.0
53
- Requires-Dist: boto3>=1.38.36
53
+ Requires-Dist: boto3>=1.38.38
54
54
  Requires-Dist: dicom-validator>=0.7.1
55
55
  Requires-Dist: dicomweb-client[gcp]>=0.59.2
56
56
  Requires-Dist: duckdb<=1.4.0,>=0.10.0
57
- Requires-Dist: fastapi[all,standard]>=0.115.12
57
+ Requires-Dist: fastapi[all,standard]>=0.115.13
58
58
  Requires-Dist: google-cloud-storage>=2.12.0
59
59
  Requires-Dist: google-crc32c>=1.7.1
60
60
  Requires-Dist: highdicom>=0.25.1
@@ -64,7 +64,7 @@ Requires-Dist: idc-index-data==21.0.0
64
64
  Requires-Dist: ijson>=3.4.0
65
65
  Requires-Dist: jsf>=0.11.2
66
66
  Requires-Dist: jsonschema>=4.24.0
67
- Requires-Dist: logfire[system-metrics]>=3.19.0
67
+ Requires-Dist: logfire[system-metrics]>=3.21.0
68
68
  Requires-Dist: nicegui[native]>=2.20.0
69
69
  Requires-Dist: openslide-bin>=4.0.0.8
70
70
  Requires-Dist: openslide-python>=1.4.2
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.61",
5
+ # "aignostics==0.2.64",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.61"
3
+ version = "0.2.64"
4
4
  description = "🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -74,8 +74,8 @@ requires-python = ">=3.11, <4.0"
74
74
 
75
75
  dependencies = [
76
76
  # From Template
77
- "fastapi[standard,all]>=0.115.12",
78
- "logfire[system-metrics]>=3.19.0",
77
+ "fastapi[standard,all]>=0.115.13",
78
+ "logfire[system-metrics]>=3.21.0",
79
79
  "nicegui[native]>=2.20.0",
80
80
  "opentelemetry-instrumentation-fastapi>=0.53b0",
81
81
  "opentelemetry-instrumentation-httpx>=0.53b0",
@@ -94,7 +94,7 @@ dependencies = [
94
94
  # Custom
95
95
  "appdirs>=1.4.4",
96
96
  "auth0-python>=4.10.0",
97
- "boto3>=1.38.36",
97
+ "boto3>=1.38.38",
98
98
  "dicom-validator>=0.7.1",
99
99
  "dicomweb-client[gcp]>=0.59.2",
100
100
  "duckdb>=0.10.0,<=1.4.0",
@@ -352,7 +352,7 @@ source = ["src/"]
352
352
 
353
353
 
354
354
  [tool.bumpversion]
355
- current_version = "0.2.61"
355
+ current_version = "0.2.64"
356
356
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
357
357
  serialize = ["{major}.{minor}.{patch}"]
358
358
  search = "{current_version}"
@@ -0,0 +1,324 @@
1
+ """CLI of bucket module."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import datetime
6
+ import json
7
+ import sys
8
+ from pathlib import Path # noqa: TC003
9
+ from typing import Annotated
10
+
11
+ import humanize
12
+ import typer
13
+
14
+ from aignostics.utils import console, get_logger, get_user_data_directory
15
+
16
+ from ._service import DownloadProgress, Service
17
+
18
+ MESSAGE_NOT_YET_IMPLEMENTED = "NOT YET IMPLEMENTED"
19
+
20
+ logger = get_logger(__name__)
21
+
22
+
23
+ cli = typer.Typer(
24
+ name="bucket",
25
+ help="Operations on cloud bucket on Aignostics Platform.",
26
+ )
27
+
28
+
29
+ @cli.command()
30
+ def upload(
31
+ source: Annotated[
32
+ Path,
33
+ typer.Argument(
34
+ help="Source file or directory to upload",
35
+ exists=True,
36
+ file_okay=True,
37
+ dir_okay=True,
38
+ writable=False,
39
+ readable=True,
40
+ resolve_path=False,
41
+ ),
42
+ ],
43
+ destination_prefix: Annotated[
44
+ str,
45
+ typer.Option(
46
+ help="Destination layout. Supports {username}, {timestamp}. "
47
+ 'E.g. you might want to use "{username}/myproject/"'
48
+ ),
49
+ ] = "{username}",
50
+ ) -> None:
51
+ """Upload file or directory to bucket in Aignostics platform."""
52
+ import psutil # noqa: PLC0415
53
+ from rich.progress import ( # noqa: PLC0415
54
+ BarColumn,
55
+ FileSizeColumn,
56
+ Progress,
57
+ TaskProgressColumn,
58
+ TextColumn,
59
+ TimeRemainingColumn,
60
+ TotalFileSizeColumn,
61
+ TransferSpeedColumn,
62
+ )
63
+
64
+ console.print(f"Uploading {source} to bucket...")
65
+
66
+ total_bytes = 0
67
+ files_count = 0
68
+
69
+ if source.is_file():
70
+ total_bytes = source.stat().st_size
71
+ files_count = 1
72
+ else:
73
+ for file_path in source.glob("**/*"):
74
+ if file_path.is_file():
75
+ total_bytes += file_path.stat().st_size
76
+ files_count += 1
77
+
78
+ console.print(f"Found {files_count} files with total size of {humanize.naturalsize(total_bytes)}")
79
+
80
+ username = psutil.Process().username()
81
+ timestamp = datetime.datetime.now(tz=datetime.UTC).strftime("%Y%m%d_%H%M%S")
82
+ base_prefix = destination_prefix.format(username=username, timestamp=timestamp)
83
+ base_prefix = base_prefix.strip("/")
84
+
85
+ with Progress(
86
+ TextColumn(
87
+ f"[progress.description]Uploading from {source.name} to "
88
+ f"{Service().get_bucket_protocol()}:/{Service().get_bucket_name()}/{base_prefix}"
89
+ ),
90
+ BarColumn(),
91
+ TaskProgressColumn(),
92
+ TimeRemainingColumn(),
93
+ FileSizeColumn(),
94
+ TotalFileSizeColumn(),
95
+ TransferSpeedColumn(),
96
+ TextColumn("[progress.description]{task.description}"),
97
+ ) as progress:
98
+ task = progress.add_task(f"Uploading to {base_prefix}/...", total=total_bytes)
99
+
100
+ def update_progress(bytes_uploaded: int, file: Path) -> None:
101
+ relpath = file.relative_to(source)
102
+ progress.update(task, advance=bytes_uploaded, description=f"{relpath}")
103
+
104
+ results = Service().upload(source, base_prefix, update_progress)
105
+
106
+ if results["success"]:
107
+ console.print(f"[green]Successfully uploaded {len(results['success'])} files:[/green]")
108
+ for key in results["success"]:
109
+ console.print(f" [green]- {key}[/green]")
110
+
111
+ if results["failed"]:
112
+ console.print(f"[red]Failed to upload {len(results['failed'])} files:[/red]")
113
+ for key in results["failed"]:
114
+ console.print(f" [red]- {key}[/red]")
115
+
116
+ if not results["failed"]:
117
+ console.print("[green]All files uploaded successfully![/green]")
118
+
119
+
120
+ @cli.command()
121
+ def find(
122
+ what: Annotated[
123
+ list[str] | None,
124
+ typer.Argument(help="Patterns or keys to match object keys against - all if not specified."),
125
+ ] = None,
126
+ what_is_key: Annotated[
127
+ bool,
128
+ typer.Option(
129
+ help="Specify if 'what' is a single object key. If not specified, 'what' is treated as a regex pattern.",
130
+ ),
131
+ ] = False,
132
+ detail: Annotated[bool, typer.Option(help="Show details")] = False,
133
+ signed_urls: Annotated[bool, typer.Option("--signed-urls", help="Include signed download URLs")] = False,
134
+ ) -> None:
135
+ """Find objects in bucket on Aignostics Platform."""
136
+ try:
137
+ result = Service().find(what, what_is_key, detail, signed_urls)
138
+ console.print_json(json=json.dumps(result, default=str))
139
+ except ValueError as e:
140
+ msg = f"Failed to find objects matching {what or 'all'}: {e!s}"
141
+ logger.exception(msg)
142
+ console.print(f"[red]Error:[/red] {e}")
143
+ sys.exit(2)
144
+
145
+
146
+ @cli.command()
147
+ def download(
148
+ what: Annotated[
149
+ list[str] | None,
150
+ typer.Argument(help="Patterns or keys to match object keys against - all if not specified."),
151
+ ] = None,
152
+ what_is_key: Annotated[
153
+ bool,
154
+ typer.Option(
155
+ help="Specify if 'what' is a single object key. If not specified, 'what' is treated as a regex pattern.",
156
+ ),
157
+ ] = False,
158
+ destination: Annotated[
159
+ Path,
160
+ typer.Option(
161
+ help="Destination directory to download the matching objects to.",
162
+ exists=False,
163
+ file_okay=False,
164
+ dir_okay=True,
165
+ writable=True,
166
+ readable=True,
167
+ resolve_path=True,
168
+ ),
169
+ ] = get_user_data_directory("bucket_downloads"), # noqa: B008
170
+ ) -> None:
171
+ """Download objects from bucket in Aignostics platform to local directory."""
172
+ service = Service()
173
+
174
+ try:
175
+ matched_objects = service.find(what, what_is_key)
176
+ if not matched_objects:
177
+ console.print(f"[warning]No objects found matching {what or 'all'}[/warning]")
178
+ return
179
+ except ValueError as e:
180
+ msg = f"Failed to find objects matching {what or 'all'} on download to {destination}: {e!s}"
181
+ logger.exception(msg)
182
+ console.print(f"[red]Error:[/red] {e}")
183
+ sys.exit(2)
184
+
185
+ from rich.console import Group # noqa: PLC0415
186
+ from rich.live import Live # noqa: PLC0415
187
+ from rich.panel import Panel # noqa: PLC0415
188
+ from rich.progress import ( # noqa: PLC0415
189
+ BarColumn,
190
+ FileSizeColumn,
191
+ Progress,
192
+ TaskID,
193
+ TaskProgressColumn,
194
+ TextColumn,
195
+ TimeElapsedColumn,
196
+ TimeRemainingColumn,
197
+ TotalFileSizeColumn,
198
+ TransferSpeedColumn,
199
+ )
200
+
201
+ main_progress = Progress(
202
+ BarColumn(),
203
+ TaskProgressColumn(),
204
+ TimeElapsedColumn(),
205
+ TextColumn("[progress.description]{task.description}"),
206
+ )
207
+
208
+ file_progress = Progress(
209
+ BarColumn(),
210
+ TaskProgressColumn(),
211
+ TimeElapsedColumn(),
212
+ TimeRemainingColumn(),
213
+ FileSizeColumn(),
214
+ TotalFileSizeColumn(),
215
+ TransferSpeedColumn(),
216
+ TextColumn("[progress.description]{task.description}"),
217
+ )
218
+
219
+ progress_group = Panel(
220
+ Group(main_progress, file_progress),
221
+ title=f"Download objects matching {what or 'all'}",
222
+ subtitle=f"Destination '{destination}'",
223
+ )
224
+
225
+ current_file_task: TaskID | None = None
226
+ main_task = main_progress.add_task("", total=len(matched_objects))
227
+
228
+ def progress_callback(progress: DownloadProgress) -> None:
229
+ nonlocal current_file_task
230
+ main_progress.update(
231
+ main_task,
232
+ completed=progress.overall_processed,
233
+ description=f"Object {progress.overall_current} of {progress.overall_total}",
234
+ )
235
+
236
+ if progress.current_file_key:
237
+ file_description = f"{progress.current_file_key}"
238
+ if current_file_task is None:
239
+ current_file_task = file_progress.add_task(file_description, total=progress.current_file_size)
240
+ file_progress.update(
241
+ current_file_task,
242
+ completed=progress.current_file_downloaded,
243
+ total=progress.current_file_size,
244
+ description=file_description,
245
+ )
246
+ elif current_file_task is not None:
247
+ file_progress.remove_task(current_file_task)
248
+ current_file_task = None
249
+
250
+ try:
251
+ with Live(progress_group, console=console, refresh_per_second=10, transient=True):
252
+ result = service.download(what, destination, what_is_key, progress_callback)
253
+ except ValueError as e:
254
+ msg = f"Failed to download objects matching {what or 'all'} to {destination}: {e!s}"
255
+ logger.exception(msg)
256
+ console.print(f"[red]Error:[/red] {e!s}")
257
+ sys.exit(2)
258
+
259
+ for downloaded_path in result.downloaded:
260
+ console.print(f"[green]✓[/green] Downloaded: {downloaded_path.name}")
261
+
262
+ for failed_key in result.failed:
263
+ console.print(f"[red]✗[/red] Failed: {failed_key}")
264
+
265
+ console.print(
266
+ f"[bold]Summary:[/bold] [success]{result.downloaded_count}[/success] downloaded, "
267
+ f"[error]{result.failed_count}[/error] failed, [info]{result.total_count}[/info] total"
268
+ )
269
+
270
+
271
+ @cli.command()
272
+ def delete(
273
+ what: Annotated[
274
+ list[str],
275
+ typer.Argument(help="Patterns or keys to match object keys against."),
276
+ ],
277
+ what_is_key: Annotated[
278
+ bool,
279
+ typer.Option(
280
+ help="Specify if 'what' is a single object key. If not specified, 'what' is treated as a regex pattern.",
281
+ ),
282
+ ] = False,
283
+ dry_run: Annotated[
284
+ bool,
285
+ typer.Option(
286
+ help="If set, only determines number of items that would be deleted, without actually deleting.",
287
+ ),
288
+ ] = True,
289
+ ) -> None:
290
+ """Delete objects in bucket on Aignostics Platform."""
291
+ try:
292
+ deleted_count = Service().delete(what, what_is_key, dry_run)
293
+ if deleted_count > 0:
294
+ action = "Would delete" if dry_run else "Deleted"
295
+ console.print(f"[green]✓[/green] {action} {deleted_count} object(s) matching {what}")
296
+ else:
297
+ console.print(f"[yellow]⚠[/yellow] No objects found matching pattern {what}")
298
+ except ValueError as e:
299
+ msg = f"Failed to delete objects matching {what}: {e!s}"
300
+ logger.exception(msg)
301
+ console.print(f"[red]Error:[/red] {e}")
302
+ sys.exit(2)
303
+
304
+
305
+ @cli.command()
306
+ def purge(
307
+ dry_run: Annotated[
308
+ bool,
309
+ typer.Option(help="If set, only determines number of items that would be deleted, without actually deleting."),
310
+ ] = True,
311
+ ) -> None:
312
+ """Purge all objects in bucket on Aignostics Platform."""
313
+ try:
314
+ deleted_count = Service().delete(what=None, what_is_key=False, dry_run=dry_run)
315
+ if deleted_count > 0:
316
+ action = "Would purge bucket by deleting" if dry_run else "Purged bucket by deleting"
317
+ console.print(f"[green]✓[/green] {action} {deleted_count} object(s)")
318
+ else:
319
+ console.print("[yellow]⚠[/yellow] No objects found to purge.")
320
+ except ValueError as e:
321
+ msg = f"Failed to purge bucket: {e!s}"
322
+ logger.exception(msg)
323
+ console.print(f"[red]Error:[/red] {e}")
324
+ sys.exit(2)