--- Begin Message ---
Package: src:pyecoforest
Version: 0.4.0-2
Severity: serious
Tags: ftbfs trixie sid
Dear maintainer:
During a rebuild of all packages in unstable, your package failed to build:
--------------------------------------------------------------------------------
[...]
debian/rules clean
dh clean --buildsystem=pybuild
debian/rules override_dh_auto_clean
make[1]: Entering directory '/<<PKGBUILDDIR>>'
dh_auto_clean
rm -rf pyecoforest.egg-info/ docs/_build
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
dh_autoreconf_clean -O--buildsystem=pybuild
dh_clean -O--buildsystem=pybuild
debian/rules binary
dh binary --buildsystem=pybuild
dh_update_autotools_config -O--buildsystem=pybuild
dh_autoreconf -O--buildsystem=pybuild
dh_auto_configure -O--buildsystem=pybuild
[... snipped ...]
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
_ test_get_errors[side_effect1-EcoforestConnectionError-Timeout occurred while
connecting to the device.] _
side_effect = TimeoutException('timeout')
expected = <class 'pyecoforest.exceptions.EcoforestConnectionError'>
message = 'Timeout occurred while connecting to the device.'
@pytest.mark.asyncio
@respx.mock
@pytest.mark.parametrize(
("side_effect", "expected", "message"),
[
(
httpx.Response(401),
EcoforestAuthenticationRequired,
"401",
),
(
httpx.TimeoutException("timeout"),
EcoforestConnectionError,
"Timeout occurred while connecting to the device.",
),
(
httpx.Response(500),
EcoforestConnectionError,
"Error occurred while communicating with device.",
),
],
)
async def test_get_errors(side_effect, expected, message):
"""Get status information with error."""
target = _get_target()
respx.post(path=URL_CGI, data={"idOperacion": API_STATUS_OP}).mock(
side_effect=side_effect
)
respx.post(path=URL_CGI, data={"idOperacion": API_STATS_OP}).mock(
side_effect=side_effect
)
respx.post(path=URL_CGI, data={"idOperacion": API_ALARMS_OP}).mock(
side_effect=side_effect
)
with pytest.raises(expected) as err:
> await target.get()
tests/test_api.py:126:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pyecoforest/api.py:48: in get
"status": await self._status(),
pyecoforest/api.py:111: in _status
return await self._request(data={"idOperacion": API_STATUS_OP})
pyecoforest/api.py:79: in _request
response = await self._client.post(
/usr/lib/python3/dist-packages/httpx/_client.py:1859: in post
return await self.request(
/usr/lib/python3/dist-packages/httpx/_client.py:1540: in request
return await self.send(request, auth=auth,
follow_redirects=follow_redirects)
/usr/lib/python3/dist-packages/httpx/_client.py:1629: in send
response = await self._send_handling_auth(
/usr/lib/python3/dist-packages/httpx/_client.py:1657: in _send_handling_auth
response = await self._send_handling_redirects(
/usr/lib/python3/dist-packages/httpx/_client.py:1694: in
_send_handling_redirects
response = await self._send_single_request(request)
/usr/lib/python3/dist-packages/httpx/_client.py:1730: in _send_single_request
response = await transport.handle_async_request(request)
/usr/lib/python3/dist-packages/httpx/_transports/default.py:394: in
handle_async_request
resp = await self._pool.handle_async_request(req)
/usr/lib/python3/dist-packages/respx/mocks.py:190: in amock
response = await cls._send_async_request(
/usr/lib/python3/dist-packages/respx/mocks.py:224: in _send_async_request
httpx_response = await cls.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/mocks.py:136: in async_handler
raise assertion_error
/usr/lib/python3/dist-packages/respx/mocks.py:129: in async_handler
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
_ test_get_errors[side_effect2-EcoforestConnectionError-Error occurred while
communicating with device.] _
side_effect = <Response [500 Internal Server Error]>
expected = <class 'pyecoforest.exceptions.EcoforestConnectionError'>
message = 'Error occurred while communicating with device.'
@pytest.mark.asyncio
@respx.mock
@pytest.mark.parametrize(
("side_effect", "expected", "message"),
[
(
httpx.Response(401),
EcoforestAuthenticationRequired,
"401",
),
(
httpx.TimeoutException("timeout"),
EcoforestConnectionError,
"Timeout occurred while connecting to the device.",
),
(
httpx.Response(500),
EcoforestConnectionError,
"Error occurred while communicating with device.",
),
],
)
async def test_get_errors(side_effect, expected, message):
"""Get status information with error."""
target = _get_target()
respx.post(path=URL_CGI, data={"idOperacion": API_STATUS_OP}).mock(
side_effect=side_effect
)
respx.post(path=URL_CGI, data={"idOperacion": API_STATS_OP}).mock(
side_effect=side_effect
)
respx.post(path=URL_CGI, data={"idOperacion": API_ALARMS_OP}).mock(
side_effect=side_effect
)
with pytest.raises(expected) as err:
> await target.get()
tests/test_api.py:126:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pyecoforest/api.py:48: in get
"status": await self._status(),
pyecoforest/api.py:111: in _status
return await self._request(data={"idOperacion": API_STATUS_OP})
pyecoforest/api.py:79: in _request
response = await self._client.post(
/usr/lib/python3/dist-packages/httpx/_client.py:1859: in post
return await self.request(
/usr/lib/python3/dist-packages/httpx/_client.py:1540: in request
return await self.send(request, auth=auth,
follow_redirects=follow_redirects)
/usr/lib/python3/dist-packages/httpx/_client.py:1629: in send
response = await self._send_handling_auth(
/usr/lib/python3/dist-packages/httpx/_client.py:1657: in _send_handling_auth
response = await self._send_handling_redirects(
/usr/lib/python3/dist-packages/httpx/_client.py:1694: in
_send_handling_redirects
response = await self._send_single_request(request)
/usr/lib/python3/dist-packages/httpx/_client.py:1730: in _send_single_request
response = await transport.handle_async_request(request)
/usr/lib/python3/dist-packages/httpx/_transports/default.py:394: in
handle_async_request
resp = await self._pool.handle_async_request(req)
/usr/lib/python3/dist-packages/respx/mocks.py:190: in amock
response = await cls._send_async_request(
/usr/lib/python3/dist-packages/respx/mocks.py:224: in _send_async_request
httpx_response = await cls.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/mocks.py:136: in async_handler
raise assertion_error
/usr/lib/python3/dist-packages/respx/mocks.py:129: in async_handler
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
_____________________________ test_set_temperature _____________________________
@pytest.mark.asyncio
@respx.mock
async def test_set_temperature():
"""Set target temperature."""
target = _get_target()
respx.post(path=URL_CGI, data={"idOperacion": API_STATUS_OP}).mock(
return_value=httpx.Response(
200,
text=_mutate_fixture(
"op-1002-status.txt",
[("consigna_temperatura=20.5",
"consigna_temperatura=23.5")],
),
)
)
respx.post(path=URL_CGI, data={"idOperacion": API_STATS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1020-stats.txt"))
)
respx.post(path=URL_CGI, data={"idOperacion": API_ALARMS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1079-alarms.txt"))
)
respx.post(
path=URL_CGI, data={"idOperacion": API_SET_TEMP_OP, "temperatura":
23.5}
).mock(return_value=httpx.Response(200,
text=_load_fixture("op-1019-set-temp.txt")))
> actual = await target.set_temperature(23.5)
tests/test_api.py:154:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pyecoforest/api.py:63: in set_temperature
await self._request(
pyecoforest/api.py:79: in _request
response = await self._client.post(
/usr/lib/python3/dist-packages/httpx/_client.py:1859: in post
return await self.request(
/usr/lib/python3/dist-packages/httpx/_client.py:1540: in request
return await self.send(request, auth=auth,
follow_redirects=follow_redirects)
/usr/lib/python3/dist-packages/httpx/_client.py:1629: in send
response = await self._send_handling_auth(
/usr/lib/python3/dist-packages/httpx/_client.py:1657: in _send_handling_auth
response = await self._send_handling_redirects(
/usr/lib/python3/dist-packages/httpx/_client.py:1694: in
_send_handling_redirects
response = await self._send_single_request(request)
/usr/lib/python3/dist-packages/httpx/_client.py:1730: in _send_single_request
response = await transport.handle_async_request(request)
/usr/lib/python3/dist-packages/httpx/_transports/default.py:394: in
handle_async_request
resp = await self._pool.handle_async_request(req)
/usr/lib/python3/dist-packages/respx/mocks.py:190: in amock
response = await cls._send_async_request(
/usr/lib/python3/dist-packages/respx/mocks.py:224: in _send_async_request
httpx_response = await cls.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/mocks.py:136: in async_handler
raise assertion_error
/usr/lib/python3/dist-packages/respx/mocks.py:129: in async_handler
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
________________________________ test_set_power ________________________________
@pytest.mark.asyncio
@respx.mock
async def test_set_power():
"""Set target power."""
target = _get_target()
respx.post(path=URL_CGI, data={"idOperacion": API_STATUS_OP}).mock(
return_value=httpx.Response(
200,
text=_mutate_fixture(
"op-1002-status.txt", [("consigna_potencia=3",
"consigna_potencia=5")]
),
)
)
respx.post(path=URL_CGI, data={"idOperacion": API_STATS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1020-stats.txt"))
)
respx.post(path=URL_CGI, data={"idOperacion": API_ALARMS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1079-alarms.txt"))
)
respx.post(
path=URL_CGI, data={"idOperacion": API_SET_POWER_OP, "potencia": 5}
).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1004-set-power.txt"))
)
> actual = await target.set_power(5)
tests/test_api.py:210:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pyecoforest/api.py:70: in set_power
await self._request(data={"idOperacion": API_SET_POWER_OP, "potencia":
target})
pyecoforest/api.py:79: in _request
response = await self._client.post(
/usr/lib/python3/dist-packages/httpx/_client.py:1859: in post
return await self.request(
/usr/lib/python3/dist-packages/httpx/_client.py:1540: in request
return await self.send(request, auth=auth,
follow_redirects=follow_redirects)
/usr/lib/python3/dist-packages/httpx/_client.py:1629: in send
response = await self._send_handling_auth(
/usr/lib/python3/dist-packages/httpx/_client.py:1657: in _send_handling_auth
response = await self._send_handling_redirects(
/usr/lib/python3/dist-packages/httpx/_client.py:1694: in
_send_handling_redirects
response = await self._send_single_request(request)
/usr/lib/python3/dist-packages/httpx/_client.py:1730: in _send_single_request
response = await transport.handle_async_request(request)
/usr/lib/python3/dist-packages/httpx/_transports/default.py:394: in
handle_async_request
resp = await self._pool.handle_async_request(req)
/usr/lib/python3/dist-packages/respx/mocks.py:190: in amock
response = await cls._send_async_request(
/usr/lib/python3/dist-packages/respx/mocks.py:224: in _send_async_request
httpx_response = await cls.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/mocks.py:136: in async_handler
raise assertion_error
/usr/lib/python3/dist-packages/respx/mocks.py:129: in async_handler
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
__________________________________ test_turn ___________________________________
@pytest.mark.asyncio
@respx.mock
async def test_turn():
"""Turn on device status."""
target = _get_target()
respx.post(path=URL_CGI, data={"idOperacion": API_STATUS_OP}).mock(
return_value=httpx.Response(
200,
text=_mutate_fixture(
"op-1002-status.txt",
[("on_off=0", "on_off=1"), ("estado=0", "estado=1")],
),
)
)
respx.post(path=URL_CGI, data={"idOperacion": API_STATS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1020-stats.txt"))
)
respx.post(path=URL_CGI, data={"idOperacion": API_ALARMS_OP}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1079-alarms.txt"))
)
respx.post(path=URL_CGI, data={"idOperacion": API_SET_STATE_OP,
"on_off": 1}).mock(
return_value=httpx.Response(200,
text=_load_fixture("op-1004-set-power.txt"))
)
> actual = await target.turn(True)
tests/test_api.py:265:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pyecoforest/api.py:56: in turn
await self._request(
pyecoforest/api.py:79: in _request
response = await self._client.post(
/usr/lib/python3/dist-packages/httpx/_client.py:1859: in post
return await self.request(
/usr/lib/python3/dist-packages/httpx/_client.py:1540: in request
return await self.send(request, auth=auth,
follow_redirects=follow_redirects)
/usr/lib/python3/dist-packages/httpx/_client.py:1629: in send
response = await self._send_handling_auth(
/usr/lib/python3/dist-packages/httpx/_client.py:1657: in _send_handling_auth
response = await self._send_handling_redirects(
/usr/lib/python3/dist-packages/httpx/_client.py:1694: in
_send_handling_redirects
response = await self._send_single_request(request)
/usr/lib/python3/dist-packages/httpx/_client.py:1730: in _send_single_request
response = await transport.handle_async_request(request)
/usr/lib/python3/dist-packages/httpx/_transports/default.py:394: in
handle_async_request
resp = await self._pool.handle_async_request(req)
/usr/lib/python3/dist-packages/respx/mocks.py:190: in amock
response = await cls._send_async_request(
/usr/lib/python3/dist-packages/respx/mocks.py:224: in _send_async_request
httpx_response = await cls.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/mocks.py:136: in async_handler
raise assertion_error
/usr/lib/python3/dist-packages/respx/mocks.py:129: in async_handler
httpx_response = await router.async_handler(httpx_request)
/usr/lib/python3/dist-packages/respx/router.py:318: in async_handler
resolved = await self.aresolve(request)
/usr/lib/python3/dist-packages/respx/router.py:291: in aresolve
with self.resolver(request) as resolved:
/usr/lib/python3.13/contextlib.py:148: in __exit__
next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <respx.router.MockRouter object at 0x7f629f6afe00>
request = <Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')>
@contextmanager
def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute,
None, None]:
resolved = ResolvedRoute()
try:
yield resolved
if resolved.route is None:
# Assert we always get a route match, if check is enabled
if self._assert_all_mocked:
> raise AllMockedAssertionError(f"RESPX: {request!r} not
> mocked!")
E respx.models.AllMockedAssertionError: RESPX:
<Request(b'POST', 'http://127.0.0.1/recepcion_datos_4.cgi')> not mocked!
/usr/lib/python3/dist-packages/respx/router.py:250: AllMockedAssertionError
=========================== short test summary info ============================
FAILED tests/test_api.py::test_get - respx.models.AllMockedAssertionError: RE...
FAILED
tests/test_api.py::test_get_errors[side_effect0-EcoforestAuthenticationRequired-401]
FAILED
tests/test_api.py::test_get_errors[side_effect1-EcoforestConnectionError-Timeout
occurred while connecting to the device.]
FAILED
tests/test_api.py::test_get_errors[side_effect2-EcoforestConnectionError-Error
occurred while communicating with device.]
FAILED tests/test_api.py::test_set_temperature - respx.models.AllMockedAssert...
FAILED tests/test_api.py::test_set_power - respx.models.AllMockedAssertionErr...
FAILED tests/test_api.py::test_turn - respx.models.AllMockedAssertionError: R...
========================= 7 failed, 5 passed in 0.43s ==========================
E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_pyecoforest/build; python3.13 -m pytest
--no-cov
dh_auto_test: error: pybuild --test -i python{version} -p 3.13 returned exit
code 13
make: *** [debian/rules:8: binary] Error 25
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
--------------------------------------------------------------------------------
The above is just how the build ends and not necessarily the most relevant part.
If required, the full build log is available here:
https://people.debian.org/~sanvila/build-logs/202503/
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:pyecoforest, so that this is still
visible in the BTS web page for this package.
Thanks.
--- End Message ---