From c8ca126fdddeda6190dcd5b944d0f96ab79ab17d Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Aug 05 2012 23:39:40 +0000 Subject: rework patches for 3.3 to more directly reflect upstream's commits * Sun Aug 5 2012 David Malcolm - 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 --- 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/002-fix_PyUnicodeObject.patch b/002-fix_PyUnicodeObject.patch new file mode 100644 index 0000000..57b31ba --- /dev/null +++ b/002-fix_PyUnicodeObject.patch @@ -0,0 +1,75 @@ +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; ++ 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; ++ } ++ args = Py_BuildValue("(O)", u); ++ if (args == NULL) { ++ Py_DECREF(u); ++ return NULL; ++ } ++ obj = type->tp_new(type, args, NULL); ++ Py_DECREF(u); ++ Py_DECREF(args); ++ return obj; ++ } ++#endif + if (type->tp_itemsize != 0) { + /* String type */ + obj = type->tp_alloc(type, itemsize); +@@ -688,6 +722,7 @@ PyArray_Scalar(void *data, PyArray_Descr + memcpy(destptr, data, itemsize); + return obj; + } ++#if PY_VERSION_HEX < 0x03030000 + else if (type_num == PyArray_UNICODE) { + /* tp_alloc inherited from Python PyBaseObject_Type */ + PyUnicodeObject *uni = (PyUnicodeObject*)obj; +@@ -759,6 +794,7 @@ PyArray_Scalar(void *data, PyArray_Descr + #endif + return obj; + } ++#endif // PY_VERSION_HEX < 0x03030000 + else { + PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj; + vobj->base = NULL; +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_@name@ *)dest) = *((npy_@name@ *)src); + #elif @default@ == 1 /* unicode and strings */ + if (itemsize == 0) { /* unicode */ ++#if PY_VERSION_HEX >= 0x03030000 ++ itemsize = PyUnicode_GetLength(robj) * PyUnicode_KIND(robj); ++#else + itemsize = ((PyUnicodeObject *)robj)->length * sizeof(Py_UNICODE); ++#endif + } + memcpy(dest, src, itemsize); + /* @default@ == 2 won't get here */ 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 +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 +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 +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-1.6.2-unicode-python3.3.patch b/numpy-1.6.2-unicode-python3.3.patch deleted file mode 100644 index db21ebe..0000000 --- a/numpy-1.6.2-unicode-python3.3.patch +++ /dev/null @@ -1,70 +0,0 @@ ---- 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 @@ - 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); -+ if (u == NULL) { -+ return NULL; -+ } -+ args = Py_BuildValue("(O)", u); -+ if (args == NULL) { -+ Py_DECREF(u); -+ return NULL; -+ } -+ obj = type->tp_new(type, args, NULL); -+ Py_DECREF(u); -+ Py_DECREF(args); -+ return obj; -+ } -+#endif - if (type->tp_itemsize != 0) { - /* String type */ - obj = type->tp_alloc(type, itemsize); -@@ -688,6 +717,7 @@ - memcpy(destptr, data, itemsize); - return obj; - } -+#if PY_VERSION_HEX < 0x03030000 - else if (type_num == PyArray_UNICODE) { - /* tp_alloc inherited from Python PyBaseObject_Type */ - PyUnicodeObject *uni = (PyUnicodeObject*)obj; -@@ -759,6 +789,7 @@ - #endif - return obj; - } -+#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: - *((npy_@name@ *)dest) = *((npy_@name@ *)src); - #elif @default@ == 1 /* unicode and strings */ - if (itemsize == 0) { /* unicode */ -+#if PY_VERSION_HEX >= 0x03030000 -+ itemsize = PyUnicode_GetLength(robj) * PyUnicode_KIND(robj); -+#else - itemsize = ((PyUnicodeObject *)robj)->length * sizeof(Py_UNICODE); -+#endif - } - memcpy(dest, src, itemsize); - /* @default@ == 2 won't get here */ 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 -# 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 - 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 - 1:1.6.2-4 - rebuild for https://fedoraproject.org/wiki/Features/Python_3.3 - needs unicode patch