Add patches for Python 3.13 support
This commit is contained in:
parent
eca5339c25
commit
970ae4bf35
3 changed files with 126 additions and 0 deletions
|
@ -0,0 +1,78 @@
|
||||||
|
From 7defd4e239cd4fe1749b74487bf5b52328e2c23e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Roman Inflianskas <rominf@pm.me>
|
||||||
|
Date: Thu, 4 Jul 2024 22:34:14 +0300
|
||||||
|
Subject: [PATCH] fix(tests): Fix exception on copying `frame.f_locals` (Python
|
||||||
|
3.13)
|
||||||
|
|
||||||
|
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
|
||||||
|
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
|
||||||
|
3.13 and later, it should be copied using a method `.copy()`. The new way
|
||||||
|
of copying works the same as the old one for versions of Python prior to
|
||||||
|
3.13, according to the documentation (both copying methods produce a
|
||||||
|
shallow copy).
|
||||||
|
|
||||||
|
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
|
||||||
|
non-`str` keys; this is a CPython implementation detail. Disable
|
||||||
|
`test_non_string_variables` test on Python 3.13.
|
||||||
|
|
||||||
|
See:
|
||||||
|
https://peps.python.org/pep-0667/
|
||||||
|
https://github.com/python/cpython/issues/118921
|
||||||
|
https://github.com/python/cpython/pull/118923
|
||||||
|
https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13
|
||||||
|
https://docs.python.org/3/library/copy.html
|
||||||
|
https://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
|
||||||
|
---
|
||||||
|
sentry_sdk/utils.py | 3 +--
|
||||||
|
tests/test_client.py | 7 +++++++
|
||||||
|
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py
|
||||||
|
index a84f2eb3..64bbd383 100644
|
||||||
|
--- a/sentry_sdk/utils.py
|
||||||
|
+++ b/sentry_sdk/utils.py
|
||||||
|
@@ -11,7 +11,6 @@ import sys
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
from collections import namedtuple
|
||||||
|
-from copy import copy
|
||||||
|
from datetime import datetime
|
||||||
|
from decimal import Decimal
|
||||||
|
from functools import partial, partialmethod, wraps
|
||||||
|
@@ -618,7 +617,7 @@ def serialize_frame(
|
||||||
|
)
|
||||||
|
|
||||||
|
if include_local_variables:
|
||||||
|
- rv["vars"] = copy(frame.f_locals)
|
||||||
|
+ rv["vars"] = frame.f_locals.copy()
|
||||||
|
|
||||||
|
return rv
|
||||||
|
|
||||||
|
diff --git a/tests/test_client.py b/tests/test_client.py
|
||||||
|
index 0464f32b..447359a1 100644
|
||||||
|
--- a/tests/test_client.py
|
||||||
|
+++ b/tests/test_client.py
|
||||||
|
@@ -31,6 +31,12 @@ if TYPE_CHECKING:
|
||||||
|
from sentry_sdk._types import Event
|
||||||
|
|
||||||
|
|
||||||
|
+maximum_python_312 = pytest.mark.skipif(
|
||||||
|
+ sys.version_info > (3, 12),
|
||||||
|
+ reason="Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have non-`str` keys; this is a CPython implementation detail: https://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148",
|
||||||
|
+)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
class EnvelopeCapturedError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@@ -879,6 +885,7 @@ def test_errno_errors(sentry_init, capture_events):
|
||||||
|
assert exception["mechanism"]["meta"]["errno"]["number"] == 69
|
||||||
|
|
||||||
|
|
||||||
|
+@maximum_python_312
|
||||||
|
def test_non_string_variables(sentry_init, capture_events):
|
||||||
|
"""There is some extremely terrible code in the wild that
|
||||||
|
inserts non-strings as variable names into `locals()`."""
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
From a87d055571b0ae496b60d4e833f64b925e5f9563 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Roman Inflianskas <rominf@pm.me>
|
||||||
|
Date: Fri, 5 Jul 2024 16:38:32 +0300
|
||||||
|
Subject: [PATCH] fix(utils): Handle `partialmethod` in qualname_from_function
|
||||||
|
(CPython 3.13)
|
||||||
|
|
||||||
|
`_partialmethod` attribute of methods wrapped with `partialmethod()` was
|
||||||
|
renamed to `__partialmethod__` in CPython 3.13:
|
||||||
|
https://github.com/python/cpython/pull/16600
|
||||||
|
---
|
||||||
|
sentry_sdk/utils.py | 14 ++++++++------
|
||||||
|
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py
|
||||||
|
index 64bbd383..262f4f97 100644
|
||||||
|
--- a/sentry_sdk/utils.py
|
||||||
|
+++ b/sentry_sdk/utils.py
|
||||||
|
@@ -1329,14 +1329,16 @@ def qualname_from_function(func):
|
||||||
|
|
||||||
|
prefix, suffix = "", ""
|
||||||
|
|
||||||
|
- if hasattr(func, "_partialmethod") and isinstance(
|
||||||
|
- func._partialmethod, partialmethod
|
||||||
|
- ):
|
||||||
|
- prefix, suffix = "partialmethod(<function ", ">)"
|
||||||
|
- func = func._partialmethod.func
|
||||||
|
- elif isinstance(func, partial) and hasattr(func.func, "__name__"):
|
||||||
|
+ if isinstance(func, partial) and hasattr(func.func, "__name__"):
|
||||||
|
prefix, suffix = "partial(<function ", ">)"
|
||||||
|
func = func.func
|
||||||
|
+ else:
|
||||||
|
+ # _partialmethod attribute of methods wrapped with partialmethod() was renamed to __partialmethod__ in CPython 3.13:
|
||||||
|
+ # https://github.com/python/cpython/pull/16600
|
||||||
|
+ partial_method = getattr(func, "_partialmethod", None) or getattr(func, "__partialmethod__", None)
|
||||||
|
+ if isinstance(partial_method, partialmethod):
|
||||||
|
+ prefix, suffix = "partialmethod(<function ", ">)"
|
||||||
|
+ func = partial_method.func
|
||||||
|
|
||||||
|
if hasattr(func, "__qualname__"):
|
||||||
|
func_qualname = func.__qualname__
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
|
@ -61,6 +61,11 @@ Patch0: 0001-Reorder-forked-tests.patch
|
||||||
# Tests fail because they are expected to be executed in a clean environment.
|
# Tests fail because they are expected to be executed in a clean environment.
|
||||||
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3240
|
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3240
|
||||||
Patch1: 0002-ref-tests-Unhardcode-integration-list.patch
|
Patch1: 0002-ref-tests-Unhardcode-integration-list.patch
|
||||||
|
# Patches for Python 3.13 support
|
||||||
|
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3271
|
||||||
|
Patch2: 0003-fix-tests-Fix-exception-on-copying-frame.f_locals-Py.patch
|
||||||
|
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3272
|
||||||
|
Patch3: 0004-fix-utils-Handle-partialmethod-in-qualname_from_func.patch
|
||||||
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
BuildRequires: python3-devel
|
BuildRequires: python3-devel
|
||||||
|
|
Loading…
Add table
Reference in a new issue