aignostics 0.2.87__tar.gz → 0.2.92__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.87 → aignostics-0.2.92}/PKG-INFO +1 -1
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/api/public_api.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/application_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/application_run_status.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/item_status.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/payload_item.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/run_read_response.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/user_payload.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/validation_error.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -2
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/docs/PublicApi.md +0 -1
- {aignostics-0.2.87 → aignostics-0.2.92}/examples/notebook.py +1 -1
- {aignostics-0.2.87 → aignostics-0.2.92}/pyproject.toml +6 -7
- aignostics-0.2.92/src/aignostics/application/_gui/assets/.gitignore +1 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_service.py +147 -35
- aignostics-0.2.87/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -35
- aignostics-0.2.87/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/s3.rst +0 -185
- aignostics-0.2.87/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -35
- aignostics-0.2.87/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -185
- aignostics-0.2.87/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -35
- aignostics-0.2.87/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -185
- aignostics-0.2.87/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -35
- aignostics-0.2.87/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -185
- aignostics-0.2.87/src/aignostics/application/_gui/assets/.gitignore +0 -1
- {aignostics-0.2.87 → aignostics-0.2.92}/.gitignore +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/LICENSE +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/README.md +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/.openapi-generator/FILES +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/.openapi-generator/VERSION +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/api_client.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/api_response.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/configuration.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/exceptions.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/models/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/codegen/out/aignx/codegen/rest.py +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13 → aignostics-0.2.92/dist_native_all/dist_native-macos-13/extracted}/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13 → aignostics-0.2.92/dist_native_all/dist_native-macos-13/extracted}/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources → aignostics-0.2.92/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks}/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources → aignostics-0.2.92/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks}/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13 → aignostics-0.2.92/dist_native_all/dist_native-ubuntu-24.04-arm/extracted}/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-13 → aignostics-0.2.92/dist_native_all/dist_native-ubuntu-24.04-arm/extracted}/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks → aignostics-0.2.92/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal}/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks → aignostics-0.2.92/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal}/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources → aignostics-0.2.92/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal}/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources → aignostics-0.2.92/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal}/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest → aignostics-0.2.92/dist_native_all/dist_native-windows-latest/extracted}/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.87/dist_native_all/dist_native-macos-latest → aignostics-0.2.92/dist_native_all/dist_native-windows-latest/extracted}/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/examples/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/examples/notebook.ipynb +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/examples/script.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_frame.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_page_builder.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_page_index.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/_utils.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/done.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/error.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/ruo.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/application/_utils.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/constants.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/dataset/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/dataset/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/dataset/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/dataset/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/gui/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/gui/_frame.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/gui/_theme.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/gui/assets/logo.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/notebook/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/notebook/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/notebook/_notebook.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/notebook/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/notebook/assets/python.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_authentication.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_client.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_constants.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_messages.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/_utils.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/resources/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/resources/applications.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/resources/runs.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/platform/resources/utils.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/assets/download.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/assets/microscope.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/assets/update.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/scripts/add.groovy +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/qupath/scripts/test.groovy +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/_exceptions.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/system/assets/system.lottie +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/third_party/bottle.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/third_party/idc_index.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_console.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_constants.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_di.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_fs.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_health.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_log.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_logfire.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_notebook.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_process.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_sentry.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/_settings.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/utils/boot.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/__init__.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_cli.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_gui.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_openslide_handler.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_pydicom_handler.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_service.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/_utils.py +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/src/aignostics/wsi/assets/fallback.png +0 -0
- {aignostics-0.2.87 → aignostics-0.2.92}/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.92
|
|
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.92"
|
|
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,6 +75,7 @@ requires-python = ">=3.11, <4.0"
|
|
|
75
75
|
dependencies = [
|
|
76
76
|
# From Template
|
|
77
77
|
"fastapi[standard,all]>=0.115.13",
|
|
78
|
+
"humanize>=4.12.3",
|
|
78
79
|
"logfire[system-metrics]>=3.21.1",
|
|
79
80
|
"nicegui[native]>=2.20.0",
|
|
80
81
|
"opentelemetry-instrumentation-fastapi>=0.53b0",
|
|
@@ -85,9 +86,12 @@ dependencies = [
|
|
|
85
86
|
"opentelemetry-instrumentation-tornado>=0.53b0",
|
|
86
87
|
"opentelemetry-instrumentation-urllib>=0.53b0",
|
|
87
88
|
"opentelemetry-instrumentation-urllib3>=0.53b0",
|
|
89
|
+
"packaging>=25.0",
|
|
90
|
+
"platformdirs>=4.3.8",
|
|
88
91
|
"psutil>=7.0.0",
|
|
89
92
|
"pydantic-settings>=2.9.1",
|
|
90
93
|
"pywin32>=310 ; sys_platform == 'win32'",
|
|
94
|
+
"pyyaml>=6.0",
|
|
91
95
|
"sentry-sdk>=2.30.0",
|
|
92
96
|
"typer>=0.16.0",
|
|
93
97
|
"uptime>=3.0.1",
|
|
@@ -103,21 +107,16 @@ dependencies = [
|
|
|
103
107
|
"google-crc32c>=1.7.1",
|
|
104
108
|
"highdicom>=0.25.1",
|
|
105
109
|
"httpx>=0.28.1",
|
|
106
|
-
"humanize>=4.12.3",
|
|
107
110
|
"idc-index-data==21.0.0",
|
|
108
111
|
"ijson>=3.4.0",
|
|
109
112
|
"jsf>=0.11.2",
|
|
110
113
|
"jsonschema>=4.24.0",
|
|
111
114
|
"openslide-bin>=4.0.0.8",
|
|
112
115
|
"openslide-python>=1.4.2",
|
|
113
|
-
"packaging>=25.0",
|
|
114
116
|
"pandas<=2.3.0",
|
|
115
|
-
"platformdirs>=4.3.8",
|
|
116
|
-
"psutil>=7.0.0",
|
|
117
117
|
"pyjwt[crypto]>=2.10.1",
|
|
118
118
|
"python-dateutil>=2.9.0.post0",
|
|
119
119
|
# "pywebview[qt6]>=5.4; sys_platform == 'linux'",
|
|
120
|
-
"pyyaml>=6.0",
|
|
121
120
|
"requests>=2.32.3",
|
|
122
121
|
"requests-oauthlib>=2.0.0",
|
|
123
122
|
"s5cmd>=0.2.0",
|
|
@@ -353,7 +352,7 @@ source = ["src/"]
|
|
|
353
352
|
|
|
354
353
|
|
|
355
354
|
[tool.bumpversion]
|
|
356
|
-
current_version = "0.2.
|
|
355
|
+
current_version = "0.2.92"
|
|
357
356
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
358
357
|
serialize = ["{major}.{minor}.{patch}"]
|
|
359
358
|
search = "{current_version}"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
orig
|
|
@@ -241,9 +241,18 @@ class Service(BaseService):
|
|
|
241
241
|
|
|
242
242
|
Raises:
|
|
243
243
|
NotFoundException: If the application with the given ID is not found.
|
|
244
|
-
|
|
244
|
+
RuntimeError: If the application cannot be retrieved unexpectedly.
|
|
245
245
|
"""
|
|
246
|
-
|
|
246
|
+
try:
|
|
247
|
+
return self._get_platform_client().application(application_id)
|
|
248
|
+
except NotFoundException as e:
|
|
249
|
+
message = f"Application with ID '{application_id}' not found: {e}"
|
|
250
|
+
logger.warning(message)
|
|
251
|
+
raise NotFoundException(message) from e
|
|
252
|
+
except Exception as e:
|
|
253
|
+
message = f"Failed to retrieve application with ID '{application_id}': {e}"
|
|
254
|
+
logger.exception(message)
|
|
255
|
+
raise RuntimeError(message) from e
|
|
247
256
|
|
|
248
257
|
def application_version(
|
|
249
258
|
self, application_version_id: str, use_latest_if_no_version_given: bool = False
|
|
@@ -260,7 +269,7 @@ class Service(BaseService):
|
|
|
260
269
|
Raises:
|
|
261
270
|
ValueError: If the application version ID is invalid.
|
|
262
271
|
NotFoundException: If the application with the given ID is not found.
|
|
263
|
-
|
|
272
|
+
RuntimeError: If the application cannot be retrieved unexpectedly.
|
|
264
273
|
"""
|
|
265
274
|
# Validate format: application_id:vX.Y.Z (where X.Y.Z is a semver)
|
|
266
275
|
# This checks for proper format like "he-tme:v0.50.0" where "he-tme" is the application id
|
|
@@ -299,9 +308,19 @@ class Service(BaseService):
|
|
|
299
308
|
list[ApplicationVersion]: A list of all application versions.
|
|
300
309
|
|
|
301
310
|
Raises:
|
|
302
|
-
|
|
311
|
+
NotFoundException: If the application with the given ID is not found.
|
|
312
|
+
RuntimeError: If version list cannot be retrieved unexpectedly.
|
|
303
313
|
"""
|
|
304
|
-
|
|
314
|
+
try:
|
|
315
|
+
return self._get_platform_client().applications.versions.list_sorted(application=application)
|
|
316
|
+
except NotFoundException as e:
|
|
317
|
+
message = f"Application with ID '{application.application_id}' not found: {e}"
|
|
318
|
+
logger.warning(message)
|
|
319
|
+
raise NotFoundException(message) from e
|
|
320
|
+
except Exception as e:
|
|
321
|
+
message = f"Failed to retrieve application versions for application '{application.application_id}': {e}"
|
|
322
|
+
logger.exception(message)
|
|
323
|
+
raise RuntimeError(message) from e
|
|
305
324
|
|
|
306
325
|
def application_version_latest(self, application: Application) -> ApplicationVersion | None:
|
|
307
326
|
"""Get a latest application version.
|
|
@@ -313,7 +332,8 @@ class Service(BaseService):
|
|
|
313
332
|
ApplicationVersion | None: A list of all application versions.
|
|
314
333
|
|
|
315
334
|
Raises:
|
|
316
|
-
|
|
335
|
+
NotFoundException: If the application with the given ID is not found.
|
|
336
|
+
RuntimeError: If version list cannot be retrieved unexpectedly.
|
|
317
337
|
"""
|
|
318
338
|
versions = self.application_versions(application)
|
|
319
339
|
return versions[0] if versions else None
|
|
@@ -403,12 +423,14 @@ class Service(BaseService):
|
|
|
403
423
|
Exception: If the metadata cannot be generated.
|
|
404
424
|
|
|
405
425
|
Raises:
|
|
426
|
+
NotFoundError: If the application version with the given ID is not found.
|
|
406
427
|
ValueError: If the source directory does not exist or is not a directory.
|
|
428
|
+
RuntimeError: If the metadata generation fails unexpectedly.
|
|
407
429
|
"""
|
|
408
430
|
logger.debug("Generating metadata from source directory: %s", source_directory)
|
|
409
431
|
|
|
410
432
|
# TODO(Helmut): Use it
|
|
411
|
-
|
|
433
|
+
_ = Service().application_version(application_version_id, use_latest_if_no_version_given=True)
|
|
412
434
|
|
|
413
435
|
metadata = []
|
|
414
436
|
|
|
@@ -453,17 +475,18 @@ class Service(BaseService):
|
|
|
453
475
|
Service._apply_mappings_to_entry(entry, mappings)
|
|
454
476
|
|
|
455
477
|
metadata.append(entry)
|
|
456
|
-
except Exception:
|
|
457
|
-
message = f"Failed to process file '{file_path}'"
|
|
458
|
-
logger.
|
|
478
|
+
except Exception as e: # noqa: BLE001
|
|
479
|
+
message = f"Failed to process file '{file_path}': {e}"
|
|
480
|
+
logger.warning(message)
|
|
459
481
|
continue
|
|
460
482
|
|
|
461
483
|
logger.debug("Generated metadata for %d files", len(metadata))
|
|
462
484
|
return metadata
|
|
463
485
|
|
|
464
|
-
except Exception:
|
|
465
|
-
|
|
466
|
-
|
|
486
|
+
except Exception as e:
|
|
487
|
+
message = f"Failed to generate metadata from source directory '{source_directory}': {e}"
|
|
488
|
+
logger.exception(message)
|
|
489
|
+
raise RuntimeError(message) from e
|
|
467
490
|
|
|
468
491
|
@staticmethod
|
|
469
492
|
def application_run_upload(
|
|
@@ -485,6 +508,11 @@ class Service(BaseService):
|
|
|
485
508
|
|
|
486
509
|
Returns:
|
|
487
510
|
bool: True if the upload was successful, False otherwise.
|
|
511
|
+
|
|
512
|
+
Raises:
|
|
513
|
+
NotFoundException: If the application version with the given ID is not found.
|
|
514
|
+
RuntimeError: If fetching the application version fails unexpectedly.
|
|
515
|
+
requests.HTTPError: If the upload fails with an HTTP error.
|
|
488
516
|
"""
|
|
489
517
|
import psutil # noqa: PLC0415
|
|
490
518
|
|
|
@@ -555,6 +583,18 @@ class Service(BaseService):
|
|
|
555
583
|
|
|
556
584
|
@staticmethod
|
|
557
585
|
def application_runs_static(limit: int | None = None, completed_only: bool = False) -> list[dict[str, Any]]:
|
|
586
|
+
"""Get a list of all application runs, static variant.
|
|
587
|
+
|
|
588
|
+
Args:
|
|
589
|
+
limit (int | None): The maximum number of runs to retrieve. If None, all runs are retrieved.
|
|
590
|
+
completed_only (bool): If True, only completed runs are retrieved.
|
|
591
|
+
|
|
592
|
+
Returns:
|
|
593
|
+
list[ApplicationRunData]: A list of all application runs.
|
|
594
|
+
|
|
595
|
+
Raises:
|
|
596
|
+
RuntimeError: If the application run list cannot be retrieved.
|
|
597
|
+
"""
|
|
558
598
|
return [
|
|
559
599
|
{
|
|
560
600
|
"application_run_id": run.application_run_id,
|
|
@@ -580,20 +620,25 @@ class Service(BaseService):
|
|
|
580
620
|
list[ApplicationRunData]: A list of all application runs.
|
|
581
621
|
|
|
582
622
|
Raises:
|
|
583
|
-
|
|
623
|
+
RuntimeError: If the application run list cannot be retrieved.
|
|
584
624
|
"""
|
|
585
625
|
if limit is not None and limit <= 0:
|
|
586
626
|
return []
|
|
587
627
|
runs = []
|
|
588
628
|
page_size = LIST_APPLICATION_RUNS_MAX_PAGE_SIZE
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
629
|
+
try:
|
|
630
|
+
run_iterator = self._get_platform_client().runs.list_data(sort="-triggered_at", page_size=page_size)
|
|
631
|
+
for run in run_iterator:
|
|
632
|
+
if status is not None and run.status != status:
|
|
633
|
+
continue
|
|
634
|
+
runs.append(run)
|
|
635
|
+
if limit is not None and len(runs) >= limit:
|
|
636
|
+
break
|
|
637
|
+
return runs
|
|
638
|
+
except Exception as e:
|
|
639
|
+
message = f"Failed to retrieve application runs: {e}"
|
|
640
|
+
logger.exception(message)
|
|
641
|
+
raise RuntimeError(message) from e
|
|
597
642
|
|
|
598
643
|
def application_run(self, run_id: str) -> ApplicationRun:
|
|
599
644
|
"""Find a run by its ID.
|
|
@@ -605,9 +650,14 @@ class Service(BaseService):
|
|
|
605
650
|
ApplicationRun: The run that can be fetched using the .details() call.
|
|
606
651
|
|
|
607
652
|
Raises:
|
|
608
|
-
|
|
653
|
+
RuntimeError: If initializing the client fails or the run cannot be retrieved.
|
|
609
654
|
"""
|
|
610
|
-
|
|
655
|
+
try:
|
|
656
|
+
return self._get_platform_client().run(run_id)
|
|
657
|
+
except Exception as e:
|
|
658
|
+
message = f"Failed to retrieve application run with ID '{run_id}': {e}"
|
|
659
|
+
logger.exception(message)
|
|
660
|
+
raise RuntimeError(message) from e
|
|
611
661
|
|
|
612
662
|
def application_run_submit_from_metadata(
|
|
613
663
|
self, application_version_id: str, metadata: list[dict[str, Any]]
|
|
@@ -623,8 +673,10 @@ class Service(BaseService):
|
|
|
623
673
|
ApplicationRun: The submitted run.
|
|
624
674
|
|
|
625
675
|
Raises:
|
|
626
|
-
|
|
627
|
-
|
|
676
|
+
NotFoundException: If the application version with the given ID is not found.
|
|
677
|
+
ValueError: If platform bucket URL is missing or has unsupported protocol,
|
|
678
|
+
or if the application version ID is invalid.
|
|
679
|
+
RuntimeError: If submitting the run failed unexpectedly.
|
|
628
680
|
"""
|
|
629
681
|
logger.debug("Submitting application run with metadata: %s", metadata)
|
|
630
682
|
items = []
|
|
@@ -677,9 +729,14 @@ class Service(BaseService):
|
|
|
677
729
|
"Submitted application run with items: %s, application run id %s", items, run.application_run_id
|
|
678
730
|
)
|
|
679
731
|
return run
|
|
680
|
-
except
|
|
681
|
-
|
|
682
|
-
|
|
732
|
+
except ValueError as e:
|
|
733
|
+
message = f"Failed to submit application run for version '{application_version_id}': {e}"
|
|
734
|
+
logger.warning(message)
|
|
735
|
+
raise ValueError(message) from e
|
|
736
|
+
except Exception as e:
|
|
737
|
+
message = f"Failed to submit application run for version '{application_version_id}': {e}"
|
|
738
|
+
logger.exception(message)
|
|
739
|
+
raise RuntimeError(message) from e
|
|
683
740
|
|
|
684
741
|
def application_run_submit(self, application_version_id: str, items: list[InputItem]) -> ApplicationRun:
|
|
685
742
|
"""Submit a run for the given application.
|
|
@@ -692,9 +749,20 @@ class Service(BaseService):
|
|
|
692
749
|
ApplicationRun: The submitted run.
|
|
693
750
|
|
|
694
751
|
Raises:
|
|
695
|
-
|
|
752
|
+
NotFoundException: If the application version with the given ID is not found.
|
|
753
|
+
ValueError: If the application version ID is invalid or items invalid.
|
|
754
|
+
RuntimeError: If submitting the run failed unexpectedly.
|
|
696
755
|
"""
|
|
697
|
-
|
|
756
|
+
try:
|
|
757
|
+
return self._get_platform_client().runs.create(application_version=application_version_id, items=items)
|
|
758
|
+
except ValueError as e:
|
|
759
|
+
message = f"Failed to submit application run for version '{application_version_id}': {e}"
|
|
760
|
+
logger.warning(message)
|
|
761
|
+
raise ValueError(message) from e
|
|
762
|
+
except Exception as e:
|
|
763
|
+
message = f"Failed to submit application run for version '{application_version_id}': {e}"
|
|
764
|
+
logger.exception(message)
|
|
765
|
+
raise RuntimeError(message) from e
|
|
698
766
|
|
|
699
767
|
def application_run_cancel(self, run_id: str) -> None:
|
|
700
768
|
"""Cancel a run by its ID.
|
|
@@ -706,9 +774,24 @@ class Service(BaseService):
|
|
|
706
774
|
Exception: If the client cannot be created.
|
|
707
775
|
|
|
708
776
|
Raises:
|
|
709
|
-
|
|
777
|
+
NotFoundException: If the application run with the given ID is not found.
|
|
778
|
+
ValueError: If the run ID is invalid or the run cannot be canceled given its current status.
|
|
779
|
+
RuntimeError: If canceling the run fails unexpectedly.
|
|
710
780
|
"""
|
|
711
|
-
|
|
781
|
+
try:
|
|
782
|
+
self.application_run(run_id).cancel()
|
|
783
|
+
except ValueError as e:
|
|
784
|
+
message = f"Failed to cancel application run with ID '{run_id}': ValueError {e}"
|
|
785
|
+
logger.warning(message)
|
|
786
|
+
raise ValueError(message) from e
|
|
787
|
+
except NotFoundException as e:
|
|
788
|
+
message = f"Application run with ID '{run_id}' not found: {e}"
|
|
789
|
+
logger.warning(message)
|
|
790
|
+
raise NotFoundException(message) from e
|
|
791
|
+
except Exception as e:
|
|
792
|
+
message = f"Failed to cancel application run with ID '{run_id}': {e}"
|
|
793
|
+
logger.exception(message)
|
|
794
|
+
raise RuntimeError(message) from e
|
|
712
795
|
|
|
713
796
|
@staticmethod
|
|
714
797
|
def application_run_download_static( # noqa: PLR0913, PLR0917
|
|
@@ -720,6 +803,30 @@ class Service(BaseService):
|
|
|
720
803
|
qupath_project: bool = False,
|
|
721
804
|
download_progress_queue: Any | None = None, # noqa: ANN401
|
|
722
805
|
) -> Path:
|
|
806
|
+
"""Download application run results with progress tracking, static variant.
|
|
807
|
+
|
|
808
|
+
Args:
|
|
809
|
+
run_id (str): The ID of the application run to download.
|
|
810
|
+
destination_directory (Path): Directory to save downloaded files.
|
|
811
|
+
create_subdirectory_for_run (bool): Whether to create a subdirectory for the run.
|
|
812
|
+
create_subdirectory_per_item (bool): Whether to create a subdirectory for each item,
|
|
813
|
+
if not set, all items will be downloaded to the same directory but prefixed
|
|
814
|
+
with the item reference and underscore.
|
|
815
|
+
wait_for_completion (bool): Whether to wait for run completion. Defaults to True.
|
|
816
|
+
qupath_project (bool): If True, create QuPath project referencing input slides and results.
|
|
817
|
+
This requires QuPath to be installed. The QuPath project will be created in a subfolder
|
|
818
|
+
of the destination directory.
|
|
819
|
+
download_progress_queue (Queue | None): Queue for GUI progress updates.
|
|
820
|
+
|
|
821
|
+
Returns:
|
|
822
|
+
Path: The directory containing downloaded results.
|
|
823
|
+
|
|
824
|
+
Raises:
|
|
825
|
+
ValueError: If the run ID is invalid or destination directory cannot be created.
|
|
826
|
+
NotFoundException: If the application run with the given ID is not found.
|
|
827
|
+
RuntimeError: If run details cannot be retrieved or download fails unexpectedly.
|
|
828
|
+
requests.HTTPError: If the download fails with an HTTP error.
|
|
829
|
+
"""
|
|
723
830
|
return Service().application_run_download(
|
|
724
831
|
run_id,
|
|
725
832
|
destination_directory,
|
|
@@ -763,8 +870,9 @@ class Service(BaseService):
|
|
|
763
870
|
|
|
764
871
|
Raises:
|
|
765
872
|
ValueError: If the run ID is invalid or destination directory cannot be created.
|
|
766
|
-
|
|
767
|
-
|
|
873
|
+
NotFoundException: If the application run with the given ID is not found.
|
|
874
|
+
RuntimeError: If run details cannot be retrieved or download fails unexpectedly.
|
|
875
|
+
requests.HTTPError: If the download fails with an HTTP error.
|
|
768
876
|
"""
|
|
769
877
|
if qupath_project and not has_qupath_extra:
|
|
770
878
|
message = "QuPath project creation requested, but 'qupath' extra is not installed."
|
|
@@ -778,6 +886,10 @@ class Service(BaseService):
|
|
|
778
886
|
final_destination_directory = destination_directory
|
|
779
887
|
try:
|
|
780
888
|
details = application_run.details()
|
|
889
|
+
except NotFoundException as e:
|
|
890
|
+
message = f"Application run with ID '{run_id}' not found: {e}"
|
|
891
|
+
logger.warning(message)
|
|
892
|
+
raise NotFoundException(message) from e
|
|
781
893
|
except ApiException as e:
|
|
782
894
|
if e.status == HTTPStatus.UNPROCESSABLE_ENTITY: # Don't use UNPROCESSABLE_CONTENT
|
|
783
895
|
message = f"Run ID '{run_id}' invalid: {e!s}."
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
Generate a signed URL for Amazon CloudFront
|
|
2
|
-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
3
|
-
|
|
4
|
-
The following example shows how to generate a signed URL for Amazon CloudFront.
|
|
5
|
-
Note that you will need the ``cryptography`` `library <https://cryptography.io/en/latest/>`__ to follow this example::
|
|
6
|
-
|
|
7
|
-
import datetime
|
|
8
|
-
|
|
9
|
-
from cryptography.hazmat.backends import default_backend
|
|
10
|
-
from cryptography.hazmat.primitives import hashes
|
|
11
|
-
from cryptography.hazmat.primitives import serialization
|
|
12
|
-
from cryptography.hazmat.primitives.asymmetric import padding
|
|
13
|
-
from botocore.signers import CloudFrontSigner
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def rsa_signer(message):
|
|
17
|
-
with open('path/to/key.pem', 'rb') as key_file:
|
|
18
|
-
private_key = serialization.load_pem_private_key(
|
|
19
|
-
key_file.read(),
|
|
20
|
-
password=None,
|
|
21
|
-
backend=default_backend()
|
|
22
|
-
)
|
|
23
|
-
return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())
|
|
24
|
-
|
|
25
|
-
key_id = 'AKIAIOSFODNN7EXAMPLE'
|
|
26
|
-
url = 'http://d2949o5mkkp72v.cloudfront.net/hello.txt'
|
|
27
|
-
expire_date = datetime.datetime(2017, 1, 1)
|
|
28
|
-
|
|
29
|
-
cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
|
|
30
|
-
|
|
31
|
-
# Create a signed url that will be valid until the specific expiry date
|
|
32
|
-
# provided using a canned policy.
|
|
33
|
-
signed_url = cloudfront_signer.generate_presigned_url(
|
|
34
|
-
url, date_less_than=expire_date)
|
|
35
|
-
print(signed_url)
|