Warning: Permanently added '2620:52:3:1:dead:beef:cafe:c1ca' (ED25519) to the list of known hosts. You can reproduce this build on your computer by running: sudo dnf install copr-rpmbuild /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/9040675-fedora-rawhide-x86_64 --chroot fedora-rawhide-x86_64 Version: 1.3 PID: 24087 Logging PID: 24088 Task: {'allow_user_ssh': False, 'appstream': False, 'background': True, 'bootstrap': 'off', 'build_id': 9040675, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-x86_64', 'enable_net': False, 'fedora_review': False, 'git_hash': 'f49b729413fa44a267a8f53f699b99e84b3f0f98', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/@python/python3.14/python-cattrs', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'python-cattrs', 'package_version': '24.1.2^20241004gitae80674-11', 'project_dirname': 'python3.14', 'project_name': 'python3.14', 'project_owner': '@python', 'repo_priority': 9, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/@python/python3.14/fedora-rawhide-x86_64/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': 9}, {'baseurl': 'http://kojipkgs.fedoraproject.org/repos/rawhide/latest/$basearch/', 'id': 'http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch', 'name': 'Additional repo http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch'}], 'sandbox': '@python/python3.14--churchyard', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 0, 'submitter': 'churchyard', 'tags': [], 'task_id': '9040675-fedora-rawhide-x86_64', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/@python/python3.14/python-cattrs /var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/@python/python3.14/python-cattrs', '/var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs'... Running: git checkout f49b729413fa44a267a8f53f699b99e84b3f0f98 -- cmd: ['git', 'checkout', 'f49b729413fa44a267a8f53f699b99e84b3f0f98', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs rc: 0 stdout: stderr: Note: switching to 'f49b729413fa44a267a8f53f699b99e84b3f0f98'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at f49b729 automatic import of python-cattrs Running: dist-git-client sources /usr/bin/tail: /var/lib/copr-rpmbuild/main.log: file truncated Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs/python-cattrs.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1747249028.746542 -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-97cv3siv/python-cattrs/python-cattrs.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-97cv3siv/python-cattrs --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1747249028.746542 -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-97cv3siv/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-1747249028.746542/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% | 991.3 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 12.8 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 69.6 KiB/s | 3.8 KiB | 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] xz-libs-1:5.8.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 34/163] bzip2-libs-0:1.0.8-20.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 35/163] libacl-0:2.3.2-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 36/163] libselinux-0:3.8-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 37/163] audit-libs-0:4.0.3-2.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 38/163] filesystem-0:3.18-44.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 39/163] libeconf-0:0.7.6-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 40/163] libsemanage-0:3.8-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 41/163] libxcrypt-0:4.4.38-7.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 42/163] pam-libs-0:1.7.0-4.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 43/163] setup-0:2.15.0-24.fc43.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 44/163] ansible-srpm-macros-0:1-17.1. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 45/163] build-reproducibility-srpm-ma 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 46/163] dwz-0:0.15-9.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 47/163] efi-srpm-macros-0:6-3.fc43.no 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] filesystem-srpm-macros-0:3.18 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 51/163] fonts-srpm-macros-1:2.0.5-21. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 52/163] forge-srpm-macros-0:0.4.0-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 53/163] fpc-srpm-macros-0:1.3-14.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 54/163] ghc-srpm-macros-0:1.9.2-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 55/163] gnat-srpm-macros-0:6-7.fc42.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 56/163] go-srpm-macros-0:3.6.0-7.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 57/163] kernel-srpm-macros-0:1.0-25.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 58/163] lua-srpm-macros-0:1-15.fc42.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 59/163] ocaml-srpm-macros-0:10-4.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 60/163] openblas-srpm-macros-0:2-19.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 61/163] package-notes-srpm-macros-0:0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 62/163] perl-srpm-macros-0:1-57.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 63/163] pyproject-srpm-macros-0:1.18. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 64/163] python-srpm-macros-0:3.14-5.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 65/163] qt5-srpm-macros-0:5.15.16-1.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 66/163] qt6-srpm-macros-0:6.9.0-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 67/163] rpm-0:5.99.90-5.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 68/163] rust-srpm-macros-0:26.3-4.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 69/163] tree-sitter-srpm-macros-0:0.2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 70/163] zig-srpm-macros-0:1-4.fc42.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 71/163] zip-0:3.0-43.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 72/163] ed-0:1.21-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 73/163] libattr-0:2.5.2-5.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 74/163] ncurses-libs-0:6.5-5.20250125 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 75/163] pcre2-0:10.45-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 76/163] libgcc-0:15.1.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 77/163] gmp-1:6.3.0-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 78/163] mpfr-0:4.2.2-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 79/163] readline-0:8.2-13.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 80/163] fedora-repos-0:43-0.2.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 81/163] elfutils-libelf-0:0.193-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 82/163] coreutils-common-0:9.7-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 83/163] libcap-0:2.76-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 84/163] openssl-libs-1:3.5.0-3.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 85/163] systemd-libs-0:257.5-5.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 86/163] add-determinism-0:0.6.0-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 87/163] zlib-ng-compat-0:2.2.4-2.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 88/163] libcap-ng-0:0.8.5-4.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 89/163] binutils-0:2.44-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 90/163] debugedit-0:5.1-6.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 91/163] elfutils-0:0.193-2.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 92/163] libarchive-0:3.7.7-4.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 93/163] libstdc++-0:15.1.1-1.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 94/163] pkgconf-pkg-config-0:2.3.0-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 95/163] popt-0:1.19-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 96/163] rpm-build-libs-0:5.99.90-5.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 97/163] rpm-libs-0:5.99.90-5.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 98/163] zstd-0:1.5.7-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 99/163] curl-0:8.14.0~rc1-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [100/163] libsepol-0:3.8-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [101/163] sqlite-libs-0:3.49.1-1.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [102/163] lz4-libs-0:1.10.0-2.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [103/163] pkgconf-0:2.3.0-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [104/163] pkgconf-m4-0:2.3.0-2.fc42.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [105/163] libpkgconf-0:2.3.0-2.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [106/163] pcre2-syntax-0:10.45-1.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [107/163] ca-certificates-0:2024.2.69_v 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [108/163] crypto-policies-0:20250402-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [109/163] ncurses-base-0:6.5-5.20250125 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [110/163] libxml2-0:2.12.10-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [111/163] libzstd-0:1.5.7-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [112/163] fedora-gpg-keys-0:43-0.2.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [113/163] fedora-repos-rawhide-0:43-0.2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [114/163] elfutils-debuginfod-client-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [115/163] elfutils-libs-0:0.193-2.fc43. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [116/163] libffi-0:3.4.8-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [117/163] p11-kit-0:0.25.5-5.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [118/163] p11-kit-trust-0:0.25.5-5.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [119/163] alternatives-0:1.33-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [120/163] jansson-0:2.14-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [121/163] lua-libs-0:5.4.7-3.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [122/163] rpm-sequoia-0:1.8.0-1.fc43.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [123/163] libgomp-0:15.1.1-1.fc43.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [124/163] rpm-sign-libs-0:5.99.90-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [125/163] libtasn1-0:4.20.0-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [126/163] elfutils-default-yama-scope-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [127/163] json-c-0:0.18-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [128/163] gnupg2-0:2.4.7-3.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [129/163] ima-evm-utils-libs-0:1.6.2-5. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [130/163] libfsverity-0:1.6-2.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [131/163] gpgverify-0:2.1-3.fc43.noarch 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] fedora-release-0:43-0.15.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [149/163] fedora-release-identity-basic 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [150/163] libcurl-0:8.14.0~rc1-1.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [151/163] gdb-minimal-0:16.3-1.fc43.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [152/163] systemd-standalone-sysusers-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [153/163] xxhash-libs-0:0.8.3-2.fc42.x8 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% | 730.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-1747249028.746542/root/var/cache/d [ 2/165] Prepare transaction 100% | 1.9 KiB/s | 163.0 B | 00m00s [ 3/165] Installing libgcc-0:15.1.1-1. 100% | 87.3 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% | 796.9 KiB/s | 816.0 B | 00m00s [ 6/165] Installing fedora-release-ide 100% | 898.4 KiB/s | 920.0 B | 00m00s [ 7/165] Installing fedora-gpg-keys-0: 100% | 19.1 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% | 5.6 MiB/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% | 121.1 KiB/s | 124.0 B | 00m00s [ 12/165] Installing setup-0:2.15.0-24. 100% | 47.6 MiB/s | 730.4 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 13/165] Installing filesystem-0:3.18- 100% | 1.4 MiB/s | 212.5 KiB | 00m00s [ 14/165] Installing ncurses-base-0:6.5 100% | 38.2 MiB/s | 352.2 KiB | 00m00s [ 15/165] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 16/165] Installing ncurses-libs-0:6.5 100% | 132.9 MiB/s | 952.8 KiB | 00m00s [ 17/165] Installing glibc-0:2.41.9000- 100% | 155.3 MiB/s | 6.7 MiB | 00m00s [ 18/165] Installing bash-0:5.2.37-3.fc 100% | 204.5 MiB/s | 8.2 MiB | 00m00s [ 19/165] Installing glibc-common-0:2.4 100% | 56.7 MiB/s | 1.0 MiB | 00m00s [ 20/165] Installing glibc-gconv-extra- 100% | 135.4 MiB/s | 7.3 MiB | 00m00s [ 21/165] Installing zlib-ng-compat-0:2 100% | 67.6 MiB/s | 138.4 KiB | 00m00s [ 22/165] Installing bzip2-libs-0:1.0.8 100% | 83.7 MiB/s | 85.7 KiB | 00m00s [ 23/165] Installing libstdc++-0:15.1.1 100% | 189.1 MiB/s | 2.8 MiB | 00m00s [ 24/165] Installing xz-libs-1:5.8.1-1. 100% | 106.9 MiB/s | 218.9 KiB | 00m00s [ 25/165] Installing libuuid-0:2.41-2.f 100% | 37.4 MiB/s | 38.3 KiB | 00m00s [ 26/165] Installing gmp-1:6.3.0-3.fc43 100% | 160.4 MiB/s | 821.5 KiB | 00m00s [ 27/165] Installing readline-0:8.2-13. 100% | 118.9 MiB/s | 487.1 KiB | 00m00s [ 28/165] Installing popt-0:1.19-8.fc42 100% | 22.7 MiB/s | 139.4 KiB | 00m00s [ 29/165] Installing libblkid-0:2.41-2. 100% | 128.7 MiB/s | 263.5 KiB | 00m00s [ 30/165] Installing libxcrypt-0:4.4.38 100% | 93.5 MiB/s | 287.2 KiB | 00m00s [ 31/165] Installing libzstd-0:1.5.7-1. 100% | 197.5 MiB/s | 809.1 KiB | 00m00s [ 32/165] Installing elfutils-libelf-0: 100% | 233.3 MiB/s | 1.2 MiB | 00m00s [ 33/165] Installing libgpg-error-0:1.5 100% | 29.0 MiB/s | 921.1 KiB | 00m00s [ 34/165] Installing crypto-policies-0: 100% | 14.8 MiB/s | 166.6 KiB | 00m00s [ 35/165] Installing libattr-0:2.5.2-5. 100% | 27.4 MiB/s | 28.1 KiB | 00m00s [ 36/165] Installing libacl-0:2.3.2-3.f 100% | 38.2 MiB/s | 39.2 KiB | 00m00s [ 37/165] Installing sqlite-libs-0:3.49 100% | 251.4 MiB/s | 1.5 MiB | 00m00s [ 38/165] Installing libtasn1-0:4.20.0- 100% | 173.9 MiB/s | 178.1 KiB | 00m00s [ 39/165] Installing libunistring-0:1.1 100% | 246.7 MiB/s | 1.7 MiB | 00m00s [ 40/165] Installing libidn2-0:2.3.8-1. 100% | 60.6 MiB/s | 558.7 KiB | 00m00s [ 41/165] Installing dwz-0:0.15-9.fc42. 100% | 20.4 MiB/s | 292.4 KiB | 00m00s [ 42/165] Installing mpfr-0:4.2.2-1.fc4 100% | 202.7 MiB/s | 830.4 KiB | 00m00s [ 43/165] Installing gawk-0:5.3.2-1.fc4 100% | 86.5 MiB/s | 1.8 MiB | 00m00s [ 44/165] Installing unzip-0:6.0-66.fc4 100% | 27.5 MiB/s | 393.8 KiB | 00m00s [ 45/165] Installing file-libs-0:5.46-1 100% | 456.1 MiB/s | 11.9 MiB | 00m00s [ 46/165] Installing file-0:5.46-1.fc43 100% | 8.3 MiB/s | 101.7 KiB | 00m00s [ 47/165] Installing libsmartcols-0:2.4 100% | 177.3 MiB/s | 181.6 KiB | 00m00s [ 48/165] Installing libeconf-0:0.7.6-1 100% | 64.7 MiB/s | 66.2 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% | 113.7 MiB/s | 349.3 KiB | 00m00s [ 51/165] Installing pam-libs-0:1.7.0-4 100% | 126.1 MiB/s | 129.1 KiB | 00m00s [ 52/165] Installing libcap-0:2.76-1.fc 100% | 14.9 MiB/s | 214.3 KiB | 00m00s [ 53/165] Installing systemd-libs-0:257 100% | 279.0 MiB/s | 2.2 MiB | 00m00s [ 54/165] Installing libsepol-0:3.8-1.f 100% | 269.2 MiB/s | 827.0 KiB | 00m00s [ 55/165] Installing lz4-libs-0:1.10.0- 100% | 154.7 MiB/s | 158.5 KiB | 00m00s [ 56/165] Installing libffi-0:3.4.8-1.f 100% | 82.4 MiB/s | 84.3 KiB | 00m00s [ 57/165] Installing p11-kit-0:0.25.5-5 100% | 84.0 MiB/s | 2.2 MiB | 00m00s [ 58/165] Installing alternatives-0:1.3 100% | 5.2 MiB/s | 63.8 KiB | 00m00s [ 59/165] Installing p11-kit-trust-0:0. 100% | 14.4 MiB/s | 397.2 KiB | 00m00s [ 60/165] Installing lua-libs-0:5.4.7-3 100% | 135.8 MiB/s | 278.1 KiB | 00m00s [ 61/165] Installing json-c-0:0.18-2.fc 100% | 85.9 MiB/s | 88.0 KiB | 00m00s [ 62/165] Installing zstd-0:1.5.7-1.fc4 100% | 95.0 MiB/s | 1.7 MiB | 00m00s [ 63/165] Installing libusb1-0:1.0.28-2 100% | 84.3 MiB/s | 172.7 KiB | 00m00s [ 64/165] Installing zip-0:3.0-43.fc42. 100% | 49.0 MiB/s | 702.4 KiB | 00m00s [ 65/165] Installing libpsl-0:0.21.5-5. 100% | 75.7 MiB/s | 77.5 KiB | 00m00s [ 66/165] Installing liblastlog2-0:2.41 100% | 35.1 MiB/s | 35.9 KiB | 00m00s [ 67/165] Installing libassuan-0:2.5.7- 100% | 165.6 MiB/s | 169.6 KiB | 00m00s [ 68/165] Installing libgcrypt-0:1.11.1 100% | 262.5 MiB/s | 1.6 MiB | 00m00s [ 69/165] Installing libksba-0:1.6.7-3. 100% | 197.8 MiB/s | 405.1 KiB | 00m00s [ 70/165] Installing libfdisk-0:2.41-2. 100% | 184.3 MiB/s | 377.5 KiB | 00m00s [ 71/165] Installing nettle-0:3.10.1-1. 100% | 193.8 MiB/s | 793.6 KiB | 00m00s [ 72/165] Installing gnutls-0:3.8.9-5.f 100% | 255.3 MiB/s | 3.6 MiB | 00m00s [ 73/165] Installing libxml2-0:2.12.10- 100% | 85.2 MiB/s | 1.7 MiB | 00m00s [ 74/165] Installing bzip2-0:1.0.8-20.f 100% | 6.0 MiB/s | 103.8 KiB | 00m00s [ 75/165] Installing add-determinism-0: 100% | 117.4 MiB/s | 2.5 MiB | 00m00s [ 76/165] Installing build-reproducibil 100% | 0.0 B/s | 1.0 KiB | 00m00s [ 77/165] Installing filesystem-srpm-ma 100% | 38.0 MiB/s | 38.9 KiB | 00m00s [ 78/165] Installing ed-0:1.21-2.fc42.x 100% | 11.2 MiB/s | 148.8 KiB | 00m00s [ 79/165] Installing patch-0:2.8-1.fc43 100% | 17.2 MiB/s | 228.3 KiB | 00m00s [ 80/165] Installing elfutils-default-y 100% | 185.7 KiB/s | 2.0 KiB | 00m00s [ 81/165] Installing elfutils-libs-0:0. 100% | 167.3 MiB/s | 685.2 KiB | 00m00s [ 82/165] Installing cpio-0:2.15-2.fc41 100% | 55.0 MiB/s | 1.1 MiB | 00m00s [ 83/165] Installing diffutils-0:3.12-2 100% | 62.5 MiB/s | 1.6 MiB | 00m00s [ 84/165] Installing libpkgconf-0:2.3.0 100% | 38.7 MiB/s | 79.2 KiB | 00m00s [ 85/165] Installing pkgconf-0:2.3.0-2. 100% | 6.3 MiB/s | 91.0 KiB | 00m00s [ 86/165] Installing jansson-0:2.14-2.f 100% | 92.2 MiB/s | 94.4 KiB | 00m00s [ 87/165] Installing libgomp-0:15.1.1-1 100% | 263.6 MiB/s | 539.9 KiB | 00m00s [ 88/165] Installing npth-0:1.8-2.fc42. 100% | 49.5 MiB/s | 50.7 KiB | 00m00s [ 89/165] Installing libtool-ltdl-0:2.5 100% | 69.6 MiB/s | 71.2 KiB | 00m00s [ 90/165] Installing gdbm-libs-1:1.23-9 100% | 128.5 MiB/s | 131.6 KiB | 00m00s [ 91/165] Installing cyrus-sasl-lib-0:2 100% | 109.7 MiB/s | 2.3 MiB | 00m00s [ 92/165] Installing xxhash-libs-0:0.8. 100% | 89.4 MiB/s | 91.6 KiB | 00m00s [ 93/165] Installing libbrotli-0:1.1.0- 100% | 204.0 MiB/s | 835.6 KiB | 00m00s [ 94/165] Installing libnghttp2-0:1.65. 100% | 159.5 MiB/s | 163.3 KiB | 00m00s [ 95/165] Installing keyutils-libs-0:1. 100% | 58.3 MiB/s | 59.7 KiB | 00m00s [ 96/165] Installing libcom_err-0:1.47. 100% | 66.6 MiB/s | 68.2 KiB | 00m00s [ 97/165] Installing libverto-0:0.3.2-1 100% | 26.6 MiB/s | 27.2 KiB | 00m00s [ 98/165] Installing pcre2-syntax-0:10. 100% | 135.0 MiB/s | 276.4 KiB | 00m00s [ 99/165] Installing pcre2-0:10.45-1.fc 100% | 227.6 MiB/s | 699.1 KiB | 00m00s [100/165] Installing libselinux-0:3.8-1 100% | 94.9 MiB/s | 194.3 KiB | 00m00s [101/165] Installing grep-0:3.12-1.fc43 100% | 50.1 MiB/s | 1.0 MiB | 00m00s [102/165] Installing sed-0:4.9-4.fc42.x 100% | 44.5 MiB/s | 865.5 KiB | 00m00s [103/165] Installing findutils-1:4.10.0 100% | 85.2 MiB/s | 1.9 MiB | 00m00s [104/165] Installing xz-1:5.8.1-1.fc43. 100% | 57.9 MiB/s | 1.3 MiB | 00m00s [105/165] Installing libmount-0:2.41-2. 100% | 121.6 MiB/s | 373.7 KiB | 00m00s [106/165] Installing util-linux-core-0: 100% | 64.0 MiB/s | 1.5 MiB | 00m00s [107/165] Installing tar-2:1.35-5.fc42. 100% | 118.5 MiB/s | 3.0 MiB | 00m00s [108/165] Installing libsemanage-0:3.8- 100% | 149.5 MiB/s | 306.2 KiB | 00m00s [109/165] Installing systemd-standalone 100% | 20.9 MiB/s | 277.8 KiB | 00m00s [110/165] Installing pkgconf-m4-0:2.3.0 100% | 0.0 B/s | 14.8 KiB | 00m00s [111/165] Installing pkgconf-pkg-config 100% | 147.8 KiB/s | 1.8 KiB | 00m00s [112/165] Installing coreutils-common-0 100% | 250.9 MiB/s | 11.3 MiB | 00m00s [113/165] Installing openssl-libs-1:3.5 100% | 317.4 MiB/s | 8.9 MiB | 00m00s [114/165] Installing coreutils-0:9.7-1. 100% | 108.9 MiB/s | 5.4 MiB | 00m00s [115/165] Installing ca-certificates-0: 100% | 1.2 MiB/s | 2.4 MiB | 00m02s [116/165] Installing libarchive-0:3.7.7 100% | 151.8 MiB/s | 932.6 KiB | 00m00s [117/165] Installing krb5-libs-0:1.21.3 100% | 176.9 MiB/s | 2.3 MiB | 00m00s [118/165] Installing tpm2-tss-0:4.1.3-7 100% | 174.2 MiB/s | 1.6 MiB | 00m00s [119/165] Installing ima-evm-utils-libs 100% | 30.3 MiB/s | 62.0 KiB | 00m00s [120/165] Installing libssh-0:0.11.1-4. 100% | 138.6 MiB/s | 567.5 KiB | 00m00s [121/165] Installing gzip-0:1.13-3.fc42 100% | 22.9 MiB/s | 398.4 KiB | 00m00s [122/165] Installing rpm-sequoia-0:1.8. 100% | 250.4 MiB/s | 2.5 MiB | 00m00s [123/165] Installing rpm-libs-0:5.99.90 100% | 181.9 MiB/s | 931.3 KiB | 00m00s [124/165] Installing libfsverity-0:1.6- 100% | 32.7 MiB/s | 33.5 KiB | 00m00s [125/165] Installing libevent-0:2.1.12- 100% | 177.1 MiB/s | 906.9 KiB | 00m00s [126/165] Installing openldap-0:2.6.9-5 100% | 128.7 MiB/s | 658.9 KiB | 00m00s [127/165] Installing gnupg2-0:2.4.7-3.f 100% | 181.3 MiB/s | 9.8 MiB | 00m00s [128/165] Installing libcurl-0:8.14.0~r 100% | 217.8 MiB/s | 892.1 KiB | 00m00s [129/165] Installing elfutils-debuginfo 100% | 6.5 MiB/s | 86.2 KiB | 00m00s [130/165] Installing binutils-0:2.44-3. 100% | 231.3 MiB/s | 25.9 MiB | 00m00s [131/165] Installing elfutils-0:0.193-2 100% | 116.9 MiB/s | 2.9 MiB | 00m00s [132/165] Installing gdb-minimal-0:16.3 100% | 245.3 MiB/s | 13.2 MiB | 00m00s [133/165] Installing debugedit-0:5.1-6. 100% | 13.6 MiB/s | 195.4 KiB | 00m00s [134/165] Installing curl-0:8.14.0~rc1- 100% | 15.5 MiB/s | 476.0 KiB | 00m00s [135/165] Installing rpm-0:5.99.90-5.fc 100% | 46.5 MiB/s | 2.5 MiB | 00m00s [136/165] Installing efi-srpm-macros-0: 100% | 40.2 MiB/s | 41.1 KiB | 00m00s [137/165] Installing lua-srpm-macros-0: 100% | 1.9 MiB/s | 1.9 KiB | 00m00s [138/165] Installing tree-sitter-srpm-m 100% | 8.4 MiB/s | 8.6 KiB | 00m00s [139/165] Installing zig-srpm-macros-0: 100% | 1.6 MiB/s | 1.7 KiB | 00m00s [140/165] Installing rpm-sign-libs-0:5. 100% | 39.6 MiB/s | 40.5 KiB | 00m00s [141/165] Installing rpm-build-libs-0:5 100% | 129.5 MiB/s | 265.2 KiB | 00m00s [142/165] Installing gpgverify-0:2.1-3. 100% | 9.2 MiB/s | 9.4 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% | 2.0 MiB/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% | 45.9 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 which-0:2.23-1.fc4 100% | 6.0 MiB/s | 85.6 KiB | 00m00s [163/165] Installing util-linux-0:2.41- 100% | 60.3 MiB/s | 3.6 MiB | 00m00s [164/165] Installing shadow-utils-2:4.1 100% | 82.7 MiB/s | 4.1 MiB | 00m00s [165/165] Installing info-0:7.2-3.fc42. 100% | 137.0 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-1747249028.746542/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-97cv3siv/python-cattrs/python-cattrs.spec) Config(child) 0 minutes 12 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-1747249028.746542/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% | 1.0 MiB/s | 24.8 KiB | 00m00s Copr repository 100% | 6.5 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 57.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 461.1 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 970.2 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 418 KiB. 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-hypothesis-0:6.123.0-3. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/22] python3-pytest-0:8.3.4-3.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/22] python3-typing-extensions-0:4.1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/22] python3-0:3.14.0~b1-1.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/22] python3-libs-0:3.14.0~b1-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/22] python3-attrs-0:25.3.0-1.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/22] python3-sortedcontainers-0:2.4. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/22] python3-iniconfig-0:1.1.1-25.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [10/22] python3-packaging-0:25.0-1.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [11/22] python3-pluggy-0:1.5.0-2.fc43.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [12/22] expat-0:2.7.1-1.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [13/22] mpdecimal-0:4.0.0-2.fc43.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [14/22] python-pip-wheel-0:24.3.1-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [15/22] tzdata-0:2025b-1.fc43.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [16/22] python-rpm-macros-0:3.14-5.fc43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [17/22] python3-rpm-macros-0:3.14-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [18/22] pyproject-rpm-macros-0:1.18.1-1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [19/22] python3-rpm-generators-0:14-12. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [20/22] python3-immutables-0:0.21-2.fc4 100% | 1.6 MiB/s | 60.8 KiB | 00m00s [21/22] python3-pytest-xdist-0:3.6.1-5. 100% | 2.0 MiB/s | 106.5 KiB | 00m00s [22/22] python3-execnet-0:2.1.1-5.fc43. 100% | 3.9 MiB/s | 250.5 KiB | 00m00s -------------------------------------------------------------------------------- [22/22] Total 100% | 5.2 MiB/s | 417.8 KiB | 00m00s Running transaction [ 1/24] Verify package files 100% | 360.0 B/s | 22.0 B | 00m00s [ 2/24] Prepare transaction 100% | 440.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.9 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% | 106.6 MiB/s | 218.4 KiB | 00m00s [ 9/24] Installing expat-0:2.7.1-1.fc43 100% | 14.5 MiB/s | 296.3 KiB | 00m00s [10/24] Installing python3-libs-0:3.14. 100% | 198.5 MiB/s | 42.9 MiB | 00m00s [11/24] Installing python3-0:3.14.0~b1- 100% | 2.3 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% | 71.5 MiB/s | 219.7 KiB | 00m00s [18/24] Installing python3-pytest-0:8.3 100% | 121.0 MiB/s | 4.1 MiB | 00m00s [19/24] Installing python3-execnet-0:2. 100% | 96.9 MiB/s | 991.8 KiB | 00m00s [20/24] Installing python3-pytest-xdist 100% | 77.1 MiB/s | 473.6 KiB | 00m00s [21/24] Installing python3-hypothesis-0 100% | 115.5 MiB/s | 4.9 MiB | 00m00s [22/24] Installing python3-devel-0:3.14 100% | 63.9 MiB/s | 2.0 MiB | 00m00s [23/24] Installing python3-immutables-0 100% | 62.2 MiB/s | 190.9 KiB | 00m00s [24/24] Installing python3-typing-exten 100% | 11.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.GiVdO4 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.WjY6zg + 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.vVprEl + 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% | 751.0 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 35.7 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 63.8 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% | 318.0 B/s | 7.0 B | 00m00s [2/9] Prepare transaction 100% | 205.0 B/s | 7.0 B | 00m00s [3/9] Installing python3-setuptools-0:7 100% | 123.0 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% | 7.0 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% | 23.6 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% | 85.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.OPCw3G + 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% | 751.0 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 43.9 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-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 2 MiB. After this operation, 14 MiB extra will be used (install 14 MiB, remove 0 B). [ 1/12] python3-pyyaml-0:6.0.2-2.fc43.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/12] libyaml-0:0.2.5-16.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/12] python3-cbor2-0:5.6.5-2.fc43.x8 100% | 2.4 MiB/s | 108.5 KiB | 00m00s [ 4/12] python3-msgpack-0:1.1.0-2.fc43. 100% | 2.1 MiB/s | 111.1 KiB | 00m00s [ 5/12] python3-pymongo-0:4.9.1-3.fc43. 100% | 23.8 MiB/s | 781.0 KiB | 00m00s [ 6/12] python3-tomlkit-0:0.13.2-2.fc43 100% | 11.7 MiB/s | 119.5 KiB | 00m00s [ 7/12] python3-ujson-0:5.10.0-2.fc43.x 100% | 3.2 MiB/s | 35.7 KiB | 00m00s [ 8/12] python3-msgspec-0:0.19.0-2.fc43 100% | 1.8 MiB/s | 220.3 KiB | 00m00s [ 9/12] python3-dns-0:2.7.0-3.fc43.noar 100% | 31.1 MiB/s | 573.6 KiB | 00m00s [10/12] python3-bson-0:4.9.1-3.fc43.x86 100% | 14.6 MiB/s | 179.9 KiB | 00m00s [11/12] python3-orjson-0:3.10.18-1.fc43 100% | 3.1 MiB/s | 286.8 KiB | 00m00s [12/12] double-conversion-0:3.3.1-2.fc4 100% | 770.4 KiB/s | 51.6 KiB | 00m00s -------------------------------------------------------------------------------- [12/12] Total 100% | 12.4 MiB/s | 2.4 MiB | 00m00s Running transaction [ 1/14] Verify package files 100% | 923.0 B/s | 12.0 B | 00m00s [ 2/14] Prepare transaction 100% | 375.0 B/s | 12.0 B | 00m00s [ 3/14] Installing libyaml-0:0.2.5-16.f 100% | 66.4 MiB/s | 136.0 KiB | 00m00s [ 4/14] Installing double-conversion-0: 100% | 48.5 MiB/s | 99.4 KiB | 00m00s [ 5/14] Installing python3-bson-0:4.9.1 100% | 89.5 MiB/s | 733.0 KiB | 00m00s [ 6/14] Installing python3-dns-0:2.7.0- 100% | 82.2 MiB/s | 3.2 MiB | 00m00s [ 7/14] Installing python3-pymongo-0:4. 100% | 187.7 MiB/s | 6.4 MiB | 00m00s [ 8/14] Installing python3-ujson-0:5.10 100% | 38.3 MiB/s | 78.3 KiB | 00m00s [ 9/14] Installing python3-pyyaml-0:6.0 100% | 87.6 MiB/s | 807.3 KiB | 00m00s [10/14] Installing python3-tomlkit-0:0. 100% | 81.9 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% | 101.8 MiB/s | 625.6 KiB | 00m00s [13/14] Installing python3-msgpack-0:1. 100% | 55.5 MiB/s | 340.7 KiB | 00m00s [14/14] Installing python3-cbor2-0:5.6. 100% | 6.8 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.UUSpPl + 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% | 917.9 KiB/s | 24.8 KiB | 00m00s Copr repository 100% | 36.6 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 60.8 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.cvIfD2 + 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.ewbt2D + 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.EIsOGY + 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__/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/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/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__/__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__/__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/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__/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/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__/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__/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__/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__/__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__/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__/_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/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__/__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/__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__/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__/_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__/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.nMlmQ7 + 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.xEEEEEEEEEEE.E.............xxx...xxx.xF.....FFFF................. [ 55%] ........................................................................ [ 64%] ..........................F......................................F...... [ 73%] F........F.F...........................................Fatal Python error: Segmentation fault Thread 0x00007f454214c6c0 [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 0x00007f4543087bc0 [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 [0x7f4543489f85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7f454348aa09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7f4543196bf0] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f444 [0x7f452eb72444] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x26564 [0x7f452eb69564] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f078 [0x7f452eb72078] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at dumps+0x175 [0x7f452eb72e75] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_Vectorcall+0x37 [0x7f45434c10f7] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7f45434d4a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f45434d0805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f45435af740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f454360b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f45434bd0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f45434da701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f45434d0805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f45435af740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f454360b6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7f45435c3d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f45434d9d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f45434d0805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f45435af740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f454360b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f45434bd0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f45434da701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7f4543543d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f45434d9d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f45434d0805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f45435af740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f454360b6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f45434bd0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7f45434e2e76] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f45434d0805] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw0] node down: Not properly terminated F replacing crashed worker gw0 ...................................ss......F.FF......................F.. [ 90%] ...........s.....................Fatal Python error: Segmentation fault Thread 0x00007fd6a80ae6c0 [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 0x00007fd6a8fe9bc0 [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 [0x7fd6a93ebf85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7fd6a93eca09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7fd6a90f8bf0] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f444 [0x7fd69cfa3444] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2625d [0x7fd69cf9a25d] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at +0x2f078 [0x7fd69cfa3078] Binary file "/usr/lib64/python3.14/site-packages/orjson/orjson.cpython-314-x86_64-linux-gnu.so", at dumps+0x175 [0x7fd69cfa3e75] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7fd6a943bd2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fd6a9432805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fd6a9511740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fd6a956d6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fd6a941f0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7fd6a943c701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fd6a9432805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fd6a9511740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fd6a956d6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7fd6a9525d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7fd6a943bd2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fd6a9432805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fd6a9511740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fd6a956d6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fd6a941f0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7fd6a943c701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7fd6a94a5d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7fd6a943bd2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fd6a9432805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fd6a9511740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7fd6a956d6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7fd6a941f0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7fd6a9444e76] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7fd6a9432805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7fd6a9511740] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw2] node down: Not properly terminated F replacing crashed worker gw2 .......................Fatal Python error: Segmentation fault Thread 0x00007f3c95d7b6c0 [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 0x00007f3c96cb6bc0 [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 [0x7f3c970b8f85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7f3c970b9a09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7f3c96dc5bf0] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_GetOptionalAttr+0x21 [0x7f3c9711fb71] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_HasAttr+0x23 [0x7f3c970750ef] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x2275 [0x7f3c9400a275] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x446d [0x7f3c9400c46d] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x4cfa [0x7f3c9400ccfa] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x56e6 [0x7f3c9400d6e6] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5a30 [0x7f3c9400da30] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5c33 [0x7f3c9400dc33] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x611d [0x7f3c9400e11d] Binary file "/lib64/libpython3.14.so.1.0", at +0x18a5ce [0x7f3c971275ce] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f3c970ec0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7f3c97103a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f3c970ff805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f3c971de740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f3c9723a6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f3c970ec0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7f3c97111e76] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f3c970ff805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f3c971de740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f3c9723a6f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7f3c971f2d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f3c97108d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f3c970ff805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f3c971de740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f3c9723a6f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f3c970ec0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf306 [0x7f3c97111e76] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7f3c97172d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f3c97108d2b] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw3] node down: Not properly terminated F replacing crashed worker gw3 ....Fatal Python error: Segmentation fault Thread 0x00007f6e5f0c96c0 [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 0x00007f6e60004bc0 [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 [0x7f6e60406f85] Binary file "/lib64/libpython3.14.so.1.0", at +0x11ca09 [0x7f6e60407a09] Binary file "/lib64/libc.so.6", at +0x19bf0 [0x7f6e60113bf0] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_GetOptionalAttr+0x21 [0x7f6e6046db71] Binary file "/lib64/libpython3.14.so.1.0", at PyObject_HasAttr+0x23 [0x7f6e603c30ef] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x2275 [0x7f6e5c464275] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x446d [0x7f6e5c46646d] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x4cfa [0x7f6e5c466cfa] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x56e6 [0x7f6e5c4676e6] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5a30 [0x7f6e5c467a30] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x5c33 [0x7f6e5c467c33] Binary file "/usr/lib64/python3.14/site-packages/bson/_cbson.cpython-314-x86_64-linux-gnu.so", at +0x611d [0x7f6e5c46811d] Binary file "/lib64/libpython3.14.so.1.0", at +0x18a5ce [0x7f6e604755ce] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f6e6043a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0xf1b [0x7f6e60451a8b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f6e6044d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f6e6052c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f6e605886f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f6e6043a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f6e60457701] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f6e6044d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f6e6052c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f6e605886f6] Binary file "/lib64/libpython3.14.so.1.0", at +0x255d6a [0x7f6e60540d6a] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f6e60456d2b] Binary file "/lib64/libpython3.14.so.1.0", at +0x162805 [0x7f6e6044d805] Binary file "/lib64/libpython3.14.so.1.0", at +0x241740 [0x7f6e6052c740] Binary file "/lib64/libpython3.14.so.1.0", at +0x29d6f6 [0x7f6e605886f6] Binary file "/lib64/libpython3.14.so.1.0", at _PyObject_MakeTpCall+0x36c [0x7f6e6043a0dc] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x6b91 [0x7f6e60457701] Binary file "/lib64/libpython3.14.so.1.0", at +0x1d5d6c [0x7f6e604c0d6c] Binary file "/lib64/libpython3.14.so.1.0", at _PyEval_EvalFrameDefault+0x61bb [0x7f6e60456d2b] Extension modules: yaml._yaml, bson._cbson, _cbor2, msgpack._cmsgpack, ujson (total: 5) [gw1] node down: Not properly terminated F replacing crashed worker gw1 ........s..... [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 0x7f6e57736980> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737320> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737690> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57735850> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57734040> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737e20> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57734a90> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737a00> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e577359b0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57735170> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737690> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e57737740> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e579a3270> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b8bf0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578bada0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b8460> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b83b0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b9fe0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b94e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578ba820> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578ba6c0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578bb5e0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578b9430> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578ba090> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e578bbe20> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 {'b': 10} != {'b': 2} E {'a': 10} != {'a': 1} 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 {'b': 10} != {'b': 2} E {'a': 10} != {'a': 1} 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 {'b': 10} != {'b': 2} E {'a': 10} != {'a': 1} 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 {'b': 10} != {'b': 2} E {'a': 10} != {'a': 1} 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 0x7f6e579a19b0> converter = overrides = None parent_subclass_tree = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) subclass_union = tests.strategies.test_include_subclasses.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}, {}, {}, {}, ...] classes = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e579caf00> 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..A | tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A1 ../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..A | tests.strategies.test_include_subclasses.test_structuring_unstructuring_unknown_subclass..A1 union_types = (.A1'>, .A'>, .A1'>) use_literals = True _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ converter = use_literals = True, overrides = [{}, {}, {}] classes = (.A1'>, .A'>, .A1'>) 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'>, .A'>, .A1'>) 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 0x7f6e579cac40> 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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e579c80f0> 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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e579c9220> 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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f6e579cacf0> 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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild ../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.Child1 | tests.strategies.test_include_subclasses.Child1 | tests.strategies.t...sses.GrandChild | tests.strategies.test_include_subclasses.Child2 | tests.strategies.test_include_subclasses.GrandChild union_types = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 = (, ,...'tests.strategies.test_include_subclasses.GrandChild'>, , ...) 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 0x7f453af05900>({'op': 0, 't': 'MESSAGE_CREATE'}) A = .A'> B = .B'> C = .C'> D = .D'> E = .E'> F = .F'> G = .G'> c = fn = .dis_func at 0x7f453af05900> 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 0x7f453bbc57a0>, _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 0x7f453658cf60>, . at 0x7f453658d010>, 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 0x7f453bbc57a0>, _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 0x7f453bbc57a0>, _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 0x7f453695efb0>, . at 0x7f453456e8d0>, 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 0x7f453bbc57a0>, _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 6 distinct failures. (6 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-160>", 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: | c: | 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': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'c': 0, | 'inherited': 0}), | detailed_validation=True, | ) | 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-161>", 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: | c: | 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': datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), | 'c': 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 +---------------- 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-164>", 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': 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-167>", 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': 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-162>", 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 +------------------------------------ +---------------- 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-166>", 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 _________________________ test_structuring_unsupported _________________________ [gw1] 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 _____________________________ [gw2] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw2' crashed while running 'tests/test_preconf.py::test_orjson_converter' ____________________________ 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' ____________________________ tests/test_preconf.py _____________________________ [gw1] linux -- Python 3.14.0 /usr/bin/python3 worker 'gw1' crashed while running 'tests/test_preconf.py::test_bson' =============================== 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: 35566 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: 8402 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: 1238 warnings tests/test_typeddicts.py: 9173 warnings tests/test_unstructure.py: 2821 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: 30493 warnings tests/test_baseconverter.py: 17125 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: 170616 warnings tests/test_tuples.py: 64 warnings tests/test_tuples_563.py: 4 warnings tests/test_recursive.py: 10 warnings tests/test_structure.py: 6103 warnings tests/test_unions.py: 35 warnings tests/test_unstructure_collections.py: 167 warnings tests/test_v.py: 23 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_structure.py::test_structuring_unsupported - AssertionError... FAILED tests/test_preconf.py::test_orjson_converter FAILED tests/test_preconf.py::test_bson_converter FAILED tests/test_preconf.py::test_bson 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, 286531 warnings, 25 errors in 159.13s (0:02:39) = RPM build errors: error: Bad exit status from /var/tmp/rpm-tmp.nMlmQ7 (%check) Bad exit status from /var/tmp/rpm-tmp.nMlmQ7 (%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-1747249028.746542/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 56 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 8535ce6e11184d53a32129fcc1a7635c -D /var/lib/mock/fedora-rawhide-x86_64-1747249028.746542/root -a -u mockbuild --capability=cap_ipc_lock --rlimit=RLIMIT_NOFILE=10240 --capability=cap_ipc_lock --bind=/tmp/mock-resolv.gucspw17:/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