aignostics 0.2.147__tar.gz → 0.2.153__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 (169) hide show
  1. {aignostics-0.2.147 → aignostics-0.2.153}/PKG-INFO +4 -3
  2. aignostics-0.2.153/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +35 -0
  3. aignostics-0.2.153/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +185 -0
  4. {aignostics-0.2.147 → aignostics-0.2.153}/examples/notebook.py +1 -1
  5. {aignostics-0.2.147 → aignostics-0.2.153}/pyproject.toml +5 -4
  6. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_page_index.py +15 -0
  7. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/_service.py +4 -0
  8. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/boot.py +6 -2
  9. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics.py +22 -11
  10. {aignostics-0.2.147 → aignostics-0.2.153}/.gitignore +0 -0
  11. {aignostics-0.2.147 → aignostics-0.2.153}/LICENSE +0 -0
  12. {aignostics-0.2.147 → aignostics-0.2.153}/README.md +0 -0
  13. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/.openapi-generator/FILES +0 -0
  14. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/.openapi-generator/VERSION +0 -0
  15. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  16. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/api_client.py +0 -0
  17. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/api_response.py +0 -0
  18. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/configuration.py +0 -0
  19. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/exceptions.py +0 -0
  20. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  21. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  22. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  23. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  24. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  25. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  26. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  27. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  28. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  29. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  30. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/me_read_response.py +0 -0
  31. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/organization_read_response.py +0 -0
  32. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  33. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  34. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  35. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  36. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  37. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  38. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  39. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  40. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  41. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  42. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  43. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/user_read_response.py +0 -0
  44. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  45. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  46. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/aignx/codegen/rest.py +0 -0
  47. {aignostics-0.2.147 → aignostics-0.2.153}/codegen/out/docs/PublicApi.md +0 -0
  48. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  49. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  50. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  51. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  52. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  53. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  54. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  55. {aignostics-0.2.147 → aignostics-0.2.153}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  56. {aignostics-0.2.147/dist_native_all/dist_native-windows-latest → aignostics-0.2.153/dist_native_all/dist_native-windows-11-arm}/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  57. {aignostics-0.2.147/dist_native_all/dist_native-windows-latest → aignostics-0.2.153/dist_native_all/dist_native-windows-11-arm}/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  58. {aignostics-0.2.147 → aignostics-0.2.153}/examples/__init__.py +0 -0
  59. {aignostics-0.2.147 → aignostics-0.2.153}/examples/notebook.ipynb +0 -0
  60. {aignostics-0.2.147 → aignostics-0.2.153}/examples/script.py +0 -0
  61. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/__init__.py +0 -0
  62. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/__init__.py +0 -0
  63. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_cli.py +0 -0
  64. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_frame.py +0 -0
  65. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_page_application_describe.py +0 -0
  66. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  67. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_page_builder.py +0 -0
  68. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/_utils.py +0 -0
  69. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  70. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  71. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  72. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  73. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  74. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  75. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  76. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  77. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  78. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  79. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  80. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  81. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  82. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  83. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  84. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  85. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_service.py +0 -0
  86. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_settings.py +0 -0
  87. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/application/_utils.py +0 -0
  88. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/__init__.py +0 -0
  89. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/_cli.py +0 -0
  90. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/_gui.py +0 -0
  91. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/_service.py +0 -0
  92. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/_settings.py +0 -0
  93. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  94. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  95. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/cli.py +0 -0
  96. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/constants.py +0 -0
  97. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/dataset/__init__.py +0 -0
  98. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/dataset/_cli.py +0 -0
  99. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/dataset/_gui.py +0 -0
  100. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/dataset/_service.py +0 -0
  101. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  102. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/__init__.py +0 -0
  103. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/_error.py +0 -0
  104. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/_frame.py +0 -0
  105. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/_theme.py +0 -0
  106. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  107. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/assets/cat.lottie +0 -0
  108. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/gui/assets/logo.png +0 -0
  109. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/notebook/__init__.py +0 -0
  110. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/notebook/_gui.py +0 -0
  111. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/notebook/_notebook.py +0 -0
  112. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/notebook/_service.py +0 -0
  113. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/notebook/assets/python.lottie +0 -0
  114. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/__init__.py +0 -0
  115. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_authentication.py +0 -0
  116. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_cli.py +0 -0
  117. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_client.py +0 -0
  118. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_constants.py +0 -0
  119. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_messages.py +0 -0
  120. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_service.py +0 -0
  121. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_settings.py +0 -0
  122. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/_utils.py +0 -0
  123. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/resources/__init__.py +0 -0
  124. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/resources/applications.py +0 -0
  125. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/resources/runs.py +0 -0
  126. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/platform/resources/utils.py +0 -0
  127. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/__init__.py +0 -0
  128. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/_cli.py +0 -0
  129. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/_gui.py +0 -0
  130. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/_service.py +0 -0
  131. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/_settings.py +0 -0
  132. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/assets/download.lottie +0 -0
  133. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  134. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/assets/update.lottie +0 -0
  135. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/scripts/add.groovy +0 -0
  136. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  137. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  138. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/qupath/scripts/test.groovy +0 -0
  139. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/__init__.py +0 -0
  140. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/_cli.py +0 -0
  141. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/_exceptions.py +0 -0
  142. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/_gui.py +0 -0
  143. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/_settings.py +0 -0
  144. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/system/assets/system.lottie +0 -0
  145. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/third_party/bottle.py +0 -0
  146. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/third_party/idc_index.py +0 -0
  147. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/__init__.py +0 -0
  148. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_cli.py +0 -0
  149. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_console.py +0 -0
  150. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_constants.py +0 -0
  151. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_di.py +0 -0
  152. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_fs.py +0 -0
  153. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_gui.py +0 -0
  154. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_health.py +0 -0
  155. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_log.py +0 -0
  156. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_logfire.py +0 -0
  157. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_notebook.py +0 -0
  158. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_process.py +0 -0
  159. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_sentry.py +0 -0
  160. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_service.py +0 -0
  161. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/utils/_settings.py +0 -0
  162. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/__init__.py +0 -0
  163. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_cli.py +0 -0
  164. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_gui.py +0 -0
  165. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_openslide_handler.py +0 -0
  166. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  167. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_service.py +0 -0
  168. {aignostics-0.2.147 → aignostics-0.2.153}/src/aignostics/wsi/_utils.py +0 -0
  169. {aignostics-0.2.147 → aignostics-0.2.153}/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.147
