15
0

- Add patch to work with sqlalchemy 1.3:

* sqlalchemy13.patch

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-jsonpickle?expand=0&rev=8
This commit is contained in:
Tomáš Chvátal
2019-03-19 08:20:58 +00:00
committed by Git OBS Bridge
parent 872dfbfd57
commit 3b3c66c6af
3 changed files with 97 additions and 5 deletions

View File

@@ -1,3 +1,9 @@
-------------------------------------------------------------------
Tue Mar 19 08:12:54 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>
- Add patch to work with sqlalchemy 1.3:
* sqlalchemy13.patch
-------------------------------------------------------------------
Fri Mar 15 13:00:30 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>

View File

@@ -20,14 +20,19 @@
Name: python-jsonpickle
Version: 1.1
Release: 0
Url: https://github.com/jsonpickle/jsonpickle
Summary: Python library for serializing any arbitrary object graph into JSON
License: BSD-3-Clause
Group: Development/Languages/Python
URL: https://github.com/jsonpickle/jsonpickle
Source: https://files.pythonhosted.org/packages/source/j/jsonpickle/jsonpickle-%{version}.tar.gz
Patch0: sqlalchemy13.patch
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Recommends: python-simplejson
Suggests: python-demjson
Suggests: python-ujson
Suggests: python-yajl
# SECTION test requirements
BuildRequires: %{python_module SQLAlchemy}
BuildRequires: %{python_module coverage}
@@ -38,10 +43,6 @@ BuildRequires: %{python_module pytest}
# SECTION python 2 test requirements
BuildRequires: python-enum34
# /SECTION
Recommends: python-simplejson
Suggests: python-demjson
Suggests: python-ujson
Suggests: python-yajl
# SECTION python 2 requirements
Suggests: python-feedparser
Suggests: python-jsonlib
@@ -56,6 +57,7 @@ Additionally, it can reconstitute the object back into Python.
%prep
%setup -q -n jsonpickle-%{version}
%patch0 -p1
%build
%python_build

84
sqlalchemy13.patch Normal file
View File

@@ -0,0 +1,84 @@
From 838c29e43267e3578d077698386e1adbcc0657c5 Mon Sep 17 00:00:00 2001
From: David Aguilar <davvid@gmail.com>
Date: Mon, 18 Mar 2019 22:32:54 -0700
Subject: [PATCH] unpickler: better support for sqlalchemy >= 1.3
The _safe_hasattr() workaround for older versions of SQLAlchemy
surprisingly breaks newer versions.
Be optimistic and catch the runtime error so that newer versions do not
incur the cost of the original workaround. The older versions are still
supported since they'll land in the old code path.
This is justifiable since it's a generic code path and will speed up
things for 99% of the other objects out there, including newer
sqlalchemy versions.
Closes #254
Signed-off-by: David Aguilar <davvid@gmail.com>
---
jsonpickle/unpickler.py | 11 +++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/jsonpickle/unpickler.py b/jsonpickle/unpickler.py
index f0a93d1..40af4e0 100644
--- a/jsonpickle/unpickler.py
+++ b/jsonpickle/unpickler.py
@@ -42,8 +42,15 @@ def decode(string, backend=None, context=None, keys=False, reset=True,
def _safe_hasattr(obj, attr):
- """A safe (but slow) hasattr() that avoids hasattr"""
- return attr in dir(obj)
+ """Workaround unreliable hasattr() availability on sqlalchemy objects"""
+ try:
+ # In sqlalchemy >= 1.3 we can use hasattr().
+ return hasattr(obj, attr)
+ except RuntimeError:
+ # In older versions we use a safe (but slow) method to avoid hasattr().
+ # Older versions of sqlalchemy hit maximum recursion errors during
+ # deserialization. The workaround is to avoid hasattr().
+ return attr in dir(obj)
class _Proxy(object):
From 670b678a109a7fab91e3e50fb35f65bf75aff1e9 Mon Sep 17 00:00:00 2001
From: David Aguilar <davvid@gmail.com>
Date: Tue, 19 Mar 2019 00:21:19 -0700
Subject: [PATCH] unpickler: make _safe_hasattr() even safer
Use object.__getattribute__() to implement our hasattr() workaround,
which is even more robust (and performant) than the previous solution.
The old version did work on Python2, but Python3 is unable to catch
recursion
errors so a better solution was needed.
Related-to: #254
Signed-off-by: David Aguilar <davvid@gmail.com>
---
jsonpickle/unpickler.py | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/jsonpickle/unpickler.py b/jsonpickle/unpickler.py
index 40af4e0..e1f9e75 100644
--- a/jsonpickle/unpickler.py
+++ b/jsonpickle/unpickler.py
@@ -44,13 +44,10 @@ def decode(string, backend=None, context=None, keys=False, reset=True,
def _safe_hasattr(obj, attr):
"""Workaround unreliable hasattr() availability on sqlalchemy objects"""
try:
- # In sqlalchemy >= 1.3 we can use hasattr().
- return hasattr(obj, attr)
- except RuntimeError:
- # In older versions we use a safe (but slow) method to avoid hasattr().
- # Older versions of sqlalchemy hit maximum recursion errors during
- # deserialization. The workaround is to avoid hasattr().
- return attr in dir(obj)
+ object.__getattribute__(obj, attr)
+ return True
+ except AttributeError:
+ return False
class _Proxy(object):