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.
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/ci.yml +4 -4
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/new_release.yml +1 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/publish-docs.yml +1 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/publish-to-pypi.yml +1 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/CHANGELOG.md +28 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/PKG-INFO +1 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/_version.py +2 -2
- {async_kernel-0.19.0 → async_kernel-0.19.2}/hatch_build.py +6 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/command.py +10 -11
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/kernel.py +36 -41
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/kernelspec.py +8 -5
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/base.py +27 -12
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/ipshell.py +119 -105
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/utils.py +13 -14
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_callable_interface.py +22 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_command.py +8 -16
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_kernel_ipshell.py +3 -8
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_kernelspec.py +5 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_message_spec.py +1 -1
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_utils.py +4 -2
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_zmq_interface.py +4 -4
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/dependabot.yaml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/release.yml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/enforce-label.yml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.github/workflows/pre-commit.yml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.gitignore +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.pre-commit-config.yaml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/launch.json +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/settings.json +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/.vscode/spellright.dict +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/CONTRIBUTING.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/IPYTHON_LICENSE +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/LICENSE +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/README.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/cliff.toml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/changelog.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/contributing.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/index.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/about/license.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/index.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/javascripts/extra.js +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/caller.ipynb +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/concurrency.ipynb +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/notebooks/custom_kernel.ipynb +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/overrides/main.html +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/caller.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/comm.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/command.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/common.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/debugger.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/event_loop.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/index.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/interface.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/ipshell.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/kernel.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/kernelspec.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/pending.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/shell.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/typing.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/reference/utils.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/stylesheets/extra.css +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/thread_safety.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/usage/commands.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/docs/usage/index.md +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/mkdocs.yml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/pyproject.toml +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/__init__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/__main__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/caller.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/comm.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/common.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compat/attr_docs.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compat/json.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/compiler.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/debugger.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/__init__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/asyncio_guest.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/qt_host.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/run.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/event_loop/tk_host.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/__init__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/base.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/callable.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/interface/zmq.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/pending.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/py.typed +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-32x32.png +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-64x64.png +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/resources/logo-svg.svg +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/shell/__init__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/src/async_kernel/typing.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/__init__.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/conftest.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/references.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_base_interface.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_caller.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_comm.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_common.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_compat.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_debugger.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_debugger_static.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_enter_kernel.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_event_loop.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_iostream.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_pending.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_subclass.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_typing.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/test_zmq_messaging.py +0 -0
- {async_kernel-0.19.0 → async_kernel-0.19.2}/tests/utils.py +0 -0
- {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@
|
|
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@
|
|
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@
|
|
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@
|
|
102
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
103
103
|
with:
|
|
104
104
|
version-file: "pyproject.toml"
|
|
105
105
|
|
|
@@ -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@
|
|
30
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
31
31
|
with:
|
|
32
32
|
version-file: "pyproject.toml"
|
|
33
33
|
|
|
@@ -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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 19,
|
|
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(
|
|
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
|
|
24
|
+
def to_flags_and_settings(args: list[str]) -> tuple[list[str], dict[str, Any]]:
|
|
25
25
|
"""
|
|
26
|
-
Convert `argvs` to
|
|
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
|
|
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
|
-
|
|
67
|
-
|
|
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 =
|
|
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
|
-
|
|
160
|
-
"A set
|
|
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
|
|
325
|
+
def do_interrupt(self) -> None:
|
|
323
326
|
"""
|
|
324
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
self.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
633
|
+
return await self.shell.do_complete(code=code, cursor_pos=cursor_pos)
|
|
628
634
|
|
|
629
|
-
async def do_inspect(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
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
|
|
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
|
|
211
|
-
|
|
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
|
|
215
|
-
""
|
|
229
|
+
async def do_complete(self, code: str, cursor_pos: int | None = None) -> Content:
|
|
230
|
+
""
|
|
216
231
|
raise NotImplementedError
|
|
217
232
|
|
|
218
|
-
async def
|
|
219
|
-
""
|
|
233
|
+
async def is_complete(self, code: str) -> Content:
|
|
234
|
+
""
|
|
220
235
|
raise NotImplementedError
|
|
221
236
|
|
|
222
|
-
async def
|
|
223
|
-
""
|
|
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
|
|
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
|
-
""
|
|
255
|
+
""
|
|
241
256
|
raise NotImplementedError
|