letify 2.1.2__tar.gz → 2.1.3__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 (200) hide show
  1. {letify-2.1.2 → letify-2.1.3}/PKG-INFO +1 -1
  2. {letify-2.1.2 → letify-2.1.3}/letify/__init__.py +1 -1
  3. {letify-2.1.2 → letify-2.1.3}/letify-core/Cargo.lock +3 -3
  4. {letify-2.1.2 → letify-2.1.3}/letify-core/Cargo.toml +1 -1
  5. {letify-2.1.2 → letify-2.1.3}/letify-ext/package-lock.json +2 -2
  6. {letify-2.1.2 → letify-2.1.3}/letify-ext/package.json +1 -1
  7. {letify-2.1.2 → letify-2.1.3}/pyproject.toml +1 -1
  8. {letify-2.1.2 → letify-2.1.3}/tests/test_transport.py +5 -0
  9. {letify-2.1.2 → letify-2.1.3}/.github/workflows/ci.yml +0 -0
  10. {letify-2.1.2 → letify-2.1.3}/.github/workflows/docs.yml +0 -0
  11. {letify-2.1.2 → letify-2.1.3}/.github/workflows/publish.yml +0 -0
  12. {letify-2.1.2 → letify-2.1.3}/.gitignore +0 -0
  13. {letify-2.1.2 → letify-2.1.3}/.researchtree +0 -0
  14. {letify-2.1.2 → letify-2.1.3}/LICENSE +0 -0
  15. {letify-2.1.2 → letify-2.1.3}/README.md +0 -0
  16. {letify-2.1.2 → letify-2.1.3}/docs/guide/01-getting-started.md +0 -0
  17. {letify-2.1.2 → letify-2.1.3}/docs/guide/02-providers.md +0 -0
  18. {letify-2.1.2 → letify-2.1.3}/docs/guide/03-execution-modes.md +0 -0
  19. {letify-2.1.2 → letify-2.1.3}/docs/guide/04-environments-and-data.md +0 -0
  20. {letify-2.1.2 → letify-2.1.3}/docs/guide/05-concurrency.md +0 -0
  21. {letify-2.1.2 → letify-2.1.3}/docs/guide/06-cost.md +0 -0
  22. {letify-2.1.2 → letify-2.1.3}/docs/guide/07-troubleshooting.md +0 -0
  23. {letify-2.1.2 → letify-2.1.3}/docs/guide/08-releasing.md +0 -0
  24. {letify-2.1.2 → letify-2.1.3}/docs/guide/README.md +0 -0
  25. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/01-/354/213/234/354/236/221/355/225/230/352/270/260.md" +0 -0
  26. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/02-/355/224/204/353/241/234/353/260/224/354/235/264/353/215/224.md" +0 -0
  27. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/03-/354/213/244/355/226/211-/353/260/251/354/213/235.md" +0 -0
  28. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/04-/355/231/230/352/262/275/352/263/274-/353/215/260/354/235/264/355/204/260.md" +0 -0
  29. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/05-/353/217/231/354/213/234-/354/213/244/355/226/211.md" +0 -0
  30. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/06-/353/271/204/354/232/251.md" +0 -0
  31. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/07-/353/254/270/354/240/234-/355/225/264/352/262/260.md" +0 -0
  32. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/08-/353/246/264/353/246/254/354/212/244.md" +0 -0
  33. {letify-2.1.2 → letify-2.1.3}/docs/guide/ko/README.md +0 -0
  34. {letify-2.1.2 → letify-2.1.3}/docs/locales/README_ko.md +0 -0
  35. {letify-2.1.2 → letify-2.1.3}/docs/mkdocs.yml +0 -0
  36. {letify-2.1.2 → letify-2.1.3}/examples/README.md +0 -0
  37. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/.letify.example +0 -0
  38. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/00_smoke.py +0 -0
  39. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/01_sweep.py +0 -0
  40. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/02_resume.py +0 -0
  41. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/03_watch.py +0 -0
  42. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/README.md +0 -0
  43. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/README_ko.md +0 -0
  44. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/common.py +0 -0
  45. {letify-2.1.2 → letify-2.1.3}/examples/nvfp4-lora/recipe.py +0 -0
  46. {letify-2.1.2 → letify-2.1.3}/letify/cli.py +0 -0
  47. {letify-2.1.2 → letify-2.1.3}/letify/config/__init__.py +0 -0
  48. {letify-2.1.2 → letify-2.1.3}/letify/config/inventory.py +0 -0
  49. {letify-2.1.2 → letify-2.1.3}/letify/config/login.py +0 -0
  50. {letify-2.1.2 → letify-2.1.3}/letify/config/schema.py +0 -0
  51. {letify-2.1.2 → letify-2.1.3}/letify/config/secrets.py +0 -0
  52. {letify-2.1.2 → letify-2.1.3}/letify/config/writer.py +0 -0
  53. {letify-2.1.2 → letify-2.1.3}/letify/declare/__init__.py +0 -0
  54. {letify-2.1.2 → letify-2.1.3}/letify/declare/cache.py +0 -0
  55. {letify-2.1.2 → letify-2.1.3}/letify/declare/env.py +0 -0
  56. {letify-2.1.2 → letify-2.1.3}/letify/declare/function.py +0 -0
  57. {letify-2.1.2 → letify-2.1.3}/letify/declare/instance.py +0 -0
  58. {letify-2.1.2 → letify-2.1.3}/letify/errors.py +0 -0
  59. {letify-2.1.2 → letify-2.1.3}/letify/install.py +0 -0
  60. {letify-2.1.2 → letify-2.1.3}/letify/launcher.py +0 -0
  61. {letify-2.1.2 → letify-2.1.3}/letify/paths.py +0 -0
  62. {letify-2.1.2 → letify-2.1.3}/letify/protocol/__init__.py +0 -0
  63. {letify-2.1.2 → letify-2.1.3}/letify/protocol/codec.py +0 -0
  64. {letify-2.1.2 → letify-2.1.3}/letify/protocol/driver.py +0 -0
  65. {letify-2.1.2 → letify-2.1.3}/letify/protocol/handle.py +0 -0
  66. {letify-2.1.2 → letify-2.1.3}/letify/protocol/wire.py +0 -0
  67. {letify-2.1.2 → letify-2.1.3}/letify/protocol/worker.py +0 -0
  68. {letify-2.1.2 → letify-2.1.3}/letify/providers/__init__.py +0 -0
  69. {letify-2.1.2 → letify-2.1.3}/letify/providers/base.py +0 -0
  70. {letify-2.1.2 → letify-2.1.3}/letify/providers/colab.py +0 -0
  71. {letify-2.1.2 → letify-2.1.3}/letify/providers/colab_files.py +0 -0
  72. {letify-2.1.2 → letify-2.1.3}/letify/providers/colab_keepalive.py +0 -0
  73. {letify-2.1.2 → letify-2.1.3}/letify/providers/elice.py +0 -0
  74. {letify-2.1.2 → letify-2.1.3}/letify/providers/kaggle.py +0 -0
  75. {letify-2.1.2 → letify-2.1.3}/letify/providers/kaggle_adapter.py +0 -0
  76. {letify-2.1.2 → letify-2.1.3}/letify/providers/local.py +0 -0
  77. {letify-2.1.2 → letify-2.1.3}/letify/providers/modal.py +0 -0
  78. {letify-2.1.2 → letify-2.1.3}/letify/providers/modal_adapter.py +0 -0
  79. {letify-2.1.2 → letify-2.1.3}/letify/providers/naming.py +0 -0
  80. {letify-2.1.2 → letify-2.1.3}/letify/providers/shell.py +0 -0
  81. {letify-2.1.2 → letify-2.1.3}/letify/providers/tunnel.py +0 -0
  82. {letify-2.1.2 → letify-2.1.3}/letify/providers/usage.py +0 -0
  83. {letify-2.1.2 → letify-2.1.3}/letify/remoting/__init__.py +0 -0
  84. {letify-2.1.2 → letify-2.1.3}/letify/remoting/capability.py +0 -0
  85. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/__init__.py +0 -0
  86. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/client.py +0 -0
  87. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/cuda.py +0 -0
  88. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/executor.py +0 -0
  89. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/frames.py +0 -0
  90. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/guard.py +0 -0
  91. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/tensor.py +0 -0
  92. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/trace.py +0 -0
  93. {letify-2.1.2 → letify-2.1.3}/letify/remoting/device/value.py +0 -0
  94. {letify-2.1.2 → letify-2.1.3}/letify/remoting/loader.py +0 -0
  95. {letify-2.1.2 → letify-2.1.3}/letify/remoting/probe.py +0 -0
  96. {letify-2.1.2 → letify-2.1.3}/letify/render.py +0 -0
  97. {letify-2.1.2 → letify-2.1.3}/letify/runtime/__init__.py +0 -0
  98. {letify-2.1.2 → letify-2.1.3}/letify/runtime/bootstrap.py +0 -0
  99. {letify-2.1.2 → letify-2.1.3}/letify/runtime/channel.py +0 -0
  100. {letify-2.1.2 → letify-2.1.3}/letify/runtime/lease.py +0 -0
  101. {letify-2.1.2 → letify-2.1.3}/letify/runtime/pool.py +0 -0
  102. {letify-2.1.2 → letify-2.1.3}/letify/runtime/session.py +0 -0
  103. {letify-2.1.2 → letify-2.1.3}/letify/runtime/telemetry.py +0 -0
  104. {letify-2.1.2 → letify-2.1.3}/letify/store/__init__.py +0 -0
  105. {letify-2.1.2 → letify-2.1.3}/letify/store/backends/__init__.py +0 -0
  106. {letify-2.1.2 → letify-2.1.3}/letify/store/backends/filesystem.py +0 -0
  107. {letify-2.1.2 → letify-2.1.3}/letify/store/backends/google_auth.py +0 -0
  108. {letify-2.1.2 → letify-2.1.3}/letify/store/backends/layout.py +0 -0
  109. {letify-2.1.2 → letify-2.1.3}/letify/store/backends/objects.py +0 -0
  110. {letify-2.1.2 → letify-2.1.3}/letify/store/cas.py +0 -0
  111. {letify-2.1.2 → letify-2.1.3}/letify/store/pathdata.py +0 -0
  112. {letify-2.1.2 → letify-2.1.3}/letify/store/sendorder.py +0 -0
  113. {letify-2.1.2 → letify-2.1.3}/letify/store/volume.py +0 -0
  114. {letify-2.1.2 → letify-2.1.3}/letify/stubs.py +0 -0
  115. {letify-2.1.2 → letify-2.1.3}/letify/tools.py +0 -0
  116. {letify-2.1.2 → letify-2.1.3}/letify/transport/__init__.py +0 -0
  117. {letify-2.1.2 → letify-2.1.3}/letify/transport/agent.py +0 -0
  118. {letify-2.1.2 → letify-2.1.3}/letify/transport/announce.py +0 -0
  119. {letify-2.1.2 → letify-2.1.3}/letify/transport/link.py +0 -0
  120. {letify-2.1.2 → letify-2.1.3}/letify/transport/nat.py +0 -0
  121. {letify-2.1.2 → letify-2.1.3}/letify/transport/pipeline.py +0 -0
  122. {letify-2.1.2 → letify-2.1.3}/letify/transport/portmap.py +0 -0
  123. {letify-2.1.2 → letify-2.1.3}/letify/transport/probe.py +0 -0
  124. {letify-2.1.2 → letify-2.1.3}/letify/transport/quic.py +0 -0
  125. {letify-2.1.2 → letify-2.1.3}/letify/transport/rendezvous.py +0 -0
  126. {letify-2.1.2 → letify-2.1.3}/letify/transport/setup.py +0 -0
  127. {letify-2.1.2 → letify-2.1.3}/letify/transport/sshopts.py +0 -0
  128. {letify-2.1.2 → letify-2.1.3}/letify/transport/strategies.py +0 -0
  129. {letify-2.1.2 → letify-2.1.3}/letify-core/.gitignore +0 -0
  130. {letify-2.1.2 → letify-2.1.3}/letify-core/build.py +0 -0
  131. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-agent/Cargo.toml +0 -0
  132. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-agent/src/driver.rs +0 -0
  133. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-agent/src/main.rs +0 -0
  134. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/Cargo.toml +0 -0
  135. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/client.rs +0 -0
  136. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/exports.rs +0 -0
  137. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/image.rs +0 -0
  138. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/lib.rs +0 -0
  139. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/status.rs +0 -0
  140. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-driver/src/table.rs +0 -0
  141. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-quic/Cargo.toml +0 -0
  142. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-quic/src/main.rs +0 -0
  143. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-wire/Cargo.toml +0 -0
  144. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-wire/src/lib.rs +0 -0
  145. {letify-2.1.2 → letify-2.1.3}/letify-core/letify-wire/tests/throughput.rs +0 -0
  146. {letify-2.1.2 → letify-2.1.3}/letify-core/rust-toolchain.toml +0 -0
  147. {letify-2.1.2 → letify-2.1.3}/letify-ext/.vscodeignore +0 -0
  148. {letify-2.1.2 → letify-2.1.3}/letify-ext/LICENSE +0 -0
  149. {letify-2.1.2 → letify-2.1.3}/letify-ext/README.md +0 -0
  150. {letify-2.1.2 → letify-2.1.3}/letify-ext/media/icon.svg +0 -0
  151. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/cli.ts +0 -0
  152. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/extension.ts +0 -0
  153. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/history.ts +0 -0
  154. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/model.ts +0 -0
  155. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/poll.ts +0 -0
  156. {letify-2.1.2 → letify-2.1.3}/letify-ext/src/render.ts +0 -0
  157. {letify-2.1.2 → letify-2.1.3}/letify-ext/test/cli.test.ts +0 -0
  158. {letify-2.1.2 → letify-2.1.3}/letify-ext/test/manifest.test.ts +0 -0
  159. {letify-2.1.2 → letify-2.1.3}/letify-ext/test/model.test.ts +0 -0
  160. {letify-2.1.2 → letify-2.1.3}/letify-ext/test/regressions.test.ts +0 -0
  161. {letify-2.1.2 → letify-2.1.3}/letify-ext/tsconfig.json +0 -0
  162. {letify-2.1.2 → letify-2.1.3}/letify_providers.py +0 -0
  163. {letify-2.1.2 → letify-2.1.3}/scripts/sync-main.sh +0 -0
  164. {letify-2.1.2 → letify-2.1.3}/scripts/version.py +0 -0
  165. {letify-2.1.2 → letify-2.1.3}/tests/conftest.py +0 -0
  166. {letify-2.1.2 → letify-2.1.3}/tests/fake_kaggle_adapter.py +0 -0
  167. {letify-2.1.2 → letify-2.1.3}/tests/fake_modal_adapter.py +0 -0
  168. {letify-2.1.2 → letify-2.1.3}/tests/test_cli.py +0 -0
  169. {letify-2.1.2 → letify-2.1.3}/tests/test_cli_output.py +0 -0
  170. {letify-2.1.2 → letify-2.1.3}/tests/test_colab_keepalive.py +0 -0
  171. {letify-2.1.2 → letify-2.1.3}/tests/test_config.py +0 -0
  172. {letify-2.1.2 → letify-2.1.3}/tests/test_core.py +0 -0
  173. {letify-2.1.2 → letify-2.1.3}/tests/test_data.py +0 -0
  174. {letify-2.1.2 → letify-2.1.3}/tests/test_data_streaming.py +0 -0
  175. {letify-2.1.2 → letify-2.1.3}/tests/test_declare.py +0 -0
  176. {letify-2.1.2 → letify-2.1.3}/tests/test_device.py +0 -0
  177. {letify-2.1.2 → letify-2.1.3}/tests/test_editor_sessions.py +0 -0
  178. {letify-2.1.2 → letify-2.1.3}/tests/test_elice.py +0 -0
  179. {letify-2.1.2 → letify-2.1.3}/tests/test_frames.py +0 -0
  180. {letify-2.1.2 → letify-2.1.3}/tests/test_install.py +0 -0
  181. {letify-2.1.2 → letify-2.1.3}/tests/test_kaggle.py +0 -0
  182. {letify-2.1.2 → letify-2.1.3}/tests/test_kaggle_cookie.py +0 -0
  183. {letify-2.1.2 → letify-2.1.3}/tests/test_kaggle_link.py +0 -0
  184. {letify-2.1.2 → letify-2.1.3}/tests/test_link_log.py +0 -0
  185. {letify-2.1.2 → letify-2.1.3}/tests/test_notebook.py +0 -0
  186. {letify-2.1.2 → letify-2.1.3}/tests/test_parallel_placement.py +0 -0
  187. {letify-2.1.2 → letify-2.1.3}/tests/test_paths.py +0 -0
  188. {letify-2.1.2 → letify-2.1.3}/tests/test_portmap.py +0 -0
  189. {letify-2.1.2 → letify-2.1.3}/tests/test_protocol.py +0 -0
  190. {letify-2.1.2 → letify-2.1.3}/tests/test_providers.py +0 -0
  191. {letify-2.1.2 → letify-2.1.3}/tests/test_quic.py +0 -0
  192. {letify-2.1.2 → letify-2.1.3}/tests/test_remoting.py +0 -0
  193. {letify-2.1.2 → letify-2.1.3}/tests/test_render.py +0 -0
  194. {letify-2.1.2 → letify-2.1.3}/tests/test_runtime.py +0 -0
  195. {letify-2.1.2 → letify-2.1.3}/tests/test_ship.py +0 -0
  196. {letify-2.1.2 → letify-2.1.3}/tests/test_store.py +0 -0
  197. {letify-2.1.2 → letify-2.1.3}/tests/test_strategies.py +0 -0
  198. {letify-2.1.2 → letify-2.1.3}/tests/test_stubs.py +0 -0
  199. {letify-2.1.2 → letify-2.1.3}/tests/test_tunnel_setup.py +0 -0
  200. {letify-2.1.2 → letify-2.1.3}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: letify
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Declarations that become infrastructure.
5
5
  Project-URL: Homepage, https://github.com/DarkPyonix/letify
