Skip to content

Commit

Permalink
Support Python 3.14 and remove event loop's support for child watchers
Browse files Browse the repository at this point in the history
  • Loading branch information
rmartin16 committed Aug 7, 2024
1 parent 9dbc5d2 commit 4d352ae
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 19 deletions.
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

0 comments on commit 4d352ae

Please sign in to comment.