Skip to content

Commit

Permalink
Merge pull request #1132 from Meallia/py313-logging-lock
Browse files Browse the repository at this point in the history
Add python 3.13 support
  • Loading branch information
nolar authored Nov 18, 2024
2 parents de8493d + 1b9f760 commit 6b8ce27
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 9 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.12"
python-version: "3.13"
- run: pip install -r requirements.txt
- run: pre-commit run --all-files
- run: mypy kopf --strict
Expand All @@ -38,10 +38,10 @@ jobs:
fail-fast: false
matrix:
install-extras: [ "", "full-auth" ]
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12", "3.13" ]
include:
- install-extras: "uvloop"
python-version: "3.12"
python-version: "3.13"
name: Python ${{ matrix.python-version }} ${{ matrix.install-extras }}
runs-on: ubuntu-22.04
timeout-minutes: 5 # usually 2-3 mins
Expand Down
12 changes: 7 additions & 5 deletions kopf/_core/engines/posting.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,13 @@ class K8sPoster(logging.Handler):
"""
A handler to post all log messages as K8s events.
"""

def createLock(self) -> None:
# Save some time on unneeded locks. Events are posted in the background.
# We only put events to the queue, which is already lock-protected.
self.lock = None
if sys.version_info[:2] < (3, 13):
# Disable this optimisation for Python >= 3.13.
# The `handle` no longer support having `None` as lock.
def createLock(self) -> None:
# Save some time on unneeded locks. Events are posted in the background.
# We only put events to the queue, which is already lock-protected.
self.lock = None

def filter(self, record: logging.LogRecord) -> bool:
# Only those which have a k8s object referred (see: `ObjectLogger`).
Expand Down
1 change: 1 addition & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[pytest]
asyncio_mode = auto
asyncio_default_fixture_loop_scope = function
addopts =
--strict-markers
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
'Programming Language :: Python :: 3.13',
'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
Expand Down
7 changes: 6 additions & 1 deletion tests/peering/test_keepalive.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from itertools import chain, repeat
from unittest import mock

import pytest

from kopf._core.engines.peering import keepalive
Expand All @@ -11,7 +14,9 @@ async def test_background_task_runs(mocker, settings, namespaced_peering_resourc
touch_mock = mocker.patch('kopf._core.engines.peering.touch')

sleep_mock = mocker.patch('asyncio.sleep')
sleep_mock.side_effect = [None, None, StopInfiniteCycleException]
# restore the default behavior after exhausting test values.
# pytest-aiohttp calls asyncio.sleep during teardown, before the mock is removed.
sleep_mock.side_effect = chain([None, None, StopInfiniteCycleException], repeat(mock.DEFAULT))

randint_mock = mocker.patch('random.randint')
randint_mock.side_effect = [7, 5, 9]
Expand Down

0 comments on commit 6b8ce27

Please sign in to comment.