aignostics 0.2.64__tar.gz → 0.2.68__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.64 → aignostics-0.2.68}/PKG-INFO +6 -6
  2. {aignostics-0.2.64 → aignostics-0.2.68}/examples/notebook.py +1 -1
  3. {aignostics-0.2.64 → aignostics-0.2.68}/pyproject.toml +13 -12
  4. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/_gui.py +38 -35
  5. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/_service.py +8 -4
  6. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/cli.py +9 -2
  7. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/gui/_frame.py +1 -2
  8. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_authentication.py +2 -3
  9. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_cli.py +21 -2
  10. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_gui.py +12 -3
  11. {aignostics-0.2.64 → aignostics-0.2.68}/.gitignore +0 -0
  12. {aignostics-0.2.64 → aignostics-0.2.68}/LICENSE +0 -0
  13. {aignostics-0.2.64 → aignostics-0.2.68}/README.md +0 -0
  14. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/.openapi-generator/FILES +0 -0
  15. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/.openapi-generator/VERSION +0 -0
  16. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  17. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/api_client.py +0 -0
  18. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/api_response.py +0 -0
  19. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/configuration.py +0 -0
  20. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/exceptions.py +0 -0
  21. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  22. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  23. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  24. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  25. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  26. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  27. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  28. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  29. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  30. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  31. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  32. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  33. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  34. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  35. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  36. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  37. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  38. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  39. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  40. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  41. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  42. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  43. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  44. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/aignx/codegen/rest.py +0 -0
  45. {aignostics-0.2.64 → aignostics-0.2.68}/codegen/out/docs/PublicApi.md +0 -0
  46. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  47. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/s3.rst +0 -0
  48. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  49. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  50. {aignostics-0.2.64 → aignostics-0.2.68}/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
  51. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  52. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  53. {aignostics-0.2.64 → aignostics-0.2.68}/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
  54. {aignostics-0.2.64 → aignostics-0.2.68}/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
  55. {aignostics-0.2.64 → aignostics-0.2.68}/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
  56. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  57. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  58. {aignostics-0.2.64 → aignostics-0.2.68}/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
  59. {aignostics-0.2.64 → aignostics-0.2.68}/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
  60. {aignostics-0.2.64 → aignostics-0.2.68}/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
  61. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  62. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  63. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  64. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  65. {aignostics-0.2.64 → aignostics-0.2.68}/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
  66. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  67. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  68. {aignostics-0.2.64 → aignostics-0.2.68}/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
  69. {aignostics-0.2.64 → aignostics-0.2.68}/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
  70. {aignostics-0.2.64 → aignostics-0.2.68}/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
  71. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  72. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  73. {aignostics-0.2.64 → aignostics-0.2.68}/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
  74. {aignostics-0.2.64 → aignostics-0.2.68}/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
  75. {aignostics-0.2.64 → aignostics-0.2.68}/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
  76. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  77. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  78. {aignostics-0.2.64 → aignostics-0.2.68}/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
  79. {aignostics-0.2.64 → aignostics-0.2.68}/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
  80. {aignostics-0.2.64 → aignostics-0.2.68}/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
  81. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  82. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  83. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  84. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  85. {aignostics-0.2.64 → aignostics-0.2.68}/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
  86. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  87. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  88. {aignostics-0.2.64 → aignostics-0.2.68}/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
  89. {aignostics-0.2.64 → aignostics-0.2.68}/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
  90. {aignostics-0.2.64 → aignostics-0.2.68}/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
  91. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  92. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  93. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  94. {aignostics-0.2.64 → aignostics-0.2.68}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  95. {aignostics-0.2.64 → aignostics-0.2.68}/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
  96. {aignostics-0.2.64 → aignostics-0.2.68}/examples/__init__.py +0 -0
  97. {aignostics-0.2.64 → aignostics-0.2.68}/examples/notebook.ipynb +0 -0
  98. {aignostics-0.2.64 → aignostics-0.2.68}/examples/script.py +0 -0
  99. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/__init__.py +0 -0
  100. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/__init__.py +0 -0
  101. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_cli.py +0 -0
  102. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_frame.py +0 -0
  103. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
  104. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  105. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_page_builder.py +0 -0
  106. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_page_index.py +0 -0
  107. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/_utils.py +0 -0
  108. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  109. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  110. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  111. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  112. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  113. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  114. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  115. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  116. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  117. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  118. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  119. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  120. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  121. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  122. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  123. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  124. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_service.py +0 -0
  125. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_settings.py +0 -0
  126. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/application/_utils.py +0 -0
  127. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/__init__.py +0 -0
  128. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/_cli.py +0 -0
  129. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/_settings.py +0 -0
  130. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  131. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  132. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/constants.py +0 -0
  133. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/dataset/__init__.py +0 -0
  134. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/dataset/_cli.py +0 -0
  135. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/dataset/_gui.py +0 -0
  136. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/dataset/_service.py +0 -0
  137. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  138. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/gui/__init__.py +0 -0
  139. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/gui/_theme.py +0 -0
  140. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  141. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/gui/assets/logo.png +0 -0
  142. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/notebook/__init__.py +0 -0
  143. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/notebook/_gui.py +0 -0
  144. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/notebook/_notebook.py +0 -0
  145. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/notebook/_service.py +0 -0
  146. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/notebook/assets/python.lottie +0 -0
  147. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/__init__.py +0 -0
  148. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_cli.py +0 -0
  149. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_client.py +0 -0
  150. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_constants.py +0 -0
  151. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_messages.py +0 -0
  152. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_service.py +0 -0
  153. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_settings.py +0 -0
  154. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/_utils.py +0 -0
  155. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/resources/__init__.py +0 -0
  156. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/resources/applications.py +0 -0
  157. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/resources/runs.py +0 -0
  158. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/platform/resources/utils.py +0 -0
  159. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/__init__.py +0 -0
  160. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/_cli.py +0 -0
  161. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/_gui.py +0 -0
  162. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/_service.py +0 -0
  163. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/_settings.py +0 -0
  164. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/assets/download.lottie +0 -0
  165. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  166. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/assets/update.lottie +0 -0
  167. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/scripts/add.groovy +0 -0
  168. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  169. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  170. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/qupath/scripts/test.groovy +0 -0
  171. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/__init__.py +0 -0
  172. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/_cli.py +0 -0
  173. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/_exceptions.py +0 -0
  174. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/_gui.py +0 -0
  175. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/_service.py +0 -0
  176. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/_settings.py +0 -0
  177. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/system/assets/system.lottie +0 -0
  178. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/third_party/bottle.py +0 -0
  179. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/third_party/idc_index.py +0 -0
  180. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/__init__.py +0 -0
  181. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_console.py +0 -0
  182. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_constants.py +0 -0
  183. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_di.py +0 -0
  184. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_fs.py +0 -0
  185. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_gui.py +0 -0
  186. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_health.py +0 -0
  187. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_log.py +0 -0
  188. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_logfire.py +0 -0
  189. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_notebook.py +0 -0
  190. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_process.py +0 -0
  191. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_sentry.py +0 -0
  192. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_service.py +0 -0
  193. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/_settings.py +0 -0
  194. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/utils/boot.py +0 -0
  195. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/__init__.py +0 -0
  196. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_cli.py +0 -0
  197. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_openslide_handler.py +0 -0
  198. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  199. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_service.py +0 -0
  200. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/_utils.py +0 -0
  201. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics/wsi/assets/fallback.png +0 -0
  202. {aignostics-0.2.64 → aignostics-0.2.68}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.64
