From f506593e8972c467166bc469062d2d1021ac5830 Mon Sep 17 00:00:00 2001 From: Jonathan GAYVALLET Date: Wed, 30 Oct 2024 11:14:32 +0100 Subject: [PATCH] add python 3.13 support the logging.Handler class changed in 3.13 and will now always try to acquire the lock in its `handle` method. Removed the optimization that created the handler without a lock when running python >= 3.13. Also configure the CI to run on Python 3.13. Signed-off-by: Jonathan GAYVALLET --- .github/workflows/ci.yaml | 6 +++--- kopf/_core/engines/posting.py | 12 +++++++----- requirements.txt | 2 +- setup.py | 1 + 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0d5a5309..0e096030 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -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 @@ -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 diff --git a/kopf/_core/engines/posting.py b/kopf/_core/engines/posting.py index 3c83954d..1aaa4443 100644 --- a/kopf/_core/engines/posting.py +++ b/kopf/_core/engines/posting.py @@ -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`). diff --git a/requirements.txt b/requirements.txt index a9b0b6ad..88ee4ebe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,5 +21,5 @@ pytest-asyncio pytest-cov pytest-mock pytest-timeout -types-setuptools types-PyYAML +types-setuptools diff --git a/setup.py b/setup.py index 4beebb1c..822892a6 100644 --- a/setup.py +++ b/setup.py @@ -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',