From 1d7e170c902aa0ad5e7ea34eeb55a09ffb9eb4fd Mon Sep 17 00:00:00 2001 From: David Brochart Date: Tue, 28 Jul 2026 15:48:32 +0200 Subject: [PATCH 1/2] Fix traceback --- src/akernel/code.py | 4 ++-- src/akernel/execution.py | 2 +- src/akernel/kernel.py | 5 ++++- src/akernel/traceback.py | 38 +++++++++++++++++++++++--------------- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/akernel/code.py b/src/akernel/code.py index 7831682..40a76a8 100644 --- a/src/akernel/code.py +++ b/src/akernel/code.py @@ -149,10 +149,10 @@ def get_async_code(self) -> str: gtree = self.get_async_ast() return ast.unparse(gtree) - def get_async_bytecode(self) -> CodeType: + def get_async_bytecode(self, task_i: int) -> CodeType: tree = self.get_async_ast() #tree = gast.gast_to_ast(gtree) - bytecode = compile(tree, filename="", mode="exec") + bytecode = compile(tree, filename=f"", mode="exec") return bytecode def make_react(self): diff --git a/src/akernel/execution.py b/src/akernel/execution.py index 17c704f..a2618d4 100644 --- a/src/akernel/execution.py +++ b/src/akernel/execution.py @@ -25,7 +25,7 @@ def pre_execute( try: transform = Transform(code, task_i, react) - async_bytecode = transform.get_async_bytecode() + async_bytecode = transform.get_async_bytecode(task_i) exec(async_bytecode, globals_, locals_) except SyntaxError as e: exception = e diff --git a/src/akernel/kernel.py b/src/akernel/kernel.py index 6be41bd..3c2f09a 100644 --- a/src/akernel/kernel.py +++ b/src/akernel/kernel.py @@ -39,6 +39,7 @@ class Kernel: kernel_mode: str cell_done: Dict[int, Event] running_cells: Dict[int, asyncio.Task] + _source_map: Dict[str, str] task_i: int execution_count: int execution_state: str @@ -85,6 +86,7 @@ def __init__( self.globals = {} self.locals = {} self._chain_execution = not self.concurrent_kernel + self._source_map = {} self.cell_done = {} self.running_cells = {} self.task_i = 0 @@ -374,13 +376,14 @@ async def execute_and_finish( parent_header = parent["header"] traceback, exception = [], None namespace = self.get_namespace(parent_header) + self._source_map[f""] = code try: result = await self.locals[namespace][f"__async_cell{task_i}__"]() except KeyboardInterrupt: self.interrupt() except Exception as e: exception = e - traceback = get_traceback(code, e, execution_count) + traceback = get_traceback(code, e, execution_count, self._source_map) else: await self.show_result(result, self.globals[namespace], parent_header) cache_execution(self.cache, cache_info, self.globals[namespace], result) diff --git a/src/akernel/traceback.py b/src/akernel/traceback.py index 74d43de..c136830 100644 --- a/src/akernel/traceback.py +++ b/src/akernel/traceback.py @@ -2,12 +2,12 @@ import sys import types -from typing import cast +from typing import Dict, Optional, cast from colorama import Fore, Style # type: ignore -def get_traceback(code: str, exception, execution_count: int = 0): +def get_traceback(code: str, exception, execution_count: int = 0, source_map: Optional[Dict[str, str]] = None): exc_info = sys.exc_info() tb = cast(types.TracebackType, exc_info[2]) while True: @@ -26,22 +26,30 @@ def get_traceback(code: str, exception, execution_count: int = 0): traceback = ["Traceback (most recent call last):"] for frame in stack: filename = frame.f_code.co_filename - if filename == "": - filename = f"{Fore.CYAN}Cell{Style.RESET_ALL} {Fore.GREEN}{execution_count}" - f"{Style.RESET_ALL}" + if filename.startswith(" Date: Tue, 28 Jul 2026 17:46:43 +0200 Subject: [PATCH 2/2] Require python >=3.10 --- .github/workflows/main.yml | 2 +- pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b453036..62dc955 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] + python-version: [ '3.10', '3.10', '3.11', '3.12', '3.13', '3.14' ] steps: - name: Checkout diff --git a/pyproject.toml b/pyproject.toml index 08437e6..06ae9bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,16 +8,16 @@ version = "0.3.4" description = "An asynchronous Python Jupyter kernel" readme = "README.md" license = {text = "MIT"} -requires-python = ">=3.9" +requires-python = ">=3.10" authors = [{name = "David Brochart", email = "david.brochart@gmail.com"}] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ]