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.
- {aignostics-0.2.65 → aignostics-0.2.69}/PKG-INFO +1 -1
- {aignostics-0.2.65 → aignostics-0.2.69}/examples/notebook.py +1 -1
- {aignostics-0.2.65 → aignostics-0.2.69}/pyproject.toml +2 -2
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_service.py +2 -2
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_cli.py +1 -1
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_gui.py +38 -35
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_service.py +8 -4
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/cli.py +9 -2
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/_frame.py +2 -3
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_authentication.py +3 -4
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_settings.py +18 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_cli.py +21 -2
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_gui.py +12 -3
- {aignostics-0.2.65 → aignostics-0.2.69}/.gitignore +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/LICENSE +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/README.md +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/.openapi-generator/FILES +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/.openapi-generator/VERSION +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api/public_api.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api_client.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/api_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/configuration.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/exceptions.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_status.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/rest.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/docs/PublicApi.md +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {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
- {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
- {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
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {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
- {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
- {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
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {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
- {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
- {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
- {aignostics-0.2.65 → aignostics-0.2.69}/examples/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/examples/notebook.ipynb +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/examples/script.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_frame.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_builder.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_page_index.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/_utils.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/.gitignore +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/done.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/error.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/ruo.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_settings.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/application/_utils.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/_settings.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/constants.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_gui.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/_theme.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/gui/assets/logo.png +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_gui.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_notebook.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/notebook/assets/python.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_client.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_constants.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_messages.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/_utils.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/applications.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/runs.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/platform/resources/utils.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_gui.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/_settings.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/download.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/microscope.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/assets/update.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/add.groovy +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/qupath/scripts/test.groovy +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_exceptions.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_gui.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/_settings.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/system/assets/system.lottie +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/third_party/bottle.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/third_party/idc_index.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_console.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_constants.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_di.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_fs.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_gui.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_health.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_log.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_logfire.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_notebook.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_process.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_sentry.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/_settings.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/utils/boot.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/__init__.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_cli.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_openslide_handler.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_pydicom_handler.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_service.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/_utils.py +0 -0
- {aignostics-0.2.65 → aignostics-0.2.69}/src/aignostics/wsi/assets/fallback.png +0 -0
- {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.
|
|
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/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aignostics"
|
|
3
|
-
version = "0.2.
|
|
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.
|
|
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"{
|
|
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"
|
|
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"
|
|
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
|
-
|
|
342
|
-
ui.
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
3
|
+
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
from
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/application_run_status.py
RENAMED
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/http_validation_error.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/item_creation_request.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/output_artifact_scope.py
RENAMED
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_input_artifact.py
RENAMED
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/payload_output_artifact.py
RENAMED
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_request.py
RENAMED
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_creation_response.py
RENAMED
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/run_read_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aignostics-0.2.65 → aignostics-0.2.69}/codegen/out/aignx/codegen/models/validation_error.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|