aignostics 0.2.72__tar.gz → 0.2.83__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. {aignostics-0.2.72 → aignostics-0.2.83}/PKG-INFO +2 -1
  2. {aignostics-0.2.72 → aignostics-0.2.83}/examples/notebook.py +1 -1
  3. {aignostics-0.2.72 → aignostics-0.2.83}/pyproject.toml +3 -2
  4. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_service.py +10 -7
  5. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/__init__.py +9 -5
  6. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_utils.py +7 -3
  7. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/resources/applications.py +12 -14
  8. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/resources/runs.py +11 -5
  9. {aignostics-0.2.72 → aignostics-0.2.83}/.gitignore +0 -0
  10. {aignostics-0.2.72 → aignostics-0.2.83}/LICENSE +0 -0
  11. {aignostics-0.2.72 → aignostics-0.2.83}/README.md +0 -0
  12. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/.openapi-generator/FILES +0 -0
  13. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/.openapi-generator/VERSION +0 -0
  14. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  15. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/api_client.py +0 -0
  16. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/api_response.py +0 -0
  17. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/configuration.py +0 -0
  18. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/exceptions.py +0 -0
  19. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  20. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  21. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  22. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  23. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  24. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  25. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  26. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  27. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  28. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  29. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  30. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  31. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  32. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  33. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  34. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  35. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  36. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  37. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  38. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  39. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  40. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  41. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  42. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/aignx/codegen/rest.py +0 -0
  43. {aignostics-0.2.72 → aignostics-0.2.83}/codegen/out/docs/PublicApi.md +0 -0
  44. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  45. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics/_internal/boto3/examples/s3.rst +0 -0
  46. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  47. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  48. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  49. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  50. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  51. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  52. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  53. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  54. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  55. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  56. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  57. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  58. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-13/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  59. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  60. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  61. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  62. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  63. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  64. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  65. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  66. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  67. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  68. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Frameworks/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  69. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/cloudfront.rst +0 -0
  70. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/boto3/examples/s3.rst +0 -0
  71. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  72. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  73. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-macos-latest/aignostics.app/Contents/Resources/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  74. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  75. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  76. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  77. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  78. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-24.04-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  79. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  80. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  81. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  82. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  83. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-ubuntu-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  84. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  85. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/boto3/examples/s3.rst +0 -0
  86. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  87. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  88. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-11-arm/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  89. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  90. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-latest/aignostics/_internal/boto3/examples/s3.rst +0 -0
  91. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.jquery +0 -0
  92. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon +0 -0
  93. {aignostics-0.2.72 → aignostics-0.2.83}/dist_native_all/dist_native-windows-latest/aignostics/_internal/openslide_python-1.4.2.dist-info/licenses/examples/deepzoom/licenses/LICENSE.openseadragon-scalebar +0 -0
  94. {aignostics-0.2.72 → aignostics-0.2.83}/examples/__init__.py +0 -0
  95. {aignostics-0.2.72 → aignostics-0.2.83}/examples/notebook.ipynb +0 -0
  96. {aignostics-0.2.72 → aignostics-0.2.83}/examples/script.py +0 -0
  97. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/__init__.py +0 -0
  98. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/__init__.py +0 -0
  99. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_cli.py +0 -0
  100. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_frame.py +0 -0
  101. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
  102. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  103. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_page_builder.py +0 -0
  104. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_page_index.py +0 -0
  105. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/_utils.py +0 -0
  106. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  107. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  108. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  109. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  110. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  111. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  112. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  113. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  114. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  115. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  116. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  117. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  118. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  119. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  120. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  121. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  122. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_settings.py +0 -0
  123. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/application/_utils.py +0 -0
  124. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/__init__.py +0 -0
  125. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/_cli.py +0 -0
  126. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/_gui.py +0 -0
  127. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/_service.py +0 -0
  128. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/_settings.py +0 -0
  129. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  130. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  131. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/cli.py +0 -0
  132. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/constants.py +0 -0
  133. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/dataset/__init__.py +0 -0
  134. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/dataset/_cli.py +0 -0
  135. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/dataset/_gui.py +0 -0
  136. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/dataset/_service.py +0 -0
  137. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  138. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/gui/__init__.py +0 -0
  139. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/gui/_frame.py +0 -0
  140. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/gui/_theme.py +0 -0
  141. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  142. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/gui/assets/logo.png +0 -0
  143. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/notebook/__init__.py +0 -0
  144. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/notebook/_gui.py +0 -0
  145. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/notebook/_notebook.py +0 -0
  146. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/notebook/_service.py +0 -0
  147. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/notebook/assets/python.lottie +0 -0
  148. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_authentication.py +0 -0
  149. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_cli.py +0 -0
  150. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_client.py +0 -0
  151. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_constants.py +0 -0
  152. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_messages.py +0 -0
  153. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_service.py +14 -14
  154. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/_settings.py +0 -0
  155. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/resources/__init__.py +0 -0
  156. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/platform/resources/utils.py +0 -0
  157. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/__init__.py +0 -0
  158. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/_cli.py +0 -0
  159. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/_gui.py +0 -0
  160. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/_service.py +0 -0
  161. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/_settings.py +0 -0
  162. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/assets/download.lottie +0 -0
  163. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  164. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/assets/update.lottie +0 -0
  165. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/scripts/add.groovy +0 -0
  166. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  167. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  168. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/qupath/scripts/test.groovy +0 -0
  169. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/__init__.py +0 -0
  170. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/_cli.py +0 -0
  171. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/_exceptions.py +0 -0
  172. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/_gui.py +0 -0
  173. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/_service.py +0 -0
  174. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/_settings.py +0 -0
  175. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/system/assets/system.lottie +0 -0
  176. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/third_party/bottle.py +0 -0
  177. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/third_party/idc_index.py +0 -0
  178. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/__init__.py +0 -0
  179. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_cli.py +0 -0
  180. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_console.py +0 -0
  181. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_constants.py +0 -0
  182. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_di.py +0 -0
  183. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_fs.py +0 -0
  184. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_gui.py +0 -0
  185. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_health.py +0 -0
  186. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_log.py +0 -0
  187. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_logfire.py +0 -0
  188. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_notebook.py +0 -0
  189. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_process.py +0 -0
  190. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_sentry.py +0 -0
  191. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_service.py +0 -0
  192. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/_settings.py +0 -0
  193. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/utils/boot.py +0 -0
  194. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/__init__.py +0 -0
  195. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_cli.py +0 -0
  196. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_gui.py +0 -0
  197. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_openslide_handler.py +0 -0
  198. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  199. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_service.py +0 -0
  200. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/_utils.py +0 -0
  201. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics/wsi/assets/fallback.png +0 -0
  202. {aignostics-0.2.72 → aignostics-0.2.83}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.72
