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.