Compare commits
1 Commits
Author | SHA256 | Date | |
---|---|---|---|
223ea34110 |
BIN
1.16.0.tar.gz
(Stored with Git LFS)
BIN
1.16.0.tar.gz
(Stored with Git LFS)
Binary file not shown.
BIN
1.17.2.tar.gz
(Stored with Git LFS)
Normal file
BIN
1.17.2.tar.gz
(Stored with Git LFS)
Normal file
Binary file not shown.
@@ -1,262 +0,0 @@
|
||||
From 9a38c9f45a2e9d2a306deedce2e243b5e7a83ab2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||
Date: Fri, 8 Mar 2024 00:40:11 +0100
|
||||
Subject: [PATCH] Fix classmethod tests with Python 3.13+
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Fixes https://github.com/GrahamDumpleton/wrapt/issues/259
|
||||
|
||||
The failures were:
|
||||
|
||||
=================================== FAILURES ===================================
|
||||
_____________ TestCallingOuterClassMethod.test_class_call_function _____________
|
||||
|
||||
self = <test_outer_classmethod.TestCallingOuterClassMethod testMethod=test_class_call_function>
|
||||
|
||||
def test_class_call_function(self):
|
||||
# Test calling classmethod. Prior to Python 3.9, the instance
|
||||
# and class passed to the wrapper will both be None because our
|
||||
# decorator is surrounded by the classmethod decorator. The
|
||||
# classmethod decorator doesn't bind the method and treats it
|
||||
# like a normal function, explicitly passing the class as the
|
||||
# first argument with the actual arguments following that. This
|
||||
# was only finally fixed in Python 3.9. For more details see:
|
||||
# https://bugs.python.org/issue19072
|
||||
|
||||
_args = (1, 2)
|
||||
_kwargs = {'one': 1, 'two': 2}
|
||||
|
||||
@wrapt.decorator
|
||||
def _decorator(wrapped, instance, args, kwargs):
|
||||
if PYXY < (3, 9):
|
||||
self.assertEqual(instance, None)
|
||||
self.assertEqual(args, (Class,)+_args)
|
||||
else:
|
||||
self.assertEqual(instance, Class)
|
||||
self.assertEqual(args, _args)
|
||||
|
||||
self.assertEqual(kwargs, _kwargs)
|
||||
self.assertEqual(wrapped.__module__, _function.__module__)
|
||||
self.assertEqual(wrapped.__name__, _function.__name__)
|
||||
|
||||
return wrapped(*args, **kwargs)
|
||||
|
||||
@_decorator
|
||||
def _function(*args, **kwargs):
|
||||
return args, kwargs
|
||||
|
||||
class Class(object):
|
||||
@classmethod
|
||||
@_decorator
|
||||
def _function(cls, *args, **kwargs):
|
||||
return (args, kwargs)
|
||||
|
||||
> result = Class._function(*_args, **_kwargs)
|
||||
|
||||
tests/test_outer_classmethod.py:160:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/test_outer_classmethod.py:141: in _decorator
|
||||
self.assertEqual(instance, Class)
|
||||
E AssertionError: None != <class 'test_outer_classmethod.TestCallin[54 chars]ass'>
|
||||
___________ TestCallingOuterClassMethod.test_instance_call_function ____________
|
||||
|
||||
self = <test_outer_classmethod.TestCallingOuterClassMethod testMethod=test_instance_call_function>
|
||||
|
||||
def test_instance_call_function(self):
|
||||
# Test calling classmethod via class instance. Prior to Python
|
||||
# 3.9, the instance and class passed to the wrapper will both be
|
||||
# None because our decorator is surrounded by the classmethod
|
||||
# decorator. The classmethod decorator doesn't bind the method
|
||||
# and treats it like a normal function, explicitly passing the
|
||||
# class as the first argument with the actual arguments
|
||||
# following that. This was only finally fixed in Python 3.9. For
|
||||
# more details see: https://bugs.python.org/issue19072
|
||||
|
||||
_args = (1, 2)
|
||||
_kwargs = {'one': 1, 'two': 2}
|
||||
|
||||
@wrapt.decorator
|
||||
def _decorator(wrapped, instance, args, kwargs):
|
||||
if PYXY < (3, 9):
|
||||
self.assertEqual(instance, None)
|
||||
self.assertEqual(args, (Class,)+_args)
|
||||
else:
|
||||
self.assertEqual(instance, Class)
|
||||
self.assertEqual(args, _args)
|
||||
|
||||
self.assertEqual(kwargs, _kwargs)
|
||||
self.assertEqual(wrapped.__module__, _function.__module__)
|
||||
self.assertEqual(wrapped.__name__, _function.__name__)
|
||||
|
||||
return wrapped(*args, **kwargs)
|
||||
|
||||
@_decorator
|
||||
def _function(*args, **kwargs):
|
||||
return args, kwargs
|
||||
|
||||
class Class(object):
|
||||
@classmethod
|
||||
@_decorator
|
||||
def _function(cls, *args, **kwargs):
|
||||
return (args, kwargs)
|
||||
|
||||
> result = Class()._function(*_args, **_kwargs)
|
||||
|
||||
tests/test_outer_classmethod.py:202:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/test_outer_classmethod.py:183: in _decorator
|
||||
self.assertEqual(instance, Class)
|
||||
E AssertionError: None != <class 'test_outer_classmethod.TestCallin[57 chars]ass'>
|
||||
_____________ TestSynchronized.test_synchronized_outer_classmethod _____________
|
||||
|
||||
self = <test_synchronized_lock.TestSynchronized testMethod=test_synchronized_outer_classmethod>
|
||||
|
||||
def test_synchronized_outer_classmethod(self):
|
||||
# Prior to Python 3.9 this isn't detected as a class method
|
||||
# call, as the classmethod decorator doesn't bind the wrapped
|
||||
# function to the class before calling and just calls it direct,
|
||||
# explicitly passing the class as first argument. For more
|
||||
# details see: https://bugs.python.org/issue19072
|
||||
|
||||
if PYXY < (3, 9):
|
||||
_lock0 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
else:
|
||||
_lock0 = getattr(C4, '_synchronized_lock', None)
|
||||
self.assertEqual(_lock0, None)
|
||||
|
||||
c4.function2()
|
||||
|
||||
if PYXY < (3, 9):
|
||||
_lock1 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
else:
|
||||
_lock1 = getattr(C4, '_synchronized_lock', None)
|
||||
> self.assertNotEqual(_lock1, None)
|
||||
E AssertionError: None == None
|
||||
|
||||
tests/test_synchronized_lock.py:181: AssertionError
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
function2
|
||||
=========================== short test summary info ============================
|
||||
FAILED tests/test_outer_classmethod.py::TestCallingOuterClassMethod::test_class_call_function
|
||||
FAILED tests/test_outer_classmethod.py::TestCallingOuterClassMethod::test_instance_call_function
|
||||
FAILED tests/test_synchronized_lock.py::TestSynchronized::test_synchronized_outer_classmethod
|
||||
======================== 3 failed, 435 passed in 0.83s =========================
|
||||
|
||||
To fix the same failures on Python 3.9,
|
||||
they were adjusted in the past. For details see
|
||||
https://github.com/GrahamDumpleton/wrapt/issues/160
|
||||
|
||||
However, Python 3.13 reverted the change from 3.9,
|
||||
so this adds an upper bound for the conditionals.
|
||||
|
||||
To make the conditionals easier to read, the if-else branches were switched.
|
||||
|
||||
Signed-off-by: Filipe Laíns <lains@riseup.net>
|
||||
---
|
||||
tests/test_outer_classmethod.py | 18 ++++++++++--------
|
||||
tests/test_synchronized_lock.py | 26 ++++++++++++++------------
|
||||
2 files changed, 24 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/tests/test_outer_classmethod.py b/tests/test_outer_classmethod.py
|
||||
index ab807646..c08d34a5 100644
|
||||
--- a/tests/test_outer_classmethod.py
|
||||
+++ b/tests/test_outer_classmethod.py
|
||||
@@ -128,18 +128,20 @@ def test_class_call_function(self):
|
||||
# first argument with the actual arguments following that. This
|
||||
# was only finally fixed in Python 3.9. For more details see:
|
||||
# https://bugs.python.org/issue19072
|
||||
+ # Starting with Python 3.13 the old behavior is back.
|
||||
+ # For more details see https://github.com/python/cpython/issues/89519
|
||||
|
||||
_args = (1, 2)
|
||||
_kwargs = {'one': 1, 'two': 2}
|
||||
|
||||
@wrapt.decorator
|
||||
def _decorator(wrapped, instance, args, kwargs):
|
||||
- if PYXY < (3, 9):
|
||||
- self.assertEqual(instance, None)
|
||||
- self.assertEqual(args, (Class,)+_args)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
self.assertEqual(instance, Class)
|
||||
self.assertEqual(args, _args)
|
||||
+ else:
|
||||
+ self.assertEqual(instance, None)
|
||||
+ self.assertEqual(args, (Class,)+_args)
|
||||
|
||||
self.assertEqual(kwargs, _kwargs)
|
||||
self.assertEqual(wrapped.__module__, _function.__module__)
|
||||
@@ -176,12 +178,12 @@ def test_instance_call_function(self):
|
||||
|
||||
@wrapt.decorator
|
||||
def _decorator(wrapped, instance, args, kwargs):
|
||||
- if PYXY < (3, 9):
|
||||
- self.assertEqual(instance, None)
|
||||
- self.assertEqual(args, (Class,)+_args)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
self.assertEqual(instance, Class)
|
||||
self.assertEqual(args, _args)
|
||||
+ else:
|
||||
+ self.assertEqual(instance, None)
|
||||
+ self.assertEqual(args, (Class,)+_args)
|
||||
|
||||
self.assertEqual(kwargs, _kwargs)
|
||||
self.assertEqual(wrapped.__module__, _function.__module__)
|
||||
diff --git a/tests/test_synchronized_lock.py b/tests/test_synchronized_lock.py
|
||||
index 0e43f7af..7c41aa5a 100644
|
||||
--- a/tests/test_synchronized_lock.py
|
||||
+++ b/tests/test_synchronized_lock.py
|
||||
@@ -165,36 +165,38 @@ def test_synchronized_outer_classmethod(self):
|
||||
# function to the class before calling and just calls it direct,
|
||||
# explicitly passing the class as first argument. For more
|
||||
# details see: https://bugs.python.org/issue19072
|
||||
+ # Starting with Python 3.13 the old behavior is back.
|
||||
+ # For more details see https://github.com/python/cpython/issues/89519
|
||||
|
||||
- if PYXY < (3, 9):
|
||||
- _lock0 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
_lock0 = getattr(C4, '_synchronized_lock', None)
|
||||
+ else:
|
||||
+ _lock0 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
self.assertEqual(_lock0, None)
|
||||
|
||||
c4.function2()
|
||||
|
||||
- if PYXY < (3, 9):
|
||||
- _lock1 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
_lock1 = getattr(C4, '_synchronized_lock', None)
|
||||
+ else:
|
||||
+ _lock1 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
self.assertNotEqual(_lock1, None)
|
||||
|
||||
C4.function2()
|
||||
|
||||
- if PYXY < (3, 9):
|
||||
- _lock2 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
_lock2 = getattr(C4, '_synchronized_lock', None)
|
||||
+ else:
|
||||
+ _lock2 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
self.assertNotEqual(_lock2, None)
|
||||
self.assertEqual(_lock2, _lock1)
|
||||
|
||||
C4.function2()
|
||||
|
||||
- if PYXY < (3, 9):
|
||||
- _lock3 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
- else:
|
||||
+ if (3, 9) <= PYXY < (3, 13):
|
||||
_lock3 = getattr(C4, '_synchronized_lock', None)
|
||||
+ else:
|
||||
+ _lock3 = getattr(C4.function2, '_synchronized_lock', None)
|
||||
self.assertNotEqual(_lock3, None)
|
||||
self.assertEqual(_lock3, _lock2)
|
||||
|
@@ -1,3 +1,37 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Feb 28 08:57:55 UTC 2025 - John Paul Adrian Glaubitz <adrian.glaubitz@suse.com>
|
||||
|
||||
- Update to 1.17.2
|
||||
* Added universal binary wheels for macOS. That is, contains
|
||||
both x86_64 and arm64 architectures in the same wheel.
|
||||
- from version 1.17.1
|
||||
* Due to GitHub actions changes, binary wheels were missing
|
||||
for macOS Intel.
|
||||
* Not implemented error for __reduce__() on ObjectProxy was
|
||||
incorrectly displaying the error as being on __reduce_ex__().
|
||||
- from version 1.17.0
|
||||
* Add __format__() method to ObjectProxy class to allow formatting
|
||||
of wrapped object.
|
||||
* Added C extension internal flag to indicate that wrapt should be
|
||||
safe for Python 3.13 free threading mode. Releases will include
|
||||
free threading variants of Python wheels. Note that as free
|
||||
threading is new, one should be cautious about using it in
|
||||
production until it has been more widely tested.
|
||||
* When a normal function or builtin function which had wrapt.decorator
|
||||
or a function wrapper applied, was assigned as a class attribute,
|
||||
and the function attribute called via the class or an instance of
|
||||
the class, an additional argument was being passed, inserted as the
|
||||
first argument, which was the class or instance. This was not the
|
||||
correct behaviour and the class or instance should not have been
|
||||
passed as the first argument.
|
||||
* When an instance of a callable class object was wrapped which didn’t
|
||||
not have a __get__() method for binding, and it was called in context
|
||||
where binding would be attempted, it would fail with error that __get__()
|
||||
did not exist when instead it should have been called directly, ignoring
|
||||
that binding was not possible.
|
||||
* The __round__ hook for the object proxy didn’t accept ndigits argument.
|
||||
- Drop py313-classmethods.patch, merged upstream
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 28 11:56:13 UTC 2024 - Dirk Müller <dmueller@suse.com>
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package python-wrapt
|
||||
#
|
||||
# Copyright (c) 2024 SUSE LLC
|
||||
# Copyright (c) 2025 SUSE LLC
|
||||
# Copyright (c) 2015 LISA GmbH, Bingen, Germany.
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
@@ -19,14 +19,13 @@
|
||||
|
||||
%{?sle15_python_module_pythons}
|
||||
Name: python-wrapt
|
||||
Version: 1.16.0
|
||||
Version: 1.17.2
|
||||
Release: 0
|
||||
Summary: A Python module for decorators, wrappers and monkey patching
|
||||
License: BSD-2-Clause
|
||||
Group: Development/Languages/Python
|
||||
URL: https://github.com/GrahamDumpleton/wrapt
|
||||
Source: https://github.com/GrahamDumpleton/wrapt/archive/%{version}.tar.gz
|
||||
Patch1: https://github.com/GrahamDumpleton/wrapt/commit/9a38c9f45a2e9d2a306deedce2e243b5e7a83ab2.patch#/py313-classmethods.patch
|
||||
BuildRequires: %{python_module devel}
|
||||
BuildRequires: %{python_module pytest}
|
||||
BuildRequires: %{python_module setuptools}
|
||||
|
Reference in New Issue
Block a user