aignostics 0.2.94__tar.gz → 0.2.96__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 (164) hide show
  1. {aignostics-0.2.94 → aignostics-0.2.96}/PKG-INFO +1 -1
  2. {aignostics-0.2.94 → aignostics-0.2.96}/examples/notebook.py +1 -1
  3. {aignostics-0.2.94 → aignostics-0.2.96}/pyproject.toml +2 -2
  4. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_application_describe.py +1 -0
  5. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/gui/_frame.py +1 -1
  6. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_authentication.py +7 -0
  7. {aignostics-0.2.94 → aignostics-0.2.96}/.gitignore +0 -0
  8. {aignostics-0.2.94 → aignostics-0.2.96}/LICENSE +0 -0
  9. {aignostics-0.2.94 → aignostics-0.2.96}/README.md +0 -0
  10. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/.openapi-generator/FILES +0 -0
  11. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/.openapi-generator/VERSION +0 -0
  12. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  13. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/api_client.py +0 -0
  14. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/api_response.py +0 -0
  15. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/configuration.py +0 -0
  16. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/exceptions.py +0 -0
  17. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  18. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  19. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  20. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  21. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  22. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  23. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  24. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  25. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  26. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  27. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  28. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  29. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  30. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  31. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  32. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  33. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  34. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  35. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  36. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  37. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  38. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  39. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  40. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/aignx/codegen/rest.py +0 -0
  41. {aignostics-0.2.94 → aignostics-0.2.96}/codegen/out/docs/PublicApi.md +0 -0
  42. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  43. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  44. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  45. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  46. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  47. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  48. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  49. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  50. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  51. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  52. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  53. {aignostics-0.2.94 → aignostics-0.2.96}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  54. {aignostics-0.2.94 → aignostics-0.2.96}/examples/__init__.py +0 -0
  55. {aignostics-0.2.94 → aignostics-0.2.96}/examples/notebook.ipynb +0 -0
  56. {aignostics-0.2.94 → aignostics-0.2.96}/examples/script.py +0 -0
  57. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/__init__.py +0 -0
  58. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/__init__.py +0 -0
  59. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_cli.py +0 -0
  60. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_frame.py +0 -0
  61. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  62. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_builder.py +0 -0
  63. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_index.py +0 -0
  64. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/_utils.py +0 -0
  65. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  66. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  67. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  68. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  69. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  70. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  71. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  72. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  73. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  74. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  75. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  76. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  77. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  78. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  79. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  80. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  81. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_service.py +0 -0
  82. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_settings.py +0 -0
  83. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/application/_utils.py +0 -0
  84. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/__init__.py +0 -0
  85. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/_cli.py +0 -0
  86. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/_gui.py +0 -0
  87. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/_service.py +0 -0
  88. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/_settings.py +0 -0
  89. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  90. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  91. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/cli.py +0 -0
  92. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/constants.py +0 -0
  93. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/dataset/__init__.py +0 -0
  94. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/dataset/_cli.py +0 -0
  95. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/dataset/_gui.py +0 -0
  96. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/dataset/_service.py +0 -0
  97. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  98. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/gui/__init__.py +0 -0
  99. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/gui/_theme.py +0 -0
  100. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  101. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/gui/assets/logo.png +0 -0
  102. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/notebook/__init__.py +0 -0
  103. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/notebook/_gui.py +0 -0
  104. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/notebook/_notebook.py +0 -0
  105. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/notebook/_service.py +0 -0
  106. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/notebook/assets/python.lottie +0 -0
  107. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/__init__.py +0 -0
  108. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_cli.py +0 -0
  109. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_client.py +0 -0
  110. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_constants.py +0 -0
  111. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_messages.py +0 -0
  112. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_service.py +0 -0
  113. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_settings.py +0 -0
  114. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/_utils.py +0 -0
  115. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/resources/__init__.py +0 -0
  116. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/resources/applications.py +0 -0
  117. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/resources/runs.py +0 -0
  118. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/platform/resources/utils.py +0 -0
  119. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/__init__.py +0 -0
  120. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/_cli.py +0 -0
  121. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/_gui.py +0 -0
  122. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/_service.py +0 -0
  123. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/_settings.py +0 -0
  124. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/assets/download.lottie +0 -0
  125. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  126. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/assets/update.lottie +0 -0
  127. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/scripts/add.groovy +0 -0
  128. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  129. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  130. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/qupath/scripts/test.groovy +0 -0
  131. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/__init__.py +0 -0
  132. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/_cli.py +0 -0
  133. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/_exceptions.py +0 -0
  134. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/_gui.py +0 -0
  135. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/_service.py +0 -0
  136. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/_settings.py +0 -0
  137. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/system/assets/system.lottie +0 -0
  138. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/third_party/bottle.py +0 -0
  139. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/third_party/idc_index.py +0 -0
  140. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/__init__.py +0 -0
  141. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_cli.py +0 -0
  142. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_console.py +0 -0
  143. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_constants.py +0 -0
  144. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_di.py +0 -0
  145. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_fs.py +0 -0
  146. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_gui.py +0 -0
  147. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_health.py +0 -0
  148. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_log.py +0 -0
  149. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_logfire.py +0 -0
  150. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_notebook.py +0 -0
  151. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_process.py +0 -0
  152. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_sentry.py +0 -0
  153. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_service.py +0 -0
  154. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/_settings.py +0 -0
  155. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/utils/boot.py +0 -0
  156. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/__init__.py +0 -0
  157. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_cli.py +0 -0
  158. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_gui.py +0 -0
  159. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_openslide_handler.py +0 -0
  160. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  161. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_service.py +0 -0
  162. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/_utils.py +0 -0
  163. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics/wsi/assets/fallback.png +0 -0
  164. {aignostics-0.2.94 → aignostics-0.2.96}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.94
