async-kernel 0.15.0__tar.gz → 0.16.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.15.0 → async_kernel-0.16.0}/.github/workflows/ci.yml +1 -1
  2. {async_kernel-0.15.0 → async_kernel-0.16.0}/CHANGELOG.md +59 -0
  3. {async_kernel-0.15.0 → async_kernel-0.16.0}/PKG-INFO +1 -1
  4. {async_kernel-0.15.0 → async_kernel-0.16.0}/_version.py +2 -2
  5. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/asyncshell.md +1 -2
  6. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/asyncshell.py +16 -11
  7. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/caller.py +276 -303
  8. async_kernel-0.16.0/src/async_kernel/common.py +279 -0
  9. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/debugger.py +0 -3
  10. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/interface/base.py +3 -4
  11. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/interface/zmq.py +6 -7
  12. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/kernel.py +8 -3
  13. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/pending.py +107 -90
  14. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_callable_kernel_interface.py +2 -2
  15. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_caller.py +39 -160
  16. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_common.py +95 -1
  17. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_kernel.py +24 -26
  18. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_pending.py +53 -69
  19. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/utils.py +1 -1
  20. {async_kernel-0.15.0 → async_kernel-0.16.0}/uv.lock +355 -355
  21. async_kernel-0.15.0/src/async_kernel/common.py +0 -132
  22. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/dependabot.yaml +0 -0
  23. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/release.yml +0 -0
  24. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/workflows/enforce-label.yml +0 -0
  25. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/workflows/new_release.yml +0 -0
  26. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/workflows/pre-commit.yml +0 -0
  27. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/workflows/publish-docs.yml +0 -0
  28. {async_kernel-0.15.0 → async_kernel-0.16.0}/.github/workflows/publish-to-pypi.yml +0 -0
  29. {async_kernel-0.15.0 → async_kernel-0.16.0}/.gitignore +0 -0
  30. {async_kernel-0.15.0 → async_kernel-0.16.0}/.pre-commit-config.yaml +0 -0
  31. {async_kernel-0.15.0 → async_kernel-0.16.0}/.vscode/launch.json +0 -0
  32. {async_kernel-0.15.0 → async_kernel-0.16.0}/.vscode/settings.json +0 -0
  33. {async_kernel-0.15.0 → async_kernel-0.16.0}/.vscode/spellright.dict +0 -0
  34. {async_kernel-0.15.0 → async_kernel-0.16.0}/CONTRIBUTING.md +0 -0
  35. {async_kernel-0.15.0 → async_kernel-0.16.0}/IPYTHON_LICENSE +0 -0
  36. {async_kernel-0.15.0 → async_kernel-0.16.0}/LICENSE +0 -0
  37. {async_kernel-0.15.0 → async_kernel-0.16.0}/README.md +0 -0
  38. {async_kernel-0.15.0 → async_kernel-0.16.0}/cliff.toml +0 -0
  39. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/about/changelog.md +0 -0
  40. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/about/contributing.md +0 -0
  41. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/about/index.md +0 -0
  42. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/about/license.md +0 -0
  43. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/index.md +0 -0
  44. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/javascripts/extra.js +0 -0
  45. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/notebooks/caller.ipynb +0 -0
  46. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/notebooks/concurrency.ipynb +0 -0
  47. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/overrides/main.html +0 -0
  48. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/caller.md +0 -0
  49. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/comm.md +0 -0
  50. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/command.md +0 -0
  51. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/common.md +0 -0
  52. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/debugger.md +0 -0
  53. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/event_loop.md +0 -0
  54. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/index.md +0 -0
  55. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/interface.md +0 -0
  56. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/kernel.md +0 -0
  57. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/kernelspec.md +0 -0
  58. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/pending.md +0 -0
  59. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/typing.md +0 -0
  60. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/reference/utils.md +0 -0
  61. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/stylesheets/extra.css +0 -0
  62. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/thread_safety.md +0 -0
  63. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/usage/commands.md +0 -0
  64. {async_kernel-0.15.0 → async_kernel-0.16.0}/docs/usage/index.md +0 -0
  65. {async_kernel-0.15.0 → async_kernel-0.16.0}/hatch_build.py +0 -0
  66. {async_kernel-0.15.0 → async_kernel-0.16.0}/mkdocs.yml +0 -0
  67. {async_kernel-0.15.0 → async_kernel-0.16.0}/pyproject.toml +0 -0
  68. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/__init__.py +0 -0
  69. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/__main__.py +0 -0
  70. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/comm.py +0 -0
  71. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/command.py +0 -0
  72. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/compat/json.py +0 -0
  73. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/compiler.py +0 -0
  74. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/event_loop/__init__.py +0 -0
  75. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/event_loop/asyncio_guest.py +0 -0
  76. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/event_loop/qt_host.py +0 -0
  77. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/event_loop/run.py +0 -0
  78. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/event_loop/tk_host.py +0 -0
  79. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/interface/__init__.py +0 -0
  80. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/interface/callable.py +0 -0
  81. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/iostream.py +0 -0
  82. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/kernelspec.py +0 -0
  83. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/py.typed +0 -0
  84. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/resources/logo-32x32.png +0 -0
  85. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/resources/logo-64x64.png +0 -0
  86. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/resources/logo-svg.svg +0 -0
  87. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/typing.py +0 -0
  88. {async_kernel-0.15.0 → async_kernel-0.16.0}/src/async_kernel/utils.py +0 -0
  89. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/__init__.py +0 -0
  90. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/conftest.py +0 -0
  91. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/references.py +0 -0
  92. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_comm.py +0 -0
  93. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_command.py +0 -0
  94. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_compat.py +0 -0
  95. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_debugger.py +0 -0
  96. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_enter_kernel.py +0 -0
  97. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_event_loop.py +0 -0
  98. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_iostream.py +0 -0
  99. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_kernel_subclass.py +0 -0
  100. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_kernelspec.py +0 -0
  101. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_message_spec.py +0 -0
  102. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_typing.py +0 -0
  103. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_utils.py +0 -0
  104. {async_kernel-0.15.0 → async_kernel-0.16.0}/tests/test_zmq_messaging.py +0 -0
