async-kernel 0.19.0__tar.gz → 0.19.2__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 (110) hide show
  1. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/ci.yml +4 -4
  2. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/new_release.yml +1 -1
  3. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/publish-docs.yml +1 -1
  4. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/publish-to-pypi.yml +1 -1
  5. {async_kernel-0.19.0 → async_kernel-0.19.2}/CHANGELOG.md +28 -0
  6. {async_kernel-0.19.0 → async_kernel-0.19.2}/PKG-INFO +1 -1
  7. {async_kernel-0.19.0 → async_kernel-0.19.2}/_version.py +2 -2
  8. {async_kernel-0.19.0 → async_kernel-0.19.2}/hatch_build.py +6 -1
  9. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/command.py +10 -11
  10. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/kernel.py +36 -41
  11. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/kernelspec.py +8 -5
  12. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/base.py +27 -12
  13. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/ipshell.py +119 -105
  14. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/utils.py +13 -14
  15. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_callable_interface.py +22 -0
  16. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_command.py +8 -16
  17. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_kernel_ipshell.py +3 -8
  18. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_kernelspec.py +5 -1
  19. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_message_spec.py +1 -1
  20. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_utils.py +4 -2
  21. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_zmq_interface.py +4 -4
  22. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/dependabot.yaml +0 -0
  23. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/release.yml +0 -0
  24. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/enforce-label.yml +0 -0
  25. {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/pre-commit.yml +0 -0
  26. {async_kernel-0.19.0 → async_kernel-0.19.2}/.gitignore +0 -0
  27. {async_kernel-0.19.0 → async_kernel-0.19.2}/.pre-commit-config.yaml +0 -0
  28. {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/launch.json +0 -0
  29. {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/settings.json +0 -0
  30. {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/spellright.dict +0 -0
  31. {async_kernel-0.19.0 → async_kernel-0.19.2}/CONTRIBUTING.md +0 -0
  32. {async_kernel-0.19.0 → async_kernel-0.19.2}/IPYTHON_LICENSE +0 -0
  33. {async_kernel-0.19.0 → async_kernel-0.19.2}/LICENSE +0 -0
  34. {async_kernel-0.19.0 → async_kernel-0.19.2}/README.md +0 -0
  35. {async_kernel-0.19.0 → async_kernel-0.19.2}/cliff.toml +0 -0
  36. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/changelog.md +0 -0
  37. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/contributing.md +0 -0
  38. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/index.md +0 -0
  39. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/license.md +0 -0
  40. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/index.md +0 -0
  41. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/javascripts/extra.js +0 -0
  42. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/caller.ipynb +0 -0
  43. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/concurrency.ipynb +0 -0
  44. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/custom_kernel.ipynb +0 -0
  45. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/overrides/main.html +0 -0
  46. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/caller.md +0 -0
  47. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/comm.md +0 -0
  48. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/command.md +0 -0
  49. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/common.md +0 -0
  50. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/debugger.md +0 -0
  51. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/event_loop.md +0 -0
  52. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/index.md +0 -0
  53. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/interface.md +0 -0
  54. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/ipshell.md +0 -0
  55. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/kernel.md +0 -0
  56. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/kernelspec.md +0 -0
  57. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/pending.md +0 -0
  58. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/shell.md +0 -0
  59. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/typing.md +0 -0
  60. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/utils.md +0 -0
  61. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/stylesheets/extra.css +0 -0
  62. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/thread_safety.md +0 -0
  63. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/usage/commands.md +0 -0
  64. {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/usage/index.md +0 -0
  65. {async_kernel-0.19.0 → async_kernel-0.19.2}/mkdocs.yml +0 -0
  66. {async_kernel-0.19.0 → async_kernel-0.19.2}/pyproject.toml +0 -0
  67. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/__init__.py +0 -0
  68. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/__main__.py +0 -0
  69. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/caller.py +0 -0
  70. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/comm.py +0 -0
  71. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/common.py +0 -0
  72. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compat/attr_docs.py +0 -0
  73. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compat/json.py +0 -0
  74. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compiler.py +0 -0
  75. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/debugger.py +0 -0
  76. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/__init__.py +0 -0
  77. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/asyncio_guest.py +0 -0
  78. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/qt_host.py +0 -0
  79. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/run.py +0 -0
  80. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/tk_host.py +0 -0
  81. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/__init__.py +0 -0
  82. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/base.py +0 -0
  83. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/callable.py +0 -0
  84. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/zmq.py +0 -0
  85. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/pending.py +0 -0
  86. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/py.typed +0 -0
  87. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-32x32.png +0 -0
  88. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-64x64.png +0 -0
  89. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-svg.svg +0 -0
  90. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/__init__.py +0 -0
  91. {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/typing.py +0 -0
  92. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/__init__.py +0 -0
  93. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/conftest.py +0 -0
  94. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/references.py +0 -0
  95. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_base_interface.py +0 -0
  96. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_caller.py +0 -0
  97. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_comm.py +0 -0
  98. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_common.py +0 -0
  99. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_compat.py +0 -0
  100. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_debugger.py +0 -0
  101. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_debugger_static.py +0 -0
  102. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_enter_kernel.py +0 -0
  103. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_event_loop.py +0 -0
  104. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_iostream.py +0 -0
  105. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_pending.py +0 -0
  106. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_subclass.py +0 -0
  107. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_typing.py +0 -0
  108. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_zmq_messaging.py +0 -0
  109. {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/utils.py +0 -0
  110. {async_kernel-0.19.0 → async_kernel-0.19.2}/uv.lock +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  fetch-depth: 0
21
21
 
22
22
  - name: Install uv
23
- uses: astral-sh/setup-uv@v7
23
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
24
24
 
25
25
  - name: Type checking with basedpyright
26
26
  run: |
@@ -45,7 +45,7 @@ jobs:
45
45
  uses: actions/checkout@v6
46
46
 
47
47
  - name: Install uv
48
- uses: astral-sh/setup-uv@v7
48
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
49
49
  with:
50
50
  version-file: "pyproject.toml"
51
51
  python-version: ${{ matrix.python-version }}
@@ -70,7 +70,7 @@ jobs:
70
70
  fetch-depth: 0
71
71
 
72
72
  - name: Install uv
73
- uses: astral-sh/setup-uv@v7
73
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
74
74
  with:
75
75
  version-file: "pyproject.toml"
76
76
  python-version: "3.13"
@@ -99,7 +99,7 @@ jobs:
99
99
  fetch-depth: 0
100
100
 
101
101
  - name: Install uv
102
- uses: astral-sh/setup-uv@v7
102
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
103
103
  with:
104
104
  version-file: "pyproject.toml"
105
105
 
@@ -31,7 +31,7 @@ jobs:
31
31
  fetch-depth: 0
32
32
  ref: main
33
33
  - name: Install uv
34
- uses: astral-sh/setup-uv@v7
34
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
35
35
  with:
36
36
  version-file: "pyproject.toml"
37
37
 
@@ -27,7 +27,7 @@ jobs:
27
27
  git config user.email 41898282+github-actions[bot]@users.noreply.github.com
28
28
 
29
29
  - name: Install uv
30
- uses: astral-sh/setup-uv@v7
30
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
31
31
  with:
32
32
  version-file: "pyproject.toml"
33
33
 
@@ -31,7 +31,7 @@ jobs:
31
31
  # Fetch full history for setuptools-scm
32
32
  fetch-depth: 0
33
33
  ref: main
34
- - uses: astral-sh/setup-uv@v7
34
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
35
35
  with:
36
36
  version-file: "pyproject.toml"
37
37
 
@@ -5,6 +5,30 @@ 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.19.2] - 2026-06-04
9
+
10
+ ### <!-- 0 --> 🏗️ Breaking changes
11
+
12
+ - Rename methods on the shell to more resemble those on the kerenel. [#477](https://github.com/fleming79/async-kernel/pull/477)
13
+
14
+ ### <!-- 6 --> 🌀 Miscellaneous
15
+
16
+ - Run do_execute in tasks [#478](https://github.com/fleming79/async-kernel/pull/478)
17
+
18
+ ## [0.19.1] - 2026-05-27
19
+
20
+ ### <!-- 2 --> 🐛 Fixes
21
+
22
+ - Support flags instead of boolean operational action argv syntax. [#475](https://github.com/fleming79/async-kernel/pull/475)
23
+
24
+ - Remove python verson from default kernelspec. [#474](https://github.com/fleming79/async-kernel/pull/474)
25
+
26
+ ### <!-- 6 --> 🌀 Miscellaneous
27
+
28
+ - Prepare for release v0.19.1 [#476](https://github.com/fleming79/async-kernel/pull/476)
29
+
30
+ - Bump setup-uv from v7 to v8.1.0. [#473](https://github.com/fleming79/async-kernel/pull/473)
31
+
8
32
  ## [0.19.0] - 2026-05-26
9
33
 
10
34
  ### <!-- 0 --> 🏗️ Breaking changes
@@ -21,6 +45,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
21
45
 
22
46
  ### <!-- 6 --> 🌀 Miscellaneous
23
47
 
48
+ - Prepare for release v0.19.0 [#472](https://github.com/fleming79/async-kernel/pull/472)
49
+
24
50
  - Bump uv and basedpyright [#470](https://github.com/fleming79/async-kernel/pull/470)
25
51
 
26
52
  - Add message to task.cancel in task_factory [#461](https://github.com/fleming79/async-kernel/pull/461)
@@ -1309,6 +1335,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1309
1335
 
1310
1336
  - Bump the actions group across 1 directory with 2 updates [#3](https://github.com/fleming79/async-kernel/pull/3)
1311
1337
 
1338
+ [0.19.2]: https://github.com/fleming79/async-kernel/compare/v0.19.1..v0.19.2
1339
+ [0.19.1]: https://github.com/fleming79/async-kernel/compare/v0.19.0..v0.19.1
1312
1340
  [0.19.0]: https://github.com/fleming79/async-kernel/compare/v0.18.3..v0.19.0
1313
1341
  [0.18.3]: https://github.com/fleming79/async-kernel/compare/v0.18.2..v0.18.3
1314
1342
  [0.18.2]: https://github.com/fleming79/async-kernel/compare/v0.18.1..v0.18.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: async-kernel
3
- Version: 0.19.0
3
+ Version: 0.19.2
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.19.0'
22
- __version_tuple__ = version_tuple = (0, 19, 0)
21
+ __version__ = version = '0.19.2'
22
+ __version_tuple__ = version_tuple = (0, 19, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -22,4 +22,9 @@ class CustomHook(BuildHookInterface):
22
22
 
23
23
  name = "async"
24
24
  spec_folder = here.joinpath("data_kernelspec", name)
25
- write_kernel_spec(path=spec_folder, name=name, command=("python", "-m", "async_kernel", "start"))
25
+ write_kernel_spec(
26
+ path=spec_folder,
27
+ name=name,
28
+ command=("python", "-m", "async_kernel", "start"),
29
+ display_name=f"Python 3 ({name})",
30
+ )
@@ -21,17 +21,16 @@ if TYPE_CHECKING:
21
21
  __all__ = ["command_line"]
22
22
 
23
23
 
24
- def args_to_dict(args: list[str]) -> dict[str, Any]:
24
+ def to_flags_and_settings(args: list[str]) -> tuple[list[str], dict[str, Any]]:
25
25
  """
26
- Convert `argvs` to a dict.
26
+ Convert `argvs` to flags and settings.
27
27
 
28
28
  Args:
29
29
  args: A list of arguments, the first of which must start with '-' or '--'.
30
30
 
31
31
  Notes:
32
32
  - There is no distinction made between '-' and '--'.
33
- - Flags prefixed with 'no-' are assumed to be binary `False`.
34
-
33
+ - Flags are returned without '--' prefix.
35
34
  """
36
35
 
37
36
  def safe_eval(val: str) -> Any:
@@ -43,7 +42,7 @@ def args_to_dict(args: list[str]) -> dict[str, Any]:
43
42
  def add(k: str, v: Any) -> None:
44
43
  settings[k.strip()] = safe_eval(v)
45
44
 
46
- settings = {}
45
+ flags, settings = [], {}
47
46
  args = list(args)
48
47
  while args:
49
48
  k = args.pop(0)
@@ -61,11 +60,10 @@ def args_to_dict(args: list[str]) -> dict[str, Any]:
61
60
  v = settings.get(k, {}) | {a: safe_eval(v)}
62
61
  add(k, v)
63
62
  else:
64
- add(k, v)
63
+ add(k, safe_eval(v))
65
64
  else:
66
- # https://docs.python.org/3/library/argparse.html#argparse.BooleanOptionalAction
67
- add(k.removeprefix("no-"), not k.startswith("no-"))
68
- return settings
65
+ flags.append(k)
66
+ return flags, settings
69
67
 
70
68
 
71
69
  def command_line() -> None:
@@ -189,11 +187,11 @@ Tips:
189
187
  mode = mode_
190
188
  break
191
189
 
192
- settings = args_to_dict(unknownargs)
190
+ flags, settings = to_flags_and_settings(unknownargs)
193
191
 
194
192
  match mode:
195
193
  case Mode.install:
196
- path = write_kernel_spec(user=args.user, name=args.name, **settings)
194
+ path = write_kernel_spec(user=args.user, name=args.name, flags=flags, **settings)
197
195
  print(f"Installed kernelspec {str(path)!r}")
198
196
 
199
197
  case Mode.uninstall:
@@ -224,6 +222,7 @@ Tips:
224
222
  print("async-kernel", async_kernel.__version__)
225
223
  case Mode.start | Mode.help_all | Mode.show_config | Mode.show_config_json:
226
224
  launcher: InterfaceStartType = import_launcher(settings.get("launcher", ""))
225
+ settings["--flags"] = flags
227
226
  try:
228
227
  launcher(settings)
229
228
  except KeyboardInterrupt:
@@ -44,6 +44,7 @@ if TYPE_CHECKING:
44
44
  from contextvars import ContextVar
45
45
  from types import CoroutineType, FrameType
46
46
 
47
+ from async_kernel.pending import Pending
47
48
  from async_kernel.typing import Content, Message
48
49
 
49
50
  __all__ = ["Kernel", "KernelInterrupt"]
@@ -156,8 +157,10 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
156
157
  comm_manager = Fixed(CommManager)
157
158
  "Creates [async_kernel.comm.Comm][] instances and maintains a mapping to `comm_id` to `Comm` instances."
158
159
 
159
- interrupts: Fixed[Self, set[Callable[[], object]]] = Fixed(set)
160
- "A set for callbacks to register for calling when `interrupt` is called."
160
+ active_execute_requests: Fixed[Self, set[Pending[Any]]] = Fixed(set)
161
+ "A set of active execute requests that gets updated by the shell."
162
+
163
+ _interrupt_message = "Kernel interrupted"
161
164
 
162
165
  _restart = False
163
166
  _handler_cache: ClassVar[dict[tuple[str | None, MsgType, Callable], HandlerType]] = {}
@@ -319,17 +322,15 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
319
322
  else:
320
323
  os.kill(os.getpid(), signal.SIGINT)
321
324
 
322
- def interrupt(self) -> None:
325
+ def do_interrupt(self) -> None:
323
326
  """
324
- Perform a keyboard interrupt.
327
+ Interrupt/cancel non-silent active execute requests.
325
328
  """
326
329
  if (sys.platform != "emscripten") and (not self.debugger.enabled or not self.debugger.stopped_threads):
327
330
  self._interrupt_now()
328
- while self.interrupts:
329
- try:
330
- self.interrupts.pop()()
331
- except Exception:
332
- pass
331
+ for pen in tuple(self.active_execute_requests):
332
+ if not pen.metadata.get("kwargs", {}).get("silent", False):
333
+ pen.cancel(self._interrupt_message)
333
334
 
334
335
  def _patch_signal(self) -> Callable[[], None]:
335
336
 
@@ -541,22 +542,27 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
541
542
 
542
543
  async def execute_request(self, job: Job[ExecuteContent], /) -> Content:
543
544
  """Handle an [execute request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#execute)."""
544
- return await self.shell.execute_request(job)
545
+ return await self.shell.do_execute(
546
+ cell_id=job["msg"]["metadata"].get("cellId"),
547
+ received_time=job["received_time"],
548
+ tags=job["msg"]["metadata"].get("tags", ()),
549
+ **job["msg"]["content"], # pyright: ignore[reportArgumentType]
550
+ )
545
551
 
546
552
  async def complete_request(self, job: Job[Content], /) -> Content:
547
553
  """Handle an [completion request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#completion)."""
548
- return await self.shell.do_complete_request(
554
+ return await self.shell.do_complete(
549
555
  code=job["msg"]["content"].get("code", ""), cursor_pos=job["msg"]["content"].get("cursor_pos", 0)
550
556
  )
551
557
 
552
558
  async def is_complete_request(self, job: Job[Content], /) -> Content:
553
559
  """Handle an [is_complete request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#code-completeness)."""
554
- return await self.shell.is_complete_request(job["msg"]["content"].get("code", ""))
560
+ return await self.shell.is_complete(job["msg"]["content"].get("code", ""))
555
561
 
556
562
  async def inspect_request(self, job: Job[Content], /) -> Content:
557
563
  """Handle an [inspect request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#introspection)."""
558
564
  c = job["msg"]["content"]
559
- return await self.shell.inspect_request(
565
+ return await self.shell.do_inspect(
560
566
  code=c.get("code", ""),
561
567
  cursor_pos=c.get("cursor_pos", 0),
562
568
  detail_level=c.get("detail_level", 0),
@@ -564,7 +570,7 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
564
570
 
565
571
  async def history_request(self, job: Job[Content], /) -> Content:
566
572
  """Handle an [history request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#history)."""
567
- return await self.shell.history_request(**job["msg"]["content"])
573
+ return await self.shell.do_history(**job["msg"]["content"])
568
574
 
569
575
  async def comm_open(self, job: Job[Content], /) -> None:
570
576
  """Handle an [comm open request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#opening-a-comm)."""
@@ -580,7 +586,7 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
580
586
 
581
587
  async def interrupt_request(self, job: Job[Content], /) -> Content:
582
588
  """Handle an [interrupt request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#kernel-interrupt)."""
583
- self.interrupt()
589
+ self.do_interrupt()
584
590
  return {}
585
591
 
586
592
  async def shutdown_request(self, job: Job[Content], /) -> Content:
@@ -624,11 +630,13 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
624
630
 
625
631
  async def do_complete(self, code: str, cursor_pos: int | None) -> Content:
626
632
  "Matches signature of [ipykernel.kernelbase.Kernel.do_complete][]."
627
- return await self.shell.do_complete_request(code=code, cursor_pos=cursor_pos)
633
+ return await self.shell.do_complete(code=code, cursor_pos=cursor_pos)
628
634
 
629
- async def do_inspect(self, code: str, cursor_pos: int | None, detail_level=0, omit_sections=()) -> Content:
635
+ async def do_inspect(
636
+ self, code: str, cursor_pos: int = 0, detail_level: Literal[0, 1] = 0, omit_sections=()
637
+ ) -> Content:
630
638
  "Matches signature of [ipykernel.kernelbase.Kernel.do_inspect][]."
631
- return await self.shell.inspect_request(code=code, cursor_pos=cursor_pos) # pyright: ignore[reportArgumentType]
639
+ return await self.shell.do_inspect(code=code, cursor_pos=cursor_pos, detail_level=detail_level)
632
640
 
633
641
  async def do_history(
634
642
  self,
@@ -643,7 +651,7 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
643
651
  unique=False,
644
652
  ) -> Content:
645
653
  "Matches signature of [ipykernel.kernelbase.Kernel.do_history][]."
646
- return await self.shell.history_request(
654
+ return await self.shell.do_history(
647
655
  output=output,
648
656
  raw=raw,
649
657
  hist_access_type=hist_access_type,
@@ -655,37 +663,24 @@ class Kernel(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_interf
655
663
  async def do_execute(
656
664
  self,
657
665
  code: str,
658
- silent: bool,
666
+ silent: bool = True,
659
667
  store_history: bool = True,
660
668
  user_expressions: dict[str, str] | None = None,
661
669
  allow_stdin: bool = False,
662
670
  *,
663
671
  cell_meta: dict[str, Any] | None = None,
664
672
  cell_id: str | None = None,
673
+ **_ignored,
665
674
  ) -> Content:
666
675
  "Matches signature of [ipykernel.kernelbase.Kernel.do_execute][]."
667
- if cell_meta is None:
668
- cell_meta = {}
669
- if cell_id is not None:
670
- cell_meta["cellId"] = cell_id
671
- msg = self.parent.msg(
672
- "execute_request",
673
- content=ExecuteContent(
674
- code=code,
675
- silent=silent,
676
- store_history=store_history,
677
- user_expressions=user_expressions or {},
678
- allow_stdin=allow_stdin,
679
- stop_on_error=False,
680
- ),
681
- metadata=cell_meta,
676
+ return await self.shell.do_execute(
677
+ code=code,
678
+ silent=silent,
679
+ store_history=store_history,
680
+ user_expressions=user_expressions,
681
+ allow_stdin=allow_stdin,
682
+ cell_id=cell_id,
682
683
  )
683
- job: Job[ExecuteContent] = Job(msg=msg, ident=[], received_time=time.monotonic())
684
- token = utils._job_var.set(job) # pyright: ignore[reportPrivateUsage]
685
- try:
686
- return await self.shell.execute_request(job)
687
- finally:
688
- utils._job_var.reset(token) # pyright: ignore[reportPrivateUsage]
689
684
 
690
685
  def getpass(self, prompt="", stream=None) -> str:
691
686
  "Matches signature of [ipykernel.kernelbase.Kernel.getpass][]."
@@ -12,7 +12,7 @@ from pathlib import Path
12
12
  from typing import TYPE_CHECKING, Any
13
13
 
14
14
  if TYPE_CHECKING:
15
- from collections.abc import Callable
15
+ from collections.abc import Callable, Iterable
16
16
 
17
17
  InterfaceStartType = Callable[[dict[str, Any]], Any]
18
18
 
@@ -49,6 +49,7 @@ def make_argv(
49
49
  name: str = "async",
50
50
  launcher: str | InterfaceStartType = DEFAULT_LAUNCHER,
51
51
  command: tuple[str, ...] = DEFAULT_COMMAND,
52
+ flags: Iterable[str] = (),
52
53
  **kwargs: Any,
53
54
  ) -> list[str]:
54
55
  """Returns an argument vector (argv) that can be used to start a `Kernel`.
@@ -68,15 +69,13 @@ def make_argv(
68
69
  - "start_kernel_zmq_interface"
69
70
  name: The name to use for the kernel.
70
71
  command: The command line command to call.
72
+ flags: Any number of flags to insert in argv. Flags will be prefixed with '--'.
71
73
  **kwargs: Additional settings to pass when creating the kernel passed to `launcher`.
72
74
 
73
75
  Returns:
74
76
  list: A list of command-line arguments to launch the kernel module.
75
77
  """
76
- argv = [
77
- *command,
78
- f"--connection_file={connection_file}",
79
- ]
78
+ argv = [*command, f"--connection_file={connection_file}", *(f"--{f.strip('-')}" for f in flags)]
80
79
  for k, v in ({"launcher": launcher, "name": name} | kwargs).items():
81
80
  argv.append(f"--{k}={v}")
82
81
  return list(map(str, argv))
@@ -125,6 +124,7 @@ def write_kernel_spec(
125
124
  metadata: dict | None = None,
126
125
  language="python",
127
126
  resources: Path | None = RESOURCES,
127
+ flags: Iterable[str] = (),
128
128
  **kwargs: Any,
129
129
  ) -> Path:
130
130
  """
@@ -157,6 +157,8 @@ def write_kernel_spec(
157
157
  A mapping of additional attributes to aid the client in kernel selection.
158
158
  resources:
159
159
  The path to the resources folder to include with the kernel spec.
160
+ flags:
161
+ Flags to insert directly into the argv string.
160
162
  **kwargs:
161
163
  Pass additional settings to set on the instance of the `Kernel` when it is instantiated.
162
164
  Each setting should correspond to the dotted path to the attribute relative to the kernel.
@@ -194,6 +196,7 @@ def write_kernel_spec(
194
196
  connection_file=connection_file,
195
197
  name=name,
196
198
  command=command,
199
+ flags=flags,
197
200
  **kwargs,
198
201
  )
199
202
  spec: dict[str, list[Any] | Any | dict[Any, Any] | str | dict[str, bool]] = {
@@ -16,10 +16,10 @@ from async_kernel import utils
16
16
  from async_kernel.common import Fixed
17
17
  from async_kernel.interface import HasInterface
18
18
  from async_kernel.pending import PendingManager
19
- from async_kernel.typing import ExecuteContent, Job, T_interface_co
19
+ from async_kernel.typing import T_interface_co
20
20
 
21
21
  if TYPE_CHECKING:
22
- from collections.abc import Callable, Generator
22
+ from collections.abc import Callable, Generator, Iterable
23
23
 
24
24
  from async_kernel import Kernel
25
25
  from async_kernel.typing import Content
@@ -207,23 +207,38 @@ class BaseShell(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_int
207
207
  content["metadata"] = {}
208
208
  self.parent.iopub_send("execute_result", content=content)
209
209
 
210
- async def execute_request(self, job: Job[ExecuteContent]) -> Content:
211
- """Handle an [execute request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#execute)."""
210
+ async def do_execute(
211
+ self,
212
+ code: str = "",
213
+ *,
214
+ silent: bool = False,
215
+ store_history: bool = False,
216
+ user_expressions: dict[str, str] | None = None,
217
+ allow_stdin: bool = False,
218
+ stop_on_error: bool = False,
219
+ cell_id: str | None = None,
220
+ received_time: float = 0,
221
+ tags: Iterable[str] = (),
222
+ **_ignored,
223
+ ) -> Content:
224
+ """
225
+ Execute code in the shell.
226
+ """
212
227
  raise NotImplementedError
213
228
 
214
- async def do_complete_request(self, code: str, cursor_pos: int | None = None) -> Content:
215
- """Handle an [completion request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#completion)."""
229
+ async def do_complete(self, code: str, cursor_pos: int | None = None) -> Content:
230
+ ""
216
231
  raise NotImplementedError
217
232
 
218
- async def is_complete_request(self, code: str) -> Content:
219
- """Handle an [is_complete request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#code-completeness)."""
233
+ async def is_complete(self, code: str) -> Content:
234
+ ""
220
235
  raise NotImplementedError
221
236
 
222
- async def inspect_request(self, code: str, cursor_pos: int = 0, detail_level: Literal[0, 1] = 0) -> Content:
223
- """Handle an [inspect request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#introspection)."""
237
+ async def do_inspect(self, code: str, cursor_pos: int = 0, detail_level: Literal[0, 1] = 0) -> Content:
238
+ ""
224
239
  raise NotImplementedError
225
240
 
226
- async def history_request(
241
+ async def do_history(
227
242
  self,
228
243
  *,
229
244
  output: bool = False,
@@ -237,5 +252,5 @@ class BaseShell(HasInterface[T_interface_co], LoggingConfigurable, Generic[T_int
237
252
  unique: bool = False,
238
253
  **_ignored,
239
254
  ) -> Content:
240
- """Handle an [history request](https://jupyter-client.readthedocs.io/en/stable/messaging.html#history)."""
255
+ ""
241
256
  raise NotImplementedError