Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: cc...@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
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 <lola...@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 <lola...@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 <lola...@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
 

Reply via email to