Your message dated Tue, 09 Sep 2025 03:46:24 +0000
with message-id <[email protected]>
and subject line Bug#1114394: fixed in specreduce 1.6.0-2
has caused the Debian Bug report #1114394,
regarding specreduce: FTBFS: dh_auto_test: error: pybuild --test --test-pytest 
-i python{version} -p 3.13 returned exit code 13
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1114394: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1114394
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: src:specreduce
Version: 1.6.0-1
Severity: serious
Tags: ftbfs forky sid

Dear maintainer:

During a rebuild of all packages in unstable, your package failed to build.

Below you will find how the build ends (probably the most relevant part,
but not necessarily). If required, the full build log is available here:

https://people.debian.org/~sanvila/build-logs/202509/

About the archive rebuild: The build was made on virtual machines from AWS,
using sbuild and a reduced chroot with only build-essential packages.

If you could not reproduce the bug please contact me privately, as I
am willing to provide ssh access to a virtual machine where the bug is
fully reproducible.

If this is really a bug in one of the build-depends, please use
reassign and add an affects on src:specreduce, so that this is still
visible in the BTS web page for this package.

Thanks.

--------------------------------------------------------------------------------
[...]
 debian/rules clean
dh clean --with python3 --buildsystem=pybuild
   dh_auto_clean -O--buildsystem=pybuild
   dh_autoreconf_clean -O--buildsystem=pybuild
   dh_clean -O--buildsystem=pybuild
 debian/rules binary
dh binary --with python3 --buildsystem=pybuild
   dh_update_autotools_config -O--buildsystem=pybuild
   dh_autoreconf -O--buildsystem=pybuild
   dh_auto_configure -O--buildsystem=pybuild
   dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:129: Building wheel for python3.13 with "build" 
module
I: pybuild base:311: python3.13 -m build --skip-dependency-check --no-isolation 
--wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13  
* Building wheel...

[... snipped ...]

        # Attempt to parse the spectral axis. If none is given, try 
instead to
        # parse a given wcs. This is put into a GWCS object 
to
        # then be used behind-the-scenes for all specutils 
operations.
        if spectral_axis is not 
None:
            # Ensure that the spectral axis is an astropy 
Quantity
            if not 
isinstance(spectral_axis, u.Quantity):
                raise 
