Skip to content

Commit

Permalink
python3-ipython_ipykernel: patch for python 3.13
Browse files Browse the repository at this point in the history
  • Loading branch information
tornaria authored and classabbyamp committed Dec 24, 2024
1 parent 6d7244d commit 993adda
Show file tree
Hide file tree
Showing 4 changed files with 299 additions and 2 deletions.
42 changes: 42 additions & 0 deletions srcpkgs/python3-ipython_ipykernel/patches/1248.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
Taken from https://github.com/ipython/ipykernel/pull/1248

From 3e7fb7c787511212ccb642004b4331a59594a329 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <[email protected]>
Date: Mon, 10 Jun 2024 16:11:33 +0200
Subject: [PATCH] Avoid a DeprecationWarning on Python 3.13+

...
/usr/lib/python3.13/site-packages/ipykernel/jsonutil.py:29: in <module>
datetime.strptime("1", "%d")
/usr/lib64/python3.13/_strptime.py:573: in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
/usr/lib64/python3.13/_strptime.py:336: in _strptime
format_regex = _TimeRE_cache.compile(format)
/usr/lib64/python3.13/_strptime.py:282: in compile
return re_compile(self.pattern(format), IGNORECASE)
/usr/lib64/python3.13/_strptime.py:270: in pattern
warnings.warn("""\
E DeprecationWarning: Parsing dates involving a day of month without a year specified is ambiguious
E and fails to parse leap day. The default behavior will change in Python 3.15
E to either always raise an exception or to use a different default year (TBD).
E To avoid trouble, add a specific year to the input & format.
E See https://github.com/python/cpython/issues/70647.

See also https://github.com/jupyter/jupyter_client/issues/1020
---
ipykernel/jsonutil.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ipykernel/jsonutil.py b/ipykernel/jsonutil.py
index 6a463cf1..e45f06e5 100644
--- a/ipykernel/jsonutil.py
+++ b/ipykernel/jsonutil.py
@@ -26,7 +26,7 @@

# holy crap, strptime is not threadsafe.
# Calling it once at import seems to help.
-datetime.strptime("1", "%d")
+datetime.strptime("2000-01-01", "%Y-%m-%d")

# -----------------------------------------------------------------------------
# Classes and functions
238 changes: 238 additions & 0 deletions srcpkgs/python3-ipython_ipykernel/patches/1277.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
Backported to 6.29.5 from https://github.com/ipython/ipykernel/pull/1277
See https://github.com/ipython/ipykernel/issues/1302

diff --git a/docs/conf.py b/docs/conf.py
index 4bb59932..38a724b5 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -13,7 +13,7 @@
import os
import shutil
from pathlib import Path
-from typing import Any, Dict, List
+from typing import Any

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -70,7 +70,7 @@
# built documents.
#

-version_ns: Dict[str, Any] = {}
+version_ns: dict[str, Any] = {}
here = Path(__file__).parent.resolve()
version_py = Path(here) / os.pardir / "ipykernel" / "_version.py"
with open(version_py) as f:
@@ -159,7 +159,7 @@
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path: List[str] = []
+html_static_path: list[str] = []

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
@@ -226,7 +226,7 @@

# -- Options for LaTeX output ---------------------------------------------

-latex_elements: Dict[str, object] = {}
+latex_elements: dict[str, object] = {}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
diff --git a/ipykernel/_version.py b/ipykernel/_version.py
index d9a9f534..5907d150 100644
--- a/ipykernel/_version.py
+++ b/ipykernel/_version.py
@@ -2,7 +2,6 @@
store the current version info of the server.
"""
import re
-from typing import List

# Version string must appear intact for hatch versioning
__version__ = "7.0.0a0"
@@ -11,7 +10,7 @@
pattern = r"(?P<major>\d+).(?P<minor>\d+).(?P<patch>\d+)(?P<rest>.*)"
match = re.match(pattern, __version__)
assert match is not None
-parts: List[object] = [int(match[part]) for part in ["major", "minor", "patch"]]
+parts: list[object] = [int(match[part]) for part in ["major", "minor", "patch"]]
if match["rest"]:
parts.append(match["rest"])
version_info = tuple(parts)
diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py
index 8680793f..780d1801 100644
--- a/ipykernel/debugger.py
+++ b/ipykernel/debugger.py
@@ -130,7 +130,7 @@ def _reset_tcp_pos(self):

def _put_message(self, raw_msg):
self.log.debug("QUEUE - _put_message:")
- msg = t.cast(t.Dict[str, t.Any], jsonapi.loads(raw_msg))
+ msg = t.cast(dict[str, t.Any], jsonapi.loads(raw_msg))
if msg["type"] == "event":
self.log.debug("QUEUE - received event:")
self.log.debug(msg)
diff --git a/ipykernel/inprocess/channels.py b/ipykernel/inprocess/channels.py
index 378416dc..4c01c5bc 100644
--- a/ipykernel/inprocess/channels.py
+++ b/ipykernel/inprocess/channels.py
@@ -3,8 +3,6 @@
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.

-from typing import List
-
from jupyter_client.channelsabc import HBChannelABC

# -----------------------------------------------------------------------------
@@ -15,7 +13,7 @@
class InProcessChannel:
"""Base class for in-process channels."""

- proxy_methods: List[object] = []
+ proxy_methods: list[object] = []

def __init__(self, client=None):
"""Initialize the channel."""
diff --git a/ipykernel/iostream.py b/ipykernel/iostream.py
index beca44b1..81170b97 100644
--- a/ipykernel/iostream.py
+++ b/ipykernel/iostream.py
@@ -15,7 +15,7 @@
from collections import defaultdict, deque
from io import StringIO, TextIOBase
from threading import local
-from typing import Any, Callable, Deque, Dict, Optional
+from typing import Any, Callable, Optional

import zmq
from jupyter_client.session import extract_header
@@ -94,8 +94,8 @@ def __init__(self, socket, pipe=False):
if pipe:
self._setup_pipe_in()
self._local = threading.local()
- self._events: Deque[Callable[..., Any]] = deque()
- self._event_pipes: Dict[threading.Thread, Any] = {}
+ self._events: deque[Callable[..., Any]] = deque()
+ self._event_pipes: dict[threading.Thread, Any] = {}
self._event_pipe_gc_lock: threading.Lock = threading.Lock()
self._event_pipe_gc_seconds: float = 10
self._setup_event_pipe()
@@ -470,7 +470,7 @@ def __init__(
self.pub_thread = pub_thread
self.name = name
self.topic = b"stream." + name.encode()
- self._parent_header: contextvars.ContextVar[Dict[str, Any]] = contextvars.ContextVar(
+ self._parent_header: contextvars.ContextVar[dict[str, Any]] = contextvars.ContextVar(
"parent_header"
)
self._parent_header.set({})
diff --git a/ipykernel/ipkernel.py b/ipykernel/ipkernel.py
index db83d986..48efa6cd 100644
--- a/ipykernel/ipkernel.py
+++ b/ipykernel/ipkernel.py
@@ -1,5 +1,7 @@
"""The IPython kernel implementation"""

+from __future__ import annotations
+
import asyncio
import builtins
import gc
@@ -16,7 +18,7 @@
from IPython.core import release
from IPython.utils.tokenutil import line_at_cursor, token_at_cursor
from jupyter_client.session import extract_header
-from traitlets import Any, Bool, HasTraits, Instance, List, Type, observe, observe_compat
+from traitlets import Any, Bool, HasTraits, Instance, List, Type, default, observe, observe_compat
from zmq.eventloop.zmqstream import ZMQStream

from .comm.comm import BaseComm
@@ -46,7 +48,7 @@ def _create_comm(*args, **kwargs):

# there can only be one comm manager in a ipykernel process
_comm_lock = threading.Lock()
-_comm_manager: t.Optional[CommManager] = None
+_comm_manager: CommManager | None = None


def _get_comm_manager(*args, **kwargs):
@@ -84,7 +86,11 @@ def _user_module_changed(self, change):
if self.shell is not None:
self.shell.user_module = change["new"]

- user_ns = Instance(dict, args=None, allow_none=True)
+ user_ns = Instance("collections.abc.Mapping", allow_none=True)
+
+ @default("user_ns")
+ def _default_user_ns(self):
+ return dict()

@observe("user_ns")
@observe_compat
@@ -353,7 +359,7 @@ async def do_execute(

self._forward_input(allow_stdin)

- reply_content: t.Dict[str, t.Any] = {}
+ reply_content: dict[str, t.Any] = {}
if hasattr(shell, "run_cell_async") and hasattr(shell, "should_run_async"):
run_cell = shell.run_cell_async
should_run_async = shell.should_run_async
@@ -559,7 +565,7 @@ def do_inspect(self, code, cursor_pos, detail_level=0, omit_sections=()):
"""Handle code inspection."""
name = token_at_cursor(code, cursor_pos)

- reply_content: t.Dict[str, t.Any] = {"status": "ok"}
+ reply_content: dict[str, t.Any] = {"status": "ok"}
reply_content["data"] = {}
reply_content["metadata"] = {}
assert self.shell is not None
@@ -755,7 +761,7 @@ def init_closure(self: threading.Thread, *args, **kwargs):
threading.Thread.run = run_closure # type:ignore[method-assign]

def _clean_thread_parent_frames(
- self, phase: t.Literal["start", "stop"], info: t.Dict[str, t.Any]
+ self, phase: t.Literal["start", "stop"], info: dict[str, t.Any]
):
"""Clean parent frames of threads which are no longer running.
This is meant to be invoked by garbage collector callback hook.
diff --git a/ipykernel/pickleutil.py b/ipykernel/pickleutil.py
index 6f156594..4ffa5262 100644
--- a/ipykernel/pickleutil.py
+++ b/ipykernel/pickleutil.py
@@ -209,7 +209,7 @@ def __init__(self, f):
"""Initialize the can"""
self._check_type(f)
self.code = f.__code__
- self.defaults: typing.Optional[typing.List[typing.Any]]
+ self.defaults: typing.Optional[list[typing.Any]]
if f.__defaults__:
self.defaults = [can(fd) for fd in f.__defaults__]
else:
@@ -475,7 +475,7 @@ def uncan_sequence(obj, g=None):
if buffer is not memoryview:
can_map[buffer] = CannedBuffer

-uncan_map: typing.Dict[type, typing.Any] = {
+uncan_map: dict[type, typing.Any] = {
CannedObject: lambda obj, g: obj.get_object(g),
dict: uncan_dict,
}
diff --git a/pyproject.toml b/pyproject.toml
index 1e9e543c..e1d7b1d5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -187,6 +187,9 @@ filterwarnings= [

# Ignore datetime warning.
"ignore:datetime.datetime.utc:DeprecationWarning",
+
+ # ignore unclosed sqlite in traits
+ "ignore:unclosed database in <sqlite3.Connection:ResourceWarning",
]

[tool.coverage.report]
15 changes: 15 additions & 0 deletions srcpkgs/python3-ipython_ipykernel/patches/disable-debugpy.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Upstream acks that ipykernel works without debugpy, but wants to keep
it as a mandatory dependency, see:

https://github.com/ipython/ipykernel/pull/767#issuecomment-916913893

--- a/pyproject.toml 2020-02-01 21:00:00.000000000 -0300
+++ b/pyproject.toml 2024-12-23 10:53:39.607541653 -0300
@@ -20,7 +20,6 @@
]
requires-python = ">=3.8"
dependencies = [
- "debugpy>=1.6.5",
"ipython>=7.23.1",
"comm>=0.1.1",
"traitlets>=5.4.0",
6 changes: 4 additions & 2 deletions srcpkgs/python3-ipython_ipykernel/template
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
# Template file for 'python3-ipython_ipykernel'
pkgname=python3-ipython_ipykernel
version=6.29.5
revision=2
revision=3
build_style=python3-pep517
# run all tests available
make_check_target="tests"
hostmakedepends="hatchling python3-jupyter_client"
depends="python3-comm python3-ipython python3-jupyter_client
python3-nest_asyncio python3-packaging python3-psutil python3-tornado"
python3-jupyter_core python3-matplotlib-inline python3-nest_asyncio
python3-packaging python3-psutil python3-pyzmq python3-tornado
python3-traitlets"
checkdepends="$depends python3-flaky python3-pytest-asyncio
python3-pytest-timeout python3-trio python3-curio python3-matplotlib
python3-PyQt5 python3-PyQt5-svg python3-pytest-xdist"
Expand Down

0 comments on commit 993adda

Please sign in to comment.