@@ -85,7 +85,7 @@ jobs:
85
85
 
86
86
  - name: Upload coverage reports to Codecov
87
87
  if: ${{ !cancelled() }}
88
- uses: codecov/codecov-action@v5
88
+ uses: codecov/codecov-action@v6
89
89
  with:
90
90
  token: ${{ secrets.CODECOV_TOKEN }}
91
91
  slug: fleming79/async-kernel
@@ -5,6 +5,62 @@ 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.16.0] - 2026-04-06
9
+
10
+ ### <!-- 0 --> 🏗️ Breaking changes
11
+
12
+ - Change KernelInterruptError to KernelInterrupt [#405](https://github.com/fleming79/async-kernel/pull/405)
13
+
14
+ - Pending no longer raises an InvalidStateError if it is already done [#400](https://github.com/fleming79/async-kernel/pull/400)
15
+
16
+ ### <!-- 1 --> 🚀 Features
17
+
18
+ - Caller maintenance and make SingleAsyncQueue publicly available [#411](https://github.com/fleming79/async-kernel/pull/411)
19
+
20
+ - Add shield option to Pending.wait [#410](https://github.com/fleming79/async-kernel/pull/410)
21
+
22
+ - Improve HistoryManager handling [#407](https://github.com/fleming79/async-kernel/pull/407)
23
+
24
+ ### <!-- 2 --> 🐛 Fixes
25
+
26
+ - Fix Fixed.create_instance bug [#395](https://github.com/fleming79/async-kernel/pull/395)
27
+
28
+ ### <!-- 6 --> 🌀 Miscellaneous
29
+
30
+ - Caller refactoring [#419](https://github.com/fleming79/async-kernel/pull/419)
31
+
32
+ - Convert Caller._get_task_factory to a function [#416](https://github.com/fleming79/async-kernel/pull/416)
33
+
34
+ - Move async_kernel.caller.SingleAsyncQueue to async_kernel.common.SingleAsyncQueue [#415](https://github.com/fleming79/async-kernel/pull/415)
35
+
36
+ - Add SingleAsyncQueue.appendleft. [#414](https://github.com/fleming79/async-kernel/pull/414)
37
+
38
+ - KernelInterrupt subclass from InterruptedError. [#413](https://github.com/fleming79/async-kernel/pull/413)
39
+
40
+ - Update uv.lock. [#412](https://github.com/fleming79/async-kernel/pull/412)
41
+
42
+ - Caller refactoring [#409](https://github.com/fleming79/async-kernel/pull/409)
43
+
44
+ - Caller maintenance [#408](https://github.com/fleming79/async-kernel/pull/408)
45
+
46
+ - Improve reliability of test_comm_open_msg_close [#406](https://github.com/fleming79/async-kernel/pull/406)
47
+
48
+ - Caller maintenance [#404](https://github.com/fleming79/async-kernel/pull/404)
49
+
50
+ - Improve Pending._set_done thread safety [#403](https://github.com/fleming79/async-kernel/pull/403)
51
+
52
+ - Pending._set_done refactor. [#401](https://github.com/fleming79/async-kernel/pull/401)
53
+
54
+ - Set session.check_pid to False which is used for every comm message sent. (os.getpid is not cheap). [#399](https://github.com/fleming79/async-kernel/pull/399)
55
+
56
+ - Caller refactoring [#398](https://github.com/fleming79/async-kernel/pull/398)
57
+
58
+ - Refactor Pending [#397](https://github.com/fleming79/async-kernel/pull/397)
59
+
60
+ - Use THREAD_DUMMY_LOCK to save memory [#396](https://github.com/fleming79/async-kernel/pull/396)
61
+
62
+ - Bump codecov/codecov-action from 5 to 6 in the actions group [#392](https://github.com/fleming79/async-kernel/pull/392)
63
+
8
64
  ## [0.15.0] - 2026-03-30
9
65
 
10
66
  ### <!-- 0 --> 🏗️ Breaking changes
@@ -29,6 +85,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
29
85
 
30
86
  ### <!-- 6 --> 🌀 Miscellaneous
31
87
 
88
+ - Prepare for release v0.15.0 [#394](https://github.com/fleming79/async-kernel/pull/394)
89
+
32
90
  - Change Pending.wait_sync signature to be the same as Pending.wait [#393](https://github.com/fleming79/async-kernel/pull/393)
33
91
 
34
92
  - Tidy up [#391](https://github.com/fleming79/async-kernel/pull/391)
@@ -1087,6 +1145,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1087
1145
 
1088
1146
  - Bump the actions group across 1 directory with 2 updates [#3](https://github.com/fleming79/async-kernel/pull/3)
1089
1147
 
1148
+ [0.16.0]: https://github.com/fleming79/async-kernel/compare/v0.15.0..v0.16.0
1090
1149
  [0.15.0]: https://github.com/fleming79/async-kernel/compare/v0.14.0..v0.15.0
1091
1150
  [0.14.0]: https://github.com/fleming79/async-kernel/compare/v0.13.3..v0.14.0
1092
1151
  [0.13.3]: https://github.com/fleming79/async-kernel/compare/v0.13.2..v0.13.3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: async-kernel
3
- Version: 0.15.0
3
+ Version: 0.16.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.15.0'
22
- __version_tuple__ = version_tuple = (0, 15, 0)
21
+ __version__ = version = '0.16.0'
22
+ __version_tuple__ = version_tuple = (0, 16, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -4,8 +4,7 @@
4
4
  members:
5
5
  - __all__
6
6
  - AsyncInteractiveShell
7
- - AsyncInteractiveSubshell
8
- - KernelInterruptError
7
+ - AsyncInteractiveSubshell
9
8
  - AsyncDisplayHook
10
9
  - AsyncDisplayPublisher
11
10
  - SubshellManager
@@ -16,6 +16,7 @@ from aiologic.lowlevel import async_checkpoint
16
16
  from IPython.core.completer import provisionalcompleter, rectify_completions
17
17
  from IPython.core.displayhook import DisplayHook
18
18
  from IPython.core.displaypub import DisplayPublisher
19
+ from IPython.core.history import HistoryManager
19
20
  from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
20
21
  from IPython.core.interactiveshell import _modified_open as _modified_open_ # pyright: ignore[reportPrivateUsage]
21
22
  from IPython.core.magic import Magics, line_magic, magics_class
@@ -27,7 +28,7 @@ from typing_extensions import override
27
28
  import async_kernel
28
29
  from async_kernel import utils
29
30
  from async_kernel.caller import Caller
30
- from async_kernel.common import Fixed
31
+ from async_kernel.common import Fixed, KernelInterrupt
31
32
  from async_kernel.compiler import XCachingCompiler
32
33
  from async_kernel.event_loop.run import get_runtime_matplotlib_guis
33
34
  from async_kernel.pending import PendingManager
@@ -36,7 +37,6 @@ from async_kernel.typing import Channel, Content, Message, NoValue, Tags
36
37
  if TYPE_CHECKING:
37
38
  from collections.abc import Callable, Generator
38
39
 
39
- from IPython.core.history import HistoryManager
40
40
  from traitlets.config import Configurable
41
41
 
42
42
  from async_kernel import Kernel
@@ -45,10 +45,6 @@ if TYPE_CHECKING:
45
45
  __all__ = ["AsyncInteractiveShell"]
46
46
 
47
47
 
48
- class KernelInterruptError(Exception):
49
- "Raised to interrupt the kernel."
50
-
51
-
52
48
  class AsyncDisplayHook(DisplayHook):
53
49
  """
54
50
  A displayhook subclass that publishes data using [iopub_send][async_kernel.kernel.Kernel.iopub_send].
@@ -184,6 +180,7 @@ class AsyncInteractiveShell(InteractiveShell):
184
180
  display_pub_class = Type(AsyncDisplayPublisher)
185
181
  displayhook: Instance[AsyncDisplayHook]
186
182
  display_pub: Instance[AsyncDisplayPublisher]
183
+ history_manager: HistoryManager
187
184
  compiler_class = Type(XCachingCompiler)
188
185
  compile: Instance[XCachingCompiler]
189
186
  kernel: Instance[Kernel] = Instance("async_kernel.Kernel", (), read_only=True)
@@ -216,8 +213,6 @@ class AsyncInteractiveShell(InteractiveShell):
216
213
  @override
217
214
  def __init__(self, parent: None | Configurable = None) -> None:
218
215
  super().__init__(parent=parent)
219
- with contextlib.suppress(AttributeError):
220
- utils.mark_thread_pydev_do_not_trace(self.history_manager.save_thread) # pyright: ignore[reportOptionalMemberAccess]
221
216
 
222
217
  def _get_default_ns(self) -> dict[str, Any]:
223
218
  # Copied from `InteractiveShell.init_user_ns`
@@ -282,6 +277,16 @@ class AsyncInteractiveShell(InteractiveShell):
282
277
 
283
278
  self.set_hook("show_in_pager", _show_in_pager, 99)
284
279
 
280
+ @override
281
+ def init_history(self) -> None:
282
+ if self.subshell_id is None:
283
+ self.history_manager = HistoryManager(shell=self, parent=self)
284
+ self.configurables.append(self.history_manager) # pyright: ignore[reportArgumentType]
285
+ utils.mark_thread_pydev_do_not_trace(self.history_manager.save_thread)
286
+ else:
287
+ self.history_manager = HistoryManager(shell=self, parent=self, hist_file=":memory:")
288
+ self.history_manager.output_hist.update(self.kernel.main_shell.history_manager.output_hist)
289
+
285
290
  @property
286
291
  @override
287
292
  def execution_count(self) -> int:
@@ -379,9 +384,9 @@ class AsyncInteractiveShell(InteractiveShell):
379
384
  )
380
385
  except (Exception, anyio.get_cancelled_exc_class()) as e:
381
386
  # A safeguard to catch exceptions not caught by the shell.
382
- err = KernelInterruptError() if self.kernel.interface.last_interrupt_frame else e
387
+ err = KernelInterrupt() if self.kernel.interface.last_interrupt_frame else e
383
388
  else:
384
- err = result.error_before_exec or result.error_in_exec if result else KernelInterruptError()
389
+ err = result.error_before_exec or result.error_in_exec if result else KernelInterrupt()
385
390
  if not err and Tags.raises_exception in tags:
386
391
  msg = "An expected exception was not raised!"
387
392
  err = RuntimeError(msg)
@@ -477,7 +482,7 @@ class AsyncInteractiveShell(InteractiveShell):
477
482
  **_ignored,
478
483
  ) -> Content:
479
484
  """Handle a [history request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#history)."""
480
- history_manager: HistoryManager = self.history_manager # pyright: ignore[reportAssignmentType]
485
+ history_manager = self.history_manager
481
486
  assert history_manager
482
487
  match hist_access_type:
483
488
  case "tail":