ValueError("Spectral axis must be a 
`Quantity` or "
                                 "`SpectralAxis` 
object.")
    
            # If spectral axis is provided as an astropy Quantity, convert 
it
            # to a specutils SpectralAxis 
object.
            if not 
isinstance(spectral_axis, SpectralAxis):
                self._spectral_axis = 
SpectralAxis(
                    spectral_axis, redshift=redshift,
                    radial_velocity=radial_velocity, 
doppler_rest=rest_value,
                    doppler_convention=velocity_convention,
                    bin_specification=bin_specification)
            # If a SpectralAxis object is provided, we assume it doesn't 
need
            # information from other keywords 
added
            else:
                for a in [radial_velocity, 
redshift]:
                    if a is not 
None:
                        raise 
ValueError("Cannot separately set redshift 
or "
                                         "radial_velocity 
if a SpectralAxis "
                                         "object is input 
to spectral_axis")
    
                self._spectral_axis = 
spectral_axis
    
            if wcs is 
None:
                wcs = 
gwcs_from_array(self._spectral_axis,
                                      flux.shape,
                                      
spectral_axis_index=self.spectral_axis_index
                                      )
    
        elif wcs is 
None:
            # If no spectral axis or wcs information is provided, 
initialize
            # with an empty gwcs based on the 
flux.
            if self.spectral_axis_index 
is None:
                if flux.ndim == 
1:
                    self._spectral_axis_index = 
0
                else:
>                   raise 
> ValueError("Must specify 
> spectral_axis_index if no WCS or 
> spectral"
                                     " axis is 
input.")
E                   ValueError: Must specify spectral_axis_index if no 
WCS or spectral axis is input.

/usr/lib/python3/dist-packages/specutils/spectra/spectrum.py:351: 
ValueError
____________ TestMeasureCrossDispersionProfile.test_errors_warnings 
____________

self = <specreduce.tests.test_utils.TestMeasureCrossDispersionProfile object at 
0x7f8286e22050>

    def 
test_errors_warnings(self):
        img = mk_gaussian_img(nrows=10, 
ncols=10)
        with 
pytest.raises(ValueError,
                           match='`crossdisp_axis` must be 
0 or 1'):
            measure_cross_dispersion_profile(img, 
crossdisp_axis=2)
    
        with pytest.raises(ValueError, 
match='`trace` must be Trace object, 
'
                                             'number to 
specify the location '
                                             'of a 
FlatTrace, or None to use '
                                             'center of 
image.'):
>           measure_cross_dispersion_profile(img, 
> trace='not a trace or a 
> number')

specreduce/tests/test_utils.py:147: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
specreduce/utils/utils.py:92: in measure_cross_dispersion_profile
    image = parser._parse_image(image, disp_axis=disp_axis)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
specreduce/core.py:95: in _parse_image
    return self._get_data_from_image(image, 
disp_axis=disp_axis, mask_treatment=mask_treatment)
           
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
specreduce/core.py:155: in _get_data_from_image
    img = Spectrum(
/usr/lib/python3/dist-packages/astropy/utils/decorators.py:143: in 
deprecated_func
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3/dist-packages/specutils/spectra/spectrum.py:960: 
in __init__
    super().__init__(*args, 
**kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'Spectrum1D' object has no attribute '_data'") raised 
in repr()] Spectrum1D object at 0x7f8286c854f0>
flux = <Quantity [[0.04393693, 0.04393693, 0.04393693, 0.04393693, 0.04393693,
            0.04393693, 0.04393693, 0.04393693...23323, 0.96923323, 0.96923323, 
0.96923323,
            0.96923323, 0.96923323, 0.96923323, 0.96923323, 0.96923323]] DN>
spectral_axis = <Quantity [0., 1., 2., 3., 4., 5., 6., 7., 8., 9.] pix>
spectral_axis_index = None, wcs = None, velocity_convention = None
rest_value = None, redshift = None, radial_velocity = None
bin_specification = None, move_spectral_axis = None
kwargs = {'mask': array([[False, False, False, False, False, False, False, 
False, False,
        False],
       [False, False, ..., 1., 1., 1., 1., 1., 1., 1., 1.],
                     [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]), 'unit': 
Unit("DN")}
unknown_kwargs = set(), matching_axes = [0, 1], add_elements = [0, 1], i = 1
add_element = 1

    def __init__(self, 
flux=None, spectral_axis=None, 
spectral_axis_index=None,
                 wcs=None, 
velocity_convention=None, 
rest_value=None,
                 redshift=None, 
radial_velocity=None, 
bin_specification=None,
                 move_spectral_axis=None, 
**kwargs):
    
        if spectral_axis_index == 
-1:
            spectral_axis_index = flux.ndim - 1
    
        # If the flux (data) argument is already a Spectrum (as it 
would
        # be for internal arithmetic operations), avoid setup 
entirely.
        if isinstance(flux, 
Spectrum):
            self._spectral_axis_index = 
flux.spectral_axis_index
            self._spectral_axis = 
flux.spectral_axis
            
super().__init__(flux)
            return
    
        self._spectral_axis_index = 
spectral_axis_index
        # Might as well handle this right away
        if spectral_axis_index is 
None and flux is 
not None:
            if flux.ndim == 1:
                self._spectral_axis_index = 
0
        elif flux is 
None:
            self._spectral_axis_index = 
0
    
        # Check for pre-defined entries in the kwargs 
dictionary.
        unknown_kwargs = set(kwargs).difference(
            {'data', 
'unit', 
'uncertainty', 
'meta', 
'mask', 
'copy',
             
'extra_coords'})
    
        if len(unknown_kwargs) > 
0:
            raise 
ValueError("Initializer contains unknown 
arguments(s): 
{}."
                             
"".format(', 
'.join(map(str, 
unknown_kwargs))))
    
        # Handle initializing from NDCube 
objects
        elif isinstance(flux, 
NDCube):
            if flux.unit is 
None:
                raise 
ValueError("Input NDCube missing unit 
parameter")
    
            # Change the flux array from bare ndarray to a 
Quantity
            q_flux = flux.data << u.Unit(flux.unit)
    
            self.__init__(flux=q_flux, 
wcs=flux.wcs, mask=flux.mask,
                          uncertainty=flux.uncertainty)
            return
    
        # If the mask kwarg is not passed to the constructor, but the flux 
array
        # contains NaNs, add the NaN locations to the 
mask.
        if 
"mask" not 
in kwargs and flux is 
not None:
            nan_mask = np.isnan(flux)
            if nan_mask.any():
                if 
hasattr(self, 
"mask"):
                    
kwargs["mask"] = 
np.logical_or(nan_mask, self.mask)
                else:
                    
kwargs["mask"] = 
nan_mask.copy()
            del nan_mask
    
        # Ensure that the flux argument is an astropy 
quantity
        if flux is not 
None:
            if not 
isinstance(flux, u.Quantity):
                raise 
ValueError("Flux must be a `Quantity` 
object.")
            elif flux.isscalar:
                flux = u.Quantity([flux])
    
        # Ensure that only one or neither of these parameters is 
set
        if redshift is not 
None and radial_velocity is 
not None:
            raise 
ValueError("Cannot set both 
radial_velocity and redshift at "
                             "the same 
time.")
    
        # In cases of slicing, new objects will be initialized with 
`data`
        # instead of ``flux``. Ensure we grab the `data` 
argument.
        if flux is None 
and 'data' 
in kwargs:
            flux = 
kwargs.pop('data')
    
        # Ensure that the unit information codified in the quantity object 
is
        # the One True Unit.
        
kwargs.setdefault('unit', 
flux.unit if isinstance(flux, 
u.Quantity)
                                            else 
kwargs.get('unit'))
    
        # In the case where the arithmetic operation is being performed 
with
        # a single float, int, or array object, just go ahead and ignore 
wcs
        # requirements
        if np.ndim(flux) == 0 
and spectral_axis is None 
and wcs is None:
            super(Spectrum, 
self).__init__(data=flux, wcs=wcs, 
**kwargs)
            return
    
        if rest_value is 
None:
            if hasattr(wcs, 
'rest_frequency') 
and wcs.rest_frequency != 0:
                rest_value = wcs.rest_frequency * u.Hz
            elif hasattr(wcs, 
'rest_wavelength') 
and wcs.rest_wavelength != 0:
                rest_value = wcs.rest_wavelength * u.AA
            elif hasattr(wcs, 
'wcs') and 
hasattr(wcs.wcs, 
'restfrq') and 
wcs.wcs.restfrq > 0:
                rest_value = wcs.wcs.restfrq * u.Hz
            elif hasattr(wcs, 
'wcs') and 
hasattr(wcs.wcs, 
'restwav') and 
wcs.wcs.restwav > 0:
                rest_value = wcs.wcs.restwav * u.m
            else:
                rest_value = None
        else:
            if not 
isinstance(rest_value, u.Quantity):
                warnings.warn("No unit information 
provided with rest value. "
                              f"Assuming 
units of spectral axis 
('{spectral_axis.unit}').")
                rest_value = u.Quantity(rest_value, 
spectral_axis.unit)
            elif not 
rest_value.unit.is_equivalent(u.AA, equivalencies=u.spectral()):
                raise u.UnitsError("Rest 
value must be "
                                   
"energy/wavelength/frequency 
equivalent.")
    
        # If flux and spectral axis are both specified, check that their 
lengths
        # match or are off by one (implying the spectral axis stores bin 
edges).
        # If we can't determine which flux axis corresponds to the 
spectral axis
        # we raise an error.
        if flux is not 
None and spectral_axis is 
not None:
            if spectral_axis_index is 
None:
                if flux.ndim == 
1:
                    self._spectral_axis_index = 
0
                else:
                    matching_axes = []
                    if bin_specification == 
"centers":
                        add_elements = [0,]
                    elif bin_specification == 
"edges":
                        add_elements = [1,]
                    elif bin_specification is 
None:
                        add_elements = 
[0,1]
                    for i in 
range(flux.ndim):
                        for add_element in 
add_elements:
                            if 
spectral_axis.shape[0] == flux.shape[i] + 
add_element:
                                matching_axes.append(i)
    
                    if len(matching_axes) == 
1:
                        self._spectral_axis_index = 
matching_axes[0]
                    else:
>                       raise 
> ValueError("Unable to determine which 
> flux axis corresponds to "
                                         "the spectral 
axis. Please specify 
spectral_axis_index"
                                         " or provide a 
spectral_axis matching a flux axis.")
E                       ValueError: Unable to determine which flux 
axis corresponds to the spectral axis. Please specify spectral_axis_index or 
provide a spectral_axis matching a flux axis.

/usr/lib/python3/dist-packages/specutils/spectra/spectrum.py:213: 
ValueError

During handling of the above exception, another exception occurred:

self = <specreduce.tests.test_utils.TestMeasureCrossDispersionProfile object at 
0x7f8286e22050>

    def 
test_errors_warnings(self):
        img = mk_gaussian_img(nrows=10, 
ncols=10)
        with 
pytest.raises(ValueError,
                           match='`crossdisp_axis` must be 
0 or 1'):
            measure_cross_dispersion_profile(img, 
crossdisp_axis=2)
    
>       with pytest.raises(ValueError, 
> match='`trace` must be Trace object, 
> '
                                             'number to 
specify the location '
                                             'of a 
FlatTrace, or None to use '
                                             'center of 
image.'):
E                                            AssertionError: Regex 
pattern did not match.
E                                             Regex: '`trace` must be 
Trace object, number to specify the location of a FlatTrace, or None to use 
center of image.'
E                                             Input: 'Unable to 
determine which flux axis corresponds to the spectral axis. Please specify 
spectral_axis_index or provide a spectral_axis matching a flux axis.'

specreduce/tests/test_utils.py:143: AssertionError
=========================== short test summary info 
============================
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_fully_masked_column[apply]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_fully_masked_column[propagate]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_fully_masked_column[zero_fill]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_fully_masked_image[apply]
 - AssertionError: Regex pattern did not match.
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_fully_masked_image[propagate]
 - AssertionError: Regex pattern did not match.
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_mask_treatment_bkg_img_spectrum[apply-expected0]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_mask_treatment_bkg_img_spectrum[propagate-expected1]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_mask_treatment_bkg_img_spectrum[zero_fill-expected2]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_background.py::TestMasksBackground::test_sub_bkg_image
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_tracing.py::TestMasksTracing::test_flat_and_basic_trace_mask
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_tracing.py::TestMasksTracing::test_array_trace_masking
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_tracing.py::TestMasksTracing::test_fit_trace_fully_masked_cols[apply]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_tracing.py::TestMasksTracing::test_fit_trace_fully_masked_cols[propagate]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_tracing.py::TestMasksTracing::test_fit_trace_fully_masked_cols[apply_nan_only]
 - ValueError: Unable to determine which flux axis corresponds to the 
spectral...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[10-None]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[10-1]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[10-pixel2]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[9-None]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[9-1]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_measure_cross_dispersion_profile[9-pixel2]
 - ValueError: Must specify spectral_axis_index if no WCS or spectral axis is 
...
FAILED 
specreduce/tests/test_utils.py::TestMeasureCrossDispersionProfile::test_errors_warnings
 - AssertionError: Regex pattern did not match.
ERROR specreduce/tests/test_background.py::test_background - 
ValueError: Must specify spectral_axis_index if no WCS or spectral axis is ...
ERROR 
specreduce/tests/test_background.py::test_warnings_errors - ValueError: 
Must specify spectral_axis_index if no WCS or spectral axis is ...
ERROR 
specreduce/tests/test_image_parsing.py::test_parse_general - 
ValueError: Must specify spectral_axis_index if no WCS or spectral axis is ...
ERROR specreduce/tests/test_image_parsing.py::test_parse_horne 
- ValueError: Must specify spectral_axis_index if no WCS or spectral axis is ...
============= 21 failed, 55 passed, 24 
skipped, 4 errors in 2.95s ==============
E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13/build; python3.13 -m pytest 
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.13 
returned exit code 13
make: *** [debian/rules:7: binary] Error 25
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
--------------------------------------------------------------------------------

--- End Message ---
--- Begin Message ---
Source: specreduce
Source-Version: 1.6.0-2
Done: Ole Streicher <[email protected]>

We believe that the bug you reported is fixed in the latest version of
specreduce, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Ole Streicher <[email protected]> (supplier of updated specreduce package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Mon, 08 Sep 2025 22:39:39 +0200
Source: specreduce
Architecture: source
Version: 1.6.0-2
Distribution: unstable
Urgency: medium
Maintainer: Debian Astronomy Team 
<[email protected]>
Changed-By: Ole Streicher <[email protected]>
Closes: 1114394
Changes:
 specreduce (1.6.0-2) unstable; urgency=medium
 .
   * Enforce specutils version number >= 2 in test (Closes: #1114394)
Checksums-Sha1:
 b5ec3e48fa1605f8328e03e929bb9f1d38cd917a 2379 specreduce_1.6.0-2.dsc
 c35db7853f7558488e23a31991bb4fdc9ea03dd7 4468 specreduce_1.6.0-2.debian.tar.xz
Checksums-Sha256:
 24365c7e7c9db9c45b494ea123bd07e07803e0665b1da080edaa278dc430b16c 2379 
specreduce_1.6.0-2.dsc
 b4bb8a5dab8b59a5f9586fa47c54a56839aa7a43941de5aadc42fd1d38eccd5b 4468 
specreduce_1.6.0-2.debian.tar.xz
Files:
 5e9043eb7878440eaca8162240858b82 2379 python optional specreduce_1.6.0-2.dsc
 d5ccdded5691f7b18cca141ba2cf610c 4468 python optional 
specreduce_1.6.0-2.debian.tar.xz

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEE7/BpV0Ra2/h0L3qtmk9WvbkOGL0FAmi/Q+QACgkQmk9WvbkO
GL1ZxA//dO8egjEXC8lG9RvcSjnq/91OcHrBTmi60iQ5p5zcu/NgoIk8AcHEhxKr
9iwxd9+CeYyKps28CaS5PnexX6V6/hUFayhc456j8rt507gzCu06sruMtnveToZM
UXf5bgcM9B+yQiQZyoKnLtHJ7uwyC0fSI7OxPpprin84SZ2VUtr4gL8xuOXEyIiT
CAqMciXa2va9m9Ta5M6mhoi7w6u6j7N1tynLrrb6zfenqd5zAVUf9uuS7MdAQYdN
hDJFoYR9LijAiT5AmgoQVpiIWt7M+JeKK2O7yJY3j9diOxMgXCXhe0Kbn7Aa4hFm
SrWkuguQeFvOI4+m1fcjKNmxx/CWZ73sFWRyz+fiWNd5NX/u+Z87tPKsaQVmHkug
AkxlRo0tgJVhahRR9HObtpNZvtpZLMTvyAkedgXAXkqkbNr8aLy6VNLjL1PXMqsH
VikAcaRqLujJ5bxV4AbSFu+fM8G3mTGejiG513q1rN0b28aDkwHxPTIgV1TLtE1f
kRssf1jBUdvWur4zgXTOMEtVrws/+Oi93lTo/Ws5Mxm4g428wI/v+bTC6LrD0gSK
HDHuIMJT+n6MBezq3rEUNkjdrce8t8rzRxe/0yedidDOPmB0F6TKqi0wu61LZgBJ
Cg98wB839vNfb56qK15SPT7jIXOadlYiS0Ktr40ey/06yaeKHOI=
=cwQG
-----END PGP SIGNATURE-----

Attachment: pgpHQOafj9Iqx.pgp
Description: PGP signature


--- End Message ---

Reply via email to