3
+ Version: 0.2.68
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,12 +50,12 @@ 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.38
53
+ Requires-Dist: boto3>=1.38.39
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
57
  Requires-Dist: fastapi[all,standard]>=0.115.13
58
- Requires-Dist: google-cloud-storage>=2.12.0
58
+ Requires-Dist: google-cloud-storage>=3.1.1
59
59
  Requires-Dist: google-crc32c>=1.7.1
60
60
  Requires-Dist: highdicom>=0.25.1
61
61
  Requires-Dist: httpx>=0.28.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.21.0
67
+ Requires-Dist: logfire[system-metrics]>=3.21.1
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
@@ -95,13 +95,13 @@ Requires-Dist: show-in-file-manager>=1.1.5
95
95
  Requires-Dist: tqdm>=4.67.1
96
96
  Requires-Dist: typer>=0.16.0
97
97
  Requires-Dist: uptime>=3.0.1
98
- Requires-Dist: urllib3>=2.2.3
98
+ Requires-Dist: urllib3>=2.5.0
99
99
  Requires-Dist: wsidicom>=0.27.1
100
100
  Provides-Extra: jupyter
101
101
  Requires-Dist: jupyter>=1.1.1; extra == 'jupyter'
102
102
  Provides-Extra: marimo
103
103
  Requires-Dist: cloudpathlib>=0.21.1; extra == 'marimo'
104
- Requires-Dist: marimo>=0.13.15; extra == 'marimo'
104
+ Requires-Dist: marimo>=0.14.0; extra == 'marimo'
105
105
  Requires-Dist: matplotlib>=3.10.3; extra == 'marimo'
106
106
  Requires-Dist: shapely>=2.1.0; extra == 'marimo'