3
+ Version: 0.2.96
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/
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.94",
5
+ # "aignostics==0.2.96",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.94"
3
+ version = "0.2.96"
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 = [
@@ -352,7 +352,7 @@ source = ["src/"]
352
352
 
353
353
 
354
354
  [tool.bumpversion]
355
- current_version = "0.2.94"
355
+ current_version = "0.2.96"
356
356
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
357
357
  serialize = ["{major}.{minor}.{patch}"]
358
358
  search = "{current_version}"
@@ -407,6 +407,7 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
407
407
  submit_form.metadata_grid.update()
408
408
  submit_form.metadata_exclude_button.set_text("Exclude")
409
409
  submit_form.metadata_exclude_button.disable()
410
+ await _validate()
410
411
 
411
412
  async def _handle_grid_selection_changed() -> None:
412
413
  if submit_form.metadata_grid is None or submit_form.metadata_exclude_button is None:
@@ -102,7 +102,7 @@ def frame( # noqa: C901, PLR0915
102
102
  app.storage.tab["user_info"] = user_info
103
103
  _user_info_ui.refresh()
104
104
  with contextlib.suppress(Exception):
105
- user_info = await run.cpu_bound(PlatformService.get_user_info, relogin=True)
105
+ user_info = await run.io_bound(PlatformService.get_user_info, relogin=True)
106
106
  app.storage.tab["user_info"] = user_info
107
107
  ui.navigate.reload()
108
108
 
@@ -318,6 +318,11 @@ def _perform_authorization_code_with_pkce_flow() -> str:
318
318
  # start the server
319
319
  try:
320
320
  with HTTPServer((host, port), OAuthCallbackHandler) as server:
321
+ # Enable socket reuse to prevent "Address already in use" errors
322
+ # This allows the socket to be reused immediately after the server closes,
323
+ # even if the previous connection is in TIME_WAIT state
324
+ server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
325
+
321
326
  # Call Auth0 with challenge and redirect to localhost with code after successful authN
322
327
  webbrowser.open_new(authorization_url)
323
328
  # Extract authorization_code from redirected request, see: OAuthCallbackHandler
@@ -438,6 +443,8 @@ def _ensure_local_port_is_available(port: int, max_retries: int = CALLBACK_PORT_
438
443
  def is_port_available() -> bool:
439
444
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
440
445
  try:
446
+ # Enable socket reuse to match the behavior of the actual HTTPServer
447
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
441
448
  s.bind(("localhost", port))
442
449
  return True
443
450
  except OSError:
File without changes
File without changes
File without changes