Warning: Permanently added '2620:52:3:1:dead:beef:cafe:c1cb' (ED25519) to the list of known hosts. Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs/python-cattrs.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1747236112.876906 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 6.1 starting (python version = 3.13.0, NVR = mock-6.1-1.fc41), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs/python-cattrs.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1747236112.876906 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs/python-cattrs.spec) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Mock Version: 6.1 INFO: Mock Version: 6.1 Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (fallback) INFO: Buildroot is handled by package management from host and used with --installroot: rpm-4.20.1-1.fc41.x86_64 rpm-sequoia-1.7.0-2.fc41.x86_64 python3-dnf-4.23.0-1.fc41.noarch python3-dnf-plugins-core-4.10.1-1.fc41.noarch dnf5-5.2.13.1-1.fc41.x86_64 dnf5-plugins-5.2.13.1-1.fc41.x86_64 Start: installing minimal buildroot with dnf5 Updating and loading repositories: fedora 100% | 750.9 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 31.4 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 23.6 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 13.7 MiB/s | 5.0 MiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash x86_64 5.2.37-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.2 MiB bzip2 x86_64 1.0.8-20.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 99.3 KiB coreutils x86_64 9.7-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 5.4 MiB cpio x86_64 2.15-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 MiB diffutils x86_64 3.12-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB fedora-release-common noarch 43-0.15 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 20.4 KiB findutils x86_64 1:4.10.0-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 MiB gawk x86_64 5.3.2-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 MiB glibc-minimal-langpack x86_64 2.41.9000-13.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B grep x86_64 3.12-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB gzip x86_64 1.13-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 392.9 KiB info x86_64 7.2-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 357.9 KiB patch x86_64 2.8-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 226.8 KiB redhat-rpm-config noarch 343-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 181.5 KiB rpm-build x86_64 5.99.90-5.fc43 copr_base 281.7 KiB sed x86_64 4.9-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 857.3 KiB shadow-utils x86_64 2:4.17.4-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.0 MiB tar x86_64 2:1.35-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.0 MiB unzip x86_64 6.0-66.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 390.3 KiB util-linux x86_64 2.41-2.fc43 copr_base 3.5 MiB which x86_64 2.23-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.4 KiB xz x86_64 1:5.8.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 MiB Installing dependencies: add-determinism x86_64 0.6.0-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.5 MiB alternatives x86_64 1.33-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 62.2 KiB ansible-srpm-macros noarch 1-17.1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 35.7 KiB audit-libs x86_64 4.0.3-2.fc43 copr_base 347.1 KiB binutils x86_64 2.44-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 25.9 MiB build-reproducibility-srpm-macros noarch 0.6.0-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 735.0 B bzip2-libs x86_64 1.0.8-20.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 84.6 KiB ca-certificates noarch 2024.2.69_v8.0.401-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.6 MiB coreutils-common x86_64 9.7-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 11.3 MiB crypto-policies noarch 20250402-2.git86c0178.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 141.5 KiB curl x86_64 8.14.0~rc1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 473.2 KiB cyrus-sasl-lib x86_64 2.1.28-30.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB debugedit x86_64 5.1-6.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 192.7 KiB dwz x86_64 0.15-9.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 291.0 KiB ed x86_64 1.21-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 146.5 KiB efi-srpm-macros noarch 6-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 40.1 KiB elfutils x86_64 0.193-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.9 MiB elfutils-debuginfod-client x86_64 0.193-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.9 KiB elfutils-default-yama-scope noarch 0.193-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 KiB elfutils-libelf x86_64 0.193-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.2 MiB elfutils-libs x86_64 0.193-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 683.4 KiB fedora-gpg-keys noarch 43-0.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 129.0 KiB fedora-release noarch 43-0.15 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B fedora-release-identity-basic noarch 43-0.15 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 664.0 B fedora-repos noarch 43-0.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.9 KiB fedora-repos-rawhide noarch 43-0.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 KiB file x86_64 5.46-1.fc43 copr_base 100.2 KiB file-libs x86_64 5.46-1.fc43 copr_base 11.9 MiB filesystem x86_64 3.18-44.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 112.0 B filesystem-srpm-macros noarch 3.18-44.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.2 KiB fonts-srpm-macros noarch 1:2.0.5-21.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 55.8 KiB forge-srpm-macros noarch 0.4.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.9 KiB fpc-srpm-macros noarch 1.3-14.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 144.0 B gdb-minimal x86_64 16.3-1.fc43 copr_base 13.2 MiB gdbm-libs x86_64 1:1.23-9.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 129.9 KiB ghc-srpm-macros noarch 1.9.2-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 779.0 B glibc x86_64 2.41.9000-13.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 6.7 MiB glibc-common x86_64 2.41.9000-13.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB glibc-gconv-extra x86_64 2.41.9000-13.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 7.2 MiB gmp x86_64 1:6.3.0-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 819.2 KiB gnat-srpm-macros noarch 6-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 KiB gnupg2 x86_64 2.4.7-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 9.8 MiB gnutls x86_64 3.8.9-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.6 MiB go-srpm-macros noarch 3.6.0-7.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 60.8 KiB gpgverify noarch 2.1-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.7 KiB ima-evm-utils-libs x86_64 1.6.2-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 60.7 KiB jansson x86_64 2.14-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 93.1 KiB json-c x86_64 0.18-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 86.7 KiB kernel-srpm-macros noarch 1.0-25.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB keyutils-libs x86_64 1.6.3-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 58.3 KiB krb5-libs x86_64 1.21.3-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB libacl x86_64 2.3.2-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.3 KiB libarchive x86_64 3.7.7-4.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 930.6 KiB libassuan x86_64 2.5.7-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 167.8 KiB libattr x86_64 2.5.2-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 27.1 KiB libblkid x86_64 2.41-2.fc43 copr_base 262.4 KiB libbrotli x86_64 1.1.0-6.fc43 copr_base 833.3 KiB libcap x86_64 2.76-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 209.2 KiB libcap-ng x86_64 0.8.5-4.fc43 copr_base 68.9 KiB libcom_err x86_64 1.47.2-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 67.1 KiB libcurl x86_64 8.14.0~rc1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 891.0 KiB libeconf x86_64 0.7.6-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 64.6 KiB libevent x86_64 2.1.12-15.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 903.1 KiB libfdisk x86_64 2.41-2.fc43 copr_base 376.4 KiB libffi x86_64 3.4.8-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.0 KiB libfsverity x86_64 1.6-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 32.5 KiB libgcc x86_64 15.1.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 266.6 KiB libgcrypt x86_64 1.11.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB libgomp x86_64 15.1.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 538.5 KiB libgpg-error x86_64 1.55-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 915.3 KiB libidn2 x86_64 2.3.8-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 552.5 KiB libksba x86_64 1.6.7-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 402.5 KiB liblastlog2 x86_64 2.41-2.fc43 copr_base 33.9 KiB libmount x86_64 2.41-2.fc43 copr_base 372.7 KiB libnghttp2 x86_64 1.65.0-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 162.2 KiB libpkgconf x86_64 2.3.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 78.1 KiB libpsl x86_64 0.21.5-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 76.4 KiB libselinux x86_64 3.8-1.fc43 copr_base 193.1 KiB libsemanage x86_64 3.8-1.fc43 copr_base 304.4 KiB libsepol x86_64 3.8-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 826.0 KiB libsmartcols x86_64 2.41-2.fc43 copr_base 180.5 KiB libssh x86_64 0.11.1-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 565.5 KiB libssh-config noarch 0.11.1-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 277.0 B libstdc++ x86_64 15.1.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.8 MiB libtasn1 x86_64 4.20.0-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 176.3 KiB libtool-ltdl x86_64 2.5.4-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 70.1 KiB libunistring x86_64 1.1-9.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB libusb1 x86_64 1.0.28-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 171.0 KiB libuuid x86_64 2.41-2.fc43 copr_base 37.3 KiB libverto x86_64 0.3.2-10.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 25.4 KiB libxcrypt x86_64 4.4.38-7.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 284.5 KiB libxml2 x86_64 2.12.10-1.fc43 copr_base 1.7 MiB libzstd x86_64 1.5.7-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 807.8 KiB lua-libs x86_64 5.4.7-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 276.9 KiB lua-srpm-macros noarch 1-15.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 KiB lz4-libs x86_64 1.10.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 157.4 KiB mpfr x86_64 4.2.2-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 828.8 KiB ncurses-base noarch 6.5-5.20250125.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 326.8 KiB ncurses-libs x86_64 6.5-5.20250125.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 946.3 KiB nettle x86_64 3.10.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 790.5 KiB npth x86_64 1.8-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 49.6 KiB ocaml-srpm-macros noarch 10-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB openblas-srpm-macros noarch 2-19.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 112.0 B openldap x86_64 2.6.9-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 655.1 KiB openssl-libs x86_64 1:3.5.0-3.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.9 MiB p11-kit x86_64 0.25.5-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB p11-kit-trust x86_64 0.25.5-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 395.5 KiB package-notes-srpm-macros noarch 0.5-13.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 KiB pam-libs x86_64 1.7.0-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 126.7 KiB pcre2 x86_64 10.45-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 697.7 KiB pcre2-syntax noarch 10.45-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 273.9 KiB perl-srpm-macros noarch 1-57.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 861.0 B pkgconf x86_64 2.3.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 88.5 KiB pkgconf-m4 noarch 2.3.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 14.4 KiB pkgconf-pkg-config x86_64 2.3.0-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 989.0 B popt x86_64 1.19-8.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 132.8 KiB publicsuffix-list-dafsa noarch 20250116-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 68.5 KiB pyproject-srpm-macros noarch 1.18.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB python-srpm-macros noarch 3.14-5.fc43 copr_base 51.7 KiB qt5-srpm-macros noarch 5.15.16-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 500.0 B qt6-srpm-macros noarch 6.9.0-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 464.0 B readline x86_64 8.2-13.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 485.0 KiB rpm x86_64 5.99.90-5.fc43 copr_base 3.1 MiB rpm-build-libs x86_64 5.99.90-5.fc43 copr_base 264.4 KiB rpm-libs x86_64 5.99.90-5.fc43 copr_base 929.8 KiB rpm-sequoia x86_64 1.8.0-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.5 MiB rpm-sign-libs x86_64 5.99.90-5.fc43 copr_base 39.7 KiB rust-srpm-macros noarch 26.3-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.8 KiB setup noarch 2.15.0-24.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 724.7 KiB sqlite-libs x86_64 3.49.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.5 MiB systemd-libs x86_64 257.5-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB systemd-standalone-sysusers x86_64 257.5-5.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 277.3 KiB tpm2-tss x86_64 4.1.3-7.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB tree-sitter-srpm-macros noarch 0.2.4-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 7.5 KiB util-linux-core x86_64 2.41-2.fc43 copr_base 1.4 MiB xxhash-libs x86_64 0.8.3-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 90.2 KiB xz-libs x86_64 1:5.8.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 217.8 KiB zig-srpm-macros noarch 1-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 KiB zip x86_64 3.0-43.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 698.5 KiB zlib-ng-compat x86_64 2.2.4-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 137.6 KiB zstd x86_64 1.5.7-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB Installing groups: Buildsystem building group Transaction Summary: Installing: 163 packages Total size of inbound packages is 58 MiB. Need to download 0 B. After this operation, 198 MiB extra will be used (install 198 MiB, remove 0 B). [ 1/163] tar-2:1.35-5.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/163] bzip2-0:1.0.8-20.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/163] redhat-rpm-config-0:343-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/163] rpm-build-0:5.99.90-5.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/163] unzip-0:6.0-66.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/163] cpio-0:2.15-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/163] which-0:2.23-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/163] bash-0:5.2.37-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/163] coreutils-0:9.7-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 10/163] grep-0:3.12-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 11/163] patch-0:2.8-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 12/163] sed-0:4.9-4.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 13/163] shadow-utils-2:4.17.4-1.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 14/163] util-linux-0:2.41-2.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 15/163] diffutils-0:3.12-2.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 16/163] fedora-release-common-0:43-0. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 17/163] findutils-1:4.10.0-5.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 18/163] gawk-0:5.3.2-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 19/163] glibc-minimal-langpack-0:2.41 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 20/163] gzip-0:1.13-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 21/163] info-0:7.2-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 22/163] xz-1:5.8.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 23/163] libblkid-0:2.41-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 24/163] libfdisk-0:2.41-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 25/163] liblastlog2-0:2.41-2.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 26/163] libmount-0:2.41-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 27/163] libsmartcols-0:2.41-2.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 28/163] libuuid-0:2.41-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 29/163] util-linux-core-0:2.41-2.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 30/163] glibc-0:2.41.9000-13.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 31/163] glibc-common-0:2.41.9000-13.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 32/163] glibc-gconv-extra-0:2.41.9000 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 33/163] filesystem-0:3.18-44.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 34/163] libgcc-0:15.1.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 35/163] libselinux-0:3.8-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 36/163] libxcrypt-0:4.4.38-7.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 37/163] ncurses-libs-0:6.5-5.20250125 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 38/163] systemd-libs-0:257.5-5.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 39/163] audit-libs-0:4.0.3-2.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 40/163] libcap-ng-0:0.8.5-4.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 41/163] pam-libs-0:1.7.0-4.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 42/163] readline-0:8.2-13.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 43/163] zlib-ng-compat-0:2.2.4-2.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 44/163] binutils-0:2.44-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 45/163] debugedit-0:5.1-6.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 46/163] elfutils-0:0.193-2.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 47/163] elfutils-libelf-0:0.193-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 48/163] file-0:5.46-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 49/163] file-libs-0:5.46-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 50/163] libarchive-0:3.7.7-4.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 51/163] libstdc++-0:15.1.1-1.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 52/163] pkgconf-pkg-config-0:2.3.0-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 53/163] popt-0:1.19-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 54/163] rpm-0:5.99.90-5.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 55/163] rpm-build-libs-0:5.99.90-5.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 56/163] rpm-libs-0:5.99.90-5.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 57/163] zstd-0:1.5.7-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 58/163] curl-0:8.14.0~rc1-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 59/163] libsepol-0:3.8-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 60/163] pcre2-0:10.45-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 61/163] sqlite-libs-0:3.49.1-1.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 62/163] lz4-libs-0:1.10.0-2.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 63/163] xz-libs-1:5.8.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 64/163] bzip2-libs-0:1.0.8-20.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 65/163] libacl-0:2.3.2-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 66/163] libcap-0:2.76-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 67/163] libeconf-0:0.7.6-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 68/163] libsemanage-0:3.8-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 69/163] setup-0:2.15.0-24.fc43.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 70/163] ansible-srpm-macros-0:1-17.1. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 71/163] build-reproducibility-srpm-ma 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 72/163] dwz-0:0.15-9.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 73/163] efi-srpm-macros-0:6-3.fc43.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 74/163] filesystem-srpm-macros-0:3.18 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 75/163] fonts-srpm-macros-1:2.0.5-21. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 76/163] forge-srpm-macros-0:0.4.0-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 77/163] fpc-srpm-macros-0:1.3-14.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 78/163] ghc-srpm-macros-0:1.9.2-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 79/163] gnat-srpm-macros-0:6-7.fc42.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 80/163] go-srpm-macros-0:3.6.0-7.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 81/163] kernel-srpm-macros-0:1.0-25.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 82/163] lua-srpm-macros-0:1-15.fc42.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 83/163] ocaml-srpm-macros-0:10-4.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 84/163] openblas-srpm-macros-0:2-19.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 85/163] package-notes-srpm-macros-0:0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 86/163] perl-srpm-macros-0:1-57.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 87/163] pyproject-srpm-macros-0:1.18. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 88/163] python-srpm-macros-0:3.14-5.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 89/163] qt5-srpm-macros-0:5.15.16-1.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 90/163] qt6-srpm-macros-0:6.9.0-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 91/163] rust-srpm-macros-0:26.3-4.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 92/163] tree-sitter-srpm-macros-0:0.2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 93/163] zig-srpm-macros-0:1-4.fc42.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 94/163] zip-0:3.0-43.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 95/163] pkgconf-0:2.3.0-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 96/163] pkgconf-m4-0:2.3.0-2.fc42.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 97/163] libpkgconf-0:2.3.0-2.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 98/163] pcre2-syntax-0:10.45-1.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 99/163] ed-0:1.21-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [100/163] libattr-0:2.5.2-5.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [101/163] ncurses-base-0:6.5-5.20250125 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [102/163] libxml2-0:2.12.10-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [103/163] libzstd-0:1.5.7-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [104/163] openssl-libs-1:3.5.0-3.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [105/163] gmp-1:6.3.0-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [106/163] mpfr-0:4.2.2-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [107/163] fedora-repos-0:43-0.2.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [108/163] elfutils-debuginfod-client-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [109/163] elfutils-libs-0:0.193-2.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [110/163] coreutils-common-0:9.7-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [111/163] add-determinism-0:0.6.0-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [112/163] alternatives-0:1.33-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [113/163] jansson-0:2.14-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [114/163] lua-libs-0:5.4.7-3.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [115/163] rpm-sequoia-0:1.8.0-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [116/163] libgomp-0:15.1.1-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [117/163] rpm-sign-libs-0:5.99.90-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [118/163] ca-certificates-0:2024.2.69_v 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [119/163] crypto-policies-0:20250402-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [120/163] fedora-gpg-keys-0:43-0.2.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [121/163] fedora-repos-rawhide-0:43-0.2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [122/163] elfutils-default-yama-scope-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [123/163] json-c-0:0.18-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [124/163] libffi-0:3.4.8-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [125/163] p11-kit-0:0.25.5-5.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [126/163] p11-kit-trust-0:0.25.5-5.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [127/163] gnupg2-0:2.4.7-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [128/163] ima-evm-utils-libs-0:1.6.2-5. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [129/163] libfsverity-0:1.6-2.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [130/163] gpgverify-0:2.1-3.fc43.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [131/163] libtasn1-0:4.20.0-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [132/163] tpm2-tss-0:4.1.3-7.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [133/163] gnutls-0:3.8.9-5.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [134/163] libassuan-0:2.5.7-3.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [135/163] libgcrypt-0:1.11.1-1.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [136/163] libgpg-error-0:1.55-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [137/163] libksba-0:1.6.7-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [138/163] npth-0:1.8-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [139/163] openldap-0:2.6.9-5.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [140/163] libusb1-0:1.0.28-2.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [141/163] cyrus-sasl-lib-0:2.1.28-30.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [142/163] libevent-0:2.1.12-15.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [143/163] libtool-ltdl-0:2.5.4-4.fc42.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [144/163] libidn2-0:2.3.8-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [145/163] libunistring-0:1.1-9.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [146/163] nettle-0:3.10.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [147/163] gdbm-libs-1:1.23-9.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [148/163] gdb-minimal-0:16.3-1.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [149/163] xxhash-libs-0:0.8.3-2.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [150/163] fedora-release-0:43-0.15.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [151/163] fedora-release-identity-basic 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [152/163] libcurl-0:8.14.0~rc1-1.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [153/163] systemd-standalone-sysusers-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [154/163] krb5-libs-0:1.21.3-5.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [155/163] libbrotli-0:1.1.0-6.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [156/163] libnghttp2-0:1.65.0-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [157/163] libpsl-0:0.21.5-5.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [158/163] libssh-0:0.11.1-4.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [159/163] keyutils-libs-0:1.6.3-5.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [160/163] libcom_err-0:1.47.2-3.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [161/163] libverto-0:0.3.2-10.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [162/163] libssh-config-0:0.11.1-4.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [163/163] publicsuffix-list-dafsa-0:202 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [163/163] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [ 1/165] Verify package files 100% | 662.0 B/s | 163.0 B | 00m00s >>> Running pre-transaction scriptlet: filesystem-0:3.18-44.fc43.x86_64 >>> Finished pre-transaction scriptlet: filesystem-0:3.18-44.fc43.x86_64 >>> [RPM] /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root/var/cache/d [ 2/165] Prepare transaction 100% | 1.8 KiB/s | 163.0 B | 00m00s [ 3/165] Installing libgcc-0:15.1.1-1. 100% | 131.0 MiB/s | 268.3 KiB | 00m00s [ 4/165] Installing publicsuffix-list- 100% | 67.6 MiB/s | 69.2 KiB | 00m00s [ 5/165] Installing libssh-config-0:0. 100% | 0.0 B/s | 816.0 B | 00m00s [ 6/165] Installing fedora-release-ide 100% | 0.0 B/s | 920.0 B | 00m00s [ 7/165] Installing fedora-gpg-keys-0: 100% | 17.2 MiB/s | 175.9 KiB | 00m00s [ 8/165] Installing fedora-repos-rawhi 100% | 0.0 B/s | 2.4 KiB | 00m00s [ 9/165] Installing fedora-repos-0:43- 100% | 0.0 B/s | 5.7 KiB | 00m00s [ 10/165] Installing fedora-release-com 100% | 12.1 MiB/s | 24.7 KiB | 00m00s [ 11/165] Installing fedora-release-0:4 100% | 0.0 B/s | 124.0 B | 00m00s [ 12/165] Installing setup-0:2.15.0-24. 100% | 44.6 MiB/s | 730.4 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 13/165] Installing filesystem-0:3.18- 100% | 1.3 MiB/s | 212.5 KiB | 00m00s [ 14/165] Installing coreutils-common-0 100% | 213.1 MiB/s | 11.3 MiB | 00m00s [ 15/165] Installing ncurses-base-0:6.5 100% | 34.4 MiB/s | 352.2 KiB | 00m00s [ 16/165] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 17/165] Installing ncurses-libs-0:6.5 100% | 132.9 MiB/s | 952.8 KiB | 00m00s [ 18/165] Installing glibc-0:2.41.9000- 100% | 145.2 MiB/s | 6.7 MiB | 00m00s [ 19/165] Installing bash-0:5.2.37-3.fc 100% | 185.9 MiB/s | 8.2 MiB | 00m00s [ 20/165] Installing glibc-common-0:2.4 100% | 48.6 MiB/s | 1.0 MiB | 00m00s [ 21/165] Installing glibc-gconv-extra- 100% | 130.5 MiB/s | 7.3 MiB | 00m00s [ 22/165] Installing zlib-ng-compat-0:2 100% | 67.6 MiB/s | 138.4 KiB | 00m00s [ 23/165] Installing libstdc++-0:15.1.1 100% | 236.3 MiB/s | 2.8 MiB | 00m00s [ 24/165] Installing bzip2-libs-0:1.0.8 100% | 83.7 MiB/s | 85.7 KiB | 00m00s [ 25/165] Installing xz-libs-1:5.8.1-1. 100% | 106.9 MiB/s | 218.9 KiB | 00m00s [ 26/165] Installing libuuid-0:2.41-2.f 100% | 37.4 MiB/s | 38.3 KiB | 00m00s [ 27/165] Installing gmp-1:6.3.0-3.fc43 100% | 200.6 MiB/s | 821.5 KiB | 00m00s [ 28/165] Installing readline-0:8.2-13. 100% | 158.6 MiB/s | 487.1 KiB | 00m00s [ 29/165] Installing popt-0:1.19-8.fc42 100% | 27.2 MiB/s | 139.4 KiB | 00m00s [ 30/165] Installing libblkid-0:2.41-2. 100% | 128.7 MiB/s | 263.5 KiB | 00m00s [ 31/165] Installing libxcrypt-0:4.4.38 100% | 140.2 MiB/s | 287.2 KiB | 00m00s [ 32/165] Installing libzstd-0:1.5.7-1. 100% | 197.5 MiB/s | 809.1 KiB | 00m00s [ 33/165] Installing elfutils-libelf-0: 100% | 233.3 MiB/s | 1.2 MiB | 00m00s [ 34/165] Installing libgpg-error-0:1.5 100% | 20.4 MiB/s | 921.1 KiB | 00m00s [ 35/165] Installing crypto-policies-0: 100% | 13.6 MiB/s | 166.6 KiB | 00m00s [ 36/165] Installing sqlite-libs-0:3.49 100% | 215.5 MiB/s | 1.5 MiB | 00m00s [ 37/165] Installing libattr-0:2.5.2-5. 100% | 27.4 MiB/s | 28.1 KiB | 00m00s [ 38/165] Installing libacl-0:2.3.2-3.f 100% | 38.2 MiB/s | 39.2 KiB | 00m00s [ 39/165] Installing libtasn1-0:4.20.0- 100% | 87.0 MiB/s | 178.1 KiB | 00m00s [ 40/165] Installing libunistring-0:1.1 100% | 215.8 MiB/s | 1.7 MiB | 00m00s [ 41/165] Installing libidn2-0:2.3.8-1. 100% | 77.9 MiB/s | 558.7 KiB | 00m00s [ 42/165] Installing dwz-0:0.15-9.fc42. 100% | 17.8 MiB/s | 292.4 KiB | 00m00s [ 43/165] Installing mpfr-0:4.2.2-1.fc4 100% | 162.2 MiB/s | 830.4 KiB | 00m00s [ 44/165] Installing gawk-0:5.3.2-1.fc4 100% | 75.7 MiB/s | 1.8 MiB | 00m00s [ 45/165] Installing unzip-0:6.0-66.fc4 100% | 24.0 MiB/s | 393.8 KiB | 00m00s [ 46/165] Installing file-libs-0:5.46-1 100% | 423.5 MiB/s | 11.9 MiB | 00m00s [ 47/165] Installing file-0:5.46-1.fc43 100% | 7.6 MiB/s | 101.7 KiB | 00m00s [ 48/165] Installing libsmartcols-0:2.4 100% | 88.7 MiB/s | 181.6 KiB | 00m00s [ 49/165] Installing libcap-ng-0:0.8.5- 100% | 69.2 MiB/s | 70.8 KiB | 00m00s [ 50/165] Installing audit-libs-0:4.0.3 100% | 170.5 MiB/s | 349.3 KiB | 00m00s [ 51/165] Installing libsepol-0:3.8-1.f 100% | 201.9 MiB/s | 827.0 KiB | 00m00s [ 52/165] Installing lz4-libs-0:1.10.0- 100% | 154.7 MiB/s | 158.5 KiB | 00m00s [ 53/165] Installing libeconf-0:0.7.6-1 100% | 64.7 MiB/s | 66.2 KiB | 00m00s [ 54/165] Installing pam-libs-0:1.7.0-4 100% | 63.1 MiB/s | 129.1 KiB | 00m00s [ 55/165] Installing libcap-0:2.76-1.fc 100% | 13.1 MiB/s | 214.3 KiB | 00m00s [ 56/165] Installing systemd-libs-0:257 100% | 223.2 MiB/s | 2.2 MiB | 00m00s [ 57/165] Installing alternatives-0:1.3 100% | 4.4 MiB/s | 63.8 KiB | 00m00s [ 58/165] Installing lua-libs-0:5.4.7-3 100% | 135.8 MiB/s | 278.1 KiB | 00m00s [ 59/165] Installing json-c-0:0.18-2.fc 100% | 85.9 MiB/s | 88.0 KiB | 00m00s [ 60/165] Installing libffi-0:3.4.8-1.f 100% | 82.4 MiB/s | 84.3 KiB | 00m00s [ 61/165] Installing p11-kit-0:0.25.5-5 100% | 75.3 MiB/s | 2.2 MiB | 00m00s [ 62/165] Installing p11-kit-trust-0:0. 100% | 9.9 MiB/s | 397.2 KiB | 00m00s [ 63/165] Installing libusb1-0:1.0.28-2 100% | 84.3 MiB/s | 172.7 KiB | 00m00s [ 64/165] Installing zstd-0:1.5.7-1.fc4 100% | 85.5 MiB/s | 1.7 MiB | 00m00s [ 65/165] Installing zip-0:3.0-43.fc42. 100% | 42.9 MiB/s | 702.4 KiB | 00m00s [ 66/165] Installing libpsl-0:0.21.5-5. 100% | 37.9 MiB/s | 77.5 KiB | 00m00s [ 67/165] Installing liblastlog2-0:2.41 100% | 17.5 MiB/s | 35.9 KiB | 00m00s [ 68/165] Installing libassuan-0:2.5.7- 100% | 82.8 MiB/s | 169.6 KiB | 00m00s [ 69/165] Installing libgcrypt-0:1.11.1 100% | 196.9 MiB/s | 1.6 MiB | 00m00s [ 70/165] Installing libksba-0:1.6.7-3. 100% | 98.9 MiB/s | 405.1 KiB | 00m00s [ 71/165] Installing libfdisk-0:2.41-2. 100% | 184.3 MiB/s | 377.5 KiB | 00m00s [ 72/165] Installing nettle-0:3.10.1-1. 100% | 155.0 MiB/s | 793.6 KiB | 00m00s [ 73/165] Installing gnutls-0:3.8.9-5.f 100% | 223.3 MiB/s | 3.6 MiB | 00m00s [ 74/165] Installing libxml2-0:2.12.10- 100% | 85.2 MiB/s | 1.7 MiB | 00m00s [ 75/165] Installing bzip2-0:1.0.8-20.f 100% | 7.2 MiB/s | 103.8 KiB | 00m00s [ 76/165] Installing add-determinism-0: 100% | 112.1 MiB/s | 2.5 MiB | 00m00s [ 77/165] Installing build-reproducibil 100% | 1.0 MiB/s | 1.0 KiB | 00m00s [ 78/165] Installing filesystem-srpm-ma 100% | 38.0 MiB/s | 38.9 KiB | 00m00s [ 79/165] Installing ed-0:1.21-2.fc42.x 100% | 10.4 MiB/s | 148.8 KiB | 00m00s [ 80/165] Installing patch-0:2.8-1.fc43 100% | 15.9 MiB/s | 228.3 KiB | 00m00s [ 81/165] Installing elfutils-default-y 100% | 113.5 KiB/s | 2.0 KiB | 00m00s [ 82/165] Installing elfutils-libs-0:0. 100% | 133.8 MiB/s | 685.2 KiB | 00m00s [ 83/165] Installing cpio-0:2.15-2.fc41 100% | 50.0 MiB/s | 1.1 MiB | 00m00s [ 84/165] Installing diffutils-0:3.12-2 100% | 67.9 MiB/s | 1.6 MiB | 00m00s [ 85/165] Installing libpkgconf-0:2.3.0 100% | 77.4 MiB/s | 79.2 KiB | 00m00s [ 86/165] Installing pkgconf-0:2.3.0-2. 100% | 5.9 MiB/s | 91.0 KiB | 00m00s [ 87/165] Installing jansson-0:2.14-2.f 100% | 46.1 MiB/s | 94.4 KiB | 00m00s [ 88/165] Installing libgomp-0:15.1.1-1 100% | 263.6 MiB/s | 539.9 KiB | 00m00s [ 89/165] Installing npth-0:1.8-2.fc42. 100% | 49.5 MiB/s | 50.7 KiB | 00m00s [ 90/165] Installing libtool-ltdl-0:2.5 100% | 69.6 MiB/s | 71.2 KiB | 00m00s [ 91/165] Installing gdbm-libs-1:1.23-9 100% | 128.5 MiB/s | 131.6 KiB | 00m00s [ 92/165] Installing cyrus-sasl-lib-0:2 100% | 100.2 MiB/s | 2.3 MiB | 00m00s [ 93/165] Installing xxhash-libs-0:0.8. 100% | 89.4 MiB/s | 91.6 KiB | 00m00s [ 94/165] Installing libbrotli-0:1.1.0- 100% | 204.0 MiB/s | 835.6 KiB | 00m00s [ 95/165] Installing libnghttp2-0:1.65. 100% | 159.5 MiB/s | 163.3 KiB | 00m00s [ 96/165] Installing keyutils-libs-0:1. 100% | 29.2 MiB/s | 59.7 KiB | 00m00s [ 97/165] Installing libcom_err-0:1.47. 100% | 66.6 MiB/s | 68.2 KiB | 00m00s [ 98/165] Installing libverto-0:0.3.2-1 100% | 26.6 MiB/s | 27.2 KiB | 00m00s [ 99/165] Installing pcre2-syntax-0:10. 100% | 135.0 MiB/s | 276.4 KiB | 00m00s [100/165] Installing pcre2-0:10.45-1.fc 100% | 227.6 MiB/s | 699.1 KiB | 00m00s [101/165] Installing libselinux-0:3.8-1 100% | 94.9 MiB/s | 194.3 KiB | 00m00s [102/165] Installing grep-0:3.12-1.fc43 100% | 47.7 MiB/s | 1.0 MiB | 00m00s [103/165] Installing sed-0:4.9-4.fc42.x 100% | 40.2 MiB/s | 865.5 KiB | 00m00s [104/165] Installing findutils-1:4.10.0 100% | 74.9 MiB/s | 1.9 MiB | 00m00s [105/165] Installing xz-1:5.8.1-1.fc43. 100% | 53.3 MiB/s | 1.3 MiB | 00m00s [106/165] Installing libmount-0:2.41-2. 100% | 121.6 MiB/s | 373.7 KiB | 00m00s [107/165] Installing util-linux-core-0: 100% | 56.6 MiB/s | 1.5 MiB | 00m00s [108/165] Installing openssl-libs-1:3.5 100% | 246.9 MiB/s | 8.9 MiB | 00m00s [109/165] Installing coreutils-0:9.7-1. 100% | 92.3 MiB/s | 5.4 MiB | 00m00s [110/165] Installing ca-certificates-0: 100% | 1.1 MiB/s | 2.4 MiB | 00m02s [111/165] Installing libarchive-0:3.7.7 100% | 151.8 MiB/s | 932.6 KiB | 00m00s [112/165] Installing krb5-libs-0:1.21.3 100% | 164.3 MiB/s | 2.3 MiB | 00m00s [113/165] Installing tpm2-tss-0:4.1.3-7 100% | 156.8 MiB/s | 1.6 MiB | 00m00s [114/165] Installing ima-evm-utils-libs 100% | 60.5 MiB/s | 62.0 KiB | 00m00s [115/165] Installing libssh-0:0.11.1-4. 100% | 138.6 MiB/s | 567.5 KiB | 00m00s [116/165] Installing gzip-0:1.13-3.fc42 100% | 21.6 MiB/s | 398.4 KiB | 00m00s [117/165] Installing rpm-sequoia-0:1.8. 100% | 250.4 MiB/s | 2.5 MiB | 00m00s [118/165] Installing libfsverity-0:1.6- 100% | 32.7 MiB/s | 33.5 KiB | 00m00s [119/165] Installing libevent-0:2.1.12- 100% | 177.1 MiB/s | 906.9 KiB | 00m00s [120/165] Installing openldap-0:2.6.9-5 100% | 128.7 MiB/s | 658.9 KiB | 00m00s [121/165] Installing gnupg2-0:2.4.7-3.f 100% | 166.0 MiB/s | 9.8 MiB | 00m00s [122/165] Installing libcurl-0:8.14.0~r 100% | 174.2 MiB/s | 892.1 KiB | 00m00s [123/165] Installing elfutils-debuginfo 100% | 6.0 MiB/s | 86.2 KiB | 00m00s [124/165] Installing binutils-0:2.44-3. 100% | 194.7 MiB/s | 25.9 MiB | 00m00s [125/165] Installing elfutils-0:0.193-2 100% | 108.2 MiB/s | 2.9 MiB | 00m00s [126/165] Installing gdb-minimal-0:16.3 100% | 220.8 MiB/s | 13.2 MiB | 00m00s [127/165] Installing debugedit-0:5.1-6. 100% | 13.6 MiB/s | 195.4 KiB | 00m00s [128/165] Installing curl-0:8.14.0~rc1- 100% | 29.0 MiB/s | 476.0 KiB | 00m00s [129/165] Installing gpgverify-0:2.1-3. 100% | 9.2 MiB/s | 9.4 KiB | 00m00s [130/165] Installing tar-2:1.35-5.fc42. 100% | 109.7 MiB/s | 3.0 MiB | 00m00s [131/165] Installing libsemanage-0:3.8- 100% | 74.8 MiB/s | 306.2 KiB | 00m00s [132/165] Installing systemd-standalone 100% | 19.4 MiB/s | 277.8 KiB | 00m00s [133/165] Installing rpm-libs-0:5.99.90 100% | 33.7 MiB/s | 931.3 KiB | 00m00s [134/165] Installing rpm-0:5.99.90-5.fc 100% | 39.2 MiB/s | 2.5 MiB | 00m00s [135/165] Installing efi-srpm-macros-0: 100% | 40.2 MiB/s | 41.1 KiB | 00m00s [136/165] Installing lua-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [137/165] Installing tree-sitter-srpm-m 100% | 8.4 MiB/s | 8.6 KiB | 00m00s [138/165] Installing zig-srpm-macros-0: 100% | 1.6 MiB/s | 1.7 KiB | 00m00s [139/165] Installing rpm-sign-libs-0:5. 100% | 39.6 MiB/s | 40.5 KiB | 00m00s [140/165] Installing rpm-build-libs-0:5 100% | 129.5 MiB/s | 265.2 KiB | 00m00s [141/165] Installing pkgconf-m4-0:2.3.0 100% | 14.5 MiB/s | 14.8 KiB | 00m00s [142/165] Installing pkgconf-pkg-config 100% | 136.4 KiB/s | 1.8 KiB | 00m00s [143/165] Installing rust-srpm-macros-0 100% | 5.4 MiB/s | 5.6 KiB | 00m00s [144/165] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 740.0 B | 00m00s [145/165] Installing qt5-srpm-macros-0: 100% | 0.0 B/s | 776.0 B | 00m00s [146/165] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [147/165] Installing package-notes-srpm 100% | 0.0 B/s | 2.0 KiB | 00m00s [148/165] Installing openblas-srpm-macr 100% | 0.0 B/s | 392.0 B | 00m00s [149/165] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.2 KiB | 00m00s [150/165] Installing kernel-srpm-macros 100% | 0.0 B/s | 2.3 KiB | 00m00s [151/165] Installing gnat-srpm-macros-0 100% | 0.0 B/s | 1.3 KiB | 00m00s [152/165] Installing ghc-srpm-macros-0: 100% | 0.0 B/s | 1.0 KiB | 00m00s [153/165] Installing fpc-srpm-macros-0: 100% | 0.0 B/s | 420.0 B | 00m00s [154/165] Installing ansible-srpm-macro 100% | 35.4 MiB/s | 36.2 KiB | 00m00s [155/165] Installing fonts-srpm-macros- 100% | 55.7 MiB/s | 57.0 KiB | 00m00s [156/165] Installing forge-srpm-macros- 100% | 39.3 MiB/s | 40.3 KiB | 00m00s [157/165] Installing go-srpm-macros-0:3 100% | 60.5 MiB/s | 62.0 KiB | 00m00s [158/165] Installing python-srpm-macros 100% | 51.8 MiB/s | 53.0 KiB | 00m00s [159/165] Installing redhat-rpm-config- 100% | 61.2 MiB/s | 188.0 KiB | 00m00s [160/165] Installing rpm-build-0:5.99.9 100% | 15.8 MiB/s | 290.3 KiB | 00m00s [161/165] Installing pyproject-srpm-mac 100% | 2.4 MiB/s | 2.5 KiB | 00m00s [162/165] Installing shadow-utils-2:4.1 100% | 78.0 MiB/s | 4.1 MiB | 00m00s [163/165] Installing which-0:2.23-1.fc4 100% | 6.0 MiB/s | 85.6 KiB | 00m00s [164/165] Installing util-linux-0:2.41- 100% | 56.5 MiB/s | 3.6 MiB | 00m00s [165/165] Installing info-0:7.2-3.fc42. 100% | 120.1 KiB/s | 358.3 KiB | 00m03s Warning: skipped OpenPGP checks for 163 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: add-determinism-0.6.0-1.fc43.x86_64 alternatives-1.33-1.fc43.x86_64 ansible-srpm-macros-1-17.1.fc42.noarch audit-libs-4.0.3-2.fc43.x86_64 bash-5.2.37-3.fc43.x86_64 binutils-2.44-3.fc43.x86_64 build-reproducibility-srpm-macros-0.6.0-1.fc43.noarch bzip2-1.0.8-20.fc42.x86_64 bzip2-libs-1.0.8-20.fc42.x86_64 ca-certificates-2024.2.69_v8.0.401-5.fc42.noarch coreutils-9.7-1.fc43.x86_64 coreutils-common-9.7-1.fc43.x86_64 cpio-2.15-2.fc41.x86_64 crypto-policies-20250402-2.git86c0178.fc43.noarch curl-8.14.0~rc1-1.fc43.x86_64 cyrus-sasl-lib-2.1.28-30.fc42.x86_64 debugedit-5.1-6.fc43.x86_64 diffutils-3.12-2.fc43.x86_64 dwz-0.15-9.fc42.x86_64 ed-1.21-2.fc42.x86_64 efi-srpm-macros-6-3.fc43.noarch elfutils-0.193-2.fc43.x86_64 elfutils-debuginfod-client-0.193-2.fc43.x86_64 elfutils-default-yama-scope-0.193-2.fc43.noarch elfutils-libelf-0.193-2.fc43.x86_64 elfutils-libs-0.193-2.fc43.x86_64 fedora-gpg-keys-43-0.2.noarch fedora-release-43-0.15.noarch fedora-release-common-43-0.15.noarch fedora-release-identity-basic-43-0.15.noarch fedora-repos-43-0.2.noarch fedora-repos-rawhide-43-0.2.noarch file-5.46-1.fc43.x86_64 file-libs-5.46-1.fc43.x86_64 filesystem-3.18-44.fc43.x86_64 filesystem-srpm-macros-3.18-44.fc43.noarch findutils-4.10.0-5.fc42.x86_64 fonts-srpm-macros-2.0.5-21.fc42.noarch forge-srpm-macros-0.4.0-2.fc42.noarch fpc-srpm-macros-1.3-14.fc42.noarch gawk-5.3.2-1.fc43.x86_64 gdb-minimal-16.3-1.fc43.x86_64 gdbm-libs-1.23-9.fc42.x86_64 ghc-srpm-macros-1.9.2-2.fc42.noarch glibc-2.41.9000-13.fc43.x86_64 glibc-common-2.41.9000-13.fc43.x86_64 glibc-gconv-extra-2.41.9000-13.fc43.x86_64 glibc-minimal-langpack-2.41.9000-13.fc43.x86_64 gmp-6.3.0-3.fc43.x86_64 gnat-srpm-macros-6-7.fc42.noarch gnupg2-2.4.7-3.fc43.x86_64 gnutls-3.8.9-5.fc43.x86_64 go-srpm-macros-3.6.0-7.fc43.noarch gpgverify-2.1-3.fc43.noarch grep-3.12-1.fc43.x86_64 gzip-1.13-3.fc42.x86_64 ima-evm-utils-libs-1.6.2-5.fc43.x86_64 info-7.2-3.fc42.x86_64 jansson-2.14-2.fc42.x86_64 json-c-0.18-2.fc42.x86_64 kernel-srpm-macros-1.0-25.fc42.noarch keyutils-libs-1.6.3-5.fc42.x86_64 krb5-libs-1.21.3-5.fc42.x86_64 libacl-2.3.2-3.fc42.x86_64 libarchive-3.7.7-4.fc43.x86_64 libassuan-2.5.7-3.fc42.x86_64 libattr-2.5.2-5.fc42.x86_64 libblkid-2.41-2.fc43.x86_64 libbrotli-1.1.0-6.fc43.x86_64 libcap-2.76-1.fc43.x86_64 libcap-ng-0.8.5-4.fc43.x86_64 libcom_err-1.47.2-3.fc42.x86_64 libcurl-8.14.0~rc1-1.fc43.x86_64 libeconf-0.7.6-1.fc43.x86_64 libevent-2.1.12-15.fc42.x86_64 libfdisk-2.41-2.fc43.x86_64 libffi-3.4.8-1.fc43.x86_64 libfsverity-1.6-2.fc42.x86_64 libgcc-15.1.1-1.fc43.x86_64 libgcrypt-1.11.1-1.fc43.x86_64 libgomp-15.1.1-1.fc43.x86_64 libgpg-error-1.55-1.fc43.x86_64 libidn2-2.3.8-1.fc43.x86_64 libksba-1.6.7-3.fc42.x86_64 liblastlog2-2.41-2.fc43.x86_64 libmount-2.41-2.fc43.x86_64 libnghttp2-1.65.0-1.fc43.x86_64 libpkgconf-2.3.0-2.fc42.x86_64 libpsl-0.21.5-5.fc42.x86_64 libselinux-3.8-1.fc43.x86_64 libsemanage-3.8-1.fc43.x86_64 libsepol-3.8-1.fc42.x86_64 libsmartcols-2.41-2.fc43.x86_64 libssh-0.11.1-4.fc42.x86_64 libssh-config-0.11.1-4.fc42.noarch libstdc++-15.1.1-1.fc43.x86_64 libtasn1-4.20.0-1.fc43.x86_64 libtool-ltdl-2.5.4-4.fc42.x86_64 libunistring-1.1-9.fc42.x86_64 libusb1-1.0.28-2.fc43.x86_64 libuuid-2.41-2.fc43.x86_64 libverto-0.3.2-10.fc42.x86_64 libxcrypt-4.4.38-7.fc43.x86_64 libxml2-2.12.10-1.fc43.x86_64 libzstd-1.5.7-1.fc43.x86_64 lua-libs-5.4.7-3.fc43.x86_64 lua-srpm-macros-1-15.fc42.noarch lz4-libs-1.10.0-2.fc42.x86_64 mpfr-4.2.2-1.fc43.x86_64 ncurses-base-6.5-5.20250125.fc42.noarch ncurses-libs-6.5-5.20250125.fc42.x86_64 nettle-3.10.1-1.fc43.x86_64 npth-1.8-2.fc42.x86_64 ocaml-srpm-macros-10-4.fc42.noarch openblas-srpm-macros-2-19.fc42.noarch openldap-2.6.9-5.fc43.x86_64 openssl-libs-3.5.0-3.fc43.x86_64 p11-kit-0.25.5-5.fc42.x86_64 p11-kit-trust-0.25.5-5.fc42.x86_64 package-notes-srpm-macros-0.5-13.fc42.noarch pam-libs-1.7.0-4.fc42.x86_64 patch-2.8-1.fc43.x86_64 pcre2-10.45-1.fc43.x86_64 pcre2-syntax-10.45-1.fc43.noarch perl-srpm-macros-1-57.fc42.noarch pkgconf-2.3.0-2.fc42.x86_64 pkgconf-m4-2.3.0-2.fc42.noarch pkgconf-pkg-config-2.3.0-2.fc42.x86_64 popt-1.19-8.fc42.x86_64 publicsuffix-list-dafsa-20250116-1.fc42.noarch pyproject-srpm-macros-1.18.1-1.fc43.noarch python-srpm-macros-3.14-5.fc43.noarch qt5-srpm-macros-5.15.16-1.fc43.noarch qt6-srpm-macros-6.9.0-2.fc43.noarch readline-8.2-13.fc43.x86_64 redhat-rpm-config-343-5.fc43.noarch rpm-5.99.90-5.fc43.x86_64 rpm-build-5.99.90-5.fc43.x86_64 rpm-build-libs-5.99.90-5.fc43.x86_64 rpm-libs-5.99.90-5.fc43.x86_64 rpm-sequoia-1.8.0-1.fc43.x86_64 rpm-sign-libs-5.99.90-5.fc43.x86_64 rust-srpm-macros-26.3-4.fc42.noarch sed-4.9-4.fc42.x86_64 setup-2.15.0-24.fc43.noarch shadow-utils-4.17.4-1.fc43.x86_64 sqlite-libs-3.49.1-1.fc43.x86_64 systemd-libs-257.5-5.fc43.x86_64 systemd-standalone-sysusers-257.5-5.fc43.x86_64 tar-1.35-5.fc42.x86_64 tpm2-tss-4.1.3-7.fc43.x86_64 tree-sitter-srpm-macros-0.2.4-1.fc43.noarch unzip-6.0-66.fc42.x86_64 util-linux-2.41-2.fc43.x86_64 util-linux-core-2.41-2.fc43.x86_64 which-2.23-1.fc42.x86_64 xxhash-libs-0.8.3-2.fc42.x86_64 xz-5.8.1-1.fc43.x86_64 xz-libs-5.8.1-1.fc43.x86_64 zig-srpm-macros-1-4.fc42.noarch zip-3.0-43.fc42.x86_64 zlib-ng-compat-2.2.4-2.fc43.x86_64 zstd-1.5.7-1.fc43.x86_64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Wrote: /builddir/build/SRPMS/python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names Finish: buildsrpm INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-xpewsx5e/python-cattrs/python-cattrs.spec) Config(child) 0 minutes 15 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot INFO: Start(/var/lib/copr-rpmbuild/results/python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm) Config(fedora-rawhide-x86_64) Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management from host and used with --installroot: rpm-4.20.1-1.fc41.x86_64 rpm-sequoia-1.7.0-2.fc41.x86_64 python3-dnf-4.23.0-1.fc41.noarch python3-dnf-plugins-core-4.10.1-1.fc41.noarch dnf5-5.2.13.1-1.fc41.x86_64 dnf5-plugins-5.2.13.1-1.fc41.x86_64 Finish: chroot init Start: build phase for python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Start: build setup for python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Wrote: /builddir/build/SRPMS/python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Updating and loading repositories: fedora 100% | 917.9 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 6.5 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 72.2 KiB/s | 3.8 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: python3-devel x86_64 3.14.0~b1-1.fc43 copr_base 1.9 MiB python3-hypothesis noarch 6.123.0-3.fc43 copr_base 4.8 MiB python3-immutables x86_64 0.21-2.fc43 copr_base 184.8 KiB python3-pytest noarch 8.3.4-3.fc43 copr_base 4.1 MiB python3-pytest-xdist noarch 3.6.1-5.fc43 copr_base 460.6 KiB python3-typing-extensions noarch 4.12.2-3.fc42 copr_base 537.7 KiB Installing dependencies: expat x86_64 2.7.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 294.2 KiB mpdecimal x86_64 4.0.0-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 216.8 KiB pyproject-rpm-macros noarch 1.18.1-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 114.5 KiB python-pip-wheel noarch 24.3.1-2.fc42 copr_base 1.2 MiB python-rpm-macros noarch 3.14-5.fc43 copr_base 22.1 KiB python3 x86_64 3.14.0~b1-1.fc43 copr_base 28.9 KiB python3-attrs noarch 25.3.0-1.fc43 copr_base 410.8 KiB python3-execnet noarch 2.1.1-5.fc43 copr_base 969.7 KiB python3-iniconfig noarch 1.1.1-25.fc43 copr_base 21.0 KiB python3-libs x86_64 3.14.0~b1-1.fc43 copr_base 42.5 MiB python3-packaging noarch 25.0-1.fc43 copr_base 607.5 KiB python3-pluggy noarch 1.5.0-2.fc43 copr_base 213.2 KiB python3-rpm-generators noarch 14-12.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 81.7 KiB python3-rpm-macros noarch 3.14-5.fc43 copr_base 6.4 KiB python3-sortedcontainers noarch 2.4.0-19.fc43 copr_base 392.7 KiB tzdata noarch 2025b-1.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB Transaction Summary: Installing: 22 packages Total size of inbound packages is 14 MiB. Need to download 1 MiB. After this operation, 61 MiB extra will be used (install 61 MiB, remove 0 B). [ 1/22] python3-devel-0:3.14.0~b1-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/22] python3-pytest-0:8.3.4-3.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/22] python3-typing-extensions-0:4.1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/22] python3-0:3.14.0~b1-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/22] python3-libs-0:3.14.0~b1-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/22] python3-attrs-0:25.3.0-1.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/22] python3-iniconfig-0:1.1.1-25.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/22] python3-packaging-0:25.0-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/22] python3-pluggy-0:1.5.0-2.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [10/22] expat-0:2.7.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [11/22] mpdecimal-0:4.0.0-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [12/22] python-pip-wheel-0:24.3.1-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [13/22] tzdata-0:2025b-1.fc43.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [14/22] python-rpm-macros-0:3.14-5.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [15/22] python3-rpm-macros-0:3.14-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [16/22] pyproject-rpm-macros-0:1.18.1-1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [17/22] python3-rpm-generators-0:14-12. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [18/22] python3-immutables-0:0.21-2.fc4 100% | 1.3 MiB/s | 60.8 KiB | 00m00s [19/22] python3-pytest-xdist-0:3.6.1-5. 100% | 1.9 MiB/s | 106.0 KiB | 00m00s [20/22] python3-hypothesis-0:6.123.0-3. 100% | 12.7 MiB/s | 961.2 KiB | 00m00s [21/22] python3-sortedcontainers-0:2.4. 100% | 2.3 MiB/s | 64.3 KiB | 00m00s [22/22] python3-execnet-0:2.1.1-5.fc43. 100% | 11.1 MiB/s | 250.2 KiB | 00m00s -------------------------------------------------------------------------------- [22/22] Total 100% | 15.3 MiB/s | 1.4 MiB | 00m00s Running transaction [ 1/24] Verify package files 100% | 354.0 B/s | 22.0 B | 00m00s [ 2/24] Prepare transaction 100% | 431.0 B/s | 22.0 B | 00m00s [ 3/24] Installing python-rpm-macros-0: 100% | 22.3 MiB/s | 22.8 KiB | 00m00s [ 4/24] Installing python3-rpm-macros-0 100% | 0.0 B/s | 6.7 KiB | 00m00s [ 5/24] Installing pyproject-rpm-macros 100% | 28.4 MiB/s | 116.4 KiB | 00m00s [ 6/24] Installing tzdata-0:2025b-1.fc4 100% | 24.3 MiB/s | 1.9 MiB | 00m00s [ 7/24] Installing python-pip-wheel-0:2 100% | 414.7 MiB/s | 1.2 MiB | 00m00s [ 8/24] Installing mpdecimal-0:4.0.0-2. 100% | 71.1 MiB/s | 218.4 KiB | 00m00s [ 9/24] Installing expat-0:2.7.1-1.fc43 100% | 13.8 MiB/s | 296.3 KiB | 00m00s [10/24] Installing python3-libs-0:3.14. 100% | 179.4 MiB/s | 42.9 MiB | 00m00s [11/24] Installing python3-0:3.14.0~b1- 100% | 2.0 MiB/s | 30.7 KiB | 00m00s [12/24] Installing python3-packaging-0: 100% | 100.9 MiB/s | 620.0 KiB | 00m00s [13/24] Installing python3-rpm-generato 100% | 81.0 MiB/s | 82.9 KiB | 00m00s [14/24] Installing python3-attrs-0:25.3 100% | 83.0 MiB/s | 425.0 KiB | 00m00s [15/24] Installing python3-sortedcontai 100% | 129.2 MiB/s | 397.1 KiB | 00m00s [16/24] Installing python3-iniconfig-0: 100% | 11.8 MiB/s | 24.2 KiB | 00m00s [17/24] Installing python3-pluggy-0:1.5 100% | 53.6 MiB/s | 219.7 KiB | 00m00s [18/24] Installing python3-pytest-0:8.3 100% | 114.3 MiB/s | 4.1 MiB | 00m00s [19/24] Installing python3-execnet-0:2. 100% | 96.8 MiB/s | 991.4 KiB | 00m00s [20/24] Installing python3-pytest-xdist 100% | 77.0 MiB/s | 472.9 KiB | 00m00s [21/24] Installing python3-hypothesis-0 100% | 107.8 MiB/s | 4.9 MiB | 00m00s [22/24] Installing python3-devel-0:3.14 100% | 53.6 MiB/s | 2.0 MiB | 00m00s [23/24] Installing python3-immutables-0 100% | 46.6 MiB/s | 190.9 KiB | 00m00s [24/24] Installing python3-typing-exten 100% | 10.0 MiB/s | 540.1 KiB | 00m00s Warning: skipped OpenPGP checks for 22 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Finish: build setup for python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Start: rpmbuild python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.jFw84U Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.GGH1zM + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + rm -rf cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + sed -r -i 's/ --benchmark[^[:blank:]"]*//g' pyproject.toml + sed -r -i 's/^(version = ).*/\1 "24.1.2"/' docs/conf.py + rm -rv docs/_static/fonts/ removed 'docs/_static/fonts/ubuntu-mono-v15-latin-700.woff' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-700.woff2' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-700italic.woff' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-700italic.woff2' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-italic.woff' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-italic.woff2' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-regular.woff' removed 'docs/_static/fonts/ubuntu-mono-v15-latin-regular.woff2' removed directory 'docs/_static/fonts/' + echo 'latex_engine = '\''xelatex'\''' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.9NS9gV + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + export SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=43 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir --output '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' -x ujson -x orjson -x msgpack -x pyyaml -x tomlkit -x cbor2 -x bson -x msgspec Handling hatchling from build-system.requires Requirement not satisfied: hatchling Handling hatch-vcs from build-system.requires Requirement not satisfied: hatch-vcs Exiting dependency generation pass: build backend + cat '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-cattrs-24.1.2^20241004gitae80674-11.fc43.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 917.9 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 42.7 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 70.9 KiB/s | 3.8 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.18.1-1.fc43.noarch" is already installed. Package "python3-devel-3.14.0~b1-1.fc43.x86_64" is already installed. Package "python3-hypothesis-6.123.0-3.fc43.noarch" is already installed. Package "python3-immutables-0.21-2.fc43.x86_64" is already installed. Package "python3-packaging-25.0-1.fc43.noarch" is already installed. Package "python3-pytest-8.3.4-3.fc43.noarch" is already installed. Package "python3-pytest-xdist-3.6.1-5.fc43.noarch" is already installed. Package "python3-typing-extensions-4.12.2-3.fc42.noarch" is already installed. Package Arch Version Repository Size Installing: python3-hatch-vcs noarch 0.4.0-8.fc43 copr_base 34.0 KiB python3-hatchling noarch 1.27.0-3.fc43 copr_base 652.9 KiB python3-pip noarch 24.3.1-2.fc42 copr_base 12.0 MiB Installing dependencies: python3-pathspec noarch 0.12.1-8.fc43 copr_base 207.8 KiB python3-setuptools noarch 78.1.1-5.fc43 copr_base 9.0 MiB python3-setuptools_scm noarch 8.3.1-2.fc43 copr_base 354.5 KiB python3-trove-classifiers noarch 2025.5.9.12-1.fc43 copr_base 110.9 KiB Transaction Summary: Installing: 7 packages Total size of inbound packages is 5 MiB. Need to download 0 B. After this operation, 22 MiB extra will be used (install 22 MiB, remove 0 B). [1/7] python3-hatch-vcs-0:0.4.0-8.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [2/7] python3-hatchling-0:1.27.0-3.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [3/7] python3-pip-0:24.3.1-2.fc42.noarc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [4/7] python3-pathspec-0:0.12.1-8.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [5/7] python3-trove-classifiers-0:2025. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [6/7] python3-setuptools_scm-0:8.3.1-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [7/7] python3-setuptools-0:78.1.1-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [7/7] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [1/9] Verify package files 100% | 304.0 B/s | 7.0 B | 00m00s [2/9] Prepare transaction 100% | 200.0 B/s | 7.0 B | 00m00s [3/9] Installing python3-setuptools-0:7 100% | 112.5 MiB/s | 9.2 MiB | 00m00s [4/9] Installing python3-setuptools_scm 100% | 52.2 MiB/s | 374.4 KiB | 00m00s [5/9] Installing python3-trove-classifi 100% | 6.6 MiB/s | 114.7 KiB | 00m00s [6/9] Installing python3-pathspec-0:0.1 100% | 52.5 MiB/s | 214.9 KiB | 00m00s [7/9] Installing python3-hatchling-0:1. 100% | 22.1 MiB/s | 702.1 KiB | 00m00s [8/9] Installing python3-hatch-vcs-0:0. 100% | 7.8 MiB/s | 40.0 KiB | 00m00s [9/9] Installing python3-pip-0:24.3.1-2 100% | 80.4 MiB/s | 12.2 MiB | 00m00s Warning: skipped OpenPGP checks for 7 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.L3za5W + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + export SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=43 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir --output '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' -x ujson -x orjson -x msgpack -x pyyaml -x tomlkit -x cbor2 -x bson -x msgspec Handling hatchling from build-system.requires Requirement satisfied: hatchling (installed: hatchling 1.27.0) Handling hatch-vcs from build-system.requires Requirement satisfied: hatch-vcs (installed: hatch-vcs 0.4.0) Handling attrs>=23.1.0 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: attrs>=23.1.0 (installed: attrs 25.3.0) Handling exceptiongroup>=1.1.1; python_version < '3.11' from hook generated metadata: Requires-Dist (cattrs) Ignoring alien requirement: exceptiongroup>=1.1.1; python_version < '3.11' Handling typing-extensions>=4.12.2 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: typing-extensions>=4.12.2 (installed: typing-extensions 4.12.2) Handling pymongo>=4.4.0; extra == 'bson' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: pymongo>=4.4.0; extra == 'bson' Handling cbor2>=5.4.6; extra == 'cbor2' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: cbor2>=5.4.6; extra == 'cbor2' Handling msgpack>=1.0.5; extra == 'msgpack' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: msgpack>=1.0.5; extra == 'msgpack' Handling msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' Handling orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' Handling pyyaml>=6.0; extra == 'pyyaml' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: pyyaml>=6.0; extra == 'pyyaml' Handling tomlkit>=0.11.8; extra == 'tomlkit' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: tomlkit>=0.11.8; extra == 'tomlkit' Handling ujson>=5.10.0; extra == 'ujson' from hook generated metadata: Requires-Dist (cattrs) Requirement not satisfied: ujson>=5.10.0; extra == 'ujson' + cat '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' + rm -rfv cattrs-24.1.2.dist-info/ removed 'cattrs-24.1.2.dist-info/METADATA' removed directory 'cattrs-24.1.2.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-cattrs-24.1.2^20241004gitae80674-11.fc43.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 826.0 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 48.0 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 70.9 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 26.9 MiB/s | 5.0 MiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.18.1-1.fc43.noarch" is already installed. Package "python3-devel-3.14.0~b1-1.fc43.x86_64" is already installed. Package "python3-attrs-25.3.0-1.fc43.noarch" is already installed. Package "python3-hatch-vcs-0.4.0-8.fc43.noarch" is already installed. Package "python3-hatchling-1.27.0-3.fc43.noarch" is already installed. Package "python3-hypothesis-6.123.0-3.fc43.noarch" is already installed. Package "python3-immutables-0.21-2.fc43.x86_64" is already installed. Package "python3-packaging-25.0-1.fc43.noarch" is already installed. Package "python3-pip-24.3.1-2.fc42.noarch" is already installed. Package "python3-pytest-8.3.4-3.fc43.noarch" is already installed. Package "python3-pytest-xdist-3.6.1-5.fc43.noarch" is already installed. Package "python3-typing-extensions-4.12.2-3.fc42.noarch" is already installed. Package "python3-typing-extensions-4.12.2-3.fc42.noarch" is already installed. Package Arch Version Repository Size Installing: python3-cbor2 x86_64 5.6.5-2.fc43 copr_base 334.1 KiB python3-msgpack x86_64 1.1.0-2.fc43 copr_base 335.6 KiB python3-msgspec x86_64 0.19.0-2.fc43 copr_base 617.0 KiB python3-orjson x86_64 3.10.18-1.fc43 copr_base 685.4 KiB python3-pymongo x86_64 4.9.1-3.fc43 copr_base 6.3 MiB python3-pyyaml x86_64 6.0.2-2.fc43 copr_base 793.4 KiB python3-tomlkit noarch 0.13.2-2.fc43 copr_base 493.9 KiB python3-ujson x86_64 5.10.0-2.fc43 copr_base 76.1 KiB Installing dependencies: double-conversion x86_64 3.3.1-2.fc43 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 97.6 KiB libyaml x86_64 0.2.5-16.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 134.7 KiB python3-bson x86_64 4.9.1-3.fc43 copr_base 718.9 KiB python3-dns noarch 2.7.0-3.fc43 copr_base 3.1 MiB Transaction Summary: Installing: 12 packages Total size of inbound packages is 3 MiB. Need to download 934 KiB. After this operation, 14 MiB extra will be used (install 14 MiB, remove 0 B). [ 1/12] python3-pymongo-0:4.9.1-3.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/12] python3-pyyaml-0:6.0.2-2.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/12] python3-bson-0:4.9.1-3.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/12] libyaml-0:0.2.5-16.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/12] python3-dns-0:2.7.0-3.fc43.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/12] python3-cbor2-0:5.6.5-2.fc43.x8 100% | 2.3 MiB/s | 108.5 KiB | 00m00s [ 7/12] python3-msgspec-0:0.19.0-2.fc43 100% | 3.5 MiB/s | 220.3 KiB | 00m00s [ 8/12] python3-orjson-0:3.10.18-1.fc43 100% | 11.7 MiB/s | 286.8 KiB | 00m00s [ 9/12] python3-tomlkit-0:0.13.2-2.fc43 100% | 10.6 MiB/s | 119.5 KiB | 00m00s [10/12] python3-ujson-0:5.10.0-2.fc43.x 100% | 3.9 MiB/s | 35.7 KiB | 00m00s [11/12] python3-msgpack-0:1.1.0-2.fc43. 100% | 1.3 MiB/s | 111.1 KiB | 00m00s [12/12] double-conversion-0:3.3.1-2.fc4 100% | 759.1 KiB/s | 51.6 KiB | 00m00s -------------------------------------------------------------------------------- [12/12] Total 100% | 6.0 MiB/s | 933.6 KiB | 00m00s Running transaction [ 1/14] Verify package files 100% | 857.0 B/s | 12.0 B | 00m00s [ 2/14] Prepare transaction 100% | 400.0 B/s | 12.0 B | 00m00s [ 3/14] Installing python3-dns-0:2.7.0- 100% | 106.9 MiB/s | 3.2 MiB | 00m00s [ 4/14] Installing libyaml-0:0.2.5-16.f 100% | 132.9 MiB/s | 136.0 KiB | 00m00s [ 5/14] Installing double-conversion-0: 100% | 48.5 MiB/s | 99.4 KiB | 00m00s [ 6/14] Installing python3-bson-0:4.9.1 100% | 89.5 MiB/s | 733.0 KiB | 00m00s [ 7/14] Installing python3-pymongo-0:4. 100% | 193.4 MiB/s | 6.4 MiB | 00m00s [ 8/14] Installing python3-ujson-0:5.10 100% | 25.5 MiB/s | 78.3 KiB | 00m00s [ 9/14] Installing python3-pyyaml-0:6.0 100% | 98.6 MiB/s | 807.3 KiB | 00m00s [10/14] Installing python3-tomlkit-0:0. 100% | 122.8 MiB/s | 503.0 KiB | 00m00s [11/14] Installing python3-orjson-0:3.1 100% | 134.8 MiB/s | 690.0 KiB | 00m00s [12/14] Installing python3-msgspec-0:0. 100% | 122.2 MiB/s | 625.6 KiB | 00m00s [13/14] Installing python3-msgpack-0:1. 100% | 83.2 MiB/s | 340.7 KiB | 00m00s [14/14] Installing python3-cbor2-0:5.6. 100% | 6.7 MiB/s | 341.4 KiB | 00m00s Warning: skipped OpenPGP checks for 12 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.ejzcMa + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + export SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=43 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir --output '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' -x ujson -x orjson -x msgpack -x pyyaml -x tomlkit -x cbor2 -x bson -x msgspec Handling hatchling from build-system.requires Requirement satisfied: hatchling (installed: hatchling 1.27.0) Handling hatch-vcs from build-system.requires Requirement satisfied: hatch-vcs (installed: hatch-vcs 0.4.0) Handling attrs>=23.1.0 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: attrs>=23.1.0 (installed: attrs 25.3.0) Handling exceptiongroup>=1.1.1; python_version < '3.11' from hook generated metadata: Requires-Dist (cattrs) Ignoring alien requirement: exceptiongroup>=1.1.1; python_version < '3.11' Handling typing-extensions>=4.12.2 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: typing-extensions>=4.12.2 (installed: typing-extensions 4.12.2) Handling pymongo>=4.4.0; extra == 'bson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: pymongo>=4.4.0; extra == 'bson' (installed: pymongo 4.9.1) Handling cbor2>=5.4.6; extra == 'cbor2' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: cbor2>=5.4.6; extra == 'cbor2' (installed: cbor2 5.6.5) Handling msgpack>=1.0.5; extra == 'msgpack' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: msgpack>=1.0.5; extra == 'msgpack' (installed: msgpack 1.1.0) Handling msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' (installed: msgspec 0.19.0) Handling orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' (installed: orjson 3.10.18) Handling pyyaml>=6.0; extra == 'pyyaml' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: pyyaml>=6.0; extra == 'pyyaml' (installed: pyyaml 6.0.2) Handling tomlkit>=0.11.8; extra == 'tomlkit' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: tomlkit>=0.11.8; extra == 'tomlkit' (installed: tomlkit 0.13.2) Handling ujson>=5.10.0; extra == 'ujson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: ujson>=5.10.0; extra == 'ujson' (installed: ujson 5.10.0) + cat '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' + rm -rfv cattrs-24.1.2.dist-info/ removed 'cattrs-24.1.2.dist-info/METADATA' removed directory 'cattrs-24.1.2.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-cattrs-24.1.2^20241004gitae80674-11.fc43.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 953.2 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 40.5 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 58.0 KiB/s | 3.8 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.18.1-1.fc43.noarch" is already installed. Package "python3-devel-3.14.0~b1-1.fc43.x86_64" is already installed. Package "python3-attrs-25.3.0-1.fc43.noarch" is already installed. Package "python3-cbor2-5.6.5-2.fc43.x86_64" is already installed. Package "python3-hatch-vcs-0.4.0-8.fc43.noarch" is already installed. Package "python3-hatchling-1.27.0-3.fc43.noarch" is already installed. Package "python3-hypothesis-6.123.0-3.fc43.noarch" is already installed. Package "python3-immutables-0.21-2.fc43.x86_64" is already installed. Package "python3-msgpack-1.1.0-2.fc43.x86_64" is already installed. Package "python3-msgspec-0.19.0-2.fc43.x86_64" is already installed. Package "python3-orjson-3.10.18-1.fc43.x86_64" is already installed. Package "python3-packaging-25.0-1.fc43.noarch" is already installed. Package "python3-pip-24.3.1-2.fc42.noarch" is already installed. Package "python3-pymongo-4.9.1-3.fc43.x86_64" is already installed. Package "python3-pytest-8.3.4-3.fc43.noarch" is already installed. Package "python3-pytest-xdist-3.6.1-5.fc43.noarch" is already installed. Package "python3-pyyaml-6.0.2-2.fc43.x86_64" is already installed. Package "python3-tomlkit-0.13.2-2.fc43.noarch" is already installed. Package "python3-typing-extensions-4.12.2-3.fc42.noarch" is already installed. Package "python3-typing-extensions-4.12.2-3.fc42.noarch" is already installed. Package "python3-ujson-5.10.0-2.fc43.x86_64" is already installed. Nothing to do. Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1740614400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.YQQZnA + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + export SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=43 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir --output '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' -x ujson -x orjson -x msgpack -x pyyaml -x tomlkit -x cbor2 -x bson -x msgspec Handling hatchling from build-system.requires Requirement satisfied: hatchling (installed: hatchling 1.27.0) Handling hatch-vcs from build-system.requires Requirement satisfied: hatch-vcs (installed: hatch-vcs 0.4.0) Handling attrs>=23.1.0 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: attrs>=23.1.0 (installed: attrs 25.3.0) Handling exceptiongroup>=1.1.1; python_version < '3.11' from hook generated metadata: Requires-Dist (cattrs) Ignoring alien requirement: exceptiongroup>=1.1.1; python_version < '3.11' Handling typing-extensions>=4.12.2 from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: typing-extensions>=4.12.2 (installed: typing-extensions 4.12.2) Handling pymongo>=4.4.0; extra == 'bson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: pymongo>=4.4.0; extra == 'bson' (installed: pymongo 4.9.1) Handling cbor2>=5.4.6; extra == 'cbor2' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: cbor2>=5.4.6; extra == 'cbor2' (installed: cbor2 5.6.5) Handling msgpack>=1.0.5; extra == 'msgpack' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: msgpack>=1.0.5; extra == 'msgpack' (installed: msgpack 1.1.0) Handling msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec' (installed: msgspec 0.19.0) Handling orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: orjson>=3.10.7; (implementation_name == 'cpython') and extra == 'orjson' (installed: orjson 3.10.18) Handling pyyaml>=6.0; extra == 'pyyaml' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: pyyaml>=6.0; extra == 'pyyaml' (installed: pyyaml 6.0.2) Handling tomlkit>=0.11.8; extra == 'tomlkit' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: tomlkit>=0.11.8; extra == 'tomlkit' (installed: tomlkit 0.13.2) Handling ujson>=5.10.0; extra == 'ujson' from hook generated metadata: Requires-Dist (cattrs) Requirement satisfied: ujson>=5.10.0; extra == 'ujson' (installed: ujson 5.10.0) + cat '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-buildrequires' + rm -rfv cattrs-24.1.2.dist-info/ removed 'cattrs-24.1.2.dist-info/METADATA' removed directory 'cattrs-24.1.2.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.3kXeth + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + export SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + SETUPTOOLS_SCM_PRETEND_VERSION=24.1.2 + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir Processing /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 Preparing metadata (pyproject.toml): started Running command Preparing metadata (pyproject.toml) Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: cattrs Building wheel for cattrs (pyproject.toml): started Running command Building wheel for cattrs (pyproject.toml) Building wheel for cattrs (pyproject.toml): finished with status 'done' Created wheel for cattrs: filename=cattrs-24.1.2-py3-none-any.whl size=66366 sha256=262454881cd5d49967cb85ace63a25d26a883775e5a91081017e17c5b7578483 Stored in directory: /builddir/.cache/pip/wheels/dd/b8/0a/6f50ec1ea1b1e888c18ce8407808a47b0d857ad79058de748f Successfully built cattrs + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.gAdOMc + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + '[' /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT ++ dirname /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT + mkdir -p /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + mkdir /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 ++ ls /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir/cattrs-24.1.2-py3-none-any.whl ++ xargs basename --multiple ++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/' + specifier=cattrs==24.1.2 + '[' -z cattrs==24.1.2 ']' + TMPDIR=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir + /usr/bin/python3 -m pip install --root /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir cattrs==24.1.2 Using pip 24.3.1 from /usr/lib/python3.14/site-packages/pip (python 3.14) Looking in links: /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/pyproject-wheeldir Processing ./pyproject-wheeldir/cattrs-24.1.2-py3-none-any.whl Installing collected packages: cattrs Successfully installed cattrs-24.1.2 + '[' -d /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/bin ']' + rm -f '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-ghost-distinfo' + site_dirs=() + '[' -d /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + site_dirs+=("/usr/lib/python3.14/site-packages") + '[' /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib64/python3.14/site-packages '!=' /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + '[' -d /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib64/python3.14/site-packages ']' + for site_dir in ${site_dirs[@]} + for distinfo in /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT$site_dir/*.dist-info + echo '%ghost /usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info' + sed -i s/pip/rpm/ /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/INSTALLER + PYTHONPATH=/usr/lib/rpm/redhat + /usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py --buildroot /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT --record /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/RECORD --output '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-record' + rm -fv /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/RECORD removed '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/RECORD' + rm -fv /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/REQUESTED removed '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs-24.1.2.dist-info/REQUESTED' ++ wc -l '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-ghost-distinfo' ++ cut -f1 '-d ' + lines=1 + '[' 1 -ne 1 ']' + RPM_FILES_ESCAPE=4.19 + /usr/bin/python3 /usr/lib/rpm/redhat/pyproject_save_files.py --output-files '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-files' --output-modules '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-modules' --buildroot /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT --sitelib /usr/lib/python3.14/site-packages --sitearch /usr/lib64/python3.14/site-packages --python-version 3.14 --pyproject-record '/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/python-cattrs-24.1.2^20241004gitae80674-11.fc43.x86_64-pyproject-record' --prefix /usr -l cattrs cattr + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + /usr/lib/rpm/redhat/brp-python-rpm-in-distinfo + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j2 Bytecompiling .py files below /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14 using python3.14 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-determinism --brp -j2 /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/json.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/msgpack.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/orjson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/pyyaml.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/tomlkit.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/ujson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/converters.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/disambiguators.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/dispatch.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/errors.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/__pycache__/gen.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattr/preconf/__pycache__/bson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/_consts.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/_generics.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/_lc.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/_shared.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/typeddicts.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/bson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/cbor2.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/json.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/msgpack.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/msgspec.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/pyyaml.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/orjson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/ujson.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/__pycache__/tomlkit.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/__pycache__/_class_methods.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/__pycache__/_subclasses.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/__pycache__/_unions.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/_generics.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/_compat.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/cols.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/disambiguators.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/dispatch.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/errors.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/fns.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/v.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/_compat.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/__pycache__/converters.cpython-314.pyc: rewriting with normalized contents Scanned 19 directories and 138 files, processed 45 inodes, 45 modified (2 replaced + 43 rewritten), 0 unsupported format, 0 errors Reading /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/SPECPARTS/rpm-debuginfo.specpart Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.SZ7SuX + umask 022 + cd /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 + k='not test_simple_roundtrip_defaults' + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + PATH=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin + PYTHONPATH=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_ADDOPTS=' --ignore=/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/.pyproject-builddir' + PYTEST_XDIST_AUTO_NUM_WORKERS=2 + /usr/bin/pytest '--ignore-glob=bench/*' -k 'not test_simple_roundtrip_defaults' -n auto ============================= test session starts ============================== platform linux -- Python 3.14.0b1, pytest-8.3.4, pluggy-1.5.0 rootdir: /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96 configfile: pyproject.toml plugins: xdist-3.6.1, hypothesis-6.123.0 created: 2/2 workers 2 workers [781 items] ........................................................................ [ 9%] .....................................FFFF............................... [ 18%] ........................................................................ [ 27%] ........................................................................ [ 36%] ..............................FFFF......EEEEEEEEEEEE.............xxx...x [ 46%] xx.xFE.xEEEE.EEEEEEEE.............xxx...xxx.xF.....FFFF................. [ 55%] ........................................................................ [ 64%] .......................F......................................F......F.. [ 73%] ......F.F............................................Fatal Python error: Segmentation fault Thread 0x00007ff386e086c0 [python3] (most recent call first): File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 534 in read File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 567 in from_io File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1160 in _thread_receiver File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn Current thread 0x00007ff388014bc0 [python3] (most recent call first): File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 406 in test_orjson File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 878 in test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 393 in test_orjson File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 978 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 713 in default_executor File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1003 in execute_once File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1064 in _execute_once_for_engine File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 338 in __stoppable_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 470 in test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1542 in cached_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 974 in generate_new_examples File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1304 in _run File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 810 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1211 in run_engine File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1755 in wrapped_test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 393 in test_orjson File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159 in pytest_pyfunc_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627 in runtest File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174 in pytest_runtest_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242 in File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341 in from_call File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 241 in call_and_report File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 132 in runtestprotocol File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 113 in pytest_runtest_protocol File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 195 in run_one_test File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 174 in pytest_runtestloop File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 337 in _main File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 283 in wrap_session File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 330 in pytest_cmdline_main File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 393 in File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1291 in executetask File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 389 in integrate_as_primary_thread File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1273 in serve File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1806 in serve File "", line 8 in File "", line 1 in Current thread's C stack trace (most recent call first): Binary file "/lib64/libpython3.14.so.1.0", at _Py_DumpStack+0x4c [0x7ff388416f85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7ff388417a09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7ff388123bf0] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f444 [0x7ff3742a3444] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x269d8 [0x7ff37429a9d8] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f078 [0x7ff3742a3078] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at dumps+0x175 [0x7ff3742a3e75] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_Vectorcall+0x37 [0x7ff38844e0f7] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7ff388461a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7ff38845d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7ff38853c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7ff3885986f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7ff38844a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7ff388467701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7ff38845d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7ff38853c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7ff3885986f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7ff388550d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7ff388466d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7ff38845d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7ff38853c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7ff3885986f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7ff38844a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7ff388467701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7ff3884d0d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7ff388466d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7ff38845d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7ff38853c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7ff3885986f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7ff38844a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7ff38846fe76] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7ff38845d805] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw0] node down: Not properly terminated F replacing crashed worker gw0 ...............................................F.FF...................Fatal Python error: Segmentation fault Thread 0x00007fe7e660e6c0 [python3] (most recent call first): File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 534 in read File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 567 in from_io File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1160 in _thread_receiver File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn Current thread 0x00007fe7e781abc0 [python3] (most recent call first): File "/usr/lib64/python3.14/site-packages/bson/__init__.py", line 1050 in encode File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 522 in test_bson File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 878 in test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 509 in test_bson File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 978 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 713 in default_executor File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1003 in execute_once File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1064 in _execute_once_for_engine File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 338 in __stoppable_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 470 in test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1542 in cached_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 974 in generate_new_examples File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1304 in _run File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 810 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1211 in run_engine File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1755 in wrapped_test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 509 in test_bson File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159 in pytest_pyfunc_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627 in runtest File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174 in pytest_runtest_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242 in File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341 in from_call File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 241 in call_and_report File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 132 in runtestprotocol File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 113 in pytest_runtest_protocol File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 195 in run_one_test File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 174 in pytest_runtestloop File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 337 in _main File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 283 in wrap_session File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 330 in pytest_cmdline_main File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 393 in File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1291 in executetask File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 389 in integrate_as_primary_thread File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1273 in serve File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1806 in serve File "", line 8 in File "", line 1 in Current thread's C stack trace (most recent call first): Binary file "/lib64/libpython3.14.so.1.0", at _Py_DumpStack+0x4c [0x7fe7e7c1cf85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7fe7e7c1da09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7fe7e7929bf0] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_GetOptionalAttr+0x21 [0x7fe7e7c83b71] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_HasAttr+0x23 [0x7fe7e7bd90ef] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x2275 [0x7fe7e4083275] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x446d [0x7fe7e408546d] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x4cfa [0x7fe7e4085cfa] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x56e6 [0x7fe7e40866e6] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5a30 [0x7fe7e4086a30] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5c33 [0x7fe7e4086c33] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x611d [0x7fe7e408711d] Binary file "/lib64/libpython3.14.so.1.0", at +0x18a5ce [0x7fe7e7c8b5ce] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fe7e7c500dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7fe7e7c67a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fe7e7c63805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fe7e7d42740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fe7e7d9e6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fe7e7c500dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7fe7e7c6d701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fe7e7c63805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fe7e7d42740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fe7e7d9e6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7fe7e7d56d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7fe7e7c6cd2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fe7e7c63805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fe7e7d42740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fe7e7d9e6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fe7e7c500dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7fe7e7c6d701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7fe7e7cd6d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7fe7e7c6cd2b] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw1] node down: Not properly terminated F replacing crashed worker gw1 ..........s.....................Fatal Python error: Segmentation fault Thread 0x00007f51640db6c0 [python3] (most recent call first): File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 534 in read File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 567 in from_io File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1160 in _thread_receiver File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn Current thread 0x00007f51652e7bc0 [python3] (most recent call first): File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/orjson.py", line 23 in dumps File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 421 in test_orjson_converter File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 878 in test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 411 in test_orjson_converter File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 978 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 713 in default_executor File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1003 in execute_once File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1064 in _execute_once_for_engine File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 338 in __stoppable_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 470 in test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1542 in cached_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 974 in generate_new_examples File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1304 in _run File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 810 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1211 in run_engine File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1755 in wrapped_test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 411 in test_orjson_converter File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159 in pytest_pyfunc_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627 in runtest File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174 in pytest_runtest_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242 in File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341 in from_call File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 241 in call_and_report File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 132 in runtestprotocol File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 113 in pytest_runtest_protocol File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 195 in run_one_test File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 174 in pytest_runtestloop File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 337 in _main File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 283 in wrap_session File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 330 in pytest_cmdline_main File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 393 in File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1291 in executetask File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 389 in integrate_as_primary_thread File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1273 in serve File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1806 in serve File "", line 8 in File "", line 1 in Current thread's C stack trace (most recent call first): Binary file "/lib64/libpython3.14.so.1.0", at _Py_DumpStack+0x4c [0x7f51656e9f85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7f51656eaa09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7f51653f6bf0] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f444 [0x7f5156ba3444] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x269d8 [0x7f5156b9a9d8] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f078 [0x7f5156ba3078] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at dumps+0x175 [0x7f5156ba3e75] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f5165739d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5165730805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f516580f740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f516586b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f516571d0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f516573a701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5165730805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f516580f740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f516586b6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7f5165823d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f5165739d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5165730805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f516580f740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f516586b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f516571d0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f516573a701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7f51657a3d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f5165739d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5165730805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f516580f740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f516586b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f516571d0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7f5165742e76] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5165730805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f516580f740] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw2] node down: Not properly terminated F replacing crashed worker gw2 ...F..................sss.................Fatal Python error: Segmentation fault Thread 0x00007f5cda04c6c0 [python3] (most recent call first): File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 534 in read File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 567 in from_io File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1160 in _thread_receiver File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn Current thread 0x00007f5cdb258bc0 [python3] (most recent call first): File "/usr/lib64/python3.14/site-packages/bson/__init__.py", line 1050 in encode File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/preconf/bson.py", line 32 in dumps File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 544 in test_bson_converter File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 878 in test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 534 in test_bson_converter File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 978 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 713 in default_executor File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1003 in execute_once File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1064 in _execute_once_for_engine File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 338 in __stoppable_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 470 in test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1542 in cached_test_function File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 974 in generate_new_examples File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 1304 in _run File "/usr/lib/python3.14/site-packages/hypothesis/internal/conjecture/engine.py", line 810 in run File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1211 in run_engine File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1755 in wrapped_test File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_preconf.py", line 534 in test_bson_converter File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159 in pytest_pyfunc_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627 in runtest File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174 in pytest_runtest_call File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242 in File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341 in from_call File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 241 in call_and_report File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 132 in runtestprotocol File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 113 in pytest_runtest_protocol File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 195 in run_one_test File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 174 in pytest_runtestloop File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 337 in _main File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 283 in wrap_session File "/usr/lib/python3.14/site-packages/_pytest/main.py", line 330 in pytest_cmdline_main File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103 in _multicall File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120 in _hookexec File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513 in __call__ File "/usr/lib/python3.14/site-packages/xdist/remote.py", line 393 in File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1291 in executetask File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 341 in run File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 411 in _perform_spawn File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 389 in integrate_as_primary_thread File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1273 in serve File "/usr/lib/python3.14/site-packages/execnet/gateway_base.py", line 1806 in serve File "", line 8 in File "", line 1 in Current thread's C stack trace (most recent call first): Binary file "/lib64/libpython3.14.so.1.0", at _Py_DumpStack+0x4c [0x7f5cdb65af85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7f5cdb65ba09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7f5cdb367bf0] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_GetOptionalAttr+0x21 [0x7f5cdb6c1b71] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_HasAttr+0x23 [0x7f5cdb6170ef] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x2275 [0x7f5cd8003275] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x446d [0x7f5cd800546d] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x4cfa [0x7f5cd8005cfa] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x56e6 [0x7f5cd80066e6] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5a30 [0x7f5cd8006a30] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5c33 [0x7f5cd8006c33] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x611d [0x7f5cd800711d] Binary file "/lib64/libpython3.14.so.1.0", at +0x18a5ce [0x7f5cdb6c95ce] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f5cdb68e0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7f5cdb6a5a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5cdb6a1805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f5cdb780740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f5cdb7dc6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f5cdb68e0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f5cdb6ab701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5cdb6a1805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f5cdb780740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f5cdb7dc6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7f5cdb794d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f5cdb6aad2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f5cdb6a1805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f5cdb780740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f5cdb7dc6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f5cdb68e0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f5cdb6ab701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7f5cdb714d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f5cdb6aad2b] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw3] node down: Not properly terminated F replacing crashed worker gw3 .... [100%] ==================================== ERRORS ==================================== _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-parent-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7df542820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-child1-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7df542820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-child2-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee4b950> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-grandchild-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee485c0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-union-compose-parent] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7df542820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-union-compose-child] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee4b8a0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-union-compose-grandchild] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee48880> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-non-union-compose-parent] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7df542820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-non-union-compose-child] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee489e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-non-union-compose-grandchild] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee49170> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-union-container] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7df542820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_structuring_with_inheritance[with-subclasses-non-union-container] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7dee4be20> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError __________ ERROR at setup of test_circular_reference[with-subclasses] __________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def58880> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-parent-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc54e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-child1-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc6090> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-child2-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc5850> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-grandchild-only] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc75e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-union-compose-parent] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc54e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-union-compose-child] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc68d0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-union-compose-grandchild] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc6ae0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-non-union-compose-parent] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc49e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-non-union-compose-child] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc4720> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-non-union-compose-grandchild] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc6140> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-union-container] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc4e00> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _ ERROR at setup of test_unstructuring_with_inheritance[with-subclasses-non-union-container] _ [gw1] linux -- Python 3.14.0 /usr/bin/python3 request = > @pytest.fixture( params=["with-subclasses", "with-subclasses-and-tagged-union", "wo-subclasses"] ) def conv_w_subclasses(request): c = Converter() if request.param == "with-subclasses": > include_subclasses(Parent, c) c = request = > tests/strategies/test_include_subclasses.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7defc6e50> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError =================================== FAILURES =================================== _________ test_detailed_validation_from_converter[BaseConverter-True] __________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_detailed_validation_from_converter(converter: BaseConverter): """ `detailed_validation` is taken from the converter by default. """ class A(ExtensionsTypedDict): a: int converter.register_structure_hook(A, make_dict_structure_fn(A, converter)) if converter.detailed_validation: > with pytest.raises(ClassValidationError): E Failed: DID NOT RAISE A = .A'> converter = tests/test_typeddicts.py:485: Failed _________ test_detailed_validation_from_converter[BaseConverter-False] _________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_detailed_validation_from_converter(converter: BaseConverter): """ `detailed_validation` is taken from the converter by default. """ class A(ExtensionsTypedDict): a: int converter.register_structure_hook(A, make_dict_structure_fn(A, converter)) if converter.detailed_validation: with pytest.raises(ClassValidationError): converter.structure({"a": "a"}, A) else: > with pytest.raises(ValueError): E Failed: DID NOT RAISE A = .A'> converter = tests/test_typeddicts.py:488: Failed ________________ test_override_entire_hooks[BaseConverter-True] ________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_override_entire_hooks(converter: BaseConverter): """Overriding entire hooks works.""" class A(ExtensionsTypedDict): a: int b: NotRequired[int] converter.register_structure_hook( A, make_dict_structure_fn( A, converter, a=override(struct_hook=lambda v, _: 1), b=override(struct_hook=lambda v, _: 2), ), ) converter.register_unstructure_hook( A, make_dict_unstructure_fn( A, converter, a=override(unstruct_hook=lambda v: 1), b=override(unstruct_hook=lambda v: 2), ), ) > assert converter.unstructure({"a": 10, "b": 10}, A) == {"a": 1, "b": 2} E AssertionError: assert {'a': 10, 'b': 10} == {'a': 1, 'b': 2} E E Differing items: E {'a': 10} != {'a': 1} E {'b': 10} != {'b': 2} E Use -v to get more diff A = .A'> converter = tests/test_typeddicts.py:518: AssertionError _______________ test_override_entire_hooks[BaseConverter-False] ________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_override_entire_hooks(converter: BaseConverter): """Overriding entire hooks works.""" class A(ExtensionsTypedDict): a: int b: NotRequired[int] converter.register_structure_hook( A, make_dict_structure_fn( A, converter, a=override(struct_hook=lambda v, _: 1), b=override(struct_hook=lambda v, _: 2), ), ) converter.register_unstructure_hook( A, make_dict_unstructure_fn( A, converter, a=override(unstruct_hook=lambda v: 1), b=override(unstruct_hook=lambda v: 2), ), ) > assert converter.unstructure({"a": 10, "b": 10}, A) == {"a": 1, "b": 2} E AssertionError: assert {'a': 10, 'b': 10} == {'a': 1, 'b': 2} E E Differing items: E {'a': 10} != {'a': 1} E {'b': 10} != {'b': 2} E Use -v to get more diff A = .A'> converter = tests/test_typeddicts.py:518: AssertionError ___________ test_detailed_validation_from_converter[Converter-True] ____________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_detailed_validation_from_converter(converter: BaseConverter): """ `detailed_validation` is taken from the converter by default. """ class A(ExtensionsTypedDict): a: int converter.register_structure_hook(A, make_dict_structure_fn(A, converter)) if converter.detailed_validation: > with pytest.raises(ClassValidationError): E Failed: DID NOT RAISE A = .A'> converter = tests/test_typeddicts.py:485: Failed ___________ test_detailed_validation_from_converter[Converter-False] ___________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_detailed_validation_from_converter(converter: BaseConverter): """ `detailed_validation` is taken from the converter by default. """ class A(ExtensionsTypedDict): a: int converter.register_structure_hook(A, make_dict_structure_fn(A, converter)) if converter.detailed_validation: with pytest.raises(ClassValidationError): converter.structure({"a": "a"}, A) else: > with pytest.raises(ValueError): E Failed: DID NOT RAISE A = .A'> converter = tests/test_typeddicts.py:488: Failed __________________ test_override_entire_hooks[Converter-True] __________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_override_entire_hooks(converter: BaseConverter): """Overriding entire hooks works.""" class A(ExtensionsTypedDict): a: int b: NotRequired[int] converter.register_structure_hook( A, make_dict_structure_fn( A, converter, a=override(struct_hook=lambda v, _: 1), b=override(struct_hook=lambda v, _: 2), ), ) converter.register_unstructure_hook( A, make_dict_unstructure_fn( A, converter, a=override(unstruct_hook=lambda v: 1), b=override(unstruct_hook=lambda v: 2), ), ) > assert converter.unstructure({"a": 10, "b": 10}, A) == {"a": 1, "b": 2} E AssertionError: assert {'a': 10, 'b': 10} == {'a': 1, 'b': 2} E E Differing items: E {'a': 10} != {'a': 1} E {'b': 10} != {'b': 2} E Use -v to get more diff A = .A'> converter = tests/test_typeddicts.py:518: AssertionError _________________ test_override_entire_hooks[Converter-False] __________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 converter = def test_override_entire_hooks(converter: BaseConverter): """Overriding entire hooks works.""" class A(ExtensionsTypedDict): a: int b: NotRequired[int] converter.register_structure_hook( A, make_dict_structure_fn( A, converter, a=override(struct_hook=lambda v, _: 1), b=override(struct_hook=lambda v, _: 2), ), ) converter.register_unstructure_hook( A, make_dict_unstructure_fn( A, converter, a=override(unstruct_hook=lambda v: 1), b=override(unstruct_hook=lambda v: 2), ), ) > assert converter.unstructure({"a": 10, "b": 10}, A) == {"a": 1, "b": 2} E AssertionError: assert {'a': 10, 'b': 10} == {'a': 1, 'b': 2} E E Differing items: E {'a': 10} != {'a': 1} E {'b': 10} != {'b': 2} E Use -v to get more diff A = .A'> converter = tests/test_typeddicts.py:518: AssertionError ___________________________ test_structure_as_union ____________________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 def test_structure_as_union(): converter = Converter() > include_subclasses(Parent, converter) converter = tests/strategies/test_include_subclasses.py:184: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def59dd0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'p': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'p'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'p'}, {'c1': 'c1', 'g': 'g', 'p': 'p'}), ...sses.Child1'>, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'p'}, {'c1': 'c1', 'p': 'p'}), (, {'p'}, {'p': 'p'}), (, {'p'}, {'p': 'p'})] other_reqs = {'c1', 'p'} overrides = [{}, {}, {}, {}, {}, {}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError _______________ test_structuring_unstructuring_unknown_subclass ________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 def test_structuring_unstructuring_unknown_subclass(): @define class A: a: int @define class A1(A): a1: int converter = Converter() > include_subclasses(A, converter) A = .A'> A1 = .A1'> converter = tests/strategies/test_include_subclasses.py:256: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = .A'> converter = overrides = None parent_subclass_tree = (.A'>, .A1'>, .A1'>) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = .A'> cls_is_cl = .cls_is_cl at 0x7fe7def81f30> converter = overrides = None parent_subclass_tree = (.A'>, .A1'>, .A1'>) subclass_union = tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A1 | tests.strategie...class..A1 | tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = None self = union = tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A1 | tests.strategie...class..A1 | tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A union_types = (.A1'>, .A1'>, .A'>) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}] classes = (.A1'>, .A1'>, .A'>) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: .A'> has no usable non-default attributes back_map = {'a': 'a'} best_discriminator = None best_result = None cl = .A'> cl_fields = {'a': Attribute(name='a', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=None...data=mappingproxy({}), type=, converter=None, kw_only=False, inherited=False, on_setattr=None, alias='a')} cl_reqs = {'a'} classes = (.A1'>, .A1'>, .A'>) cls_and_attrs = [(.A1'>, {'a'...ts.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A'>, {'a'}, {'a': 'a'})] cls_candidates = [set(), set(), set()] converter = discriminators = set() fallback = .A1'> maybe_renamed_attr_name = 'a1' orig_name = 'a1' other_classes = [(.A1'>, {'a'}, {'a': 'a'})] other_reqs = {'a'} overrides = [{}, {}, {}] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'a1': .A1'>} use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError ________________ test_overrides[wo-union-strategy-parent-only] _________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 with_union_strategy = False, struct_unstruct = 'parent-only' @pytest.mark.parametrize( "struct_unstruct", ["parent-only", "child1-only", "child2-only", "grandchild-only"] ) @pytest.mark.parametrize( "with_union_strategy", [True, False], ids=["with-union-strategy", "wo-union-strategy"], ) def test_overrides(with_union_strategy: bool, struct_unstruct: str): c = Converter() union_strategy = ( partial(configure_tagged_union, tag_name="type_name") if with_union_strategy else None ) > include_subclasses( Parent, c, overrides={"p": override(rename="u")}, union_strategy=union_strategy ) c = struct_unstruct = 'parent-only' union_strategy = None with_union_strategy = False tests/strategies/test_include_subclasses.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def83270> converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'u': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'u'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'u'}, {'c1': 'c1', 'g': 'g', 'u': 'p'}), ...sses.Child1'>, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'u'}, {'c1': 'c1', 'u': 'p'}), (, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'})] other_reqs = {'c1', 'u'} overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError ________________ test_overrides[wo-union-strategy-child1-only] _________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 with_union_strategy = False, struct_unstruct = 'child1-only' @pytest.mark.parametrize( "struct_unstruct", ["parent-only", "child1-only", "child2-only", "grandchild-only"] ) @pytest.mark.parametrize( "with_union_strategy", [True, False], ids=["with-union-strategy", "wo-union-strategy"], ) def test_overrides(with_union_strategy: bool, struct_unstruct: str): c = Converter() union_strategy = ( partial(configure_tagged_union, tag_name="type_name") if with_union_strategy else None ) > include_subclasses( Parent, c, overrides={"p": override(rename="u")}, union_strategy=union_strategy ) c = struct_unstruct = 'child1-only' union_strategy = None with_union_strategy = False tests/strategies/test_include_subclasses.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def83a00> converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'u': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'u'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'u'}, {'c1': 'c1', 'g': 'g', 'u': 'p'}), ...sses.Child1'>, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'u'}, {'c1': 'c1', 'u': 'p'}), (, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'})] other_reqs = {'c1', 'u'} overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError ________________ test_overrides[wo-union-strategy-child2-only] _________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 with_union_strategy = False, struct_unstruct = 'child2-only' @pytest.mark.parametrize( "struct_unstruct", ["parent-only", "child1-only", "child2-only", "grandchild-only"] ) @pytest.mark.parametrize( "with_union_strategy", [True, False], ids=["with-union-strategy", "wo-union-strategy"], ) def test_overrides(with_union_strategy: bool, struct_unstruct: str): c = Converter() union_strategy = ( partial(configure_tagged_union, tag_name="type_name") if with_union_strategy else None ) > include_subclasses( Parent, c, overrides={"p": override(rename="u")}, union_strategy=union_strategy ) c = struct_unstruct = 'child2-only' union_strategy = None with_union_strategy = False tests/strategies/test_include_subclasses.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def831c0> converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'u': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'u'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'u'}, {'c1': 'c1', 'g': 'g', 'u': 'p'}), ...sses.Child1'>, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'u'}, {'c1': 'c1', 'u': 'p'}), (, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'})] other_reqs = {'c1', 'u'} overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError ______________ test_overrides[wo-union-strategy-grandchild-only] _______________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 with_union_strategy = False, struct_unstruct = 'grandchild-only' @pytest.mark.parametrize( "struct_unstruct", ["parent-only", "child1-only", "child2-only", "grandchild-only"] ) @pytest.mark.parametrize( "with_union_strategy", [True, False], ids=["with-union-strategy", "wo-union-strategy"], ) def test_overrides(with_union_strategy: bool, struct_unstruct: str): c = Converter() union_strategy = ( partial(configure_tagged_union, tag_name="type_name") if with_union_strategy else None ) > include_subclasses( Parent, c, overrides={"p": override(rename="u")}, union_strategy=union_strategy ) c = struct_unstruct = 'grandchild-only' union_strategy = None with_union_strategy = False tests/strategies/test_include_subclasses.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:75: in include_subclasses _include_subclasses_without_union_strategy( cl = converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclasses = None union_strategy = None ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/strategies/_subclasses.py:117: in _include_subclasses_without_union_strategy dis_fn = converter._get_dis_func(subclass_union, overrides=overrides) base_struct_hook = base_unstruct_hook = cl = cls_is_cl = .cls_is_cl at 0x7fe7def80ca0> converter = overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:981: in _get_dis_func return create_default_dis_func( overrides = {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)} self = union = tests.strategies.test_include_subclasses.GrandChild | tests.strategies.test_include_subclasses.Child1 | tests.strategi...e_subclasses.Child2 | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.Child1 union_types = (, , , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] classes = (, , , ...) def create_default_dis_func( converter: BaseConverter, *classes: type[AttrsInstance], use_literals: bool = True, overrides: ( dict[str, AttributeOverride] | Literal["from_converter"] ) = "from_converter", ) -> Callable[[Mapping[Any, Any]], type[Any] | None]: """Given attrs classes or dataclasses, generate a disambiguation function. The function is based on unique fields without defaults or unique values. :param use_literals: Whether to try using fields annotated as literals for disambiguation. :param overrides: Attribute overrides to apply. .. versionchanged:: 24.1.0 Dataclasses are now supported. """ if len(classes) < 2: raise ValueError("At least two classes required.") if overrides == "from_converter": overrides = [ getattr(converter.get_structure_hook(c), "overrides", {}) for c in classes ] else: overrides = [overrides for _ in classes] # first, attempt for unique values if use_literals: # requirements for a discriminator field: # (... TODO: a single fallback is OK) # - it must always be enumerated cls_candidates = [ { at.name for at in adapted_fields(get_origin(cl) or cl) if is_literal(at.type) } for cl in classes ] # literal field names common to all members discriminators: set[str] = cls_candidates[0] for possible_discriminators in cls_candidates: discriminators &= possible_discriminators best_result = None best_discriminator = None for discriminator in discriminators: # maps Literal values (strings, ints...) to classes mapping = defaultdict(list) for cl in classes: for key in get_args( fields_dict(get_origin(cl) or cl)[discriminator].type ): mapping[key].append(cl) if best_result is None or max(len(v) for v in mapping.values()) <= max( len(v) for v in best_result.values() ): best_result = mapping best_discriminator = discriminator if ( best_result and best_discriminator and max(len(v) for v in best_result.values()) != len(classes) ): final_mapping = { k: v[0] if len(v) == 1 else Union[tuple(v)] for k, v in best_result.items() } def dis_func(data: Mapping[Any, Any]) -> type | None: if not isinstance(data, Mapping): raise ValueError("Only input mappings are supported.") return final_mapping[data[best_discriminator]] return dis_func # next, attempt for unique keys # NOTE: This could just as well work with just field availability and not # uniqueness, returning Unions ... it doesn't do that right now. cls_and_attrs = [ (cl, *_usable_attribute_names(cl, override)) for cl, override in zip(classes, overrides) ] # For each class, attempt to generate a single unique required field. uniq_attrs_dict: dict[str, type] = {} # We start from classes with the largest number of unique fields # so we can do easy picks first, making later picks easier. cls_and_attrs.sort(key=lambda c_a: len(c_a[1]), reverse=True) fallback = None # If none match, try this. for cl, cl_reqs, back_map in cls_and_attrs: # We do not have to consider classes we've already processed, since # they will have been eliminated by the match dictionary already. other_classes = [ c_and_a for c_and_a in cls_and_attrs if c_and_a[0] is not cl and c_and_a[0] not in uniq_attrs_dict.values() ] other_reqs = reduce(or_, (c_a[1] for c_a in other_classes), set()) uniq = cl_reqs - other_reqs # We want a unique attribute with no default. cl_fields = fields_dict(get_origin(cl) or cl) for maybe_renamed_attr_name in uniq: orig_name = back_map[maybe_renamed_attr_name] if cl_fields[orig_name].default in (NOTHING, MISSING): break else: if fallback is None: fallback = cl continue > raise TypeError(f"{cl} has no usable non-default attributes") E TypeError: has no usable non-default attributes back_map = {'c1': 'c1', 'u': 'p'} best_discriminator = None best_result = None cl = cl_fields = {'c1': Attribute(name='c1', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=No...adata=mappingproxy({}), type=, converter=None, kw_only=False, inherited=True, on_setattr=None, alias='p')} cl_reqs = {'c1', 'u'} classes = (, , , ...) cls_and_attrs = [(, {'c1', 'g', 'u'}, {'c1': 'c1', 'g': 'g', 'u': 'p'}), ...sses.Child1'>, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'}), ...] cls_candidates = [set(), set(), set(), set(), set(), set(), ...] converter = discriminators = set() fallback = maybe_renamed_attr_name = 'c2' orig_name = 'c2' other_classes = [(, {'c1', 'u'}, {'c1': 'c1', 'u': 'p'}), (, {'u'}, {'u': 'p'}), (, {'u'}, {'u': 'p'})] other_reqs = {'c1', 'u'} overrides = [{'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, {'p': At...ne)}, {'p': AttributeOverride(omit_if_default=None, rename='u', omit=None, struct_hook=None, unstruct_hook=None)}, ...] possible_discriminators = set() uniq = set() uniq_attrs_dict = {'c2': , 'g': } use_literals = True ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/disambiguators.py:159: TypeError __________________ test_disambiguate_from_discriminated_enum ___________________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 def test_disambiguate_from_discriminated_enum(): c = Converter() # can it find any discriminator? @define class A: a: Literal[0] @define class B: a: Literal[1] fn = create_default_dis_func(c, A, B) assert fn({"a": 0}) is A assert fn({"a": 1}) is B # can it find the better discriminator? @define class C: a: Literal[0] b: Literal[1] @define class D: a: Literal[0] b: Literal[0] fn = create_default_dis_func(c, C, D) assert fn({"a": 0, "b": 1}) is C assert fn({"a": 0, "b": 0}) is D # can it handle multiple tiers of discriminators? # (example inspired by Discord's gateway's discriminated union) @define class E: op: Literal[1] @define class F: op: Literal[0] t: Literal["MESSAGE_CREATE"] @define class G: op: Literal[0] t: Literal["MESSAGE_UPDATE"] fn = create_default_dis_func(c, E, F, G) assert fn({"op": 1}) is E > assert fn({"op": 0, "t": "MESSAGE_CREATE"}) is Union[F, G] E AssertionError: assert tests.test_disambiguators.test_disambiguate_from_discriminated_enum..F | tests.test_disambiguators.test_disambiguate_from_discriminated_enum..G is tests.test_disambiguators.test_disambiguate_from_discriminated_enum..F | tests.test_disambiguators.test_disambiguate_from_discriminated_enum..G E + where tests.test_disambiguators.test_disambiguate_from_discriminated_enum..F | tests.test_disambiguators.test_disambiguate_from_discriminated_enum..G = .dis_func at 0x7ff37f7f5bc0>({'op': 0, 't': 'MESSAGE_CREATE'}) A = .A'> B = .B'> C = .C'> D = .D'> E = .E'> F = .F'> G = .G'> c = fn = .dis_func at 0x7ff37f7f5bc0> tests/test_disambiguators.py:180: AssertionError _________________________ test_type_names_with_quotes __________________________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 @pytest.mark.skipif(not is_py39_plus, reason="literals and annotated are 3.9+") def test_type_names_with_quotes(): """Types with quote characters in their reprs should work.""" from typing import Annotated, Literal, Union converter = Converter() assert converter.structure({1: 1}, Dict[Annotated[int, "'"], int]) == {1: 1} converter.register_structure_hook_func( lambda t: t is Union[Literal["a", 2, 3], Literal[4]], lambda v, _: v ) > assert converter.structure( {2: "a"}, Dict[Union[Literal["a", 2, 3], Literal[4]], str] ) == {2: "a"} Annotated = typing.Annotated Literal = typing.Literal Union = converter = tests/test_gen_dict.py:328: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:563: in structure return self._structure_func.dispatch(cl)(obj, cl) cl = typing.Dict[typing.Literal['a', 2, 3] | typing.Literal[4], str] obj = {2: 'a'} self = ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:133: in dispatch_without_caching res = self._function_dispatch.dispatch(typ) direct_dispatch = None self = MultiStrategyDispatch(_fallback_factory= at 0x7ff384db5900>, _direct_dispatch={}, _functio...patch=, dispatch=) typ = typing.Dict[typing.Literal['a', 2, 3] | typing.Literal[4], str] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:76: in dispatch return handler(typ) can_handle = ch = True handler = > is_generator = True self = FunctionDispatch(_converter=, _handler_pairs=[(. at 0x7ff37bdc8e00>, . at 0x7ff37bdcbab0>, False, False)]) takes_converter = False typ = typing.Dict[typing.Literal['a', 2, 3] | typing.Literal[4], str] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:1364: in gen_structure_mapping h = make_mapping_structure_fn( cl = typing.Dict[typing.Literal['a', 2, 3] | typing.Literal[4], str] self = structure_to = ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/gen/__init__.py:941: in mapping_structure_factory key_handler = converter.get_structure_hook(key_type, cache_result=False) args = (typing.Literal['a', 2, 3] | typing.Literal[4], ) cl = typing.Dict[typing.Literal['a', 2, 3] | typing.Literal[4], str] converter = detailed_validation = True fn_name = 'structure_mapping' globs = {'__cattr_mapping_cl': } internal_arg_parts = {} is_bare_dict = False key_arg_cand = typing.Literal['a', 2, 3] | typing.Literal[4] key_type = typing.Literal['a', 2, 3] | typing.Literal[4] lines = [] structure_to = val_arg_cand = val_type = ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:581: in get_structure_hook else self._structure_func.dispatch_without_caching(type) cache_result = False self = type = typing.Literal['a', 2, 3] | typing.Literal[4] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:134: in dispatch_without_caching return res if res is not None else self._fallback_factory(typ) direct_dispatch = None res = None self = MultiStrategyDispatch(_fallback_factory= at 0x7ff384db5900>, _direct_dispatch={}, _functio...patch=, dispatch=) typ = typing.Literal['a', 2, 3] | typing.Literal[4] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:1053: in structure_fallback_factory: HookFactory[StructureHook] = lambda t: raise_error( t = typing.Literal['a', 2, 3] | typing.Literal[4] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ = None, cl = typing.Literal['a', 2, 3] | typing.Literal[4] def raise_error(_, cl: Type) -> NoReturn: """At the bottom of the condition stack, we explode if we can't handle it.""" msg = f"Unsupported type: {cl!r}. Register a structure hook for it." > raise StructureHandlerNotFoundError(msg, type_=cl) E cattrs.errors.StructureHandlerNotFoundError: Unsupported type: typing.Literal['a', 2, 3] | typing.Literal[4]. Register a structure hook for it. _ = None cl = typing.Literal['a', 2, 3] | typing.Literal[4] msg = "Unsupported type: typing.Literal['a', 2, 3] | typing.Literal[4]. Register a structure hook for it." ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/fns.py:22: StructureHandlerNotFoundError ________________________________ test_deep_copy ________________________________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 def test_deep_copy(): """Test the deep copying of generic parameters.""" mapping = {T.__name__: int} assert deep_copy_with(Optional[T], mapping) == Optional[int] > assert ( deep_copy_with(List_origin[Optional[T]], mapping) == List_origin[Optional[int]] ) E assert list[~T | None] == list[int | None] E E Use -v to get more diff mapping = {'T': } tests/test_generics.py:29: AssertionError __________ test_structure_nested_generics_with_cols[True-int-result0] __________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 + Exception Group Traceback (most recent call last): | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341, in from_call | result: TResult | None = func() | ~~~~^^ | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242, in | lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise | ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 182, in _multicall | return outcome.get_result() | ~~~~~~~~~~~~~~~~~~^^ | File "/usr/lib/python3.14/site-packages/pluggy/_result.py", line 100, in get_result | raise exc.with_traceback(exc.__traceback__) | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call | yield from thread_exception_runtest_hook() | File "/usr/lib/python3.14/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call | yield from unraisable_exception_runtest_hook() | File "/usr/lib/python3.14/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call | yield from self._runtest_for(item, "call") | File "/usr/lib/python3.14/site-packages/_pytest/logging.py", line 829, in _runtest_for | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103, in _multicall | res = hook_impl.function(*args) | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call | item.runtest() | ~~~~~~~~~~~~^^ | File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627, in runtest | self.ihook.pytest_pyfunc_call(pyfuncitem=self) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 139, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103, in _multicall | res = hook_impl.function(*args) | File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call | result = testfunction(**testargs) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_generics.py", line 107, in test_structure_nested_generics_with_cols | res = genconverter.structure(asdict(expected), GenericCols[t]) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".GenericCols>", line 14, in structure_GenericCols_int | if errors: raise __c_cve('While structuring ' + 'GenericCols', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring GenericCols (1 sub-exception) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File ".GenericCols>", line 10, in structure_GenericCols_int | res['b'] = __c_structure_b(o['b'], __c_type_b) | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 884, in _structure_optional | return self._structure_func.dispatch(other)(obj, other) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^ | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py", line 133, in dispatch_without_caching | res = self._function_dispatch.dispatch(typ) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py", line 75, in dispatch | return handler(typ, self._converter) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/cols.py", line 118, in list_structure_factory | handler = converter.get_structure_hook(elem_type) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 579, in get_structure_hook | self._structure_func.dispatch(type) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^ | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py", line 134, in dispatch_without_caching | return res if res is not None else self._fallback_factory(typ) | ~~~~~~~~~~~~~~~~~~~~~~^^^^^ | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 1053, in | structure_fallback_factory: HookFactory[StructureHook] = lambda t: raise_error( | ~~~~~~~~~~~^ | None, t | ^^^^^^^ | ), | ^ | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/fns.py", line 22, in raise_error | raise StructureHandlerNotFoundError(msg, type_=cl) | cattrs.errors.StructureHandlerNotFoundError: Unsupported type: ~T. Register a structure hook for it. | Structuring class test_structure_nested_generics_with_cols..GenericCols @ attribute b +------------------------------------ _________ test_structure_nested_generics_with_cols[False-int-result0] __________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 t = , result = (1, [1, 2, 3]) genconverter = @pytest.mark.parametrize(("t", "result"), ((int, (1, [1, 2, 3])), (int, (1, None)))) def test_structure_nested_generics_with_cols(t, result, genconverter: Converter): @define class GenericCols(Generic[T]): a: T b: Optional[List[T]] expected = GenericCols(*result) > res = genconverter.structure(asdict(expected), GenericCols[t]) GenericCols = .GenericCols'> expected = GenericCols(a=1, b=[1, 2, 3]) genconverter = result = (1, [1, 2, 3]) t = tests/test_generics.py:107: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:563: in structure return self._structure_func.dispatch(cl)(obj, cl) cl = tests.test_generics.test_structure_nested_generics_with_cols..GenericCols[int] obj = {'a': 1, 'b': [1, 2, 3]} self = .GenericCols-2>:4: in structure_GenericCols_int __c_structure_b(o['b'], __c_type_b), _ = tests.test_generics.test_structure_nested_generics_with_cols..GenericCols[int] __c_structure_a = __c_structure_b = > __c_type_b = typing.List[~T] | None __cl = .GenericCols'> o = {'a': 1, 'b': [1, 2, 3]} ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:884: in _structure_optional return self._structure_func.dispatch(other)(obj, other) obj = [1, 2, 3] other = typing.List[~T] self = union = typing.List[~T] | None union_params = (typing.List[~T], ) ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:133: in dispatch_without_caching res = self._function_dispatch.dispatch(typ) direct_dispatch = None self = MultiStrategyDispatch(_fallback_factory= at 0x7ff384db5900>, _direct_dispatch={}, _functio...patch=, dispatch=) typ = typing.List[~T] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:75: in dispatch return handler(typ, self._converter) can_handle = ch = True handler = is_generator = 'extended' self = FunctionDispatch(_converter=, _handler_pairs=[(. at 0x7ff37992d220>, . at 0x7ff37992e8d0>, False, False)]) takes_converter = True typ = typing.List[~T] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/cols.py:118: in list_structure_factory handler = converter.get_structure_hook(elem_type) converter = elem_type = ~T type = typing.List[~T] ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:579: in get_structure_hook self._structure_func.dispatch(type) cache_result = True self = type = ~T ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/dispatch.py:134: in dispatch_without_caching return res if res is not None else self._fallback_factory(typ) direct_dispatch = None res = None self = MultiStrategyDispatch(_fallback_factory= at 0x7ff384db5900>, _direct_dispatch={}, _functio...patch=, dispatch=) typ = ~T ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py:1053: in structure_fallback_factory: HookFactory[StructureHook] = lambda t: raise_error( t = ~T _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ = None, cl = ~T def raise_error(_, cl: Type) -> NoReturn: """At the bottom of the condition stack, we explode if we can't handle it.""" msg = f"Unsupported type: {cl!r}. Register a structure hook for it." > raise StructureHandlerNotFoundError(msg, type_=cl) E cattrs.errors.StructureHandlerNotFoundError: Unsupported type: ~T. Register a structure hook for it. _ = None cl = ~T msg = 'Unsupported type: ~T. Register a structure hook for it.' ../BUILDROOT/usr/lib/python3.14/site-packages/cattrs/fns.py:22: StructureHandlerNotFoundError ____________________________ tests/test_preconf.py _____________________________ [gw0] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw0' crashed while running 'tests/test_preconf.py::test_orjson' ____________________________ test_forbid_extra_keys ____________________________ [gw2] linux -- Python 3.14.0 /usr/bin/python3 + Exception Group Traceback (most recent call last): | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 341, in from_call | result: TResult | None = func() | ~~~~^^ | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 242, in | lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise | ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 182, in _multicall | return outcome.get_result() | ~~~~~~~~~~~~~~~~~~^^ | File "/usr/lib/python3.14/site-packages/pluggy/_result.py", line 100, in get_result | raise exc.with_traceback(exc.__traceback__) | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call | yield from thread_exception_runtest_hook() | File "/usr/lib/python3.14/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call | yield from unraisable_exception_runtest_hook() | File "/usr/lib/python3.14/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call | yield from self._runtest_for(item, "call") | File "/usr/lib/python3.14/site-packages/_pytest/logging.py", line 829, in _runtest_for | yield | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 167, in _multicall | teardown.throw(outcome._exception) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call | return (yield) | ^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103, in _multicall | res = hook_impl.function(*args) | File "/usr/lib/python3.14/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call | item.runtest() | ~~~~~~~~~~~~^^ | File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 1627, in runtest | self.ihook.pytest_pyfunc_call(pyfuncitem=self) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_hooks.py", line 513, in __call__ | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) | ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_manager.py", line 120, in _hookexec | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) | ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 139, in _multicall | raise exception.with_traceback(exception.__traceback__) | File "/usr/lib/python3.14/site-packages/pluggy/_callers.py", line 103, in _multicall | res = hook_impl.function(*args) | File "/usr/lib/python3.14/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call | result = testfunction(**testargs) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 357, in test_forbid_extra_keys | def test_forbid_extra_keys( | ^^^ | File "/usr/lib/python3.14/site-packages/hypothesis/core.py", line 1787, in wrapped_test | raise the_error_hypothesis_found | ExceptionGroup: Hypothesis found 14 distinct failures. (14 sub-exceptions) +-+---------------- 1 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-191>", line 22, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: typing.List[int] | _b.suffix: | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': [], | '_b.suffix': 0, | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 2 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-180>", line 8, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: typing.List[int] | _b.suffix: | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': [], | '_b.suffix': 0, | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 3 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-185>", line 22, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: typing.Annotated[int, 'test'] | _b.suffix: typing.List[int] | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': 0, | '_b.suffix': [], | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 4 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-176>", line 8, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: typing.Annotated[int, 'test'] | _b.suffix: typing.List[int] | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': 0, | '_b.suffix': [], | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 5 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-190>", line 22, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: | _b.suffix: typing.List[int] | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': 0, | '_b.suffix': [], | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 6 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-184>", line 8, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: | _b.suffix: typing.List[int] | c: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': 0, | '_b.suffix': [], | 'c': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 7 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-189>", line 17, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: | _b.suffix: typing.Annotated[int, 'test'] | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | '_b.suffix': 0, | 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 8 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-181>", line 7, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: | _b.suffix: typing.Annotated[int, 'test'] | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | '_b.suffix': 0, | 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 9 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-187>", line 17, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: | _b.suffix: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | '_b.suffix': 0, | 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 10 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-182>", line 7, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: | _b.suffix: | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | '_b.suffix': 0, | 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 11 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-188>", line 12, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | a: typing.List[int] | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': [], 'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 12 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-186>", line 6, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | a: typing.List[int] | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'a': [], 'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +---------------- 13 ---------------- | Exception Group Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-174>", line 7, in structure_InheritedTypedDict | if errors: raise __c_cve('While structuring ' + 'InheritedTypedDict', errors, __cl) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | cattrs.errors.ClassValidationError: While structuring InheritedTypedDict (1 sub-exception) | class HypTypedDict(TypedDict): | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'inherited': 0}), | detailed_validation=True, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/errors.py:26 | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +-+---------------- 1 ---------------- | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited +------------------------------------ +---------------- 14 ---------------- | Traceback (most recent call last): | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/test_typeddicts.py", line 377, in test_forbid_extra_keys | structured = c.structure(unstructured, cls) | File "/builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/converters.py", line 563, in structure | return self._structure_func.dispatch(cl)(obj, cl) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ | File ".InheritedTypedDict-172>", line 5, in structure_InheritedTypedDict | raise __c_feke('', __cl, unknown_fields) | cattrs.errors.ForbiddenExtraKeysError: Extra fields in constructor for InheritedTypedDict: inherited | class HypTypedDict(TypedDict): | Falsifying example: test_forbid_extra_keys( | cls_and_instance=(tests.typeddicts.simple_typeddicts..InheritedTypedDict, | {'inherited': 0}), | detailed_validation=False, # or any other generated value | ) | Explanation: | These lines were always and only run by failing examples: | /usr/lib/python3.14/site-packages/typing_extensions.py:935 | /usr/lib/python3.14/site-packages/typing_extensions.py:957 | /usr/lib/python3.14/site-packages/typing_extensions.py:980 +------------------------------------ ____________________________ test_forwardref[True] _____________________________ [gw2] linux -- Python 3.14.0 /usr/bin/python3 genconverter = def test_forwardref(genconverter: Converter): """TypedDicts have no resolve_class, so they're good candidate for forwardrefs.""" class A(ExtensionsTypedDict): a: "int" genconverter.register_unstructure_hook(int, lambda v: v + 1) > assert genconverter.unstructure({"a": 1}, A) == {"a": 2} E AssertionError: assert {'a': 1} == {'a': 2} E E Differing items: E {'a': 1} != {'a': 2} E Use -v to get more diff A = .A'> genconverter = tests/test_typeddicts.py:431: AssertionError ____________________________ test_forwardref[False] ____________________________ [gw2] linux -- Python 3.14.0 /usr/bin/python3 genconverter = def test_forwardref(genconverter: Converter): """TypedDicts have no resolve_class, so they're good candidate for forwardrefs.""" class A(ExtensionsTypedDict): a: "int" genconverter.register_unstructure_hook(int, lambda v: v + 1) > assert genconverter.unstructure({"a": 1}, A) == {"a": 2} E AssertionError: assert {'a': 1} == {'a': 2} E E Differing items: E {'a': 1} != {'a': 2} E Use -v to get more diff A = .A'> genconverter = tests/test_typeddicts.py:431: AssertionError ____________________________ tests/test_preconf.py _____________________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw1' crashed while running 'tests/test_preconf.py::test_bson' ____________________________ tests/test_preconf.py _____________________________ [gw2] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw2' crashed while running 'tests/test_preconf.py::test_orjson_converter' _________________________ test_structuring_unsupported _________________________ [gw4] linux -- Python 3.14.0 /usr/bin/python3 def test_structuring_unsupported(): """Loading unsupported classes should throw.""" converter = BaseConverter() with raises(StructureHandlerNotFoundError) as exc: converter.structure(1, BaseConverter) assert exc.value.type_ is BaseConverter with raises(StructureHandlerNotFoundError) as exc: converter.structure(1, Union[int, str]) > assert exc.value.type_ is Union[int, str] E AssertionError: assert int | str is int | str E + where int | str = StructureHandlerNotFoundError('Unsupported type: int | str. Register a structure hook for it.').type_ E + where StructureHandlerNotFoundError('Unsupported type: int | str. Register a structure hook for it.') = .value converter = exc = tests/test_structure.py:339: AssertionError ____________________________ tests/test_preconf.py _____________________________ [gw3] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw3' crashed while running 'tests/test_preconf.py::test_bson_converter' =============================== warnings summary =============================== tests/typed.py:452 tests/typed.py:452 tests/typed.py:452 tests/typed.py:452 tests/typed.py:452 tests/typed.py:452 /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/typed.py:452: HypothesisWarning: Return-type annotation is `st.SearchStrategy[typing.Tuple[attr._make._CountingAttr, st.SearchStrategy]]`, but the decorated function should return a value (not a strategy) @composite tests/typed.py:864 tests/typed.py:864 tests/typed.py:864 tests/typed.py:864 tests/typed.py:864 tests/typed.py:864 /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/cattrs-ae806749f02502be1a8c073fd81050c04aa56c96/tests/typed.py:864: HypothesisWarning: Return-type annotation is `st.SearchStrategy[typing.Tuple[typing.Type, st.SearchStrategy[typing.Tuple[typing.Any]], st.SearchStrategy[typing.Dict[str, typing.Any]]]]`, but the decorated function should return a value (not a strategy) @composite tests/test_converter.py: 34577 warnings tests/test_converter_inheritance.py: 4 warnings tests/test_copy.py: 632 warnings tests/test_dataclasses.py: 48 warnings tests/test_dicts.py: 30 warnings tests/test_disambiguators.py: 137 warnings tests/test_factory_hooks.py: 6 warnings tests/test_gen_dict.py: 7579 warnings tests/test_generics.py: 335 warnings tests/test_generics_695.py: 110 warnings tests/test_newtypes.py: 34 warnings tests/test_optionals.py: 34 warnings tests/test_structure_attrs.py: 1261 warnings tests/test_typeddicts.py: 11326 warnings tests/test_unstructure.py: 2753 warnings tests/test_validation.py: 24 warnings tests/strategies/test_class_methods.py: 215 warnings tests/strategies/test_native_unions.py: 155 warnings tests/strategies/test_tagged_unions.py: 209 warnings tests/test_any.py: 44 warnings tests/strategies/test_include_subclasses.py: 2209 warnings tests/preconf/test_pyyaml.py: 30488 warnings tests/test_baseconverter.py: 17120 warnings tests/test_enums.py: 300 warnings tests/test_final.py: 104 warnings tests/test_gen.py: 17 warnings tests/test_gen_collections.py: 6 warnings tests/test_gen_dict_563.py: 10 warnings tests/test_generics_604.py: 8 warnings tests/test_generics_696.py: 8 warnings tests/test_preconf.py: 170581 warnings tests/test_tuples.py: 64 warnings tests/test_tuples_563.py: 4 warnings tests/test_unions.py: 35 warnings tests/test_unstructure_collections.py: 167 warnings tests/test_v.py: 23 warnings tests/test_structure.py: 6106 warnings tests/test_recursive.py: 10 warnings /builddir/build/BUILD/python-cattrs-24.1.2_20241004gitae80674-build/BUILDROOT/usr/lib/python3.14/site-packages/cattrs/_compat.py:292: DeprecationWarning: '_UnionGenericAlias' is deprecated and slated for removal in Python 3.17 or (isinstance(obj, _UnionGenericAlias) and obj.__origin__ is Union) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_typeddicts.py::test_detailed_validation_from_converter[BaseConverter-True] FAILED tests/test_typeddicts.py::test_detailed_validation_from_converter[BaseConverter-False] FAILED tests/test_typeddicts.py::test_override_entire_hooks[BaseConverter-True] FAILED tests/test_typeddicts.py::test_override_entire_hooks[BaseConverter-False] FAILED tests/test_typeddicts.py::test_detailed_validation_from_converter[Converter-True] FAILED tests/test_typeddicts.py::test_detailed_validation_from_converter[Converter-False] FAILED tests/test_typeddicts.py::test_override_entire_hooks[Converter-True] FAILED tests/test_typeddicts.py::test_override_entire_hooks[Converter-False] FAILED tests/strategies/test_include_subclasses.py::test_structure_as_union FAILED tests/strategies/test_include_subclasses.py::test_structuring_unstructuring_unknown_subclass FAILED tests/strategies/test_include_subclasses.py::test_overrides[wo-union-strategy-parent-only] FAILED tests/strategies/test_include_subclasses.py::test_overrides[wo-union-strategy-child1-only] FAILED tests/strategies/test_include_subclasses.py::test_overrides[wo-union-strategy-child2-only] FAILED tests/strategies/test_include_subclasses.py::test_overrides[wo-union-strategy-grandchild-only] FAILED tests/test_disambiguators.py::test_disambiguate_from_discriminated_enum FAILED tests/test_gen_dict.py::test_type_names_with_quotes - cattrs.errors.St... FAILED tests/test_generics.py::test_deep_copy - assert list[~T | None] == lis... FAILED tests/test_generics.py::test_structure_nested_generics_with_cols[True-int-result0] FAILED tests/test_generics.py::test_structure_nested_generics_with_cols[False-int-result0] FAILED tests/test_preconf.py::test_orjson FAILED tests/test_typeddicts.py::test_forbid_extra_keys - ExceptionGroup: Hyp... FAILED tests/test_typeddicts.py::test_forwardref[True] - AssertionError: asse... FAILED tests/test_typeddicts.py::test_forwardref[False] - AssertionError: ass... FAILED tests/test_preconf.py::test_bson FAILED tests/test_preconf.py::test_orjson_converter FAILED tests/test_structure.py::test_structuring_unsupported - AssertionError... FAILED tests/test_preconf.py::test_bson_converter ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-parent-only] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-child1-only] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-child2-only] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-grandchild-only] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-union-compose-parent] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-union-compose-child] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-union-compose-grandchild] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-non-union-compose-parent] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-non-union-compose-child] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-non-union-compose-grandchild] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-union-container] ERROR tests/strategies/test_include_subclasses.py::test_structuring_with_inheritance[with-subclasses-non-union-container] ERROR tests/strategies/test_include_subclasses.py::test_circular_reference[with-subclasses] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-parent-only] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-child1-only] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-child2-only] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-grandchild-only] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-union-compose-parent] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-union-compose-child] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-union-compose-grandchild] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-non-union-compose-parent] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-non-union-compose-child] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-non-union-compose-grandchild] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-union-container] ERROR tests/strategies/test_include_subclasses.py::test_unstructuring_with_inheritance[with-subclasses-non-union-container] = 27 failed, 710 passed, 4 skipped, 15 xfailed, 286785 warnings, 25 errors in 157.79s (0:02:37) = RPM build errors: error: Bad exit status from /var/tmp/rpm-tmp.SZ7SuX (%check) Bad exit status from /var/tmp/rpm-tmp.SZ7SuX (%check) Finish: rpmbuild python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm Finish: build phase for python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names ERROR: Exception(/var/lib/copr-rpmbuild/results/python-cattrs-24.1.2^20241004gitae80674-11.fc43.src.rpm) Config(fedora-rawhide-x86_64) 2 minutes 57 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_failure=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot ERROR: Command failed: # /usr/bin/systemd-nspawn -q -M 3f24e333773248b5bac2e94e35ca3f47 -D /var/lib/mock/fedora-rawhide-x86_64-1747236112.876906/root -a -u mockbuild --capability=cap_ipc_lock --rlimit=RLIMIT_NOFILE=10240 --capability=cap_ipc_lock --bind=/tmp/mock-resolv.rat11idh:/etc/resolv.conf --bind=/dev/btrfs-control --bind=/dev/mapper/control --bind=/dev/fuse --bind=/dev/loop-control --bind=/dev/loop0 --bind=/dev/loop1 --bind=/dev/loop2 --bind=/dev/loop3 --bind=/dev/loop4 --bind=/dev/loop5 --bind=/dev/loop6 --bind=/dev/loop7 --bind=/dev/loop8 --bind=/dev/loop9 --bind=/dev/loop10 --bind=/dev/loop11 --console=pipe --setenv=TERM=vt100 --setenv=SHELL=/bin/bash --setenv=HOME=/builddir --setenv=HOSTNAME=mock --setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin '--setenv=PROMPT_COMMAND=printf "\033]0;\007"' '--setenv=PS1= \s-\v\$ ' --setenv=LANG=C.UTF-8 --resolv-conf=off bash --login -c '/usr/bin/rpmbuild -ba --noprep --target x86_64 --nodeps /builddir/build/originals/python-cattrs.spec' Copr build error: Build failed