Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-mrcfile for openSUSE:Factory checked in at 2026-09-10 11:49:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-mrcfile (Old) and /work/SRC/openSUSE:Factory/.python-mrcfile.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-mrcfile" Thu Sep 10 11:49:34 2026 rev:7 rq:1376839 version:1.5.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-mrcfile/python-mrcfile.changes 2026-03-02 17:39:03.108163062 +0100 +++ /work/SRC/openSUSE:Factory/.python-mrcfile.new.1265/python-mrcfile.changes 2026-09-10 11:52:16.624819560 +0200 @@ -1,0 +2,6 @@ +Thu Sep 10 06:19:12 UTC 2026 - Steve Kowalik <[email protected]> + +- Add patch support-numpy-2.5.patch: + * Support changes required for numpy 2.5. + +------------------------------------------------------------------- New: ---- support-numpy-2.5.patch ----------(New B)---------- New: - Add patch support-numpy-2.5.patch: * Support changes required for numpy 2.5. ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-mrcfile.spec ++++++ --- /var/tmp/diff_new_pack.1Cc6FJ/_old 2026-09-10 11:52:17.664863181 +0200 +++ /var/tmp/diff_new_pack.1Cc6FJ/_new 2026-09-10 11:52:17.668863349 +0200 @@ -24,6 +24,8 @@ License: BSD-3-Clause URL: https://github.com/ccpem/mrcfile Source: https://github.com/ccpem/mrcfile/archive/refs/tags/v%{version}.tar.gz +# PATCH-FIX-UPSTREAM Based on gh#ccpem/mrcfile#76 +Patch0: support-numpy-2.5.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module setuptools} BuildRequires: %{python_module wheel} @@ -58,6 +60,11 @@ %check # https://github.com/ccpem/mrcfile/issues/73 skip="test_data_transposed_in_place_is_written_without_errors" +# Fails on 32 bit arches +if [ $(getconf LONG_BIT) = 32 ]; then + skip+=" or test_writing_image_mode_6_native_byte_order" + skip+=" or test_stats_are_updated_on_request" +fi %pytest -v -k "not ($skip)" %post ++++++ support-numpy-2.5.patch ++++++ >From a7e0e7a0dcd39685f82866c506ebfab1bbee6d00 Mon Sep 17 00:00:00 2001 From: McHaillet <[email protected]> Date: Mon, 22 Jun 2026 17:13:23 +0200 Subject: [PATCH] Fix DeprecationWarning when setting header.dtype on NumPy 2.5+ NumPy 2.5 deprecates assigning to .dtype on an existing array. Replace in-place dtype mutation with view()-based reinterpretation in mrcinterpreter.py and mrcobject.py. In update_header_from_data(), this means a header reference obtained before calling set_data() with byte-swapped data no longer reflects the byte-order change in place; callers must re-fetch mrc.header afterwards. The affected test has been updated accordingly. Fixes ccpem/mrcfile#75 --- mrcfile/mrcinterpreter.py | 14 ++++++-------- mrcfile/mrcobject.py | 18 +++++++++--------- tests/test_mrcfile.py | 11 +++++------ tests/test_mrcobject.py | 2 ++ 4 files changed, 22 insertions(+), 23 deletions(-) Index: mrcfile-1.5.4/mrcfile/mrcinterpreter.py =================================================================== --- mrcfile-1.5.4.orig/mrcfile/mrcinterpreter.py +++ mrcfile-1.5.4/mrcfile/mrcinterpreter.py @@ -218,7 +218,9 @@ class MrcInterpreter(MrcObject): raise # Create a new dtype with the correct byte order and update the header - header.dtype = header.dtype.newbyteorder(byte_order) + # by viewing it as the new dtype. (Assigning to .dtype directly is + # deprecated since NumPy 2.5.) + header = header.view(header.dtype.newbyteorder(byte_order)) # Check mode is valid; if not, try the opposite byte order # (Some MRC files have been seen 'in the wild' that are correct except @@ -231,8 +233,9 @@ class MrcInterpreter(MrcObject): opp_mode = header.mode.view(header.mode.dtype.newbyteorder()) utils.dtype_from_mode(opp_mode) # If we get here the new byte order is probably correct - # Use it and issue a warning - header.dtype = header.dtype.newbyteorder() + # Use it and issue a warning. (Assigning to .dtype directly is + # deprecated since NumPy 2.5.) + header = header.view(header.dtype.newbyteorder()) pretty_machst = utils.pretty_machine_stamp(header.machst) msg = "Machine stamp '{0}' does not match the apparent byte order '{1}'" warnings.warn(msg.format(pretty_machst, header.mode.dtype.byteorder), Index: mrcfile-1.5.4/mrcfile/mrcobject.py =================================================================== --- mrcfile-1.5.4.orig/mrcfile/mrcobject.py +++ mrcfile-1.5.4/mrcfile/mrcobject.py @@ -213,7 +213,8 @@ class MrcObject(object): if self.extended_header.nbytes < dtype.itemsize: raise ValueError first = self.extended_header[0:dtype.itemsize] - first.dtype = dtype + # Assigning to .dtype directly is deprecated since NumPy 2.5 + first = first.view(dtype) if first["Metadata size"][0] != dtype.itemsize: raise ValueError except ValueError: @@ -227,7 +228,8 @@ class MrcObject(object): if self.extended_header.nbytes < nbytes: raise ValueError full = self.extended_header[0:nbytes] - full.dtype = dtype + # Assigning to .dtype directly is deprecated since NumPy 2.5 + full = full.view(dtype) except ValueError: warnings.warn("The header has exttyp '{}' but the extended header " "cannot be interpreted as that type" @@ -566,7 +568,11 @@ class MrcObject(object): if (data_byte_order != '|' and not utils.byte_orders_equal(data_byte_order, header_byte_order)): header.byteswap(True) - header.dtype = header.dtype.newbyteorder(data_byte_order) + # Assigning to .dtype directly is deprecated since NumPy 2.5, so view the + # header as the new dtype instead, and store the result back onto + # self._header since the view is a new array, not the original. + header = header.view(header.dtype.newbyteorder(data_byte_order)) + self._header = header header.machst = utils.machine_stamp_from_byte_order(header.mode.dtype .byteorder) Index: mrcfile-1.5.4/tests/test_mrcfile.py =================================================================== --- mrcfile-1.5.4.orig/tests/test_mrcfile.py +++ mrcfile-1.5.4/tests/test_mrcfile.py @@ -169,8 +169,7 @@ class MrcFileTest(test_mrcobject.MrcObje assert mrc.header.nsymbt == 160 assert mrc.extended_header.nbytes == 160 assert mrc.extended_header.dtype.kind == 'V' - mrc.extended_header.dtype = 'S80' - ext = mrc.extended_header + ext = mrc.extended_header.view("S80") assert ext[0] == (b'X, Y, Z ' b' ') assert ext[1] == (b'-X, Y+1/2, -Z ' @@ -392,8 +391,8 @@ class MrcFileTest(test_mrcobject.MrcObje np.testing.assert_array_equal(mrc.data, data) with self.newmrc(self.temp_mrc_name, mode='r') as mrc: # Change the extended header dtype to a string for comparison - mrc.extended_header.dtype = 'S{}'.format(mrc.extended_header.nbytes) - np.testing.assert_array_equal(mrc.extended_header, extended_header) + ext = mrc.extended_header.view(f"S{mrc.extended_header.nbytes}") + np.testing.assert_array_equal(ext, extended_header) np.testing.assert_array_equal(mrc.data, data) def test_removing_extended_header(self): @@ -422,8 +421,8 @@ class MrcFileTest(test_mrcobject.MrcObje # Test that the file is still read, and the dtype falls back to 'V' assert mrc.extended_header.dtype.kind == 'V' assert mrc.indexed_extended_header is None - mrc.extended_header.dtype = 'S{}'.format(mrc.extended_header.nbytes) - np.testing.assert_array_equal(mrc.extended_header, extended_header) + ext = mrc.extended_header.view(f"S{mrc.extended_header.nbytes}") + np.testing.assert_array_equal(ext, extended_header) assert len(w) == 1 assert "FEI1" in str(w[0].message) assert "extended header" in str(w[0].message) Index: mrcfile-1.5.4/tests/test_mrcobject.py =================================================================== --- mrcfile-1.5.4.orig/tests/test_mrcobject.py +++ mrcfile-1.5.4/tests/test_mrcobject.py @@ -392,12 +392,14 @@ class MrcObjectTest(AssertRaisesRegexMix orig_byte_order) self.mrcobject.set_data(data.view(data.dtype.newbyteorder())) + header = self.mrcobject.header assert not utils.byte_orders_equal(header.mode.dtype.byteorder, orig_byte_order) assert header.mode == 2 assert header.mapc == original_mapc self.mrcobject.set_data(data) + header = self.mrcobject.header assert utils.byte_orders_equal(header.mode.dtype.byteorder, orig_byte_order) assert header.mode == 2