107
107
  Provides-Extra: qupath
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.64",
5
+ # "aignostics==0.2.68",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.64"
3
+ version = "0.2.68"
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 = [
@@ -75,7 +75,7 @@ requires-python = ">=3.11, <4.0"
75
75
  dependencies = [
76
76
  # From Template
77
77
  "fastapi[standard,all]>=0.115.13",
78
- "logfire[system-metrics]>=3.21.0",
78
+ "logfire[system-metrics]>=3.21.1",
79
79
  "nicegui[native]>=2.20.0",
80
80
  "opentelemetry-instrumentation-fastapi>=0.53b0",
81
81
  "opentelemetry-instrumentation-httpx>=0.53b0",
@@ -94,11 +94,11 @@ dependencies = [
94
94
  # Custom
95
95
  "appdirs>=1.4.4",
96
96
  "auth0-python>=4.10.0",
97
- "boto3>=1.38.38",
97
+ "boto3>=1.38.39",
98
98
  "dicom-validator>=0.7.1",
99
99
  "dicomweb-client[gcp]>=0.59.2",
100
100
  "duckdb>=0.10.0,<=1.4.0",
101
- "google-cloud-storage>=2.12.0",
101
+ "google-cloud-storage>=3.1.1",
102
102
  "google-crc32c>=1.7.1",
103
103
  "highdicom>=0.25.1",
104
104
  "httpx>=0.28.1",
@@ -124,7 +124,7 @@ dependencies = [
124
124
  "shapely>=2.1.1",
125
125
  "show-in-file-manager>=1.1.5",
126
126
  "tqdm>=4.67.1",
127
- "urllib3>=2.2.3",
127
+ "urllib3>=2.5.0",
128
128
  "wsidicom>=0.27.1",
129
129
  ]
130
130
 
@@ -132,7 +132,7 @@ dependencies = [
132
132
  jupyter = ["jupyter>=1.1.1"]
133
133
  marimo = [
134
134
  "cloudpathlib>=0.21.1",
135
- "marimo>=0.13.15",
135
+ "marimo>=0.14.0",
136
136
  "matplotlib>=3.10.3",
137
137
  "shapely>=2.1.0",
138
138
  ]
@@ -153,10 +153,10 @@ dev = [
153
153
  "pip-licenses @ git+https://github.com/neXenio/pip-licenses.git@master", # https://github.com/raimon49/pip-licenses/pull/224
154
154
  "pre-commit>=4.1.0",
155
155
  "pyinstaller>=6.14.0",
156
- "pyright>=1.1.401",
157
- "pytest>=8.4.0",
156
+ "pyright>=1.1.402",
157
+ "pytest>=8.4.1",
158
158
  "pytest-asyncio>=1.0.0",
159
- "pytest-cov>=6.1.1",
159
+ "pytest-cov>=6.2.1",
160
160
  "pytest-docker>=3.2.2",
161
161
  "pytest-env>=1.1.5",
162
162
  "pytest-md-report>=0.7.0",
@@ -167,7 +167,7 @@ dev = [
167
167
  "pytest-timeout>=2.4.0",
168
168
  "pytest-watcher>=0.4.3",
169
169
  "pytest-xdist[psutil]>=3.7.0",
170
- "ruff>=0.11.12",
170
+ "ruff>=0.12.0",
171
171
  "scalene>=1.5.51",
172
172
  "sphinx>=8.2.3",
173
173
  "sphinx-autobuild>=2024.10.3",
@@ -182,7 +182,7 @@ dev = [
182
182
  "swagger-plugin-for-sphinx>=5.1.0",
183
183
  "tomli>=2.1.0",
184
184
  "types-pyyaml>=6.0.12.20250516",
185
- "types-requests>=2.32.0.20250602",
185
+ "types-requests>=2.32.4.20250611",
186
186
  "watchdog>=6.0.0",
187
187
  ]
188
188
 
@@ -215,6 +215,7 @@ override-dependencies = [ # https://github.com/astral-sh/uv/issues/4422
215
215
  "h11>=0.16.0", # CVE-2025-43859
216
216
  "tornado>=6.5.0", # CVE-2025-47287
217
217
  "jupyter-core>=5.8.1", # CVE-2025-30167
218
+ "urllib3>=2.5.0", # CVE-2025-50181, CVE-2025-50182
218
219
  ]
219
220
 
220
221
  [tool.ruff]
@@ -352,7 +353,7 @@ source = ["src/"]
352
353
 
353
354
 
354
355
  [tool.bumpversion]
355
- current_version = "0.2.64"
356
+ current_version = "0.2.68"
356
357
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
357
358
  serialize = ["{major}.{minor}.{patch}"]
358
359
  search = "{current_version}"
@@ -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
@@ -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."""
@@ -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