[numpy] rework patches for 3.3 to more directly reflect upstream's commits
dmalcolm
dmalcolm at fedoraproject.org
Sun Aug 5 23:41:01 UTC 2012
commit c8ca126fdddeda6190dcd5b944d0f96ab79ab17d
Author: David Malcolm <dmalcolm at redhat.com>
Date: Sun Aug 5 19:39:40 2012 -0400
rework patches for 3.3 to more directly reflect upstream's commits
* Sun Aug 5 2012 David Malcolm <dmalcolm at redhat.com> - 1:1.6.2-5
- rework patches for 3.3 to more directly reflect upstream's commits
- re-enable test suite on python 3
- forcibly regenerate Cython .c source to avoid import issues on Python 3.3
001-fix-test_multiarray.patch | 69 ++++++++++++++++++++
...ython3.3.patch => 002-fix_PyUnicodeObject.patch | 51 ++++++++-------
09d2c51fa1d09b17060a8545b925f4dded9dedb1.patch | 37 +++++++++++
4234b6b13e3ee9da6fc1c24e9e8c442d77587837.patch | 28 ++++++++
f2ac38f09ff258339ef44572a3abba02019e1f55.patch | 50 ++++++++++++++
numpy.spec | 67 +++++++++++++++----
6 files changed, 266 insertions(+), 36 deletions(-)
---
diff --git a/001-fix-test_multiarray.patch b/001-fix-test_multiarray.patch
new file mode 100644
index 0000000..817643c
--- /dev/null
+++ b/001-fix-test_multiarray.patch
@@ -0,0 +1,69 @@
+diff -up numpy-1.6.2/numpy/core/tests/test_multiarray.py.test_multiarray numpy-1.6.2/numpy/core/tests/test_multiarray.py
+--- numpy-1.6.2/numpy/core/tests/test_multiarray.py.test_multiarray 2012-05-19 09:51:54.000000000 -0400
++++ numpy-1.6.2/numpy/core/tests/test_multiarray.py 2012-08-05 09:36:17.138719006 -0400
+@@ -13,6 +13,15 @@ from numpy.compat import asbytes, getexc
+
+ from test_print import in_foreign_locale
+
++if sys.version_info[:2] > (3, 2):
++ # In Python 3.3 the representation of empty shape, strides and suboffsets
++ # is an empty tuple instead of None.
++ # http://docs.python.org/dev/whatsnew/3.3.html#api-changes
++ EMPTY = ()
++else:
++ EMPTY = None
++
++
+ class TestFlags(TestCase):
+ def setUp(self):
+ self.a = arange(10)
+@@ -2162,7 +2171,7 @@ if sys.version_info >= (2, 6):
+ assert_equal(y.shape, (5,))
+ assert_equal(y.ndim, 1)
+ assert_equal(y.strides, (4,))
+- assert_equal(y.suboffsets, None)
++ assert_equal(y.suboffsets, EMPTY)
+ assert_equal(y.itemsize, 4)
+
+ def test_export_simple_nd(self):
+@@ -2172,7 +2181,7 @@ if sys.version_info >= (2, 6):
+ assert_equal(y.shape, (2, 2))
+ assert_equal(y.ndim, 2)
+ assert_equal(y.strides, (16, 8))
+- assert_equal(y.suboffsets, None)
++ assert_equal(y.suboffsets, EMPTY)
+ assert_equal(y.itemsize, 8)
+
+ def test_export_discontiguous(self):
+@@ -2182,7 +2191,7 @@ if sys.version_info >= (2, 6):
+ assert_equal(y.shape, (3, 3))
+ assert_equal(y.ndim, 2)
+ assert_equal(y.strides, (36, 4))
+- assert_equal(y.suboffsets, None)
++ assert_equal(y.suboffsets, EMPTY)
+ assert_equal(y.itemsize, 4)
+
+ def test_export_record(self):
+@@ -2214,7 +2223,7 @@ if sys.version_info >= (2, 6):
+ y = memoryview(x)
+ assert_equal(y.shape, (1,))
+ assert_equal(y.ndim, 1)
+- assert_equal(y.suboffsets, None)
++ assert_equal(y.suboffsets, EMPTY)
+
+ sz = sum([dtype(b).itemsize for a, b in dt])
+ if dtype('l').itemsize == 4:
+@@ -2228,10 +2237,10 @@ if sys.version_info >= (2, 6):
+ x = np.array(([[1,2],[3,4]],), dtype=[('a', ('i', (2,2)))])
+ y = memoryview(x)
+ assert_equal(y.format, 'T{(2,2)i:a:}')
+- assert_equal(y.shape, None)
++ assert_equal(y.shape, EMPTY)
+ assert_equal(y.ndim, 0)
+- assert_equal(y.strides, None)
+- assert_equal(y.suboffsets, None)
++ assert_equal(y.strides, EMPTY)
++ assert_equal(y.suboffsets, EMPTY)
+ assert_equal(y.itemsize, 16)
+
+ def test_export_endian(self):
diff --git a/numpy-1.6.2-unicode-python3.3.patch b/002-fix_PyUnicodeObject.patch
similarity index 50%
rename from numpy-1.6.2-unicode-python3.3.patch
rename to 002-fix_PyUnicodeObject.patch
index db21ebe..57b31ba 100644
--- a/numpy-1.6.2-unicode-python3.3.patch
+++ b/002-fix_PyUnicodeObject.patch
@@ -1,24 +1,30 @@
---- numpy/core/src/multiarray/scalarapi.c.orig 2012-05-19 15:51:54.000000000 +0200
-+++ numpy/core/src/multiarray/scalarapi.c 2012-08-05 14:57:02.068276634 +0200
-@@ -652,6 +652,35 @@
+diff -up numpy-1.6.2/numpy/core/src/multiarray/scalarapi.c.fix_PyUnicodeObject numpy-1.6.2/numpy/core/src/multiarray/scalarapi.c
+--- numpy-1.6.2/numpy/core/src/multiarray/scalarapi.c.fix_PyUnicodeObject 2012-05-19 09:51:54.000000000 -0400
++++ numpy-1.6.2/numpy/core/src/multiarray/scalarapi.c 2012-08-05 16:07:29.956719007 -0400
+@@ -652,6 +652,40 @@ PyArray_Scalar(void *data, PyArray_Descr
itemsize = (((itemsize - 1) >> 2) + 1) << 2;
}
}
+#if PY_VERSION_HEX >= 0x03030000
+ if (type_num == NPY_UNICODE) {
+ PyObject *u, *args;
-+ int byteorder;
-+
-+#if NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN
-+ byteorder = -1;
-+#elif NPY_BYTE_ORDER == NPY_BIG_ENDIAN
-+ byteorder = +1;
-+#else
-+ #error Endianness undefined ?
-+#endif
-+ if (swap) byteorder *= -1;
-+
-+ u = PyUnicode_DecodeUTF32(data, itemsize, NULL, &byteorder);
++ char *buffer;
++ if (swap) {
++ buffer = malloc(itemsize);
++ if (buffer == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
++ memcpy(buffer, data, itemsize);
++ byte_swap_vector(buffer, itemsize >> 2, 4);
++ } else {
++ buffer = data;
++ }
++ u = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer,
++ itemsize >> 2);
++ if (swap) {
++ free(buffer);
++ }
+ if (u == NULL) {
+ return NULL;
+ }
@@ -36,7 +42,7 @@
if (type->tp_itemsize != 0) {
/* String type */
obj = type->tp_alloc(type, itemsize);
-@@ -688,6 +717,7 @@
+@@ -688,6 +722,7 @@ PyArray_Scalar(void *data, PyArray_Descr
memcpy(destptr, data, itemsize);
return obj;
}
@@ -44,19 +50,18 @@
else if (type_num == PyArray_UNICODE) {
/* tp_alloc inherited from Python PyBaseObject_Type */
PyUnicodeObject *uni = (PyUnicodeObject*)obj;
-@@ -759,6 +789,7 @@
+@@ -759,6 +794,7 @@ PyArray_Scalar(void *data, PyArray_Descr
#endif
return obj;
}
-+#endif /* PY_VERSION_HEX < 0x03030000 */
++#endif // PY_VERSION_HEX < 0x03030000
else {
PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
vobj->base = NULL;
-diff --git numpy/core/src/multiarray/scalartypes.c.src numpy/core/src/multiarray/scalartypes.c.src
-index e547071..12745d7 100644
---- numpy/core/src/multiarray/scalartypes.c.src
-+++ numpy/core/src/multiarray/scalartypes.c.src
-@@ -2592,7 +2592,11 @@ finish:
+diff -up numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src.fix_PyUnicodeObject numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src
+--- numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src.fix_PyUnicodeObject 2012-05-19 09:51:54.000000000 -0400
++++ numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src 2012-08-05 16:05:40.868718999 -0400
+@@ -2323,7 +2323,11 @@ finish:
*((npy_ at name@ *)dest) = *((npy_ at name@ *)src);
#elif @default@ == 1 /* unicode and strings */
if (itemsize == 0) { /* unicode */
diff --git a/09d2c51fa1d09b17060a8545b925f4dded9dedb1.patch b/09d2c51fa1d09b17060a8545b925f4dded9dedb1.patch
new file mode 100644
index 0000000..a242079
--- /dev/null
+++ b/09d2c51fa1d09b17060a8545b925f4dded9dedb1.patch
@@ -0,0 +1,37 @@
+commit 09d2c51fa1d09b17060a8545b925f4dded9dedb1
+Author: Ondrej Certik <ondrej.certik at gmail.com>
+Date: Fri Aug 3 09:36:46 2012 -0700
+
+ Follow the C guidelines
+
+diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c
+index 0afdc17..97a5e4b 100644
+--- a/numpy/core/src/multiarray/scalarapi.c
++++ b/numpy/core/src/multiarray/scalarapi.c
+@@ -645,6 +645,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
+ if (type_num == NPY_UNICODE) {
+ PyObject *u, *args;
+ char *buffer;
++
+ if (swap) {
+ buffer = malloc(itemsize);
+ if (buffer == NULL) {
+@@ -653,7 +654,8 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
+ }
+ memcpy(buffer, data, itemsize);
+ byte_swap_vector(buffer, itemsize >> 2, 4);
+- } else {
++ }
++ else {
+ buffer = data;
+ }
+ u = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer,
+@@ -778,7 +780,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
+ #endif
+ return obj;
+ }
+-#endif // PY_VERSION_HEX < 0x03030000
++#endif /* PY_VERSION_HEX < 0x03030000 */
+ else {
+ PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
+ vobj->base = NULL;
diff --git a/4234b6b13e3ee9da6fc1c24e9e8c442d77587837.patch b/4234b6b13e3ee9da6fc1c24e9e8c442d77587837.patch
new file mode 100644
index 0000000..5f9a9b3
--- /dev/null
+++ b/4234b6b13e3ee9da6fc1c24e9e8c442d77587837.patch
@@ -0,0 +1,28 @@
+commit 4234b6b13e3ee9da6fc1c24e9e8c442d77587837
+Author: Ondrej Certik <ondrej.certik at gmail.com>
+Date: Fri Aug 3 07:27:42 2012 -0700
+
+ FIX: Make sure the tests produce valid unicode
+
+ The tests are testing byte order for unicode, so we can only use such unicode
+ data, so that both versions (swapped and unswapped) are valid unicode.
+
+diff --git a/numpy/core/tests/test_unicode.py b/numpy/core/tests/test_unicode.py
+index d47ac54..7b27076 100644
+--- a/numpy/core/tests/test_unicode.py
++++ b/numpy/core/tests/test_unicode.py
+@@ -26,10 +26,12 @@ else:
+ return len(arr.data)
+ return len(buffer(arr))
+
++# In both cases below we need to make sure that the byte swapped value (as
++# UCS4) is still a valid unicode:
+ # Value that can be represented in UCS2 interpreters
+-ucs2_value = u'\uFFFF'
++ucs2_value = u'\u0900'
+ # Value that cannot be represented in UCS2 interpreters (but can in UCS4)
+-ucs4_value = u'\U0010FFFF'
++ucs4_value = u'\U00100900'
+
+
+ ############################################################
diff --git a/f2ac38f09ff258339ef44572a3abba02019e1f55.patch b/f2ac38f09ff258339ef44572a3abba02019e1f55.patch
new file mode 100644
index 0000000..124ccb7
--- /dev/null
+++ b/f2ac38f09ff258339ef44572a3abba02019e1f55.patch
@@ -0,0 +1,50 @@
+commit f2ac38f09ff258339ef44572a3abba02019e1f55
+Author: Ondrej Certik <ondrej.certik at gmail.com>
+Date: Fri Aug 3 10:39:25 2012 -0700
+
+ Use PyUnicode_DecodeUTF32()
+
+ This function handles the swapping automatically and it returns a unicode
+ object in one of: UCS1, UCS2 or UCS4 internal Python format.
+
+diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c
+index 97a5e4b..d9bc492 100644
+--- a/numpy/core/src/multiarray/scalarapi.c
++++ b/numpy/core/src/multiarray/scalarapi.c
+@@ -644,25 +644,18 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
+ #if PY_VERSION_HEX >= 0x03030000
+ if (type_num == NPY_UNICODE) {
+ PyObject *u, *args;
+- char *buffer;
++ int byteorder;
+
+- if (swap) {
+- buffer = malloc(itemsize);
+- if (buffer == NULL) {
+- PyErr_NoMemory();
+- return NULL;
+- }
+- memcpy(buffer, data, itemsize);
+- byte_swap_vector(buffer, itemsize >> 2, 4);
+- }
+- else {
+- buffer = data;
+- }
+- u = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer,
+- itemsize >> 2);
+- if (swap) {
+- free(buffer);
+- }
++#if NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN
++ byteorder = -1;
++#elif NPY_BYTE_ORDER == NPY_BIG_ENDIAN
++ byteorder = +1;
++#else
++ #error Endianness undefined ?
++#endif
++ if (swap) byteorder *= -1;
++
++ u = PyUnicode_DecodeUTF32(data, itemsize, NULL, &byteorder);
+ if (u == NULL) {
+ return NULL;
+ }
diff --git a/numpy.spec b/numpy.spec
index b9c1dad..fe1414f 100644
--- a/numpy.spec
+++ b/numpy.spec
@@ -9,7 +9,7 @@
Name: numpy
Version: 1.6.2
-Release: 4%{?dist}
+Release: 5%{?dist}
Epoch: 1
Summary: A fast multidimensional array facility for Python
@@ -17,14 +17,32 @@ Group: Development/Languages
License: BSD
URL: http://numeric.scipy.org/
Source0: http://downloads.sourceforge.net/numpy/%{name}-%{version}%{?relc}.tar.gz
-# backport unicode fixes from upstream git repo
-# based on:
-# commit 4676f33f9c77b04e9c599e642de7ab465f48ea8f
-# Merge: fd15162 f2ac38f
-# Author: Travis E. Oliphant <teoliphant at gmail.com>
-# Date: Fri Aug 3 22:46:21 2012 -0700
-# and commit a9d58ab42da8d2ed9071044848a54c5e066b557a
-Patch0: numpy-1.6.2-unicode-python3.3.patch
+
+# Fix tests for empty shape, strides and suboffsets on Python 3.3
+# Backported from 02f3d1f73ca5957d3b5a3e575293e4d970de4267 upstream, see
+# https://github.com/numpy/numpy/pull/367
+Patch1: 001-fix-test_multiarray.patch
+
+# Patches to fix PyUnicodeObject handling under 3.3, taken from upstream
+# See
+# https://github.com/numpy/numpy/pull/372
+#
+# "FIX: Fixes the PyUnicodeObject problem in py-3.3"
+# based on upstream commit a9d58ab42da8d2ed9071044848a54c5e066b557a:
+Patch2: 002-fix_PyUnicodeObject.patch
+#
+# "FIX: Make sure the tests produce valid unicode"
+# copy of upstream commit 4234b6b13e3ee9da6fc1c24e9e8c442d77587837:
+Patch3: 4234b6b13e3ee9da6fc1c24e9e8c442d77587837.patch
+#
+# "Follow the C guidelines"
+# copy of upstream commit 09d2c51fa1d09b17060a8545b925f4dded9dedb1:
+Patch4: 09d2c51fa1d09b17060a8545b925f4dded9dedb1.patch
+#
+# "Use PyUnicode_DecodeUTF32()"
+# copy of upstream commit f2ac38f09ff258339ef44572a3abba02019e1f55:
+Patch5: f2ac38f09ff258339ef44572a3abba02019e1f55.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: python2-devel lapack-devel python-setuptools gcc-gfortran atlas-devel python-nose
@@ -32,8 +50,9 @@ Requires: python-nose
%if 0%{?with_python3}
BuildRequires: python3-devel
BuildRequires: python3-setuptools
-#BuildRequires: python3-nose
+BuildRequires: python3-nose
%endif
+BuildRequires: Cython
%description
NumPy is a general-purpose array-processing package designed to
@@ -90,7 +109,24 @@ This package includes a version of f2py that works properly with NumPy.
%prep
%setup -q -n %{name}-%{version}%{?relc}
-%patch0 -p0
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+
+# Regenerate Cython c sources
+# This is needed with numpy-1.6.2.tar.gz with python 3.3 to avoid an exception
+# with an import call in the generated .c file in the tarball that uses the
+# old default of -1:
+# File "mtrand.pyx", line 126, in init mtrand (numpy/random/mtrand/mtrand.c:20679)
+# ValueError: level must be >= 0
+# due to the changes in import in 3.3
+# Regenerating with a newer Cython fixes it:
+pushd numpy/random/mtrand/
+rm -v mtrand.c
+cython mtrand.pyx
+popd
%if 0%{?with_python3}
rm -rf %{py3dir}
@@ -182,9 +218,9 @@ popd &> /dev/null
%if 0%{?with_python3}
pushd doc &> /dev/null
# there is no python3-nose yet
-#PYTHONPATH="%{buildroot}%{python3_sitearch}" %{__python3} -c "import pkg_resources, numpy ; numpy.test()" \
+PYTHONPATH="%{buildroot}%{python3_sitearch}" %{__python3} -c "import pkg_resources, numpy ; numpy.test()" \
%ifarch s390 s390x
-#|| :
+|| :
%endif
# don't remove this comment
popd &> /dev/null
@@ -256,6 +292,11 @@ rm -rf %{buildroot}
%changelog
+* Sun Aug 5 2012 David Malcolm <dmalcolm at redhat.com> - 1:1.6.2-5
+- rework patches for 3.3 to more directly reflect upstream's commits
+- re-enable test suite on python 3
+- forcibly regenerate Cython .c source to avoid import issues on Python 3.3
+
* Sun Aug 5 2012 Thomas Spura <tomspur at fedoraproject.org> - 1:1.6.2-4
- rebuild for https://fedoraproject.org/wiki/Features/Python_3.3
- needs unicode patch
More information about the scm-commits
mailing list