6
6
  Project-URL: Documentation, https://github.com/DarkPyonix/letify/tree/main/docs
@@ -62,7 +62,7 @@ remote: Final = Host.remote
62
62
  # The enum class stays importable from letify.declare.instance for letify's own use.
63
63
  del Host
64
64
 
65
- __version__ = "2.1.2"
65
+ __version__ = "2.1.3"
66
66
 
67
67
 
68
68
  def fetch(tensor): # type: ignore[no-untyped-def]
@@ -138,7 +138,7 @@ dependencies = [
138
138
 
139
139
  [[package]]
140
140
  name = "letify-agent"
141
- version = "2.1.2"
141
+ version = "2.1.3"
142
142
  dependencies = [
143
143
  "letify-wire",
144
144
  "libloading",
@@ -146,7 +146,7 @@ dependencies = [
146
146
 
147
147
  [[package]]
148
148
  name = "letify-driver"
149
- version = "2.1.2"
149
+ version = "2.1.3"
150
150
  dependencies = [
151
151
  "letify-wire",
152
152
  ]
@@ -164,7 +164,7 @@ dependencies = [
164
164
 
165
165
  [[package]]
166
166
  name = "letify-wire"
167
- version = "2.1.2"
167
+ version = "2.1.3"
168
168
 
169
169
  [[package]]
170
170
  name = "libc"
@@ -8,7 +8,7 @@ resolver = "3"
8
8
  members = ["letify-wire", "letify-driver", "letify-agent", "letify-quic"]
9
9
 
10
10
  [workspace.package]
11
- version = "2.1.2"
11
+ version = "2.1.3"
12
12
  edition = "2024"
13
13
  license = "MIT"
14
14
  repository = "https://github.com/DarkPyonix/letify"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "letify-status",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "letify-status",
9
- "version": "2.1.2",
9
+ "version": "2.1.3",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "devDependencies": {
12
12
  "@types/node": "^18.19.0",
@@ -2,7 +2,7 @@
2
2
  "name": "letify-status",
3
3
  "displayName": "letify Status",
4
4
  "description": "letify quota and GPU activity in the status bar, read from the letify CLI.",
5
- "version": "2.1.2",
5
+ "version": "2.1.3",
6
6
  "publisher": "darkpyonix",
7
7
  "license": "SEE LICENSE IN LICENSE",
8
8
  "repository": {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "letify"
3
- version = "2.1.2"
3
+ version = "2.1.3"
4
4
  description = "Declarations that become infrastructure."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -127,6 +127,9 @@ def test_a_dial_the_kernel_refuses_at_once_is_not_taken_for_a_connection() -> No
127
127
  taken_far, _ = peer_listener.accept()
128
128
  token = b"d" * 16
129
129
  arrived: dict[str, socket.socket] = {}
130
+ # The handshake completes inside create_connection, so the punch can return before the
131
+ # thread has published the socket. Without waiting the read below raises KeyError.
132
+ published = threading.Event()
130
133
 
131
134
  def peer_completes_its_own_dial() -> None:
132
135
  # Over loopback the taken pair is also the peer's own pair seen from its side, so
@@ -134,12 +137,14 @@ def test_a_dial_the_kernel_refuses_at_once_is_not_taken_for_a_connection() -> No
134
137
  # refused, and a connection then arrives on its listener.
135
138
  time.sleep(0.25)
136
139
  arrived["sock"] = socket.create_connection(("127.0.0.1", port))
140
+ published.set()
137
141
 
138
142
  threading.Thread(target=peer_completes_its_own_dial, daemon=True).start()
139
143
  try:
140
144
  chosen = nat.punch(
141
145
  port, ("127.0.0.1", peer_port), token, initiator=True, start_at=0, window=5.0
142
146
  )
147
+ assert published.wait(10), "the peer's dial never completed"
143
148
  assert nat.recv_exact(arrived["sock"], len(nat.HELLO) + 16) == nat.HELLO + token
144
149
  chosen.close()
145
150
  finally:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes