Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Python 3.14 and remove event loop's support for child watchers #498

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ jobs:
# M1 runners
"macos-14"
]
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12", "3.13-dev" ]
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12", "3.13-dev", "3.14-dev" ]
include:
- experimental: false
- python-version: "3.13-dev"
experimental: true
- python-version: "3.14-dev"
experimental: true

exclude:
# actions/setup-python doesn't provide Python3.8 or 3.9 for M1.
Expand Down
1 change: 1 addition & 0 deletions changes/498.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support for Python 3.14 was added.
1 change: 1 addition & 0 deletions changes/498.removal.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
For Python 3.14 and beyond, the event loop's support for child watchers was removed.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ classifiers = [
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3 :: Only",
"Topic :: Software Development",
]
Expand Down
4 changes: 2 additions & 2 deletions src/rubicon/objc/ctypes_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
# This module relies on the layout of a few internal Python and ctypes
# structures. Because of this, it's possible (but not all that likely) that
# things will break on newer/older Python versions.
if sys.version_info < (3, 6) or sys.version_info >= (3, 14):
if sys.version_info < (3, 6) or sys.version_info >= (3, 15):
v = sys.version_info
warnings.warn(
"rubicon.objc.ctypes_patch has only been tested with Python 3.6 through 3.13. "
"rubicon.objc.ctypes_patch has only been tested with Python 3.6 through 3.14. "
f"You are using Python {v.major}.{v.minor}.{v.micro}. Most likely things will "
"work properly, but you may experience crashes if Python's internals have "
"changed significantly."
Expand Down
38 changes: 24 additions & 14 deletions src/rubicon/objc/eventloop.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"""PEP 3156 event loop based on CoreFoundation."""

import contextvars
import sys
import threading
from asyncio import (
DefaultEventLoopPolicy,
SafeChildWatcher,
coroutines,
events,
tasks,
Expand All @@ -16,6 +16,9 @@
from .runtime import load_library, objc_id
from .types import CFIndex

if sys.version_info < (3, 14):
from asyncio import SafeChildWatcher

__all__ = [
"EventLoopPolicy",
"CocoaLifecycle",
Expand Down Expand Up @@ -702,23 +705,30 @@ def _init_watcher(self):
if threading.current_thread() == threading.main_thread():
self._watcher.attach_loop(self._default_loop)

def get_child_watcher(self):
"""Get the watcher for child processes.
if sys.version_info < (3, 14):

If not yet set, a :class:`~asyncio.SafeChildWatcher` object is
automatically created.
"""
if self._watcher is None:
self._init_watcher()
def get_child_watcher(self):
"""Get the watcher for child processes.

If not yet set, a :class:`~asyncio.SafeChildWatcher` object is
automatically created.

REMOVED: Child watcher support was obsoleted in Python 3.14.
"""
if self._watcher is None:
self._init_watcher()

return self._watcher

return self._watcher
def set_child_watcher(self, watcher):
"""Set the watcher for child processes.

def set_child_watcher(self, watcher):
"""Set the watcher for child processes."""
if self._watcher is not None:
self._watcher.close()
REMOVED: Child watcher support was obsoleted in Python 3.14.
"""
if self._watcher is not None:
self._watcher.close()

self._watcher = watcher
self._watcher = watcher


class CFLifecycle:
Expand Down
4 changes: 2 additions & 2 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ extend-ignore =
E203,

[tox]
envlist = towncrier-check,pre-commit,docs{,-lint,-all},py{38,39,310,311,312,313}
envlist = towncrier-check,pre-commit,docs{,-lint,-all},py{38,39,310,311,312,313,314}
skip_missing_interpreters = true

[testenv:pre-commit]
Expand All @@ -21,7 +21,7 @@ wheel_build_env = .pkg
extras = dev
commands = pre-commit run --all-files --show-diff-on-failure --color=always

[testenv:py{,38,39,310,311,312,313}]
[testenv:py{,38,39,310,311,312,313,314}]
package = wheel
wheel_build_env = .pkg
depends = pre-commit
Expand Down
Loading