#1139419 python-yalexs: FTBFS with aiohttp 3.14

Package:
src:python-yalexs
Source:
src:python-yalexs
Submitter:
Santiago Vila
Date:
2026-06-17 09:07:02 UTC
Severity:
normal
Tags:
#1139419#5
Date:
2026-06-08 23:15:00 UTC
From:
To:
Dear maintainer:

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

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

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

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 cannot 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:python-yalexs, so that this is still
visible in the BTS web page for this package.

Thanks.
--------------------------------------------------------------------------------
[...]
 debian/rules clean
dh clean --buildsystem=pybuild
   dh_auto_clean -O--buildsystem=pybuild
   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
   dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:142: Building wheel for python3.14 with "build" module
I: pybuild base:385: python3.14 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.14

[... snipped ...]

request_headers = {'Accept-Version': '0.0.1', 'Content-Type': 'application/json; charset=UTF-8', 'x-august-api-key': 'd9984f29-07a6-816e-e1c9-44ec9d1be431', 'x-august-branding': 'august', ...}
status = 200
body = b'{"expiresAt": "2026-07-08 22:07:09.603Z", "vPassword": true, "vInstallId": true}'
content_type = 'application/json', payload = None
headers = {'x-august-access-token': 'fresh_token'}
response_class = <class 'aiohttp.client_reqrep.ClientResponse'>, reason = 'OK'

    def _build_response(self, url: 'Union[URL, str]',
                        method: str = hdrs.METH_GET,
                        request_headers: Optional[Dict] = None,
                        status: int = 200,
                        body: Union[str, bytes] = '',
                        content_type: str = 'application/json',
                        payload: Optional[Dict] = None,
                        headers: Optional[Dict] = None,
                        response_class: Optional[Type[ClientResponse]] = None,
                        reason: Optional[str] = None) -> ClientResponse:
        if response_class is None:
            response_class = ClientResponse
        if payload is not None:
            body = json.dumps(payload)
        if not isinstance(body, bytes):
            body = str.encode(body)
        if request_headers is None:
            request_headers = {}
        loop = Mock()
        loop.get_debug = Mock()
        loop.get_debug.return_value = True
        kwargs = {}  # type: Dict[str, Any]
        kwargs['request_info'] = RequestInfo(
            url=url,
            method=method,
            headers=CIMultiDictProxy(CIMultiDict(**request_headers)),
        )
        kwargs['writer'] = None
        kwargs['continue100'] = None
        kwargs['timer'] = TimerNoop()
        kwargs['traces'] = []
        kwargs['loop'] = loop
        kwargs['session'] = None

        # We need to initialize headers manually
        _headers = CIMultiDict({hdrs.CONTENT_TYPE: content_type})
        if headers:
            _headers.update(headers)
        raw_headers = self._build_raw_headers(_headers)
/usr/lib/python3/dist-packages/aioresponses/core.py:171: TypeError
                    ACCESS_TOKEN, serial_number
                )