3
+ Version: 0.2.153
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/
@@ -50,7 +50,7 @@ Classifier: Typing :: Typed
50
50
  Requires-Python: <4.0,>=3.11
51
51
  Requires-Dist: boto3>=1.40.11
52
52
  Requires-Dist: certifi>=2025.8.3
53
- Requires-Dist: dicom-validator>=0.7.1
53
+ Requires-Dist: dicom-validator>=0.7.2
54
54
  Requires-Dist: dicomweb-client[gcp]>=0.59.2
55
55
  Requires-Dist: duckdb<=1.4.0,>=0.10.0
56
56
  Requires-Dist: fastapi[all,standard]>=0.116.1
@@ -63,7 +63,7 @@ Requires-Dist: humanize>=4.12.3
63
63
  Requires-Dist: idc-index-data==21.0.0
64
64
  Requires-Dist: ijson>=3.4.0
65
65
  Requires-Dist: jsf>=0.11.2
66
- Requires-Dist: jsonschema>=4.24.1
66
+ Requires-Dist: jsonschema[format-nongpl]>=4.24.1
67
67
  Requires-Dist: logfire[system-metrics]>=4.3.3
68
68
  Requires-Dist: nicegui[native]>=2.22.2
69
69
  Requires-Dist: openslide-bin>=4.0.0.8
@@ -93,6 +93,7 @@ Requires-Dist: sentry-sdk>=2.35.0
93
93
  Requires-Dist: shapely>=2.1.1
94
94
  Requires-Dist: show-in-file-manager>=1.1.5
95
95
  Requires-Dist: tqdm>=4.67.1
96
+ Requires-Dist: truststore>=0.10.4
96
97
  Requires-Dist: typer>=0.16.0
97
98
  Requires-Dist: uptime>=3.0.1
98
99
  Requires-Dist: urllib3>=2.5.0
