async-kernel 0.17.0__tar.gz → 0.18.0__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 (104) hide show
  1. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/ci.yml +2 -2
  2. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/publish-docs.yml +1 -1
  3. {async_kernel-0.17.0 → async_kernel-0.18.0}/.pre-commit-config.yaml +4 -4
  4. {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/launch.json +1 -1
  5. {async_kernel-0.17.0 → async_kernel-0.18.0}/CHANGELOG.md +57 -1
  6. {async_kernel-0.17.0 → async_kernel-0.18.0}/CONTRIBUTING.md +4 -8
  7. {async_kernel-0.17.0 → async_kernel-0.18.0}/PKG-INFO +1 -1
  8. {async_kernel-0.17.0 → async_kernel-0.18.0}/_version.py +2 -2
  9. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/caller.ipynb +1 -1
  10. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/concurrency.ipynb +157 -7
  11. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/custom_kernel.ipynb +9 -7
  12. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/__init__.py +2 -1
  13. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/asyncshell.py +110 -119
  14. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/caller.py +63 -57
  15. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/base.py +161 -165
  16. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/callable.py +2 -2
  17. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/zmq.py +3 -3
  18. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/iostream.py +11 -4
  19. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/kernel.py +72 -12
  20. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/kernelspec.py +1 -1
  21. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/typing.py +42 -24
  22. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/utils.py +40 -0
  23. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_iostream.py +1 -1
  24. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernel.py +55 -33
  25. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_typing.py +3 -3
  26. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_utils.py +3 -1
  27. {async_kernel-0.17.0 → async_kernel-0.18.0}/uv.lock +75 -80
  28. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/dependabot.yaml +0 -0
  29. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/release.yml +0 -0
  30. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/enforce-label.yml +0 -0
  31. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/new_release.yml +0 -0
  32. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/pre-commit.yml +0 -0
  33. {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/publish-to-pypi.yml +0 -0
  34. {async_kernel-0.17.0 → async_kernel-0.18.0}/.gitignore +0 -0
  35. {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/settings.json +0 -0
  36. {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/spellright.dict +0 -0
  37. {async_kernel-0.17.0 → async_kernel-0.18.0}/IPYTHON_LICENSE +0 -0
  38. {async_kernel-0.17.0 → async_kernel-0.18.0}/LICENSE +0 -0
  39. {async_kernel-0.17.0 → async_kernel-0.18.0}/README.md +0 -0
  40. {async_kernel-0.17.0 → async_kernel-0.18.0}/cliff.toml +0 -0
  41. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/changelog.md +0 -0
  42. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/contributing.md +0 -0
  43. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/index.md +0 -0
  44. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/license.md +0 -0
  45. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/index.md +0 -0
  46. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/javascripts/extra.js +0 -0
  47. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/overrides/main.html +0 -0
  48. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/asyncshell.md +0 -0
  49. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/caller.md +0 -0
  50. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/comm.md +0 -0
  51. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/command.md +0 -0
  52. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/common.md +0 -0
  53. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/debugger.md +0 -0
  54. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/event_loop.md +0 -0
  55. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/index.md +0 -0
  56. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/interface.md +0 -0
  57. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/kernel.md +0 -0
  58. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/kernelspec.md +0 -0
  59. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/pending.md +0 -0
  60. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/typing.md +0 -0
  61. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/utils.md +0 -0
  62. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/stylesheets/extra.css +0 -0
  63. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/thread_safety.md +0 -0
  64. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/usage/commands.md +0 -0
  65. {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/usage/index.md +0 -0
  66. {async_kernel-0.17.0 → async_kernel-0.18.0}/hatch_build.py +0 -0
  67. {async_kernel-0.17.0 → async_kernel-0.18.0}/mkdocs.yml +0 -0
  68. {async_kernel-0.17.0 → async_kernel-0.18.0}/pyproject.toml +0 -0
  69. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/__main__.py +0 -0
  70. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/comm.py +0 -0
  71. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/command.py +0 -0
  72. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/common.py +0 -0
  73. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/compat/json.py +0 -0
  74. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/compiler.py +0 -0
  75. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/debugger.py +0 -0
  76. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/__init__.py +0 -0
  77. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/asyncio_guest.py +0 -0
  78. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/qt_host.py +0 -0
  79. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/run.py +0 -0
  80. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/tk_host.py +0 -0
  81. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/__init__.py +0 -0
  82. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/pending.py +0 -0
  83. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/py.typed +0 -0
  84. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-32x32.png +0 -0
  85. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-64x64.png +0 -0
  86. {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-svg.svg +0 -0
  87. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/__init__.py +0 -0
  88. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/conftest.py +0 -0
  89. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/references.py +0 -0
  90. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_callable_kernel_interface.py +0 -0
  91. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_caller.py +0 -0
  92. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_comm.py +0 -0
  93. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_command.py +0 -0
  94. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_common.py +0 -0
  95. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_compat.py +0 -0
  96. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_debugger.py +0 -0
  97. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_enter_kernel.py +0 -0
  98. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_event_loop.py +0 -0
  99. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernel_subclass.py +0 -0
  100. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernelspec.py +0 -0
  101. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_message_spec.py +0 -0
  102. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_pending.py +0 -0
  103. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_zmq_messaging.py +0 -0
  104. {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/utils.py +0 -0
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Type checking with basedpyright
26
26
  run: |
27
27
  uv sync
28
- uvx basedpyright@1.39.2
28
+ uvx basedpyright@1.39.3
29
29
 
30
30
  test:
31
31
  needs: type-checking
@@ -110,5 +110,5 @@ jobs:
110
110
  timeout-minutes: 5
111
111
  run: |
112
112
  uv sync --group docs
113
- uv run async-kernel -a async-docs --shell.timeout=0.1
113
+ uv run async-kernel -a async-docs --shell.timeout=1
114
114
  uv run mkdocs build -s
@@ -40,7 +40,7 @@ jobs:
40
40
  - name: Install the project
41
41
  run: |
42
42
  uv sync --group docs
43
- uv run async-kernel -a async-docs --shell.timeout=0.1 # The 'async-docs' kernel is specified as the kernel for mkdocs-jupyter
43
+ uv run async-kernel -a async-docs --shell.timeout=1 # The 'async-docs' kernel is specified as the kernel for mkdocs-jupyter
44
44
 
45
45
  - name: Version info
46
46
  id: version
@@ -28,12 +28,12 @@ repos:
28
28
  - id: check-json5
29
29
 
30
30
  - repo: https://github.com/python-jsonschema/check-jsonschema
31
- rev: 0.37.0
31
+ rev: 0.37.1
32
32
  hooks:
33
33
  - id: check-github-workflows
34
34
 
35
35
  - repo: https://github.com/rbubley/mirrors-prettier
36
- rev: v3.8.1
36
+ rev: v3.8.3
37
37
  hooks:
38
38
  - id: prettier
39
39
  types_or: [yaml, html, json]
@@ -59,7 +59,7 @@ repos:
59
59
  - id: python-use-type-annotations
60
60
 
61
61
  - repo: https://github.com/astral-sh/ruff-pre-commit
62
- rev: v0.15.6
62
+ rev: v0.15.11
63
63
  hooks:
64
64
  - id: ruff-check
65
65
  types_or: [python, jupyter]
@@ -68,7 +68,7 @@ repos:
68
68
  types_or: [python, jupyter]
69
69
 
70
70
  - repo: https://github.com/scientific-python/cookie
71
- rev: 2026.03.02
71
+ rev: 2026.04.04
72
72
  hooks:
73
73
  - id: sp-repo-review
74
74
  additional_dependencies: ["repo-review[cli]"]
@@ -34,7 +34,7 @@
34
34
  "args": [
35
35
  "--notebook-dir=docs/notebooks",
36
36
  "--no-browser",
37
- "--ServerApp.token=''",
37
+ "--IdentityProvider.token=''",
38
38
  "--port=9991"
39
39
  ],
40
40
  "cwd": "${workspaceFolder}",
@@ -5,7 +5,57 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.17.0] - 2026-04-20
8
+ ## [0.18.0] - 2026-04-25
9
+
10
+ ### <!-- 0 --> 🏗️ Breaking changes
11
+
12
+ - Move kernel_info, help_links and debugger from the shell to the kernel or interface. [#444](https://github.com/fleming79/async-kernel/pull/444)
13
+
14
+ ### <!-- 1 --> 🚀 Features
15
+
16
+ - Add utils.redirect_stdout and utils.redirect_stderr. [#442](https://github.com/fleming79/async-kernel/pull/442)
17
+
18
+ - Make system calls asynchronous and convert uv and pip magics to use it. [#441](https://github.com/fleming79/async-kernel/pull/441)
19
+
20
+ ### <!-- 2 --> 🐛 Fixes
21
+
22
+ - Improve uv support and fix example kernel spec [#440](https://github.com/fleming79/async-kernel/pull/440)
23
+
24
+ ### <!-- 5 --> 📝 Documentation
25
+
26
+ - Update Caller docstrings [#446](https://github.com/fleming79/async-kernel/pull/446)
27
+
28
+ ### <!-- 6 --> 🌀 Miscellaneous
29
+
30
+ - Refactor AsyncInteractiveShell.shell method [#448](https://github.com/fleming79/async-kernel/pull/448)
31
+
32
+ - Refactor Caller.as_completed. [#447](https://github.com/fleming79/async-kernel/pull/447)
33
+
34
+ - Change kernel_info back to a property. [#445](https://github.com/fleming79/async-kernel/pull/445)
35
+
36
+ - Change magics thread, asynio and trio back to coroutines that don't return results. [#443](https://github.com/fleming79/async-kernel/pull/443)
37
+
38
+ ## [0.17.1] - 2026-04-23
39
+
40
+ ### <!-- 0 --> 🏗️ Breaking changes
41
+
42
+ - Drop the tag 'suppress_error'. [#436](https://github.com/fleming79/async-kernel/pull/436)
43
+
44
+ - BaseKernelInterface refactoring [#434](https://github.com/fleming79/async-kernel/pull/434)
45
+
46
+ ### <!-- 1 --> 🚀 Features
47
+
48
+ - Add asyncio and trio cell and line magic [#437](https://github.com/fleming79/async-kernel/pull/437)
49
+
50
+ - Support specifing the thread with cell magic and passing thread options [#435](https://github.com/fleming79/async-kernel/pull/435)
51
+
52
+ ### <!-- 6 --> 🌀 Miscellaneous
53
+
54
+ - Prepare for release v0.17.1 [#439](https://github.com/fleming79/async-kernel/pull/439)
55
+
56
+ - Update pre-commit, uv.lock and basedpyright [#438](https://github.com/fleming79/async-kernel/pull/438)
57
+
58
+ ## [0.17.0] - 2026-04-22
9
59
 
10
60
  ### <!-- 0 --> 🏗️ Breaking changes
11
61
 
@@ -15,6 +65,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
65
 
16
66
  - Make AsyncInteractiveShell and AsyncInteractiveSubshell easier to subclass. [#430](https://github.com/fleming79/async-kernel/pull/430)
17
67
 
68
+ ### <!-- 6 --> 🌀 Miscellaneous
69
+
70
+ - Prepare for release v0.17.0 [#433](https://github.com/fleming79/async-kernel/pull/433)
71
+
18
72
  ## [0.16.4] - 2026-04-15
19
73
 
20
74
  ### <!-- 2 --> 🐛 Fixes
@@ -1197,6 +1251,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1197
1251
 
1198
1252
  - Bump the actions group across 1 directory with 2 updates [#3](https://github.com/fleming79/async-kernel/pull/3)
1199
1253
 
1254
+ [0.18.0]: https://github.com/fleming79/async-kernel/compare/v0.17.1..v0.18.0
1255
+ [0.17.1]: https://github.com/fleming79/async-kernel/compare/v0.17.0..v0.17.1
1200
1256
  [0.17.0]: https://github.com/fleming79/async-kernel/compare/v0.16.4..v0.17.0
1201
1257
  [0.16.4]: https://github.com/fleming79/async-kernel/compare/v0.16.3..v0.16.4
1202
1258
  [0.16.3]: https://github.com/fleming79/async-kernel/compare/v0.16.2..v0.16.3
@@ -25,7 +25,7 @@ Additional steps to build documentation (optional):
25
25
 
26
26
  ```bash
27
27
  uv sync --group docs
28
- uv run async-kernel -a async-docs --main_shell.timeout=0.1
28
+ uv run async-kernel -a async-docs --main_shell.timeout=1
29
29
  ```
30
30
 
31
31
  ### Running tests
@@ -100,7 +100,7 @@ The 'docs' group specified extra packages are required to build documentation.
100
100
 
101
101
  ```bash
102
102
  uv sync --group docs
103
- uv run async-kernel -a async-docs --main_shell.timeout=0.1
103
+ uv run async-kernel -a async-docs --main_shell.timeout=1
104
104
  ```
105
105
 
106
106
  #### Test the docs
@@ -114,7 +114,7 @@ uv run mkdocs build -s
114
114
  The command:
115
115
 
116
116
  ```bash
117
- uv run async-kernel -a async-docs --main_shell.timeout=0.1
117
+ uv run async-kernel -a async-docs --main_shell.timeout=1
118
118
  ```
119
119
 
120
120
  Defines a new kernel spec with the name "async-docs" that sets the `shell.timeout` to 100ms.
@@ -145,13 +145,9 @@ Notebooks are included in the documentation by the plugin [mkdocs-jupyter](https
145
145
 
146
146
  !!! info
147
147
 
148
- We use the kernel spec named 'async-docs' which has a cell execute timeout of 100ms. This is used
148
+ We use the kernel spec named 'async-docs' which has a cell execute timeout of 1s. This is used
149
149
  to advance execution through long running cells.
150
150
 
151
- The [suppress-error][async_kernel.typing.Tags.suppress_error] tag is inserted in code cells to enable
152
- with generating documentation. The symbol '⚠' is an indicator that the error was suppressed. Normally
153
- this is due to the timeout but there is no distinction on the type of error.
154
-
155
151
  #### Useful links
156
152
 
157
153
  These links are not relevant for docstrings.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: async-kernel
3
- Version: 0.17.0
3
+ Version: 0.18.0
4
4
  Summary: A concurrent python kernel for Jupyter supporting AnyIO, AsyncIO and Trio.
5
5
  Project-URL: Homepage, https://fleming79.github.io/async-kernel
6
6
  Project-URL: Documentation, https://fleming79.github.io/async-kernel
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.17.0'
22
- __version_tuple__ = version_tuple = (0, 17, 0)
21
+ __version__ = version = '0.18.0'
22
+ __version_tuple__ = version_tuple = (0, 18, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -233,7 +233,7 @@
233
233
  "source": [
234
234
  "## Caller methods that return Pending\n",
235
235
  "\n",
236
- "Pending is like a thread-safe [asyncio.Future](https://docs.python.org/3/library/asyncio-future.html#asyncio.Future) like object to return future results. It was called `Pending` to avoid confusion about differences in functionality to that of `asyncio.Future` and `concurrent.futures.Future`.\n",
236
+ "Pending is a thread-safe representation of a future result. It was designed to provide thread-safe functionality similar [asyncio.Future](https://docs.python.org/3/library/asyncio-future.html#asyncio.Future) and was named `Pending` to avoid confusion about differences in functionality to that of `asyncio.Future` and `concurrent.futures.Future`.\n",
237
237
  "\n",
238
238
  "The following functions return a `Pending` object:\n",
239
239
  "\n",
@@ -187,10 +187,7 @@
187
187
  "editable": true,
188
188
  "slideshow": {
189
189
  "slide_type": ""
190
- },
191
- "tags": [
192
- "suppress-error"
193
- ]
190
+ }
194
191
  },
195
192
  "outputs": [],
196
193
  "source": [
@@ -223,13 +220,12 @@
223
220
  "slide_type": ""
224
221
  },
225
222
  "tags": [
226
- "thread",
227
- "suppress-error"
223
+ "thread"
228
224
  ]
229
225
  },
230
226
  "outputs": [],
231
227
  "source": [
232
- "# This time we'll use the tag to run the cell in a Thread\n",
228
+ "# This time we'll use the tag to run the cell in a worker thread\n",
233
229
  "await demo()"
234
230
  ]
235
231
  },
@@ -249,6 +245,160 @@
249
245
  "# thread\n",
250
246
  "%callers # magic provided by async-kernel"
251
247
  ]
248
+ },
249
+ {
250
+ "cell_type": "markdown",
251
+ "id": "11",
252
+ "metadata": {},
253
+ "source": [
254
+ "We can also specify CallerCreateOptions as part of the top line"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "code",
259
+ "execution_count": null,
260
+ "id": "12",
261
+ "metadata": {},
262
+ "outputs": [],
263
+ "source": [
264
+ "# thread name=\"My thread\"\n",
265
+ "%callers"
266
+ ]
267
+ },
268
+ {
269
+ "cell_type": "markdown",
270
+ "id": "13",
271
+ "metadata": {},
272
+ "source": [
273
+ "## Asynchronous magic\n",
274
+ "\n",
275
+ "Asynchronous line (%) and cell (%%) magic functions are supported. Any line or cell magic that returns an awaitable is awaited before proceeding.\n",
276
+ "\n",
277
+ "- **[thread magic](#thread-magic)**\n",
278
+ "- **[asyncio magic](#specify-the-backend)**\n",
279
+ "- **[trio magic](#specify-the-backend)**\n",
280
+ "\n",
281
+ "### thread magic\n",
282
+ "\n",
283
+ "This will run the code in a thread. When no settings are provided a cell worker thread is used.\n",
284
+ "\n",
285
+ "#### Comparing thread magic with thread run mode\n",
286
+ "\n",
287
+ "- thread magic (`%%thread`) is an asynchronous magic that executes the associated **code** in a separate thread. \n",
288
+ "- [thread run mode](#run-mode-thread) (`# thread`) instructs the kernel to run the **entire cell** in a separate thread, bypassing the shell execute request queue."
289
+ ]
290
+ },
291
+ {
292
+ "cell_type": "code",
293
+ "execution_count": null,
294
+ "id": "14",
295
+ "metadata": {},
296
+ "outputs": [],
297
+ "source": [
298
+ "# Run the magic 'callers' in a caller worker thread.\n",
299
+ "%thread %callers "
300
+ ]
301
+ },
302
+ {
303
+ "cell_type": "markdown",
304
+ "id": "15",
305
+ "metadata": {},
306
+ "source": [
307
+ "To specify a thread (caller) by name"
308
+ ]
309
+ },
310
+ {
311
+ "cell_type": "code",
312
+ "execution_count": null,
313
+ "id": "16",
314
+ "metadata": {},
315
+ "outputs": [],
316
+ "source": [
317
+ "%%thread name=\"My executor\" \n",
318
+ "%callers"
319
+ ]
320
+ },
321
+ {
322
+ "cell_type": "markdown",
323
+ "id": "17",
324
+ "metadata": {},
325
+ "source": [
326
+ "Many of arguments accepted on `Caller.get` are also supported. Let's use a thread with a trio backend."
327
+ ]
328
+ },
329
+ {
330
+ "cell_type": "code",
331
+ "execution_count": null,
332
+ "id": "18",
333
+ "metadata": {},
334
+ "outputs": [],
335
+ "source": [
336
+ "%%thread name=\"My trio executor\" backend=trio\n",
337
+ "%callers\n",
338
+ "\n",
339
+ "import trio\n",
340
+ "\n",
341
+ "await trio.sleep(0)"
342
+ ]
343
+ },
344
+ {
345
+ "cell_type": "markdown",
346
+ "id": "19",
347
+ "metadata": {},
348
+ "source": [
349
+ "## Specify the backend\n",
350
+ "\n",
351
+ "Code that is written for a specific backend ('asyncio' or 'trio') can be run in the same thread with one of the following:\n",
352
+ "\n",
353
+ "- Line magic - The code following the magic on the same line is run using the specified backend.\n",
354
+ " - `%trio` \n",
355
+ " - `%asyncio` \n",
356
+ "\n",
357
+ "- Cell magic - The code block is run using the specified backend. \n",
358
+ " - `%%trio`\n",
359
+ " - `%asyncio`\n",
360
+ "\n",
361
+ "**Note: trio must be installed for this demo to work.**"
362
+ ]
363
+ },
364
+ {
365
+ "cell_type": "code",
366
+ "execution_count": null,
367
+ "id": "20",
368
+ "metadata": {},
369
+ "outputs": [],
370
+ "source": [
371
+ "%asyncio await asyncio.sleep(0) # This code gets run in an asyncio task \n",
372
+ "%trio await trio.sleep(0) # trio run as line magic"
373
+ ]
374
+ },
375
+ {
376
+ "cell_type": "code",
377
+ "execution_count": null,
378
+ "id": "21",
379
+ "metadata": {},
380
+ "outputs": [],
381
+ "source": [
382
+ "%%trio # trio cell magic\n",
383
+ "\n",
384
+ "def print_info():\n",
385
+ " from aiologic.lowlevel import current_async_library\n",
386
+ " print(f\"\"\"\n",
387
+ " Kernel backend: {get_ipython().kernel.interface.backend}\n",
388
+ " Current backend: { current_async_library()}\n",
389
+ " \"\"\") \n",
390
+ "\n",
391
+ "\n",
392
+ "print_info()\n",
393
+ "await trio.sleep(0)\n",
394
+ "\n",
395
+ "%callers\n",
396
+ "\n",
397
+ "%asyncio print_info()\n",
398
+ "%asyncio %callers\n",
399
+ "\n",
400
+ "await trio.sleep(0)"
401
+ ]
252
402
  }
253
403
  ],
254
404
  "metadata": {
@@ -19,7 +19,9 @@
19
19
  "\n",
20
20
  "We can use uv to create a virtual environment for different versions of Python.\n",
21
21
  "\n",
22
- "Let's create a new virtual environment in the folder named \".venv_py315\" using uv."
22
+ "Let's create a new virtual environment in the folder named \".venv_py315\" using uv.\n",
23
+ "\n",
24
+ "**Requires a recent version of uv to be installed.**"
23
25
  ]
24
26
  },
25
27
  {
@@ -29,7 +31,7 @@
29
31
  "metadata": {},
30
32
  "outputs": [],
31
33
  "source": [
32
- "%uv venv .venv_py315 --python 3.15\n",
34
+ "%uv venv .venv_py315 --python 3.15 --clear\n",
33
35
  "%uv pip install --directory .venv_py315 --python 3.15 async-kernel"
34
36
  ]
35
37
  },
@@ -56,10 +58,10 @@
56
58
  "assert uv_path.exists()\n",
57
59
  "\n",
58
60
  "write_kernel_spec(\n",
59
- " kernel_name=\"async-kernel-315\",\n",
60
- " display_name=\"Python 3.15 (async kernel)\",\n",
61
- " env={\"UV_PROJECT_ENVIRONMENT\": uv_path.as_posix()},\n",
62
- " executable=(\"uv\", \"run\", \"python\", \"-m\"),\n",
61
+ " kernel_name=\"async_3.15\",\n",
62
+ " display_name=\"Python 3.15 (async)\",\n",
63
+ " env={\"UV_PROJECT_ENVIRONMENT\": str(uv_path)},\n",
64
+ " executable=(\"uv\", \"run\", \"--no-sync\", \"python\", \"-m\", \"async_kernel\"),\n",
63
65
  ")"
64
66
  ]
65
67
  },
@@ -68,7 +70,7 @@
68
70
  "id": "5",
69
71
  "metadata": {},
70
72
  "source": [
71
- "The kernel spec with the display name \"Python 3.15 (async kernel)\" has been added."
73
+ "The kernel spec with the display name \"Python 3.15 (async kernel)\" has been added. You will need to refresh the list of kernels for it to be available."
72
74
  ]
73
75
  }
74
76
  ],
@@ -7,7 +7,8 @@ from async_kernel.kernel import Kernel
7
7
  from async_kernel.kernelspec import PROTOCOL_VERSION
8
8
  from async_kernel.pending import Pending
9
9
 
10
- __version__ = version(distribution_name="async-kernel")
10
+ distribution_name = "async-kernel"
11
+ __version__ = version(distribution_name=distribution_name)
11
12
 
12
13
  kernel_protocol_version = PROTOCOL_VERSION
13
14
  kernel_protocol_version_info = {