3
+ Version: 0.2.83
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/
@@ -89,6 +89,7 @@ Requires-Dist: pyyaml>=6.0
89
89
  Requires-Dist: requests-oauthlib>=2.0.0
90
90
  Requires-Dist: requests>=2.32.3
91
91
  Requires-Dist: s5cmd>=0.2.0
92
+ Requires-Dist: semver>=3.0.4
92
93
  Requires-Dist: sentry-sdk>=2.30.0
93
94
  Requires-Dist: shapely>=2.1.1
94
95
  Requires-Dist: show-in-file-manager>=1.1.5
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.72",
5
+ # "aignostics==0.2.83",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.72"
3
+ version = "0.2.83"
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 = [
@@ -121,6 +121,7 @@ dependencies = [
121
121
  "requests>=2.32.3",
122
122
  "requests-oauthlib>=2.0.0",
123
123
  "s5cmd>=0.2.0",
124
+ "semver>=3.0.4",
124
125
  "shapely>=2.1.1",
125
126
  "show-in-file-manager>=1.1.5",
126
127
  "tqdm>=4.67.1",
@@ -353,7 +354,7 @@ source = ["src/"]
353
354
 
354
355
 
355
356
  [tool.bumpversion]
356
- current_version = "0.2.72"
357
+ current_version = "0.2.83"
357
358
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
358
359
  serialize = ["{major}.{minor}.{patch}"]
359
360
  search = "{current_version}"
@@ -12,6 +12,7 @@ from typing import Any
12
12
 
13
13
  import google_crc32c
14
14
  import requests
15
+ import semver
15
16
  from pydantic import BaseModel, computed_field
16
17
 
17
18
  from aignostics.bucket import Service as BucketService
@@ -264,21 +265,23 @@ class Service(BaseService):
264
265
  # Validate format: application_id:vX.Y.Z (where X.Y.Z is a semver)
265
266
  # This checks for proper format like "he-tme:v0.50.0" where "he-tme" is the application id
266
267
  # and "v0.50.0" is the version with proper semver format
267
- if not re.match(r"^[^:]+:v\d+\.\d+\.\d+$", application_version_id):
268
+ match = re.match(r"^([^:]+):v(.+)$", application_version_id)
269
+ if not match or not semver.Version.is_valid(match.group(2)):
268
270
  if use_latest_if_no_version_given:
269
- latest_version = self.application_version_latest(self.application(application_version_id))
271
+ application_id = match.group(1) if match else application_version_id
272
+ latest_version = self.application_version_latest(self.application(application_id))
270
273
  if latest_version:
271
274
  return latest_version
272
- message = f"No valid application version found for '{application_version_id}' "
273
- message += "and no latest version available."
275
+ message = (
276
+ f"No valid application version found for '{application_version_id}'no latest version available."
277
+ )
274
278
  logger.warning(message)
275
279
  raise ValueError(message)
276
280
  message = f"Invalid application version id format: {application_version_id}. "
277
- "Expected format: application_id:vX.Y.Z"
281
+ message += "Expected format: application_id:vX.Y.Z"
278
282
  raise ValueError(message)
279
283
 
280
- application_id = application_version_id.split(":", maxsplit=1)[0]
281
-
284
+ application_id = match.group(1)
282
285
  application = self.application(application_id)
283
286
  for version in self.application_versions(application):
284
287
  if version.application_version_id == application_version_id:
@@ -1,9 +1,13 @@
1
- """
2
- This module provides the main client interface for interacting with Aignostics services.
1
+ """This module provides the low-level client interface for interacting with the API of the Aignostics Platform.
2
+
3
+ The primary class in this module is the `Client` class, serving as the entry point
4
+ for authenticated API operations. Login and token management are handled
5
+ automatically.
6
+
7
+ Further operations are encapsulated in the `Service` class, which provides methods
8
+ for manual login, logout and getting information about the authenticated user.
3
9
 
4
- It offers functionality for authentication, data management, and API operations.
5
- The primary class in this module is the `Client` class, which serves as the entry point
6
- for all interactions with the Aignostics platform.
10
+ Higher level abstractions are provided in the application module.
7
11
  """
8
12
 
9
13
  from aignx.codegen.exceptions import ApiException, NotFoundException
@@ -26,6 +26,7 @@ from aignx.codegen.models import OutputArtifactResultReadResponse as OutputArtif
26
26
  from tqdm.auto import tqdm
27
27
 
28
28
  EIGHT_MB = 8_388_608
29
+ SIGNED_DOWNLOAD_URL_EXPIRES_SECONDS_DEFAULT = 6 * 60 * 60 # 6 hours
29
30
 
30
31
 
31
32
  def mime_type_to_file_ending(mime_type: str) -> str:
@@ -71,7 +72,6 @@ def get_mime_type_for_artifact(artifact: OutputArtifactData | InputArtifactData
71
72
  return str(metadata.get("media_type", metadata.get("mime_type", "application/octet-stream")))
72
73
 
73
74
 
74
- # TODO(Andreas,Helmut): discuss
75
75
  def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None:
76
76
  """Downloads a file from a signed URL and verifies its integrity.
77
77
 
@@ -102,11 +102,12 @@ def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None
102
102
  raise ValueError(msg)
103
103
 
104
104
 
105
- def generate_signed_url(url: str) -> str:
105
+ def generate_signed_url(url: str, expires_seconds: int = SIGNED_DOWNLOAD_URL_EXPIRES_SECONDS_DEFAULT) -> str:
106
106
  """Generates a signed URL for a Google Cloud Storage object.
107
107
 
108
108
  Args:
109
109
  url (str): The fully qualified bucket URL (e.g. gs://bucket/path/to/object).
110
+ expires_seconds (int): The number of seconds the signed URL should be valid for.
110
111
 
111
112
  Returns:
112
113
  str: A signed URL that can be used to download the object.
@@ -131,7 +132,10 @@ def generate_signed_url(url: str) -> str:
131
132
  msg = f"Blob does not exist: {url}"
132
133
  raise ValueError(msg)
133
134
 
134
- return t.cast("str", blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4"))
135
+ return t.cast(
136
+ "str",
137
+ blob.generate_signed_url(expiration=datetime.timedelta(seconds=expires_seconds), method="GET", version="v4"),
138
+ )
135
139
 
136
140
 
137
141
  def calculate_file_crc32c(file: Path) -> str:
@@ -9,6 +9,7 @@ import re
9
9
  import typing as t
10
10
  from operator import itemgetter
11
11
 
12
+ import semver
12
13
  from aignx.codegen.api.public_api import PublicApi
13
14
  from aignx.codegen.models import ApplicationReadResponse as Application
14
15
  from aignx.codegen.models import ApplicationVersionReadResponse as ApplicationVersion
@@ -22,7 +23,7 @@ class Versions:
22
23
  Provides operations to list and retrieve application versions.
23
24
  """
24
25
 
25
- APPLICATION_VERSION_REGEX = re.compile(r"(?P<application_id>[^:]+):v?(?P<version>[^:]+)")
26
+ APPLICATION_VERSION_REGEX = re.compile(r"^(?P<application_id>[^:]+):v(?P<version>[^:].+)$")
26
27
 
27
28
  def __init__(self, api: PublicApi) -> None:
28
29
  """Initializes the Versions resource with the API platform.
@@ -51,9 +52,6 @@ class Versions:
51
52
  application_id=application_id,
52
53
  )
53
54
 
54
- # TODO(Andreas,Helmut): Discuss. This is getting an application version and returning it.
55
- # Can we make this a find_by_id, just getting an application_version_id as a string,
56
- # and returning the application version object?
57
55
  def details(self, application_version: ApplicationVersion | str) -> ApplicationVersion:
58
56
  """Retrieves details for a specific application version.
59
57
 
@@ -71,13 +69,14 @@ class Versions:
71
69
  application_id = application_version.application_id
72
70
  version = application_version.version
73
71
  else:
74
- # split by colon
75
- m = Versions.APPLICATION_VERSION_REGEX.match(application_version)
76
- if not m:
72
+ # Parse and validate the application version ID
73
+ match = self.APPLICATION_VERSION_REGEX.match(application_version)
74
+ if not match:
77
75
  msg = f"Invalid application_version_id: {application_version}"
78
76
  raise RuntimeError(msg)
79
- application_id = m.group("application_id")
80
- version = m.group("version")
77
+
78
+ application_id = match.group("application_id")
79
+ version = match.group("version")
81
80
 
82
81
  application_versions = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get(
83
82
  application_id=application_id,
@@ -106,18 +105,17 @@ class Versions:
106
105
  if not versions:
107
106
  return []
108
107
 
109
- # Extract semantic versions from the version property
108
+ # Extract semantic versions using proper semver parsing
110
109
  versions_with_semver = []
111
110
  for v in versions:
112
111
  try:
113
- # Split into major, minor, patch components for proper comparison
114
- version_parts = [int(x) for x in v.version.split(".")]
115
- versions_with_semver.append((v, version_parts))
112
+ parsed_version = semver.Version.parse(v.version)
113
+ versions_with_semver.append((v, parsed_version))
116
114
  except (ValueError, AttributeError):
117
115
  # If we can't parse the version or version attribute doesn't exist, skip it
118
116
  continue
119
117
 
120
- # Sort by semantic version (major, minor, patch)
118
+ # Sort by semantic version (semver objects have built-in comparison)
121
119
  if versions_with_semver:
122
120
  versions_with_semver.sort(key=itemgetter(1), reverse=True)
123
121
  # Return just the version objects, not the tuples
@@ -128,13 +128,16 @@ class ApplicationRun:
128
128
  application_run_id=self.application_run_id,
129
129
  )
130
130
 
131
- def download_to_folder(self, download_base: Path | str) -> None:
131
+ def download_to_folder(
132
+ self, download_base: Path | str, checksum_attribute_key: str = "checksum_base64_crc32c"
133
+ ) -> None:
132
134
  """Downloads all result artifacts to a folder.
133
135
 
134
136
  Monitors run progress and downloads results as they become available.
135
137
 
136
138
  Args:
137
139
  download_base (Path | str): Base directory to download results to.
140
+ checksum_attribute_key (str): The key used to validate the checksum of the output artifacts.
138
141
 
139
142
  Raises:
140
143
  ValueError: If the provided path is not a directory.
@@ -152,7 +155,7 @@ class ApplicationRun:
152
155
  while application_run_status == ApplicationRunStatus.RUNNING:
153
156
  for item in self.results():
154
157
  if item.status == ItemStatus.SUCCEEDED:
155
- self.ensure_artifacts_downloaded(application_run_dir, item)
158
+ self.ensure_artifacts_downloaded(application_run_dir, item, checksum_attribute_key)
156
159
  sleep(5)
157
160
  application_run_status = self.details().status
158
161
  print(self)
@@ -161,12 +164,14 @@ class ApplicationRun:
161
164
  for item in self.results():
162
165
  match item.status:
163
166
  case ItemStatus.SUCCEEDED:
164
- self.ensure_artifacts_downloaded(application_run_dir, item)
167
+ self.ensure_artifacts_downloaded(application_run_dir, item, checksum_attribute_key)
165
168
  case ItemStatus.ERROR_SYSTEM | ItemStatus.ERROR_USER:
166
169
  print(f"{item.reference} failed with {item.status.value}: {item.error}")
167
170
 
168
171
  @staticmethod
169
- def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse) -> None:
172
+ def ensure_artifacts_downloaded(
173
+ base_folder: Path, item: ItemResultReadResponse, checksum_attribute_key: str = "checksum_base64_crc32c"
174
+ ) -> None:
170
175
  """Ensures all artifacts for an item are downloaded.
171
176
 
172
177
  Downloads missing or partially downloaded artifacts and verifies their integrity.
@@ -174,6 +179,7 @@ class ApplicationRun:
174
179
  Args:
175
180
  base_folder (Path): Base directory to download artifacts to.
176
181
  item (ItemResultReadResponse): The item result containing the artifacts to download.
182
+ checksum_attribute_key (str): The key used to validate the checksum of the output artifacts.
177
183
 
178
184
  Raises:
179
185
  ValueError: If checksums don't match.
@@ -187,7 +193,7 @@ class ApplicationRun:
187
193
  item_dir.mkdir(exist_ok=True, parents=True)
188
194
  file_ending = mime_type_to_file_ending(get_mime_type_for_artifact(artifact))
189
195
  file_path = item_dir / f"{artifact.name}{file_ending}"
190
- checksum = artifact.metadata["checksum_crc32c"]
196
+ checksum = artifact.metadata[checksum_attribute_key]
191
197
 
192
198
  if file_path.exists():
193
199
  file_checksum = calculate_file_crc32c(file_path)
File without changes
File without changes
File without changes
@@ -213,20 +213,6 @@ class Service(BaseService):
213
213
  },
214
214
  )
215
215
 
216
- @staticmethod
217
- def logout() -> bool:
218
- """Logout if authenticated.
219
-
220
- Deletes the cached authentication token if existing.
221
-
222
- Returns:
223
- bool: True if successfully logged out, False if not logged in.
224
- """
225
- logger.debug("Logging out...")
226
- rtn = remove_cached_token()
227
- logger.debug("Logout successful: %s", rtn)
228
- return rtn
229
-
230
216
  @staticmethod
231
217
  def login(relogin: bool = False) -> bool:
232
218
  """Login.
@@ -247,6 +233,20 @@ class Service(BaseService):
247
233
  logger.exception(message)
248
234
  return False
249
235
 
236
+ @staticmethod
237
+ def logout() -> bool:
238
+ """Logout if authenticated.
239
+
240
+ Deletes the cached authentication token if existing.
241
+
242
+ Returns:
243
+ bool: True if successfully logged out, False if not logged in.
244
+ """
245
+ logger.debug("Logging out...")
246
+ rtn = remove_cached_token()
247
+ logger.debug("Logout successful: %s", rtn)
248
+ return rtn
249
+
250
250
  @staticmethod
251
251
  def get_user_info(relogin: bool = False) -> UserInfo | None:
252
252
  """Get user information from authentication token.