@@ -0,0 +1,35 @@
1
+ Generate a signed URL for Amazon CloudFront
2
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3
+
4
+ The following example shows how to generate a signed URL for Amazon CloudFront.
5
+ Note that you will need the ``cryptography`` `library <https://cryptography.io/en/latest/>`__ to follow this example::
6
+
7
+ import datetime
8
+
9
+ from cryptography.hazmat.backends import default_backend
10
+ from cryptography.hazmat.primitives import hashes
11
+ from cryptography.hazmat.primitives import serialization
12
+ from cryptography.hazmat.primitives.asymmetric import padding
13
+ from botocore.signers import CloudFrontSigner
14
+
15
+
16
+ def rsa_signer(message):
17
+ with open('path/to/key.pem', 'rb') as key_file:
18
+ private_key = serialization.load_pem_private_key(
19
+ key_file.read(),
20
+ password=None,
21
+ backend=default_backend()
22
+ )
23
+ return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())
24
+
25
+ key_id = 'AKIAIOSFODNN7EXAMPLE'
26
+ url = 'http://d2949o5mkkp72v.cloudfront.net/hello.txt'
27
+ expire_date = datetime.datetime(2017, 1, 1)
28
+
29
+ cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
30
+
31
+ # Create a signed url that will be valid until the specific expiry date
32
+ # provided using a canned policy.
33
+ signed_url = cloudfront_signer.generate_presigned_url(
34
+ url, date_less_than=expire_date)
35
+ print(signed_url)
@@ -0,0 +1,185 @@
1
+ List objects in an Amazon S3 bucket
2
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3
+
4
+ The following example shows how to use an Amazon S3 bucket resource to list
5
+ the objects in the bucket.
6
+
7
+ .. code-block:: python
8
+
9
+ import boto3
10
+
11
+ s3 = boto3.resource('s3')
12
+ bucket = s3.Bucket('amzn-s3-demo-bucket')
13
+ for obj in bucket.objects.all():
14
+ print(obj.key)
15
+
16
+
17
+ List top-level common prefixes in Amazon S3 bucket
18
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
19
+
20
+ This example shows how to list all of the top-level common prefixes in an
21
+ Amazon S3 bucket:
22
+
23
+ .. code-block:: python
24
+
25
+ import boto3
26
+
27
+ client = boto3.client('s3')
28
+ paginator = client.get_paginator('list_objects')
29
+ result = paginator.paginate(Bucket='amzn-s3-demo-bucket', Delimiter='/')
30
+ for prefix in result.search('CommonPrefixes'):
31
+ print(prefix.get('Prefix'))
32
+
33
+
34
+ Restore Glacier objects in an Amazon S3 bucket
35
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
36
+
37
+ The following example shows how to initiate restoration of glacier objects in
38
+ an Amazon S3 bucket, determine if a restoration is on-going, and determine if a
39
+ restoration is finished.
40
+
41
+ .. code-block:: python
42
+
43
+ import boto3
44
+
45
+ s3 = boto3.resource('s3')
46
+ bucket = s3.Bucket('amzn-s3-demo-bucket')
47
+ for obj_sum in bucket.objects.all():
48
+ obj = s3.Object(obj_sum.bucket_name, obj_sum.key)
49
+ if obj.storage_class == 'GLACIER':
50
+ # Try to restore the object if the storage class is glacier and
51
+ # the object does not have a completed or ongoing restoration
52
+ # request.
53
+ if obj.restore is None:
54
+ print('Submitting restoration request: %s' % obj.key)
55
+ obj.restore_object(RestoreRequest={'Days': 1})
56
+ # Print out objects whose restoration is on-going
57
+ elif 'ongoing-request="true"' in obj.restore:
58
+ print('Restoration in-progress: %s' % obj.key)
59
+ # Print out objects whose restoration is complete
60
+ elif 'ongoing-request="false"' in obj.restore:
61
+ print('Restoration complete: %s' % obj.key)
62
+
63
+
64
+ Uploading/downloading files using SSE KMS
65
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
+
67
+ This example shows how to use SSE-KMS to upload objects using
68
+ server side encryption with a key managed by KMS.
69
+
70
+ We can either use the default KMS master key, or create a
71
+ custom key in AWS and use it to encrypt the object by passing in its
72
+ key id.
73
+
74
+ With KMS, nothing else needs to be provided for getting the
75
+ object; S3 already knows how to decrypt the object.
76
+
77
+
78
+ .. code-block:: python
79
+
80
+ import boto3
81
+ import os
82
+
83
+ BUCKET = 'amzn-s3-demo-bucket'
84
+ s3 = boto3.client('s3')
85
+ keyid = '<the key id>'
86
+
87
+ print("Uploading S3 object with SSE-KMS")
88
+ s3.put_object(Bucket=BUCKET,
89
+ Key='encrypt-key',
90
+ Body=b'foobar',
91
+ ServerSideEncryption='aws:kms',
92
+ # Optional: SSEKMSKeyId
93
+ SSEKMSKeyId=keyid)
94
+ print("Done")
95
+
96
+ # Getting the object:
97
+ print("Getting S3 object...")
98
+ response = s3.get_object(Bucket=BUCKET,
99
+ Key='encrypt-key')
100
+ print("Done, response body:")
101
+ print(response['Body'].read())
102
+
103
+
104
+ Uploading/downloading files using SSE Customer Keys
105
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
106
+
107
+ This example shows how to use SSE-C to upload objects using
108
+ server side encryption with a customer provided key.
109
+
110
+ First, we'll need a 32 byte key. For this example, we'll
111
+ randomly generate a key but you can use any 32 byte key
112
+ you want. Remember, you must the same key to download
113
+ the object. If you lose the encryption key, you lose
114
+ the object.
115
+
116
+ Also note how we don't have to provide the SSECustomerKeyMD5.
117
+ Boto3 will automatically compute this value for us.
118
+
119
+
120
+ .. code-block:: python
121
+
122
+ import boto3
123
+ import os
124
+
125
+ BUCKET = 'amzn-s3-demo-bucket'
126
+ KEY = os.urandom(32)
127
+ s3 = boto3.client('s3')
128
+
129
+ print("Uploading S3 object with SSE-C")
130
+ s3.put_object(Bucket=BUCKET,
131
+ Key='encrypt-key',
132
+ Body=b'foobar',
133
+ SSECustomerKey=KEY,
134
+ SSECustomerAlgorithm='AES256')
135
+ print("Done")
136
+
137
+ # Getting the object:
138
+ print("Getting S3 object...")
139
+ # Note how we're using the same ``KEY`` we
140
+ # created earlier.
141
+ response = s3.get_object(Bucket=BUCKET,
142
+ Key='encrypt-key',
143
+ SSECustomerKey=KEY,
144
+ SSECustomerAlgorithm='AES256')
145
+ print("Done, response body:")
146
+ print(response['Body'].read())
147
+
148
+
149
+ Downloading a specific version of an S3 object
150
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
151
+
152
+ This example shows how to download a specific version of an
153
+ S3 object.
154
+
155
+ .. code-block:: python
156
+
157
+ import boto3
158
+ s3 = boto3.client('s3')
159
+
160
+ s3.download_file(
161
+ "amzn-s3-demo-bucket", "key-name", "tmp.txt",
162
+ ExtraArgs={"VersionId": "my-version-id"}
163
+ )
164
+
165
+
166
+ Filter objects by last modified time using JMESPath
167
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
168
+
169
+ This example shows how to filter objects by last modified time
170
+ using JMESPath.
171
+
172
+ .. code-block:: python
173
+
174
+ import boto3
175
+ s3 = boto3.client("s3")
176
+
177
+ s3_paginator = s3.get_paginator('list_objects_v2')
178
+ s3_iterator = s3_paginator.paginate(Bucket='amzn-s3-demo-bucket')
179
+
180
+ filtered_iterator = s3_iterator.search(
181
+ "Contents[?to_string(LastModified)>='\"2022-01-05 08:05:37+00:00\"'].Key"
182
+ )
183
+
184
+ for key_data in filtered_iterator:
185
+ print(key_data)
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.147",
5
+ # "aignostics==0.2.153",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.147"
3
+ version = "0.2.153"
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 = [
@@ -99,7 +99,7 @@ dependencies = [
99
99
  "platformdirs>=4.3.8",
100
100
  "boto3>=1.40.11",
101
101
  "certifi>=2025.8.3",
102
- "dicom-validator>=0.7.1",
102
+ "dicom-validator>=0.7.2",
103
103
  "dicomweb-client[gcp]>=0.59.2",
104
104
  "duckdb>=0.10.0,<=1.4.0",
105
105
  "fastparquet>=2024.11.0",
@@ -110,7 +110,7 @@ dependencies = [
110
110
  "idc-index-data==21.0.0",
111
111
  "ijson>=3.4.0",
112
112
  "jsf>=0.11.2",
113
- "jsonschema>=4.24.1",
113
+ "jsonschema[format-nongpl]>=4.24.1",
114
114
  "openslide-bin>=4.0.0.8",
115
115
  "openslide-python>=1.4.2",
116
116
  "pandas<=2.3.1",
@@ -126,6 +126,7 @@ dependencies = [
126
126
  "tqdm>=4.67.1",
127
127
  "urllib3>=2.5.0",
128
128
  "wsidicom>=0.27.1",
129
+ "truststore>=0.10.4",
129
130
  ]
130
131
 
131
132
  [project.optional-dependencies]
@@ -358,7 +359,7 @@ source = ["src/"]
358
359
 
359
360
 
360
361
  [tool.bumpversion]
361
- current_version = "0.2.147"
362
+ current_version = "0.2.153"
362
363
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
363
364
  serialize = ["{major}.{minor}.{patch}"]
364
365
  search = "{current_version}"
@@ -1,5 +1,6 @@
1
1
  """GUI of application module including homepage of Aignostics Launchpad."""
2
2
 
3
+ import platform
3
4
  from importlib.util import find_spec
4
5
 
5
6
  from nicegui import Client, app, ui # noq
@@ -10,14 +11,28 @@ from ._frame import _frame
10
11
 
11
12
  logger = get_logger(__name__)
12
13
 
14
+ if platform.system() != "Darwin":
15
+ try:
16
+ import pyi_splash # pyright: ignore[reportMissingModuleSource]
17
+ except ImportError:
18
+ pyi_splash = None
19
+ else:
20
+ pyi_splash = None
21
+
13
22
 
14
23
  async def _page_index(client: Client) -> None:
15
24
  """Homepage of Applications."""
16
25
  client.content.classes(remove="nicegui-content")
17
26
  client.content.classes(add="pl-5 pt-5")
18
27
 
28
+ if pyi_splash and pyi_splash.is_alive():
29
+ pyi_splash.update_text("Connecting with API ...")
30
+
19
31
  await _frame("Analyze your Whole Slide Images with AI", left_sidebar=True)
20
32
 
33
+ if pyi_splash and pyi_splash.is_alive():
34
+ pyi_splash.close()
35
+
21
36
  with ui.row().classes("p-4 pt-2 pr-0"), ui.column():
22
37
  await ui.context.client.connected()
23
38
  ui.label("Welcome to the Aignostics Launchpad").bind_text_from(
@@ -4,6 +4,7 @@ import json
4
4
  import os
5
5
  import platform
6
6
  import re
7
+ import ssl
7
8
  import sys
8
9
  import typing as t
9
10
  from http import HTTPStatus
@@ -333,6 +334,9 @@ class Service(BaseService):
333
334
  "public_ipv4": Service._get_public_ipv4(),
334
335
  "proxies": getproxies(),
335
336
  "requests_ca_bundle": os.getenv("REQUESTS_CA_BUNDLE"),
337
+ "ssl_cert_file": os.getenv("SSL_CERT_FILE"),
338
+ "ssl_cert_dir": os.getenv("SSL_CERT_DIR"),
339
+ "ssl_default_verify_paths": ssl.get_default_verify_paths()._asdict(),
336
340
  },
337
341
  "uptime": {
338
342
  "seconds": uptime(),
@@ -6,13 +6,12 @@ import sys
6
6
  from pathlib import Path
7
7
 
8
8
  import certifi
9
+ import truststore
9
10
 
10
11
  from ._log import logging_initialize
11
12
 
12
13
  _boot_called = False
13
14
 
14
- if ssl.get_default_verify_paths().cafile is None and os.environ.get("SSL_CERT_FILE") is None:
15
- os.environ["SSL_CERT_FILE"] = certifi.where()
16
15
 
17
16
  # Import third party dependencies
18
17
  third_party_dir = Path(__file__).parent.absolute() / ".." / "third_party"
@@ -33,6 +32,11 @@ def boot(modules_to_instrument: list[str]) -> None:
33
32
  return
34
33
  _boot_called = True
35
34
 
35
+ truststore.inject_into_ssl()
36
+
37
+ if ssl.get_default_verify_paths().cafile is None and os.environ.get("SSL_CERT_FILE") is None:
38
+ os.environ["SSL_CERT_FILE"] = certifi.where()
39
+
36
40
  from ._sentry import sentry_initialize # noqa: PLC0415
37
41
 
38
42
  sentry_initialize()
@@ -1,21 +1,34 @@
1
1
  """Aignostics Launchpad launcher for pyinstaller."""
2
2
 
3
3
  import os
4
+ import platform
4
5
  import ssl
5
6
  import sys
6
7
  from multiprocessing import freeze_support
7
8
 
8
9
  freeze_support()
9
10
 
11
+ if platform.system() != "Darwin":
12
+ try:
13
+ import pyi_splash # pyright: ignore[reportMissingModuleSource]
14
+ except ImportError:
15
+ pyi_splash = None
16
+ else:
17
+ pyi_splash = None
18
+
19
+ if pyi_splash and pyi_splash.is_alive():
20
+ pyi_splash.update_text("Initializing services ...")
21
+
10
22
  os.environ["LOGFIRE_PYDANTIC_RECORD"] = "off"
11
23
 
12
24
  from aignostics.constants import MODULES_TO_INSTRUMENT # noqa: E402
13
25
  from aignostics.utils import boot, get_logger, gui_run # noqa: E402
14
26
 
15
27
  boot(MODULES_TO_INSTRUMENT)
28
+
16
29
  logger = get_logger(__name__)
17
30
 
18
- # Constants for command line argument handling
31
+
19
32
  EXEC_SCRIPT_FLAG = "--exec-script"
20
33
  MIN_ARGS_FOR_SCRIPT = 3 # program name, flag, and script content
21
34
  MODULE_FLAG = "--run-module"
@@ -23,9 +36,7 @@ MIN_ARGS_FOR_MODULE = 3 # program name, flag, and module name
23
36
 
24
37
  DEBUG_FLAG = "--debug"
25
38
 
26
- # Check if we should execute a script instead of launching the GUI
27
39
  if len(sys.argv) > 1 and sys.argv[1] == EXEC_SCRIPT_FLAG:
28
- # Execute the script passed as the second argument
29
40
  if len(sys.argv) >= MIN_ARGS_FOR_SCRIPT:
30
41
  script_content = sys.argv[2]
31
42
  try:
@@ -37,23 +48,19 @@ if len(sys.argv) > 1 and sys.argv[1] == EXEC_SCRIPT_FLAG:
37
48
  logger.error("No script content provided")
38
49
  sys.exit(1)
39
50
  elif len(sys.argv) > 1 and sys.argv[1] == MODULE_FLAG:
40
- # Execute the module passed as the second argument
51
+ if pyi_splash and pyi_splash.is_alive():
52
+ pyi_splash.close()
53
+
41
54
  if len(sys.argv) >= MIN_ARGS_FOR_MODULE:
42
55
  module_name = sys.argv[2]
43
- # Build the command to run the module with remaining arguments
44
56
  module_args = sys.argv[MIN_ARGS_FOR_MODULE:] if len(sys.argv) > MIN_ARGS_FOR_MODULE else []
45
-
46
- # We're running as a packaged executable, run module directly
47
- # Update sys.argv to what the module expects
48
57
  sys.argv = [module_name, *module_args]
49
58
  try:
50
59
  if module_name == "marimo":
51
- # Special handling for marimo - importing from private module as marimo's __main__.py does
52
60
  from marimo._cli.cli import main # noqa: PLC2701
53
61
 
54
62
  main(prog_name="marimo")
55
63
  else:
56
- # Generic module execution
57
64
  import runpy
58
65
 
59
66
  runpy.run_module(module_name, run_name="__main__")
@@ -64,9 +71,13 @@ elif len(sys.argv) > 1 and sys.argv[1] == MODULE_FLAG:
64
71
  logger.error("No module name provided")
65
72
  sys.exit(1)
66
73
  elif len(sys.argv) > 1 and sys.argv[1] == DEBUG_FLAG:
74
+ if pyi_splash and pyi_splash.is_alive():
75
+ pyi_splash.close()
76
+
67
77
  import ssl
68
78
 
69
79
  print(ssl.get_default_verify_paths())
70
80
  else:
71
- # Normal GUI launch
81
+ if pyi_splash and pyi_splash.is_alive():
82
+ pyi_splash.update_text("Opening user interface ...")
72
83
  gui_run(native=True, with_api=False, title="Aignostics Launchpad", icon="🔬")
File without changes
File without changes
File without changes