Bug#1106890: unblock: cctbx/2024.10+ds2+~3.22.1+ds1-5
Roland Mas
lolando at debian.org
Sat May 31 12:01:55 BST 2025
Package: release.debian.org
Severity: normal
User: release.debian.org at packages.debian.org
Usertags: unblock
X-Debbugs-Cc: cctbx at packages.debian.org
Control: affects -1 + src:cctbx
Please unblock package cctbx
[ Reason ]
Fixed numpy2 compatibility by backporting the upstream patch; this makes the
autopkgtest testsuite pass again.
Also includes one policy compliance fix (using DEB_BUILD_OPTION_PARALLEL
instead of nproc).
[ Impact ]
A few reverse depends in the crystallography field.
[ Tests ]
Full autopkgtest testsuite.
[ Risks ]
Low, since the patch has been reviewed upstream in an MR then merged. It's also
part of the new upstream release (which I'll keep for after the Trixie
release).
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
unblock cctbx/2024.10+ds2+~3.22.1+ds1-5
-------------- next part --------------
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog 2024-11-20 15:50:35.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog 2025-05-29 18:19:06.000000000 +0200
@@ -1,3 +1,17 @@
+cctbx (2024.10+ds2+~3.22.1+ds1-5) unstable; urgency=medium
+
+ [ Michael R. Crusoe ]
+ * Team upload.
+ * d/rules: use DEB_BUILD_OPTION_PARALLEL instead of nproc to respect
+ Debian Policy 4.9.1.
+
+ [ Roland Mas ]
+ * Backport upstream patch to fix: "autopkgtest regression in testing",
+ thanks to Graham Inggs (Closes: #1101031).
+ * Fix pip invocation to help with autopkgtests.
+
+ -- Roland Mas <lolando at debian.org> Thu, 29 May 2025 18:19:06 +0200
+
cctbx (2024.10+ds2+~3.22.1+ds1-4) unstable; urgency=medium
* Bug fix: "removal of Python standard libraries in Python 3.13", thanks
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch 1970-01-01 01:00:00.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch 2025-05-29 17:53:19.000000000 +0200
@@ -0,0 +1,447 @@
+From: Roland Mas <lolando at debian.org>
+Date: Thu, 29 May 2025 16:53:52 +0200
+Subject: Numpy 2 compat from upstream
+
+---
+ dxtbx/dependencies.yaml | 5 +--
+ dxtbx/src/dxtbx/boost_python/flumpy.cc | 2 +-
+ .../src/dxtbx/format/FormatHDF5EigerNearlyNexus.py | 48 +++++++++++-----------
+ dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py | 10 ++---
+ dxtbx/src/dxtbx/format/FormatSER.py | 4 +-
+ dxtbx/src/dxtbx/format/nexus.py | 18 ++++----
+ dxtbx/src/dxtbx/format/nxmx_writer.py | 4 +-
+ dxtbx/src/dxtbx/nexus/__init__.py | 2 +-
+ dxtbx/src/dxtbx/util/rotate_and_average.py | 2 +-
+ dxtbx/tests/conftest.py | 4 +-
+ dxtbx/tests/format/test_FormatNXmxDLS16M.py | 20 ++++-----
+ dxtbx/tests/nexus/test_build_dxtbx_models.py | 2 +-
+ dxtbx/tests/test_flumpy.py | 2 +-
+ 13 files changed, 59 insertions(+), 64 deletions(-)
+
+diff --git a/dxtbx/dependencies.yaml b/dxtbx/dependencies.yaml
+index ba2e954..b2460f8 100644
+--- a/dxtbx/dependencies.yaml
++++ b/dxtbx/dependencies.yaml
+@@ -54,12 +54,11 @@ build:
+
+ host:
+ - cctbx-base # [prebuilt_cctbx and bootstrap]
+- - cctbx-base >=2024 # [not bootstrap]
++ - cctbx-base >=2025 # [not bootstrap]
+ - hdf5
+ - libboost-devel
+ - libboost-python-devel
+- - numpy >=1.21.5,<2 #[bootstrap]
+- - numpy # [not bootstrap]
++ - numpy
+ - pip
+ - pybind11
+ - python
+diff --git a/dxtbx/src/dxtbx/boost_python/flumpy.cc b/dxtbx/src/dxtbx/boost_python/flumpy.cc
+index d7ce34b..e8cb4ea 100644
+--- a/dxtbx/src/dxtbx/boost_python/flumpy.cc
++++ b/dxtbx/src/dxtbx/boost_python/flumpy.cc
+@@ -587,7 +587,7 @@ py::object miller_index_from_numpy(py::array np_array) {
+ if (accepted_types.find(dtype) == std::string::npos) {
+ throw std::invalid_argument(
+ std::string("miller_index only supports int32 or intc types - cannot convert '")
+- + std::to_string(dtype) + "'");
++ + dtype + "'");
+ }
+ return vec_from_numpy<cctbx::miller::index>(np_array);
+ }
+diff --git a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
+index 25d7a4c..4721c38 100644
+--- a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
++++ b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
+@@ -32,7 +32,7 @@ def find_entries(nx_file):
+ if "entry" in nx_file:
+ entry = nx_file["entry"]
+ if "NX_class" in entry.attrs:
+- if entry.attrs["NX_class"] == np.string_("NXentry"):
++ if entry.attrs["NX_class"] == np.bytes_("NXentry"):
+ if "definition" not in entry:
+ return entry
+ return None
+@@ -49,7 +49,7 @@ def is_eiger_nearly_nexus_file(filename):
+ if entry is not None:
+ try:
+ return (
+- np.string_("dectris eiger")
++ np.bytes_("dectris eiger")
+ in entry["instrument"]["detector"]["description"][()].lower()
+ )
+ except KeyError:
+@@ -76,7 +76,7 @@ class EigerNXmxFixer:
+ dataset[()] = value
+
+ # Add NXmx definition
+- create_scalar(handle["entry"], "definition", "S4", np.string_("NXmx"))
++ create_scalar(handle["entry"], "definition", "S4", np.bytes_("NXmx"))
+
+ # Add saturation value
+ try:
+@@ -100,7 +100,7 @@ class EigerNXmxFixer:
+
+ # Add detector type
+ create_scalar(
+- handle["entry/instrument/detector"], "type", "S5", np.string_("PIXEL")
++ handle["entry/instrument/detector"], "type", "S5", np.bytes_("PIXEL")
+ )
+
+ # Move the beam
+@@ -111,7 +111,7 @@ class EigerNXmxFixer:
+ module_path = "/entry/instrument/detector/module"
+ # print "Creating detector module %s" % (module_path)
+ group = handle.create_group(module_path)
+- group.attrs["NX_class"] = np.string_("NXdetector_module")
++ group.attrs["NX_class"] = np.bytes_("NXdetector_module")
+
+ # Add a module index
+ create_scalar(group, "module_index", "int64", 0)
+@@ -174,13 +174,13 @@ class EigerNXmxFixer:
+ "float32",
+ handle["/entry/instrument/detector/x_pixel_size"][()],
+ )
+- group["fast_pixel_direction"].attrs["transformation_type"] = np.string_(
++ group["fast_pixel_direction"].attrs["transformation_type"] = np.bytes_(
+ "translation"
+ )
+ group["fast_pixel_direction"].attrs["vector"] = fast_axis
+ group["fast_pixel_direction"].attrs["offset"] = (0, 0, 0)
+- group["fast_pixel_direction"].attrs["units"] = np.string_("m")
+- group["fast_pixel_direction"].attrs["depends_on"] = np.string_(depends_on)
++ group["fast_pixel_direction"].attrs["units"] = np.bytes_("m")
++ group["fast_pixel_direction"].attrs["depends_on"] = np.bytes_(depends_on)
+
+ # Add slow_pixel_size dataset
+ create_scalar(
+@@ -189,29 +189,29 @@ class EigerNXmxFixer:
+ "float32",
+ handle["/entry/instrument/detector/y_pixel_size"][()],
+ )
+- group["slow_pixel_direction"].attrs["transformation_type"] = np.string_(
++ group["slow_pixel_direction"].attrs["transformation_type"] = np.bytes_(
+ "translation"
+ )
+ group["slow_pixel_direction"].attrs["vector"] = slow_axis
+ group["slow_pixel_direction"].attrs["offset"] = (0, 0, 0)
+- group["slow_pixel_direction"].attrs["units"] = np.string_("m")
+- group["slow_pixel_direction"].attrs["depends_on"] = np.string_(depends_on)
++ group["slow_pixel_direction"].attrs["units"] = np.bytes_("m")
++ group["slow_pixel_direction"].attrs["depends_on"] = np.bytes_(depends_on)
+
+ # Add module offset dataset
+ # print "Set module offset to be zero relative to detector"
+ create_scalar(group, "module_offset", "float32", 0)
+- group["module_offset"].attrs["transformation_type"] = np.string_("translation")
++ group["module_offset"].attrs["transformation_type"] = np.bytes_("translation")
+ group["module_offset"].attrs["vector"] = (0, 0, 0)
+ group["module_offset"].attrs["offset"] = (0, 0, 0)
+- group["module_offset"].attrs["units"] = np.string_("m")
+- group["module_offset"].attrs["depends_on"] = np.string_(depends_on)
++ group["module_offset"].attrs["units"] = np.bytes_("m")
++ group["module_offset"].attrs["depends_on"] = np.bytes_(depends_on)
+
+ # Create detector depends_on
+ create_scalar(
+ handle["/entry/instrument/detector"],
+ "depends_on",
+ "S%d" % len(depends_on),
+- np.string_(depends_on),
++ np.bytes_(depends_on),
+ )
+
+ # Add detector position
+@@ -228,22 +228,22 @@ class EigerNXmxFixer:
+ )
+ )
+ group = handle.create_group("/entry/instrument/detector/transformations")
+- group.attrs["NX_class"] = np.string_("NXtransformations")
++ group.attrs["NX_class"] = np.bytes_("NXtransformations")
+ create_scalar(group, "translation", "float32", detector_offset_vector.length())
+- group["translation"].attrs["transformation_type"] = np.string_("translation")
++ group["translation"].attrs["transformation_type"] = np.bytes_("translation")
+ if detector_offset_vector.length() > 0:
+ group["translation"].attrs["vector"] = detector_offset_vector.normalize()
+ else:
+ group["translation"].attrs["vector"] = detector_offset_vector
+ group["translation"].attrs["offset"] = 0
+- group["translation"].attrs["units"] = np.string_("m")
+- group["translation"].attrs["depends_on"] = np.string_(".")
++ group["translation"].attrs["units"] = np.bytes_("m")
++ group["translation"].attrs["depends_on"] = np.bytes_(".")
+
+ # Create goniometer transformations if not found
+ if "/entry/sample/transformations" not in handle:
+ # print "Creating group /entry/sample/transformation"
+ group = handle.create_group("/entry/sample/transformations")
+- group.attrs["NX_class"] = np.string_("NXtransformations")
++ group.attrs["NX_class"] = np.bytes_("NXtransformations")
+ else:
+ group = handle["/entry/sample/transformations"]
+
+@@ -274,11 +274,11 @@ class EigerNXmxFixer:
+ for name in sorted(handle["/entry/data"]):
+ num_images += handle_orig_entry_properties[name]["length"]
+ dataset = group.create_dataset("omega", (num_images,), dtype="float32")
+- dataset.attrs["units"] = np.string_("degree")
+- dataset.attrs["transformation_type"] = np.string_("rotation")
++ dataset.attrs["units"] = np.bytes_("degree")
++ dataset.attrs["transformation_type"] = np.bytes_("rotation")
+ dataset.attrs["vector"] = default_axis
+ dataset.attrs["offset"] = 0
+- dataset.attrs["depends_on"] = np.string_(".")
++ dataset.attrs["depends_on"] = np.bytes_(".")
+ omega_range_average = handle[
+ "/entry/sample/goniometer/omega_range_average"
+ ][()]
+@@ -295,7 +295,7 @@ class EigerNXmxFixer:
+ handle["/entry/sample"],
+ "depends_on",
+ "S%d" % len(dataset.name),
+- np.string_(dataset.name),
++ np.bytes_(dataset.name),
+ )
+
+ # Change relative paths to absolute paths
+diff --git a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
+index e43892c..8a9198c 100644
+--- a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
++++ b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
+@@ -106,11 +106,11 @@ class FormatNexusJungfrauHack(FormatNexus):
+ detector_material = clean_string(str(material))
+ material = {
+ "Si": "Si",
+- np.string_("Si"): "Si",
+- np.string_("Silicon"): "Si",
+- np.string_("Sillicon"): "Si",
+- np.string_("CdTe"): "CdTe",
+- np.string_("GaAs"): "GaAs",
++ np.bytes_("Si"): "Si",
++ np.bytes_("Silicon"): "Si",
++ np.bytes_("Sillicon"): "Si",
++ np.bytes_("CdTe"): "CdTe",
++ np.bytes_("GaAs"): "GaAs",
+ }.get(detector_material)
+ if not material:
+ raise RuntimeError("Unknown material: %s" % detector_material)
+diff --git a/dxtbx/src/dxtbx/format/FormatSER.py b/dxtbx/src/dxtbx/format/FormatSER.py
+index acf5ccc..0fd3031 100644
+--- a/dxtbx/src/dxtbx/format/FormatSER.py
++++ b/dxtbx/src/dxtbx/format/FormatSER.py
+@@ -142,7 +142,7 @@ def read_emi(filename):
+
+
+ def _parseEntry_emi(value):
+- """Auxiliary function to parse string entry to int, float or np.string_().
++ """Auxiliary function to parse string entry to int, float or np.bytes_().
+ Parameters
+ ----------
+ value : str
+@@ -162,7 +162,7 @@ def _parseEntry_emi(value):
+ p = float(value)
+ except ValueError:
+ # if neither int nor float, stay with string
+- p = np.string_(str(value))
++ p = np.bytes_(str(value))
+
+ return p
+
+diff --git a/dxtbx/src/dxtbx/format/nexus.py b/dxtbx/src/dxtbx/format/nexus.py
+index 35dfefa..a7fc1c6 100644
+--- a/dxtbx/src/dxtbx/format/nexus.py
++++ b/dxtbx/src/dxtbx/format/nexus.py
+@@ -48,15 +48,15 @@ except ImportError:
+ NXNode = Union[h5py.File, h5py.Group]
+
+
+-def h5str(h5_value: str | numpy.string_ | bytes) -> str:
++def h5str(h5_value: str | numpy.bytes_ | bytes) -> str:
+ """
+ Convert a value returned an h5py attribute to str.
+
+- h5py can return either a bytes-like (numpy.string_) or str object
++ h5py can return either a bytes-like (numpy.bytes_) or str object
+ for attribute values depending on whether the value was written as
+ fixed or variable length. This function collapses the two to str.
+ """
+- if isinstance(h5_value, (numpy.string_, bytes)):
++ if isinstance(h5_value, (numpy.bytes_, bytes)):
+ return h5_value.decode("utf-8")
+ return h5_value
+
+@@ -68,7 +68,7 @@ def dataset_as_flex(dataset, selection):
+ assert numpy.issubdtype(dataset.dtype, numpy.floating)
+ double_types = [
+ numpy.double,
+- numpy.longfloat,
++ numpy.longdouble,
+ numpy.float64,
+ ]
+ if hasattr(numpy, "float96"):
+@@ -78,7 +78,7 @@ def dataset_as_flex(dataset, selection):
+ if dataset.dtype in [
+ numpy.half,
+ numpy.single,
+- numpy.float_,
++ numpy.float64,
+ numpy.float16,
+ numpy.float32,
+ ]:
+@@ -1095,7 +1095,7 @@ class DetectorFactory:
+ # mu_at_angstrom returns cm^-1, but need mu in mm^-1
+ table = attenuation_coefficient.get_table(material)
+ wavelength = beam.get_wavelength()
+- mu = table.mu_at_angstrom(wavelength) / 10.0
++ mu = float(table.mu_at_angstrom(wavelength)) / 10.0
+
+ # Construct the detector model
+ pixel_size = (fast_pixel_direction_value, slow_pixel_direction_value)
+@@ -1112,9 +1112,9 @@ class DetectorFactory:
+ Panel(
+ detector_type,
+ detector_name,
+- tuple(fast_axis),
+- tuple(slow_axis),
+- tuple(origin),
++ tuple(float(x) for x in fast_axis),
++ tuple(float(x) for x in slow_axis),
++ tuple(float(x) for x in origin),
+ pixel_size,
+ image_size,
+ trusted_range,
+diff --git a/dxtbx/src/dxtbx/format/nxmx_writer.py b/dxtbx/src/dxtbx/format/nxmx_writer.py
+index 57cfce0..7161654 100644
+--- a/dxtbx/src/dxtbx/format/nxmx_writer.py
++++ b/dxtbx/src/dxtbx/format/nxmx_writer.py
+@@ -171,7 +171,7 @@ class NXmxWriter:
+ entry["end_time_estimated"] = self.params.nexus_details.end_time_estimated
+
+ # --> definition
+- self._create_scalar(entry, "definition", "S4", np.string_("NXmx"))
++ self._create_scalar(entry, "definition", "S4", np.bytes_("NXmx"))
+
+ # --> sample
+ sample = self.handle["entry"].create_group("sample")
+@@ -354,7 +354,7 @@ class NXmxWriter:
+ det_group.attrs["NX_class"] = "NXdetector_group"
+
+ det_group.create_dataset("group_index", data=list(range(1, 3)), dtype="i")
+- data = [np.string_("detector"), np.string_("detector")]
++ data = [np.bytes_("detector"), np.bytes_("detector")]
+ det_group.create_dataset("group_names", (2,), data=data, dtype="S12")
+ det_group.create_dataset("group_parent", (2,), data=[-1, 1], dtype="i")
+ det_group.create_dataset("group_type", (2,), data=[1, 2], dtype="i")
+diff --git a/dxtbx/src/dxtbx/nexus/__init__.py b/dxtbx/src/dxtbx/nexus/__init__.py
+index e506e3a..b1df642 100644
+--- a/dxtbx/src/dxtbx/nexus/__init__.py
++++ b/dxtbx/src/dxtbx/nexus/__init__.py
+@@ -440,7 +440,7 @@ def get_dxtbx_detector(
+ material = KNOWN_SENSOR_MATERIALS.get(nxdetector.sensor_material)
+ if not material:
+ raise ValueError(f"Unknown material: {nxdetector.sensor_material}")
+- thickness = nxdetector.sensor_thickness.to("mm").magnitude
++ thickness = float(nxdetector.sensor_thickness.to("mm").magnitude)
+ table = eltbx.attenuation_coefficient.get_table(material)
+ mu = table.mu_at_angstrom(wavelength) / 10.0
+ px_mm = dxtbx.model.ParallaxCorrectedPxMmStrategy(mu, thickness)
+diff --git a/dxtbx/src/dxtbx/util/rotate_and_average.py b/dxtbx/src/dxtbx/util/rotate_and_average.py
+index 61012ea..02fb53e 100644
+--- a/dxtbx/src/dxtbx/util/rotate_and_average.py
++++ b/dxtbx/src/dxtbx/util/rotate_and_average.py
+@@ -16,7 +16,7 @@ def rotate_and_average(data, angle, deg=False, mask=None):
+ ny, nx = np.shape(data)
+
+ xx, yy = np.meshgrid(np.arange(nx), np.arange(ny))
+- xx_yy = np.row_stack((xx.ravel(), yy.ravel()))
++ xx_yy = np.vstack((xx.ravel(), yy.ravel()))
+ R = np.array(((np.cos(angle), -np.sin(angle)), (np.sin(angle), np.cos(angle))))
+ xx_yy_rotated = np.matmul(R, xx_yy)
+ xx_rotated = xx_yy_rotated[0, :].reshape((ny, nx))
+diff --git a/dxtbx/tests/conftest.py b/dxtbx/tests/conftest.py
+index cc1761f..effe2e6 100644
+--- a/dxtbx/tests/conftest.py
++++ b/dxtbx/tests/conftest.py
+@@ -27,9 +27,7 @@ def nxmx_example():
+
+ instrument = entry.create_group("instrument")
+ instrument.attrs["NX_class"] = "NXinstrument"
+- name = instrument.create_dataset(
+- "name", data=np.string_("DIAMOND BEAMLINE I03")
+- )
++ name = instrument.create_dataset("name", data=np.bytes_("DIAMOND BEAMLINE I03"))
+ name.attrs["short_name"] = "I03"
+
+ beam = instrument.create_group("beam")
+diff --git a/dxtbx/tests/format/test_FormatNXmxDLS16M.py b/dxtbx/tests/format/test_FormatNXmxDLS16M.py
+index 56ecc14..a9ba1d2 100644
+--- a/dxtbx/tests/format/test_FormatNXmxDLS16M.py
++++ b/dxtbx/tests/format/test_FormatNXmxDLS16M.py
+@@ -200,11 +200,11 @@ def test_understand(beamline, tmp_path):
+ with h5py.File(nxs, mode="w") as fh:
+ entry = fh.create_group("entry")
+ instrument = entry.create_group("instrument")
+- instrument.attrs["short_name"] = np.string_(f"DLS {beamline}")
++ instrument.attrs["short_name"] = np.bytes_(f"DLS {beamline}")
+ name = instrument.create_dataset(
+- "name", data=np.string_(f"DIAMOND BEAMLINE {beamline}")
++ "name", data=np.bytes_(f"DIAMOND BEAMLINE {beamline}")
+ )
+- name.attrs["short_name"] = np.string_(f"DLS {beamline}")
++ name.attrs["short_name"] = np.bytes_(f"DLS {beamline}")
+ assert FormatNXmxDLS16M.understand(nxs)
+ assert FormatNXmxDLS.understand(nxs)
+
+@@ -216,9 +216,9 @@ def test_understand_legacy(beamline, tmp_path):
+ with h5py.File(nxs, mode="w") as fh:
+ entry = fh.create_group("entry")
+ instrument = entry.create_group("instrument")
+- instrument.attrs["short_name"] = np.string_(f"{beamline}")
+- name = instrument.create_dataset("name", data=np.string_(f"{beamline}"))
+- name.attrs["short_name"] = np.string_(f"{beamline}")
++ instrument.attrs["short_name"] = np.bytes_(f"{beamline}")
++ name = instrument.create_dataset("name", data=np.bytes_(f"{beamline}"))
++ name.attrs["short_name"] = np.bytes_(f"{beamline}")
+ assert FormatNXmxDLS16M.understand(nxs)
+ assert FormatNXmxDLS.understand(nxs)
+
+@@ -236,9 +236,7 @@ def test_do_not_understand_i24(tmp_path):
+ with h5py.File(nxs, mode="w") as fh:
+ entry = fh.create_group("entry")
+ instrument = entry.create_group("instrument")
+- instrument.attrs["short_name"] = np.string_("DLS I24")
+- name = instrument.create_dataset(
+- "name", data=np.string_("DIAMOND BEAMLINE I24")
+- )
+- name.attrs["short_name"] = np.string_("DLS I24")
++ instrument.attrs["short_name"] = np.bytes_("DLS I24")
++ name = instrument.create_dataset("name", data=np.bytes_("DIAMOND BEAMLINE I24"))
++ name.attrs["short_name"] = np.bytes_("DLS I24")
+ assert not FormatNXmxDLS16M.understand(nxs)
+diff --git a/dxtbx/tests/nexus/test_build_dxtbx_models.py b/dxtbx/tests/nexus/test_build_dxtbx_models.py
+index 4f4591c..26fc12b 100644
+--- a/dxtbx/tests/nexus/test_build_dxtbx_models.py
++++ b/dxtbx/tests/nexus/test_build_dxtbx_models.py
+@@ -805,7 +805,7 @@ def test_dataset_as_flex_float():
+ def test_dataset_as_flex_double():
+ slices = ()
+ np_double_types = (
+- np.float_,
++ np.float64,
+ np.double,
+ np.float64,
+ )
+diff --git a/dxtbx/tests/test_flumpy.py b/dxtbx/tests/test_flumpy.py
+index a8d9965..5fc2f2e 100644
+--- a/dxtbx/tests/test_flumpy.py
++++ b/dxtbx/tests/test_flumpy.py
+@@ -217,7 +217,7 @@ def test_reverse_vec3_dtype(dtype):
+ @pytest.mark.parametrize("dtype", [np.int32, np.intc, int])
+ def test_reverse_miller_index(dtype):
+ hkl = np.array([(1, 0, 0), (0, 1, 0), (0, 0, 1)], dtype=dtype)
+- if dtype is int and np.dtype("l").itemsize != np.dtype("i").itemsize:
++ if np.dtype(dtype).itemsize != np.dtype(np.intc).itemsize:
+ with pytest.raises(ValueError):
+ flumpy.miller_index_from_numpy(hkl)
+ else:
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch 1970-01-01 01:00:00.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch 2025-05-29 17:53:19.000000000 +0200
@@ -0,0 +1,20 @@
+From: Roland Mas <lolando at debian.org>
+Date: Thu, 29 May 2025 17:28:46 +0200
+Subject: Fix pip invocation
+
+---
+ dxtbx/libtbx_refresh.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/dxtbx/libtbx_refresh.py b/dxtbx/libtbx_refresh.py
+index eef867e..9981234 100644
+--- a/dxtbx/libtbx_refresh.py
++++ b/dxtbx/libtbx_refresh.py
+@@ -42,6 +42,7 @@ def _install_setup_readonly_fallback(package_name: str):
+ build_path,
+ "--no-build-isolation",
+ "--no-deps",
++ "--ignore-installed",
+ "-e",
+ root_path,
+ ],
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2024-11-20 15:50:35.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2025-05-29 17:53:19.000000000 +0200
@@ -24,3 +24,5 @@
0031-Add-missing-ctdint-header.patch
0032-no-future.patch
0027-Replace-unmaintained-orderedset-with-ordered_set.patch
+0027-Numpy-2-compat-from-upstream.patch
+0028-Fix-pip-invocation.patch
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules 2024-11-20 15:50:35.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules 2025-05-29 15:20:57.000000000 +0200
@@ -8,15 +8,11 @@
export DH_OPTIONS
DPKG_EXPORT_BUILDFLAGS = 1
-include /usr/share/dpkg/buildflags.mk
+include /usr/share/dpkg/default.mk
export DEB_CXXFLAGS_MAINT_APPEND := $(shell pkg-config --cflags hdf5-serial) -DBOOST_TIMER_ENABLE_DEPRECATED=1
export DEB_LDFLAGS_MAINT_APPEND=$(shell pkg-config --libs hdf5-serial)
-# parallel support
-#NPROC ?= $(shell dh_assistant which-build-system| jq .parallel)
-NPROC ?= $(shell nproc) # for backport
-
MODULES = annlib_adaptbx boost_adaptbx cbflib_adaptbx ccp4io_adaptbx cctbx cma_es crys3d dxtbx fable gltbx iotbx libtbx mmtbx omptbx rstbx scitbx serialtbx smtbx spotfinder tbxx wxtbx
#MODULES_TODO = gltbx
MODULES_FAKE = annlib ccp4io
@@ -68,7 +64,7 @@
dh_auto_build --sourcedirectory=dxtbx
# build the cctbx extensions and libraries
- dh_auto_build -- -s custom --build-args="cd {build_dir}_ && ./bin/libtbx.scons -j $(NPROC)"
+ dh_auto_build -- -s custom --build-args="cd {build_dir}_ && ./bin/libtbx.scons $(DEB_BUILD_OPTION_PARALLEL:%=-j %)"
iconv -f ISO-8859-1 -t UTF-8 cctbx/eltbx/covalent_radii.h > covalent_radii.h
mv covalent_radii.h cctbx/eltbx/covalent_radii.h
More information about the debian-science-maintainers
mailing list