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.
Files changed (208) hide show
  1. {aignostics-0.2.199 → aignostics-0.2.201}/PKG-INFO +13 -20
  2. {aignostics-0.2.199 → aignostics-0.2.201}/examples/notebook.py +1 -1
  3. {aignostics-0.2.199 → aignostics-0.2.201}/pyproject.toml +20 -26
  4. aignostics-0.2.201/src/aignostics/__init__.py +46 -0
  5. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/CLAUDE.md +5 -2
  6. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_cli.py +47 -47
  7. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_download.py +7 -8
  8. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_frame.py +2 -4
  9. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_application_describe.py +6 -7
  10. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_application_run_describe.py +10 -11
  11. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_index.py +0 -4
  12. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_service.py +40 -41
  13. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_utils.py +5 -6
  14. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/CLAUDE.md +4 -3
  15. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_cli.py +2 -3
  16. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_gui.py +2 -2
  17. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_service.py +16 -17
  18. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/cli.py +2 -4
  19. aignostics-0.2.201/src/aignostics/constants.py +39 -0
  20. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/CLAUDE.md +8 -3
  21. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_cli.py +5 -6
  22. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_gui.py +1 -1
  23. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/_service.py +21 -22
  24. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/CLAUDE.md +6 -1
  25. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_gui.py +3 -3
  26. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_service.py +17 -17
  27. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/CLAUDE.md +4 -3
  28. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_authentication.py +24 -7
  29. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_cli.py +2 -3
  30. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_client.py +27 -10
  31. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_sdk_metadata.py +3 -4
  32. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_service.py +2 -3
  33. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_utils.py +0 -4
  34. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/applications.py +26 -9
  35. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/runs.py +31 -13
  36. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/CLAUDE.md +1 -1
  37. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_cli.py +2 -4
  38. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_gui.py +3 -4
  39. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_service.py +29 -31
  40. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/CLAUDE.md +5 -1
  41. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_cli.py +1 -3
  42. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_service.py +5 -7
  43. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/idc_index.py +54 -53
  44. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/CLAUDE.md +3 -5
  45. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/__init__.py +5 -7
  46. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_constants.py +5 -0
  47. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_fs.py +2 -4
  48. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_gui.py +0 -3
  49. aignostics-0.2.201/src/aignostics/utils/_log.py +195 -0
  50. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_notebook.py +4 -4
  51. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_sentry.py +43 -5
  52. aignostics-0.2.201/src/aignostics/utils/boot.py +147 -0
  53. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_cli.py +2 -4
  54. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_gui.py +3 -3
  55. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_openslide_handler.py +2 -5
  56. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_pydicom_handler.py +2 -3
  57. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_service.py +2 -3
  58. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics.py +5 -5
  59. aignostics-0.2.199/src/aignostics/__init__.py +0 -27
  60. aignostics-0.2.199/src/aignostics/constants.py +0 -18
  61. aignostics-0.2.199/src/aignostics/utils/_log.py +0 -199
  62. aignostics-0.2.199/src/aignostics/utils/_logfire.py +0 -82
  63. aignostics-0.2.199/src/aignostics/utils/boot.py +0 -109
  64. {aignostics-0.2.199 → aignostics-0.2.201}/.gitignore +0 -0
  65. {aignostics-0.2.199 → aignostics-0.2.201}/LICENSE +0 -0
  66. {aignostics-0.2.199 → aignostics-0.2.201}/README.md +0 -0
  67. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/.openapi-generator/FILES +0 -0
  68. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/.openapi-generator/VERSION +0 -0
  69. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  70. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api_client.py +0 -0
  71. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/api_response.py +0 -0
  72. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/configuration.py +0 -0
  73. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/exceptions.py +0 -0
  74. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  75. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  76. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_read_short_response.py +0 -0
  77. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/application_version.py +0 -0
  78. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_output.py +0 -0
  79. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_state.py +0 -0
  80. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/artifact_termination_reason.py +0 -0
  81. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/auth0_organization.py +0 -0
  82. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/auth0_user.py +0 -0
  83. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/custom_metadata_update_request.py +0 -0
  84. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  85. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/input_artifact.py +0 -0
  86. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  87. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  88. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_output.py +0 -0
  89. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  90. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_state.py +0 -0
  91. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/item_termination_reason.py +0 -0
  92. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/me_read_response.py +0 -0
  93. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/organization_read_response.py +0 -0
  94. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact.py +0 -0
  95. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  96. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  97. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/output_artifact_visibility.py +0 -0
  98. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  99. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  100. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_item_statistics.py +0 -0
  101. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_output.py +0 -0
  102. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  103. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_state.py +0 -0
  104. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/run_termination_reason.py +0 -0
  105. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/user_read_response.py +0 -0
  106. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  107. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  108. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/models/version_read_response.py +0 -0
  109. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/aignx/codegen/rest.py +0 -0
  110. {aignostics-0.2.199 → aignostics-0.2.201}/codegen/out/docs/PublicApi.md +0 -0
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  118. {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  119. {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
  120. {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
  121. {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  122. {aignostics-0.2.199 → aignostics-0.2.201}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  123. {aignostics-0.2.199 → aignostics-0.2.201}/examples/__init__.py +0 -0
  124. {aignostics-0.2.199 → aignostics-0.2.201}/examples/notebook.ipynb +0 -0
  125. {aignostics-0.2.199 → aignostics-0.2.201}/examples/script.py +0 -0
  126. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/CLAUDE.md +0 -0
  127. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/__init__.py +0 -0
  128. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_page_builder.py +0 -0
  129. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/_utils.py +0 -0
  130. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  131. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  132. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  133. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  134. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  135. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  136. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  137. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  138. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  139. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  140. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  141. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  142. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  143. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/processing.lottie +0 -0
  144. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  145. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  146. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_models.py +0 -0
  147. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/application/_settings.py +0 -0
  148. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/__init__.py +0 -0
  149. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/_settings.py +0 -0
  150. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  151. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  152. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/__init__.py +0 -0
  153. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  154. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/CLAUDE.md +0 -0
  155. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/__init__.py +0 -0
  156. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_error.py +0 -0
  157. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_frame.py +0 -0
  158. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/_theme.py +0 -0
  159. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  160. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/cat.lottie +0 -0
  161. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/gui/assets/logo.png +0 -0
  162. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/__init__.py +0 -0
  163. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/_notebook.py +0 -0
  164. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/notebook/assets/python.lottie +0 -0
  165. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/__init__.py +0 -0
  166. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_constants.py +0 -0
  167. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_messages.py +0 -0
  168. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_operation_cache.py +0 -0
  169. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/_settings.py +0 -0
  170. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/__init__.py +0 -0
  171. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/platform/resources/utils.py +0 -0
  172. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/__init__.py +0 -0
  173. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/_settings.py +0 -0
  174. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/download.lottie +0 -0
  175. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  176. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/assets/update.lottie +0 -0
  177. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/add.groovy +0 -0
  178. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  179. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  180. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/qupath/scripts/test.groovy +0 -0
  181. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/__init__.py +0 -0
  182. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_exceptions.py +0 -0
  183. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_gui.py +0 -0
  184. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/_settings.py +0 -0
  185. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/system/assets/system.lottie +0 -0
  186. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/bottle.py +0 -0
  187. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/__init__.py +0 -0
  188. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/argumentsparse.py +0 -0
  189. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/constants.py +0 -0
  190. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/py.typed +0 -0
  191. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/showinfm.py +0 -0
  192. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/__init__.py +0 -0
  193. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/linux.py +0 -0
  194. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/tools.py +0 -0
  195. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/urivalidate.py +0 -0
  196. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/third_party/showinfm/system/windows.py +0 -0
  197. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_cli.py +0 -0
  198. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_console.py +0 -0
  199. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_di.py +0 -0
  200. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_health.py +0 -0
  201. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_process.py +0 -0
  202. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_service.py +0 -0
  203. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_settings.py +0 -0
  204. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/utils/_user_agent.py +0 -0
  205. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/CLAUDE.md +0 -0
  206. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/__init__.py +0 -0
  207. {aignostics-0.2.199 → aignostics-0.2.201}/src/aignostics/wsi/_utils.py +0 -0
  208. {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.199
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.64
53
- Requires-Dist: certifi<2026,>=2025.10.5
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.120.4
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.4.1
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.0.2
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: logfire[system-metrics]<5,>=4.14.2
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: psutil<8,>=7.1.2
87
- Requires-Dist: pydantic-settings<3,>=2.11.0
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.43.0
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.6.0; extra == 'marimo'
110
- Requires-Dist: marimo<1,>=0.17.2; extra == 'marimo'
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
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.199",
5
+ # "aignostics==0.2.201",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.199"
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.120.4,<1",
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.2,<8",
92
- "pydantic-settings>=2.11.0,<3",
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.43.0,<3",
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.64,<2",
101
- "certifi>=2025.10.5,<2026",
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.4.1,<4",
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.0.2",
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.6.0,<10",
141
- "marimo>=0.17.2,<1",
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.10.16,<2026",
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.3.0,<5",
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.2.0,<2",
155
+ "pytest-asyncio>=1.3.0,<2",
163
156
  "pytest-cov>=7.0.0,<8",
164
- "pytest-docker>=3.2.3,<4",
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.3,<1",
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.199"
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
- logger.info("Starting application run", extra={
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, get_logger, get_user_data_directory, sanitize_path
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 '%s'", app.application_id)
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.info("No applications available.")
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 '%s' not found.", application_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 '%s'", application_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 '%s', '%s'", application_id, version.number)
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.info("Generated metadata file: '%s'", metadata_csv)
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 '%s' (row %d) does not exist", source_file_path, i)
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.info("Upload completed.")
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.debug(
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.info(message)
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.debug("Describing run with ID '%s'", run_id)
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.info("Described run with ID '%s'", run_id)
794
+ logger.debug("Described run with ID '{}'", run_id)
795
795
  except NotFoundException:
796
- logger.warning("Run with ID '%s' not found.", run_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 '%s'", run_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.debug("Dumping custom metadata for run with ID '%s'", run_id)
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.info("Dumped custom metadata for run with ID '%s'", run_id)
823
+ logger.debug("Dumped custom metadata for run with ID '{}'", run_id)
824
824
  except NotFoundException:
825
- logger.warning("Run with ID '%s' not found.", run_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 '%s'", run_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.debug("Dumping custom metadata for item '%s' in run with ID '%s'", external_id, run_id)
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 '%s' not found in run '%s'.", external_id, run_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.info("Dumped custom metadata for item '%s' in run with ID '%s'", external_id, run_id)
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 '%s' not found.", run_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 '%s' in run with ID '%s'", external_id, run_id)
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.debug("Canceling run with ID '%s'", run_id)
888
+ logger.trace("Canceling run with ID '{}'", run_id)
889
889
 
890
890
  try:
891
891
  Service().application_run_cancel(run_id)
892
- logger.info("Canceled run with ID '%s'.", run_id)
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 '%s' not found.", run_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 '%s' invalid", 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 '%s'", run_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.debug("Updating custom metadata for run with ID '%s'", run_id)
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.info("Updated custom metadata for run with ID '%s'.", run_id)
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 '%s' not found.", run_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 '%s' invalid or metadata invalid: %s", run_id, e)
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 '%s'", run_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.debug("Updating custom metadata for item '%s' in run with ID '%s'", external_id, run_id)
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.info("Updated custom metadata for item '%s' in run with ID '%s'.", external_id, run_id)
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 '%s' or item '%s' not found.", run_id, external_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.debug(
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.info(message)
1200
+ logger.debug(message)
1201
1201
  console.print(message, style="info")
1202
1202
  except NotFoundException as e:
1203
- logger.warning("Run with ID '%s' not found: %s", run_id, e)
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 '%s': %s", run_id, e)
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 '%s'", run_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.debug("Deleting results for run with ID '%s'", run_id)
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.info("Deleted run with ID '%s'.", run_id)
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 '%s' not found.", run_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 '%s'", run_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)