aignostics 0.2.199__tar.gz → 0.2.201__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.199 → aignostics-0.2.201}/PKG-INFO +13 -20
- {aignostics-0.2.199 → aignostics-0.2.201}/examples/notebook.py +1 -1
- {aignostics-0.2.199 → aignostics-0.2.201}/pyproject.toml +20 -26
- aignostics-0.2.201/src/aignostics/__init__.py +46 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/CLAUDE.md +5 -2
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_cli.py +47 -47
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_download.py +7 -8
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_frame.py +2 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_application_describe.py +6 -7
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_application_run_describe.py +10 -11
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_index.py +0 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_service.py +40 -41
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_utils.py +5 -6
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/CLAUDE.md +4 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_cli.py +2 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_gui.py +2 -2
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_service.py +16 -17
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/cli.py +2 -4
- aignostics-0.2.201/src/aignostics/constants.py +39 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/CLAUDE.md +8 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_cli.py +5 -6
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_gui.py +1 -1
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_service.py +21 -22
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/CLAUDE.md +6 -1
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_gui.py +3 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_service.py +17 -17
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/CLAUDE.md +4 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_authentication.py +24 -7
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_cli.py +2 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_client.py +27 -10
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_sdk_metadata.py +3 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_service.py +2 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_utils.py +0 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/applications.py +26 -9
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/runs.py +31 -13
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/CLAUDE.md +1 -1
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_cli.py +2 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_gui.py +3 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_service.py +29 -31
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/CLAUDE.md +5 -1
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_cli.py +1 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_service.py +5 -7
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/idc_index.py +54 -53
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/CLAUDE.md +3 -5
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/__init__.py +5 -7
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_constants.py +5 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_fs.py +2 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_gui.py +0 -3
- aignostics-0.2.201/src/aignostics/utils/_log.py +195 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_notebook.py +4 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_sentry.py +43 -5
- aignostics-0.2.201/src/aignostics/utils/boot.py +147 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_cli.py +2 -4
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_gui.py +3 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_openslide_handler.py +2 -5
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_pydicom_handler.py +2 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_service.py +2 -3
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics.py +5 -5
- aignostics-0.2.199/src/aignostics/__init__.py +0 -27
- aignostics-0.2.199/src/aignostics/constants.py +0 -18
- aignostics-0.2.199/src/aignostics/utils/_log.py +0 -199
- aignostics-0.2.199/src/aignostics/utils/_logfire.py +0 -82
- aignostics-0.2.199/src/aignostics/utils/boot.py +0 -109
- {aignostics-0.2.199 → aignostics-0.2.201}/.gitignore +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/LICENSE +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/README.md +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/.openapi-generator/FILES +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/.openapi-generator/VERSION +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api/public_api.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api_client.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/configuration.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/exceptions.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_read_short_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_version.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_output.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_state.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_termination_reason.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/auth0_organization.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/auth0_user.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/custom_metadata_update_request.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/input_artifact.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_output.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_state.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_termination_reason.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/me_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/organization_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_visibility.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_item_statistics.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_output.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_state.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_termination_reason.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/user_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/version_read_response.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/rest.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/docs/PublicApi.md +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/examples/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/examples/notebook.ipynb +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/examples/script.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/CLAUDE.md +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_builder.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_utils.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/.gitignore +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/done.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/error.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/processing.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/ruo.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_models.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/CLAUDE.md +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_error.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_frame.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_theme.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/cat.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/logo.png +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_notebook.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/assets/python.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_constants.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_messages.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_operation_cache.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/utils.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/download.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/microscope.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/update.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/add.groovy +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/test.groovy +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_exceptions.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_gui.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/assets/system.lottie +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/bottle.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/argumentsparse.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/constants.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/py.typed +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/showinfm.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/linux.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/tools.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/urivalidate.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/windows.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_cli.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_console.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_di.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_health.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_process.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_service.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_settings.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_user_agent.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/CLAUDE.md +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/__init__.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_utils.py +0 -0
- {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/assets/fallback.png +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aignostics
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.201
|
|
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/
|
|
@@ -49,42 +49,35 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
49
49
|
Classifier: Typing :: Typed
|
|
50
50
|
Requires-Python: <3.14,>=3.11
|
|
51
51
|
Requires-Dist: aiopath<1,>=0.6.11
|
|
52
|
-
Requires-Dist: boto3<2,>=1.40.
|
|
53
|
-
Requires-Dist: certifi<2026,>=2025.
|
|
52
|
+
Requires-Dist: boto3<2,>=1.40.61
|
|
53
|
+
Requires-Dist: certifi<2026,>=2025.11.12
|
|
54
54
|
Requires-Dist: defusedxml>=0.7.1
|
|
55
55
|
Requires-Dist: dicom-validator<1,>=0.7.3
|
|
56
56
|
Requires-Dist: dicomweb-client[gcp]<1,>=0.59.3
|
|
57
57
|
Requires-Dist: duckdb<=1.4.1,>=0.10.0
|
|
58
|
-
Requires-Dist: fastapi[all,standard]<1,>=0.
|
|
58
|
+
Requires-Dist: fastapi[all,standard]<1,>=0.121.1
|
|
59
59
|
Requires-Dist: fastparquet<2025,>=2024.11.0
|
|
60
|
-
Requires-Dist: google-cloud-storage<4,>=3.
|
|
60
|
+
Requires-Dist: google-cloud-storage<4,>=3.5.0
|
|
61
61
|
Requires-Dist: google-crc32c<2,>=1.7.1
|
|
62
62
|
Requires-Dist: highdicom<1,>=0.26.1
|
|
63
63
|
Requires-Dist: html-sanitizer<3,>=2.6.0
|
|
64
64
|
Requires-Dist: httpx<1,>=0.28.1
|
|
65
65
|
Requires-Dist: humanize<5,>=4.14.0
|
|
66
|
-
Requires-Dist: idc-index-data==22.
|
|
66
|
+
Requires-Dist: idc-index-data==22.1.2
|
|
67
67
|
Requires-Dist: ijson<4,>=3.4.0.post0
|
|
68
68
|
Requires-Dist: jsf<1,>=0.11.2
|
|
69
69
|
Requires-Dist: jsonschema[format-nongpl]<5,>=4.25.1
|
|
70
|
-
Requires-Dist:
|
|
70
|
+
Requires-Dist: loguru>=0.7.3
|
|
71
71
|
Requires-Dist: nicegui[native]<3.2.0,>=3.1.0
|
|
72
72
|
Requires-Dist: openslide-bin<5,>=4.0.0.8
|
|
73
73
|
Requires-Dist: openslide-python<2,>=1.4.2
|
|
74
|
-
Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.53b0
|
|
75
|
-
Requires-Dist: opentelemetry-instrumentation-httpx<1,>=0.53b0
|
|
76
|
-
Requires-Dist: opentelemetry-instrumentation-jinja2<1,>=0.53b0
|
|
77
|
-
Requires-Dist: opentelemetry-instrumentation-requests<1,>=0.53b0
|
|
78
|
-
Requires-Dist: opentelemetry-instrumentation-sqlite3<1,>=0.53b0
|
|
79
|
-
Requires-Dist: opentelemetry-instrumentation-tornado<1,>=0.53b0
|
|
80
|
-
Requires-Dist: opentelemetry-instrumentation-urllib3<1,>=0.53b0
|
|
81
|
-
Requires-Dist: opentelemetry-instrumentation-urllib<1,>=0.53b0
|
|
82
74
|
Requires-Dist: packaging<26,>=25.0
|
|
83
75
|
Requires-Dist: pandas<3,>=2.3.3
|
|
84
76
|
Requires-Dist: platformdirs<5,>=4.3.8
|
|
85
77
|
Requires-Dist: platformdirs<5,>=4.5.0
|
|
86
|
-
Requires-Dist:
|
|
87
|
-
Requires-Dist:
|
|
78
|
+
Requires-Dist: procrastinate>=3.5.3
|
|
79
|
+
Requires-Dist: psutil<8,>=7.1.3
|
|
80
|
+
Requires-Dist: pydantic-settings<3,>=2.12.0
|
|
88
81
|
Requires-Dist: pyjwt[crypto]<3,>=2.10.1
|
|
89
82
|
Requires-Dist: python-dateutil<3,>=2.9.0.post0
|
|
90
83
|
Requires-Dist: pywin32<311,>=310; sys_platform == 'win32'
|
|
@@ -93,7 +86,7 @@ Requires-Dist: requests-oauthlib<3,>=2.0.0
|
|
|
93
86
|
Requires-Dist: requests<3,>=2.32.5
|
|
94
87
|
Requires-Dist: s5cmd<1,>=0.3.3
|
|
95
88
|
Requires-Dist: semver<4,>=3.0.4
|
|
96
|
-
Requires-Dist: sentry-sdk<3,>=2.
|
|
89
|
+
Requires-Dist: sentry-sdk<3,>=2.44.0
|
|
97
90
|
Requires-Dist: shapely<3,>=2.1.2
|
|
98
91
|
Requires-Dist: tenacity<10,>=9.1.2
|
|
99
92
|
Requires-Dist: tqdm<5,>=4.67.1
|
|
@@ -106,8 +99,8 @@ Provides-Extra: jupyter
|
|
|
106
99
|
Requires-Dist: jupyter<2,>=1.1.1; extra == 'jupyter'
|
|
107
100
|
Provides-Extra: marimo
|
|
108
101
|
Requires-Dist: cloudpathlib<1,>=0.23.0; extra == 'marimo'
|
|
109
|
-
Requires-Dist: ipython<10,>=9.
|
|
110
|
-
Requires-Dist: marimo<1,>=0.17.
|
|
102
|
+
Requires-Dist: ipython<10,>=9.7.0; extra == 'marimo'
|
|
103
|
+
Requires-Dist: marimo<1,>=0.17.7; extra == 'marimo'
|
|
111
104
|
Requires-Dist: matplotlib<4,>=3.10.7; extra == 'marimo'
|
|
112
105
|
Requires-Dist: shapely<3,>=2.1.0; extra == 'marimo'
|
|
113
106
|
Provides-Extra: pyinstaller
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aignostics"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.201"
|
|
4
4
|
description = "🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -74,49 +74,42 @@ requires-python = ">=3.11, <3.14"
|
|
|
74
74
|
|
|
75
75
|
dependencies = [
|
|
76
76
|
# From Template
|
|
77
|
-
"fastapi[standard,all]>=0.
|
|
77
|
+
"fastapi[standard,all]>=0.121.1,<1",
|
|
78
78
|
"humanize>=4.14.0,<5",
|
|
79
|
-
"logfire[system-metrics]>=4.14.2,<5",
|
|
80
79
|
"nicegui[native]>=3.1.0,<3.2.0", # Regression in 3.2.0
|
|
81
|
-
"opentelemetry-instrumentation-fastapi>=0.53b0,<1",
|
|
82
|
-
"opentelemetry-instrumentation-httpx>=0.53b0,<1",
|
|
83
|
-
"opentelemetry-instrumentation-jinja2>=0.53b0,<1",
|
|
84
|
-
"opentelemetry-instrumentation-requests>=0.53b0,<1",
|
|
85
|
-
"opentelemetry-instrumentation-sqlite3>=0.53b0,<1",
|
|
86
|
-
"opentelemetry-instrumentation-tornado>=0.53b0,<1",
|
|
87
|
-
"opentelemetry-instrumentation-urllib>=0.53b0,<1",
|
|
88
|
-
"opentelemetry-instrumentation-urllib3>=0.53b0,<1",
|
|
89
80
|
"packaging>=25.0,<26",
|
|
90
81
|
"platformdirs>=4.5.0,<5",
|
|
91
|
-
"psutil>=7.1.
|
|
92
|
-
"pydantic-settings>=2.
|
|
82
|
+
"psutil>=7.1.3,<8",
|
|
83
|
+
"pydantic-settings>=2.12.0,<3",
|
|
93
84
|
"pywin32>=310,<311 ; sys_platform == 'win32'",
|
|
94
85
|
"pyyaml>=6.0.3,<7",
|
|
95
|
-
"sentry-sdk>=2.
|
|
86
|
+
"sentry-sdk>=2.44.0,<3",
|
|
96
87
|
"typer>=0.20.0,<1",
|
|
97
88
|
"uptime>=3.0.1,<4",
|
|
98
89
|
# Custom
|
|
99
90
|
"aiopath>=0.6.11,<1",
|
|
100
|
-
"boto3>=1.40.
|
|
101
|
-
"certifi>=2025.
|
|
91
|
+
"boto3>=1.40.61,<2",
|
|
92
|
+
"certifi>=2025.11.12,<2026",
|
|
102
93
|
"defusedxml>=0.7.1",
|
|
103
94
|
"dicom-validator>=0.7.3,<1",
|
|
104
95
|
"dicomweb-client[gcp]>=0.59.3,<1",
|
|
105
96
|
"duckdb>=0.10.0,<=1.4.1",
|
|
106
97
|
"fastparquet>=2024.11.0,<2025",
|
|
107
|
-
"google-cloud-storage>=3.
|
|
98
|
+
"google-cloud-storage>=3.5.0,<4",
|
|
108
99
|
"google-crc32c>=1.7.1,<2",
|
|
109
100
|
"highdicom>=0.26.1,<1",
|
|
110
101
|
"html-sanitizer>=2.6.0,<3",
|
|
111
102
|
"httpx>=0.28.1,<1",
|
|
112
|
-
"idc-index-data==22.
|
|
103
|
+
"idc-index-data==22.1.2",
|
|
113
104
|
"ijson>=3.4.0.post0,<4",
|
|
114
105
|
"jsf>=0.11.2,<1",
|
|
115
106
|
"jsonschema[format-nongpl]>=4.25.1,<5",
|
|
107
|
+
"loguru>=0.7.3",
|
|
116
108
|
"openslide-bin>=4.0.0.8,<5",
|
|
117
109
|
"openslide-python>=1.4.2,<2",
|
|
118
110
|
"pandas>=2.3.3,<3",
|
|
119
111
|
"platformdirs>=4.3.8,<5",
|
|
112
|
+
"procrastinate>=3.5.3",
|
|
120
113
|
"pyjwt[crypto]>=2.10.1,<3",
|
|
121
114
|
"python-dateutil>=2.9.0.post0,<3",
|
|
122
115
|
# "pywebview[qt6]>=5.4,<6; sys_platform == 'linux'",
|
|
@@ -137,8 +130,8 @@ pyinstaller = ["pyinstaller>=6.14.0,<7"]
|
|
|
137
130
|
jupyter = ["jupyter>=1.1.1,<2"]
|
|
138
131
|
marimo = [
|
|
139
132
|
"cloudpathlib>=0.23.0,<1",
|
|
140
|
-
"ipython>=9.
|
|
141
|
-
"marimo>=0.17.
|
|
133
|
+
"ipython>=9.7.0,<10",
|
|
134
|
+
"marimo>=0.17.7,<1",
|
|
142
135
|
"matplotlib>=3.10.7,<4",
|
|
143
136
|
"shapely>=2.1.0,<3",
|
|
144
137
|
]
|
|
@@ -153,15 +146,15 @@ dev = [
|
|
|
153
146
|
"furo>=2025.9.25,<2026",
|
|
154
147
|
"git-cliff>=2.10.1,<3",
|
|
155
148
|
"mypy>=1.18.2,<2",
|
|
156
|
-
"nox[uv]>=2025.
|
|
149
|
+
"nox[uv]>=2025.11.12,<2026",
|
|
157
150
|
"pip-audit>=2.9.0,<3",
|
|
158
151
|
"pip-licenses @ git+https://github.com/neXenio/pip-licenses.git@master", # https://github.com/raimon49/pip-licenses/pull/224
|
|
159
|
-
"pre-commit>=4.
|
|
152
|
+
"pre-commit>=4.4.0,<5",
|
|
160
153
|
"pyright>=1.1.406,<1.1.407", # Regression in 1.1.407, see https://github.com/microsoft/pyright/issues/11060
|
|
161
154
|
"pytest>=8.4.2,<9",
|
|
162
|
-
"pytest-asyncio>=1.
|
|
155
|
+
"pytest-asyncio>=1.3.0,<2",
|
|
163
156
|
"pytest-cov>=7.0.0,<8",
|
|
164
|
-
"pytest-docker>=3.2.
|
|
157
|
+
"pytest-docker>=3.2.5,<4",
|
|
165
158
|
"pytest-durations>=1.6.1,<2",
|
|
166
159
|
"pytest-env>=1.2.0,<2",
|
|
167
160
|
"pytest-md-report>=0.7.0,<1",
|
|
@@ -172,7 +165,7 @@ dev = [
|
|
|
172
165
|
"pytest-timeout>=2.4.0,<3",
|
|
173
166
|
"pytest-watcher>=0.4.3,<1",
|
|
174
167
|
"pytest-xdist[psutil]>=3.8.0,<4",
|
|
175
|
-
"ruff>=0.14.
|
|
168
|
+
"ruff>=0.14.4,<1",
|
|
176
169
|
"scalene>=1.5.55,<2",
|
|
177
170
|
"sphinx>=8.2.3,<9",
|
|
178
171
|
"sphinx-autobuild>=2025.8.25,<2026",
|
|
@@ -274,6 +267,7 @@ ignore = [
|
|
|
274
267
|
"PTH123", # use of open to be replaced with Path.open,
|
|
275
268
|
"T201", # Remove `print`
|
|
276
269
|
"INP001", # Checks for packages that are missing an __init__.py file.
|
|
270
|
+
"BLE001", # Accept for now TODO(Helmut): Add proper exception handling later
|
|
277
271
|
]
|
|
278
272
|
|
|
279
273
|
[tool.ruff.lint.per-file-ignores]
|
|
@@ -378,7 +372,7 @@ source = ["src/"]
|
|
|
378
372
|
|
|
379
373
|
|
|
380
374
|
[tool.bumpversion]
|
|
381
|
-
current_version = "0.2.
|
|
375
|
+
current_version = "0.2.201"
|
|
382
376
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
383
377
|
serialize = ["{major}.{minor}.{patch}"]
|
|
384
378
|
search = "{current_version}"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Python SDK providing access to Aignostics AI services."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .constants import (
|
|
7
|
+
HETA_APPLICATION_ID,
|
|
8
|
+
SENTRY_INTEGRATIONS,
|
|
9
|
+
TEST_APP_APPLICATION_ID,
|
|
10
|
+
WSI_SUPPORTED_FILE_EXTENSIONS,
|
|
11
|
+
WSI_SUPPORTED_FILE_EXTENSIONS_TEST_APP,
|
|
12
|
+
)
|
|
13
|
+
from .utils.boot import boot
|
|
14
|
+
|
|
15
|
+
# Add scheme to HTTP proxy environment variables if missing
|
|
16
|
+
for proxy_var in ["HTTP_PROXY", "HTTPS_PROXY"]:
|
|
17
|
+
proxy_url = os.environ.get(proxy_var)
|
|
18
|
+
if proxy_url and not proxy_url.startswith(("http://", "https://")):
|
|
19
|
+
os.environ[proxy_var] = f"http://{proxy_url}"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _log_filter(record: Any) -> bool: # noqa: ANN401
|
|
23
|
+
"""Filter out unwanted log messages.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
record: The log record to filter
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
bool: True to log the message, False to filter it out
|
|
30
|
+
"""
|
|
31
|
+
return not (
|
|
32
|
+
(record["name"] == "azure.storage.blob._shared.avro.schema" and record["function"] == "register")
|
|
33
|
+
or (record["name"] == "matplotlib.font_manager" and record["function"] == "_findfont_cached")
|
|
34
|
+
or (record["name"] == "PIL.PngImagePlugin" and record["function"] == "call")
|
|
35
|
+
or (record["name"] == "PIL.PngImagePlugin" and record["function"] == "_open")
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
boot(sentry_integrations=SENTRY_INTEGRATIONS, log_filter=_log_filter)
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
"HETA_APPLICATION_ID",
|
|
43
|
+
"TEST_APP_APPLICATION_ID",
|
|
44
|
+
"WSI_SUPPORTED_FILE_EXTENSIONS",
|
|
45
|
+
"WSI_SUPPORTED_FILE_EXTENSIONS_TEST_APP",
|
|
46
|
+
]
|
|
@@ -63,6 +63,7 @@ application/
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
**Key Separation:**
|
|
66
|
+
|
|
66
67
|
- **_models.py**: Pydantic models for progress tracking with computed fields
|
|
67
68
|
- **_download.py**: Pure download logic (URLs, artifacts, progress callbacks)
|
|
68
69
|
- **_service.py**: High-level business logic and module integration
|
|
@@ -396,6 +397,7 @@ APPLICATION_RUN_DOWNLOAD_CHUNK_SIZE = 1024 * 1024 # 1MB (for streaming download
|
|
|
396
397
|
**URL Support:**
|
|
397
398
|
|
|
398
399
|
The download module supports three URL schemes:
|
|
400
|
+
|
|
399
401
|
1. **gs://** - Google Cloud Storage (converted to signed URLs via `platform.generate_signed_url()`)
|
|
400
402
|
2. **http://** - HTTP URLs (used directly)
|
|
401
403
|
3. **https://** - HTTPS URLs (used directly)
|
|
@@ -658,9 +660,9 @@ def test_application_version_use_latest_fallback():
|
|
|
658
660
|
**Logging Patterns (Actual):**
|
|
659
661
|
|
|
660
662
|
```python
|
|
661
|
-
logger = get_logger(__name__)
|
|
662
663
|
|
|
663
|
-
|
|
664
|
+
|
|
665
|
+
logger.debug("Starting application run", extra={
|
|
664
666
|
"application_id": app_id,
|
|
665
667
|
"file_count": len(files)
|
|
666
668
|
})
|
|
@@ -745,6 +747,7 @@ The application module is organized into focused submodules:
|
|
|
745
747
|
**SDK Metadata Integration:**
|
|
746
748
|
|
|
747
749
|
Every run submitted through the application module automatically includes SDK metadata:
|
|
750
|
+
|
|
748
751
|
- **Run metadata** (v0.0.4): Execution context, user info, CI/CD details, tags, timestamps
|
|
749
752
|
- **Item metadata** (v0.0.3): Platform bucket location, tags, timestamps
|
|
750
753
|
- Automatic attachment via `platform._sdk_metadata.build_run_sdk_metadata()`
|
|
@@ -8,10 +8,11 @@ from pathlib import Path
|
|
|
8
8
|
from typing import Annotated
|
|
9
9
|
|
|
10
10
|
import typer
|
|
11
|
+
from loguru import logger
|
|
11
12
|
|
|
12
13
|
from aignostics.bucket import Service as BucketService
|
|
13
14
|
from aignostics.platform import NotFoundException, RunState
|
|
14
|
-
from aignostics.utils import console,
|
|
15
|
+
from aignostics.utils import console, get_user_data_directory, sanitize_path
|
|
15
16
|
|
|
16
17
|
from ._models import DownloadProgress, DownloadProgressState
|
|
17
18
|
from ._service import Service
|
|
@@ -27,7 +28,6 @@ from ._utils import (
|
|
|
27
28
|
|
|
28
29
|
MESSAGE_NOT_YET_IMPLEMENTED = "NOT YET IMPLEMENTED"
|
|
29
30
|
|
|
30
|
-
logger = get_logger(__name__)
|
|
31
31
|
|
|
32
32
|
cli = typer.Typer(name="application", help="List and inspect applications on Aignostics Platform.")
|
|
33
33
|
|
|
@@ -65,7 +65,7 @@ def application_list(
|
|
|
65
65
|
try:
|
|
66
66
|
details = Service().application(app.application_id)
|
|
67
67
|
except Exception as e:
|
|
68
|
-
logger.exception("Failed to get application details for application '
|
|
68
|
+
logger.exception(f"Failed to get application details for application '{app.application_id}'")
|
|
69
69
|
console.print(
|
|
70
70
|
f"[error]Error:[/error] Failed to get application details for application "
|
|
71
71
|
f"'{app.application_id}': {e}"
|
|
@@ -96,7 +96,7 @@ def application_list(
|
|
|
96
96
|
)
|
|
97
97
|
|
|
98
98
|
if app_count == 0:
|
|
99
|
-
logger.
|
|
99
|
+
logger.debug("No applications available.")
|
|
100
100
|
console.print("No applications available.")
|
|
101
101
|
|
|
102
102
|
|
|
@@ -216,11 +216,11 @@ def application_describe(
|
|
|
216
216
|
try:
|
|
217
217
|
app = Service().application(application_id)
|
|
218
218
|
except NotFoundException:
|
|
219
|
-
logger.warning("Application with ID '
|
|
219
|
+
logger.warning(f"Application with ID '{application_id}' not found.")
|
|
220
220
|
console.print(f"[warning]Warning:[/warning] Application with ID '{application_id}' not found.")
|
|
221
221
|
sys.exit(2)
|
|
222
222
|
except Exception as e:
|
|
223
|
-
logger.exception("Failed to describe application with ID '
|
|
223
|
+
logger.exception(f"Failed to describe application with ID '{application_id}'")
|
|
224
224
|
console.print(f"[error]Error:[/error] Failed to describe application: {e}")
|
|
225
225
|
sys.exit(1)
|
|
226
226
|
|
|
@@ -243,7 +243,7 @@ def application_describe(
|
|
|
243
243
|
try:
|
|
244
244
|
app_version = Service().application_version(app.application_id, version.number)
|
|
245
245
|
except Exception as e:
|
|
246
|
-
logger.exception("Failed to get application version for '
|
|
246
|
+
logger.exception(f"Failed to get application version for '{application_id}', '{version.number}'")
|
|
247
247
|
console.print(
|
|
248
248
|
f"[error]Error:[/error] Failed to get application version for "
|
|
249
249
|
f"'{application_id}', '{version.number}': {e}"
|
|
@@ -484,7 +484,7 @@ def run_prepare(
|
|
|
484
484
|
),
|
|
485
485
|
)
|
|
486
486
|
console.print(f"Generated metadata file [bold]{metadata_csv}[/bold]")
|
|
487
|
-
logger.
|
|
487
|
+
logger.debug("Generated metadata file: '{}'", metadata_csv)
|
|
488
488
|
|
|
489
489
|
|
|
490
490
|
@run_app.command(name="upload")
|
|
@@ -550,7 +550,7 @@ def run_upload(
|
|
|
550
550
|
source = entry["external_id"]
|
|
551
551
|
source_file_path = Path(source)
|
|
552
552
|
if not source_file_path.is_file():
|
|
553
|
-
logger.warning("Source file '
|
|
553
|
+
logger.warning(f"Source file '{source_file_path}' (row {i}) does not exist")
|
|
554
554
|
console.print(f"[warning]Warning:[/warning] Source file '{source_file_path}' (row {i}) does not exist")
|
|
555
555
|
sys.exit(2)
|
|
556
556
|
|
|
@@ -591,7 +591,7 @@ def run_upload(
|
|
|
591
591
|
upload_progress_callable=update_progress,
|
|
592
592
|
)
|
|
593
593
|
|
|
594
|
-
logger.
|
|
594
|
+
logger.debug("Upload completed.")
|
|
595
595
|
console.print("Upload completed.", style="info")
|
|
596
596
|
|
|
597
597
|
|
|
@@ -695,7 +695,7 @@ def run_submit( # noqa: PLR0913, PLR0917
|
|
|
695
695
|
if not metadata_dict:
|
|
696
696
|
console.print("Could mot read metadata file '%s'", metadata_csv_file)
|
|
697
697
|
sys.exit(2)
|
|
698
|
-
logger.
|
|
698
|
+
logger.trace(
|
|
699
699
|
"Submitting run for application '%s' (version: '%s') with metadata: %s",
|
|
700
700
|
application_id,
|
|
701
701
|
app_version.version_number,
|
|
@@ -778,7 +778,7 @@ def run_list( # noqa: PLR0913, PLR0917
|
|
|
778
778
|
print_runs_verbose(runs) if verbose else print_runs_non_verbose(runs)
|
|
779
779
|
message = f"Listed '{len(runs)}' run(s)."
|
|
780
780
|
console.print(message, style="info")
|
|
781
|
-
logger.
|
|
781
|
+
logger.debug(message)
|
|
782
782
|
except Exception as e:
|
|
783
783
|
logger.exception("Failed to list runs")
|
|
784
784
|
console.print(f"[error]Error:[/error] Failed to list runs: {e}")
|
|
@@ -787,17 +787,17 @@ def run_list( # noqa: PLR0913, PLR0917
|
|
|
787
787
|
@run_app.command("describe")
|
|
788
788
|
def run_describe(run_id: Annotated[str, typer.Argument(help="Id of the run to describe")]) -> None:
|
|
789
789
|
"""Describe run."""
|
|
790
|
-
logger.
|
|
790
|
+
logger.trace("Describing run with ID '{}'", run_id)
|
|
791
791
|
|
|
792
792
|
try:
|
|
793
793
|
retrieve_and_print_run_details(Service().application_run(run_id))
|
|
794
|
-
logger.
|
|
794
|
+
logger.debug("Described run with ID '{}'", run_id)
|
|
795
795
|
except NotFoundException:
|
|
796
|
-
logger.warning("Run with ID '
|
|
796
|
+
logger.warning(f"Run with ID '{run_id}' not found.")
|
|
797
797
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
798
798
|
sys.exit(2)
|
|
799
799
|
except Exception as e:
|
|
800
|
-
logger.exception("Failed to retrieve and print run details for ID '
|
|
800
|
+
logger.exception(f"Failed to retrieve and print run details for ID '{run_id}'")
|
|
801
801
|
console.print(f"[error]Error:[/error] Failed to retrieve run details for ID '{run_id}': {e}")
|
|
802
802
|
sys.exit(1)
|
|
803
803
|
|
|
@@ -808,7 +808,7 @@ def run_dump_metadata(
|
|
|
808
808
|
pretty: Annotated[bool, typer.Option(help="Pretty print JSON output with indentation")] = False,
|
|
809
809
|
) -> None:
|
|
810
810
|
"""Dump custom metadata of a run as JSON to stdout."""
|
|
811
|
-
logger.
|
|
811
|
+
logger.trace("Dumping custom metadata for run with ID '{}'", run_id)
|
|
812
812
|
|
|
813
813
|
try:
|
|
814
814
|
run = Service().application_run(run_id).details()
|
|
@@ -820,13 +820,13 @@ def run_dump_metadata(
|
|
|
820
820
|
else:
|
|
821
821
|
print(json.dumps(custom_metadata))
|
|
822
822
|
|
|
823
|
-
logger.
|
|
823
|
+
logger.debug("Dumped custom metadata for run with ID '{}'", run_id)
|
|
824
824
|
except NotFoundException:
|
|
825
|
-
logger.warning("Run with ID '
|
|
825
|
+
logger.warning(f"Run with ID '{run_id}' not found.")
|
|
826
826
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
827
827
|
sys.exit(2)
|
|
828
828
|
except Exception as e:
|
|
829
|
-
logger.exception("Failed to dump custom metadata for run with ID '
|
|
829
|
+
logger.exception(f"Failed to dump custom metadata for run with ID '{run_id}'")
|
|
830
830
|
console.print(f"[error]Error:[/error] Failed to dump custom metadata for run with ID '{run_id}': {e}")
|
|
831
831
|
sys.exit(1)
|
|
832
832
|
|
|
@@ -838,7 +838,7 @@ def run_dump_item_metadata(
|
|
|
838
838
|
pretty: Annotated[bool, typer.Option(help="Pretty print JSON output with indentation")] = False,
|
|
839
839
|
) -> None:
|
|
840
840
|
"""Dump custom metadata of an item as JSON to stdout."""
|
|
841
|
-
logger.
|
|
841
|
+
logger.trace("Dumping custom metadata for item '{}' in run with ID '{}'", external_id, run_id)
|
|
842
842
|
|
|
843
843
|
try:
|
|
844
844
|
run = Service().application_run(run_id)
|
|
@@ -851,7 +851,7 @@ def run_dump_item_metadata(
|
|
|
851
851
|
break
|
|
852
852
|
|
|
853
853
|
if item is None:
|
|
854
|
-
logger.warning("Item with external ID '
|
|
854
|
+
logger.warning(f"Item with external ID '{external_id}' not found in run '{run_id}'.")
|
|
855
855
|
print(
|
|
856
856
|
f"Warning: Item with external ID '{external_id}' not found in run '{run_id}'.",
|
|
857
857
|
file=sys.stderr,
|
|
@@ -866,13 +866,13 @@ def run_dump_item_metadata(
|
|
|
866
866
|
else:
|
|
867
867
|
print(json.dumps(custom_metadata))
|
|
868
868
|
|
|
869
|
-
logger.
|
|
869
|
+
logger.debug("Dumped custom metadata for item '{}' in run with ID '{}'", external_id, run_id)
|
|
870
870
|
except NotFoundException:
|
|
871
|
-
logger.warning("Run with ID '
|
|
871
|
+
logger.warning(f"Run with ID '{run_id}' not found.")
|
|
872
872
|
print(f"Warning: Run with ID '{run_id}' not found.", file=sys.stderr)
|
|
873
873
|
sys.exit(2)
|
|
874
874
|
except Exception as e:
|
|
875
|
-
logger.exception("Failed to dump custom metadata for item '
|
|
875
|
+
logger.exception(f"Failed to dump custom metadata for item '{external_id}' in run with ID '{run_id}'")
|
|
876
876
|
print(
|
|
877
877
|
f"Error: Failed to dump custom metadata for item '{external_id}' in run with ID '{run_id}': {e}",
|
|
878
878
|
file=sys.stderr,
|
|
@@ -885,22 +885,22 @@ def run_cancel(
|
|
|
885
885
|
run_id: Annotated[str, typer.Argument(..., help="Id of the run to cancel")],
|
|
886
886
|
) -> None:
|
|
887
887
|
"""Cancel run."""
|
|
888
|
-
logger.
|
|
888
|
+
logger.trace("Canceling run with ID '{}'", run_id)
|
|
889
889
|
|
|
890
890
|
try:
|
|
891
891
|
Service().application_run_cancel(run_id)
|
|
892
|
-
logger.
|
|
892
|
+
logger.debug("Canceled run with ID '{}'.", run_id)
|
|
893
893
|
console.print(f"Run with ID '{run_id}' has been canceled.")
|
|
894
894
|
except NotFoundException:
|
|
895
|
-
logger.warning("Run with ID '
|
|
895
|
+
logger.warning(f"Run with ID '{run_id}' not found.")
|
|
896
896
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
897
897
|
sys.exit(2)
|
|
898
898
|
except ValueError:
|
|
899
|
-
logger.warning("Run ID '
|
|
899
|
+
logger.warning(f"Run ID '{run_id}' invalid")
|
|
900
900
|
console.print(f"[warning]Warning:[/warning] Run ID '{run_id}' invalid.")
|
|
901
901
|
sys.exit(2)
|
|
902
902
|
except Exception as e:
|
|
903
|
-
logger.exception("Failed to cancel run with ID '
|
|
903
|
+
logger.exception(f"Failed to cancel run with ID '{run_id}'")
|
|
904
904
|
console.print(f"[bold red]Error:[/bold red] Failed to cancel run with ID '{run_id}': {e}")
|
|
905
905
|
sys.exit(1)
|
|
906
906
|
|
|
@@ -915,7 +915,7 @@ def run_update_metadata(
|
|
|
915
915
|
"""Update custom metadata for a run."""
|
|
916
916
|
import json # noqa: PLC0415
|
|
917
917
|
|
|
918
|
-
logger.
|
|
918
|
+
logger.trace("Updating custom metadata for run with ID '{}'", run_id)
|
|
919
919
|
|
|
920
920
|
try:
|
|
921
921
|
# Parse JSON metadata
|
|
@@ -929,18 +929,18 @@ def run_update_metadata(
|
|
|
929
929
|
sys.exit(1)
|
|
930
930
|
|
|
931
931
|
Service().application_run_update_custom_metadata(run_id, custom_metadata)
|
|
932
|
-
logger.
|
|
932
|
+
logger.debug("Updated custom metadata for run with ID '{}'.", run_id)
|
|
933
933
|
console.print(f"Successfully updated custom metadata for run with ID '{run_id}'.")
|
|
934
934
|
except NotFoundException:
|
|
935
|
-
logger.warning("Run with ID '
|
|
935
|
+
logger.warning(f"Run with ID '{run_id}' not found.")
|
|
936
936
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
937
937
|
sys.exit(2)
|
|
938
938
|
except ValueError as e:
|
|
939
|
-
logger.warning("Run ID '
|
|
939
|
+
logger.warning(f"Run ID '{run_id}' invalid or metadata invalid: {e}")
|
|
940
940
|
console.print(f"[warning]Warning:[/warning] Run ID '{run_id}' invalid or metadata invalid: {e}")
|
|
941
941
|
sys.exit(2)
|
|
942
942
|
except Exception as e:
|
|
943
|
-
logger.exception("Failed to update custom metadata for run with ID '
|
|
943
|
+
logger.exception(f"Failed to update custom metadata for run with ID '{run_id}'")
|
|
944
944
|
console.print(f"[bold red]Error:[/bold red] Failed to update custom metadata for run with ID '{run_id}': {e}")
|
|
945
945
|
sys.exit(1)
|
|
946
946
|
|
|
@@ -956,7 +956,7 @@ def run_update_item_metadata(
|
|
|
956
956
|
"""Update custom metadata for an item in a run."""
|
|
957
957
|
import json # noqa: PLC0415
|
|
958
958
|
|
|
959
|
-
logger.
|
|
959
|
+
logger.trace("Updating custom metadata for item '{}' in run with ID '{}'", external_id, run_id)
|
|
960
960
|
|
|
961
961
|
try:
|
|
962
962
|
# Parse JSON metadata
|
|
@@ -970,10 +970,10 @@ def run_update_item_metadata(
|
|
|
970
970
|
sys.exit(1)
|
|
971
971
|
|
|
972
972
|
Service().application_run_update_item_custom_metadata(run_id, external_id, custom_metadata)
|
|
973
|
-
logger.
|
|
973
|
+
logger.debug("Updated custom metadata for item '{}' in run with ID '{}'.", external_id, run_id)
|
|
974
974
|
console.print(f"Successfully updated custom metadata for item '{external_id}' in run with ID '{run_id}'.")
|
|
975
975
|
except NotFoundException:
|
|
976
|
-
logger.warning("Run with ID '
|
|
976
|
+
logger.warning(f"Run with ID '{run_id}' or item '{external_id}' not found.")
|
|
977
977
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' or item '{external_id}' not found.")
|
|
978
978
|
sys.exit(2)
|
|
979
979
|
except ValueError as e:
|
|
@@ -1047,7 +1047,7 @@ def result_download( # noqa: C901, PLR0913, PLR0915, PLR0917
|
|
|
1047
1047
|
] = False,
|
|
1048
1048
|
) -> None:
|
|
1049
1049
|
"""Download results of a run."""
|
|
1050
|
-
logger.
|
|
1050
|
+
logger.trace(
|
|
1051
1051
|
"Downloading results for run with ID '%s' to '%s' with options: "
|
|
1052
1052
|
"create_subdirectory_for_run=%s, create_subdirectory_per_item=%s, wait_for_completion=%s, qupath_project=%r",
|
|
1053
1053
|
run_id,
|
|
@@ -1197,18 +1197,18 @@ def result_download( # noqa: C901, PLR0913, PLR0915, PLR0917
|
|
|
1197
1197
|
main_download_progress_ui.update(main_task, completed=100, total=100)
|
|
1198
1198
|
|
|
1199
1199
|
message = f"Downloaded results of run '{run_id}' to '{destination_directory}'"
|
|
1200
|
-
logger.
|
|
1200
|
+
logger.debug(message)
|
|
1201
1201
|
console.print(message, style="info")
|
|
1202
1202
|
except NotFoundException as e:
|
|
1203
|
-
logger.warning("Run with ID '
|
|
1203
|
+
logger.warning(f"Run with ID '{run_id}' not found: {e}")
|
|
1204
1204
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
1205
1205
|
sys.exit(2)
|
|
1206
1206
|
except ValueError as e:
|
|
1207
|
-
logger.warning("Bad input to download results of run with ID '
|
|
1207
|
+
logger.warning(f"Bad input to download results of run with ID '{run_id}': {e}")
|
|
1208
1208
|
console.print(f"[warning]Warning:[/warning] Bad input to download results of run with ID '{run_id}': {e}")
|
|
1209
1209
|
sys.exit(2)
|
|
1210
1210
|
except Exception as e:
|
|
1211
|
-
logger.exception("Failed to download results of run with ID '
|
|
1211
|
+
logger.exception(f"Failed to download results of run with ID '{run_id}'")
|
|
1212
1212
|
console.print(
|
|
1213
1213
|
f"[error]Error:[/error] Failed to download results of run with ID '{run_id}': {type(e).__name__}: {e}"
|
|
1214
1214
|
)
|
|
@@ -1220,17 +1220,17 @@ def result_delete(
|
|
|
1220
1220
|
run_id: Annotated[str, typer.Argument(..., help="Id of the run to delete results for")],
|
|
1221
1221
|
) -> None:
|
|
1222
1222
|
"""Delete results of run."""
|
|
1223
|
-
logger.
|
|
1223
|
+
logger.trace("Deleting results for run with ID '{}'", run_id)
|
|
1224
1224
|
|
|
1225
1225
|
try:
|
|
1226
1226
|
Service().application_run_delete(run_id)
|
|
1227
|
-
logger.
|
|
1227
|
+
logger.debug("Deleted run with ID '{}'.", run_id)
|
|
1228
1228
|
console.print(f"Results for run with ID '{run_id}' have been deleted.")
|
|
1229
1229
|
except NotFoundException:
|
|
1230
|
-
logger.warning("Results for with ID '
|
|
1230
|
+
logger.warning(f"Results for with ID '{run_id}' not found.")
|
|
1231
1231
|
console.print(f"[warning]Warning:[/warning] Run with ID '{run_id}' not found.")
|
|
1232
1232
|
sys.exit(2)
|
|
1233
1233
|
except Exception as e:
|
|
1234
|
-
logger.exception("Failed to delete run with ID '
|
|
1234
|
+
logger.exception(f"Failed to delete run with ID '{run_id}'")
|
|
1235
1235
|
console.print(f"[bold red]Error:[/bold red] Failed to delete results for with ID '{run_id}': {e}")
|
|
1236
1236
|
sys.exit(1)
|