aignostics 0.2.65__tar.gz → 0.2.69__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 (202) hide show
  1. {aignostics-0.2.65 → aignostics-0.2.69}/PKG-INFO +1 -1
  2. {aignostics-0.2.65 → aignostics-0.2.69}/examples/notebook.py +1 -1
  3. {aignostics-0.2.65 → aignostics-0.2.69}/pyproject.toml +2 -2
  4. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_service.py +2 -2
  5. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_cli.py +1 -1
  6. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_gui.py +38 -35
  7. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_service.py +8 -4
  8. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/cli.py +9 -2
  9. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/_frame.py +2 -3
  10. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_authentication.py +3 -4
  11. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_settings.py +18 -0
  12. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_cli.py +21 -2
  13. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_gui.py +12 -3
  14. {aignostics-0.2.65 → aignostics-0.2.69}/.gitignore +0 -0
  15. {aignostics-0.2.65 → aignostics-0.2.69}/LICENSE +0 -0
  16. {aignostics-0.2.65 → aignostics-0.2.69}/README.md +0 -0
  17. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/.openapi-generator/FILES +0 -0
  18. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/.openapi-generator/VERSION +0 -0
  19. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  20. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api_client.py +0 -0
  21. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api_response.py +0 -0
  22. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/configuration.py +0 -0
  23. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/exceptions.py +0 -0
  24. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  25. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  26. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  27. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  28. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  29. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  30. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  31. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  32. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  33. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  34. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  35. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  36. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  37. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  38. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  39. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  40. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  41. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  42. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  43. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  44. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  45. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  46. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  47. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/rest.py +0 -0
  48. {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/docs/PublicApi.md +0 -0
  49. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  50. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/s3.rst +0 -0
  51. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  52. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  53. {aignostics-0.2.65 → aignostics-0.2.69}/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
  54. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  55. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  56. {aignostics-0.2.65 → aignostics-0.2.69}/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
  57. {aignostics-0.2.65 → aignostics-0.2.69}/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
  58. {aignostics-0.2.65 → aignostics-0.2.69}/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
  59. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  60. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  61. {aignostics-0.2.65 → aignostics-0.2.69}/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
  62. {aignostics-0.2.65 → aignostics-0.2.69}/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
  63. {aignostics-0.2.65 → aignostics-0.2.69}/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
  64. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  65. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  66. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  67. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  68. {aignostics-0.2.65 → aignostics-0.2.69}/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
  69. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  70. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  71. {aignostics-0.2.65 → aignostics-0.2.69}/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
  72. {aignostics-0.2.65 → aignostics-0.2.69}/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
  73. {aignostics-0.2.65 → aignostics-0.2.69}/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
  74. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  75. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  76. {aignostics-0.2.65 → aignostics-0.2.69}/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
  77. {aignostics-0.2.65 → aignostics-0.2.69}/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
  78. {aignostics-0.2.65 → aignostics-0.2.69}/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
  79. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  80. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  81. {aignostics-0.2.65 → aignostics-0.2.69}/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
  82. {aignostics-0.2.65 → aignostics-0.2.69}/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
  83. {aignostics-0.2.65 → aignostics-0.2.69}/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
  84. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  85. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  86. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  87. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  88. {aignostics-0.2.65 → aignostics-0.2.69}/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
  89. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  90. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  91. {aignostics-0.2.65 → aignostics-0.2.69}/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
  92. {aignostics-0.2.65 → aignostics-0.2.69}/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
  93. {aignostics-0.2.65 → aignostics-0.2.69}/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
  94. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  95. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  96. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  97. {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  98. {aignostics-0.2.65 → aignostics-0.2.69}/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
  99. {aignostics-0.2.65 → aignostics-0.2.69}/examples/__init__.py +0 -0
  100. {aignostics-0.2.65 → aignostics-0.2.69}/examples/notebook.ipynb +0 -0
  101. {aignostics-0.2.65 → aignostics-0.2.69}/examples/script.py +0 -0
  102. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/__init__.py +0 -0
  103. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/__init__.py +0 -0
  104. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_cli.py +0 -0
  105. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_frame.py +0 -0
  106. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
  107. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  108. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_builder.py +0 -0
  109. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_index.py +0 -0
  110. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_utils.py +0 -0
  111. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  112. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  113. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  114. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  115. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  116. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  117. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  118. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  119. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  120. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  121. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  122. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  123. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  124. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  125. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  126. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  127. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_settings.py +0 -0
  128. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_utils.py +0 -0
  129. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/__init__.py +0 -0
  130. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_settings.py +0 -0
  131. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  132. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  133. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/constants.py +0 -0
  134. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/__init__.py +0 -0
  135. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_cli.py +0 -0
  136. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_gui.py +0 -0
  137. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_service.py +0 -0
  138. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  139. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/__init__.py +0 -0
  140. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/_theme.py +0 -0
  141. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  142. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/assets/logo.png +0 -0
  143. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/__init__.py +0 -0
  144. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_gui.py +0 -0
  145. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_notebook.py +0 -0
  146. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_service.py +0 -0
  147. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/assets/python.lottie +0 -0
  148. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/__init__.py +0 -0
  149. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_cli.py +0 -0
  150. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_client.py +0 -0
  151. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_constants.py +0 -0
  152. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_messages.py +0 -0
  153. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_service.py +0 -0
  154. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_utils.py +0 -0
  155. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/__init__.py +0 -0
  156. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/applications.py +0 -0
  157. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/runs.py +0 -0
  158. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/utils.py +0 -0
  159. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/__init__.py +0 -0
  160. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_cli.py +0 -0
  161. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_gui.py +0 -0
  162. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_service.py +0 -0
  163. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_settings.py +0 -0
  164. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/download.lottie +0 -0
  165. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  166. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/update.lottie +0 -0
  167. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/add.groovy +0 -0
  168. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  169. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  170. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/test.groovy +0 -0
  171. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/__init__.py +0 -0
  172. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_cli.py +0 -0
  173. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_exceptions.py +0 -0
  174. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_gui.py +0 -0
  175. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_service.py +0 -0
  176. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_settings.py +0 -0
  177. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/assets/system.lottie +0 -0
  178. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/third_party/bottle.py +0 -0
  179. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/third_party/idc_index.py +0 -0
  180. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/__init__.py +0 -0
  181. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_console.py +0 -0
  182. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_constants.py +0 -0
  183. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_di.py +0 -0
  184. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_fs.py +0 -0
  185. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_gui.py +0 -0
  186. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_health.py +0 -0
  187. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_log.py +0 -0
  188. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_logfire.py +0 -0
  189. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_notebook.py +0 -0
  190. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_process.py +0 -0
  191. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_sentry.py +0 -0
  192. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_service.py +0 -0
  193. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_settings.py +0 -0
  194. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/boot.py +0 -0
  195. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/__init__.py +0 -0
  196. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_cli.py +0 -0
  197. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_openslide_handler.py +0 -0
  198. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  199. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_service.py +0 -0
  200. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_utils.py +0 -0
  201. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/assets/fallback.png +0 -0
  202. {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.65
3
+ Version: 0.2.69
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/
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.65",
5
+ # "aignostics==0.2.69",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.65"
3
+ version = "0.2.69"
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 = [
@@ -353,7 +353,7 @@ source = ["src/"]
353
353
 
354
354
 
355
355
  [tool.bumpversion]
356
- current_version = "0.2.65"
356
+ current_version = "0.2.69"
357
357
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
358
358
  serialize = ["{major}.{minor}.{patch}"]
359
359
  search = "{current_version}"
@@ -493,9 +493,9 @@ class Service(BaseService):
493
493
  if not source_file_path.is_file():
494
494
  logger.warning("Source file '%s' does not exist.", row["referebce"])
495
495
  return False
496
+ username = psutil.Process().username().replace("\\", "_")
496
497
  object_key = (
497
- f"{psutil.Process().username()}/{upload_prefix}/"
498
- f"{application_version.application_version_id}/{source_file_path.name}"
498
+ f"{username}/{upload_prefix}/{application_version.application_version_id}/{source_file_path.name}"
499
499
  )
500
500
  platform_bucket_url = (
501
501
  f"{BucketService().get_bucket_protocol()}://{BucketService().get_bucket_name()}/{object_key}"
@@ -77,7 +77,7 @@ def upload(
77
77
 
78
78
  console.print(f"Found {files_count} files with total size of {humanize.naturalsize(total_bytes)}")
79
79
 
80
- username = psutil.Process().username()
80
+ username = psutil.Process().username().replace("\\", "_")
81
81
  timestamp = datetime.datetime.now(tz=datetime.UTC).strftime("%Y%m%d_%H%M%S")
82
82
  base_prefix = destination_prefix.format(username=username, timestamp=timestamp)
83
83
  base_prefix = base_prefix.strip("/")
@@ -299,7 +299,7 @@ class PageBuilder(BasePageBuilder):
299
299
  return
300
300
 
301
301
  bucket_form.destination = get_user_data_directory("datasets/idc")
302
- bucket_form.destination_label.set_text(f"Download to {bucket_form.destination!s}")
302
+ bucket_form.destination_label.set_text(f"Will download to {bucket_form.destination!s}")
303
303
  await _update_button_states()
304
304
 
305
305
  async def _select_destination() -> None:
@@ -323,7 +323,7 @@ class PageBuilder(BasePageBuilder):
323
323
  )
324
324
  else:
325
325
  bucket_form.destination = path
326
- bucket_form.destination_label.set_text(f"Download to {bucket_form.destination!s}")
326
+ bucket_form.destination_label.set_text(f"Will download to {bucket_form.destination!s}")
327
327
  bucket_form.destination_open_button.enable()
328
328
  ui.notify(f"You chose directory {bucket_form.destination}.", type="info")
329
329
  else:
@@ -338,29 +338,44 @@ class PageBuilder(BasePageBuilder):
338
338
  show_in_file_manager(str(bucket_form.destination))
339
339
 
340
340
  with ui.row().classes("w-full gap-4"):
341
- bucket_form.download_button = (
342
- ui.button(
343
- "Download",
344
- icon="download",
345
- on_click=_download_selected,
346
- )
347
- .mark("BUTTON_DOWNLOAD_OBJECTS")
348
- .props("color=primary")
349
- .classes("w-1/5")
350
- )
351
- bucket_form.download_button.disable()
352
-
353
- with ui.button("Data", on_click=_select_data, icon="folder_special", color="purple-400").mark(
354
- "BUTTON_DOWNLOAD_DESTINATION_DATA"
355
- ):
356
- ui.tooltip("Use Launchpad datasets directory")
357
-
358
- with ui.button("Custom", on_click=_select_destination, icon="folder").mark(
359
- "BUTTON_DOWNLOAD_DESTINATION"
360
- ):
361
- ui.tooltip("Select a custom directory")
341
+ with ui.column().classes("w-1/2"):
342
+ with ui.row().classes("w-full"):
343
+ bucket_form.download_button = (
344
+ ui.button(
345
+ "Download",
346
+ icon="download",
347
+ on_click=_download_selected,
348
+ )
349
+ .mark("BUTTON_DOWNLOAD_OBJECTS")
350
+ .props("color=primary")
351
+ )
352
+ bucket_form.download_button.disable()
353
+
354
+ ui.space()
355
+
356
+ with ui.button("Data", on_click=_select_data, icon="folder_special", color="purple-400").mark(
357
+ "BUTTON_DOWNLOAD_DESTINATION_DATA"
358
+ ):
359
+ ui.tooltip("Use Launchpad datasets directory")
360
+
361
+ with ui.button("Custom", on_click=_select_destination, icon="folder").mark(
362
+ "BUTTON_DOWNLOAD_DESTINATION"
363
+ ):
364
+ ui.tooltip("Select a custom directory")
365
+ with ui.row(align_items="center").classes("w-full"):
366
+ bucket_form.destination_label = ui.label(
367
+ MESSAGE_NO_DOWNLOAD_FOLDER_SELECTED
368
+ if bucket_form.destination is None
369
+ else str(f"Will download to {bucket_form.destination}")
370
+ )
371
+ ui.space()
372
+ bucket_form.destination_open_button = ui.button(
373
+ icon="folder_open", on_click=_open_destination, color="secondary"
374
+ )
375
+ bucket_form.destination_open_button.mark("BUTTON_OPEN_DESTINATION").disable()
362
376
 
363
377
  ui.space()
378
+
364
379
  bucket_form.delete_button = (
365
380
  ui.button(
366
381
  "Delete",
@@ -373,18 +388,6 @@ class PageBuilder(BasePageBuilder):
373
388
  )
374
389
  bucket_form.delete_button.disable()
375
390
 
376
- with ui.row(align_items="center").classes("w-2/5"):
377
- ui.space()
378
- bucket_form.destination_label = ui.label(
379
- MESSAGE_NO_DOWNLOAD_FOLDER_SELECTED
380
- if bucket_form.destination is None
381
- else str(f"Download to {bucket_form.destination}")
382
- ).classes("max-w-72")
383
- bucket_form.destination_open_button = ui.button(
384
- icon="folder_open", on_click=_open_destination, color="secondary"
385
- )
386
- bucket_form.destination_open_button.mark("BUTTON_OPEN_DESTINATION").disable()
387
-
388
391
  # Progress card for downloads (initially hidden)
389
392
  with ui.card().classes("w-full") as progress_card:
390
393
  bucket_form.download_progress_card = progress_card
@@ -4,14 +4,15 @@ import hashlib
4
4
  import re
5
5
  from collections.abc import Callable, Generator
6
6
  from pathlib import Path
7
- from typing import Any, cast
7
+ from typing import TYPE_CHECKING, Any, cast
8
8
 
9
9
  import humanize
10
10
  import requests
11
- from botocore.client import BaseClient, Config
12
- from botocore.exceptions import ClientError
13
11
  from pydantic import BaseModel, computed_field
14
12
 
13
+ if TYPE_CHECKING:
14
+ from botocore.client import BaseClient
15
+
15
16
  from aignostics.utils import UNHIDE_SENSITIVE_INFO, BaseService, Health, get_logger, get_user_data_directory
16
17
 
17
18
  from ._settings import Settings
@@ -111,7 +112,7 @@ class Service(BaseService):
111
112
  components={},
112
113
  )
113
114
 
114
- def _get_s3_client(self, endpoint_url: str = ENDPOINT_URL_DEFAULT) -> BaseClient:
115
+ def _get_s3_client(self, endpoint_url: str = ENDPOINT_URL_DEFAULT) -> "BaseClient":
115
116
  """Get a Boto3 S3 client instance for cloud bucket on Aignostics Platform.
116
117
 
117
118
  Args:
@@ -121,6 +122,7 @@ class Service(BaseService):
121
122
  BaseClient: A Boto3 S3 client instance.
122
123
  """
123
124
  from boto3 import Session # noqa: PLC0415
125
+ from botocore.client import Config # noqa: PLC0415
124
126
 
125
127
  # https://www.kmp.tw/post/accessgcsusepythonboto3/
126
128
  session = Session(
@@ -599,6 +601,8 @@ class Service(BaseService):
599
601
  Raises:
600
602
  ValueError: If any provided regex pattern is invalid.
601
603
  """
604
+ from botocore.exceptions import ClientError # noqa: PLC0415
605
+
602
606
  matched_objects = self.find(what, what_is_key=what_is_key, detail=False)
603
607
  object_keys_to_delete = [obj for obj in matched_objects if isinstance(obj, str)]
604
608
 
@@ -7,14 +7,20 @@ from pathlib import Path
7
7
  import typer
8
8
 
9
9
  from .constants import MODULES_TO_INSTRUMENT, NOTEBOOK_DEFAULT
10
- from .utils import __is_running_in_container__, __version__, boot, console, get_logger, prepare_cli
10
+ from .utils import (
11
+ __is_running_in_container__,
12
+ __version__,
13
+ boot,
14
+ console,
15
+ get_logger,
16
+ prepare_cli,
17
+ )
11
18
 
12
19
  boot(MODULES_TO_INSTRUMENT)
13
20
  logger = get_logger(__name__)
14
21
 
15
22
  cli = typer.Typer(
16
23
  help="Command Line Interface (CLI) of Aignostics Python SDK providing access to Aignostics Platform.",
17
- no_args_is_help=True,
18
24
  )
19
25
 
20
26
  if find_spec("nicegui") and find_spec("webview") and not __is_running_in_container__:
@@ -62,6 +68,7 @@ if find_spec("marimo"):
62
68
 
63
69
  prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻")
64
70
 
71
+
65
72
  if __name__ == "__main__": # pragma: no cover
66
73
  try:
67
74
  cli()
@@ -8,7 +8,6 @@ from importlib.util import find_spec
8
8
  from typing import Any
9
9
 
10
10
  from humanize import naturaldelta
11
- from nicegui import app, ui
12
11
 
13
12
  from aignostics.utils import __version__, open_user_data_directory
14
13
 
@@ -42,7 +41,7 @@ def frame( # noqa: C901, PLR0915
42
41
  Yields:
43
42
  Generator[Any, Any, Any]: The context manager for the page frame.
44
43
  """
45
- from nicegui import background_tasks, context, run # noqa: PLC0415
44
+ from nicegui import app, background_tasks, context, run, ui # noqa: PLC0415
46
45
 
47
46
  from aignostics.platform import Service as PlatformService # noqa: PLC0415
48
47
  from aignostics.platform import UserInfo # noqa: PLC0415
@@ -105,7 +104,7 @@ def frame( # noqa: C901, PLR0915
105
104
  with contextlib.suppress(Exception):
106
105
  user_info = await run.cpu_bound(PlatformService.get_user_info, relogin=True)
107
106
  app.storage.tab["user_info"] = user_info
108
- _user_info_ui.refresh()
107
+ ui.navigate.reload()
109
108
 
110
109
  @ui.refreshable
111
110
  def health_icon() -> None:
@@ -18,14 +18,13 @@ from requests_oauthlib import OAuth2Session
18
18
  from aignostics.platform._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI
19
19
  from aignostics.platform._settings import settings
20
20
 
21
+ CALLBACK_PORT_RETRY_COUNT = 10
22
+ CLAIM_ROLE = "https://aignostics-platform-samia/role"
21
23
  try:
22
24
  import sentry_sdk
23
25
  except ImportError:
24
26
  sentry_sdk = None # type: ignore[assignment]
25
27
 
26
- CALLBACK_PORT_RETRY_COUNT = 10
27
- CLAIM_ROLE = "https://aignostics-platform-samia/role"
28
-
29
28
 
30
29
  class AuthenticationResult(BaseModel):
31
30
  """Represents the result of an OAuth authentication flow."""
@@ -208,7 +207,7 @@ def userinfo(token: str) -> dict[str, str]:
208
207
  RuntimeError: If fetching user information fails.
209
208
  """
210
209
  try:
211
- return Users("aignostics-platform.eu.auth0.com").userinfo(access_token=token) # type: ignore[no-any-return]
210
+ return Users(settings().tenant_domain).userinfo(access_token=token) # type: ignore[no-any-return]
212
211
  except Exception as e:
213
212
  message = f"Failed to fetch user information: {e!s}"
214
213
  raise RuntimeError(message) from e
@@ -156,6 +156,24 @@ class Settings(OpaqueSettings):
156
156
  device_url: str
157
157
  jws_json_url: str
158
158
 
159
+ @computed_field # type: ignore[prop-decorator]
160
+ @property
161
+ def tenant_domain(self) -> str:
162
+ """Get the tenant domain from the authorization base URL.
163
+
164
+ Returns:
165
+ str: The domain part of the authorization base URL.
166
+
167
+ Raises:
168
+ ValueError: If the authorization base URL is invalid or does not contain a netloc.
169
+ """
170
+ parsed = urlparse(self.authorization_base_url)
171
+ if parsed.netloc:
172
+ return parsed.netloc
173
+ message = f"Invalid authorization_base_url: {self.authorization_base_url}"
174
+ logger.error(message)
175
+ raise ValueError(message)
176
+
159
177
  refresh_token: Annotated[
160
178
  SecretStr | None,
161
179
  PlainSerializer(
@@ -21,7 +21,6 @@ def prepare_cli(cli: typer.Typer, epilog: str) -> None:
21
21
  cli.add_typer(_cli)
22
22
 
23
23
  cli.info.epilog = epilog
24
- cli.info.no_args_is_help = True
25
24
  if not any(arg.endswith("typer") for arg in Path(sys.argv[0]).parts):
26
25
  for command in cli.registered_commands:
27
26
  command.epilog = cli.info.epilog
@@ -34,6 +33,17 @@ def prepare_cli(cli: typer.Typer, epilog: str) -> None:
34
33
  _no_args_is_help_recursively(cli)
35
34
 
36
35
 
36
+ def no_args_is_help_workaround(ctx: typer.Context) -> None:
37
+ """Workaround for Typer bug, see https://github.com/fastapi/typer/pull/1240.
38
+
39
+ Raises:
40
+ typer.Exit: If no subcommand is invoked, prints the help message and exits.
41
+ """
42
+ if ctx.invoked_subcommand is None:
43
+ print(ctx.get_help())
44
+ raise typer.Exit
45
+
46
+
37
47
  def _add_epilog_recursively(cli: typer.Typer, epilog: str) -> None:
38
48
  """
39
49
  Add epilog to all typers in the tree.
@@ -60,9 +70,18 @@ def _no_args_is_help_recursively(cli: typer.Typer) -> None:
60
70
  Args:
61
71
  cli (typer.Typer): Typer instance
62
72
  """
73
+ # Apply workaround to the main CLI app itself
74
+ if not hasattr(cli, "no_args_callback_added"):
75
+ cli.callback(invoke_without_command=True)(no_args_is_help_workaround)
76
+ cli.no_args_callback_added = True # type: ignore[attr-defined]
77
+
78
+ # Apply workaround to all subcommands recursively
63
79
  for group in cli.registered_groups:
64
80
  if isinstance(group, typer.models.TyperInfo):
65
- group.no_args_is_help = True
66
81
  typer_instance = group.typer_instance
67
82
  if (typer_instance is not cli) and typer_instance:
83
+ # Add the callback workaround to each subcommand typer
84
+ if not hasattr(typer_instance, "no_args_callback_added"):
85
+ typer_instance.callback(invoke_without_command=True)(no_args_is_help_workaround)
86
+ typer_instance.no_args_callback_added = True # type: ignore[attr-defined]
68
87
  _no_args_is_help_recursively(typer_instance)
@@ -1,12 +1,15 @@
1
1
  """WSI API."""
2
2
 
3
- from pathlib import Path
3
+ from __future__ import annotations
4
4
 
5
- from fastapi import Response
6
- from fastapi.responses import RedirectResponse
5
+ from pathlib import Path
6
+ from typing import TYPE_CHECKING
7
7
 
8
8
  from aignostics.utils import BasePageBuilder, get_logger
9
9
 
10
+ if TYPE_CHECKING:
11
+ from fastapi import Response
12
+
10
13
  from ._service import Service
11
14
 
12
15
  logger = get_logger(__name__)
@@ -29,6 +32,9 @@ class PageBuilder(BasePageBuilder):
29
32
  Returns:
30
33
  fastapi.Response: HTTP response containing the thumbnail or fallback image.
31
34
  """
35
+ from fastapi import Response # noqa: PLC0415
36
+ from fastapi.responses import RedirectResponse # noqa: PLC0415
37
+
32
38
  try:
33
39
  return Response(content=Service().get_thumbnail_bytes(Path(source)), media_type="image/png")
34
40
  except ValueError:
@@ -48,6 +54,9 @@ class PageBuilder(BasePageBuilder):
48
54
  Returns:
49
55
  fastapi.Response: HTTP response containing the converted tiff or fallback image
50
56
  """
57
+ from fastapi import Response # noqa: PLC0415
58
+ from fastapi.responses import RedirectResponse # noqa: PLC0415
59
+
51
60
  try:
52
61
  return Response(content=Service().get_tiff_as_jpg(url), media_type="image/jpeg")
53
62
  except ValueError:
File without changes
File without changes
File without changes