tests/test_capabilities.py:65:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
yalexs/api_async.py:246: in async_get_lock_capabilities
    response = await self._async_dict_to_api(
yalexs/api_async.py:503: in _async_dict_to_api
    response = await self._aiohttp_session.request(method, url, **api_dict)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<string>:3: in _request
    ???
/usr/lib/python3.13/unittest/mock.py:2332: in _execute_mock_call
    result = await effect(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3/dist-packages/aioresponses/core.py:512: in _request_mock
    response = await self.match(method, url, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3/dist-packages/aioresponses/core.py:456: in match
    response_or_exc = await matcher.build_response(
/usr/lib/python3/dist-packages/aioresponses/core.py:202: in build_response
    resp = self._build_response(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <aioresponses.core.RequestMatch object at 0x7f74b86bcdd0>
url = URL('https://api-production.august.com/devices/capabilities?serialNumber=TEST123&topLevelHost=true')
method = 'get'
request_headers = {'Accept-Version': '0.0.1', 'Content-Type': 'application/json; charset=UTF-8', 'x-august-access-token': 'test-token', 'x-august-api-key': 'd9984f29-07a6-816e-e1c9-44ec9d1be431', ...}
status = 200
body = b'{"lock": {"concurrentBLE": 2, "batteryType": "AA", "doorSense": true, "hasMagnetometer": false, "hasIntegratedWiFi":... true, "supportsFingerprintOnlyAccess": true, "batteryLifeMS": 21513600000, "supportedPartners": [], "unlatch": true}}'
content_type = 'application/json'
payload = {'lock': {'batteryLifeMS': 21513600000, 'batteryType': 'AA', 'bluetooth': True, 'concurrentBLE': 2, ...}}
headers = None, response_class = <class 'aiohttp.client_reqrep.ClientResponse'>
reason = 'OK'

    def _build_response(self, url: 'Union[URL, str]',
                        method: str = hdrs.METH_GET,
                        request_headers: Optional[Dict] = None,
                        status: int = 200,
                        body: Union[str, bytes] = '',
                        content_type: str = 'application/json',
                        payload: Optional[Dict] = None,
                        headers: Optional[Dict] = None,
                        response_class: Optional[Type[ClientResponse]] = None,
                        reason: Optional[str] = None) -> ClientResponse:
        if response_class is None:
            response_class = ClientResponse
        if payload is not None:
            body = json.dumps(payload)
        if not isinstance(body, bytes):
            body = str.encode(body)
        if request_headers is None:
            request_headers = {}
        loop = Mock()
        loop.get_debug = Mock()
        loop.get_debug.return_value = True
        kwargs = {}  # type: Dict[str, Any]
        kwargs['request_info'] = RequestInfo(
            url=url,
            method=method,
            headers=CIMultiDictProxy(CIMultiDict(**request_headers)),
        )
        kwargs['writer'] = None
        kwargs['continue100'] = None
        kwargs['timer'] = TimerNoop()
        kwargs['traces'] = []
        kwargs['loop'] = loop
        kwargs['session'] = None

        # We need to initialize headers manually
        _headers = CIMultiDict({hdrs.CONTENT_TYPE: content_type})
        if headers:
            _headers.update(headers)
        raw_headers = self._build_raw_headers(_headers)
/usr/lib/python3/dist-packages/aioresponses/core.py:171: TypeError
=============================== warnings summary ===============================
tests/test_authenticator_common.py::test_process_refreshed_access_token_with_exp
tests/test_authenticator_common.py::test_process_refreshed_access_token_missing_exp_warns
  /usr/lib/python3/dist-packages/jwt/api_jwt.py:147: InsecureKeyLengthWarning: The HMAC key is 6 bytes long, which is below the minimum recommended length of 32 bytes for SHA256. See RFC 7518 Section 3.2.
    return self._jws.encode(

#1139419#14
Date:
2026-06-17 09:05:27 UTC
From:
To:
We believe that the bug you reported is fixed in the latest version of
python-yalexs, 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 1139419@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Edward Betts <edward@4angle.com> (supplier of updated python-yalexs 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 ftpmaster@ftp-master.debian.org)
Format: 1.8
Date: Wed, 17 Jun 2026 08:54:05 +0100
Source: python-yalexs
Architecture: source
Version: 9.2.9-1
Distribution: unstable
Urgency: medium
Maintainer: Home Assistant Team <team+homeassistant@tracker.debian.org>
Changed-By: Edward Betts <edward@4angle.com>
Closes: 1139419
Changes:
 python-yalexs (9.2.9-1) unstable; urgency=medium
 .
   * New upstream release.
   * Upstream switched from aioresponses to aiointercept. (Closes: #1139419)
Checksums-Sha1:
 c7c97bd44b4255bed0e18a0e247d43334868dfaf 2939 python-yalexs_9.2.9-1.dsc
 ca329e136c734b0d937196e64935ab5f6f4c6fbc 159124 python-yalexs_9.2.9.orig.tar.xz
 d3b838722970a975906e128ede2737dbd36ed037 2848 python-yalexs_9.2.9-1.debian.tar.xz
 d3d4edff9be6b99e0c5f70cc96db9af4a7b0acbf 422080 python-yalexs_9.2.9-1.git.tar.xz
 f729963f3d895e48f5bd4ca757875a33c77767af 17512 python-yalexs_9.2.9-1_source.buildinfo
Checksums-Sha256:
 bbd0d771253dae870af5e0a0220fe5d4354c030b400064c945bd682309e11b71 2939 python-yalexs_9.2.9-1.dsc
 1a91d21e4f626896a8fec3cdffc893cb3c9ff2c0690c37895d0de8aa42254a8a 159124 python-yalexs_9.2.9.orig.tar.xz
 bd968b664b3b26e4ecd7caff2747da8d98f692a5bc798ba7ae2a1b79b5d906e3 2848 python-yalexs_9.2.9-1.debian.tar.xz
 a903846ec1477945cc5ec2289a354d36ce6e38f21d35cee7d8ea32bf6defd289 422080 python-yalexs_9.2.9-1.git.tar.xz
 4ac32cf25eeda96c95ee45ba1015b2419ebb04bd360182fcdd69c3e78c9d809d 17512 python-yalexs_9.2.9-1_source.buildinfo
Files:
 677bde97ba83286c456da40ac77a0b2d 2939 python optional python-yalexs_9.2.9-1.dsc
 fbeec2e33e4c2a459c94f1c49a483aee 159124 python optional python-yalexs_9.2.9.orig.tar.xz
 871a153e271310316848c439ead93bf1 2848 python optional python-yalexs_9.2.9-1.debian.tar.xz
 dd1cc4754df5bde8c4df987cf9d6b140 422080 python None python-yalexs_9.2.9-1.git.tar.xz
 a43cf95102ae5d2275a6142ea776b2cf 17512 python optional python-yalexs_9.2.9-1_source.buildinfo
Git-Tag-Info: tag=812004712ce4a48774ca3bb161840d3832597684 fp=fb8acfa78c726089c38ad0269605a1098c63b92a
Git-Tag-Tagger: Edward Betts <edward@4angle.com>
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEN02M5NuW6cvUwJcqYG0ITkaDwHkFAmoyXdQACgkQYG0ITkaD
wHmQow//RovI07MlvNGON0DCMnb4bIL5Jh2LYPA6sik2hHHQtu6HIPvCRGczY3ge
vakVTPFXRktBLJc6QBGPmbZJyx7RPGyevaaVPYbMKJj0qkyNz2cbsFafrdh3PWsW
IJUY7+9/nV0G/ZsHQ56zgsZxcHWcCMG5khTTWTWfe2IOSzIRZmASWyoeGqdVUQwK
59xU3/qk4aRyudsN2zbA95HG3U5fxQOvrRL5dL/KPTGTCqUL66e6D/BGNddf6Bwh
WN8Gv124JMve8iqVqyNGBASosCLH9ShlT0BH4dDqnuA+Xx8hAkMue6mnLrMM3sVu
rpLLTpJJrWcPHifN+zg4V6PvqkJR1quWdEgi/PQGpD56SldOLVPhEcT0GieKwz4A
5yJ3gGEq/JMidjQqwpVHPUFPQsiSdtHhlhHCyAFwwhI2a4X6jFJCU0kVZCKsXjzE
RiqGCSN00C0W2d9mPMQIjLsoEfh3dW8DZnl3ageNa+S9sljUeVjjw0NoXvvXkago
BFxpnmZU1F+JsZRj50xNgy2k0uJSfHB4wbOcNj+02cCYYg2B2ci7wDMeTjmp64x4
i/HvmtZnQV2pmVOhyKcO9Vuw586Y4fsYo/R/Q4LXiFVhdJh7OCBfWGWC6h4vM+PS
Pl+D0wL2WdMALNqlGao2e2UR9W4HgnhN/wECa14gzwE6r3ePMHs=
=9h5X
-----END PGP SIGNATURE-----