Warning: Permanently added '52.91.38.6' (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/10096172-fedora-rawhide-x86_64 --chroot fedora-rawhide-x86_64 Version: 1.6 PID: 26735 Logging PID: 26737 Task: {'allow_user_ssh': False, 'appstream': False, 'background': False, 'build_id': 10096172, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-x86_64', 'enable_net': False, 'fedora_review': False, 'git_hash': 'a2d2e49373570f5bea076b293e0c80ef2e1762b3', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/pbrobinson/pandas3/python-xarray', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'python-xarray', 'package_version': '2025.12.0-2', 'project_dirname': 'pandas3', 'project_name': 'pandas3', 'project_owner': 'pbrobinson', 'repo_priority': None, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/pbrobinson/pandas3/fedora-rawhide-x86_64/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': None}], 'sandbox': 'pbrobinson/pandas3--pbrobinson', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 0, 'submitter': 'pbrobinson', 'tags': [], 'task_id': '10096172-fedora-rawhide-x86_64', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/pbrobinson/pandas3/python-xarray /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/pbrobinson/pandas3/python-xarray', '/var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray'... Running: git checkout a2d2e49373570f5bea076b293e0c80ef2e1762b3 -- cmd: ['git', 'checkout', 'a2d2e49373570f5bea076b293e0c80ef2e1762b3', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray rc: 0 stdout: stderr: Note: switching to 'a2d2e49373570f5bea076b293e0c80ef2e1762b3'. 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 a2d2e49 automatic import of python-xarray Running: dist-git-client sources cmd: ['dist-git-client', 'sources'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading xarray-2025.12.0.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -o xarray-2025.12.0.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/pbrobinson/pandas3/python-xarray/xarray-2025.12.0.tar.gz/md5/e361a695426b954ad1273fcca7934261/xarray-2025.12.0.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 3010k 100 3010k 0 0 137M 0 --:--:-- --:--:-- --:--:-- 139M INFO: Reading stdout from command: md5sum xarray-2025.12.0.tar.gz tail: /var/lib/copr-rpmbuild/main.log: file truncated Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray/python-xarray.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1770295020.048645 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 6.6 starting (python version = 3.14.2, NVR = mock-6.6-1.fc43), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray/python-xarray.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-31vejlds/python-xarray --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1770295020.048645 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start(bootstrap): init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish(bootstrap): init plugins 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-31vejlds/python-xarray/python-xarray.spec) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Mock Version: 6.6 INFO: Mock Version: 6.6 Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-bootstrap-1770295020.048645/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata INFO: Guessed host environment type: unknown INFO: Using container image: registry.fedoraproject.org/fedora:rawhide INFO: Pulling image: registry.fedoraproject.org/fedora:rawhide INFO: Tagging container image as mock-bootstrap-e100e5c9-1c19-4cb9-a636-720be282ccb9 INFO: Checking that c3d8c04f1da2e83e33e822b4720f49ddaed4e10f206378962abfde506b428c73 image matches host's architecture INFO: Copy content of container c3d8c04f1da2e83e33e822b4720f49ddaed4e10f206378962abfde506b428c73 to /var/lib/mock/fedora-rawhide-x86_64-bootstrap-1770295020.048645/root INFO: mounting c3d8c04f1da2e83e33e822b4720f49ddaed4e10f206378962abfde506b428c73 with podman image mount INFO: image c3d8c04f1da2e83e33e822b4720f49ddaed4e10f206378962abfde506b428c73 as /var/lib/containers/storage/overlay/37cd7c146754c2527ad102d46ef6543ce34ca5e98246468f723958d47392ce91/merged INFO: umounting image c3d8c04f1da2e83e33e822b4720f49ddaed4e10f206378962abfde506b428c73 (/var/lib/containers/storage/overlay/37cd7c146754c2527ad102d46ef6543ce34ca5e98246468f723958d47392ce91/merged) with podman image umount INFO: Removing image mock-bootstrap-e100e5c9-1c19-4cb9-a636-720be282ccb9 INFO: Package manager dnf5 detected and used (fallback) INFO: Not updating bootstrap chroot, bootstrap_image_ready=True Start(bootstrap): creating root cache Finish(bootstrap): creating root cache Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1770295020.048645/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 (direct choice) INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-6.0.1-2.fc44.x86_64 rpm-sequoia-1.10.0-2.fc44.x86_64 dnf5-5.3.0.0-7.fc44.x86_64 dnf5-plugins-5.3.0.0-7.fc44.x86_64 Start: installing minimal buildroot with dnf5 Updating and loading repositories: Copr repository 100% | 1.3 KiB/s | 1.5 KiB | 00m01s fedora 100% | 20.9 KiB/s | 26.4 KiB | 00m01s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash x86_64 0:5.3.9-3.fc44 fedora 8.5 MiB bzip2 x86_64 0:1.0.8-23.fc44 fedora 95.0 KiB coreutils x86_64 0:9.9-4.fc44 fedora 5.4 MiB cpio x86_64 0:2.15-9.fc44 fedora 1.1 MiB diffutils x86_64 0:3.12-5.fc44 fedora 1.6 MiB fedora-release-common noarch 0:44-0.10 fedora 20.6 KiB findutils x86_64 1:4.10.0-7.fc44 fedora 1.9 MiB gawk x86_64 0:5.3.2-3.fc44 fedora 1.8 MiB glibc-minimal-langpack x86_64 0:2.43-1.fc44 fedora 0.0 B grep x86_64 0:3.12-3.fc44 fedora 1.0 MiB gzip x86_64 0:1.14-2.fc44 fedora 401.6 KiB info x86_64 0:7.2-7.fc44 fedora 357.9 KiB patch x86_64 0:2.8-4.fc44 fedora 226.6 KiB redhat-rpm-config noarch 0:343-19.fc44 fedora 183.6 KiB rpm-build x86_64 0:6.0.1-2.fc44 fedora 294.6 KiB sed x86_64 0:4.9-7.fc44 fedora 857.2 KiB shadow-utils x86_64 2:4.19.0-6.fc44 fedora 4.0 MiB tar x86_64 2:1.35-8.fc44 fedora 3.0 MiB unzip x86_64 0:6.0-69.fc44 fedora 445.8 KiB util-linux x86_64 0:2.41.3-12.fc44 fedora 3.5 MiB which x86_64 0:2.23-4.fc44 fedora 83.4 KiB xz x86_64 1:5.8.2-2.fc44 fedora 1.3 MiB Installing dependencies: R-srpm-macros noarch 0:1.3.4-3.fc44 fedora 3.4 KiB add-determinism x86_64 0:0.7.2-3.fc44 fedora 2.3 MiB alternatives x86_64 0:1.33-5.fc44 fedora 62.1 KiB ansible-srpm-macros noarch 0:1-20.1.fc44 fedora 35.7 KiB audit-libs x86_64 0:4.1.3-1.fc44 fedora 390.5 KiB binutils x86_64 0:2.45.50-19.fc44 fedora 27.4 MiB build-reproducibility-srpm-macros noarch 0:0.7.2-3.fc44 fedora 1.2 KiB bzip2-libs x86_64 0:1.0.8-23.fc44 fedora 80.5 KiB ca-certificates noarch 0:2025.2.80_v9.0.304-5.fc44 fedora 2.7 MiB cmake-srpm-macros noarch 0:3.31.10-5.fc44 fedora 524.0 B coreutils-common x86_64 0:9.9-4.fc44 fedora 11.2 MiB crypto-policies noarch 0:20251128-3.git19878fe.fc44 fedora 132.6 KiB curl x86_64 0:8.18.0-3.fc44 fedora 480.0 KiB cyrus-sasl-lib x86_64 0:2.1.28-35.fc44 fedora 2.3 MiB debugedit x86_64 0:5.2-6.fc44 fedora 218.3 KiB dwz x86_64 0:0.16-3.fc44 fedora 290.9 KiB ed x86_64 0:1.22.4-2.fc44 fedora 149.1 KiB efi-srpm-macros noarch 0:6-6.fc44 fedora 40.2 KiB elfutils x86_64 0:0.194-3.fc44 fedora 2.9 MiB elfutils-debuginfod-client x86_64 0:0.194-3.fc44 fedora 83.7 KiB elfutils-default-yama-scope noarch 0:0.194-3.fc44 fedora 1.8 KiB elfutils-libelf x86_64 0:0.194-3.fc44 fedora 1.1 MiB elfutils-libs x86_64 0:0.194-3.fc44 fedora 715.3 KiB fedora-gpg-keys noarch 0:44-0.1 fedora 131.2 KiB fedora-release noarch 0:44-0.10 fedora 0.0 B fedora-release-identity-basic noarch 0:44-0.10 fedora 664.0 B fedora-repos noarch 0:44-0.1 fedora 4.9 KiB fedora-repos-rawhide noarch 0:44-0.1 fedora 2.2 KiB file x86_64 0:5.46-9.fc44 fedora 100.1 KiB file-libs x86_64 0:5.46-9.fc44 fedora 11.9 MiB filesystem x86_64 0:3.18-52.fc44 fedora 112.0 B filesystem-srpm-macros noarch 0:3.18-52.fc44 fedora 38.2 KiB fonts-srpm-macros noarch 1:5.0.0-2.fc44 fedora 55.8 KiB forge-srpm-macros noarch 0:0.4.0-4.fc44 fedora 38.9 KiB fpc-srpm-macros noarch 0:1.3-16.fc44 fedora 144.0 B gap-srpm-macros noarch 0:2-2.fc44 fedora 2.1 KiB gdb-minimal x86_64 0:17.1-2.fc44 fedora 14.3 MiB gdbm-libs x86_64 1:1.23-11.fc44 fedora 129.6 KiB ghc-srpm-macros noarch 0:1.10-1.fc44 fedora 792.0 B glibc x86_64 0:2.43-1.fc44 fedora 6.9 MiB glibc-common x86_64 0:2.43-1.fc44 fedora 1.0 MiB glibc-gconv-extra x86_64 0:2.43-1.fc44 fedora 7.4 MiB gmp x86_64 1:6.3.0-5.fc44 fedora 815.2 KiB gnat-srpm-macros noarch 0:7-2.fc44 fedora 1.0 KiB gnulib-l10n noarch 0:20241231-2.fc44 fedora 655.0 KiB gnupg2 x86_64 0:2.4.9-5.fc44 fedora 6.5 MiB gnupg2-dirmngr x86_64 0:2.4.9-5.fc44 fedora 633.9 KiB gnupg2-gpg-agent x86_64 0:2.4.9-5.fc44 fedora 682.5 KiB gnupg2-gpgconf x86_64 0:2.4.9-5.fc44 fedora 249.7 KiB gnupg2-keyboxd x86_64 0:2.4.9-5.fc44 fedora 201.2 KiB gnupg2-verify x86_64 0:2.4.9-5.fc44 fedora 360.3 KiB gnutls x86_64 0:3.8.11-10.fc44 fedora 3.7 MiB go-srpm-macros noarch 0:3.8.0-2.fc44 fedora 61.9 KiB gpgverify noarch 0:2.2-4.fc44 fedora 8.7 KiB ima-evm-utils-libs x86_64 0:1.6.2-8.fc44 fedora 60.6 KiB jansson x86_64 0:2.14-4.fc44 fedora 88.9 KiB java-srpm-macros noarch 0:1-8.fc44 fedora 870.0 B json-c x86_64 0:0.18-8.fc44 fedora 82.6 KiB kernel-srpm-macros noarch 0:1.0-28.fc44 fedora 1.9 KiB keyutils-libs x86_64 0:1.6.3-7.fc44 fedora 54.2 KiB krb5-libs x86_64 0:1.21.3-12.fc44 fedora 2.4 MiB libacl x86_64 0:2.3.2-6.fc44 fedora 35.8 KiB libarchive x86_64 0:3.8.4-2.fc44 fedora 991.2 KiB libassuan x86_64 0:2.5.7-5.fc44 fedora 163.8 KiB libattr x86_64 0:2.5.2-8.fc44 fedora 24.3 KiB libblkid x86_64 0:2.41.3-12.fc44 fedora 274.3 KiB libbrotli x86_64 0:1.2.0-3.fc44 fedora 865.0 KiB libcap x86_64 0:2.77-2.fc44 fedora 212.1 KiB libcap-ng x86_64 0:0.9-7.fc44 fedora 68.7 KiB libcom_err x86_64 0:1.47.3-4.fc44 fedora 63.0 KiB libcurl x86_64 0:8.18.0-3.fc44 fedora 1.0 MiB libeconf x86_64 0:0.7.9-3.fc44 fedora 64.8 KiB libevent x86_64 0:2.1.12-17.fc44 fedora 978.7 KiB libfdisk x86_64 0:2.41.3-12.fc44 fedora 388.3 KiB libffi x86_64 0:3.5.2-2.fc44 fedora 87.7 KiB libfsverity x86_64 0:1.6-4.fc44 fedora 28.4 KiB libgcc x86_64 0:16.0.1-0.5.fc44 fedora 270.6 KiB libgcrypt x86_64 0:1.11.2-1.fc44 fedora 1.6 MiB libgomp x86_64 0:16.0.1-0.5.fc44 fedora 571.8 KiB libgpg-error x86_64 0:1.58-2.fc44 fedora 941.6 KiB libidn2 x86_64 0:2.3.8-3.fc44 fedora 556.4 KiB libksba x86_64 0:1.6.7-5.fc44 fedora 414.4 KiB liblastlog2 x86_64 0:2.41.3-12.fc44 fedora 37.6 KiB libmount x86_64 0:2.41.3-12.fc44 fedora 388.6 KiB libnghttp2 x86_64 0:1.68.0-3.fc44 fedora 166.1 KiB libnghttp3 x86_64 0:1.15.0-1.fc44 fedora 159.2 KiB libpkgconf x86_64 0:2.3.0-4.fc44 fedora 78.0 KiB libpsl x86_64 0:0.21.5-7.fc44 fedora 76.3 KiB libselinux x86_64 0:3.10-1.fc44 fedora 201.0 KiB libselinux-utils x86_64 0:3.10-1.fc44 fedora 305.7 KiB libsemanage x86_64 0:3.10-1.fc44 fedora 312.3 KiB libsepol x86_64 0:3.10-1.fc44 fedora 870.0 KiB libsmartcols x86_64 0:2.41.3-12.fc44 fedora 188.3 KiB libssh x86_64 0:0.11.3-3.fc44 fedora 595.2 KiB libssh-config noarch 0:0.11.3-3.fc44 fedora 277.0 B libstdc++ x86_64 0:16.0.1-0.5.fc44 fedora 2.9 MiB libtasn1 x86_64 0:4.20.0-3.fc44 fedora 180.2 KiB libtool-ltdl x86_64 0:2.5.4-10.fc44 fedora 70.0 KiB libunistring x86_64 0:1.1-11.fc44 fedora 1.7 MiB libusb1 x86_64 0:1.0.29-5.fc44 fedora 175.2 KiB libuuid x86_64 0:2.41.3-12.fc44 fedora 37.2 KiB libverto x86_64 0:0.3.2-12.fc44 fedora 25.3 KiB libxcrypt x86_64 0:4.5.2-3.fc44 fedora 293.2 KiB libxml2 x86_64 0:2.12.10-6.fc44 fedora 1.8 MiB libzstd x86_64 0:1.5.7-5.fc44 fedora 956.1 KiB linkdupes x86_64 0:0.7.2-3.fc44 fedora 826.6 KiB lua-libs x86_64 0:5.4.8-5.fc44 fedora 281.7 KiB lua-srpm-macros noarch 0:1-17.fc44 fedora 1.3 KiB lz4-libs x86_64 0:1.10.0-4.fc44 fedora 157.3 KiB mpfr x86_64 0:4.2.2-3.fc44 fedora 849.1 KiB ncurses-base noarch 0:6.6-1.fc44 fedora 329.7 KiB ncurses-libs x86_64 0:6.6-1.fc44 fedora 968.9 KiB nettle x86_64 0:3.10.1-3.fc44 fedora 794.3 KiB ngtcp2 x86_64 0:1.19.0-2.fc44 fedora 330.2 KiB ngtcp2-crypto-ossl x86_64 0:1.19.0-2.fc44 fedora 51.6 KiB npth x86_64 0:1.8-4.fc44 fedora 49.5 KiB ocaml-srpm-macros noarch 0:11-3.fc44 fedora 1.9 KiB openblas-srpm-macros noarch 0:2-21.fc44 fedora 112.0 B openldap x86_64 0:2.6.10-7.fc44 fedora 667.5 KiB openssl-libs x86_64 1:3.5.5-1.fc44 fedora 9.2 MiB p11-kit x86_64 0:0.25.8-2.fc44 fedora 2.3 MiB p11-kit-trust x86_64 0:0.25.8-2.fc44 fedora 458.3 KiB package-notes-srpm-macros noarch 0:0.5-15.fc44 fedora 1.6 KiB pam-libs x86_64 0:1.7.2-1.fc44 fedora 130.5 KiB pcre2 x86_64 0:10.47-1.fc44.1 fedora 718.6 KiB pcre2-syntax noarch 0:10.47-1.fc44.1 fedora 281.9 KiB perl-srpm-macros noarch 0:1-61.fc44 fedora 861.0 B pkgconf x86_64 0:2.3.0-4.fc44 fedora 88.3 KiB pkgconf-m4 noarch 0:2.3.0-4.fc44 fedora 14.4 KiB pkgconf-pkg-config x86_64 0:2.3.0-4.fc44 fedora 989.0 B policycoreutils x86_64 0:3.10-1.fc44 fedora 884.1 KiB popt x86_64 0:1.19-10.fc44 fedora 132.6 KiB publicsuffix-list-dafsa noarch 0:20260116-1.fc44 fedora 70.4 KiB pyproject-srpm-macros noarch 0:1.18.6-2.fc44 fedora 1.9 KiB python-srpm-macros noarch 0:3.14-10.fc44 fedora 51.6 KiB qt5-srpm-macros noarch 0:5.15.18-2.fc44 fedora 500.0 B qt6-srpm-macros noarch 0:6.10.1-2.fc44 fedora 464.0 B readline x86_64 0:8.3-4.fc44 fedora 519.5 KiB rpm x86_64 0:6.0.1-2.fc44 fedora 3.1 MiB rpm-build-libs x86_64 0:6.0.1-2.fc44 fedora 276.3 KiB rpm-libs x86_64 0:6.0.1-2.fc44 fedora 961.2 KiB rpm-plugin-selinux x86_64 0:6.0.1-2.fc44 fedora 11.9 KiB rpm-sequoia x86_64 0:1.10.0-2.fc44 fedora 2.5 MiB rpm-sign-libs x86_64 0:6.0.1-2.fc44 fedora 39.6 KiB rust-srpm-macros noarch 0:28.4-3.fc44 fedora 5.5 KiB selinux-policy noarch 0:42.22-1.fc44 fedora 32.0 KiB selinux-policy-targeted noarch 0:42.22-1.fc44 fedora 18.5 MiB setup noarch 0:2.15.0-28.fc44 fedora 724.9 KiB sqlite-libs x86_64 0:3.51.2-1.fc44 fedora 1.6 MiB systemd-libs x86_64 0:259-19.fc44 fedora 2.4 MiB systemd-standalone-sysusers x86_64 0:259-19.fc44 fedora 301.6 KiB tpm2-tss x86_64 0:4.1.3-9.fc44 fedora 1.6 MiB tree-sitter-srpm-macros noarch 0:0.4.2-2.fc44 fedora 8.3 KiB util-linux-core x86_64 0:2.41.3-12.fc44 fedora 1.5 MiB xxhash-libs x86_64 0:0.8.3-4.fc44 fedora 94.0 KiB xz-libs x86_64 1:5.8.2-2.fc44 fedora 217.7 KiB zig-srpm-macros noarch 0:1-8.fc44 fedora 1.3 KiB zip x86_64 0:3.0-45.fc44 fedora 698.0 KiB zlib-ng-compat x86_64 0:2.3.2-3.fc44 fedora 169.6 KiB zstd x86_64 0:1.5.7-5.fc44 fedora 502.4 KiB Installing groups: Buildsystem building group Transaction Summary: Installing: 182 packages Total size of inbound packages is 69 MiB. Need to download 0 B. After this operation, 223 MiB extra will be used (install 223 MiB, remove 0 B). [ 1/182] tar-2:1.35-8.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/182] bzip2-0:1.0.8-23.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/182] redhat-rpm-config-0:343-19.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/182] rpm-build-0:6.0.1-2.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/182] unzip-0:6.0-69.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/182] cpio-0:2.15-9.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/182] which-0:2.23-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/182] bash-0:5.3.9-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/182] coreutils-0:9.9-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 10/182] grep-0:3.12-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 11/182] patch-0:2.8-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 12/182] sed-0:4.9-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 13/182] shadow-utils-2:4.19.0-6.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 14/182] diffutils-0:3.12-5.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 15/182] fedora-release-common-0:44-0. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 16/182] findutils-1:4.10.0-7.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 17/182] glibc-minimal-langpack-0:2.43 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 18/182] gzip-0:1.14-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 19/182] info-0:7.2-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 20/182] xz-1:5.8.2-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 21/182] util-linux-0:2.41.3-12.fc44.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 22/182] gawk-0:5.3.2-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 23/182] glibc-0:2.43-1.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 24/182] libacl-0:2.3.2-6.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 25/182] libselinux-0:3.10-1.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 26/182] bzip2-libs-0:1.0.8-23.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 27/182] R-srpm-macros-0:1.3.4-3.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 28/182] ansible-srpm-macros-0:1-20.1. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 29/182] build-reproducibility-srpm-ma 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 30/182] cmake-srpm-macros-0:3.31.10-5 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 31/182] dwz-0:0.16-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 32/182] efi-srpm-macros-0:6-6.fc44.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 33/182] file-0:5.46-9.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 34/182] filesystem-srpm-macros-0:3.18 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 35/182] fonts-srpm-macros-1:5.0.0-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 36/182] forge-srpm-macros-0:0.4.0-4.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 37/182] fpc-srpm-macros-0:1.3-16.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 38/182] gap-srpm-macros-0:2-2.fc44.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 39/182] ghc-srpm-macros-0:1.10-1.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 40/182] gnat-srpm-macros-0:7-2.fc44.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 41/182] go-srpm-macros-0:3.8.0-2.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 42/182] java-srpm-macros-0:1-8.fc44.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 43/182] kernel-srpm-macros-0:1.0-28.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 44/182] lua-srpm-macros-0:1-17.fc44.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 45/182] ocaml-srpm-macros-0:11-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 46/182] openblas-srpm-macros-0:2-21.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 47/182] package-notes-srpm-macros-0:0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 48/182] perl-srpm-macros-0:1-61.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 49/182] pyproject-srpm-macros-0:1.18. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 50/182] python-srpm-macros-0:3.14-10. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 51/182] qt5-srpm-macros-0:5.15.18-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 52/182] qt6-srpm-macros-0:6.10.1-2.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 53/182] rpm-0:6.0.1-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 54/182] rust-srpm-macros-0:28.4-3.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 55/182] tree-sitter-srpm-macros-0:0.4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 56/182] zig-srpm-macros-0:1-8.fc44.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 57/182] zip-0:3.0-45.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 58/182] debugedit-0:5.2-6.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 59/182] elfutils-0:0.194-3.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 60/182] elfutils-libelf-0:0.194-3.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 61/182] libarchive-0:3.8.4-2.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 62/182] libgcc-0:16.0.1-0.5.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 63/182] libstdc++-0:16.0.1-0.5.fc44.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 64/182] popt-0:1.19-10.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 65/182] readline-0:8.3-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 66/182] rpm-build-libs-0:6.0.1-2.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 67/182] rpm-libs-0:6.0.1-2.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 68/182] zstd-0:1.5.7-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 69/182] filesystem-0:3.18-52.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 70/182] ncurses-libs-0:6.6-1.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 71/182] coreutils-common-0:9.9-4.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 72/182] gmp-1:6.3.0-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 73/182] libattr-0:2.5.2-8.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 74/182] libcap-0:2.77-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 75/182] openssl-libs-1:3.5.5-1.fc44.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 76/182] systemd-libs-0:259-19.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 77/182] pcre2-0:10.47-1.fc44.1.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 78/182] ed-0:1.22.4-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 79/182] audit-libs-0:4.1.3-1.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 80/182] libeconf-0:0.7.9-3.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 81/182] libsemanage-0:3.10-1.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 82/182] libxcrypt-0:4.5.2-3.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 83/182] pam-libs-0:1.7.2-1.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 84/182] setup-0:2.15.0-28.fc44.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 85/182] fedora-repos-0:44-0.1.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 86/182] glibc-common-0:2.43-1.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 87/182] xz-libs-1:5.8.2-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 88/182] libblkid-0:2.41.3-12.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 89/182] libcap-ng-0:0.9-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 90/182] libfdisk-0:2.41.3-12.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 91/182] liblastlog2-0:2.41.3-12.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 92/182] libmount-0:2.41.3-12.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 93/182] libsmartcols-0:2.41.3-12.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 94/182] libuuid-0:2.41.3-12.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 95/182] util-linux-core-0:2.41.3-12.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 96/182] zlib-ng-compat-0:2.3.2-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 97/182] mpfr-0:4.2.2-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 98/182] glibc-gconv-extra-0:2.43-1.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 99/182] libsepol-0:3.10-1.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [100/182] add-determinism-0:0.7.2-3.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [101/182] linkdupes-0:0.7.2-3.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [102/182] file-libs-0:5.46-9.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [103/182] curl-0:8.18.0-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [104/182] elfutils-libs-0:0.194-3.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [105/182] elfutils-debuginfod-client-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [106/182] libzstd-0:1.5.7-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [107/182] libxml2-0:2.12.10-6.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [108/182] lz4-libs-0:1.10.0-4.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [109/182] libgomp-0:16.0.1-0.5.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [110/182] lua-libs-0:5.4.8-5.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [111/182] rpm-sign-libs-0:6.0.1-2.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [112/182] rpm-sequoia-0:1.10.0-2.fc44.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [113/182] sqlite-libs-0:3.51.2-1.fc44.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [114/182] ncurses-base-0:6.6-1.fc44.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [115/182] gnulib-l10n-0:20241231-2.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [116/182] ca-certificates-0:2025.2.80_v 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [117/182] crypto-policies-0:20251128-3. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [118/182] pcre2-syntax-0:10.47-1.fc44.1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [119/182] fedora-gpg-keys-0:44-0.1.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [120/182] fedora-repos-rawhide-0:44-0.1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [121/182] elfutils-default-yama-scope-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [122/182] json-c-0:0.18-8.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [123/182] gnupg2-0:2.4.9-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [124/182] ima-evm-utils-libs-0:1.6.2-8. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [125/182] libfsverity-0:1.6-4.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [126/182] gpgverify-0:2.2-4.fc44.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [127/182] gnupg2-dirmngr-0:2.4.9-5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [128/182] gnupg2-gpg-agent-0:2.4.9-5.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [129/182] gnupg2-gpgconf-0:2.4.9-5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [130/182] gnupg2-keyboxd-0:2.4.9-5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [131/182] gnupg2-verify-0:2.4.9-5.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [132/182] libassuan-0:2.5.7-5.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [133/182] libgcrypt-0:1.11.2-1.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [134/182] libgpg-error-0:1.58-2.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [135/182] npth-0:1.8-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [136/182] tpm2-tss-0:4.1.3-9.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [137/182] gnutls-0:3.8.11-10.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [138/182] libksba-0:1.6.7-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [139/182] openldap-0:2.6.10-7.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [140/182] libusb1-0:1.0.29-5.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [141/182] libidn2-0:2.3.8-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [142/182] libtasn1-0:4.20.0-3.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [143/182] libunistring-0:1.1-11.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [144/182] nettle-0:3.10.1-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [145/182] p11-kit-0:0.25.8-2.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [146/182] cyrus-sasl-lib-0:2.1.28-35.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [147/182] libevent-0:2.1.12-17.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [148/182] libtool-ltdl-0:2.5.4-10.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [149/182] libffi-0:3.5.2-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [150/182] gdbm-libs-1:1.23-11.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [151/182] binutils-0:2.45.50-19.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [152/182] alternatives-0:1.33-5.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [153/182] jansson-0:2.14-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [154/182] pkgconf-pkg-config-0:2.3.0-4. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [155/182] pkgconf-0:2.3.0-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [156/182] pkgconf-m4-0:2.3.0-4.fc44.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [157/182] libpkgconf-0:2.3.0-4.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [158/182] p11-kit-trust-0:0.25.8-2.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [159/182] fedora-release-0:44-0.10.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [160/182] systemd-standalone-sysusers-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [161/182] gdb-minimal-0:17.1-2.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [162/182] xxhash-libs-0:0.8.3-4.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [163/182] fedora-release-identity-basic 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [164/182] libcurl-0:8.18.0-3.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [165/182] krb5-libs-0:1.21.3-12.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [166/182] libbrotli-0:1.2.0-3.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [167/182] libnghttp2-0:1.68.0-3.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [168/182] libnghttp3-0:1.15.0-1.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [169/182] libpsl-0:0.21.5-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [170/182] libssh-0:0.11.3-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [171/182] ngtcp2-0:1.19.0-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [172/182] ngtcp2-crypto-ossl-0:1.19.0-2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [173/182] keyutils-libs-0:1.6.3-7.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [174/182] libcom_err-0:1.47.3-4.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [175/182] libverto-0:0.3.2-12.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [176/182] publicsuffix-list-dafsa-0:202 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [177/182] libssh-config-0:0.11.3-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [178/182] selinux-policy-targeted-0:42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [179/182] policycoreutils-0:3.10-1.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [180/182] selinux-policy-0:42.22-1.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [181/182] libselinux-utils-0:3.10-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [182/182] rpm-plugin-selinux-0:6.0.1-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [182/182] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction Importing OpenPGP key 0x6D9F90A6: UserID : "Fedora (44) " Fingerprint: 36F612DCF27F7D1A48A835E4DBFCF71C6D9F90A6 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-44-primary The key was successfully imported. Importing OpenPGP key 0x6D9F90A6: UserID : "Fedora (44) " Fingerprint: 36F612DCF27F7D1A48A835E4DBFCF71C6D9F90A6 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-44-primary The key was successfully imported. Importing OpenPGP key 0x31645531: UserID : "Fedora (43) " Fingerprint: C6E7F081CF80E13146676E88829B606631645531 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-43-primary The key was successfully imported. Importing OpenPGP key 0xF577861E: UserID : "Fedora (45) " Fingerprint: 4F50A6114CD5C6976A7F1179655A4B02F577861E From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-45-primary The key was successfully imported. [ 1/184] Verify package files 100% | 669.0 B/s | 182.0 B | 00m00s [ 2/184] Prepare transaction 100% | 3.4 KiB/s | 182.0 B | 00m00s [ 3/184] Installing libgcc-0:16.0.1-0. 100% | 266.0 MiB/s | 272.3 KiB | 00m00s [ 4/184] Installing libssh-config-0:0. 100% | 0.0 B/s | 816.0 B | 00m00s [ 5/184] Installing publicsuffix-list- 100% | 0.0 B/s | 71.1 KiB | 00m00s [ 6/184] Installing fedora-release-ide 100% | 0.0 B/s | 920.0 B | 00m00s [ 7/184] Installing fedora-repos-rawhi 100% | 0.0 B/s | 2.4 KiB | 00m00s [ 8/184] Installing fedora-gpg-keys-0: 100% | 43.7 MiB/s | 179.0 KiB | 00m00s [ 9/184] Installing fedora-repos-0:44- 100% | 0.0 B/s | 5.7 KiB | 00m00s [ 10/184] Installing fedora-release-com 100% | 24.3 MiB/s | 24.9 KiB | 00m00s [ 11/184] Installing fedora-release-0:4 100% | 17.3 KiB/s | 124.0 B | 00m00s >>> Running sysusers scriptlet: setup-0:2.15.0-28.fc44.noarch >>> Finished sysusers scriptlet: setup-0:2.15.0-28.fc44.noarch >>> Scriptlet output: >>> Creating group 'adm' with GID 4. >>> Creating group 'audio' with GID 63. >>> Creating group 'cdrom' with GID 11. >>> Creating group 'clock' with GID 103. >>> Creating group 'dialout' with GID 18. >>> Creating group 'disk' with GID 6. >>> Creating group 'floppy' with GID 19. >>> Creating group 'ftp' with GID 50. >>> Creating group 'games' with GID 20. >>> Creating group 'input' with GID 104. >>> Creating group 'kmem' with GID 9. >>> Creating group 'kvm' with GID 36. >>> Creating group 'lock' with GID 54. >>> Creating group 'lp' with GID 7. >>> Creating group 'mail' with GID 12. >>> Creating group 'man' with GID 15. >>> Creating group 'mem' with GID 8. >>> Creating group 'nobody' with GID 65534. >>> Creating group 'render' with GID 105. >>> Creating group 'root' with GID 0. >>> Creating group 'sgx' with GID 106. >>> Creating group 'sys' with GID 3. >>> Creating group 'tape' with GID 33. >>> Creating group 'tty' with GID 5. >>> Creating group 'users' with GID 100. >>> Creating group 'utmp' with GID 22. >>> Creating group 'video' with GID 39. >>> Creating group 'wheel' with GID 10. >>> Creating user 'adm' (adm) with UID 3 and GID 4. >>> Creating group 'bin' with GID 1. >>> Creating user 'bin' (bin) with UID 1 and GID 1. >>> Creating group 'daemon' with GID 2. >>> Creating user 'daemon' (daemon) with UID 2 and GID 2. >>> Creating user 'ftp' (FTP User) with UID 14 and GID 50. >>> Creating user 'games' (games) with UID 12 and GID 100. >>> Creating user 'halt' (halt) with UID 7 and GID 0. >>> Creating user 'lp' (lp) with UID 4 and GID 7. >>> Creating user 'mail' (mail) with UID 8 and GID 12. >>> Creating user 'nobody' (Kernel Overflow User) with UID 65534 and GID 65534. >>> Creating user 'operator' (operator) with UID 11 and GID 0. >>> Creating user 'root' (Super User) with UID 0 and GID 0. >>> Creating user 'shutdown' (shutdown) with UID 6 and GID 0. >>> Creating user 'sync' (sync) with UID 5 and GID 0. >>> [ 12/184] Installing setup-0:2.15.0-28. 100% | 47.6 MiB/s | 730.6 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 13/184] Installing filesystem-0:3.18- 100% | 2.8 MiB/s | 212.8 KiB | 00m00s [ 14/184] Installing pkgconf-m4-0:2.3.0 100% | 0.0 B/s | 14.8 KiB | 00m00s [ 15/184] Installing pcre2-syntax-0:10. 100% | 277.7 MiB/s | 284.3 KiB | 00m00s [ 16/184] Installing gnulib-l10n-0:2024 100% | 215.5 MiB/s | 661.9 KiB | 00m00s [ 17/184] Installing coreutils-common-0 100% | 387.2 MiB/s | 11.2 MiB | 00m00s [ 18/184] Installing ncurses-base-0:6.6 100% | 86.7 MiB/s | 355.3 KiB | 00m00s [ 19/184] Installing bash-0:5.3.9-3.fc4 100% | 282.7 MiB/s | 8.5 MiB | 00m00s [ 20/184] Installing glibc-common-0:2.4 100% | 60.3 MiB/s | 1.0 MiB | 00m00s [ 21/184] Installing glibc-gconv-extra- 100% | 287.1 MiB/s | 7.5 MiB | 00m00s [ 22/184] Installing glibc-0:2.43-1.fc4 100% | 187.9 MiB/s | 7.0 MiB | 00m00s [ 23/184] Installing ncurses-libs-0:6.6 100% | 238.1 MiB/s | 975.4 KiB | 00m00s [ 24/184] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 25/184] Installing zlib-ng-compat-0:2 100% | 166.4 MiB/s | 170.4 KiB | 00m00s [ 26/184] Installing bzip2-libs-0:1.0.8 100% | 79.7 MiB/s | 81.6 KiB | 00m00s [ 27/184] Installing libgpg-error-0:1.5 100% | 61.7 MiB/s | 947.5 KiB | 00m00s [ 28/184] Installing libstdc++-0:16.0.1 100% | 364.8 MiB/s | 2.9 MiB | 00m00s [ 29/184] Installing libassuan-0:2.5.7- 100% | 161.8 MiB/s | 165.7 KiB | 00m00s [ 30/184] Installing libgcrypt-0:1.11.2 100% | 394.0 MiB/s | 1.6 MiB | 00m00s [ 31/184] Installing readline-0:8.3-4.f 100% | 254.7 MiB/s | 521.6 KiB | 00m00s [ 32/184] Installing gmp-1:6.3.0-5.fc44 100% | 399.2 MiB/s | 817.5 KiB | 00m00s [ 33/184] Installing xz-libs-1:5.8.2-2. 100% | 213.7 MiB/s | 218.8 KiB | 00m00s [ 34/184] Installing libuuid-0:2.41.3-1 100% | 37.3 MiB/s | 38.2 KiB | 00m00s [ 35/184] Installing popt-0:1.19-10.fc4 100% | 68.0 MiB/s | 139.3 KiB | 00m00s [ 36/184] Installing libzstd-0:1.5.7-5. 100% | 311.6 MiB/s | 957.4 KiB | 00m00s [ 37/184] Installing elfutils-libelf-0: 100% | 376.3 MiB/s | 1.1 MiB | 00m00s [ 38/184] Installing npth-0:1.8-4.fc44. 100% | 0.0 B/s | 50.6 KiB | 00m00s [ 39/184] Installing libblkid-0:2.41.3- 100% | 269.0 MiB/s | 275.4 KiB | 00m00s [ 40/184] Installing systemd-libs-0:259 100% | 348.9 MiB/s | 2.4 MiB | 00m00s [ 41/184] Installing libxcrypt-0:4.5.2- 100% | 289.0 MiB/s | 295.9 KiB | 00m00s [ 42/184] Installing libsepol-0:3.10-1. 100% | 283.5 MiB/s | 871.0 KiB | 00m00s [ 43/184] Installing sqlite-libs-0:3.51 100% | 318.1 MiB/s | 1.6 MiB | 00m00s [ 44/184] Installing gnupg2-gpgconf-0:2 100% | 18.9 MiB/s | 251.8 KiB | 00m00s [ 45/184] Installing libattr-0:2.5.2-8. 100% | 0.0 B/s | 25.2 KiB | 00m00s [ 46/184] Installing libacl-0:2.3.2-6.f 100% | 0.0 B/s | 36.6 KiB | 00m00s [ 47/184] Installing pcre2-0:10.47-1.fc 100% | 351.6 MiB/s | 720.0 KiB | 00m00s [ 48/184] Installing libselinux-0:3.10- 100% | 197.5 MiB/s | 202.3 KiB | 00m00s [ 49/184] Installing grep-0:3.12-3.fc44 100% | 62.7 MiB/s | 1.0 MiB | 00m00s [ 50/184] Installing sed-0:4.9-7.fc44.x 100% | 56.3 MiB/s | 865.4 KiB | 00m00s [ 51/184] Installing findutils-1:4.10.0 100% | 103.9 MiB/s | 1.9 MiB | 00m00s [ 52/184] Installing libtasn1-0:4.20.0- 100% | 177.7 MiB/s | 182.0 KiB | 00m00s [ 53/184] Installing libunistring-0:1.1 100% | 346.9 MiB/s | 1.7 MiB | 00m00s [ 54/184] Installing libidn2-0:2.3.8-3. 100% | 61.0 MiB/s | 562.6 KiB | 00m00s [ 55/184] Installing crypto-policies-0: 100% | 30.8 MiB/s | 157.7 KiB | 00m00s [ 56/184] Installing xz-1:5.8.2-2.fc44. 100% | 72.1 MiB/s | 1.4 MiB | 00m00s [ 57/184] Installing libmount-0:2.41.3- 100% | 190.3 MiB/s | 389.7 KiB | 00m00s [ 58/184] Installing gnupg2-verify-0:2. 100% | 27.2 MiB/s | 361.7 KiB | 00m00s [ 59/184] Installing dwz-0:0.16-3.fc44. 100% | 22.0 MiB/s | 292.3 KiB | 00m00s [ 60/184] Installing mpfr-0:4.2.2-3.fc4 100% | 276.9 MiB/s | 850.8 KiB | 00m00s [ 61/184] Installing gawk-0:5.3.2-3.fc4 100% | 101.9 MiB/s | 1.8 MiB | 00m00s [ 62/184] Installing libksba-0:1.6.7-5. 100% | 203.6 MiB/s | 416.9 KiB | 00m00s [ 63/184] Installing unzip-0:6.0-69.fc4 100% | 33.8 MiB/s | 449.3 KiB | 00m00s [ 64/184] Installing file-libs-0:5.46-9 100% | 624.3 MiB/s | 11.9 MiB | 00m00s [ 65/184] Installing file-0:5.46-9.fc44 100% | 7.6 MiB/s | 101.6 KiB | 00m00s [ 66/184] Installing diffutils-0:3.12-5 100% | 92.5 MiB/s | 1.6 MiB | 00m00s [ 67/184] Installing libeconf-0:0.7.9-3 100% | 64.9 MiB/s | 66.4 KiB | 00m00s [ 68/184] Installing libcap-ng-0:0.9-7. 100% | 68.9 MiB/s | 70.5 KiB | 00m00s [ 69/184] Installing audit-libs-0:4.1.3 100% | 191.9 MiB/s | 393.1 KiB | 00m00s [ 70/184] Installing pam-libs-0:1.7.2-1 100% | 129.8 MiB/s | 132.9 KiB | 00m00s [ 71/184] Installing libcap-0:2.77-2.fc 100% | 16.3 MiB/s | 217.2 KiB | 00m00s [ 72/184] Installing libsemanage-0:3.10 100% | 153.4 MiB/s | 314.1 KiB | 00m00s [ 73/184] Installing libsmartcols-0:2.4 100% | 184.9 MiB/s | 189.3 KiB | 00m00s [ 74/184] Installing lua-libs-0:5.4.8-5 100% | 276.6 MiB/s | 283.2 KiB | 00m00s [ 75/184] Installing json-c-0:0.18-8.fc 100% | 81.9 MiB/s | 83.9 KiB | 00m00s [ 76/184] Installing libffi-0:3.5.2-2.f 100% | 87.0 MiB/s | 89.1 KiB | 00m00s [ 77/184] Installing p11-kit-0:0.25.8-2 100% | 115.8 MiB/s | 2.3 MiB | 00m00s [ 78/184] Installing alternatives-0:1.3 100% | 5.2 MiB/s | 63.6 KiB | 00m00s [ 79/184] Installing p11-kit-trust-0:0. 100% | 22.5 MiB/s | 460.0 KiB | 00m00s [ 80/184] Installing ngtcp2-0:1.19.0-2. 100% | 162.0 MiB/s | 331.7 KiB | 00m00s [ 81/184] Installing openssl-libs-1:3.5 100% | 382.9 MiB/s | 9.2 MiB | 00m00s [ 82/184] Installing coreutils-0:9.9-4. 100% | 166.2 MiB/s | 5.5 MiB | 00m00s [ 83/184] Installing ca-certificates-0: 100% | 2.1 MiB/s | 2.5 MiB | 00m01s [ 84/184] Installing gzip-0:1.14-2.fc44 100% | 26.5 MiB/s | 407.1 KiB | 00m00s [ 85/184] Installing rpm-sequoia-0:1.10 100% | 352.3 MiB/s | 2.5 MiB | 00m00s [ 86/184] Installing libfsverity-0:1.6- 100% | 0.0 B/s | 29.4 KiB | 00m00s [ 87/184] Installing libevent-0:2.1.12- 100% | 319.8 MiB/s | 982.4 KiB | 00m00s [ 88/184] Installing ngtcp2-crypto-ossl 100% | 51.2 MiB/s | 52.5 KiB | 00m00s [ 89/184] Installing util-linux-core-0: 100% | 82.4 MiB/s | 1.5 MiB | 00m00s [ 90/184] Installing zip-0:3.0-45.fc44. 100% | 49.0 MiB/s | 701.9 KiB | 00m00s [ 91/184] Installing gnupg2-keyboxd-0:2 100% | 33.0 MiB/s | 202.5 KiB | 00m00s [ 92/184] Installing libpsl-0:0.21.5-7. 100% | 75.6 MiB/s | 77.4 KiB | 00m00s [ 93/184] Installing tar-2:1.35-8.fc44. 100% | 141.8 MiB/s | 3.0 MiB | 00m00s [ 94/184] Installing linkdupes-0:0.7.2- 100% | 57.8 MiB/s | 828.0 KiB | 00m00s [ 95/184] Installing libselinux-utils-0 100% | 22.3 MiB/s | 320.1 KiB | 00m00s [ 96/184] Installing liblastlog2-0:2.41 100% | 7.8 MiB/s | 39.8 KiB | 00m00s [ 97/184] Installing systemd-standalone 100% | 21.1 MiB/s | 302.2 KiB | 00m00s [ 98/184] Installing rpm-libs-0:6.0.1-2 100% | 313.4 MiB/s | 962.8 KiB | 00m00s [ 99/184] Installing libusb1-0:1.0.29-5 100% | 24.7 MiB/s | 176.9 KiB | 00m00s >>> Running sysusers scriptlet: tpm2-tss-0:4.1.3-9.fc44.x86_64 >>> Finished sysusers scriptlet: tpm2-tss-0:4.1.3-9.fc44.x86_64 >>> Scriptlet output: >>> Creating group 'tss' with GID 59. >>> Creating user 'tss' (Account used for TPM access) with UID 59 and GID 59. >>> [100/184] Installing tpm2-tss-0:4.1.3-9 100% | 272.2 MiB/s | 1.6 MiB | 00m00s [101/184] Installing ima-evm-utils-libs 100% | 60.4 MiB/s | 61.9 KiB | 00m00s [102/184] Installing gnupg2-gpg-agent-0 100% | 35.3 MiB/s | 686.5 KiB | 00m00s [103/184] Installing libfdisk-0:2.41.3- 100% | 126.8 MiB/s | 389.4 KiB | 00m00s [104/184] Installing util-linux-0:2.41. 100% | 105.4 MiB/s | 3.6 MiB | 00m00s [105/184] Installing policycoreutils-0: 100% | 37.1 MiB/s | 912.6 KiB | 00m00s [106/184] Installing selinux-policy-0:4 100% | 1.9 MiB/s | 33.6 KiB | 00m00s [107/184] Installing selinux-policy-tar 100% | 200.0 MiB/s | 14.8 MiB | 00m00s [108/184] Installing zstd-0:1.5.7-5.fc4 100% | 32.9 MiB/s | 506.0 KiB | 00m00s [109/184] Installing libxml2-0:2.12.10- 100% | 104.2 MiB/s | 1.8 MiB | 00m00s [110/184] Installing nettle-0:3.10.1-3. 100% | 259.6 MiB/s | 797.4 KiB | 00m00s [111/184] Installing gnutls-0:3.8.11-10 100% | 373.1 MiB/s | 3.7 MiB | 00m00s [112/184] Installing bzip2-0:1.0.8-23.f 100% | 8.1 MiB/s | 99.5 KiB | 00m00s [113/184] Installing add-determinism-0: 100% | 133.5 MiB/s | 2.3 MiB | 00m00s [114/184] Installing build-reproducibil 100% | 0.0 B/s | 1.5 KiB | 00m00s [115/184] Installing cpio-0:2.15-9.fc44 100% | 73.6 MiB/s | 1.1 MiB | 00m00s [116/184] Installing ed-0:1.22.4-2.fc44 100% | 12.3 MiB/s | 151.4 KiB | 00m00s [117/184] Installing patch-0:2.8-4.fc44 100% | 18.6 MiB/s | 228.1 KiB | 00m00s [118/184] Installing lz4-libs-0:1.10.0- 100% | 154.6 MiB/s | 158.4 KiB | 00m00s [119/184] Installing libarchive-0:3.8.4 100% | 323.3 MiB/s | 993.1 KiB | 00m00s [120/184] Installing libgomp-0:16.0.1-0 100% | 279.9 MiB/s | 573.2 KiB | 00m00s [121/184] Installing libtool-ltdl-0:2.5 100% | 69.5 MiB/s | 71.1 KiB | 00m00s [122/184] Installing gdbm-libs-1:1.23-1 100% | 128.3 MiB/s | 131.3 KiB | 00m00s [123/184] Installing cyrus-sasl-lib-0:2 100% | 128.4 MiB/s | 2.3 MiB | 00m00s [124/184] Installing openldap-0:2.6.10- 100% | 218.5 MiB/s | 671.3 KiB | 00m00s [125/184] Installing gnupg2-dirmngr-0:2 100% | 32.7 MiB/s | 636.6 KiB | 00m00s [126/184] Installing gnupg2-0:2.4.9-5.f 100% | 224.4 MiB/s | 6.5 MiB | 00m00s [127/184] Installing rpm-sign-libs-0:6. 100% | 39.5 MiB/s | 40.5 KiB | 00m00s [128/184] Installing gpgverify-0:2.2-4. 100% | 0.0 B/s | 9.4 KiB | 00m00s [129/184] Installing jansson-0:2.14-4.f 100% | 88.2 MiB/s | 90.3 KiB | 00m00s [130/184] Installing libpkgconf-0:2.3.0 100% | 77.3 MiB/s | 79.2 KiB | 00m00s [131/184] Installing pkgconf-0:2.3.0-4. 100% | 7.4 MiB/s | 90.8 KiB | 00m00s [132/184] Installing pkgconf-pkg-config 100% | 147.8 KiB/s | 1.8 KiB | 00m00s [133/184] Installing xxhash-libs-0:0.8. 100% | 93.2 MiB/s | 95.4 KiB | 00m00s [134/184] Installing libbrotli-0:1.2.0- 100% | 282.3 MiB/s | 867.3 KiB | 00m00s [135/184] Installing libnghttp2-0:1.68. 100% | 163.3 MiB/s | 167.3 KiB | 00m00s [136/184] Installing libnghttp3-0:1.15. 100% | 156.8 MiB/s | 160.6 KiB | 00m00s [137/184] Installing keyutils-libs-0:1. 100% | 54.3 MiB/s | 55.6 KiB | 00m00s [138/184] Installing libcom_err-0:1.47. 100% | 62.6 MiB/s | 64.1 KiB | 00m00s [139/184] Installing libverto-0:0.3.2-1 100% | 26.4 MiB/s | 27.1 KiB | 00m00s [140/184] Installing krb5-libs-0:1.21.3 100% | 337.9 MiB/s | 2.4 MiB | 00m00s [141/184] Installing libssh-0:0.11.3-3. 100% | 291.6 MiB/s | 597.2 KiB | 00m00s [142/184] Installing libcurl-0:8.18.0-3 100% | 331.4 MiB/s | 1.0 MiB | 00m00s [143/184] Installing curl-0:8.18.0-3.fc 100% | 23.6 MiB/s | 482.6 KiB | 00m00s [144/184] Installing rpm-0:6.0.1-2.fc44 100% | 85.0 MiB/s | 2.6 MiB | 00m00s [145/184] Installing cmake-srpm-macros- 100% | 0.0 B/s | 804.0 B | 00m00s [146/184] Installing efi-srpm-macros-0: 100% | 0.0 B/s | 41.2 KiB | 00m00s [147/184] Installing java-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [148/184] Installing lua-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [149/184] Installing tree-sitter-srpm-m 100% | 0.0 B/s | 9.3 KiB | 00m00s [150/184] Installing zig-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [151/184] Installing filesystem-srpm-ma 100% | 0.0 B/s | 38.9 KiB | 00m00s [152/184] Installing elfutils-default-y 100% | 510.7 KiB/s | 2.0 KiB | 00m00s [153/184] Installing elfutils-libs-0:0. 100% | 233.4 MiB/s | 717.0 KiB | 00m00s [154/184] Installing elfutils-debuginfo 100% | 6.5 MiB/s | 86.0 KiB | 00m00s [155/184] Installing elfutils-0:0.194-3 100% | 155.7 MiB/s | 3.0 MiB | 00m00s [156/184] Installing binutils-0:2.45.50 100% | 347.9 MiB/s | 27.5 MiB | 00m00s [157/184] Installing gdb-minimal-0:17.1 100% | 304.9 MiB/s | 14.3 MiB | 00m00s [158/184] Installing debugedit-0:5.2-6. 100% | 16.7 MiB/s | 221.6 KiB | 00m00s [159/184] Installing rpm-build-libs-0:6 100% | 270.6 MiB/s | 277.1 KiB | 00m00s [160/184] Installing rust-srpm-macros-0 100% | 0.0 B/s | 6.4 KiB | 00m00s [161/184] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 740.0 B | 00m00s [162/184] Installing qt5-srpm-macros-0: 100% | 0.0 B/s | 776.0 B | 00m00s [163/184] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [164/184] Installing package-notes-srpm 100% | 0.0 B/s | 2.0 KiB | 00m00s [165/184] Installing openblas-srpm-macr 100% | 0.0 B/s | 392.0 B | 00m00s [166/184] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.1 KiB | 00m00s [167/184] Installing kernel-srpm-macros 100% | 0.0 B/s | 2.3 KiB | 00m00s [168/184] Installing gnat-srpm-macros-0 100% | 0.0 B/s | 1.3 KiB | 00m00s [169/184] Installing ghc-srpm-macros-0: 100% | 0.0 B/s | 1.0 KiB | 00m00s [170/184] Installing gap-srpm-macros-0: 100% | 0.0 B/s | 2.7 KiB | 00m00s [171/184] Installing fpc-srpm-macros-0: 100% | 0.0 B/s | 420.0 B | 00m00s [172/184] Installing ansible-srpm-macro 100% | 0.0 B/s | 36.2 KiB | 00m00s [173/184] Installing rpm-build-0:6.0.1- 100% | 21.2 MiB/s | 303.7 KiB | 00m00s [174/184] Installing pyproject-srpm-mac 100% | 0.0 B/s | 2.5 KiB | 00m00s [175/184] Installing redhat-rpm-config- 100% | 30.9 MiB/s | 189.9 KiB | 00m00s [176/184] Installing forge-srpm-macros- 100% | 0.0 B/s | 40.3 KiB | 00m00s [177/184] Installing fonts-srpm-macros- 100% | 0.0 B/s | 57.0 KiB | 00m00s [178/184] Installing go-srpm-macros-0:3 100% | 0.0 B/s | 63.0 KiB | 00m00s [179/184] Installing R-srpm-macros-0:1. 100% | 0.0 B/s | 4.2 KiB | 00m00s [180/184] Installing python-srpm-macros 100% | 0.0 B/s | 52.9 KiB | 00m00s [181/184] Installing rpm-plugin-selinux 100% | 0.0 B/s | 12.9 KiB | 00m00s [182/184] Installing which-0:2.23-4.fc4 100% | 6.0 MiB/s | 85.6 KiB | 00m00s [183/184] Installing shadow-utils-2:4.1 100% | 149.0 MiB/s | 4.0 MiB | 00m00s [184/184] Installing info-0:7.2-7.fc44. 100% | 53.0 KiB/s | 358.3 KiB | 00m07s Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: R-srpm-macros-1.3.4-3.fc44.noarch add-determinism-0.7.2-3.fc44.x86_64 alternatives-1.33-5.fc44.x86_64 ansible-srpm-macros-1-20.1.fc44.noarch audit-libs-4.1.3-1.fc44.x86_64 bash-5.3.9-3.fc44.x86_64 binutils-2.45.50-19.fc44.x86_64 build-reproducibility-srpm-macros-0.7.2-3.fc44.noarch bzip2-1.0.8-23.fc44.x86_64 bzip2-libs-1.0.8-23.fc44.x86_64 ca-certificates-2025.2.80_v9.0.304-5.fc44.noarch cmake-srpm-macros-3.31.10-5.fc44.noarch coreutils-9.9-4.fc44.x86_64 coreutils-common-9.9-4.fc44.x86_64 cpio-2.15-9.fc44.x86_64 crypto-policies-20251128-3.git19878fe.fc44.noarch curl-8.18.0-3.fc44.x86_64 cyrus-sasl-lib-2.1.28-35.fc44.x86_64 debugedit-5.2-6.fc44.x86_64 diffutils-3.12-5.fc44.x86_64 dwz-0.16-3.fc44.x86_64 ed-1.22.4-2.fc44.x86_64 efi-srpm-macros-6-6.fc44.noarch elfutils-0.194-3.fc44.x86_64 elfutils-debuginfod-client-0.194-3.fc44.x86_64 elfutils-default-yama-scope-0.194-3.fc44.noarch elfutils-libelf-0.194-3.fc44.x86_64 elfutils-libs-0.194-3.fc44.x86_64 fedora-gpg-keys-44-0.1.noarch fedora-release-44-0.10.noarch fedora-release-common-44-0.10.noarch fedora-release-identity-basic-44-0.10.noarch fedora-repos-44-0.1.noarch fedora-repos-rawhide-44-0.1.noarch file-5.46-9.fc44.x86_64 file-libs-5.46-9.fc44.x86_64 filesystem-3.18-52.fc44.x86_64 filesystem-srpm-macros-3.18-52.fc44.noarch findutils-4.10.0-7.fc44.x86_64 fonts-srpm-macros-5.0.0-2.fc44.noarch forge-srpm-macros-0.4.0-4.fc44.noarch fpc-srpm-macros-1.3-16.fc44.noarch gap-srpm-macros-2-2.fc44.noarch gawk-5.3.2-3.fc44.x86_64 gdb-minimal-17.1-2.fc44.x86_64 gdbm-libs-1.23-11.fc44.x86_64 ghc-srpm-macros-1.10-1.fc44.noarch glibc-2.43-1.fc44.x86_64 glibc-common-2.43-1.fc44.x86_64 glibc-gconv-extra-2.43-1.fc44.x86_64 glibc-minimal-langpack-2.43-1.fc44.x86_64 gmp-6.3.0-5.fc44.x86_64 gnat-srpm-macros-7-2.fc44.noarch gnulib-l10n-20241231-2.fc44.noarch gnupg2-2.4.9-5.fc44.x86_64 gnupg2-dirmngr-2.4.9-5.fc44.x86_64 gnupg2-gpg-agent-2.4.9-5.fc44.x86_64 gnupg2-gpgconf-2.4.9-5.fc44.x86_64 gnupg2-keyboxd-2.4.9-5.fc44.x86_64 gnupg2-verify-2.4.9-5.fc44.x86_64 gnutls-3.8.11-10.fc44.x86_64 go-srpm-macros-3.8.0-2.fc44.noarch gpg-pubkey-36f612dcf27f7d1a48a835e4dbfcf71c6d9f90a6-6786af3b gpg-pubkey-4f50a6114cd5c6976a7f1179655a4b02f577861e-6888bc98 gpg-pubkey-c6e7f081cf80e13146676e88829b606631645531-66b6dccf gpgverify-2.2-4.fc44.noarch grep-3.12-3.fc44.x86_64 gzip-1.14-2.fc44.x86_64 ima-evm-utils-libs-1.6.2-8.fc44.x86_64 info-7.2-7.fc44.x86_64 jansson-2.14-4.fc44.x86_64 java-srpm-macros-1-8.fc44.noarch json-c-0.18-8.fc44.x86_64 kernel-srpm-macros-1.0-28.fc44.noarch keyutils-libs-1.6.3-7.fc44.x86_64 krb5-libs-1.21.3-12.fc44.x86_64 libacl-2.3.2-6.fc44.x86_64 libarchive-3.8.4-2.fc44.x86_64 libassuan-2.5.7-5.fc44.x86_64 libattr-2.5.2-8.fc44.x86_64 libblkid-2.41.3-12.fc44.x86_64 libbrotli-1.2.0-3.fc44.x86_64 libcap-2.77-2.fc44.x86_64 libcap-ng-0.9-7.fc44.x86_64 libcom_err-1.47.3-4.fc44.x86_64 libcurl-8.18.0-3.fc44.x86_64 libeconf-0.7.9-3.fc44.x86_64 libevent-2.1.12-17.fc44.x86_64 libfdisk-2.41.3-12.fc44.x86_64 libffi-3.5.2-2.fc44.x86_64 libfsverity-1.6-4.fc44.x86_64 libgcc-16.0.1-0.5.fc44.x86_64 libgcrypt-1.11.2-1.fc44.x86_64 libgomp-16.0.1-0.5.fc44.x86_64 libgpg-error-1.58-2.fc44.x86_64 libidn2-2.3.8-3.fc44.x86_64 libksba-1.6.7-5.fc44.x86_64 liblastlog2-2.41.3-12.fc44.x86_64 libmount-2.41.3-12.fc44.x86_64 libnghttp2-1.68.0-3.fc44.x86_64 libnghttp3-1.15.0-1.fc44.x86_64 libpkgconf-2.3.0-4.fc44.x86_64 libpsl-0.21.5-7.fc44.x86_64 libselinux-3.10-1.fc44.x86_64 libselinux-utils-3.10-1.fc44.x86_64 libsemanage-3.10-1.fc44.x86_64 libsepol-3.10-1.fc44.x86_64 libsmartcols-2.41.3-12.fc44.x86_64 libssh-0.11.3-3.fc44.x86_64 libssh-config-0.11.3-3.fc44.noarch libstdc++-16.0.1-0.5.fc44.x86_64 libtasn1-4.20.0-3.fc44.x86_64 libtool-ltdl-2.5.4-10.fc44.x86_64 libunistring-1.1-11.fc44.x86_64 libusb1-1.0.29-5.fc44.x86_64 libuuid-2.41.3-12.fc44.x86_64 libverto-0.3.2-12.fc44.x86_64 libxcrypt-4.5.2-3.fc44.x86_64 libxml2-2.12.10-6.fc44.x86_64 libzstd-1.5.7-5.fc44.x86_64 linkdupes-0.7.2-3.fc44.x86_64 lua-libs-5.4.8-5.fc44.x86_64 lua-srpm-macros-1-17.fc44.noarch lz4-libs-1.10.0-4.fc44.x86_64 mpfr-4.2.2-3.fc44.x86_64 ncurses-base-6.6-1.fc44.noarch ncurses-libs-6.6-1.fc44.x86_64 nettle-3.10.1-3.fc44.x86_64 ngtcp2-1.19.0-2.fc44.x86_64 ngtcp2-crypto-ossl-1.19.0-2.fc44.x86_64 npth-1.8-4.fc44.x86_64 ocaml-srpm-macros-11-3.fc44.noarch openblas-srpm-macros-2-21.fc44.noarch openldap-2.6.10-7.fc44.x86_64 openssl-libs-3.5.5-1.fc44.x86_64 p11-kit-0.25.8-2.fc44.x86_64 p11-kit-trust-0.25.8-2.fc44.x86_64 package-notes-srpm-macros-0.5-15.fc44.noarch pam-libs-1.7.2-1.fc44.x86_64 patch-2.8-4.fc44.x86_64 pcre2-10.47-1.fc44.1.x86_64 pcre2-syntax-10.47-1.fc44.1.noarch perl-srpm-macros-1-61.fc44.noarch pkgconf-2.3.0-4.fc44.x86_64 pkgconf-m4-2.3.0-4.fc44.noarch pkgconf-pkg-config-2.3.0-4.fc44.x86_64 policycoreutils-3.10-1.fc44.x86_64 popt-1.19-10.fc44.x86_64 publicsuffix-list-dafsa-20260116-1.fc44.noarch pyproject-srpm-macros-1.18.6-2.fc44.noarch python-srpm-macros-3.14-10.fc44.noarch qt5-srpm-macros-5.15.18-2.fc44.noarch qt6-srpm-macros-6.10.1-2.fc44.noarch readline-8.3-4.fc44.x86_64 redhat-rpm-config-343-19.fc44.noarch rpm-6.0.1-2.fc44.x86_64 rpm-build-6.0.1-2.fc44.x86_64 rpm-build-libs-6.0.1-2.fc44.x86_64 rpm-libs-6.0.1-2.fc44.x86_64 rpm-plugin-selinux-6.0.1-2.fc44.x86_64 rpm-sequoia-1.10.0-2.fc44.x86_64 rpm-sign-libs-6.0.1-2.fc44.x86_64 rust-srpm-macros-28.4-3.fc44.noarch sed-4.9-7.fc44.x86_64 selinux-policy-42.22-1.fc44.noarch selinux-policy-targeted-42.22-1.fc44.noarch setup-2.15.0-28.fc44.noarch shadow-utils-4.19.0-6.fc44.x86_64 sqlite-libs-3.51.2-1.fc44.x86_64 systemd-libs-259-19.fc44.x86_64 systemd-standalone-sysusers-259-19.fc44.x86_64 tar-1.35-8.fc44.x86_64 tpm2-tss-4.1.3-9.fc44.x86_64 tree-sitter-srpm-macros-0.4.2-2.fc44.noarch unzip-6.0-69.fc44.x86_64 util-linux-2.41.3-12.fc44.x86_64 util-linux-core-2.41.3-12.fc44.x86_64 which-2.23-4.fc44.x86_64 xxhash-libs-0.8.3-4.fc44.x86_64 xz-5.8.2-2.fc44.x86_64 xz-libs-5.8.2-2.fc44.x86_64 zig-srpm-macros-1-8.fc44.noarch zip-3.0-45.fc44.x86_64 zlib-ng-compat-2.3.2-3.fc44.x86_64 zstd-1.5.7-5.fc44.x86_64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.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-1770295020.048645/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-31vejlds/python-xarray/python-xarray.spec) Config(child) 0 minutes 17 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-xarray-2025.12.0-2.fc44.src.rpm) Config(fedora-rawhide-x86_64) Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-bootstrap-1770295020.048645/root. INFO: reusing tmpfs at /var/lib/mock/fedora-rawhide-x86_64-bootstrap-1770295020.048645/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1770295020.048645/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 downloaded with a bootstrap image: rpm-6.0.1-2.fc44.x86_64 rpm-sequoia-1.10.0-2.fc44.x86_64 dnf5-5.3.0.0-7.fc44.x86_64 dnf5-plugins-5.3.0.0-7.fc44.x86_64 Finish: chroot init Start: build phase for python-xarray-2025.12.0-2.fc44.src.rpm Start: build setup for python-xarray-2025.12.0-2.fc44.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.src.rpm Updating and loading repositories: Copr repository 100% | 7.0 KiB/s | 1.5 KiB | 00m00s fedora 100% | 94.7 KiB/s | 26.4 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: python3-Bottleneck x86_64 0:1.6.0-2.fc44 fedora 573.3 KiB python3-dask+array noarch 0:2025.12.0-3.fc44 copr_base 0.0 B python3-dask+dataframe noarch 0:2025.12.0-3.fc44 copr_base 0.0 B python3-devel x86_64 0:3.14.2-3.fc44 fedora 1.9 MiB python3-pint noarch 0:0.25.2-2.fc44 fedora 3.4 MiB python3-pytest noarch 0:8.4.2-2.fc44 fedora 22.5 MiB python3-pytest-asyncio noarch 0:1.1.0-3.fc44 fedora 131.1 KiB python3-pytest-timeout noarch 0:2.4.0-6.fc44 fedora 82.1 KiB python3-pytest-xdist noarch 0:3.7.0-6.fc44 fedora 468.8 KiB python3-rasterio x86_64 0:1.5.0-3.fc44 fedora 5.4 MiB python3-seaborn noarch 0:0.13.2-15.fc44 fedora 2.3 MiB Installing dependencies: abattis-cantarell-vf-fonts noarch 0:0.301-17.fc44 fedora 192.7 KiB abseil-cpp x86_64 0:20260107.0-1.fc44 fedora 2.6 MiB armadillo x86_64 0:12.8.1-9.fc44 fedora 81.9 KiB arpack x86_64 0:3.9.1-9.fc44 fedora 629.6 KiB blosc x86_64 0:1.21.6-10.fc44 fedora 126.1 KiB boost-container x86_64 0:1.90.0-6.fc44 fedora 69.3 KiB boost-program-options x86_64 0:1.90.0-6.fc44 fedora 284.6 KiB c-ares x86_64 0:1.34.6-3.fc44 fedora 281.5 KiB cairo x86_64 0:1.18.4-6.fc44 fedora 1.8 MiB cfitsio x86_64 0:4.6.3-2.fc44 fedora 1.9 MiB default-fonts-core-sans noarch 0:4.2-6.fc44 fedora 11.9 KiB dejavu-sans-fonts noarch 0:2.37-29.fc44 fedora 5.5 MiB expat x86_64 0:2.7.3-2.fc44 fedora 316.8 KiB flexiblas x86_64 0:3.5.0-2.fc44 fedora 38.0 KiB flexiblas-netlib x86_64 0:3.5.0-2.fc44 fedora 16.3 MiB flexiblas-netlib64 x86_64 0:3.5.0-2.fc44 fedora 16.5 MiB flexiblas-openblas-openmp x86_64 0:3.5.0-2.fc44 fedora 39.1 KiB flexiblas-openblas-openmp64 x86_64 0:3.5.0-2.fc44 fedora 39.1 KiB fontconfig x86_64 0:2.17.0-4.fc44 fedora 776.4 KiB fonts-filesystem noarch 1:5.0.0-2.fc44 fedora 0.0 B freetype x86_64 0:2.14.1-2.fc44 fedora 922.2 KiB freexl x86_64 0:2.0.0-20.fc44 fedora 93.2 KiB fribidi x86_64 0:1.0.16-4.fc44 fedora 190.0 KiB gdal-libs x86_64 0:3.12.1-8.fc44 fedora 34.5 MiB geos x86_64 0:3.14.1-2.fc44 fedora 4.3 MiB giflib x86_64 0:5.2.2-9.fc44 fedora 116.0 KiB glib2 x86_64 0:2.87.0-4.fc44 fedora 15.0 MiB google-noto-fonts-common noarch 0:20251201-2.fc44 fedora 17.7 KiB google-noto-sans-vf-fonts noarch 0:20251201-2.fc44 fedora 1.4 MiB gpgme x86_64 0:2.0.1-3.fc44 fedora 617.8 KiB gpgmepp x86_64 0:2.0.1-3.fc44 fedora 441.6 KiB graphite2 x86_64 0:1.3.14-20.fc44 fedora 191.5 KiB grpc x86_64 0:1.48.4-57.fc44 fedora 10.8 MiB grpc-cpp x86_64 0:1.48.4-57.fc44 fedora 3.1 MiB grpc-data noarch 0:1.48.4-57.fc44 fedora 29.6 KiB harfbuzz x86_64 0:12.3.2-1.fc44 fedora 2.7 MiB hdf-libs x86_64 0:4.3.0-5.fc44 fedora 706.9 KiB hdf5 x86_64 0:1.14.6-7.fc44 fedora 6.5 MiB imath x86_64 0:3.1.12-6.fc44 fedora 379.6 KiB jbigkit-libs x86_64 0:2.1-33.fc44 fedora 117.2 KiB lcms2 x86_64 0:2.16-7.fc44 fedora 445.7 KiB libX11 x86_64 0:1.8.12-3.fc44 fedora 1.3 MiB libX11-common noarch 0:1.8.12-3.fc44 fedora 1.1 MiB libXau x86_64 0:1.0.12-4.fc44 fedora 72.8 KiB libXext x86_64 0:1.3.6-5.fc44 fedora 89.8 KiB libXrender x86_64 0:0.9.12-4.fc44 fedora 49.9 KiB libaec x86_64 0:1.1.5-1.fc44 fedora 94.3 KiB libarrow x86_64 0:23.0.0-2.fc44 fedora 13.8 MiB libarrow-acero-libs x86_64 0:23.0.0-2.fc44 fedora 1.4 MiB libarrow-compute-libs x86_64 0:23.0.0-2.fc44 fedora 14.0 MiB libarrow-dataset-libs x86_64 0:23.0.0-2.fc44 fedora 1.5 MiB libarrow-doc noarch 0:23.0.0-2.fc44 fedora 119.1 KiB libarrow-flight-libs x86_64 0:23.0.0-2.fc44 fedora 1.4 MiB libarrow-glib-libs x86_64 0:23.0.0-2.fc44 fedora 1.7 MiB libdeflate x86_64 0:1.25-3.fc44 fedora 119.0 KiB libgeotiff x86_64 0:1.7.4-5.fc44 fedora 289.5 KiB libgfortran x86_64 0:16.0.1-0.5.fc44 fedora 3.4 MiB libgta x86_64 0:1.2.1-17.fc44 fedora 70.0 KiB libicu x86_64 0:77.1-2.fc44 fedora 36.6 MiB libimagequant x86_64 0:4.1.0-2.fc44 fedora 707.6 KiB libjpeg-turbo x86_64 0:3.1.2-2.fc44 fedora 816.8 KiB libkml x86_64 0:1.3.0-56.fc44 fedora 1.2 MiB liblerc x86_64 0:4.0.0-10.fc44 fedora 647.9 KiB liborc2 x86_64 0:2.2.2-2.fc44 fedora 1.9 MiB libpng x86_64 2:1.6.53-2.fc44 fedora 249.5 KiB libpq x86_64 0:18.0-4.fc44 fedora 1.0 MiB libqhull_r x86_64 1:8.0.2-8.fc44 fedora 491.2 KiB libquadmath x86_64 0:16.0.1-0.5.fc44 fedora 325.9 KiB libraqm x86_64 0:0.10.1-4.fc44 fedora 32.5 KiB librttopo x86_64 0:1.1.0-19.fc44 fedora 520.5 KiB libspatialite x86_64 0:5.1.0-12.fc44 fedora 15.0 MiB libtiff x86_64 0:4.7.1-2.fc44 fedora 640.2 KiB libtirpc x86_64 0:1.3.7-2.fc44 fedora 204.3 KiB libwebp x86_64 0:1.6.0-3.fc44 fedora 968.0 KiB libxcb x86_64 0:1.17.0-7.fc44 fedora 1.1 MiB libyaml x86_64 0:0.2.5-18.fc44 fedora 138.5 KiB libzip x86_64 0:1.11.4-3.fc44 fedora 143.8 KiB lzo x86_64 0:2.10-16.fc44 fedora 174.8 KiB mariadb-connector-c x86_64 0:3.4.8-3.fc44 fedora 523.0 KiB mariadb-connector-c-config noarch 0:3.4.8-3.fc44 fedora 497.0 B minizip-ng-compat x86_64 0:4.1.0-1.fc44 fedora 166.4 KiB mpdecimal x86_64 0:4.0.1-3.fc44 fedora 217.1 KiB muParser x86_64 0:2.3.5-5.fc44 fedora 563.2 KiB netcdf x86_64 0:4.9.3-2.fc44 fedora 2.5 MiB nspr x86_64 0:4.38.2-4.fc44 fedora 327.1 KiB nss x86_64 0:3.120.0-1.fc44 fedora 2.0 MiB nss-softokn x86_64 0:3.120.0-1.fc44 fedora 2.0 MiB nss-softokn-freebl x86_64 0:3.120.0-1.fc44 fedora 998.6 KiB nss-sysinit x86_64 0:3.120.0-1.fc44 fedora 17.9 KiB nss-util x86_64 0:3.120.0-1.fc44 fedora 212.7 KiB openblas x86_64 0:0.3.29-2.fc43 fedora 111.7 KiB openblas-openmp x86_64 0:0.3.29-2.fc43 fedora 43.7 MiB openblas-openmp64 x86_64 0:0.3.29-2.fc43 fedora 43.8 MiB openexr-libs x86_64 0:3.2.4-7.fc44 fedora 6.6 MiB openjpeg x86_64 0:2.5.4-3.fc44 fedora 464.2 KiB parquet-libs x86_64 0:23.0.0-2.fc44 fedora 3.8 MiB pixman x86_64 0:0.46.2-3.fc44 fedora 718.2 KiB poppler x86_64 0:26.01.0-2.fc44 fedora 4.0 MiB poppler-data noarch 0:0.4.11-11.fc44 fedora 12.3 MiB proj x86_64 0:9.7.1-3.fc44 fedora 4.7 MiB proj-data noarch 0:9.7.1-3.fc44 fedora 9.5 MiB protobuf x86_64 0:3.19.6-20.fc44 fedora 3.3 MiB protobuf-compiler x86_64 0:3.19.6-20.fc44 fedora 2.5 MiB pyproject-rpm-macros noarch 0:1.18.6-2.fc44 fedora 115.6 KiB python-pip-wheel noarch 0:25.3-2.fc44 fedora 1.2 MiB python-rpm-macros noarch 0:3.14-10.fc44 fedora 27.6 KiB python3 x86_64 0:3.14.2-3.fc44 fedora 28.7 KiB python3-affine noarch 0:2.4.0-14.fc44 fedora 171.0 KiB python3-attrs noarch 0:25.4.0-2.fc44 fedora 436.8 KiB python3-babel noarch 0:2.17.0-8.fc44 fedora 30.3 MiB python3-cairo x86_64 0:1.28.0-5.fc44 fedora 508.8 KiB python3-certifi noarch 0:2025.07.09-4.fc44 fedora 7.4 KiB python3-charset-normalizer noarch 0:3.4.4-2.fc44 fedora 356.2 KiB python3-click noarch 1:8.1.7-12.fc44 fedora 1.2 MiB python3-cligj noarch 0:0.7.2-21.fc44 fedora 34.5 KiB python3-cloudpickle noarch 0:3.1.2-2.fc44 fedora 129.7 KiB python3-contourpy x86_64 0:1.3.3-3.fc44 fedora 856.7 KiB python3-cycler noarch 0:0.11.0-20.fc44 fedora 37.8 KiB python3-dask noarch 0:2025.12.0-3.fc44 copr_base 20.6 MiB python3-dateutil noarch 1:2.9.0.post0-7.fc44 fedora 878.0 KiB python3-docutils noarch 0:0.22.4-2.fc44 fedora 5.5 MiB python3-execnet noarch 0:2.1.2-2.fc44 fedora 970.6 KiB python3-flexcache noarch 0:0.3-11.fc44 fedora 57.0 KiB python3-flexparser noarch 0:0.4-7.fc44 fedora 263.5 KiB python3-fonttools x86_64 0:4.61.1-2.fc44 fedora 19.4 MiB python3-fsspec noarch 0:2026.1.0-2.fc44 fedora 1.9 MiB python3-husl noarch 0:4.0.3-38.fc44 fedora 21.5 KiB python3-idna noarch 0:3.11-2.fc44 fedora 738.4 KiB python3-imagesize noarch 0:1.4.1-15.fc44 fedora 36.0 KiB python3-iniconfig noarch 0:2.3.0-2.fc44 fedora 49.8 KiB python3-jinja2 noarch 0:3.1.6-7.fc44 fedora 3.1 MiB python3-kiwisolver x86_64 0:1.4.9-4.fc44 fedora 157.9 KiB python3-libs x86_64 0:3.14.2-3.fc44 fedora 43.6 MiB python3-locket noarch 0:1.0.0-19.fc44 fedora 20.9 KiB python3-markupsafe x86_64 0:3.0.2-7.fc44 fedora 61.4 KiB python3-matplotlib x86_64 0:3.10.8-2.fc44 fedora 31.8 MiB python3-matplotlib-data-fonts x86_64 0:3.10.8-2.fc44 fedora 7.9 MiB python3-numexpr x86_64 0:2.14.1-1.fc44 fedora 859.7 KiB python3-numpy x86_64 1:2.4.2-1.fc44 fedora 41.3 MiB python3-numpy-f2py x86_64 1:2.4.2-1.fc44 fedora 2.1 MiB python3-numpydoc noarch 0:1.9.0-2.fc44 fedora 682.4 KiB python3-olefile noarch 0:0.47-13.fc44 fedora 346.5 KiB python3-packaging noarch 0:25.0-8.fc44 fedora 607.4 KiB python3-pandas x86_64 0:3.0.0-0.fc44 copr_base 39.5 MiB python3-partd noarch 0:1.4.2-9.fc44 fedora 166.8 KiB python3-pillow x86_64 0:12.1.0-2.fc44 fedora 4.4 MiB python3-platformdirs noarch 0:4.4.0-4.fc44 fedora 182.9 KiB python3-pluggy noarch 0:1.6.0-5.fc44 fedora 211.5 KiB python3-pyarrow x86_64 0:23.0.0-2.fc44 fedora 26.6 MiB python3-pygments noarch 0:2.19.1-9.fc44 fedora 11.3 MiB python3-pyparsing noarch 0:3.1.2-15.fc44 fedora 1.0 MiB python3-pyyaml x86_64 0:6.0.3-3.fc44 fedora 789.4 KiB python3-requests noarch 0:2.32.5-3.fc44 fedora 476.9 KiB python3-roman-numerals-py noarch 0:3.1.0-6.fc44 fedora 40.4 KiB python3-rpm-generators noarch 0:14-14.fc44 fedora 81.7 KiB python3-rpm-macros noarch 0:3.14-10.fc44 fedora 6.5 KiB python3-six noarch 0:1.17.0-8.fc44 fedora 118.0 KiB python3-snowballstemmer noarch 0:3.0.1-11.fc44 fedora 1.8 MiB python3-sphinx noarch 1:8.2.3-19.fc44 fedora 12.3 MiB python3-sphinx-theme-alabaster noarch 0:0.7.16-12.fc44 fedora 42.0 KiB python3-toolz noarch 0:1.0.0-7.fc44 fedora 618.0 KiB python3-typing-extensions noarch 0:4.15.0-3.fc44 fedora 538.4 KiB python3-urllib3 noarch 0:2.6.3-2.fc44 fedora 1.1 MiB re2 x86_64 2:20251105-4.fc44 fedora 606.8 KiB snappy x86_64 0:1.2.2-4.fc44 fedora 79.9 KiB thrift x86_64 0:0.20.0-9.fc44 fedora 5.6 MiB tzdata noarch 0:2025c-2.fc44 fedora 1.2 MiB unixODBC x86_64 0:2.3.14-3.fc44 fedora 1.0 MiB uriparser x86_64 0:1.0.0-2.fc44 fedora 182.6 KiB utf8proc x86_64 0:2.11.3-2.fc44 fedora 373.5 KiB xerces-c x86_64 0:3.3.0-9.fc44 fedora 3.9 MiB xml-common noarch 0:0.6.3-68.fc44 fedora 78.4 KiB Transaction Summary: Installing: 183 packages Total size of inbound packages is 172 MiB. Need to download 75 MiB. After this operation, 748 MiB extra will be used (install 748 MiB, remove 0 B). [ 1/183] python3-Bottleneck-0:1.6.0-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 2/183] python3-pytest-0:8.4.2-2.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 3/183] python3-devel-0:3.14.2-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 4/183] python3-numpy-1:2.4.2-1.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 5/183] python3-iniconfig-0:2.3.0-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 6/183] python3-packaging-0:25.0-8.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/183] python3-pluggy-0:1.6.0-5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/183] python3-pygments-0:2.19.1-9.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/183] python3-pyparsing-0:3.1.2-15. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 10/183] python3-matplotlib-0:3.10.8-2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 11/183] python3-libs-0:3.14.2-3.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 12/183] flexiblas-netlib-0:3.5.0-2.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 13/183] python3-numpy-f2py-1:2.4.2-1. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 14/183] expat-0:2.7.3-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 15/183] giflib-0:5.2.2-9.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 16/183] libjpeg-turbo-0:3.1.2-2.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 17/183] liblerc-0:4.0.0-10.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 18/183] libpng-2:1.6.53-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 19/183] libqhull_r-1:8.0.2-8.fc44.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 20/183] libtiff-0:4.7.1-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 21/183] libwebp-0:1.6.0-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 22/183] openjpeg-0:2.5.4-3.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 23/183] dejavu-sans-fonts-0:2.37-29.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 24/183] freetype-0:2.14.1-2.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 25/183] python3-contourpy-0:1.3.3-3.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 26/183] python3-cycler-0:0.11.0-20.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 27/183] python3-dateutil-1:2.9.0.post 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 28/183] python3-fonttools-0:4.61.1-2. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 29/183] python3-kiwisolver-0:1.4.9-4. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 30/183] python3-matplotlib-data-fonts 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 31/183] python3-sphinx-1:8.2.3-19.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 32/183] mpdecimal-0:4.0.1-3.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 33/183] python-pip-wheel-0:25.3-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 34/183] tzdata-0:2025c-2.fc44.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 35/183] python3-pyyaml-0:6.0.3-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 36/183] flexiblas-0:3.5.0-2.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 37/183] flexiblas-openblas-openmp-0:3 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 38/183] libgfortran-0:16.0.1-0.5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 39/183] libquadmath-0:16.0.1-0.5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 40/183] jbigkit-libs-0:2.1-33.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 41/183] fontconfig-0:2.17.0-4.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 42/183] lcms2-0:2.16-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 43/183] fonts-filesystem-1:5.0.0-2.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 44/183] harfbuzz-0:12.3.2-1.fc44.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 45/183] python3-six-0:1.17.0-8.fc44.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 46/183] python3-babel-0:2.17.0-8.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 47/183] python3-docutils-0:0.22.4-2.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 48/183] python3-imagesize-0:1.4.1-15. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 49/183] python3-jinja2-0:3.1.6-7.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 50/183] python3-requests-0:2.32.5-3.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 51/183] python3-roman-numerals-py-0:3 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 52/183] python3-snowballstemmer-0:3.0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 53/183] python3-sphinx-theme-alabaste 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 54/183] libyaml-0:0.2.5-18.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 55/183] glib2-0:2.87.0-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 56/183] openblas-openmp-0:0.3.29-2.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 57/183] libicu-0:77.1-2.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 58/183] default-fonts-core-sans-0:4.2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 59/183] xml-common-0:0.6.3-68.fc44.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 60/183] graphite2-0:1.3.14-20.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 61/183] python3-markupsafe-0:3.0.2-7. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 62/183] python3-charset-normalizer-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 63/183] python3-idna-0:3.11-2.fc44.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 64/183] python3-urllib3-0:2.6.3-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 65/183] abattis-cantarell-vf-fonts-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 66/183] google-noto-sans-vf-fonts-0:2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 67/183] google-noto-fonts-common-0:20 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 68/183] python3-0:3.14.2-3.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 69/183] python3-pandas-0:3.0.0-0.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 70/183] python3-numexpr-0:2.14.1-1.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 71/183] python3-cairo-0:1.28.0-5.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 72/183] cairo-0:1.18.4-6.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 73/183] libX11-0:1.8.12-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 74/183] libXext-0:1.3.6-5.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 75/183] libXrender-0:0.9.12-4.fc44.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 76/183] libxcb-0:1.17.0-7.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 77/183] lzo-0:2.10-16.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 78/183] pixman-0:0.46.2-3.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 79/183] libX11-common-0:1.8.12-3.fc44 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 80/183] libXau-0:1.0.12-4.fc44.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 81/183] python3-pillow-0:12.1.0-2.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 82/183] libimagequant-0:4.1.0-2.fc44. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 83/183] libraqm-0:0.10.1-4.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 84/183] python3-olefile-0:0.47-13.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 85/183] fribidi-0:1.0.16-4.fc44.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 86/183] openblas-0:0.3.29-2.fc43.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 87/183] pyproject-rpm-macros-0:1.18.6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 88/183] python-rpm-macros-0:3.14-10.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 89/183] python3-rpm-generators-0:14-1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 90/183] python3-rpm-macros-0:3.14-10. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 91/183] python3-pytest-timeout-0:2.4. 100% | 2.1 MiB/s | 30.6 KiB | 00m00s [ 92/183] python3-pytest-asyncio-0:1.1. 100% | 2.9 MiB/s | 41.3 KiB | 00m00s [ 93/183] python3-pint-0:0.25.2-2.fc44. 100% | 38.1 MiB/s | 740.8 KiB | 00m00s [ 94/183] python3-pytest-xdist-0:3.7.0- 100% | 23.0 MiB/s | 117.5 KiB | 00m00s [ 95/183] python3-rasterio-0:1.5.0-3.fc 100% | 136.4 MiB/s | 1.5 MiB | 00m00s [ 96/183] python3-seaborn-0:0.13.2-15.f 100% | 77.4 MiB/s | 634.4 KiB | 00m00s [ 97/183] python3-dask+array-0:2025.12. 100% | 1.4 MiB/s | 11.2 KiB | 00m00s [ 98/183] python3-dask+dataframe-0:2025 100% | 5.5 MiB/s | 11.3 KiB | 00m00s [ 99/183] python3-flexcache-0:0.3-11.fc 100% | 13.3 MiB/s | 27.2 KiB | 00m00s [100/183] python3-flexparser-0:0.4-7.fc 100% | 17.9 MiB/s | 54.9 KiB | 00m00s [101/183] python3-typing-extensions-0:4 100% | 27.4 MiB/s | 112.4 KiB | 00m00s [102/183] python3-execnet-0:2.1.2-2.fc4 100% | 65.4 MiB/s | 267.9 KiB | 00m00s [103/183] python3-platformdirs-0:4.4.0- 100% | 5.4 MiB/s | 49.8 KiB | 00m00s [104/183] python3-affine-0:2.4.0-14.fc4 100% | 12.0 MiB/s | 49.3 KiB | 00m00s [105/183] python3-attrs-0:25.4.0-2.fc44 100% | 22.9 MiB/s | 140.4 KiB | 00m00s [106/183] python3-certifi-0:2025.07.09- 100% | 4.9 MiB/s | 15.1 KiB | 00m00s [107/183] python3-cligj-0:0.7.2-21.fc44 100% | 5.0 MiB/s | 20.5 KiB | 00m00s [108/183] python3-click-1:8.1.7-12.fc44 100% | 35.5 MiB/s | 254.5 KiB | 00m00s [109/183] python3-husl-0:4.0.3-38.fc44. 100% | 3.0 MiB/s | 18.6 KiB | 00m00s [110/183] python3-numpydoc-0:1.9.0-2.fc 100% | 33.5 MiB/s | 171.4 KiB | 00m00s [111/183] python3-dask-0:2025.12.0-3.fc 100% | 236.4 MiB/s | 3.5 MiB | 00m00s [112/183] armadillo-0:12.8.1-9.fc44.x86 100% | 5.0 MiB/s | 30.6 KiB | 00m00s [113/183] blosc-0:1.21.6-10.fc44.x86_64 100% | 11.5 MiB/s | 59.0 KiB | 00m00s [114/183] cfitsio-0:4.6.3-2.fc44.x86_64 100% | 56.1 MiB/s | 631.5 KiB | 00m00s [115/183] python3-pyarrow-0:23.0.0-2.fc 100% | 105.2 MiB/s | 5.0 MiB | 00m00s [116/183] freexl-0:2.0.0-20.fc44.x86_64 100% | 4.2 MiB/s | 47.1 KiB | 00m00s [117/183] gdal-libs-0:3.12.1-8.fc44.x86 100% | 137.8 MiB/s | 11.4 MiB | 00m00s [118/183] geos-0:3.14.1-2.fc44.x86_64 100% | 95.5 MiB/s | 1.3 MiB | 00m00s [119/183] imath-0:3.1.12-6.fc44.x86_64 100% | 19.9 MiB/s | 101.7 KiB | 00m00s [120/183] libaec-0:1.1.5-1.fc44.x86_64 100% | 12.4 MiB/s | 38.1 KiB | 00m00s [121/183] libarrow-compute-libs-0:23.0. 100% | 119.6 MiB/s | 3.0 MiB | 00m00s [122/183] libarrow-0:23.0.0-2.fc44.x86_ 100% | 120.2 MiB/s | 3.7 MiB | 00m00s [123/183] libdeflate-0:1.25-3.fc44.x86_ 100% | 22.5 MiB/s | 69.0 KiB | 00m00s [124/183] libgeotiff-0:1.7.4-5.fc44.x86 100% | 31.9 MiB/s | 98.0 KiB | 00m00s [125/183] libarrow-dataset-libs-0:23.0. 100% | 47.9 MiB/s | 539.2 KiB | 00m00s [126/183] libgta-0:1.2.1-17.fc44.x86_64 100% | 12.0 MiB/s | 36.7 KiB | 00m00s [127/183] libkml-0:1.3.0-56.fc44.x86_64 100% | 87.3 MiB/s | 357.4 KiB | 00m00s [128/183] libpq-0:18.0-4.fc44.x86_64 100% | 90.1 MiB/s | 276.8 KiB | 00m00s [129/183] mariadb-connector-c-0:3.4.8-3 100% | 17.2 MiB/s | 211.8 KiB | 00m00s [130/183] libspatialite-0:5.1.0-12.fc44 100% | 179.0 MiB/s | 3.0 MiB | 00m00s [131/183] muParser-0:2.3.5-5.fc44.x86_6 100% | 59.1 MiB/s | 181.6 KiB | 00m00s [132/183] netcdf-0:4.9.3-2.fc44.x86_64 100% | 94.4 MiB/s | 870.2 KiB | 00m00s [133/183] openexr-libs-0:3.2.4-7.fc44.x 100% | 115.3 MiB/s | 1.2 MiB | 00m00s [134/183] poppler-0:26.01.0-2.fc44.x86_ 100% | 170.8 MiB/s | 1.4 MiB | 00m00s [135/183] proj-0:9.7.1-3.fc44.x86_64 100% | 29.2 MiB/s | 1.7 MiB | 00m00s [136/183] unixODBC-0:2.3.14-3.fc44.x86_ 100% | 68.0 MiB/s | 417.9 KiB | 00m00s [137/183] xerces-c-0:3.3.0-9.fc44.x86_6 100% | 98.8 MiB/s | 1.1 MiB | 00m00s [138/183] python3-cloudpickle-0:3.1.2-2 100% | 15.7 MiB/s | 48.2 KiB | 00m00s [139/183] python3-fsspec-0:2026.1.0-2.f 100% | 92.1 MiB/s | 471.4 KiB | 00m00s [140/183] python3-partd-0:1.4.2-9.fc44. 100% | 30.8 MiB/s | 63.1 KiB | 00m00s [141/183] hdf5-0:1.14.6-7.fc44.x86_64 100% | 10.9 MiB/s | 2.1 MiB | 00m00s [142/183] python3-toolz-0:1.0.0-7.fc44. 100% | 42.5 MiB/s | 173.9 KiB | 00m00s [143/183] libarrow-flight-libs-0:23.0.0 100% | 70.9 MiB/s | 435.7 KiB | 00m00s [144/183] libarrow-acero-libs-0:23.0.0- 100% | 65.6 MiB/s | 537.2 KiB | 00m00s [145/183] arpack-0:3.9.1-9.fc44.x86_64 100% | 50.7 MiB/s | 207.6 KiB | 00m00s [146/183] snappy-0:1.2.2-4.fc44.x86_64 100% | 10.6 MiB/s | 43.2 KiB | 00m00s [147/183] libarrow-doc-0:23.0.0-2.fc44. 100% | 7.2 MiB/s | 29.5 KiB | 00m00s [148/183] minizip-ng-compat-0:4.1.0-1.f 100% | 11.4 MiB/s | 70.0 KiB | 00m00s [149/183] re2-2:20251105-4.fc44.x86_64 100% | 17.5 MiB/s | 250.9 KiB | 00m00s [150/183] utf8proc-0:2.11.3-2.fc44.x86_ 100% | 20.3 MiB/s | 83.1 KiB | 00m00s [151/183] uriparser-0:1.0.0-2.fc44.x86_ 100% | 23.7 MiB/s | 72.7 KiB | 00m00s [152/183] parquet-libs-0:23.0.0-2.fc44. 100% | 8.0 MiB/s | 1.2 MiB | 00m00s [153/183] librttopo-0:1.1.0-19.fc44.x86 100% | 42.0 MiB/s | 215.3 KiB | 00m00s [154/183] mariadb-connector-c-config-0: 100% | 3.0 MiB/s | 9.2 KiB | 00m00s [155/183] libzip-0:1.11.4-3.fc44.x86_64 100% | 18.3 MiB/s | 74.9 KiB | 00m00s [156/183] gpgmepp-0:2.0.1-3.fc44.x86_64 100% | 29.1 MiB/s | 149.2 KiB | 00m00s [157/183] nspr-0:4.38.2-4.fc44.x86_64 100% | 28.1 MiB/s | 143.9 KiB | 00m00s [158/183] liborc2-0:2.2.2-2.fc44.x86_64 100% | 12.0 MiB/s | 590.3 KiB | 00m00s [159/183] nss-0:3.120.0-1.fc44.x86_64 100% | 123.3 MiB/s | 757.8 KiB | 00m00s [160/183] proj-data-0:9.7.1-3.fc44.noar 100% | 122.5 MiB/s | 1.3 MiB | 00m00s [161/183] poppler-data-0:0.4.11-11.fc44 100% | 109.2 MiB/s | 2.0 MiB | 00m00s [162/183] python3-locket-0:1.0.0-19.fc4 100% | 6.0 MiB/s | 18.3 KiB | 00m00s [163/183] abseil-cpp-0:20260107.0-1.fc4 100% | 130.3 MiB/s | 800.4 KiB | 00m00s [164/183] grpc-cpp-0:1.48.4-57.fc44.x86 100% | 73.1 MiB/s | 748.2 KiB | 00m00s [165/183] grpc-0:1.48.4-57.fc44.x86_64 100% | 132.2 MiB/s | 2.6 MiB | 00m00s [166/183] libarrow-glib-libs-0:23.0.0-2 100% | 23.6 MiB/s | 482.6 KiB | 00m00s [167/183] flexiblas-netlib64-0:3.5.0-2. 100% | 155.1 MiB/s | 4.3 MiB | 00m00s [168/183] gpgme-0:2.0.1-3.fc44.x86_64 100% | 56.6 MiB/s | 231.7 KiB | 00m00s [169/183] protobuf-0:3.19.6-20.fc44.x86 100% | 20.8 MiB/s | 1.0 MiB | 00m00s [170/183] nss-softokn-0:3.120.0-1.fc44. 100% | 85.9 MiB/s | 439.8 KiB | 00m00s [171/183] nss-sysinit-0:3.120.0-1.fc44. 100% | 4.8 MiB/s | 19.6 KiB | 00m00s [172/183] nss-util-0:3.120.0-1.fc44.x86 100% | 14.7 MiB/s | 90.6 KiB | 00m00s [173/183] c-ares-0:1.34.6-3.fc44.x86_64 100% | 20.2 MiB/s | 124.0 KiB | 00m00s [174/183] grpc-data-0:1.48.4-57.fc44.no 100% | 4.5 MiB/s | 18.4 KiB | 00m00s [175/183] flexiblas-openblas-openmp64-0 100% | 2.8 MiB/s | 17.1 KiB | 00m00s [176/183] thrift-0:0.20.0-9.fc44.x86_64 100% | 13.7 MiB/s | 1.9 MiB | 00m00s [177/183] openblas-openmp64-0:0.3.29-2. 100% | 193.6 MiB/s | 5.2 MiB | 00m00s [178/183] nss-softokn-freebl-0:3.120.0- 100% | 10.4 MiB/s | 373.9 KiB | 00m00s [179/183] boost-container-0:1.90.0-6.fc 100% | 13.1 MiB/s | 40.1 KiB | 00m00s [180/183] boost-program-options-0:1.90. 100% | 22.3 MiB/s | 114.3 KiB | 00m00s [181/183] hdf-libs-0:4.3.0-5.fc44.x86_6 100% | 74.9 MiB/s | 306.7 KiB | 00m00s [182/183] libtirpc-0:1.3.7-2.fc44.x86_6 100% | 32.3 MiB/s | 99.3 KiB | 00m00s [183/183] protobuf-compiler-0:3.19.6-20 100% | 14.1 MiB/s | 795.7 KiB | 00m00s -------------------------------------------------------------------------------- [183/183] Total 100% | 121.5 MiB/s | 75.1 MiB | 00m01s Running transaction [ 1/185] Verify package files 100% | 292.0 B/s | 183.0 B | 00m01s [ 2/185] Prepare transaction 100% | 1.7 KiB/s | 183.0 B | 00m00s [ 3/185] Installing libarrow-doc-0:23. 100% | 117.1 MiB/s | 119.9 KiB | 00m00s [ 4/185] Installing nspr-0:4.38.2-4.fc 100% | 160.6 MiB/s | 328.9 KiB | 00m00s [ 5/185] Installing libgfortran-0:16.0 100% | 426.3 MiB/s | 3.4 MiB | 00m00s [ 6/185] Installing libjpeg-turbo-0:3. 100% | 399.7 MiB/s | 818.5 KiB | 00m00s [ 7/185] Installing nss-util-0:3.120.0 100% | 208.7 MiB/s | 213.7 KiB | 00m00s [ 8/185] Installing protobuf-0:3.19.6- 100% | 365.0 MiB/s | 3.3 MiB | 00m00s [ 9/185] Installing abseil-cpp-0:20260 100% | 235.5 MiB/s | 2.6 MiB | 00m00s [ 10/185] Installing fonts-filesystem-1 100% | 0.0 B/s | 788.0 B | 00m00s [ 11/185] Installing libpng-2:1.6.53-2. 100% | 244.9 MiB/s | 250.8 KiB | 00m00s [ 12/185] Installing libaec-0:1.1.5-1.f 100% | 94.5 MiB/s | 96.7 KiB | 00m00s [ 13/185] Installing expat-0:2.7.3-2.fc 100% | 22.2 MiB/s | 318.9 KiB | 00m00s [ 14/185] Installing python-rpm-macros- 100% | 27.8 MiB/s | 28.5 KiB | 00m00s [ 15/185] Installing glib2-0:2.87.0-4.f 100% | 289.9 MiB/s | 15.1 MiB | 00m00s [ 16/185] Installing snappy-0:1.2.2-4.f 100% | 79.6 MiB/s | 81.6 KiB | 00m00s [ 17/185] Installing openjpeg-0:2.5.4-3 100% | 227.6 MiB/s | 466.1 KiB | 00m00s [ 18/185] Installing libwebp-0:1.6.0-3. 100% | 316.4 MiB/s | 972.1 KiB | 00m00s [ 19/185] Installing geos-0:3.14.1-2.fc 100% | 193.7 MiB/s | 4.3 MiB | 00m00s [ 20/185] Installing blosc-0:1.21.6-10. 100% | 125.9 MiB/s | 128.9 KiB | 00m00s [ 21/185] Installing python3-rpm-macros 100% | 0.0 B/s | 6.8 KiB | 00m00s [ 22/185] Installing hdf5-0:1.14.6-7.fc 100% | 217.9 MiB/s | 6.5 MiB | 00m00s [ 23/185] Installing openblas-0:0.3.29- 100% | 110.8 MiB/s | 113.5 KiB | 00m00s [ 24/185] Installing lcms2-0:2.16-7.fc4 100% | 218.4 MiB/s | 447.3 KiB | 00m00s [ 25/185] Installing minizip-ng-compat- 100% | 163.3 MiB/s | 167.2 KiB | 00m00s [ 26/185] Installing freexl-0:2.0.0-20. 100% | 92.1 MiB/s | 94.3 KiB | 00m00s [ 27/185] Installing libquadmath-0:16.0 100% | 63.9 MiB/s | 327.2 KiB | 00m00s [ 28/185] Installing tzdata-0:2025c-2.f 100% | 48.8 MiB/s | 1.5 MiB | 00m00s [ 29/185] Installing libqhull_r-1:8.0.2 100% | 240.2 MiB/s | 492.0 KiB | 00m00s [ 30/185] Installing liblerc-0:4.0.0-10 100% | 317.1 MiB/s | 649.4 KiB | 00m00s [ 31/185] Installing libdeflate-0:1.25- 100% | 117.6 MiB/s | 120.4 KiB | 00m00s [ 32/185] Installing imath-0:3.1.12-6.f 100% | 186.4 MiB/s | 381.7 KiB | 00m00s [ 33/185] Installing openexr-libs-0:3.2 100% | 473.0 MiB/s | 6.6 MiB | 00m00s [ 34/185] Installing openblas-openmp-0: 100% | 633.1 MiB/s | 43.7 MiB | 00m00s [ 35/185] Installing flexiblas-netlib-0 100% | 340.2 MiB/s | 16.3 MiB | 00m00s [ 36/185] Installing flexiblas-0:3.5.0- 100% | 0.0 B/s | 39.2 KiB | 00m00s [ 37/185] Installing flexiblas-openblas 100% | 0.0 B/s | 39.9 KiB | 00m00s [ 38/185] Installing openblas-openmp64- 100% | 635.2 MiB/s | 43.8 MiB | 00m00s [ 39/185] Installing flexiblas-openblas 100% | 39.0 MiB/s | 40.0 KiB | 00m00s [ 40/185] Installing flexiblas-netlib64 100% | 337.8 MiB/s | 16.6 MiB | 00m00s [ 41/185] Installing arpack-0:3.9.1-9.f 100% | 308.4 MiB/s | 631.7 KiB | 00m00s [ 42/185] Installing armadillo-0:12.8.1 100% | 81.3 MiB/s | 83.2 KiB | 00m00s [ 43/185] Installing pyproject-rpm-macr 100% | 114.8 MiB/s | 117.5 KiB | 00m00s [ 44/185] Installing librttopo-0:1.1.0- 100% | 255.0 MiB/s | 522.3 KiB | 00m00s [ 45/185] Installing liborc2-0:2.2.2-2. 100% | 379.3 MiB/s | 1.9 MiB | 00m00s [ 46/185] Installing libarrow-0:23.0.0- 100% | 461.5 MiB/s | 13.8 MiB | 00m00s [ 47/185] Installing dejavu-sans-fonts- 100% | 459.1 MiB/s | 5.5 MiB | 00m00s [ 48/185] Installing abattis-cantarell- 100% | 189.9 MiB/s | 194.4 KiB | 00m00s [ 49/185] Installing protobuf-compiler- 100% | 139.1 MiB/s | 2.5 MiB | 00m00s [ 50/185] Installing nss-softokn-freebl 100% | 325.8 MiB/s | 1.0 MiB | 00m00s [ 51/185] Installing nss-softokn-0:3.12 100% | 404.5 MiB/s | 2.0 MiB | 00m00s [ 52/185] Installing nss-0:3.120.0-1.fc 100% | 179.5 MiB/s | 2.0 MiB | 00m00s [ 53/185] Installing nss-sysinit-0:3.12 100% | 1.3 MiB/s | 19.1 KiB | 00m00s [ 54/185] Installing libtirpc-0:1.3.7-2 100% | 201.5 MiB/s | 206.4 KiB | 00m00s [ 55/185] Installing hdf-libs-0:4.3.0-5 100% | 345.7 MiB/s | 708.0 KiB | 00m00s [ 56/185] Installing boost-container-0: 100% | 68.7 MiB/s | 70.3 KiB | 00m00s [ 57/185] Installing boost-program-opti 100% | 278.9 MiB/s | 285.6 KiB | 00m00s [ 58/185] Installing fribidi-0:1.0.16-4 100% | 15.7 MiB/s | 192.5 KiB | 00m00s [ 59/185] Installing libimagequant-0:4. 100% | 346.3 MiB/s | 709.2 KiB | 00m00s [ 60/185] Installing libXau-0:1.0.12-4. 100% | 72.6 MiB/s | 74.3 KiB | 00m00s [ 61/185] Installing libxcb-0:1.17.0-7. 100% | 215.5 MiB/s | 1.1 MiB | 00m00s [ 62/185] Installing libX11-common-0:1. 100% | 148.3 MiB/s | 1.2 MiB | 00m00s [ 63/185] Installing libX11-0:1.8.12-3. 100% | 336.0 MiB/s | 1.3 MiB | 00m00s [ 64/185] Installing libXext-0:1.3.6-5. 100% | 88.9 MiB/s | 91.1 KiB | 00m00s [ 65/185] Installing libXrender-0:0.9.1 100% | 0.0 B/s | 51.2 KiB | 00m00s [ 66/185] Installing pixman-0:0.46.2-3. 100% | 351.2 MiB/s | 719.3 KiB | 00m00s [ 67/185] Installing lzo-0:2.10-16.fc44 100% | 172.3 MiB/s | 176.4 KiB | 00m00s [ 68/185] Installing google-noto-fonts- 100% | 0.0 B/s | 18.5 KiB | 00m00s [ 69/185] Installing google-noto-sans-v 100% | 347.8 MiB/s | 1.4 MiB | 00m00s [ 70/185] Installing default-fonts-core 100% | 17.8 MiB/s | 18.2 KiB | 00m00s [ 71/185] Installing grpc-data-0:1.48.4 100% | 0.0 B/s | 30.4 KiB | 00m00s [ 72/185] Installing c-ares-0:1.34.6-3. 100% | 276.4 MiB/s | 283.1 KiB | 00m00s [ 73/185] Installing graphite2-0:1.3.14 100% | 14.5 MiB/s | 193.6 KiB | 00m00s [ 74/185] Installing freetype-0:2.14.1- 100% | 300.7 MiB/s | 923.9 KiB | 00m00s [ 75/185] Installing harfbuzz-0:12.3.2- 100% | 342.5 MiB/s | 2.7 MiB | 00m00s [ 76/185] Installing libraqm-0:0.10.1-4 100% | 32.8 MiB/s | 33.6 KiB | 00m00s [ 77/185] Installing gpgme-0:2.0.1-3.fc 100% | 43.3 MiB/s | 620.8 KiB | 00m00s [ 78/185] Installing gpgmepp-0:2.0.1-3. 100% | 72.0 MiB/s | 442.5 KiB | 00m00s [ 79/185] Installing xml-common-0:0.6.3 100% | 79.2 MiB/s | 81.1 KiB | 00m00s [ 80/185] Installing fontconfig-0:2.17. 100% | 766.6 KiB/s | 795.8 KiB | 00m01s [ 81/185] Installing cairo-0:1.18.4-6.f 100% | 304.5 MiB/s | 1.8 MiB | 00m00s [ 82/185] Installing libicu-0:77.1-2.fc 100% | 398.1 MiB/s | 36.6 MiB | 00m00s [ 83/185] Installing re2-2:20251105-4.f 100% | 296.9 MiB/s | 608.2 KiB | 00m00s [ 84/185] Installing grpc-0:1.48.4-57.f 100% | 471.0 MiB/s | 10.8 MiB | 00m00s [ 85/185] Installing grpc-cpp-0:1.48.4- 100% | 384.5 MiB/s | 3.1 MiB | 00m00s [ 86/185] Installing libyaml-0:0.2.5-18 100% | 136.6 MiB/s | 139.9 KiB | 00m00s [ 87/185] Installing proj-data-0:9.7.1- 100% | 526.0 MiB/s | 9.5 MiB | 00m00s [ 88/185] Installing poppler-data-0:0.4 100% | 387.2 MiB/s | 12.4 MiB | 00m00s [ 89/185] Installing thrift-0:0.20.0-9. 100% | 206.0 MiB/s | 5.6 MiB | 00m00s [ 90/185] Installing parquet-libs-0:23. 100% | 421.1 MiB/s | 3.8 MiB | 00m00s [ 91/185] Installing libzip-0:1.11.4-3. 100% | 141.5 MiB/s | 144.9 KiB | 00m00s [ 92/185] Installing netcdf-0:4.9.3-2.f 100% | 126.0 MiB/s | 2.5 MiB | 00m00s [ 93/185] Installing mariadb-connector- 100% | 0.0 B/s | 1.0 KiB | 00m00s [ 94/185] Installing mariadb-connector- 100% | 258.1 MiB/s | 528.7 KiB | 00m00s [ 95/185] Installing jbigkit-libs-0:2.1 100% | 116.4 MiB/s | 119.2 KiB | 00m00s [ 96/185] Installing libtiff-0:4.7.1-2. 100% | 313.7 MiB/s | 642.5 KiB | 00m00s [ 97/185] Installing proj-0:9.7.1-3.fc4 100% | 187.8 MiB/s | 4.7 MiB | 00m00s [ 98/185] Installing libgeotiff-0:1.7.4 100% | 22.0 MiB/s | 293.1 KiB | 00m00s [ 99/185] Installing libspatialite-0:5. 100% | 483.7 MiB/s | 15.0 MiB | 00m00s [100/185] Installing poppler-0:26.01.0- 100% | 396.4 MiB/s | 4.0 MiB | 00m00s [101/185] Installing uriparser-0:1.0.0- 100% | 13.9 MiB/s | 184.7 KiB | 00m00s [102/185] Installing libkml-0:1.3.0-56. 100% | 294.5 MiB/s | 1.2 MiB | 00m00s [103/185] Installing utf8proc-0:2.11.3- 100% | 366.1 MiB/s | 374.9 KiB | 00m00s [104/185] Installing libarrow-compute-l 100% | 500.8 MiB/s | 14.0 MiB | 00m00s [105/185] Installing libarrow-acero-lib 100% | 359.0 MiB/s | 1.4 MiB | 00m00s [106/185] Installing libarrow-dataset-l 100% | 382.0 MiB/s | 1.5 MiB | 00m00s [107/185] Installing libarrow-glib-libs 100% | 345.5 MiB/s | 1.7 MiB | 00m00s [108/185] Installing libarrow-flight-li 100% | 358.2 MiB/s | 1.4 MiB | 00m00s [109/185] Installing python-pip-wheel-0 100% | 602.0 MiB/s | 1.2 MiB | 00m00s [110/185] Installing mpdecimal-0:4.0.1- 100% | 35.6 MiB/s | 218.6 KiB | 00m00s [111/185] Installing python3-libs-0:3.1 100% | 352.2 MiB/s | 44.0 MiB | 00m00s [112/185] Installing python3-0:3.14.2-3 100% | 1.8 MiB/s | 30.5 KiB | 00m00s [113/185] Installing python3-numpy-1:2. 100% | 349.8 MiB/s | 41.6 MiB | 00m00s [114/185] Installing python3-numpy-f2py 100% | 99.0 MiB/s | 2.2 MiB | 00m00s [115/185] Installing python3-packaging- 100% | 201.8 MiB/s | 619.9 KiB | 00m00s [116/185] Installing python3-typing-ext 100% | 264.0 MiB/s | 540.7 KiB | 00m00s [117/185] Installing python3-click-1:8. 100% | 195.0 MiB/s | 1.2 MiB | 00m00s [118/185] Installing python3-pygments-0 100% | 229.7 MiB/s | 11.5 MiB | 00m00s [119/185] Installing python3-pyparsing- 100% | 257.4 MiB/s | 1.0 MiB | 00m00s [120/185] Installing python3-toolz-0:1. 100% | 155.7 MiB/s | 637.6 KiB | 00m00s [121/185] Installing python3-idna-0:3.1 100% | 242.5 MiB/s | 744.9 KiB | 00m00s [122/185] Installing python3-urllib3-0: 100% | 227.5 MiB/s | 1.1 MiB | 00m00s [123/185] Installing python3-cligj-0:0. 100% | 36.9 MiB/s | 37.8 KiB | 00m00s [124/185] Installing python3-flexcache- 100% | 59.2 MiB/s | 60.6 KiB | 00m00s [125/185] Installing python3-flexparser 100% | 260.8 MiB/s | 267.1 KiB | 00m00s [126/185] Installing python3-rpm-genera 100% | 81.0 MiB/s | 82.9 KiB | 00m00s [127/185] Installing python3-Bottleneck 100% | 145.5 MiB/s | 596.0 KiB | 00m00s [128/185] Installing python3-contourpy- 100% | 212.3 MiB/s | 869.6 KiB | 00m00s [129/185] Installing python3-numexpr-0: 100% | 212.7 MiB/s | 871.4 KiB | 00m00s [130/185] Installing python3-platformdi 100% | 184.8 MiB/s | 189.3 KiB | 00m00s [131/185] Installing python3-iniconfig- 100% | 52.9 MiB/s | 54.1 KiB | 00m00s [132/185] Installing python3-pluggy-0:1 100% | 70.9 MiB/s | 217.9 KiB | 00m00s [133/185] Installing python3-pytest-0:8 100% | 371.7 MiB/s | 22.7 MiB | 00m00s [134/185] Installing python3-execnet-0: 100% | 242.2 MiB/s | 992.2 KiB | 00m00s [135/185] Installing python3-affine-0:2 100% | 172.4 MiB/s | 176.5 KiB | 00m00s [136/185] Installing python3-attrs-0:25 100% | 220.3 MiB/s | 451.1 KiB | 00m00s [137/185] Installing python3-certifi-0: 100% | 10.9 MiB/s | 11.2 KiB | 00m00s [138/185] Installing python3-husl-0:4.0 100% | 11.6 MiB/s | 23.7 KiB | 00m00s [139/185] Installing python3-pyarrow-0: 100% | 420.3 MiB/s | 26.9 MiB | 00m00s [140/185] Installing python3-cycler-0:0 100% | 13.1 MiB/s | 40.3 KiB | 00m00s [141/185] Installing python3-fonttools- 100% | 369.4 MiB/s | 19.6 MiB | 00m00s [142/185] Installing python3-kiwisolver 100% | 158.2 MiB/s | 162.0 KiB | 00m00s [143/185] Installing python3-cloudpickl 100% | 130.4 MiB/s | 133.5 KiB | 00m00s [144/185] Installing python3-fsspec-0:2 100% | 279.5 MiB/s | 2.0 MiB | 00m00s [145/185] Installing python3-pyyaml-0:6 100% | 196.1 MiB/s | 803.4 KiB | 00m00s [146/185] Installing python3-six-0:1.17 100% | 117.5 MiB/s | 120.3 KiB | 00m00s [147/185] Installing python3-dateutil-1 100% | 174.1 MiB/s | 891.5 KiB | 00m00s [148/185] Installing python3-pandas-0:3 100% | 393.7 MiB/s | 39.8 MiB | 00m00s [149/185] Installing python3-babel-0:2. 100% | 342.5 MiB/s | 30.5 MiB | 00m00s [150/185] Installing python3-docutils-0 100% | 169.3 MiB/s | 5.6 MiB | 00m00s [151/185] Installing python3-imagesize- 100% | 38.2 MiB/s | 39.1 KiB | 00m00s [152/185] Installing python3-roman-nume 100% | 42.4 MiB/s | 43.4 KiB | 00m00s [153/185] Installing python3-snowballst 100% | 309.9 MiB/s | 1.9 MiB | 00m00s [154/185] Installing python3-sphinx-the 100% | 45.5 MiB/s | 46.6 KiB | 00m00s [155/185] Installing python3-locket-0:1 100% | 22.9 MiB/s | 23.4 KiB | 00m00s [156/185] Installing python3-partd-0:1. 100% | 43.0 MiB/s | 176.2 KiB | 00m00s [157/185] Installing python3-dask-0:202 100% | 288.7 MiB/s | 20.8 MiB | 00m00s [158/185] Installing python3-dask+array 100% | 0.0 B/s | 124.0 B | 00m00s [159/185] Installing python3-markupsafe 100% | 64.1 MiB/s | 65.7 KiB | 00m00s [160/185] Installing python3-jinja2-0:3 100% | 386.5 MiB/s | 3.1 MiB | 00m00s [161/185] Installing python3-charset-no 100% | 25.6 MiB/s | 366.4 KiB | 00m00s [162/185] Installing python3-requests-0 100% | 95.5 MiB/s | 488.9 KiB | 00m00s [163/185] Installing python3-sphinx-1:8 100% | 207.8 MiB/s | 12.5 MiB | 00m00s [164/185] Installing python3-numpydoc-0 100% | 45.4 MiB/s | 697.7 KiB | 00m00s [165/185] Installing python3-cairo-0:1. 100% | 250.2 MiB/s | 512.3 KiB | 00m00s [166/185] Installing python3-olefile-0: 100% | 170.8 MiB/s | 349.8 KiB | 00m00s [167/185] Installing python3-pillow-0:1 100% | 318.7 MiB/s | 4.5 MiB | 00m00s [168/185] Installing python3-matplotlib 100% | 359.7 MiB/s | 7.9 MiB | 00m00s [169/185] Installing python3-matplotlib 100% | 427.3 MiB/s | 32.0 MiB | 00m00s [170/185] Installing xerces-c-0:3.3.0-9 100% | 437.4 MiB/s | 3.9 MiB | 00m00s [171/185] Installing unixODBC-0:2.3.14- 100% | 59.7 MiB/s | 1.0 MiB | 00m00s [172/185] Installing muParser-0:2.3.5-5 100% | 275.8 MiB/s | 564.8 KiB | 00m00s [173/185] Installing libpq-0:18.0-4.fc4 100% | 253.9 MiB/s | 1.0 MiB | 00m00s [174/185] Installing libgta-0:1.2.1-17. 100% | 69.7 MiB/s | 71.3 KiB | 00m00s [175/185] Installing giflib-0:5.2.2-9.f 100% | 114.9 MiB/s | 117.7 KiB | 00m00s [176/185] Installing cfitsio-0:4.6.3-2. 100% | 320.0 MiB/s | 1.9 MiB | 00m00s [177/185] Installing gdal-libs-0:3.12.1 100% | 396.8 MiB/s | 34.5 MiB | 00m00s [178/185] Installing python3-rasterio-0 100% | 189.1 MiB/s | 5.5 MiB | 00m00s [179/185] Installing python3-seaborn-0: 100% | 293.1 MiB/s | 2.3 MiB | 00m00s [180/185] Installing python3-dask+dataf 100% | 0.0 B/s | 124.0 B | 00m00s [181/185] Installing python3-pytest-xdi 100% | 235.0 MiB/s | 481.3 KiB | 00m00s [182/185] Installing python3-pytest-asy 100% | 132.0 MiB/s | 135.2 KiB | 00m00s [183/185] Installing python3-pytest-tim 100% | 41.3 MiB/s | 84.6 KiB | 00m00s [184/185] Installing python3-pint-0:0.2 100% | 133.3 MiB/s | 3.5 MiB | 00m00s [185/185] Installing python3-devel-0:3. 100% | 16.2 MiB/s | 2.0 MiB | 00m00s Warning: skipped OpenPGP checks for 4 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.src.rpm Updating and loading repositories: Copr repository 100% | 109.0 KiB/s | 1.5 KiB | 00m00s fedora 100% | 90.2 KiB/s | 26.4 KiB | 00m00s Repositories loaded. Package "python3-devel-3.14.2-3.fc44.x86_64" is already installed. Package "python3-Bottleneck-1.6.0-2.fc44.x86_64" is already installed. Package "python3-dask+array-2025.12.0-3.fc44.noarch" is already installed. Package "python3-dask+dataframe-2025.12.0-3.fc44.noarch" is already installed. Package "python3-pint-0.25.2-2.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-asyncio-1.1.0-3.fc44.noarch" is already installed. Package "python3-pytest-timeout-2.4.0-6.fc44.noarch" is already installed. Package "python3-pytest-xdist-3.7.0-6.fc44.noarch" is already installed. Package "python3-rasterio-1.5.0-3.fc44.x86_64" is already installed. Package "python3-seaborn-0.13.2-15.fc44.noarch" is already installed. Nothing to do. Finish: build setup for python-xarray-2025.12.0-2.fc44.src.rpm Start: rpmbuild python-xarray-2025.12.0-2.fc44.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.bA5Qbp Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.MtbafV + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + rm -rf xarray-2025.12.0 + /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/xarray-2025.12.0.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd xarray-2025.12.0 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + /usr/lib/rpm/rpmuncompress /builddir/build/SOURCES/0001-Drop-pydap-from-dependencies.patch + /usr/bin/patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + /usr/lib/rpm/rpmuncompress /builddir/build/SOURCES/0002-Ensure-netcdf4-is-locked-while-closing.patch + /usr/bin/patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.518QCy + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + cd xarray-2025.12.0 + 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-xarray-2025.12.0-build/.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 --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 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires -x io Handling setuptools>=77.0.3 from build-system.requires Requirement not satisfied: setuptools>=77.0.3 Handling setuptools-scm>=8 from build-system.requires Requirement not satisfied: setuptools-scm>=8 Exiting dependency generation pass: build backend + cat /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Copr repository 100% | 8.7 KiB/s | 1.5 KiB | 00m00s fedora 100% | 58.6 KiB/s | 26.4 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.18.6-2.fc44.noarch" is already installed. Package "python3-devel-3.14.2-3.fc44.x86_64" is already installed. Package "python3-Bottleneck-1.6.0-2.fc44.x86_64" is already installed. Package "python3-dask+array-2025.12.0-3.fc44.noarch" is already installed. Package "python3-dask+dataframe-2025.12.0-3.fc44.noarch" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pint-0.25.2-2.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-asyncio-1.1.0-3.fc44.noarch" is already installed. Package "python3-pytest-timeout-2.4.0-6.fc44.noarch" is already installed. Package "python3-pytest-xdist-3.7.0-6.fc44.noarch" is already installed. Package "python3-rasterio-1.5.0-3.fc44.x86_64" is already installed. Package "python3-seaborn-0.13.2-15.fc44.noarch" is already installed. Package Arch Version Repository Size Installing: python3-pip noarch 0:25.3-2.fc44 fedora 11.2 MiB python3-setuptools noarch 0:80.10.2-1.fc44 fedora 7.5 MiB python3-setuptools_scm noarch 0:9.2.2-5.fc44 fedora 502.5 KiB Transaction Summary: Installing: 3 packages Total size of inbound packages is 5 MiB. Need to download 0 B. After this operation, 19 MiB extra will be used (install 19 MiB, remove 0 B). [1/3] python3-pip-0:25.3-2.fc44.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [2/3] python3-setuptools-0:80.10.2-1.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [3/3] python3-setuptools_scm-0:9.2.2-5. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [3/3] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [1/5] Verify package files 100% | 187.0 B/s | 3.0 B | 00m00s [2/5] Prepare transaction 100% | 85.0 B/s | 3.0 B | 00m00s [3/5] Installing python3-setuptools-0:8 100% | 206.8 MiB/s | 7.7 MiB | 00m00s [4/5] Installing python3-setuptools_scm 100% | 25.7 MiB/s | 526.4 KiB | 00m00s [5/5] Installing python3-pip-0:25.3-2.f 100% | 129.0 MiB/s | 11.5 MiB | 00m00s Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.D9nG11 + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + cd xarray-2025.12.0 + 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-xarray-2025.12.0-build/.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 --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 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires -x io Handling setuptools>=77.0.3 from build-system.requires Requirement satisfied: setuptools>=77.0.3 (installed: setuptools 80.10.2) Handling setuptools-scm>=8 from build-system.requires Requirement satisfied: setuptools-scm>=8 (installed: setuptools-scm 9.2.2) /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running egg_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running dist_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-xarray-2025.12.0-build/xarray-2025.12.0/xarray-2025.12.0.dist-info' Handling numpy>=1.26 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: numpy>=1.26 (installed: numpy 2.4.2) Handling packaging>=24.1 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: packaging>=24.1 (installed: packaging 25.0) Handling pandas>=2.2 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: pandas>=2.2 (installed: pandas 3.0.0) Handling scipy>=1.13; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy>=1.13; extra == "accel" Handling bottleneck; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: bottleneck; extra == "accel" Handling numbagg>=0.8; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numbagg>=0.8; extra == "accel" Handling numba>=0.62; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numba>=0.62; extra == "accel" Handling flox>=0.9; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: flox>=0.9; extra == "accel" Handling opt_einsum; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: opt_einsum; extra == "accel" Handling xarray[accel,etc,io,parallel,viz]; extra == "complete" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: xarray[accel,etc,io,parallel,viz]; extra == "complete" Handling netCDF4>=1.6.0; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: netCDF4>=1.6.0; extra == "io" Handling h5netcdf; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: h5netcdf; extra == "io" Handling scipy>=1.13; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: scipy>=1.13; extra == "io" Handling zarr>=2.18; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: zarr>=2.18; extra == "io" Handling fsspec; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: fsspec; extra == "io" (installed: fsspec 2026.1.0) Handling cftime; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: cftime; extra == "io" Handling pooch; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement not satisfied: pooch; extra == "io" Handling sparse>=0.15; extra == "etc" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: sparse>=0.15; extra == "etc" Handling dask[complete]; extra == "parallel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: dask[complete]; extra == "parallel" Handling cartopy>=0.23; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: cartopy>=0.23; extra == "viz" Handling matplotlib>=3.8; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: matplotlib>=3.8; extra == "viz" Handling nc-time-axis; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: nc-time-axis; extra == "viz" Handling seaborn; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: seaborn; extra == "viz" Handling pandas-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: pandas-stubs; extra == "types" Handling scipy-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy-stubs; extra == "types" Handling types-PyYAML; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-PyYAML; extra == "types" Handling types-Pygments; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-Pygments; extra == "types" Handling types-colorama; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-colorama; extra == "types" Handling types-decorator; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-decorator; extra == "types" Handling types-defusedxml; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-defusedxml; extra == "types" Handling types-docutils; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-docutils; extra == "types" Handling types-networkx; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-networkx; extra == "types" Handling types-pexpect; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pexpect; extra == "types" Handling types-psutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-psutil; extra == "types" Handling types-pycurl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pycurl; extra == "types" Handling types-openpyxl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-openpyxl; extra == "types" Handling types-python-dateutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-python-dateutil; extra == "types" Handling types-pytz; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pytz; extra == "types" Handling types-requests; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-requests; extra == "types" Handling types-setuptools; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-setuptools; extra == "types" + cat /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires + rm -rfv xarray-2025.12.0.dist-info/ removed 'xarray-2025.12.0.dist-info/licenses/LICENSE' removed directory 'xarray-2025.12.0.dist-info/licenses' removed 'xarray-2025.12.0.dist-info/METADATA' removed 'xarray-2025.12.0.dist-info/entry_points.txt' removed 'xarray-2025.12.0.dist-info/top_level.txt' removed directory 'xarray-2025.12.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Copr repository 100% | 1.3 KiB/s | 1.5 KiB | 00m01s fedora 100% | 18.3 KiB/s | 26.4 KiB | 00m01s Repositories loaded. Package "pyproject-rpm-macros-1.18.6-2.fc44.noarch" is already installed. Package "python3-devel-3.14.2-3.fc44.x86_64" is already installed. Package "python3-Bottleneck-1.6.0-2.fc44.x86_64" is already installed. Package "python3-dask+array-2025.12.0-3.fc44.noarch" is already installed. Package "python3-dask+dataframe-2025.12.0-3.fc44.noarch" is already installed. Package "python3-fsspec-2026.1.0-2.fc44.noarch" is already installed. Package "python3-numpy-1:2.4.2-1.fc44.x86_64" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pandas-3.0.0-0.fc44.x86_64" is already installed. Package "python3-pint-0.25.2-2.fc44.noarch" is already installed. Package "python3-pip-25.3-2.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-asyncio-1.1.0-3.fc44.noarch" is already installed. Package "python3-pytest-timeout-2.4.0-6.fc44.noarch" is already installed. Package "python3-pytest-xdist-3.7.0-6.fc44.noarch" is already installed. Package "python3-rasterio-1.5.0-3.fc44.x86_64" is already installed. Package "python3-seaborn-0.13.2-15.fc44.noarch" is already installed. Package "python3-setuptools-80.10.2-1.fc44.noarch" is already installed. Package "python3-setuptools_scm-9.2.2-5.fc44.noarch" is already installed. Package Arch Version Repository Size Installing: python3-cftime x86_64 0:1.6.5-2.fc44 fedora 2.9 MiB python3-h5netcdf noarch 0:1.7.3-2.fc44 fedora 781.4 KiB python3-netcdf4 x86_64 0:1.7.3-2.fc44 fedora 2.3 MiB python3-pooch noarch 0:1.9.0-1.fc44 fedora 657.1 KiB python3-scipy x86_64 0:1.16.2-3.fc44 fedora 64.5 MiB python3-zarr noarch 0:2.18.7-7.fc44 fedora 3.3 MiB Installing dependencies: liblzf x86_64 0:3.6-34.fc44 fedora 49.3 KiB python3-asciitree noarch 0:0.3.3-37.fc44 fedora 20.7 KiB python3-cached_property noarch 0:2.0.1-7.fc44 fedora 35.2 KiB python3-fasteners noarch 0:0.20-4.fc44 fedora 117.2 KiB python3-h5py x86_64 0:3.15.1-3.fc44 fedora 4.2 MiB python3-numcodecs x86_64 0:0.16.5-2.fc44 fedora 1.6 MiB Transaction Summary: Installing: 12 packages Total size of inbound packages is 20 MiB. Need to download 20 MiB. After this operation, 80 MiB extra will be used (install 80 MiB, remove 0 B). [ 1/12] python3-h5netcdf-0:1.7.3-2.fc44 100% | 11.3 MiB/s | 162.1 KiB | 00m00s [ 2/12] python3-netcdf4-0:1.7.3-2.fc44. 100% | 37.7 MiB/s | 656.5 KiB | 00m00s [ 3/12] python3-cftime-0:1.6.5-2.fc44.x 100% | 20.0 MiB/s | 430.0 KiB | 00m00s [ 4/12] python3-pooch-0:1.9.0-1.fc44.no 100% | 20.4 MiB/s | 145.9 KiB | 00m00s [ 5/12] python3-h5py-0:3.15.1-3.fc44.x8 100% | 87.3 MiB/s | 1.1 MiB | 00m00s [ 6/12] python3-asciitree-0:0.3.3-37.fc 100% | 6.0 MiB/s | 18.5 KiB | 00m00s [ 7/12] python3-fasteners-0:0.20-4.fc44 100% | 10.0 MiB/s | 51.2 KiB | 00m00s [ 8/12] python3-numcodecs-0:0.16.5-2.fc 100% | 12.9 MiB/s | 462.4 KiB | 00m00s [ 9/12] python3-zarr-0:2.18.7-7.fc44.no 100% | 9.0 MiB/s | 571.5 KiB | 00m00s [10/12] liblzf-0:3.6-34.fc44.x86_64 100% | 9.0 MiB/s | 27.7 KiB | 00m00s [11/12] python3-scipy-0:1.16.2-3.fc44.x 100% | 195.2 MiB/s | 16.4 MiB | 00m00s [12/12] python3-cached_property-0:2.0.1 100% | 1.1 MiB/s | 20.5 KiB | 00m00s -------------------------------------------------------------------------------- [12/12] Total 100% | 192.5 MiB/s | 20.0 MiB | 00m00s Running transaction [ 1/14] Verify package files 100% | 160.0 B/s | 12.0 B | 00m00s [ 2/14] Prepare transaction 100% | 214.0 B/s | 12.0 B | 00m00s [ 3/14] Installing python3-cached_prope 100% | 37.3 MiB/s | 38.2 KiB | 00m00s [ 4/14] Installing liblzf-0:3.6-34.fc44 100% | 3.6 MiB/s | 51.6 KiB | 00m00s [ 5/14] Installing python3-h5py-0:3.15. 100% | 300.2 MiB/s | 4.2 MiB | 00m00s [ 6/14] Installing python3-numcodecs-0: 100% | 210.1 MiB/s | 1.7 MiB | 00m00s [ 7/14] Installing python3-fasteners-0: 100% | 122.4 MiB/s | 125.3 KiB | 00m00s [ 8/14] Installing python3-asciitree-0: 100% | 24.3 MiB/s | 24.9 KiB | 00m00s [ 9/14] Installing python3-pooch-0:1.9. 100% | 219.1 MiB/s | 673.1 KiB | 00m00s [10/14] Installing python3-cftime-0:1.6 100% | 477.0 MiB/s | 2.9 MiB | 00m00s [11/14] Installing python3-netcdf4-0:1. 100% | 210.0 MiB/s | 2.3 MiB | 00m00s [12/14] Installing python3-scipy-0:1.16 100% | 345.2 MiB/s | 64.9 MiB | 00m00s [13/14] Installing python3-zarr-0:2.18. 100% | 368.6 MiB/s | 3.3 MiB | 00m00s [14/14] Installing python3-h5netcdf-0:1 100% | 29.6 MiB/s | 789.2 KiB | 00m00s Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.PxMUjA + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + cd xarray-2025.12.0 + 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-xarray-2025.12.0-build/.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 --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 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires -x io Handling setuptools>=77.0.3 from build-system.requires Requirement satisfied: setuptools>=77.0.3 (installed: setuptools 80.10.2) Handling setuptools-scm>=8 from build-system.requires Requirement satisfied: setuptools-scm>=8 (installed: setuptools-scm 9.2.2) /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running egg_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running dist_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-xarray-2025.12.0-build/xarray-2025.12.0/xarray-2025.12.0.dist-info' Handling numpy>=1.26 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: numpy>=1.26 (installed: numpy 2.4.2) Handling packaging>=24.1 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: packaging>=24.1 (installed: packaging 25.0) Handling pandas>=2.2 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: pandas>=2.2 (installed: pandas 3.0.0) Handling scipy>=1.13; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy>=1.13; extra == "accel" Handling bottleneck; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: bottleneck; extra == "accel" Handling numbagg>=0.8; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numbagg>=0.8; extra == "accel" Handling numba>=0.62; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numba>=0.62; extra == "accel" Handling flox>=0.9; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: flox>=0.9; extra == "accel" Handling opt_einsum; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: opt_einsum; extra == "accel" Handling xarray[accel,etc,io,parallel,viz]; extra == "complete" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: xarray[accel,etc,io,parallel,viz]; extra == "complete" Handling netCDF4>=1.6.0; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: netCDF4>=1.6.0; extra == "io" (installed: netCDF4 1.7.3) Handling h5netcdf; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: h5netcdf; extra == "io" (installed: h5netcdf 1.7.3) Handling scipy>=1.13; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: scipy>=1.13; extra == "io" (installed: scipy 1.16.2) Handling zarr>=2.18; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: zarr>=2.18; extra == "io" (installed: zarr 2.18.7) Handling fsspec; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: fsspec; extra == "io" (installed: fsspec 2026.1.0) Handling cftime; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: cftime; extra == "io" (installed: cftime 1.6.5) Handling pooch; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: pooch; extra == "io" (installed: pooch 1.9.0) Handling sparse>=0.15; extra == "etc" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: sparse>=0.15; extra == "etc" Handling dask[complete]; extra == "parallel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: dask[complete]; extra == "parallel" Handling cartopy>=0.23; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: cartopy>=0.23; extra == "viz" Handling matplotlib>=3.8; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: matplotlib>=3.8; extra == "viz" Handling nc-time-axis; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: nc-time-axis; extra == "viz" Handling seaborn; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: seaborn; extra == "viz" Handling pandas-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: pandas-stubs; extra == "types" Handling scipy-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy-stubs; extra == "types" Handling types-PyYAML; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-PyYAML; extra == "types" Handling types-Pygments; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-Pygments; extra == "types" Handling types-colorama; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-colorama; extra == "types" Handling types-decorator; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-decorator; extra == "types" Handling types-defusedxml; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-defusedxml; extra == "types" Handling types-docutils; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-docutils; extra == "types" Handling types-networkx; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-networkx; extra == "types" Handling types-pexpect; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pexpect; extra == "types" Handling types-psutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-psutil; extra == "types" Handling types-pycurl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pycurl; extra == "types" Handling types-openpyxl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-openpyxl; extra == "types" Handling types-python-dateutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-python-dateutil; extra == "types" Handling types-pytz; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pytz; extra == "types" Handling types-requests; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-requests; extra == "types" Handling types-setuptools; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-setuptools; extra == "types" + cat /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires + rm -rfv xarray-2025.12.0.dist-info/ removed 'xarray-2025.12.0.dist-info/licenses/LICENSE' removed directory 'xarray-2025.12.0.dist-info/licenses' removed 'xarray-2025.12.0.dist-info/METADATA' removed 'xarray-2025.12.0.dist-info/top_level.txt' removed 'xarray-2025.12.0.dist-info/entry_points.txt' removed directory 'xarray-2025.12.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-xarray-2025.12.0-2.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Copr repository 100% | 69.3 KiB/s | 1.5 KiB | 00m00s fedora 100% | 150.1 KiB/s | 26.4 KiB | 00m00s Repositories loaded. Nothing to do. Package "pyproject-rpm-macros-1.18.6-2.fc44.noarch" is already installed. Package "python3-devel-3.14.2-3.fc44.x86_64" is already installed. Package "python3-Bottleneck-1.6.0-2.fc44.x86_64" is already installed. Package "python3-cftime-1.6.5-2.fc44.x86_64" is already installed. Package "python3-dask+array-2025.12.0-3.fc44.noarch" is already installed. Package "python3-dask+dataframe-2025.12.0-3.fc44.noarch" is already installed. Package "python3-fsspec-2026.1.0-2.fc44.noarch" is already installed. Package "python3-h5netcdf-1.7.3-2.fc44.noarch" is already installed. Package "python3-netcdf4-1.7.3-2.fc44.x86_64" is already installed. Package "python3-numpy-1:2.4.2-1.fc44.x86_64" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pandas-3.0.0-0.fc44.x86_64" is already installed. Package "python3-pint-0.25.2-2.fc44.noarch" is already installed. Package "python3-pip-25.3-2.fc44.noarch" is already installed. Package "python3-pooch-1.9.0-1.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-asyncio-1.1.0-3.fc44.noarch" is already installed. Package "python3-pytest-timeout-2.4.0-6.fc44.noarch" is already installed. Package "python3-pytest-xdist-3.7.0-6.fc44.noarch" is already installed. Package "python3-rasterio-1.5.0-3.fc44.x86_64" is already installed. Package "python3-scipy-1.16.2-3.fc44.x86_64" is already installed. Package "python3-seaborn-0.13.2-15.fc44.noarch" is already installed. Package "python3-setuptools-80.10.2-1.fc44.noarch" is already installed. Package "python3-setuptools_scm-9.2.2-5.fc44.noarch" is already installed. Package "python3-zarr-2.18.7-7.fc44.noarch" is already installed. Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1768608000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.bNzJW6 + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + cd xarray-2025.12.0 + 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-xarray-2025.12.0-build/.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 --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 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires -x io Handling setuptools>=77.0.3 from build-system.requires Requirement satisfied: setuptools>=77.0.3 (installed: setuptools 80.10.2) Handling setuptools-scm>=8 from build-system.requires Requirement satisfied: setuptools-scm>=8 (installed: setuptools-scm 9.2.2) /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running egg_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running dist_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-xarray-2025.12.0-build/xarray-2025.12.0/xarray-2025.12.0.dist-info' Handling numpy>=1.26 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: numpy>=1.26 (installed: numpy 2.4.2) Handling packaging>=24.1 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: packaging>=24.1 (installed: packaging 25.0) Handling pandas>=2.2 from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: pandas>=2.2 (installed: pandas 3.0.0) Handling scipy>=1.13; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy>=1.13; extra == "accel" Handling bottleneck; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: bottleneck; extra == "accel" Handling numbagg>=0.8; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numbagg>=0.8; extra == "accel" Handling numba>=0.62; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: numba>=0.62; extra == "accel" Handling flox>=0.9; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: flox>=0.9; extra == "accel" Handling opt_einsum; extra == "accel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: opt_einsum; extra == "accel" Handling xarray[accel,etc,io,parallel,viz]; extra == "complete" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: xarray[accel,etc,io,parallel,viz]; extra == "complete" Handling netCDF4>=1.6.0; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: netCDF4>=1.6.0; extra == "io" (installed: netCDF4 1.7.3) Handling h5netcdf; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: h5netcdf; extra == "io" (installed: h5netcdf 1.7.3) Handling scipy>=1.13; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: scipy>=1.13; extra == "io" (installed: scipy 1.16.2) Handling zarr>=2.18; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: zarr>=2.18; extra == "io" (installed: zarr 2.18.7) Handling fsspec; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: fsspec; extra == "io" (installed: fsspec 2026.1.0) Handling cftime; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: cftime; extra == "io" (installed: cftime 1.6.5) Handling pooch; extra == "io" from hook generated metadata: Requires-Dist (xarray) Requirement satisfied: pooch; extra == "io" (installed: pooch 1.9.0) Handling sparse>=0.15; extra == "etc" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: sparse>=0.15; extra == "etc" Handling dask[complete]; extra == "parallel" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: dask[complete]; extra == "parallel" Handling cartopy>=0.23; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: cartopy>=0.23; extra == "viz" Handling matplotlib>=3.8; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: matplotlib>=3.8; extra == "viz" Handling nc-time-axis; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: nc-time-axis; extra == "viz" Handling seaborn; extra == "viz" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: seaborn; extra == "viz" Handling pandas-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: pandas-stubs; extra == "types" Handling scipy-stubs; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: scipy-stubs; extra == "types" Handling types-PyYAML; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-PyYAML; extra == "types" Handling types-Pygments; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-Pygments; extra == "types" Handling types-colorama; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-colorama; extra == "types" Handling types-decorator; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-decorator; extra == "types" Handling types-defusedxml; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-defusedxml; extra == "types" Handling types-docutils; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-docutils; extra == "types" Handling types-networkx; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-networkx; extra == "types" Handling types-pexpect; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pexpect; extra == "types" Handling types-psutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-psutil; extra == "types" Handling types-pycurl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pycurl; extra == "types" Handling types-openpyxl; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-openpyxl; extra == "types" Handling types-python-dateutil; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-python-dateutil; extra == "types" Handling types-pytz; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-pytz; extra == "types" Handling types-requests; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-requests; extra == "types" Handling types-setuptools; extra == "types" from hook generated metadata: Requires-Dist (xarray) Ignoring alien requirement: types-setuptools; extra == "types" + cat /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-buildrequires + rm -rfv xarray-2025.12.0.dist-info/ removed 'xarray-2025.12.0.dist-info/licenses/LICENSE' removed directory 'xarray-2025.12.0.dist-info/licenses' removed 'xarray-2025.12.0.dist-info/METADATA' removed 'xarray-2025.12.0.dist-info/entry_points.txt' removed 'xarray-2025.12.0.dist-info/top_level.txt' removed directory 'xarray-2025.12.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.fFRAQ9 + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-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 xarray-2025.12.0 + mkdir -p /builddir/build/BUILD/python-xarray-2025.12.0-build/.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-xarray-2025.12.0-build/.pyproject-builddir + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir Processing /builddir/build/BUILD/python-xarray-2025.12.0-build/xarray-2025.12.0 Preparing metadata (pyproject.toml): started Running command Preparing metadata (pyproject.toml) /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running dist_info creating /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info writing /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/PKG-INFO writing dependency_links to /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/dependency_links.txt writing entry points to /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/entry_points.txt writing requirements to /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/requires.txt writing top-level names to /builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/top_level.txt writing manifest file '/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/SOURCES.txt' reading manifest file '/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file '/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir/pip-modern-metadata-rnwo1p2k/xarray-2025.12.0.dist-info' Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: xarray Building wheel for xarray (pyproject.toml): started Running command Building wheel for xarray (pyproject.toml) /usr/lib/python3.14/site-packages/setuptools_scm/git.py:427: UserWarning: git archive did not support describe output warnings.warn("git archive did not support describe output") /usr/lib/python3.14/site-packages/setuptools_scm/git.py:445: UserWarning: unprocessed git archival found (no export subst applied) warnings.warn("unprocessed git archival found (no export subst applied)") running bdist_wheel running build running build_py creating build/lib/xarray copying xarray/ufuncs.py -> build/lib/xarray copying xarray/typing.py -> build/lib/xarray copying xarray/tutorial.py -> build/lib/xarray copying xarray/groupers.py -> build/lib/xarray copying xarray/convert.py -> build/lib/xarray copying xarray/conventions.py -> build/lib/xarray copying xarray/coders.py -> build/lib/xarray copying xarray/__init__.py -> build/lib/xarray creating build/lib/xarray/util copying xarray/util/print_versions.py -> build/lib/xarray/util copying xarray/util/generate_ops.py -> build/lib/xarray/util copying xarray/util/generate_aggregations.py -> build/lib/xarray/util copying xarray/util/deprecation_helpers.py -> build/lib/xarray/util copying xarray/util/__init__.py -> build/lib/xarray/util creating build/lib/xarray/tests copying xarray/tests/test_backends.py -> build/lib/xarray/tests copying xarray/tests/test_weighted.py -> build/lib/xarray/tests copying xarray/tests/test_variable.py -> build/lib/xarray/tests copying xarray/tests/test_utils.py -> build/lib/xarray/tests copying xarray/tests/test_units.py -> build/lib/xarray/tests copying xarray/tests/test_ufuncs.py -> build/lib/xarray/tests copying xarray/tests/test_typed_ops.py -> build/lib/xarray/tests copying xarray/tests/test_tutorial.py -> build/lib/xarray/tests copying xarray/tests/test_treenode.py -> build/lib/xarray/tests copying xarray/tests/test_strategies.py -> build/lib/xarray/tests copying xarray/tests/test_sparse.py -> build/lib/xarray/tests copying xarray/tests/test_rolling.py -> build/lib/xarray/tests copying xarray/tests/test_range_index.py -> build/lib/xarray/tests copying xarray/tests/test_print_versions.py -> build/lib/xarray/tests copying xarray/tests/test_plugins.py -> build/lib/xarray/tests copying xarray/tests/test_plot.py -> build/lib/xarray/tests copying xarray/tests/test_parallelcompat.py -> build/lib/xarray/tests copying xarray/tests/test_pandas_to_xarray.py -> build/lib/xarray/tests copying xarray/tests/test_options.py -> build/lib/xarray/tests copying xarray/tests/test_nputils.py -> build/lib/xarray/tests copying xarray/tests/test_nd_point_index.py -> build/lib/xarray/tests copying xarray/tests/test_namedarray.py -> build/lib/xarray/tests copying xarray/tests/test_missing.py -> build/lib/xarray/tests copying xarray/tests/test_merge.py -> build/lib/xarray/tests copying xarray/tests/test_interp.py -> build/lib/xarray/tests copying xarray/tests/test_indexing.py -> build/lib/xarray/tests copying xarray/tests/test_indexes.py -> build/lib/xarray/tests copying xarray/tests/test_hashable.py -> build/lib/xarray/tests copying xarray/tests/test_groupby.py -> build/lib/xarray/tests copying xarray/tests/test_formatting_html.py -> build/lib/xarray/tests copying xarray/tests/test_formatting.py -> build/lib/xarray/tests copying xarray/tests/test_extensions.py -> build/lib/xarray/tests copying xarray/tests/test_error_messages.py -> build/lib/xarray/tests copying xarray/tests/test_duck_array_wrapping.py -> build/lib/xarray/tests copying xarray/tests/test_duck_array_ops.py -> build/lib/xarray/tests copying xarray/tests/test_dtypes.py -> build/lib/xarray/tests copying xarray/tests/test_distributed.py -> build/lib/xarray/tests copying xarray/tests/test_deprecation_helpers.py -> build/lib/xarray/tests copying xarray/tests/test_datatree_mapping.py -> build/lib/xarray/tests copying xarray/tests/test_datatree.py -> build/lib/xarray/tests copying xarray/tests/test_dataset.py -> build/lib/xarray/tests copying xarray/tests/test_dataarray.py -> build/lib/xarray/tests copying xarray/tests/test_dask.py -> build/lib/xarray/tests copying xarray/tests/test_cupy.py -> build/lib/xarray/tests copying xarray/tests/test_coordinates.py -> build/lib/xarray/tests copying xarray/tests/test_coordinate_transform.py -> build/lib/xarray/tests copying xarray/tests/test_conventions.py -> build/lib/xarray/tests copying xarray/tests/test_concat.py -> build/lib/xarray/tests copying xarray/tests/test_computation.py -> build/lib/xarray/tests copying xarray/tests/test_combine.py -> build/lib/xarray/tests copying xarray/tests/test_coding_times.py -> build/lib/xarray/tests copying xarray/tests/test_coding_strings.py -> build/lib/xarray/tests copying xarray/tests/test_coding.py -> build/lib/xarray/tests copying xarray/tests/test_coarsen.py -> build/lib/xarray/tests copying xarray/tests/test_cftimeindex_resample.py -> build/lib/xarray/tests copying xarray/tests/test_cftimeindex.py -> build/lib/xarray/tests copying xarray/tests/test_cftime_offsets.py -> build/lib/xarray/tests copying xarray/tests/test_calendar_ops.py -> build/lib/xarray/tests copying xarray/tests/test_backends_lru_cache.py -> build/lib/xarray/tests copying xarray/tests/test_backends_locks.py -> build/lib/xarray/tests copying xarray/tests/test_backends_file_manager.py -> build/lib/xarray/tests copying xarray/tests/test_backends_datatree.py -> build/lib/xarray/tests copying xarray/tests/test_backends_common.py -> build/lib/xarray/tests copying xarray/tests/test_backends_chunks.py -> build/lib/xarray/tests copying xarray/tests/test_backends_api.py -> build/lib/xarray/tests copying xarray/tests/test_assertions.py -> build/lib/xarray/tests copying xarray/tests/test_array_api.py -> build/lib/xarray/tests copying xarray/tests/test_accessor_str.py -> build/lib/xarray/tests copying xarray/tests/test_accessor_dt.py -> build/lib/xarray/tests copying xarray/tests/namespace.py -> build/lib/xarray/tests copying xarray/tests/indexes.py -> build/lib/xarray/tests copying xarray/tests/conftest.py -> build/lib/xarray/tests copying xarray/tests/arrays.py -> build/lib/xarray/tests copying xarray/tests/__init__.py -> build/lib/xarray/tests creating build/lib/xarray/testing copying xarray/testing/strategies.py -> build/lib/xarray/testing copying xarray/testing/assertions.py -> build/lib/xarray/testing copying xarray/testing/__init__.py -> build/lib/xarray/testing creating build/lib/xarray/structure copying xarray/structure/merge.py -> build/lib/xarray/structure copying xarray/structure/concat.py -> build/lib/xarray/structure copying xarray/structure/combine.py -> build/lib/xarray/structure copying xarray/structure/chunks.py -> build/lib/xarray/structure copying xarray/structure/alignment.py -> build/lib/xarray/structure copying xarray/structure/__init__.py -> build/lib/xarray/structure creating build/lib/xarray/static copying xarray/static/__init__.py -> build/lib/xarray/static creating build/lib/xarray/plot copying xarray/plot/utils.py -> build/lib/xarray/plot copying xarray/plot/facetgrid.py -> build/lib/xarray/plot copying xarray/plot/dataset_plot.py -> build/lib/xarray/plot copying xarray/plot/dataarray_plot.py -> build/lib/xarray/plot copying xarray/plot/accessor.py -> build/lib/xarray/plot copying xarray/plot/__init__.py -> build/lib/xarray/plot creating build/lib/xarray/namedarray copying xarray/namedarray/utils.py -> build/lib/xarray/namedarray copying xarray/namedarray/pycompat.py -> build/lib/xarray/namedarray copying xarray/namedarray/parallelcompat.py -> build/lib/xarray/namedarray copying xarray/namedarray/dtypes.py -> build/lib/xarray/namedarray copying xarray/namedarray/daskmanager.py -> build/lib/xarray/namedarray copying xarray/namedarray/core.py -> build/lib/xarray/namedarray copying xarray/namedarray/_typing.py -> build/lib/xarray/namedarray copying xarray/namedarray/_array_api.py -> build/lib/xarray/namedarray copying xarray/namedarray/_aggregations.py -> build/lib/xarray/namedarray copying xarray/namedarray/__init__.py -> build/lib/xarray/namedarray creating build/lib/xarray/indexes copying xarray/indexes/range_index.py -> build/lib/xarray/indexes copying xarray/indexes/nd_point_index.py -> build/lib/xarray/indexes copying xarray/indexes/__init__.py -> build/lib/xarray/indexes creating build/lib/xarray/core copying xarray/core/variable.py -> build/lib/xarray/core copying xarray/core/utils.py -> build/lib/xarray/core copying xarray/core/types.py -> build/lib/xarray/core copying xarray/core/treenode.py -> build/lib/xarray/core copying xarray/core/resample_cftime.py -> build/lib/xarray/core copying xarray/core/resample.py -> build/lib/xarray/core copying xarray/core/parallel.py -> build/lib/xarray/core copying xarray/core/options.py -> build/lib/xarray/core copying xarray/core/nputils.py -> build/lib/xarray/core copying xarray/core/missing.py -> build/lib/xarray/core copying xarray/core/indexing.py -> build/lib/xarray/core copying xarray/core/indexes.py -> build/lib/xarray/core copying xarray/core/groupby.py -> build/lib/xarray/core copying xarray/core/formatting_html.py -> build/lib/xarray/core copying xarray/core/formatting.py -> build/lib/xarray/core copying xarray/core/extensions.py -> build/lib/xarray/core copying xarray/core/extension_array.py -> build/lib/xarray/core copying xarray/core/duck_array_ops.py -> build/lib/xarray/core copying xarray/core/dtypes.py -> build/lib/xarray/core copying xarray/core/datatree_render.py -> build/lib/xarray/core copying xarray/core/datatree_mapping.py -> build/lib/xarray/core copying xarray/core/datatree.py -> build/lib/xarray/core copying xarray/core/dataset_variables.py -> build/lib/xarray/core copying xarray/core/dataset_utils.py -> build/lib/xarray/core copying xarray/core/dataset.py -> build/lib/xarray/core copying xarray/core/dataarray.py -> build/lib/xarray/core copying xarray/core/coordinates.py -> build/lib/xarray/core copying xarray/core/coordinate_transform.py -> build/lib/xarray/core copying xarray/core/common.py -> build/lib/xarray/core copying xarray/core/accessor_str.py -> build/lib/xarray/core copying xarray/core/accessor_dt.py -> build/lib/xarray/core copying xarray/core/_typed_ops.py -> build/lib/xarray/core copying xarray/core/_aggregations.py -> build/lib/xarray/core copying xarray/core/__init__.py -> build/lib/xarray/core creating build/lib/xarray/computation copying xarray/computation/weighted.py -> build/lib/xarray/computation copying xarray/computation/rolling_exp.py -> build/lib/xarray/computation copying xarray/computation/rolling.py -> build/lib/xarray/computation copying xarray/computation/ops.py -> build/lib/xarray/computation copying xarray/computation/nanops.py -> build/lib/xarray/computation copying xarray/computation/fit.py -> build/lib/xarray/computation copying xarray/computation/computation.py -> build/lib/xarray/computation copying xarray/computation/arithmetic.py -> build/lib/xarray/computation copying xarray/computation/apply_ufunc.py -> build/lib/xarray/computation copying xarray/computation/__init__.py -> build/lib/xarray/computation creating build/lib/xarray/compat copying xarray/compat/toolzcompat.py -> build/lib/xarray/compat copying xarray/compat/pdcompat.py -> build/lib/xarray/compat copying xarray/compat/npcompat.py -> build/lib/xarray/compat copying xarray/compat/dask_array_ops.py -> build/lib/xarray/compat copying xarray/compat/dask_array_compat.py -> build/lib/xarray/compat copying xarray/compat/array_api_compat.py -> build/lib/xarray/compat copying xarray/compat/__init__.py -> build/lib/xarray/compat creating build/lib/xarray/coding copying xarray/coding/variables.py -> build/lib/xarray/coding copying xarray/coding/times.py -> build/lib/xarray/coding copying xarray/coding/strings.py -> build/lib/xarray/coding copying xarray/coding/frequencies.py -> build/lib/xarray/coding copying xarray/coding/common.py -> build/lib/xarray/coding copying xarray/coding/cftimeindex.py -> build/lib/xarray/coding copying xarray/coding/cftime_offsets.py -> build/lib/xarray/coding copying xarray/coding/calendar_ops.py -> build/lib/xarray/coding copying xarray/coding/__init__.py -> build/lib/xarray/coding creating build/lib/xarray/backends copying xarray/backends/netCDF4_.py -> build/lib/xarray/backends copying xarray/backends/locks.py -> build/lib/xarray/backends copying xarray/backends/file_manager.py -> build/lib/xarray/backends copying xarray/backends/zarr.py -> build/lib/xarray/backends copying xarray/backends/writers.py -> build/lib/xarray/backends copying xarray/backends/store.py -> build/lib/xarray/backends copying xarray/backends/scipy_.py -> build/lib/xarray/backends copying xarray/backends/pydap_.py -> build/lib/xarray/backends copying xarray/backends/plugins.py -> build/lib/xarray/backends copying xarray/backends/netcdf3.py -> build/lib/xarray/backends copying xarray/backends/memory.py -> build/lib/xarray/backends copying xarray/backends/lru_cache.py -> build/lib/xarray/backends copying xarray/backends/h5netcdf_.py -> build/lib/xarray/backends copying xarray/backends/common.py -> build/lib/xarray/backends copying xarray/backends/chunks.py -> build/lib/xarray/backends copying xarray/backends/api.py -> build/lib/xarray/backends copying xarray/backends/__init__.py -> build/lib/xarray/backends creating build/lib/xarray/static/html copying xarray/static/html/__init__.py -> build/lib/xarray/static/html creating build/lib/xarray/static/css copying xarray/static/css/__init__.py -> build/lib/xarray/static/css running egg_info writing xarray.egg-info/PKG-INFO writing dependency_links to xarray.egg-info/dependency_links.txt writing entry points to xarray.egg-info/entry_points.txt writing requirements to xarray.egg-info/requires.txt writing top-level names to xarray.egg-info/top_level.txt reading manifest file 'xarray.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'xarray.egg-info/SOURCES.txt' copying xarray/py.typed -> build/lib/xarray copying xarray/tests/CLAUDE.md -> build/lib/xarray/tests copying xarray/tests/test_dataarray_typing.yml -> build/lib/xarray/tests copying xarray/tests/test_dataset_typing.yml -> build/lib/xarray/tests copying xarray/tests/test_datatree_typing.yml -> build/lib/xarray/tests creating build/lib/xarray/tests/data copying xarray/tests/data/bears.nc -> build/lib/xarray/tests/data copying xarray/tests/data/example.grib -> build/lib/xarray/tests/data copying xarray/tests/data/example.ict -> build/lib/xarray/tests/data copying xarray/tests/data/example.uamiv -> build/lib/xarray/tests/data copying xarray/tests/data/example_1.nc -> build/lib/xarray/tests/data copying xarray/tests/data/example_1.nc.gz -> build/lib/xarray/tests/data copying xarray/static/html/icons-svg-inline.html -> build/lib/xarray/static/html copying xarray/static/css/style.css -> build/lib/xarray/static/css installing to build/bdist.linux-x86_64/wheel running install running install_lib creating build/bdist.linux-x86_64/wheel creating build/bdist.linux-x86_64/wheel/xarray copying build/lib/xarray/py.typed -> build/bdist.linux-x86_64/wheel/./xarray creating build/bdist.linux-x86_64/wheel/xarray/backends copying build/lib/xarray/backends/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/api.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/chunks.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/common.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/h5netcdf_.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/lru_cache.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/memory.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/netcdf3.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/plugins.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/pydap_.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/scipy_.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/store.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/writers.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/zarr.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/file_manager.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/locks.py -> build/bdist.linux-x86_64/wheel/./xarray/backends copying build/lib/xarray/backends/netCDF4_.py -> build/bdist.linux-x86_64/wheel/./xarray/backends creating build/bdist.linux-x86_64/wheel/xarray/coding copying build/lib/xarray/coding/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/calendar_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/cftime_offsets.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/cftimeindex.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/common.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/frequencies.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/strings.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/times.py -> build/bdist.linux-x86_64/wheel/./xarray/coding copying build/lib/xarray/coding/variables.py -> build/bdist.linux-x86_64/wheel/./xarray/coding creating build/bdist.linux-x86_64/wheel/xarray/compat copying build/lib/xarray/compat/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/array_api_compat.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/dask_array_compat.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/dask_array_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/npcompat.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/pdcompat.py -> build/bdist.linux-x86_64/wheel/./xarray/compat copying build/lib/xarray/compat/toolzcompat.py -> build/bdist.linux-x86_64/wheel/./xarray/compat creating build/bdist.linux-x86_64/wheel/xarray/computation copying build/lib/xarray/computation/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/apply_ufunc.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/arithmetic.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/computation.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/fit.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/nanops.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/ops.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/rolling.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/rolling_exp.py -> build/bdist.linux-x86_64/wheel/./xarray/computation copying build/lib/xarray/computation/weighted.py -> build/bdist.linux-x86_64/wheel/./xarray/computation creating build/bdist.linux-x86_64/wheel/xarray/core copying build/lib/xarray/core/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/_aggregations.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/_typed_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/accessor_dt.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/accessor_str.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/common.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/coordinate_transform.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/coordinates.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/dataarray.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/dataset.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/dataset_utils.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/dataset_variables.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/datatree.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/datatree_mapping.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/datatree_render.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/dtypes.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/duck_array_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/extension_array.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/extensions.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/formatting.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/formatting_html.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/groupby.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/indexes.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/indexing.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/missing.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/nputils.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/options.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/parallel.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/resample.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/resample_cftime.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/treenode.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/types.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/utils.py -> build/bdist.linux-x86_64/wheel/./xarray/core copying build/lib/xarray/core/variable.py -> build/bdist.linux-x86_64/wheel/./xarray/core creating build/bdist.linux-x86_64/wheel/xarray/indexes copying build/lib/xarray/indexes/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/indexes copying build/lib/xarray/indexes/nd_point_index.py -> build/bdist.linux-x86_64/wheel/./xarray/indexes copying build/lib/xarray/indexes/range_index.py -> build/bdist.linux-x86_64/wheel/./xarray/indexes creating build/bdist.linux-x86_64/wheel/xarray/namedarray copying build/lib/xarray/namedarray/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/_aggregations.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/_array_api.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/_typing.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/core.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/daskmanager.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/dtypes.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/parallelcompat.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/pycompat.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray copying build/lib/xarray/namedarray/utils.py -> build/bdist.linux-x86_64/wheel/./xarray/namedarray creating build/bdist.linux-x86_64/wheel/xarray/plot copying build/lib/xarray/plot/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/plot copying build/lib/xarray/plot/accessor.py -> build/bdist.linux-x86_64/wheel/./xarray/plot copying build/lib/xarray/plot/dataarray_plot.py -> build/bdist.linux-x86_64/wheel/./xarray/plot copying build/lib/xarray/plot/dataset_plot.py -> build/bdist.linux-x86_64/wheel/./xarray/plot copying build/lib/xarray/plot/facetgrid.py -> build/bdist.linux-x86_64/wheel/./xarray/plot copying build/lib/xarray/plot/utils.py -> build/bdist.linux-x86_64/wheel/./xarray/plot creating build/bdist.linux-x86_64/wheel/xarray/static creating build/bdist.linux-x86_64/wheel/xarray/static/css copying build/lib/xarray/static/css/style.css -> build/bdist.linux-x86_64/wheel/./xarray/static/css copying build/lib/xarray/static/css/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/static/css creating build/bdist.linux-x86_64/wheel/xarray/static/html copying build/lib/xarray/static/html/icons-svg-inline.html -> build/bdist.linux-x86_64/wheel/./xarray/static/html copying build/lib/xarray/static/html/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/static/html copying build/lib/xarray/static/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/static creating build/bdist.linux-x86_64/wheel/xarray/structure copying build/lib/xarray/structure/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/structure copying build/lib/xarray/structure/alignment.py -> build/bdist.linux-x86_64/wheel/./xarray/structure copying build/lib/xarray/structure/chunks.py -> build/bdist.linux-x86_64/wheel/./xarray/structure copying build/lib/xarray/structure/combine.py -> build/bdist.linux-x86_64/wheel/./xarray/structure copying build/lib/xarray/structure/concat.py -> build/bdist.linux-x86_64/wheel/./xarray/structure copying build/lib/xarray/structure/merge.py -> build/bdist.linux-x86_64/wheel/./xarray/structure creating build/bdist.linux-x86_64/wheel/xarray/testing copying build/lib/xarray/testing/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/testing copying build/lib/xarray/testing/assertions.py -> build/bdist.linux-x86_64/wheel/./xarray/testing copying build/lib/xarray/testing/strategies.py -> build/bdist.linux-x86_64/wheel/./xarray/testing creating build/bdist.linux-x86_64/wheel/xarray/tests creating build/bdist.linux-x86_64/wheel/xarray/tests/data copying build/lib/xarray/tests/data/example_1.nc.gz -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/data/example_1.nc -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/data/example.uamiv -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/data/example.ict -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/data/example.grib -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/data/bears.nc -> build/bdist.linux-x86_64/wheel/./xarray/tests/data copying build/lib/xarray/tests/test_datatree_typing.yml -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dataset_typing.yml -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dataarray_typing.yml -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/CLAUDE.md -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/arrays.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/conftest.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/indexes.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/namespace.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_accessor_dt.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_accessor_str.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_array_api.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_assertions.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_api.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_chunks.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_common.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_datatree.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_file_manager.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_locks.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends_lru_cache.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_calendar_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_cftime_offsets.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_cftimeindex.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_cftimeindex_resample.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coarsen.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coding.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coding_strings.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coding_times.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_combine.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_computation.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_concat.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_conventions.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coordinate_transform.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_coordinates.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_cupy.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dask.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dataarray.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dataset.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_datatree.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_datatree_mapping.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_deprecation_helpers.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_distributed.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_dtypes.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_duck_array_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_duck_array_wrapping.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_error_messages.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_extensions.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_formatting.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_formatting_html.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_groupby.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_hashable.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_indexes.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_indexing.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_interp.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_merge.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_missing.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_namedarray.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_nd_point_index.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_nputils.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_options.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_pandas_to_xarray.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_parallelcompat.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_plot.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_plugins.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_print_versions.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_range_index.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_rolling.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_sparse.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_strategies.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_treenode.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_tutorial.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_typed_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_ufuncs.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_units.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_utils.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_variable.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_weighted.py -> build/bdist.linux-x86_64/wheel/./xarray/tests copying build/lib/xarray/tests/test_backends.py -> build/bdist.linux-x86_64/wheel/./xarray/tests creating build/bdist.linux-x86_64/wheel/xarray/util copying build/lib/xarray/util/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray/util copying build/lib/xarray/util/deprecation_helpers.py -> build/bdist.linux-x86_64/wheel/./xarray/util copying build/lib/xarray/util/generate_aggregations.py -> build/bdist.linux-x86_64/wheel/./xarray/util copying build/lib/xarray/util/generate_ops.py -> build/bdist.linux-x86_64/wheel/./xarray/util copying build/lib/xarray/util/print_versions.py -> build/bdist.linux-x86_64/wheel/./xarray/util copying build/lib/xarray/__init__.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/coders.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/conventions.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/convert.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/groupers.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/tutorial.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/typing.py -> build/bdist.linux-x86_64/wheel/./xarray copying build/lib/xarray/ufuncs.py -> build/bdist.linux-x86_64/wheel/./xarray running install_egg_info Copying xarray.egg-info to build/bdist.linux-x86_64/wheel/./xarray-2025.12.0-py3.14.egg-info running install_scripts creating build/bdist.linux-x86_64/wheel/xarray-2025.12.0.dist-info/WHEEL creating '/builddir/.cache/pip/wheels/89/97/72/11e2e7be2c9172d51d8f8e5c8b48bd426f80036ba4fdb1f907/tmpzbdo_lsb/.tmp-qsvkvm9q/xarray-2025.12.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it adding 'xarray/__init__.py' adding 'xarray/coders.py' adding 'xarray/conventions.py' adding 'xarray/convert.py' adding 'xarray/groupers.py' adding 'xarray/py.typed' adding 'xarray/tutorial.py' adding 'xarray/typing.py' adding 'xarray/ufuncs.py' adding 'xarray/backends/__init__.py' adding 'xarray/backends/api.py' adding 'xarray/backends/chunks.py' adding 'xarray/backends/common.py' adding 'xarray/backends/file_manager.py' adding 'xarray/backends/h5netcdf_.py' adding 'xarray/backends/locks.py' adding 'xarray/backends/lru_cache.py' adding 'xarray/backends/memory.py' adding 'xarray/backends/netCDF4_.py' adding 'xarray/backends/netcdf3.py' adding 'xarray/backends/plugins.py' adding 'xarray/backends/pydap_.py' adding 'xarray/backends/scipy_.py' adding 'xarray/backends/store.py' adding 'xarray/backends/writers.py' adding 'xarray/backends/zarr.py' adding 'xarray/coding/__init__.py' adding 'xarray/coding/calendar_ops.py' adding 'xarray/coding/cftime_offsets.py' adding 'xarray/coding/cftimeindex.py' adding 'xarray/coding/common.py' adding 'xarray/coding/frequencies.py' adding 'xarray/coding/strings.py' adding 'xarray/coding/times.py' adding 'xarray/coding/variables.py' adding 'xarray/compat/__init__.py' adding 'xarray/compat/array_api_compat.py' adding 'xarray/compat/dask_array_compat.py' adding 'xarray/compat/dask_array_ops.py' adding 'xarray/compat/npcompat.py' adding 'xarray/compat/pdcompat.py' adding 'xarray/compat/toolzcompat.py' adding 'xarray/computation/__init__.py' adding 'xarray/computation/apply_ufunc.py' adding 'xarray/computation/arithmetic.py' adding 'xarray/computation/computation.py' adding 'xarray/computation/fit.py' adding 'xarray/computation/nanops.py' adding 'xarray/computation/ops.py' adding 'xarray/computation/rolling.py' adding 'xarray/computation/rolling_exp.py' adding 'xarray/computation/weighted.py' adding 'xarray/core/__init__.py' adding 'xarray/core/_aggregations.py' adding 'xarray/core/_typed_ops.py' adding 'xarray/core/accessor_dt.py' adding 'xarray/core/accessor_str.py' adding 'xarray/core/common.py' adding 'xarray/core/coordinate_transform.py' adding 'xarray/core/coordinates.py' adding 'xarray/core/dataarray.py' adding 'xarray/core/dataset.py' adding 'xarray/core/dataset_utils.py' adding 'xarray/core/dataset_variables.py' adding 'xarray/core/datatree.py' adding 'xarray/core/datatree_mapping.py' adding 'xarray/core/datatree_render.py' adding 'xarray/core/dtypes.py' adding 'xarray/core/duck_array_ops.py' adding 'xarray/core/extension_array.py' adding 'xarray/core/extensions.py' adding 'xarray/core/formatting.py' adding 'xarray/core/formatting_html.py' adding 'xarray/core/groupby.py' adding 'xarray/core/indexes.py' adding 'xarray/core/indexing.py' adding 'xarray/core/missing.py' adding 'xarray/core/nputils.py' adding 'xarray/core/options.py' adding 'xarray/core/parallel.py' adding 'xarray/core/resample.py' adding 'xarray/core/resample_cftime.py' adding 'xarray/core/treenode.py' adding 'xarray/core/types.py' adding 'xarray/core/utils.py' adding 'xarray/core/variable.py' adding 'xarray/indexes/__init__.py' adding 'xarray/indexes/nd_point_index.py' adding 'xarray/indexes/range_index.py' adding 'xarray/namedarray/__init__.py' adding 'xarray/namedarray/_aggregations.py' adding 'xarray/namedarray/_array_api.py' adding 'xarray/namedarray/_typing.py' adding 'xarray/namedarray/core.py' adding 'xarray/namedarray/daskmanager.py' adding 'xarray/namedarray/dtypes.py' adding 'xarray/namedarray/parallelcompat.py' adding 'xarray/namedarray/pycompat.py' adding 'xarray/namedarray/utils.py' adding 'xarray/plot/__init__.py' adding 'xarray/plot/accessor.py' adding 'xarray/plot/dataarray_plot.py' adding 'xarray/plot/dataset_plot.py' adding 'xarray/plot/facetgrid.py' adding 'xarray/plot/utils.py' adding 'xarray/static/__init__.py' adding 'xarray/static/css/__init__.py' adding 'xarray/static/css/style.css' adding 'xarray/static/html/__init__.py' adding 'xarray/static/html/icons-svg-inline.html' adding 'xarray/structure/__init__.py' adding 'xarray/structure/alignment.py' adding 'xarray/structure/chunks.py' adding 'xarray/structure/combine.py' adding 'xarray/structure/concat.py' adding 'xarray/structure/merge.py' adding 'xarray/testing/__init__.py' adding 'xarray/testing/assertions.py' adding 'xarray/testing/strategies.py' adding 'xarray/tests/CLAUDE.md' adding 'xarray/tests/__init__.py' adding 'xarray/tests/arrays.py' adding 'xarray/tests/conftest.py' adding 'xarray/tests/indexes.py' adding 'xarray/tests/namespace.py' adding 'xarray/tests/test_accessor_dt.py' adding 'xarray/tests/test_accessor_str.py' adding 'xarray/tests/test_array_api.py' adding 'xarray/tests/test_assertions.py' adding 'xarray/tests/test_backends.py' adding 'xarray/tests/test_backends_api.py' adding 'xarray/tests/test_backends_chunks.py' adding 'xarray/tests/test_backends_common.py' adding 'xarray/tests/test_backends_datatree.py' adding 'xarray/tests/test_backends_file_manager.py' adding 'xarray/tests/test_backends_locks.py' adding 'xarray/tests/test_backends_lru_cache.py' adding 'xarray/tests/test_calendar_ops.py' adding 'xarray/tests/test_cftime_offsets.py' adding 'xarray/tests/test_cftimeindex.py' adding 'xarray/tests/test_cftimeindex_resample.py' adding 'xarray/tests/test_coarsen.py' adding 'xarray/tests/test_coding.py' adding 'xarray/tests/test_coding_strings.py' adding 'xarray/tests/test_coding_times.py' adding 'xarray/tests/test_combine.py' adding 'xarray/tests/test_computation.py' adding 'xarray/tests/test_concat.py' adding 'xarray/tests/test_conventions.py' adding 'xarray/tests/test_coordinate_transform.py' adding 'xarray/tests/test_coordinates.py' adding 'xarray/tests/test_cupy.py' adding 'xarray/tests/test_dask.py' adding 'xarray/tests/test_dataarray.py' adding 'xarray/tests/test_dataarray_typing.yml' adding 'xarray/tests/test_dataset.py' adding 'xarray/tests/test_dataset_typing.yml' adding 'xarray/tests/test_datatree.py' adding 'xarray/tests/test_datatree_mapping.py' adding 'xarray/tests/test_datatree_typing.yml' adding 'xarray/tests/test_deprecation_helpers.py' adding 'xarray/tests/test_distributed.py' adding 'xarray/tests/test_dtypes.py' adding 'xarray/tests/test_duck_array_ops.py' adding 'xarray/tests/test_duck_array_wrapping.py' adding 'xarray/tests/test_error_messages.py' adding 'xarray/tests/test_extensions.py' adding 'xarray/tests/test_formatting.py' adding 'xarray/tests/test_formatting_html.py' adding 'xarray/tests/test_groupby.py' adding 'xarray/tests/test_hashable.py' adding 'xarray/tests/test_indexes.py' adding 'xarray/tests/test_indexing.py' adding 'xarray/tests/test_interp.py' adding 'xarray/tests/test_merge.py' adding 'xarray/tests/test_missing.py' adding 'xarray/tests/test_namedarray.py' adding 'xarray/tests/test_nd_point_index.py' adding 'xarray/tests/test_nputils.py' adding 'xarray/tests/test_options.py' adding 'xarray/tests/test_pandas_to_xarray.py' adding 'xarray/tests/test_parallelcompat.py' adding 'xarray/tests/test_plot.py' adding 'xarray/tests/test_plugins.py' adding 'xarray/tests/test_print_versions.py' adding 'xarray/tests/test_range_index.py' adding 'xarray/tests/test_rolling.py' adding 'xarray/tests/test_sparse.py' adding 'xarray/tests/test_strategies.py' adding 'xarray/tests/test_treenode.py' adding 'xarray/tests/test_tutorial.py' adding 'xarray/tests/test_typed_ops.py' adding 'xarray/tests/test_ufuncs.py' adding 'xarray/tests/test_units.py' adding 'xarray/tests/test_utils.py' adding 'xarray/tests/test_variable.py' adding 'xarray/tests/test_weighted.py' adding 'xarray/tests/data/bears.nc' adding 'xarray/tests/data/example.grib' adding 'xarray/tests/data/example.ict' adding 'xarray/tests/data/example.uamiv' adding 'xarray/tests/data/example_1.nc' adding 'xarray/tests/data/example_1.nc.gz' adding 'xarray/util/__init__.py' adding 'xarray/util/deprecation_helpers.py' adding 'xarray/util/generate_aggregations.py' adding 'xarray/util/generate_ops.py' adding 'xarray/util/print_versions.py' adding 'xarray-2025.12.0.dist-info/licenses/LICENSE' adding 'xarray-2025.12.0.dist-info/METADATA' adding 'xarray-2025.12.0.dist-info/WHEEL' adding 'xarray-2025.12.0.dist-info/entry_points.txt' adding 'xarray-2025.12.0.dist-info/top_level.txt' adding 'xarray-2025.12.0.dist-info/RECORD' removing build/bdist.linux-x86_64/wheel Building wheel for xarray (pyproject.toml): finished with status 'done' Created wheel for xarray: filename=xarray-2025.12.0-py3-none-any.whl size=1379498 sha256=acaabbab86a9240b3bb1f4a66454d053ed3a7467dc775184ec1f217f538301ee Stored in directory: /builddir/.cache/pip/wheels/89/97/72/11e2e7be2c9172d51d8f8e5c8b48bd426f80036ba4fdb1f907 Successfully built xarray + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.vGzPlo + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-build + '[' /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT ++ dirname /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT + mkdir -p /builddir/build/BUILD/python-xarray-2025.12.0-build + mkdir /builddir/build/BUILD/python-xarray-2025.12.0-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 xarray-2025.12.0 ++ ls /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir/xarray-2025.12.0-py3-none-any.whl ++ xargs basename --multiple ++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/' + specifier=xarray==2025.12.0 + '[' -z xarray==2025.12.0 ']' + TMPDIR=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir + /usr/bin/python3 -m pip install --root /builddir/build/BUILD/python-xarray-2025.12.0-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-xarray-2025.12.0-build/pyproject-wheeldir xarray==2025.12.0 Using pip 25.3 from /usr/lib/python3.14/site-packages/pip (python 3.14) Looking in links: /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir Processing /builddir/build/BUILD/python-xarray-2025.12.0-build/pyproject-wheeldir/xarray-2025.12.0-py3-none-any.whl Installing collected packages: xarray Successfully installed xarray-2025.12.0 + '[' -d /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/bin ']' + rm -f /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-ghost-distinfo + site_dirs=() + '[' -d /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + site_dirs+=("/usr/lib/python3.14/site-packages") + '[' /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib64/python3.14/site-packages '!=' /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + '[' -d /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib64/python3.14/site-packages ']' + for site_dir in ${site_dirs[@]} + for distinfo in /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT$site_dir/*.dist-info + echo '%ghost %dir /usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info' + sed -i s/pip/rpm/ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.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-xarray-2025.12.0-build/BUILDROOT --record /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info/RECORD --output /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-record + rm -fv /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info/RECORD removed '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info/RECORD' + rm -fv /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info/REQUESTED removed '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray-2025.12.0.dist-info/REQUESTED' ++ wc -l /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.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-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-files --output-modules /builddir/build/BUILD/python-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-modules --buildroot /builddir/build/BUILD/python-xarray-2025.12.0-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-xarray-2025.12.0-build/python-xarray-2025.12.0-2.fc44.x86_64-pyproject-record --prefix /usr -l xarray + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + COMPRESS='gzip -9 -n' + COMPRESS_EXT=.gz + /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/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 -j4 Bytecompiling .py files below /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14 using python3.14 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-det --brp -j4 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/typing.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/tutorial.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/ufuncs.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/convert.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/coders.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/conventions.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/util/__pycache__/print_versions.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/util/__pycache__/generate_ops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/util/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/groupers.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/util/__pycache__/deprecation_helpers.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/__pycache__/groupers.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/util/__pycache__/generate_aggregations.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_weighted.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_weighted.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_utils.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_utils.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_variable.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_variable.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_units.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_ufuncs.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_indexing.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_ufuncs.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_typed_ops.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_typed_ops.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_tutorial.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_units.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_treenode.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_strategies.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_treenode.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_strategies.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_indexing.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_print_versions.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_print_versions.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_plugins.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_sparse.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_plugins.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_sparse.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_indexes.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dataset.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_rolling.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_indexes.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_hashable.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_rolling.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_range_index.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_range_index.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_namedarray.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dataset.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_namedarray.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_missing.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_missing.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_plot.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_merge.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_plot.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_merge.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_parallelcompat.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_parallelcompat.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_interp.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_pandas_to_xarray.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_pandas_to_xarray.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dataarray.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_options.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_options.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_nputils.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_nputils.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_nd_point_index.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_nd_point_index.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_interp.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_duck_array_wrapping.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_formatting_html.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_formatting_html.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_groupby.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_duck_array_wrapping.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_duck_array_ops.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_conventions.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_conventions.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_formatting.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_formatting.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_extensions.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_extensions.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dtypes.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_error_messages.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_duck_array_ops.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_deprecation_helpers.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dtypes.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_deprecation_helpers.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_distributed.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_distributed.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_concat.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_datatree_mapping.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_common.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_common.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_chunks.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_datatree_mapping.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_chunks.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_concat.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_api.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_api.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_datatree.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_computation.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_groupby.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_computation.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dask.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_datatree.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dataarray.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_combine.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cupy.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cupy.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_dask.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coordinates.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coordinate_transform.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coordinates.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_combine.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coordinate_transform.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftimeindex_resample.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_assertions.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftimeindex_resample.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_assertions.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding_times.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftimeindex.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_array_api.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_array_api.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftimeindex.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftime_offsets.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding_times.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_accessor_str.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding_strings.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding_strings.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coding.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_cftime_offsets.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coarsen.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_lru_cache.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_lru_cache.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_coarsen.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_locks.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_locks.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_file_manager.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_calendar_ops.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_file_manager.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_calendar_ops.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_accessor_str.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_accessor_dt.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_datatree.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/namespace.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/indexes.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_accessor_dt.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/indexes.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/conftest.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/__init__.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/arrays.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/__init__.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/__pycache__/strategies.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/__pycache__/assertions.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/__pycache__/assertions.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/concat.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends_datatree.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/concat.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/combine.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/chunks.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/merge.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/merge.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/static/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/static/html/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/alignment.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/static/css/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/structure/__pycache__/alignment.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/facetgrid.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/facetgrid.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__pycache__/test_backends.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/dataset_plot.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/dataset_plot.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/dataarray_plot.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/utils.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/utils.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/dtypes.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/dataarray_plot.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/utils.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/daskmanager.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/pycompat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/__pycache__/accessor.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/parallelcompat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/_array_api.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/_typing.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/core.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/_aggregations.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/indexes/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/indexes/__pycache__/nd_point_index.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/namedarray/__pycache__/core.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/indexes/__pycache__/nd_point_index.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/indexes/__pycache__/range_index.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/missing.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/variable.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/indexing.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/datatree.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/indexing.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/utils.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataset_variables.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/types.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataset_variables.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataset_utils.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/utils.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/indexes.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/variable.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/resample.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/indexes.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/treenode.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/resample_cftime.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/parallel.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/parallel.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/options.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/treenode.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/nputils.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/groupby.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/accessor_str.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/formatting_html.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/groupby.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/accessor_dt.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataset.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataarray.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/formatting.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/formatting.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/extensions.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataarray.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/extension_array.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/coordinates.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/duck_array_ops.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/coordinate_transform.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/duck_array_ops.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/common.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dtypes.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/dataset.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/datatree_render.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/datatree_render.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/_typed_ops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/datatree_mapping.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/rolling_exp.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/fit.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/_aggregations.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/computation.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/arithmetic.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/weighted.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/ops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/nanops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/__pycache__/common.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/toolzcompat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/pdcompat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/npcompat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/rolling.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/dask_array_compat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/dask_array_ops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/compat/__pycache__/array_api_compat.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/common.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/common.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/variables.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/apply_ufunc.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/computation/__pycache__/apply_ufunc.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/cftimeindex.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/strings.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/times.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/calendar_ops.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/frequencies.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/frequencies.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/times.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/coding/__pycache__/cftime_offsets.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/locks.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/writers.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/h5netcdf_.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/netcdf3.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/store.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/store.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/writers.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/scipy_.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/zarr.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/file_manager.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/scipy_.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/chunks.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/netCDF4_.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/pydap_.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/zarr.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/file_manager.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/plugins.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/api.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/netCDF4_.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/memory.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/lru_cache.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/common.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/backends/__pycache__/common.cpython-314.pyc: replacing with normalized version Scanned 40 directories and 604 files, processed 301 inodes, 299 modified (208 replaced + 91 rewritten), 0 unsupported format, 0 errors + /usr/bin/linkdupes --brp /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr Scanned 39 directories and 604 files, considered 604 files, read 26 files, linked 10 files, 0 errors sum of sizes of linked files: 0 bytes Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.GyIMb4 + umask 022 + cd /builddir/build/BUILD/python-xarray-2025.12.0-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 xarray-2025.12.0 + rm -rf xarray + echo + pytest_args=(-n auto -m "not network" -k 'not test_save_mfdataset_compute_false_roundtrip') + 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-xarray-2025.12.0-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_ADDOPTS=' --ignore=/builddir/build/BUILD/python-xarray-2025.12.0-build/.pyproject-builddir' + PYTEST_XDIST_AUTO_NUM_WORKERS=4 + /usr/bin/pytest -ra -n auto -m 'not network' -k 'not test_save_mfdataset_compute_false_roundtrip' --pyargs xarray --timeout 300 --full-trace ============================= test session starts ============================== platform linux -- Python 3.14.2, pytest-8.4.2, pluggy-1.6.0 rootdir: /builddir/build/BUILD/python-xarray-2025.12.0-build/xarray-2025.12.0 configfile: pytest.ini plugins: timeout-2.4.0, asyncio-1.1.0, xdist-3.7.0 timeout: 300.0s timeout method: signal timeout func_only: False asyncio: mode=Mode.STRICT, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function created: 4/4 workers 4 workers [19113 items] ssssssss.ssss.s.s.s.s.s..s.s.sss.s.s.s.s.sss..ss.ss.s..ss.s.s..s.s.ss.ss [ 0%] .ss..s.ss.ss.ss..ssss...s.s.s.ss.sss..s.s.sss.ss.ss..s.ss...sss.s....... [ 0%] ........................................................................ [ 1%] ........................................................................ [ 1%] ........................................................................ [ 1%] .........................s.............................................. [ 2%] ........................................................................ [ 2%] ........................................................................ [ 3%] ........................................................................ [ 3%] .....................x.................................................. [ 3%] ........................................................................ [ 4%] ...........................................x............................ [ 4%] ........................................................................ [ 4%] ........................................................................ [ 5%] ...................................................................s.sss [ 5%] ss...........s...........s........................s..................... [ 6%] ...............................................sx...............s....... [ 6%] ........................................................................ [ 6%] ...................x.................................................... [ 7%] ......s................................................................. [ 7%] ........................................................................ [ 7%] ........................................................................ [ 8%] ...........................................s....s.........s............. [ 8%] ........................................................................ [ 9%] ......................................................ss................ [ 9%] ........................................................................ [ 9%] ........................................................................ [ 10%] ..........................................s..ss......................... [ 10%] ........................................................................ [ 10%] ........................................................................ [ 11%] ........................................................................ [ 11%] ........................................................................ [ 12%] ........................................................................ [ 12%] ........................................................................ [ 12%] ........................................................................ [ 13%] ........................................................................ [ 13%] ........................................................................ [ 13%] ........................................................................ [ 14%] ........................................................................ [ 14%] ........................................................................ [ 15%] ..................................s..s.................................. [ 15%] ........................................................................ [ 15%] ........................................................................ [ 16%] ........................................................................ [ 16%] ............s...................x....................................... [ 16%] ........................................................................ [ 17%] ......................................................................x. [ 17%] .........................x.....s.......ss.ss.s...............s.......... [ 18%] ............s.....................s...................................x. [ 18%] ..................s....s..................s............................. [ 18%] .............................x.......................................... [ 19%] ......................................ssssssssssssss.sssssssssssssssssss [ 19%] sssssssssssssss.ssssssss.................................s.............. [ 19%] .x.....................s................................................ [ 20%] .................................................................s...... [ 20%] ...s.........................................s.......................... [ 21%] ...............................s.................ss..................... [ 21%] ........................................................................ [ 21%] ........................................................................ [ 22%] ................................s....................................... [ 22%] ...............................................x........................ [ 22%] ......................s.ss.............................................. [ 23%] s..................sssssssssssssssssssssssssssssssssssss.sxssssssssssss. [ 23%] sssssssssss.sss................................................s........ [ 24%] ........................................................................ [ 24%] .................s...................................................... [ 24%] ........................................................................ [ 25%] ..........................................s..s....s..................... [ 25%] ...........ss......................................s.................... [ 25%] ............s..............................................s..........x. [ 26%] .s.................x..s..sssss....................s..sx...s......s...... [ 26%] ............s...........................s.............................s. [ 27%] ............s.............s................x..s...............s......... [ 27%] s............s.................sss..........s.........s.........s.x.x... [ 27%] s...................................................s..........s........ [ 28%] ........................................................................ [ 28%] .............s.s..................x......s.............................. [ 29%] s.......................................X..X....X....................... [ 29%] ..............sss....................................................... [ 29%] ................................................s....................... [ 30%] ........................................................................ [ 30%] .....................................................ss................. [ 30%] .......x.....s.......................................................... [ 31%] ........................................................................ [ 31%] ..............x.....s....................s.............................. [ 32%] ........................................................s............... [ 32%] ..s..................................................................... [ 32%] ................s....................................................... [ 33%] ..............ss.sssss.sssssss.sssssss.sssssss.ssssss................sss [ 33%] s.sss.ssssss.ssss.sss.sssssssssss.sss.ssssssss.ssssssssss.ssssssssss.sss [ 33%] ssssssss.ssssssssss.ssssssssss.ssss..................................... [ 34%] ........................................x....s...................F...... [ 34%] ......................x......F...........x.....s........................ [ 35%] ...........s......F...........................................F......... [ 35%] ...............s.....................F.........................x........ [ 35%] .................................F......................s............... [ 36%] ........s...........................F................................... [ 36%] ..................................................s...................F. [ 36%] ........................................................................ [ 37%] ......................................x.....s........................... [ 37%] .......s.......F........................x.......s.........F............. [ 38%] ............s...........................F............................... [ 38%] ..........................................s..............F.............. [ 38%] ..............................F....................................F..ss [ 39%] .sss.s.ss......s........s.......F.......s.....................s......... [ 39%] ...............s........................s............s.........X.s...... [ 39%] ..s......s..............................s..........................s.... [ 40%] s...s....s............s.........s....................................... [ 40%] ................s.....s....s...s....s.s.s.s.s.s......x.................. [ 41%] ........................................................................ [ 41%] ........................................................................ [ 41%] ..................................................x..........s.......... [ 42%] ............................................................x..........s [ 42%] ........................................................................ [ 42%] ........s............................................................... [ 43%] ...X...............ss............x.........................s............ [ 43%] .................................s...................................... [ 44%] .......................................s..............................X. [ 44%] ....................................................s....x.............. [ 44%] ...................x....s............................................... [ 45%] ..................x......s.....................s........................ [ 45%] ........................s............................X.................F [ 45%] ........................................................................ [ 46%] ..............................................................s......... [ 46%] ........................................................................ [ 47%] ........................................................................ [ 47%] ........................................................................ [ 47%] ........................................................................ [ 48%] ........................................................................ [ 48%] ...............................................x........................ [ 48%] ...............................................x.............s.......... [ 49%] ................................................................s....... [ 49%] .........x........s...x....................x.s...........s..ss.......... [ 50%] ..x..s..........................s.................................s..... [ 50%] .x....................................x............................x.... [ 50%] ............................s.......................sssssssssssss....... [ 51%] .....x....................................x........................s.s.. [ 51%] ......................................................sss............... [ 51%] ........................................................................ [ 52%] ..........................................x...........sssss.sss......... [ 52%] ....sssss.sss.ss.........X......ssssss...................ssss.ss.x.s.... [ 53%] ...............ssssss...............ssssxss....................x...sssss [ 53%] ssssss.s..s...s..s...s.s.ss.ss.sss.ss......s........sss.....s.......s... [ 53%] ..........s.s.s.s..s.s.s.s.s.s.s....s...s...s..s...s.s.s.ss.s.s.ss.s.s.. [ 54%] ....s.......s.....s....s...........s.s.s.s.s.s.s..s..s.s..s..s..s..sss.s [ 54%] ss.s........s.........s....s...s....s.....s..............s.s..s.s..s.s.s [ 54%] .....s....s.....s....s...s...s.sss.ssss....s...s..x....s..........s..... [ 55%] ...s.........s.......................................................... [ 55%] ........................................................................ [ 56%] ...................................x.................................... [ 56%] .............................x.......................................... [ 56%] ........................................................................ [ 57%] ..........................................s.ss.......................... [ 57%] ........................................................................ [ 58%] ........................................................................ [ 58%] ........................................................................ [ 58%] .............ss...s..ss..X.s...........x.....ss......................ss. [ 59%] s.....ss....................xss.s......ss........s.sxss...s.........s.s. [ 59%] .....x.ss.....s...ss....s..ss................x..s.......ss.............x [ 59%] ss.......xs....x.s.s...............x.s..........xs.s.....s...ss.s....... [ 60%] ....xss..s..s.s......s.s.sss.s..ss..s..ss.s......ss...........xss.s..... [ 60%] .........................xssxs...........xss...s.ss.s.s.s.s.........ss.. [ 61%] ......xs.s..s.....ss....xs.s...s...ss...s..ss.s.ss..s.s.s.s........ss... [ 61%] .........ss................xss..s.s.sss.s....s.s..s.....ss.....s....s.sX [ 61%] .s...........................xss...s...ssss....s................X.....xs [ 62%] s.s.xX...xss.x..s...........................x.ss.s..........xs.s..s..... [ 62%] ......x.ss....s.........s.......s.s.xss.s..s............................ [ 62%] ................s...s.........xs.s..s..............................xss.. [ 63%] s.........x.s.s.s..................s.s.s.s.ss.s.s.ss..x.s.s....s..s.s..s [ 63%] ..sssss..sssss.ssssss.s.s.s..s...ss..s.s.s.s..ss....s...s.s......s....s. [ 64%] s....s.ss.s.ss.s.s.s.ss.s..s.s.s..ss.s..ss.s.ss..s.ss...s..s.s...s..ss.. [ 64%] s.s.s.......................x.s................xss.s.s.s..s.ss.s..ss.... [ 64%] ..................xs..ss..s..ss....................xs.........ss........ [ 65%] .......x.ss.s.ss..s..ss.s.s.s............x.s..........xss.s..ss.s...ss.. [ 65%] s..ss..s..s.s..s..s.s..s...ss..s....ss.................................. [ 65%] ..........F............................................F................ [ 66%] ......F..........F.......x.............................F................ [ 66%] .F...................................................................... [ 67%] ........................................................................ [ 67%] ........................................................................ [ 67%] ........................................................................ [ 68%] ........................................................................ [ 68%] ........................................................................ [ 68%] ...................................................ssss.sssss..........s [ 69%] ........................................................................ [ 69%] .........s.sss.sssss.ss..........................s...................... [ 70%] ...................................................................x.... [ 70%] .................................x...................................... [ 70%] ...s.................................................................... [ 71%] .............................................s.......................... [ 71%] ........................................................................ [ 71%] ................................................................s....... [ 72%] ........................................................................ [ 72%] ........................................................................ [ 73%] ........................................................................ [ 73%] ........s..s...............ss..s..ss.s..ss.s.ss.s.ss.s.ss..s....xss..s.s [ 73%] s..s.ss.s.ss.s....xss.s..ss.s.ss.s.ss..s................................ [ 74%] ........................................................................ [ 74%] ........................................................................ [ 74%] ........................................................................ [ 75%] ........................................................................ [ 75%] ........................................................................ [ 76%] ........................................................................ [ 76%] ........................................................................ [ 76%] ........................................................................ [ 77%] ........................................................................ [ 77%] ...........................................................s............ [ 77%] ........................................................................ [ 78%] ........................................................................ [ 78%] ....X................................................................... [ 79%] ........................................................................ [ 79%] ........................................................................ [ 79%] ...............................................x.........s.............. [ 80%] ..................................s....ssss............................. [ 80%] ........................................................................ [ 80%] ........................................................................ [ 81%] ........................................................................ [ 81%] ........................................................................ [ 82%] ........................................................................ [ 82%] ........................................................................ [ 82%] ........................................................................ [ 83%] ........................................................................ [ 83%] ........................................................................ [ 84%] ........................................................................ [ 84%] ........................................................................ [ 84%] ........................................................................ [ 85%] ........................................................................ [ 85%] ................................................................sss.ssss [ 85%] sssssssss.sssssssss.sssssssssssssss.ss.................................. [ 86%] ........................................................................ [ 86%] ........................................................................ [ 87%] ........................................................................ [ 87%] .................................ssssssssssss.ssss...................... [ 87%] ........................................................................ [ 88%] ........................................................................ [ 88%] ........................................................................ [ 88%] ........................................................................ [ 89%] ........................................................................ [ 89%] ........................................................................ [ 90%] ........................................................................ [ 90%] ........................................................................ [ 90%] ........................................................................ [ 91%] ........................................................................ [ 91%] ......................sss............................................... [ 91%] ...................sss...........sssssss..ssss.s.ssss................... [ 92%] ....sss.......................s.ss..................s.ss...........ss.s. [ 92%] .........sss.......sss.................................................. [ 93%] ........................................................................ [ 93%] ........................................................................ [ 93%] ........................................................................ [ 94%] x....................................................................... [ 94%] ........................................................................ [ 94%] .............................................................sssssssssss [ 95%] sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss........... [ 95%] ........................................................................ [ 96%] ..sss................................................................... [ 96%] ........................................................................ [ 96%] ........................................................................ [ 97%] ........................................................................ [ 97%] ........................................................................ [ 97%] ........................................................................ [ 98%] ...............................................F...........sss.......... [ 98%] ......................................................ssss.............. [ 99%] ........................................................................ [ 99%] ........................................................................ [ 99%] ................................. [100%] ==================================== ERRORS ==================================== _____________________ ERROR collecting tests/test_units.py _____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f819ab99e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_units', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f819a...lddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f819ac3e120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import contextlib import functools import operator from typing import Any import numpy as np import pytest import xarray as xr from xarray.core import dtypes, duck_array_ops from xarray.tests import ( assert_allclose, assert_duckarray_allclose, assert_equal, assert_identical, requires_dask, requires_matplotlib, requires_numbagg, ) from xarray.tests.test_plot import PlotTestCase > from xarray.tests.test_variable import _PAD_XR_NP_ARGS ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f819ac3e120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f8150f0e090> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f819ab99e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: in E from xarray.tests.test_variable import _PAD_XR_NP_ARGS E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError _____________________ ERROR collecting tests/test_units.py _____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f1510a59e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_units', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f1510...lddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f1510902120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import contextlib import functools import operator from typing import Any import numpy as np import pytest import xarray as xr from xarray.core import dtypes, duck_array_ops from xarray.tests import ( assert_allclose, assert_duckarray_allclose, assert_equal, assert_identical, requires_dask, requires_matplotlib, requires_numbagg, ) from xarray.tests.test_plot import PlotTestCase > from xarray.tests.test_variable import _PAD_XR_NP_ARGS ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f1510902120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f14c2c52090> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f1510a59e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: in E from xarray.tests.test_variable import _PAD_XR_NP_ARGS E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError _____________________ ERROR collecting tests/test_units.py _____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f384d9c1e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_units', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f384d...lddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f384da66120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import contextlib import functools import operator from typing import Any import numpy as np import pytest import xarray as xr from xarray.core import dtypes, duck_array_ops from xarray.tests import ( assert_allclose, assert_duckarray_allclose, assert_equal, assert_identical, requires_dask, requires_matplotlib, requires_numbagg, ) from xarray.tests.test_plot import PlotTestCase > from xarray.tests.test_variable import _PAD_XR_NP_ARGS ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f384da66120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f37f7891d20> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7f384d9c1e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: in E from xarray.tests.test_variable import _PAD_XR_NP_ARGS E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError _____________________ ERROR collecting tests/test_units.py _____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7fb30851de80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_units' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_units', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7fb308...lddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7fb3085c2120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import contextlib import functools import operator from typing import Any import numpy as np import pytest import xarray as xr from xarray.core import dtypes, duck_array_ops from xarray.tests import ( assert_allclose, assert_duckarray_allclose, assert_equal, assert_identical, requires_dask, requires_matplotlib, requires_numbagg, ) from xarray.tests.test_plot import PlotTestCase > from xarray.tests.test_variable import _PAD_XR_NP_ARGS ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7fb3085c2120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7fb2bd425b10> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py') config = <_pytest.config.Config object at 0x7fb30851de80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_units.py:23: in E from xarray.tests.test_variable import _PAD_XR_NP_ARGS E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError ___________________ ERROR collecting tests/test_variable.py ____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f819ab99e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_variable', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f8...ir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f819ac3e120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f8142df2820> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f819ab99e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError ___________________ ERROR collecting tests/test_variable.py ____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f384d9c1e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_variable', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f3...ir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f384da66120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f37f5be2cf0> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f384d9c1e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError ___________________ ERROR collecting tests/test_variable.py ____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f1510a59e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_variable', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f1...ir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7f1510902120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7f14c0c6a820> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7f1510a59e80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError ___________________ ERROR collecting tests/test_variable.py ____________________ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7fb30851de80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: > mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) /usr/lib/python3.14/site-packages/_pytest/python.py:498: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') def import_path( path: str | os.PathLike[str], *, mode: str | ImportMode = ImportMode.prepend, root: Path, consider_namespace_packages: bool, ) -> ModuleType: """ Import and return a module from the given path, which can be a file (a module) or a directory (a package). :param path: Path to the file to import. :param mode: Controls the underlying import mechanism that will be used: * ImportMode.prepend: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * ImportMode.append: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :param consider_namespace_packages: If True, consider namespace packages when resolving module names. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ path = Path(path) mode = ImportMode(mode) if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: # Try to import this module using the standard import mechanisms, but # without touching sys.path. try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pass else: # If the given module name is already in sys.modules, do not import it again. with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, pkg_root, insert_modules=False ) if mod is not None: return mod # Could not import the module with the current sys.path, so we fall back # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] mod = _import_module_using_spec( module_name, path, path.parent, insert_modules=True ) if mod is None: raise ImportError(f"Can't find module {module_name} at location {path}") return mod try: pkg_root, module_name = resolve_pkg_root_and_module_name( path, consider_namespace_packages=consider_namespace_packages ) except CouldNotResolvePathError: pkg_root, module_name = path.parent, path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function # might have local imports, which would fail at runtime if we restored sys.path. if mode is ImportMode.append: if str(pkg_root) not in sys.path: sys.path.append(str(pkg_root)) elif mode is ImportMode.prepend: if str(pkg_root) != sys.path[0]: sys.path.insert(0, str(pkg_root)) else: assert_never(mode) > importlib.import_module(module_name) /usr/lib/python3.14/site-packages/_pytest/pathlib.py:587: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None def import_module(name, package=None): """Import a module. The 'package' argument is required when performing a relative import. It specifies the package to use as the anchor point from which to resolve the relative import to an absolute import. """ level = 0 if name.startswith('.'): if not package: raise TypeError("the 'package' argument is required to perform a " f"relative import for {name!r}") for character in name: if character != '.': break level += 1 > return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/importlib/__init__.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable', package = None, level = 0 > ??? :1398: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ name = 'xarray.tests.test_variable' import_ = > ??? :1342: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ spec = ModuleSpec(name='xarray.tests.test_variable', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7fb...ir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') > ??? :938: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7fb3085c2120> module = def exec_module(self, module: types.ModuleType) -> None: assert module.__spec__ is not None assert module.__spec__.origin is not None fn = Path(module.__spec__.origin) state = self.config.stash[assertstate_key] self._rewritten_names[module.__name__] = fn # The requested module looks like a test file, so rewrite it. This is # the most magical part of the process: load the source, rewrite the # asserts, and load the rewritten source. We also cache the rewritten # module code in a special pyc. We must be aware of the possibility of # concurrent pytest processes rewriting and loading pycs. To avoid # tricky race conditions, we maintain the following invariant: The # cached pyc is always a complete, valid pyc. Operations on it must be # atomic. POSIX's atomic rename comes in handy. write = not sys.dont_write_bytecode cache_dir = get_cache_dir(fn) if write: ok = try_makedirs(cache_dir) if not ok: write = False state.trace(f"read only directory: {cache_dir}") cache_name = fn.name[:-3] + PYC_TAIL pyc = cache_dir / cache_name # Notice that even if we're in a read-only directory, I'm going # to check for a cached pyc. This may not be optimal... co = _read_pyc(fn, pyc, state.trace) if co is None: state.trace(f"rewriting {fn!r}") source_stat, co = _rewrite_test(fn, self.config) if write: self._writing_pyc = True try: _write_pyc(state, co, source_stat, pyc) finally: self._writing_pyc = False else: state.trace(f"found cached rewritten pyc for {fn}") > exec(co, module.__dict__) /usr/lib/python3.14/site-packages/_pytest/assertion/rewrite.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from __future__ import annotations import warnings from abc import ABC from copy import copy, deepcopy from datetime import datetime, timedelta from textwrap import dedent from typing import Any, Generic import numpy as np import pandas as pd import pytest > import pytz E ModuleNotFoundError: No module named 'pytz' ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: ModuleNotFoundError The above exception was the direct cause of the following exception: cls = func = .collect at 0x7fb2bc796ae0> when = 'collect', reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def collect() -> list[Item | Collector]: # Before collecting, if this is a Directory, load the conftests. # If a conftest import fails to load, it is considered a collection # error of the Directory collector. This is why it's done inside of the # CallInfo wrapper. # # Note: initial conftests are loaded early, not here. if isinstance(collector, Directory): collector.config.pluginmanager._loadconftestmodules( collector.path, collector.config.getoption("importmode"), rootpath=collector.config.rootpath, consider_namespace_packages=collector.config.getini( "consider_namespace_packages" ), ) > return list(collector.collect()) ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:389: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def collect(self) -> Iterable[nodes.Item | nodes.Collector]: > self._register_setup_module_fixture() /usr/lib/python3.14/site-packages/_pytest/python.py:554: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _register_setup_module_fixture(self) -> None: """Register an autouse, module-scoped fixture for the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ setup_module = _get_first_non_fixture_func( > self.obj, ("setUpModule", "setup_module") ^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/python.py:567: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = @property def obj(self): """Underlying Python object.""" obj = getattr(self, "_obj", None) if obj is None: > self._obj = obj = self._getobj() ^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def _getobj(self): > return importtestmodule(self.path, self.config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:551: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ path = PosixPath('/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py') config = <_pytest.config.Config object at 0x7fb30851de80> def importtestmodule( path: Path, config: Config, ): # We assume we are only called once per module. importmode = config.getoption("--import-mode") try: mod = import_path( path, mode=importmode, root=config.rootpath, consider_namespace_packages=config.getini("consider_namespace_packages"), ) except SyntaxError as e: raise nodes.Collector.CollectError( ExceptionInfo.from_current().getrepr(style="short") ) from e except ImportPathMismatchError as e: raise nodes.Collector.CollectError( "import file mismatch:\n" "imported module {!r} has this __file__ attribute:\n" " {}\n" "which is not the same as the test file we want to collect:\n" " {}\n" "HINT: remove __pycache__ / .pyc files and/or use a " "unique basename for your test file modules".format(*e.args) ) from e except ImportError as e: exc_info = ExceptionInfo.from_current() if config.get_verbosity() < 2: exc_info.traceback = exc_info.traceback.filter(filter_traceback) exc_repr = ( exc_info.getrepr(style="short") if exc_info.traceback else exc_info.exconly() ) formatted_tb = str(exc_repr) > raise nodes.Collector.CollectError( f"ImportError while importing test module '{path}'.\n" "Hint: make sure your test modules/packages have valid Python names.\n" "Traceback:\n" f"{formatted_tb}" ) from e E _pytest.nodes.Collector.CollectError: ImportError while importing test module '/builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py'. E Hint: make sure your test modules/packages have valid Python names. E Traceback: E /usr/lib64/python3.14/importlib/__init__.py:88: in import_module E return _bootstrap._gcd_import(name[level:], package, level) E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_variable.py:13: in E import pytz E E ModuleNotFoundError: No module named 'pytz' /usr/lib/python3.14/site-packages/_pytest/python.py:528: CollectError =================================== FAILURES =================================== _____________________ test_cf_timedelta[1D-days-numbers0] ______________________ [gw3] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7fb2afcff480> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = np.timedelta64(86400000000,'us'), units = 'days' numbers = array(1) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2afcfc460> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = array([ 86400000000, 172800000000, 259200000000], dtype='timedelta64[us]') units = 'days', numbers = array([1, 2, 3]) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2afcff740> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = np.timedelta64(3600000000,'us'), units = 'hours' numbers = array(1) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2bd424040> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = np.timedelta64(1000,'us'), units = 'milliseconds' numbers = array(1) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2afcfec40> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = np.timedelta64(1,'us'), units = 'microseconds', numbers = array(1) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2af1e0930> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = array([1800000000, 3600000000], dtype='timedelta64[us]') units = 'hours', numbers = array([0.5, 1. ]) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2af1e09e0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ timedeltas = array(['NaT', 'NaT'], dtype='timedelta64[s]'), units = 'days' numbers = array([-9223372036854775808, -9223372036854775808]) @pytest.mark.filterwarnings("ignore:Timedeltas can't be serialized faithfully") @pytest.mark.parametrize( ["timedeltas", "units", "numbers"], [ ("1D", "days", np.int64(1)), (["1D", "2D", "3D"], "days", np.array([1, 2, 3], "int64")), ("1h", "hours", np.int64(1)), ("1ms", "milliseconds", np.int64(1)), ("1us", "microseconds", np.int64(1)), ("1ns", "nanoseconds", np.int64(1)), (["NaT", "0s", "1s"], None, [np.iinfo(np.int64).min, 0, 1]), (["30m", "60m"], "hours", [0.5, 1.0]), ("NaT", "days", np.iinfo(np.int64).min), (["NaT", "NaT"], "days", [np.iinfo(np.int64).min, np.iinfo(np.int64).min]), ], ) def test_cf_timedelta(timedeltas, units, numbers) -> None: if timedeltas == "NaT": timedeltas = np.timedelta64("NaT", "ns") else: timedeltas = pd.to_timedelta(timedeltas).to_numpy() numbers = np.array(numbers) expected = numbers actual, _ = encode_cf_timedelta(timedeltas, units) assert_array_equal(expected, actual) assert expected.dtype == actual.dtype if units is not None: expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7fb2af1e0880> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': }, firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': }, firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': }, firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': }, firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def test_cf_timedelta_2d() -> None: units = "days" numbers = np.atleast_2d([1, 2, 3]) timedeltas = np.atleast_2d(pd.to_timedelta(["1D", "2D", "3D"]).to_numpy()) expected = timedeltas actual = decode_cf_timedelta(numbers, units) assert_array_equal(expected, actual) > assert expected.dtype == actual.dtype E AssertionError: assert dtype(' func = . at 0x7f81404ba090> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = '365_day' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed ____________ test_distant_cftime_datetime_sub_cftimeindex[360_day] _____________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140545010> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = '360_day' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed _____________ test_distant_cftime_datetime_sub_cftimeindex[julian] _____________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140544f60> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = 'julian' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed ____________ test_distant_cftime_datetime_sub_cftimeindex[all_leap] ____________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140544460> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = 'all_leap' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed ____________ test_distant_cftime_datetime_sub_cftimeindex[366_day] _____________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140544bf0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = '366_day' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed ___________ test_distant_cftime_datetime_sub_cftimeindex[gregorian] ____________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140545380> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = 'gregorian' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed ______ test_distant_cftime_datetime_sub_cftimeindex[proleptic_gregorian] _______ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8140544670> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ calendar = 'proleptic_gregorian' @requires_cftime @pytest.mark.parametrize("calendar", _CFTIME_CALENDARS) def test_distant_cftime_datetime_sub_cftimeindex(calendar): a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True) > with pytest.raises(ValueError, match="difference exceeds"): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftimeindex.py:963: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError, match='difference exceeds'), exc_type = None exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed _____________________ TestDataArray.test_curvefit_helpers ______________________ [gw3] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7fb2af07efb0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': }, firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': }, firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': }, firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': }, firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def test_curvefit_helpers(self) -> None: def exp_decay(t, n0, tau=1): return n0 * np.exp(-t / tau) from xarray.computation.fit import _get_func_args, _initialize_curvefit_params params, func_args = _get_func_args(exp_decay, []) assert params == ["n0", "tau"] param_defaults, bounds_defaults = _initialize_curvefit_params( params, {"n0": 4}, {"tau": [5, np.inf]}, func_args ) assert param_defaults == {"n0": 4, "tau": 6} assert bounds_defaults == {"n0": (-np.inf, np.inf), "tau": (5, np.inf)} # DataArray as bound param_defaults, bounds_defaults = _initialize_curvefit_params( params=params, p0={"n0": 4}, bounds={"tau": [DataArray([3, 4], coords=[("x", [1, 2])]), np.inf]}, func_args=func_args, ) assert param_defaults["n0"] == 4 assert ( param_defaults["tau"] == xr.DataArray([4, 5], coords=[("x", [1, 2])]) ).all() assert bounds_defaults["n0"] == (-np.inf, np.inf) assert ( bounds_defaults["tau"][0] == DataArray([3, 4], coords=[("x", [1, 2])]) ).all() assert bounds_defaults["tau"][1] == np.inf param_names = ["a"] params, func_args = _get_func_args(np.power, param_names) assert params == param_names > with pytest.raises(ValueError): ^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:4864: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = RaisesExc(ValueError), exc_type = None, exc_val = None, exc_tb = None def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: types.TracebackType | None, ) -> bool: __tracebackhide__ = True if exc_type is None: if not self.expected_exceptions: fail("DID NOT RAISE any exception") if len(self.expected_exceptions) > 1: fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") > fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") /usr/lib/python3.14/site-packages/_pytest/raises.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ reason = "DID NOT RAISE ", pytrace = True @_with_exception(Failed) def fail(reason: str = "", pytrace: bool = True) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: The message to show the user as reason for the failure. :param pytrace: If False, msg represents the full failure information and no python traceback will be reported. :raises pytest.fail.Exception: The exception that is raised. """ __tracebackhide__ = True > raise Failed(msg=reason, pytrace=pytrace) E Failed: DID NOT RAISE /usr/lib/python3.14/site-packages/_pytest/outcomes.py:177: Failed _______________________ test_datetime[x_new2-expected2] ________________________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8136044ca0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x_new = ['2000-01-01T12:00', '2000-01-02T12:00'], expected = [0.5, 1.5] @requires_scipy @pytest.mark.parametrize( "x_new, expected", [ (pd.date_range("2000-01-02", periods=3), [1, 2, 3]), ( np.array( [np.datetime64("2000-01-01T12:00"), np.datetime64("2000-01-02T12:00")] ), [0.5, 1.5], ), (["2000-01-01T12:00", "2000-01-02T12:00"], [0.5, 1.5]), (["2000-01-01T12:00", "2000-01-02T12:00", "NaT"], [0.5, 1.5, np.nan]), (["2000-01-01T12:00"], 0.5), pytest.param("2000-01-01T12:00", 0.5, marks=pytest.mark.xfail), ], ) def test_datetime(x_new, expected) -> None: da = xr.DataArray( np.arange(24), dims="time", coords={"time": pd.date_range("2000-01-01", periods=24)}, ) actual = da.interp(time=x_new) expected_da = xr.DataArray( np.atleast_1d(expected), dims=["time"], coords={"time": (np.atleast_1d(x_new).astype("datetime64[ns]"))}, ) > assert_allclose(actual, expected_da) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_interp.py:734: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 16B array([nan, nan]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-01T12:00:00 2000-01-02T12:00:00 b = Size: 16B array([0.5, 1.5]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-01T12:00:00 2000-01-02T12:00:00 check_default_indexes = True, kwargs = {}, __tracebackhide__ = True def assert_allclose(a, b, check_default_indexes=True, **kwargs): __tracebackhide__ = True > xarray.testing.assert_allclose(a, b, **kwargs) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = ( Size: 16B array([nan, nan]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-...ize: 16B array([0.5, 1.5]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-01T12:00:00 2000-01-02T12:00:00) kwargs = {}, __tracebackhide__ = True @functools.wraps(func) def wrapper(*args, **kwargs): __tracebackhide__ = True with warnings.catch_warnings(): # only remove filters that would "error" warnings.filters = [f for f in warnings.filters if f[0] != "error"] > return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 16B array([nan, nan]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-01T12:00:00 2000-01-02T12:00:00 b = Size: 16B array([0.5, 1.5]) Coordinates: * time (time) datetime64[ns] 16B 2000-01-01T12:00:00 2000-01-02T12:00:00 rtol = 1e-05, atol = 1e-08, decode_bytes = True, check_dim_order = True @ensure_warnings def assert_allclose( a, b, rtol=1e-05, atol=1e-08, decode_bytes=True, check_dim_order: bool = True ): """Like :py:func:`numpy.testing.assert_allclose`, but for xarray objects. Raises an AssertionError if two objects are not equal up to desired tolerance. Parameters ---------- a : xarray.Dataset, xarray.DataArray or xarray.Variable The first object to compare. b : xarray.Dataset, xarray.DataArray or xarray.Variable The second object to compare. rtol : float, optional Relative tolerance. atol : float, optional Absolute tolerance. decode_bytes : bool, optional Whether byte dtypes should be decoded to strings as UTF-8 or not. This is useful for testing serialization methods on Python 3 that return saved strings as bytes. check_dim_order : bool, optional, default is True Whether dimensions must be in the same order. See Also -------- assert_identical, assert_equal, numpy.testing.assert_allclose """ __tracebackhide__ = True assert type(a) is type(b) b = maybe_transpose_dims(a, b, check_dim_order) equiv = functools.partial( _data_allclose_or_equiv, rtol=rtol, atol=atol, decode_bytes=decode_bytes ) equiv.__name__ = "allclose" # type: ignore[attr-defined] def compat_variable(a, b): a = getattr(a, "variable", a) b = getattr(b, "variable", b) return a.dims == b.dims and (a._data is b._data or equiv(a.data, b.data)) def compat_node(a, b): return a.ds._coord_names == b.ds._coord_names and utils.dict_equiv( a.variables, b.variables, compat=compat_variable ) if isinstance(a, Variable): allclose = compat_variable(a, b) assert allclose, formatting.diff_array_repr(a, b, compat=equiv) elif isinstance(a, DataArray): allclose = utils.dict_equiv( a.coords, b.coords, compat=compat_variable ) and compat_variable(a.variable, b.variable) > assert allclose, formatting.diff_array_repr(a, b, compat=equiv) ^^^^^^^^ E AssertionError: Left and right DataArray objects are not close E Differing values: E L E array([nan, nan]) E R E array([0.5, 1.5]) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:255: AssertionError _______________________ test_datetime[x_new3-expected3] ________________________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8136044bf0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x_new = ['2000-01-01T12:00', '2000-01-02T12:00', 'NaT'] expected = [0.5, 1.5, nan] @requires_scipy @pytest.mark.parametrize( "x_new, expected", [ (pd.date_range("2000-01-02", periods=3), [1, 2, 3]), ( np.array( [np.datetime64("2000-01-01T12:00"), np.datetime64("2000-01-02T12:00")] ), [0.5, 1.5], ), (["2000-01-01T12:00", "2000-01-02T12:00"], [0.5, 1.5]), (["2000-01-01T12:00", "2000-01-02T12:00", "NaT"], [0.5, 1.5, np.nan]), (["2000-01-01T12:00"], 0.5), pytest.param("2000-01-01T12:00", 0.5, marks=pytest.mark.xfail), ], ) def test_datetime(x_new, expected) -> None: da = xr.DataArray( np.arange(24), dims="time", coords={"time": pd.date_range("2000-01-01", periods=24)}, ) actual = da.interp(time=x_new) expected_da = xr.DataArray( np.atleast_1d(expected), dims=["time"], coords={"time": (np.atleast_1d(x_new).astype("datetime64[ns]"))}, ) > assert_allclose(actual, expected_da) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_interp.py:734: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 24B array([nan, nan, nan]) Coordinates: * time (time) datetime64[ns] 24B 2000-01-01T12:00:00 ... NaT b = Size: 24B array([0.5, 1.5, nan]) Coordinates: * time (time) datetime64[ns] 24B 2000-01-01T12:00:00 ... NaT check_default_indexes = True, kwargs = {}, __tracebackhide__ = True def assert_allclose(a, b, check_default_indexes=True, **kwargs): __tracebackhide__ = True > xarray.testing.assert_allclose(a, b, **kwargs) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = ( Size: 24B array([nan, nan, nan]) Coordinates: * time (time) datetime64[ns] 24B 200...: 3)> Size: 24B array([0.5, 1.5, nan]) Coordinates: * time (time) datetime64[ns] 24B 2000-01-01T12:00:00 ... NaT) kwargs = {}, __tracebackhide__ = True @functools.wraps(func) def wrapper(*args, **kwargs): __tracebackhide__ = True with warnings.catch_warnings(): # only remove filters that would "error" warnings.filters = [f for f in warnings.filters if f[0] != "error"] > return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 24B array([nan, nan, nan]) Coordinates: * time (time) datetime64[ns] 24B 2000-01-01T12:00:00 ... NaT b = Size: 24B array([0.5, 1.5, nan]) Coordinates: * time (time) datetime64[ns] 24B 2000-01-01T12:00:00 ... NaT rtol = 1e-05, atol = 1e-08, decode_bytes = True, check_dim_order = True @ensure_warnings def assert_allclose( a, b, rtol=1e-05, atol=1e-08, decode_bytes=True, check_dim_order: bool = True ): """Like :py:func:`numpy.testing.assert_allclose`, but for xarray objects. Raises an AssertionError if two objects are not equal up to desired tolerance. Parameters ---------- a : xarray.Dataset, xarray.DataArray or xarray.Variable The first object to compare. b : xarray.Dataset, xarray.DataArray or xarray.Variable The second object to compare. rtol : float, optional Relative tolerance. atol : float, optional Absolute tolerance. decode_bytes : bool, optional Whether byte dtypes should be decoded to strings as UTF-8 or not. This is useful for testing serialization methods on Python 3 that return saved strings as bytes. check_dim_order : bool, optional, default is True Whether dimensions must be in the same order. See Also -------- assert_identical, assert_equal, numpy.testing.assert_allclose """ __tracebackhide__ = True assert type(a) is type(b) b = maybe_transpose_dims(a, b, check_dim_order) equiv = functools.partial( _data_allclose_or_equiv, rtol=rtol, atol=atol, decode_bytes=decode_bytes ) equiv.__name__ = "allclose" # type: ignore[attr-defined] def compat_variable(a, b): a = getattr(a, "variable", a) b = getattr(b, "variable", b) return a.dims == b.dims and (a._data is b._data or equiv(a.data, b.data)) def compat_node(a, b): return a.ds._coord_names == b.ds._coord_names and utils.dict_equiv( a.variables, b.variables, compat=compat_variable ) if isinstance(a, Variable): allclose = compat_variable(a, b) assert allclose, formatting.diff_array_repr(a, b, compat=equiv) elif isinstance(a, DataArray): allclose = utils.dict_equiv( a.coords, b.coords, compat=compat_variable ) and compat_variable(a.variable, b.variable) > assert allclose, formatting.diff_array_repr(a, b, compat=equiv) ^^^^^^^^ E AssertionError: Left and right DataArray objects are not close E Differing values: E L E array([nan, nan, nan]) E R E array([0.5, 1.5, nan]) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:255: AssertionError __________________________ test_datetime[x_new4-0.5] ___________________________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f81360459b0> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': }, firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': }, firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x_new = ['2000-01-01T12:00'], expected = 0.5 @requires_scipy @pytest.mark.parametrize( "x_new, expected", [ (pd.date_range("2000-01-02", periods=3), [1, 2, 3]), ( np.array( [np.datetime64("2000-01-01T12:00"), np.datetime64("2000-01-02T12:00")] ), [0.5, 1.5], ), (["2000-01-01T12:00", "2000-01-02T12:00"], [0.5, 1.5]), (["2000-01-01T12:00", "2000-01-02T12:00", "NaT"], [0.5, 1.5, np.nan]), (["2000-01-01T12:00"], 0.5), pytest.param("2000-01-01T12:00", 0.5, marks=pytest.mark.xfail), ], ) def test_datetime(x_new, expected) -> None: da = xr.DataArray( np.arange(24), dims="time", coords={"time": pd.date_range("2000-01-01", periods=24)}, ) actual = da.interp(time=x_new) expected_da = xr.DataArray( np.atleast_1d(expected), dims=["time"], coords={"time": (np.atleast_1d(x_new).astype("datetime64[ns]"))}, ) > assert_allclose(actual, expected_da) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_interp.py:734: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 8B array([nan]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:00:00 b = Size: 8B array([0.5]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:00:00 check_default_indexes = True, kwargs = {}, __tracebackhide__ = True def assert_allclose(a, b, check_default_indexes=True, **kwargs): __tracebackhide__ = True > xarray.testing.assert_allclose(a, b, **kwargs) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = ( Size: 8B array([nan]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:0...rray.DataArray (time: 1)> Size: 8B array([0.5]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:00:00) kwargs = {}, __tracebackhide__ = True @functools.wraps(func) def wrapper(*args, **kwargs): __tracebackhide__ = True with warnings.catch_warnings(): # only remove filters that would "error" warnings.filters = [f for f in warnings.filters if f[0] != "error"] > return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 8B array([nan]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:00:00 b = Size: 8B array([0.5]) Coordinates: * time (time) datetime64[ns] 8B 2000-01-01T12:00:00 rtol = 1e-05, atol = 1e-08, decode_bytes = True, check_dim_order = True @ensure_warnings def assert_allclose( a, b, rtol=1e-05, atol=1e-08, decode_bytes=True, check_dim_order: bool = True ): """Like :py:func:`numpy.testing.assert_allclose`, but for xarray objects. Raises an AssertionError if two objects are not equal up to desired tolerance. Parameters ---------- a : xarray.Dataset, xarray.DataArray or xarray.Variable The first object to compare. b : xarray.Dataset, xarray.DataArray or xarray.Variable The second object to compare. rtol : float, optional Relative tolerance. atol : float, optional Absolute tolerance. decode_bytes : bool, optional Whether byte dtypes should be decoded to strings as UTF-8 or not. This is useful for testing serialization methods on Python 3 that return saved strings as bytes. check_dim_order : bool, optional, default is True Whether dimensions must be in the same order. See Also -------- assert_identical, assert_equal, numpy.testing.assert_allclose """ __tracebackhide__ = True assert type(a) is type(b) b = maybe_transpose_dims(a, b, check_dim_order) equiv = functools.partial( _data_allclose_or_equiv, rtol=rtol, atol=atol, decode_bytes=decode_bytes ) equiv.__name__ = "allclose" # type: ignore[attr-defined] def compat_variable(a, b): a = getattr(a, "variable", a) b = getattr(b, "variable", b) return a.dims == b.dims and (a._data is b._data or equiv(a.data, b.data)) def compat_node(a, b): return a.ds._coord_names == b.ds._coord_names and utils.dict_equiv( a.variables, b.variables, compat=compat_variable ) if isinstance(a, Variable): allclose = compat_variable(a, b) assert allclose, formatting.diff_array_repr(a, b, compat=equiv) elif isinstance(a, DataArray): allclose = utils.dict_equiv( a.coords, b.coords, compat=compat_variable ) and compat_variable(a.variable, b.variable) > assert allclose, formatting.diff_array_repr(a, b, compat=equiv) ^^^^^^^^ E AssertionError: Left and right DataArray objects are not close E Differing values: E L E array([nan]) E R E array([0.5]) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:255: AssertionError _______________________ test_groupby_bins_datetime_mean ________________________ [gw3] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7fb29cadf320> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def test_groupby_bins_datetime_mean(): """Test groupby_bins with datetime mean (issue #6995)""" times = pd.date_range("2020-01-01", "2020-02-01", freq="1h") index = np.arange(len(times)) bins = np.arange(0, len(index), 5) ds = xr.Dataset( {"time": ("index", times), "float": ("index", np.linspace(0, 1, len(index)))}, coords={"index": index}, ) # The time variable should be preserved and averaged result = ds.groupby_bins("index", bins).mean() assert "time" in result.data_vars assert "float" in result.data_vars > assert result.time.dtype == np.dtype("datetime64[ns]") E AssertionError: assert dtype(' Size: 1kB\narray(['2020-01-01T03:00:00.000000', '2020-01-01T08:00:00.000000... dtype='datetime64[us]')\nCoordinates:\n * index_bins (index_bins) interval[int64, right] 2kB (0, 5] ... (735, 740].dtype E + where Size: 1kB\narray(['2020-01-01T03:00:00.000000', '2020-01-01T08:00:00.000000... dtype='datetime64[us]')\nCoordinates:\n * index_bins (index_bins) interval[int64, right] 2kB (0, 5] ... (735, 740] = Size: 5kB\nDimensions: (index_bins: 148)\nCoordinates:\n * index_bins (index_bins) interval[int64,...64[us] 1kB 2020-01-01T03:00:00 ... 2020-...\n float (index_bins) float64 1kB 0.004032 0.01075 ... 0.9852 0.9919.time E + and dtype('('datetime64[ns]') E + where = np.dtype /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:3831: AssertionError ______________________ test_groupby_bins_mean_time_series ______________________ [gw3] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7fb29c933740> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': } firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': } firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7fb30811f230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7fb30851c980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def test_groupby_bins_mean_time_series(): """Test groupby_bins mean on time series data (issue #10217)""" ds = xr.Dataset( { "measurement": ("trial", np.arange(0, 100, 10)), "time": ("trial", pd.date_range("20240101T1500", "20240101T1501", 10)), } ) # Time variable should be preserved in the aggregation ds_agged = ds.groupby_bins("trial", 5).mean() assert "time" in ds_agged.data_vars assert "measurement" in ds_agged.data_vars > assert ds_agged.time.dtype == np.dtype("datetime64[ns]") E AssertionError: assert dtype(' Size: 40B\narray(['2024-01-01T15:00:03.333333', '2024-01-01T15:00:16.666666',..., dtype='datetime64[us]')\nCoordinates:\n * trial_bins (trial_bins) interval[float64, right] 80B (-0.009, 1.8] ... (....dtype E + where Size: 40B\narray(['2024-01-01T15:00:03.333333', '2024-01-01T15:00:16.666666',..., dtype='datetime64[us]')\nCoordinates:\n * trial_bins (trial_bins) interval[float64, right] 80B (-0.009, 1.8] ... (... = Size: 160B\nDimensions: (trial_bins: 5)\nCoordinates:\n * trial_bins (trial_bins) interval[float...s) float64 40B 5.0 25.0 45.0 65.0 85.0\n time (trial_bins) datetime64[us] 40B 2024-01-01T15:00:03.333333 .....time E + and dtype('('datetime64[ns]') E + where = np.dtype /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:3847: AssertionError _________________________ test_datetime_single_string __________________________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 cls = func = . at 0x7f8136044670> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': }, firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': }, firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': } firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': } firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': } firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call' args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': } firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @requires_scipy def test_datetime_single_string() -> None: da = xr.DataArray( np.arange(24), dims="time", coords={"time": pd.date_range("2000-01-01", periods=24)}, ) actual = da.interp(time="2000-01-01T12:00") expected = xr.DataArray(0.5) > assert_allclose(actual.drop_vars("time"), expected) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_interp.py:747: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 8B array(nan) b = Size: 8B array(0.5), check_default_indexes = True kwargs = {}, __tracebackhide__ = True def assert_allclose(a, b, check_default_indexes=True, **kwargs): __tracebackhide__ = True > xarray.testing.assert_allclose(a, b, **kwargs) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = ( Size: 8B array(nan), Size: 8B array(0.5)) kwargs = {}, __tracebackhide__ = True @functools.wraps(func) def wrapper(*args, **kwargs): __tracebackhide__ = True with warnings.catch_warnings(): # only remove filters that would "error" warnings.filters = [f for f in warnings.filters if f[0] != "error"] > return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = Size: 8B array(nan) b = Size: 8B array(0.5), rtol = 1e-05, atol = 1e-08 decode_bytes = True, check_dim_order = True @ensure_warnings def assert_allclose( a, b, rtol=1e-05, atol=1e-08, decode_bytes=True, check_dim_order: bool = True ): """Like :py:func:`numpy.testing.assert_allclose`, but for xarray objects. Raises an AssertionError if two objects are not equal up to desired tolerance. Parameters ---------- a : xarray.Dataset, xarray.DataArray or xarray.Variable The first object to compare. b : xarray.Dataset, xarray.DataArray or xarray.Variable The second object to compare. rtol : float, optional Relative tolerance. atol : float, optional Absolute tolerance. decode_bytes : bool, optional Whether byte dtypes should be decoded to strings as UTF-8 or not. This is useful for testing serialization methods on Python 3 that return saved strings as bytes. check_dim_order : bool, optional, default is True Whether dimensions must be in the same order. See Also -------- assert_identical, assert_equal, numpy.testing.assert_allclose """ __tracebackhide__ = True assert type(a) is type(b) b = maybe_transpose_dims(a, b, check_dim_order) equiv = functools.partial( _data_allclose_or_equiv, rtol=rtol, atol=atol, decode_bytes=decode_bytes ) equiv.__name__ = "allclose" # type: ignore[attr-defined] def compat_variable(a, b): a = getattr(a, "variable", a) b = getattr(b, "variable", b) return a.dims == b.dims and (a._data is b._data or equiv(a.data, b.data)) def compat_node(a, b): return a.ds._coord_names == b.ds._coord_names and utils.dict_equiv( a.variables, b.variables, compat=compat_variable ) if isinstance(a, Variable): allclose = compat_variable(a, b) assert allclose, formatting.diff_array_repr(a, b, compat=equiv) elif isinstance(a, DataArray): allclose = utils.dict_equiv( a.coords, b.coords, compat=compat_variable ) and compat_variable(a.variable, b.variable) > assert allclose, formatting.diff_array_repr(a, b, compat=equiv) ^^^^^^^^ E AssertionError: Left and right DataArray objects are not close E Differing values: E L E array(nan) E R E array(0.5) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/testing/assertions.py:255: AssertionError __________________ TestDatasetScatterPlots.test_datetime_hue ___________________ [gw0] linux -- Python 3.14.2 /usr/bin/python3 ex = datetime.timedelta(days=-2) def _sanitize_extrema(ex): if ex is None: return ex try: > ret = ex.item() ^^^^^^^ E AttributeError: 'datetime.timedelta' object has no attribute 'item' /usr/lib64/python3.14/site-packages/matplotlib/colors.py:211: AttributeError During handling of the above exception, another exception occurred: cls = func = . at 0x7f8141130e00> when = 'call' reraise = (, ) @classmethod def from_call( cls, func: Callable[[], TResult], when: Literal["collect", "setup", "call", "teardown"], reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, ) -> CallInfo[TResult]: """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: Exception or exceptions that shall propagate if raised by the function, instead of being wrapped in the CallInfo. """ excinfo = None instant = timing.Instant() try: > result: TResult | None = func() ^^^^^^ /usr/lib/python3.14/site-packages/_pytest/runner.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) /usr/lib/python3.14/site-packages/_pytest/runner.py:246: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'item': }, firstresult = False def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_runtest_call' methods = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] kwargs = {'item': }, firstresult = False def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.logging.LoggingPlugin object at 0x7f819a797230> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: self.log_cli_handler.set_when("call") with self._runtest_for(item, "call"): > yield /usr/lib/python3.14/site-packages/_pytest/logging.py:850: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = > _state='suspended' _in_suspended=False> _capture_fixture=None> item = @hookimpl(wrapper=True) def pytest_runtest_call(self, item: Item) -> Generator[None]: with self.item_capture("call", item): > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/capture.py:900: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_runtest_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = @hookimpl(wrapper=True) def pytest_runtest_call(item: Item) -> Generator[None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) try: > return (yield) ^^^^^ /usr/lib/python3.14/site-packages/_pytest/skipping.py:263: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_runtest_call' hook_impls = [> _state='suspended' _in_suspended=False> _capture_fixture=None>>, ...] caller_kwargs = {'item': }, firstresult = False def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = def pytest_runtest_call(item: Item) -> None: _update_current_test_var(item, "call") try: del sys.last_type del sys.last_value del sys.last_traceback if sys.version_info >= (3, 12, 0): del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: > item.runtest() /usr/lib/python3.14/site-packages/_pytest/runner.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def runtest(self) -> None: """Execute the underlying test function.""" > self.ihook.pytest_pyfunc_call(pyfuncitem=self) /usr/lib/python3.14/site-packages/_pytest/python.py:1671: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = kwargs = {'pyfuncitem': }, firstresult = True def __call__(self, **kwargs: object) -> Any: """Call the hook. Only accepts keyword arguments, which should match the hook specification. Returns the result(s) of calling all registered plugins, see :ref:`calling`. """ assert not self.is_historic(), ( "Cannot directly call a historic hook - use call_historic instead." ) self._verify_all_args_are_provided(kwargs) firstresult = self.spec.opts.get("firstresult", False) if self.spec else False # Copy because plugins may register other plugins during iteration (#438). > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_hooks.py:512: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0x7f819ab98980> hook_name = 'pytest_pyfunc_call' methods = [>] kwargs = {'pyfuncitem': }, firstresult = True def _hookexec( self, hook_name: str, methods: Sequence[HookImpl], kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_manager.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': }, firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: teardown.throw(exception) except RuntimeError as re: # StopIteration from generator causes RuntimeError # even for coroutine usage - see #544 if ( isinstance(exception, StopIteration) and re.__cause__ is exception ): teardown.close() continue else: raise else: teardown.send(result) # Following is unreachable for a well behaved hook wrapper. # Try to force finalizers otherwise postponed till GC action. # Note: close() may raise if generator handles GeneratorExit. teardown.close() except StopIteration as si: result = si.value exception = None continue except BaseException as e: exception = e continue _raise_wrapfail(teardown, "has second yield") if exception is not None: > raise exception /usr/lib/python3.14/site-packages/pluggy/_callers.py:167: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': }, firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break except BaseException as exc: exception = exc finally: if firstresult: # first result hooks return a single value result = results[0] if results else None else: result = results # run all wrapper post-yield blocks for teardown in reversed(teardowns): try: if exception is not None: try: > teardown.throw(exception) /usr/lib/python3.14/site-packages/pluggy/_callers.py:139: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: res = yield result = Result(res, None) except BaseException as exc: result = Result(None, exc) try: teardown.send(result) except StopIteration: pass except BaseException as e: _warn_teardown_exception(hook_name, hook_impl, e) raise else: _raise_wrapfail(teardown, "has second yield") finally: teardown.close() > return result.get_result() ^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:53: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def get_result(self) -> ResultType: """Get the result(s) for this hook call. If the hook was marked as a ``firstresult`` only a single value will be returned, otherwise a list of results. """ __tracebackhide__ = True exc = self._exception tb = self._traceback if exc is None: return cast(ResultType, self._result) else: > raise exc.with_traceback(tb) /usr/lib/python3.14/site-packages/pluggy/_result.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_impl = > hook_name = 'pytest_pyfunc_call', args = [] def run_old_style_hookwrapper( hook_impl: HookImpl, hook_name: str, args: Sequence[object] ) -> Teardown: """ backward compatibility wrapper to run a old style hookwrapper as a wrapper """ teardown: Teardown = cast(Teardown, hook_impl.function(*args)) try: next(teardown) except StopIteration: _raise_wrapfail(teardown, "did not yield") try: > res = yield ^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook_name = 'pytest_pyfunc_call' hook_impls = [>] caller_kwargs = {'pyfuncitem': }, firstresult = True def _multicall( hook_name: str, hook_impls: Sequence[HookImpl], caller_kwargs: Mapping[str, object], firstresult: bool, ) -> object | list[object]: """Execute a call into multiple python functions/methods and return the result(s). ``caller_kwargs`` comes from HookCaller.__call__(). """ __tracebackhide__ = True results: list[object] = [] exception = None try: # run impl and wrapper setup functions in a loop teardowns: list[Teardown] = [] try: for hook_impl in reversed(hook_impls): try: args = [caller_kwargs[argname] for argname in hook_impl.argnames] except KeyError as e: # coverage bug - this is tested for argname in hook_impl.argnames: # pragma: no cover if argname not in caller_kwargs: raise HookCallError( f"hook call must provide argument {argname!r}" ) from e if hook_impl.hookwrapper: function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args) next(function_gen) # first yield teardowns.append(function_gen) elif hook_impl.wrapper: try: # If this cast is not valid, a type error is raised below, # which is the desired response. res = hook_impl.function(*args) function_gen = cast(Generator[None, object, object], res) next(function_gen) # first yield teardowns.append(function_gen) except StopIteration: _raise_wrapfail(function_gen, "did not yield") else: > res = hook_impl.function(*args) ^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pluggy/_callers.py:121: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pyfuncitem = @hookimpl(trylast=True) def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: testfunction = pyfuncitem.obj if is_async_function(testfunction): async_fail(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} > result = testfunction(**testargs) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/_pytest/python.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def test_datetime_hue(self) -> None: ds2 = self.ds.copy() # TODO: Currently plots as categorical, should it behave as numerical? ds2["hue"] = pd.date_range("2000-1-1", periods=4) ds2.plot.scatter(x="A", y="B", hue="hue") ds2["hue"] = pd.timedelta_range("-1D", periods=4, freq="D") > ds2.plot.scatter(x="A", y="B", hue="hue") /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2901: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = (), kwargs = {'hue': 'hue', 'x': 'A', 'y': 'B'} @functools.wraps(dataset_plot.scatter, assigned=("__doc__",)) def scatter(self, *args, **kwargs) -> PathCollection | FacetGrid[Dataset]: > return dataset_plot.scatter(self._ds, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/accessor.py:1048: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ds = Size: 2kB Dimensions: (x: 3, row: 3, col: 4, hue: 4) Coordinates: * x (x) int64 24B 0 1 2 ...at64 1kB 1.764 0.4002 0.9787 ... 0.1667 0.635 B (x, row, col, hue) float64 1kB 2.383 0.9445 ... -1.045 1.211 x = 'A', y = 'B', z = None, hue = 'hue', hue_style = None, markersize = None linewidth = None, figsize = None, size = None, aspect = None, ax = None row = None @_update_doc_to_dataset(dataarray_plot.scatter) def scatter( ds: Dataset, *args: Any, x: Hashable | None = None, y: Hashable | None = None, z: Hashable | None = None, hue: Hashable | None = None, hue_style: HueStyleOptions = None, markersize: Hashable | None = None, linewidth: Hashable | None = None, figsize: Iterable[float] | None = None, size: float | None = None, aspect: float | None = None, ax: Axes | None = None, row: Hashable | None = None, col: Hashable | None = None, col_wrap: int | None = None, xincrease: bool | None = True, yincrease: bool | None = True, add_legend: bool | None = None, add_colorbar: bool | None = None, add_labels: bool | Iterable[bool] = True, add_title: bool = True, subplot_kws: dict[str, Any] | None = None, xscale: ScaleOptions = None, yscale: ScaleOptions = None, xticks: ArrayLike | None = None, yticks: ArrayLike | None = None, xlim: ArrayLike | None = None, ylim: ArrayLike | None = None, cmap: str | Colormap | None = None, vmin: float | None = None, vmax: float | None = None, norm: Normalize | None = None, extend: ExtendOptions = None, levels: ArrayLike | None = None, **kwargs: Any, ) -> PathCollection | FacetGrid[DataArray]: """Scatter plot Dataset data variables against each other.""" locals_ = locals() del locals_["ds"] locals_.update(locals_.pop("kwargs", {})) da = _temp_dataarray(ds, y, locals_) > return da.plot.scatter(*locals_.pop("args", ()), **locals_) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/dataset_plot.py:920: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = () kwargs = {'add_colorbar': None, 'add_labels': True, 'add_legend': None, 'add_title': True, ...} @functools.wraps(dataarray_plot.scatter, assigned=("__doc__",)) def scatter(self, *args, **kwargs) -> PathCollection | FacetGrid[DataArray]: > return dataarray_plot.scatter(self._da, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/accessor.py:300: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ darray = Size: 1kB array([[[[ 2.38314477, 0.94447949, -0.91282223, 1.11... days A (x, row, col, hue) float64 1kB 1.764 0.4002 0.9787 ... 0.1667 0.635 Attributes: units: Bunits x = 'A', y = 'B', z = None, hue = 'hue', hue_style = None, markersize = None linewidth = None, row = None, col = None, col_wrap = None ax = , figsize = None @functools.wraps( plotfunc, assigned=("__module__", "__name__", "__qualname__", "__doc__") ) def newplotfunc( darray: DataArray, *args: Any, x: Hashable | None = None, y: Hashable | None = None, z: Hashable | None = None, hue: Hashable | None = None, hue_style: HueStyleOptions = None, markersize: Hashable | None = None, linewidth: Hashable | None = None, row: Hashable | None = None, col: Hashable | None = None, col_wrap: int | None = None, ax: Axes | None = None, figsize: Iterable[float] | None = None, size: float | None = None, aspect: float | None = None, xincrease: bool | None = True, yincrease: bool | None = True, add_legend: bool | None = None, add_colorbar: bool | None = None, add_labels: bool | Iterable[bool] = True, add_title: bool = True, subplot_kws: dict[str, Any] | None = None, xscale: ScaleOptions = None, yscale: ScaleOptions = None, xticks: ArrayLike | None = None, yticks: ArrayLike | None = None, xlim: tuple[float, float] | None = None, ylim: tuple[float, float] | None = None, cmap: str | Colormap | None = None, vmin: float | None = None, vmax: float | None = None, norm: Normalize | None = None, extend: ExtendOptions = None, levels: ArrayLike | None = None, **kwargs, ) -> Any: # All 1d plots in xarray share this function signature. # Method signature below should be consistent. if TYPE_CHECKING: import matplotlib.pyplot as plt else: plt = attempt_import("matplotlib.pyplot") if subplot_kws is None: subplot_kws = dict() # Handle facetgrids first if row or col: if z is not None: subplot_kws.update(projection="3d") allargs = locals().copy() allargs.update(allargs.pop("kwargs")) allargs.pop("darray") allargs.pop("plt") allargs["plotfunc"] = globals()[plotfunc.__name__] return _easy_facetgrid(darray, kind="plot1d", **allargs) if darray.ndim == 0 or darray.size == 0: # TypeError to be consistent with pandas raise TypeError("No numeric data to plot.") # The allargs dict passed to _easy_facetgrid above contains args if args == (): args = kwargs.pop("args", ()) if args: assert "args" not in kwargs # TODO: Deprecated since 2022.10: msg = "Using positional arguments is deprecated for plot methods, use keyword arguments instead." assert x is None x = args[0] if len(args) > 1: assert y is None y = args[1] if len(args) > 2: assert z is None z = args[2] if len(args) > 3: assert hue is None hue = args[3] if len(args) > 4: raise ValueError(msg) else: warnings.warn(msg, DeprecationWarning, stacklevel=2) del args if hue_style is not None: # TODO: Not used since 2022.10. Deprecated since 2023.07. warnings.warn( ( "hue_style is no longer used for plot1d plots " "and the argument will eventually be removed. " "Convert numbers to string for a discrete hue " "and use add_legend or add_colorbar to control which guide to display." ), DeprecationWarning, stacklevel=2, ) _is_facetgrid = kwargs.pop("_is_facetgrid", False) if plotfunc.__name__ == "scatter": size_ = kwargs.pop("_size", markersize) size_r = _MARKERSIZE_RANGE # Remove any nulls, .where(m, drop=True) doesn't work when m is # a dask array, so load the array to memory. # It will have to be loaded to memory at some point anyway: darray = darray.compute() darray = darray.where(darray.notnull(), drop=True) else: size_ = kwargs.pop("_size", linewidth) size_r = _LINEWIDTH_RANGE # Get data to plot: coords_to_plot: MutableMapping[str, Hashable | None] = dict( x=x, z=z, hue=hue, size=size_ ) if not _is_facetgrid: # Guess what coords to use if some of the values in coords_to_plot are None: coords_to_plot = _guess_coords_to_plot(darray, coords_to_plot, kwargs) plts = _prepare_plot1d_data(darray, coords_to_plot, plotfunc.__name__) xplt = plts.pop("x", None) yplt = plts.pop("y", None) zplt = plts.pop("z", None) kwargs.update(zplt=zplt) hueplt = plts.pop("hue", None) sizeplt = plts.pop("size", None) # Handle size and hue: hueplt_norm = _Normalize(data=hueplt) kwargs.update(hueplt=hueplt_norm.values) sizeplt_norm = _Normalize( data=sizeplt, width=size_r, _is_facetgrid=_is_facetgrid ) kwargs.update(sizeplt=sizeplt_norm.values) cmap_params_subset = kwargs.pop("cmap_params_subset", {}) cbar_kwargs = kwargs.pop("cbar_kwargs", {}) if hueplt_norm.data is not None: if not hueplt_norm.data_is_numeric: # Map hue values back to its original value: cbar_kwargs.update(format=hueplt_norm.format, ticks=hueplt_norm.ticks) levels = kwargs.get("levels", hueplt_norm.levels) cmap_params, cbar_kwargs = _process_cmap_cbar_kwargs( plotfunc, cast("DataArray", hueplt_norm.values).data, **locals(), ) # subset that can be passed to scatter, hist2d if not cmap_params_subset: ckw = {vv: cmap_params[vv] for vv in ("vmin", "vmax", "norm", "cmap")} cmap_params_subset.update(**ckw) with plt.rc_context(_styles): # type: ignore[arg-type, unused-ignore] if z is not None: import mpl_toolkits if ax is None: subplot_kws.update(projection="3d") ax = get_axis(figsize, size, aspect, ax, **subplot_kws) assert isinstance(ax, mpl_toolkits.mplot3d.axes3d.Axes3D) # Using 30, 30 minimizes rotation of the plot. Making it easier to # build on your intuition from 2D plots: ax.view_init(azim=30, elev=30, vertical_axis="y") else: ax = get_axis(figsize, size, aspect, ax, **subplot_kws) > primitive = plotfunc( xplt, yplt, ax=ax, add_labels=add_labels, **cmap_params_subset, **kwargs, ) /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/dataarray_plot.py:1018: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ xplt = Size: 1kB array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.867...3 3 3 3 * hue (_stacked_dim) timedelta64[us] 1kB -1 days 0 days ... 2 days Attributes: units: Aunits yplt = Size: 1kB array([ 2.38314477, 0.94447949, -0.91282223, 1.11701629, -1.315...3 3 3 3 * hue (_stacked_dim) timedelta64[us] 1kB -1 days 0 days ... 2 days Attributes: units: Bunits ax = , add_labels = True kwargs = {'c': array([-86400000000, 0, 86400000000, 172800000000, -86400000000, 0, 86400000000, ...00000], dtype='timedelta64[us]'), 'cmap': 'RdBu_r', 'norm': None, 'vmax': np.timedelta64(172800000000,'us'), ...} zplt = None hueplt = Size: 1kB [144 values with dtype=timedelta64[us]] Coordinates: * _stack...kB 0 0 0 0 1 1 1 1 2 ... 2 2 2 2 3 3 3 3 * hue (_stacked_dim) timedelta64[us] 1kB -1 days 0 days ... 2 days sizeplt = None plts_or_none = ( Size: 1kB array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86... * hue (_stacked_dim) timedelta64[us] 1kB -1 days 0 days ... 2 days Attributes: units: Bunits, None) xplt_np = array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799, -0.97727788, 0.95008842, -0.15135721, ...643329, 0.57659082, -0.20829876, 0.39600671, -1.09306151, -1.49125759, 0.4393917 , 0.1666735 , 0.63503144]) yplt_np = array([ 2.38314477, 0.94447949, -0.91282223, 1.11701629, -1.31590741, -0.4615846 , -0.06824161, 1.71334272, ...449286, -0.11054066, 1.02017271, -0.69204985, 1.53637705, 0.28634369, 0.60884383, -1.04525337, 1.21114529]) zplt_np = None @_plot1d def scatter( xplt: DataArray | None, yplt: DataArray | None, ax: Axes, add_labels: bool | Iterable[bool] = True, **kwargs, ) -> PathCollection: """Scatter variables against each other. Wraps :py:func:`matplotlib:matplotlib.pyplot.scatter`. """ if "u" in kwargs or "v" in kwargs: raise ValueError("u, v are not allowed in scatter plots.") zplt: DataArray | None = kwargs.pop("zplt", None) hueplt: DataArray | None = kwargs.pop("hueplt", None) sizeplt: DataArray | None = kwargs.pop("sizeplt", None) if hueplt is not None: kwargs.update(c=hueplt.to_numpy().ravel()) if sizeplt is not None: kwargs.update(s=sizeplt.to_numpy().ravel()) plts_or_none = (xplt, yplt, zplt) _add_labels(add_labels, plts_or_none, ("", "", ""), ax) xplt_np = None if xplt is None else xplt.to_numpy().ravel() yplt_np = None if yplt is None else yplt.to_numpy().ravel() zplt_np = None if zplt is None else zplt.to_numpy().ravel() plts_np = tuple(p for p in (xplt_np, yplt_np, zplt_np) if p is not None) if len(plts_np) == 3: import mpl_toolkits assert isinstance(ax, mpl_toolkits.mplot3d.axes3d.Axes3D) return ax.scatter(xplt_np, yplt_np, zplt_np, **kwargs) if len(plts_np) == 2: > return ax.scatter(plts_np[0], plts_np[1], **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/plot/dataarray_plot.py:1280: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755...49286, -0.11054066, 1.02017271, -0.69204985, 1.53637705, 0.28634369, 0.60884383, -1.04525337, 1.21114529])) kwargs = {'c': array([-86400000000, 0, 86400000000, 172800000000, -86400000000, 0, 86400000000, ...00000], dtype='timedelta64[us]'), 'cmap': 'RdBu_r', 'norm': None, 'vmax': np.timedelta64(172800000000,'us'), ...} @functools.wraps(func) def wrapper(*args, **kwargs): # Don't use signature.bind here, as it would fail when stacked with # rename_parameter and an "old" argument name is passed in # (signature.bind would fail, but the actual call would succeed). if len(args) > name_idx: warn_deprecated( since, message="Passing the %(name)s %(obj_type)s " "positionally is deprecated since Matplotlib %(since)s; the " "parameter will become keyword-only in %(removal)s.", name=name, obj_type=f"parameter of {func.__name__}()") > return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/site-packages/matplotlib/_api/deprecation.py:453: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ax = , data = None args = (array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799, -0.97727788, 0.95008842, -0.15135721,...49286, -0.11054066, 1.02017271, -0.69204985, 1.53637705, 0.28634369, 0.60884383, -1.04525337, 1.21114529])) kwargs = {'c': array([-86400000000, 0, 86400000000, 172800000000, -86400000000, 0, 86400000000, ...00000], dtype='timedelta64[us]'), 'cmap': 'RdBu_r', 'norm': None, 'vmax': np.timedelta64(172800000000,'us'), ...} @functools.wraps(func) def inner(ax, *args, data=None, **kwargs): if data is None: > return func( ax, *map(cbook.sanitize_sequence, args), **{k: cbook.sanitize_sequence(v) for k, v in kwargs.items()}) /usr/lib64/python3.14/site-packages/matplotlib/__init__.py:1526: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = x = masked_array(data=[ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799, -0.97727788, 0... -1.49125759, 0.4393917 , 0.1666735 , 0.63503144], mask=False, fill_value=1e+20) y = masked_array(data=[ 2.38314477, 0.94447949, -0.91282223, 1.11701629, -1.31590741, -0.4615846 , -0... 0.28634369, 0.60884383, -1.04525337, 1.21114529], mask=False, fill_value=1e+20) s = masked_array(data=[36.], mask=False, fill_value=1e+20) c = masked_array(data=[-8.640e+10, 0.000e+00, 8.640e+10, 1.728e+11, -8.640e+10, 0.000e+00, 8.640e+..., -8.640e+10, 0.000e+00, 8.640e+10, 1.728e+11], mask=False, fill_value=1e+20) marker = 'o', cmap = 'RdBu_r', norm = None vmin = np.timedelta64(-172800000000,'us') vmax = np.timedelta64(172800000000,'us'), alpha = None, linewidths = None edgecolors = 'w', colorizer = None, plotnonfinite = False, kwargs = {} orig_edgecolor = None, colors = None scales = masked_array(data=[36.], mask=False, fill_value=1e+20) marker_obj = @_api.make_keyword_only("3.10", "marker") @_preprocess_data(replace_names=["x", "y", "s", "linewidths", "edgecolors", "c", "facecolor", "facecolors", "color"], label_namer="y") @_docstring.interpd def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, colorizer=None, plotnonfinite=False, **kwargs): """ A scatter plot of *y* vs. *x* with varying marker size and/or color. Parameters ---------- x, y : float or array-like, shape (n, ) The data positions. s : float or array-like, shape (n, ), optional The marker size in points**2 (typographic points are 1/72 in.). Default is ``rcParams['lines.markersize'] ** 2``. The linewidth and edgecolor can visually interact with the marker size, and can lead to artifacts if the marker size is smaller than the linewidth. If the linewidth is greater than 0 and the edgecolor is anything but *'none'*, then the effective size of the marker will be increased by half the linewidth because the stroke will be centered on the edge of the shape. To eliminate the marker edge either set *linewidth=0* or *edgecolor='none'*. c : array-like or list of :mpltype:`color` or :mpltype:`color`, optional The marker colors. Possible values: - A scalar or sequence of n numbers to be mapped to colors using *cmap* and *norm*. - A 2D array in which the rows are RGB or RGBA. - A sequence of colors of length n. - A single color format string. Note that *c* should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped. If you want to specify the same RGB or RGBA value for all points, use a 2D array with a single row. Otherwise, value-matching will have precedence in case of a size matching with *x* and *y*. If you wish to specify a single color for all points prefer the *color* keyword argument. Defaults to `None`. In that case the marker color is determined by the value of *color*, *facecolor* or *facecolors*. In case those are not specified or `None`, the marker color is determined by the next color of the ``Axes``' current "shape and fill" color cycle. This cycle defaults to :rc:`axes.prop_cycle`. marker : `~.markers.MarkerStyle`, default: :rc:`scatter.marker` The marker style. *marker* can be either an instance of the class or the text shorthand for a particular marker. See :mod:`matplotlib.markers` for more information about marker styles. %(cmap_doc)s This parameter is ignored if *c* is RGB(A). %(norm_doc)s This parameter is ignored if *c* is RGB(A). %(vmin_vmax_doc)s This parameter is ignored if *c* is RGB(A). alpha : float, default: None The alpha blending value, between 0 (transparent) and 1 (opaque). linewidths : float or array-like, default: :rc:`lines.linewidth` The linewidth of the marker edges. Note: The default *edgecolors* is 'face'. You may want to change this as well. edgecolors : {'face', 'none', *None*} or :mpltype:`color` or list of \ :mpltype:`color`, default: :rc:`scatter.edgecolors` The edge color of the marker. Possible values: - 'face': The edge color will always be the same as the face color. - 'none': No patch boundary will be drawn. - A color or sequence of colors. For non-filled markers, *edgecolors* is ignored. Instead, the color is determined like with 'face', i.e. from *c*, *colors*, or *facecolors*. %(colorizer_doc)s This parameter is ignored if *c* is RGB(A). plotnonfinite : bool, default: False Whether to plot points with nonfinite *c* (i.e. ``inf``, ``-inf`` or ``nan``). If ``True`` the points are drawn with the *bad* colormap color (see `.Colormap.set_bad`). Returns ------- `~matplotlib.collections.PathCollection` Other Parameters ---------------- data : indexable object, optional DATA_PARAMETER_PLACEHOLDER **kwargs : `~matplotlib.collections.PathCollection` properties %(PathCollection:kwdoc)s See Also -------- plot : To plot scatter plots when markers are identical in size and color. Notes ----- * The `.plot` function will be faster for scatterplots where markers don't vary in size or color. * Any or all of *x*, *y*, *s*, and *c* may be masked arrays, in which case all masks will be combined and only unmasked points will be plotted. * Fundamentally, scatter works with 1D arrays; *x*, *y*, *s*, and *c* may be input as N-D arrays, but within scatter they will be flattened. The exception is *c*, which will be flattened only if its size matches the size of *x* and *y*. """ # add edgecolors and linewidths to kwargs so they # can be processed by normailze_kwargs if edgecolors is not None: kwargs.update({'edgecolors': edgecolors}) if linewidths is not None: kwargs.update({'linewidths': linewidths}) kwargs = cbook.normalize_kwargs(kwargs, mcoll.Collection) # re direct linewidth and edgecolor so it can be # further processed by the rest of the function linewidths = kwargs.pop('linewidth', None) edgecolors = kwargs.pop('edgecolor', None) # Process **kwargs to handle aliases, conflicts with explicit kwargs: x, y = self._process_unit_info([("x", x), ("y", y)], kwargs) # np.ma.ravel yields an ndarray, not a masked array, # unless its argument is a masked array. x = np.ma.ravel(x) y = np.ma.ravel(y) if x.size != y.size: raise ValueError("x and y must be the same size") if s is None: s = (20 if mpl.rcParams['_internal.classic_mode'] else mpl.rcParams['lines.markersize'] ** 2.0) s = np.ma.ravel(s) if (len(s) not in (1, x.size) or (not np.issubdtype(s.dtype, np.floating) and not np.issubdtype(s.dtype, np.integer))): raise ValueError( "s must be a scalar, " "or float array-like with the same size as x and y") # get the original edgecolor the user passed before we normalize orig_edgecolor = edgecolors if edgecolors is None: orig_edgecolor = kwargs.get('edgecolor', None) c, colors, edgecolors = \ self._parse_scatter_color_args( c, edgecolors, kwargs, x.size, get_next_color_func=self._get_patches_for_fill.get_next_color) if plotnonfinite and colors is None: c = np.ma.masked_invalid(c) x, y, s, edgecolors, linewidths = \ cbook._combine_masks(x, y, s, edgecolors, linewidths) else: x, y, s, c, colors, edgecolors, linewidths = \ cbook._combine_masks( x, y, s, c, colors, edgecolors, linewidths) # Unmask edgecolors if it was actually a single RGB or RGBA. if (x.size in (3, 4) and np.ma.is_masked(edgecolors) and not np.ma.is_masked(orig_edgecolor)): edgecolors = edgecolors.data scales = s # Renamed for readability below. # load default marker from rcParams if marker is None: marker = mpl.rcParams['scatter.marker'] if isinstance(marker, mmarkers.MarkerStyle): marker_obj = marker else: marker_obj = mmarkers.MarkerStyle(marker) path = marker_obj.get_path().transformed( marker_obj.get_transform()) if not marker_obj.is_filled(): if orig_edgecolor is not None: _api.warn_external( f"You passed a edgecolor/edgecolors ({orig_edgecolor!r}) " f"for an unfilled marker ({marker!r}). Matplotlib is " "ignoring the edgecolor in favor of the facecolor. This " "behavior may change in the future." ) # We need to handle markers that cannot be filled (like # '+' and 'x') differently than markers that can be # filled, but have their fillstyle set to 'none'. This is # to get: # # - respecting the fillestyle if set # - maintaining back-compatibility for querying the facecolor of # the un-fillable markers. # # While not an ideal situation, but is better than the # alternatives. if marker_obj.get_fillstyle() == 'none': # promote the facecolor to be the edgecolor edgecolors = colors # set the facecolor to 'none' (at the last chance) because # we cannot fill a path if the facecolor is non-null # (which is defendable at the renderer level). colors = 'none' else: # if we are not nulling the face color we can do this # simpler edgecolors = 'face' if linewidths is None: linewidths = mpl.rcParams['lines.linewidth'] elif np.iterable(linewidths): linewidths = [ lw if lw is not None else mpl.rcParams['lines.linewidth'] for lw in linewidths] offsets = np.ma.column_stack([x, y]) collection = mcoll.PathCollection( (path,), scales, facecolors=colors, edgecolors=edgecolors, linewidths=linewidths, offsets=offsets, offset_transform=kwargs.pop('transform', self.transData), alpha=alpha, ) collection.set_transform(mtransforms.IdentityTransform()) if colors is None: if colorizer: collection._set_colorizer_check_keywords(colorizer, cmap=cmap, norm=norm, vmin=vmin, vmax=vmax) else: collection.set_cmap(cmap) collection.set_norm(norm) collection.set_array(c) > collection._scale_norm(norm, vmin, vmax) /usr/lib64/python3.14/site-packages/matplotlib/axes/_axes.py:5044: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = norm = None, vmin = np.timedelta64(-172800000000,'us') vmax = np.timedelta64(172800000000,'us') def _scale_norm(self, norm, vmin, vmax): > self._colorizer._scale_norm(norm, vmin, vmax, self._A) /usr/lib64/python3.14/site-packages/matplotlib/colorizer.py:335: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , norm = None vmin = np.timedelta64(-172800000000,'us') vmax = np.timedelta64(172800000000,'us') A = masked_array(data=[-8.640e+10, 0.000e+00, 8.640e+10, 1.728e+11, -8.640e+10, 0.000e+00, 8.640e+..., -8.640e+10, 0.000e+00, 8.640e+10, 1.728e+11], mask=False, fill_value=1e+20) def _scale_norm(self, norm, vmin, vmax, A): """ Helper for initial scaling. Used by public functions that create a ScalarMappable and support parameters *vmin*, *vmax* and *norm*. This makes sure that a *norm* will take precedence over *vmin*, *vmax*. Note that this method does not set the norm. """ if vmin is not None or vmax is not None: > self.set_clim(vmin, vmax) /usr/lib64/python3.14/site-packages/matplotlib/colorizer.py:76: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = vmin = np.timedelta64(-172800000000,'us') vmax = np.timedelta64(172800000000,'us') def set_clim(self, vmin=None, vmax=None): """ Set the norm limits for image scaling. Parameters ---------- vmin, vmax : float The limits. The limits may also be passed as a tuple (*vmin*, *vmax*) as a single positional argument. .. ACCEPTS: (vmin: float, vmax: float) """ # If the norm's limits are updated self.changed() will be called # through the callbacks attached to the norm, this causes an inconsistent # state, to prevent this blocked context manager is used if vmax is None: try: vmin, vmax = vmin except (TypeError, ValueError): pass orig_vmin_vmax = self.norm.vmin, self.norm.vmax # Blocked context manager prevents callbacks from being triggered # until both vmin and vmax are updated with self.norm.callbacks.blocked(signal='changed'): if vmin is not None: > self.norm.vmin = colors._sanitize_extrema(vmin) ^^^^^^^^^^^^^^ /usr/lib64/python3.14/site-packages/matplotlib/colorizer.py:278: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = value = datetime.timedelta(days=-2) @vmin.setter def vmin(self, value): > value = _sanitize_extrema(value) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib64/python3.14/site-packages/matplotlib/colors.py:2181: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ex = datetime.timedelta(days=-2) def _sanitize_extrema(ex): if ex is None: return ex try: ret = ex.item() except AttributeError: > ret = float(ex) ^^^^^^^^^ E TypeError: float() argument must be a string or a real number, not 'datetime.timedelta' /usr/lib64/python3.14/site-packages/matplotlib/colors.py:213: TypeError =============================== warnings summary =============================== ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:278 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:278 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:278 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:278 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:278: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html flaky = pytest.mark.flaky ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:279 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:279 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:279 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:279 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/__init__.py:279: PytestUnknownMarkWarning: Unknown pytest.mark.network - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html network = pytest.mark.network ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2611 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2611 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2611 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2611 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2611: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.flaky ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6328 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6328 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6328 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6328 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6328: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.flaky ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:159 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:159 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:159 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:159 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:159: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:85 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:85 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:85 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:85 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:85: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.flaky ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:162 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:162 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:162 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:162 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:162: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:396 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:396 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:396 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:396 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:396: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:638 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:638 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:638 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:638 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:638: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:656 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:656 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:656 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:656 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:656: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:673 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:673 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:673 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:673 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:673: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:699 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:699 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:699 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:699 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:699: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:800 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:800 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:800 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:800 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:800: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:938 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:938 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:938 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:938 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:938: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:998 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:998 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:998 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:998 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:998: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1178 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1178 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1178 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1178 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1178: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1184 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1184 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1184 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1184 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1184: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1202 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1202 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1202 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1202 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1202: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1221 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1221 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1221 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1221 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1221: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1734 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1734 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1734 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1734 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1734: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1738 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1738 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1738 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1738 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1738: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1748 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1748 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1748 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1748 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1748: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1766 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1766 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1766 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1766 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1766: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1774 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1774 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1774 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1774 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1774: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1795 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1795 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1795 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1795 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1795: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1843 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1843 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1843 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1843 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1843: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1881 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1881 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1881 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1881 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1881: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1948 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1948 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1948 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1948 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1948: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1971 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1971 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1971 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1971 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1971: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1986 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1986 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1986 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1986 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1986: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1996 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1996 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1996 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1996 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1996: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2001 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2001 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2001 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2001 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2001: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2140 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2140 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2140 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2140 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2140: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2224 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2224 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2224 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2224 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2224: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2235 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2235 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2235 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2235 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2235: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2247 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2247 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2247 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2247 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2247: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2259 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2259 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2259 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2259 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2259: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2284 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2284 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2284 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2284 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2284: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2293 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2293 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2293 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2293 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2293: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2298 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2298 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2298 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2298 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2298: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2307 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2307 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2307 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2307 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2307: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2313 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2313 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2313 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2313 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2313: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2319 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2319 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2319 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2319 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2319: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2339 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2339 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2339 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2339 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2339: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2350 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2350 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2350 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2350 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2350: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2357 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2357 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2357 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2357 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2357: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2366 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2366 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2366 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2366 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2366: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2388 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2388 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2388 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2388 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2388: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2403 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2403 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2403 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2403 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2403: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2410 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2410 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2410 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2410 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2410: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2429 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2429 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2429 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2429 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2429: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2437 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2437 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2437 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2437 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2437: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2451 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2451 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2451 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2451 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2451: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2458 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2458 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2458 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2458 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2458: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2510 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2510 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2510 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2510 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2510: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:784 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:784 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:784 ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:784 /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:784: PytestUnknownMarkWarning: Unknown pytest.mark.slow - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html @pytest.mark.slow tests/test_backends.py::TestZarrDirectoryStore::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] tests/test_backends.py::TestZarrWriteEmpty::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] tests/test_backends.py::TestZarrDictStore::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/conventions.py:102: SerializationWarning: variable None will be stored as signed integers but _FillValue attribute can't be represented as a signed integer. var = coder.encode(var, name=name) tests/test_backends.py: 24 warnings tests/test_backends_datatree.py: 2 warnings tests/test_conventions.py: 2 warnings /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/conventions.py:102: SerializationWarning: variable 'x' will be stored as signed integers but _FillValue attribute can't be represented as a signed integer. var = coder.encode(var, name=name) tests/test_backends.py::TestZarrDictStore::test_chunk_key_encoding_v2[2] /usr/lib/python3.14/site-packages/zarr/creation.py:190: UserWarning: ignoring keyword argument 'chunk_key_encoding' compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs) tests/test_backends.py::TestNetCDF4ClassicViaH5NetCDFData::test_group_fails /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4793: RuntimeWarning: deallocating , but file is not already closed. This may indicate a bug. with pytest.raises( tests/test_dataset.py::TestDataset::test_fillna_extension_array[category] tests/test_dataset.py::TestDataset::test_fillna_extension_array[category] tests/test_dataarray.py::TestDataArray::test_fillna_extension_array[categorical] tests/test_dataarray.py::TestDataArray::test_fillna_extension_array[categorical] tests/test_dataarray.py::TestDataArray::test_fillna_extension_array_bad_val tests/test_dataarray.py::TestDataArray::test_fillna_extension_array_bad_val /usr/lib64/python3.14/site-packages/pandas/core/dtypes/common.py:1885: DeprecationWarning: Data type alias 'a' was deprecated in NumPy 2.0. Use the 'S' alias instead. npdtype = np.dtype(dtype) tests/test_combine.py::TestNestedCombine::test_nested_concat_too_many_dims_at_once /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_combine.py:452: FutureWarning: In a future version of xarray the default value for join will change from join='outer' to join='exact'. This change will result in the following ValueError: cannot be aligned with join='exact' because index/labels/sizes are not equal along these coordinates (dimensions): 'y' ('y',) The recommendation is to set join explicitly for this case. combine_nested(objs, concat_dim="x", coords="minimal") tests/test_duck_array_ops.py: 16 warnings /usr/lib/python3.14/site-packages/dask/array/core.py:5276: RuntimeWarning: overflow encountered in scalar add result = function(*args, **kwargs) tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_interp[pint] /builddir/build/BUILD/python-xarray-2025.12.0-build/BUILDROOT/usr/lib/python3.14/site-packages/xarray/core/variable.py:336: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray. data = np.asarray(data) tests/test_dask.py: 12 warnings /usr/lib64/python3.14/site-packages/numpy/_core/numeric.py:475: RuntimeWarning: invalid value encountered in cast multiarray.copyto(res, fill_value, casting='unsafe') tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_astype[pint] /usr/lib/python3.14/site-packages/pint/facets/numpy/quantity.py:88: RuntimeWarning: invalid value encountered in cast value = func(*args, **kwargs) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =================================== XPASSES ==================================== =========================== short test summary info ============================ SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_array_api.py:9: could not import 'array_api_strict': No module named 'array_api_strict' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cupy.py:9: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_distributed.py:18: could not import 'distributed': No module named 'distributed' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_sparse.py:22: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_strategies.py:8: could not import 'hypothesis': No module named 'hypothesis' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3039: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3090: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3121: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3129: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3148: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3152: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3155: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3158: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3167: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3177: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3188: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3198: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3205: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3214: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3226: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3239: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3255: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3290: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3309: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3336: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3356: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3393: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3403: requires zarr>=3.0.0 SKIPPED [36] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3416: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3458: requires zarr>=3.0.0 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3466: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3479: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3523: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3599: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3620: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3631: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3640: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3653: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3667: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3683: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3699: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3711: requires zarr>=3.0.0 SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3749: requires zarr>=3.0.0 SKIPPED [19] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:788: requires netcdf SKIPPED [25] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1130: uint8 data can't be written to non-NetCDF4 data SKIPPED [15] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1123: float32 will be treated as float64 in zarr SKIPPED [18] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1336: requires netcdf SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1449: No unlimited_dims handled in zarr. SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2689: zarr-python <3 did not support async loading SKIPPED [6] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1644: NetCDF backends don't support async loading SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2993: requires netcdf SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:169: Unsupported with zarr_format=2: No dimension names in V2 SKIPPED [6] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:169: Unsupported with zarr_format=2: This doesn't work with Zarr format 2 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4918: only valid for h5netcdf < 1.4.0 SKIPPED [6] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4928: only valid for h5netcdf < 1.4.0 SKIPPED [18] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1576: only relevant for pandas lt 2.2 SKIPPED [6] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1601: only relevant for pandas lt 2.2 SKIPPED [12] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1614: only relevant for pandas lt 2.2 SKIPPED [6] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1630: only relevant for pandas lt 2.2 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1644: only for pandas lt 2.2 SKIPPED [11] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_cftime_offsets.py:1659: only for pandas lt 2.2 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2434: https://github.com/Unidata/netcdf4-python/issues/1195 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:5271: caching behavior differs for dask SKIPPED [64] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:5393: Flaky test which can cause the worker to crash (so don't xfail). Very open to contributions fixing this SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4565: could not import 'aiobotocore': No module named 'aiobotocore' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2589: caching behavior differs for dask SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3873: zarr-python 2.x or ZARR_V3_EXPERIMENTAL_API is unset. SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3953: zarr-python 2.x or ZARR_V3_EXPERIMENTAL_API is unset. SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:5870: could not import 'aiobotocore': No module named 'aiobotocore' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4613: NetCDF backends don't support async loading SKIPPED [8] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coarsen.py:249: These parameters lead to all-NaN slices SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6466: requires pydap.client SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6501: requires pydap.client SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:6509: requires pydap.client SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4645: NetCDF backends don't support async loading SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4650: cannot pickle file objects SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4654: cannot pickle file objects SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:7541: netcdf-c>4.8.1 adds the _ARRAY_DIMENSIONS attribute SKIPPED [5] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:424: NetCDF backends don't support async loading SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4093: requires zarr>=3.0.0 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4122: requires zarr>=3.0.0 SKIPPED [30] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4160: requires zarr>=3.0.0 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:4260: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:497: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:505: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:533: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:539: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:610: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:629: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:637: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:658: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:663: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:699: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:704: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:716: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:724: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:758: requires zarr>=3.0.0 SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:773: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:783: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:798: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:814: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:831: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:838: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:853: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:867: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:931: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:970: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:980: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:988: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1016: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1031: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1049: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1070: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1081: requires zarr>=3.0.0 SKIPPED [10] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1097: requires zarr>=3.0.0 SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1173: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1289: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1297: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1312: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1348: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1383: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1407: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1422: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1447: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1488: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1505: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1528: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1534: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1542: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1548: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1555: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1570: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1592: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1605: requires zarr>=3.0.0 SKIPPED [5] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:1621: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2697: requires zarr>=3.0.0 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2700: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2711: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2725: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2735: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2750: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2768: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2812: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2818: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2847: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2866: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2874: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2890: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:2908: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3000: requires zarr>=3.0.0 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends.py:3029: requires zarr>=3.0.0 SKIPPED [13] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coding_times.py:1094: Nanosecond frequency is not valid for cftime dates. SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:686: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:694: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:726: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:739: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:755: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:771: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:859: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:870: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:895: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:910: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:925: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:941: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:968: zarr-python v2 cannot understand the zarr v3 format SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:996: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:1020: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:1048: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:1066: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:1090: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_backends_datatree.py:1114: zarr-python v2 cannot understand the zarr v3 format SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:3759: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:3772: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataset.py:4180: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataset.py:5332: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataset.py:8141: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataset.py:8156: requires cupy SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_conventions.py:601: cannot roundtrip coordinates yet for CFEncodedInMemoryStore SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:6989: requires iris SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7059: requires iris SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7141: requires iris SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7173: requires iris SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7210: requires iris SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7228: requires iris SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7480: requires sparse SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dataarray.py:7496: requires cupy SKIPPED [60] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:681: numpy's argmin (not nanargmin) does not handle object-dtype SKIPPED [36] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:683: numpy's nanargmin raises ValueError for all nan axis SKIPPED [80] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:674: dim not in this test SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_coding_times.py:1177: datetime64[ns] values can only be defined post reform SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_dtypes.py:132: requires array_api_strict SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:215: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:219: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:219: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:219: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:223: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:223: could not import 'jax.numpy': No module named 'jax' SKIPPED [16] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:592: dask does not compute object-typed array SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:223: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:229: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:229: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:229: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:233: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:233: could not import 'jax.numpy': No module named 'jax' SKIPPED [16] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:586: numpy does not support this SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:233: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:237: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:237: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:237: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:241: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:241: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:241: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:245: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:245: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:245: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:249: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:249: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:249: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:254: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:254: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:254: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:259: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:259: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:259: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:264: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:264: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:264: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:268: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:268: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:268: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:273: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:273: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:273: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:277: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:277: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:277: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:281: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:281: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:281: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:286: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:286: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:286: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:290: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:290: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:290: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:295: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:295: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:295: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:300: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:300: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:300: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:305: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:305: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:305: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:309: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:309: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:309: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:313: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:313: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:313: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:317: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:317: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:317: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:321: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:321: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:321: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:325: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:325: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:325: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:330: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:330: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:330: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:334: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:334: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:334: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:338: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:338: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:338: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:343: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:343: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:343: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:349: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:349: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:349: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:353: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:353: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:353: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:359: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:359: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:359: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:363: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:363: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:363: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:367: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:367: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:367: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:371: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:371: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:371: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:376: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:376: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:376: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:516: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:381: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:381: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:516: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:381: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:386: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:386: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:386: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:391: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:391: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:391: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:396: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:331: requires flox SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:396: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:396: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:401: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:401: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:401: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:406: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:406: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:406: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:411: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:411: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:411: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:416: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:416: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:416: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:421: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:421: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:421: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:426: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:426: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:426: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:431: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:431: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:431: could not import 'sparse': No module named 'sparse' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:436: could not import 'cupy': No module named 'cupy' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:436: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:436: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:441: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:441: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:441: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:445: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:445: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:445: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:449: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:449: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:449: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:453: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:453: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:453: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:457: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:457: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:457: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:461: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:461: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:461: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:465: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:465: could not import 'jax.numpy': No module named 'jax' SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:1266: requires flox SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:465: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:470: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:470: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:470: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:474: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:474: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:474: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:478: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:478: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:478: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:482: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:482: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:482: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:488: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:488: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:488: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:492: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:492: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:492: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:496: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:496: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:496: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:500: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:500: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:500: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:504: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:504: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:504: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:508: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:508: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:508: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:512: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:512: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:512: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:516: could not import 'cupy': No module named 'cupy' SKIPPED [8] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:2659: requires flox SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:2682: Skipped SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:2721: requires flox SKIPPED [8] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:3024: requires flox>=0.9.12 SKIPPED [3] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_groupby.py:3053: requires flox>=0.9.12 SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_missing.py:458: requires numbagg SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_namedarray.py:388: could not import 'array_api_strict': No module named 'array_api_strict' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_pandas_to_xarray.py:131: Test doesn't make sense for empty index SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_ops.py:964: out-of-bounds datetime64 overflow SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:146: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:146: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:146: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:151: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:151: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:151: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:156: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:156: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:156: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:161: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:161: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:161: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:165: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:165: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:165: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:169: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:169: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:169: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:174: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:174: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:174: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:178: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:178: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:178: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:182: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:182: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:182: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:186: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:186: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:186: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:191: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:191: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:191: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:195: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:195: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:195: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:207: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:207: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:207: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:211: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:211: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:211: could not import 'sparse': No module named 'sparse' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:215: could not import 'cupy': No module named 'cupy' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_duck_array_wrapping.py:215: could not import 'jax.numpy': No module named 'jax' SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:1329: Skipped SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2152: does not make sense for surface plots SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2156: does not make sense for surface plots SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2163: does not make sense for surface plots SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2167: does not make sense for surface plots SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2171: does not make sense for surface plots SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:2175: does not make sense for surface plots SKIPPED [32] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:453: requires numbagg SKIPPED [8] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:467: requires numbagg SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:489: requires numbagg SKIPPED [32] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:797: std with window == 1 is unstable in bottleneck SKIPPED [24] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_interp.py:912: Too slow. SKIPPED [72] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_weighted.py:298: `method` argument is not currently exposed SKIPPED [2] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:893: requires numbagg SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_rolling.py:900: requires numbagg SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:3053: nc_time_axis is not installed SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:3056: nc_time_axis is not installed SKIPPED [1] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:3059: nc_time_axis is not installed SKIPPED [4] ../BUILDROOT/usr/lib/python3.14/site-packages/xarray/tests/test_plot.py:3285: requires cartopy XFAIL tests/test_backends.py::TestZarrDirectoryStore::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestH5NetCDFFileObject::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestH5NetCDFFileObject::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestZarrDirectoryStore::test_roundtrip_bytes_with_fill_value[2] - Broken by Zarr 3.0.7 XFAIL tests/test_backends.py::TestNetCDF4Data::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4Data::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestZarrWriteEmpty::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestH5NetCDFViaDaskData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestZarrWriteEmpty::test_roundtrip_bytes_with_fill_value[2] - Broken by Zarr 3.0.7 XFAIL tests/test_backends.py::TestH5NetCDFViaDaskData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4ViaDaskData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4ViaDaskData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestScipyInMemoryData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestZarrDictStore::test_roundtrip_mask_and_scale[2-dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestScipyInMemoryData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestZarrDictStore::test_roundtrip_bytes_with_fill_value[2] - Broken by Zarr 3.0.7 XFAIL tests/test_backends.py::TestEncodingInvalid::test_extract_h5nc_encoding XFAIL tests/test_backends.py::TestScipyFileObject::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestScipyFileObject::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestScipyFilePath::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestScipyFilePath::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF3ViaNetCDF4Data::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends_datatree.py::TestNetCDF4DataTree::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF3ViaNetCDF4Data::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends_datatree.py::TestNetCDF4DataTree::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4ClassicViaNetCDF4Data::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4ClassicViaNetCDF4Data::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_cftimeindex.py::test_multiindex - fails on pandas main branch XFAIL tests/test_backends.py::TestNetCDF4ClassicViaH5NetCDFData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestNetCDF4ClassicViaH5NetCDFData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_dataset.py::TestDataset::test_copy_coords[False-expected_orig1] XFAIL tests/test_dataarray.py::TestDataArray::test_copy_coords[False-expected_orig1] XFAIL tests/test_backends.py::TestGenericNetCDFData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestGenericNetCDFData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_dataarray.py::TestReduce1D::test_idxmax[True-datetime] - dask operation 'argmax' breaks when dtype is datetime64 (M) XFAIL tests/test_backends.py::TestH5NetCDFData::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_backends.py::TestH5NetCDFData::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_dataarray.py::TestReduce2D::test_idxmin[dask-datetime] - dask operation 'argmin' breaks when dtype is datetime64 (M) XFAIL tests/test_conventions.py::TestCFEncodedDataStore::test_roundtrip_mask_and_scale[dtype0-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_conventions.py::TestCFEncodedDataStore::test_roundtrip_mask_and_scale[dtype1-create_bad_unsigned_masked_scaled_data-create_bad_encoded_unsigned_masked_scaled_data] - Bad _Unsigned attribute. XFAIL tests/test_datatree.py::TestGetItem::test_getitem_multiple_data_variables - Should be deprecated in favour of .subset XFAIL tests/test_dataarray.py::TestReduce2D::test_idxmax[dask-datetime] - dask operation 'argmax' breaks when dtype is datetime64 (M) XFAIL tests/test_datatree.py::TestGetItem::test_getitem_dict_like_selection_access_to_dataset - Indexing needs to return whole tree (GH https://github.com/xarray-contrib/datatree/issues/77) XFAIL tests/test_datatree.py::TestCopy::test_copy_with_data - data argument not yet implemented XFAIL tests/test_datatree.py::TestSetItem::test_setitem_dataset_on_this_node - assigning Datasets doesn't yet create new nodes XFAIL tests/test_datatree.py::TestUFuncs::test_tree - __array_ufunc__ not implemented yet XFAIL tests/test_dask.py::TestToDaskDataFrame::test_to_dask_dataframe_2D - Currently pandas with pyarrow installed will return a `string[pyarrow]` type, which causes the `y` column to have a different type depending on whether pyarrow is installed XFAIL tests/test_dask.py::TestToDaskDataFrame::test_to_dask_dataframe_2D_set_index XFAIL tests/test_dask.py::TestToDaskDataFrame::test_to_dask_dataframe_not_daskarray - Currently pandas with pyarrow installed will return a `string[pyarrow]` type, which causes the index to have a different type depending on whether pyarrow is installed XFAIL tests/test_coding_times.py::test_timedelta_coding_via_dtype_non_pandas_fine_resolution_warning - xarray does not recognize picoseconds as time-like XFAIL tests/test_combine.py::TestNestedCombine::test_nested_concat_too_many_dims_at_once XFAIL tests/test_datatree_mapping.py::TestMapOverSubTree::test_trees_with_different_node_names XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_interp[pint] - interp uses numpy and scipy XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_isnull[pint] - xfail for pint: returns a bool XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_notnull[pint] - xfail for pint: returns a bool XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_count[pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_ffill[dask.array] - ffill uses bottleneck or numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_ffill[pint] - ffill uses bottleneck or numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_bfill[dask.array] - bfill uses bottleneck or numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_bfill[pint] - bfill uses bottleneck or numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_interpolate_na[dask.array] - interpolate_na uses numpy and scipy XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_interpolate_na[pint] - interpolate_na uses numpy and scipy XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_isin[pint] - xfail for pint: returns a bool XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rolling_reduce[True-pint] - xfail for pint: no dispatch for numbagg/bottleneck XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rolling_reduce[False-pint] - xfail for pint: no dispatch for numbagg/bottleneck XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rolling_exp_reduce[dask.array] - rolling_exp uses numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rolling_exp_reduce[pint] - rolling_exp uses numbagg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_cumulative_reduce[pint] - xfail for pint: no dispatch for numbagg/bottleneck XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_weighted[pint] - xfail for pint: no tensordot XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_dot[pint] - xfail for pint: no tensordot XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_polyfit[pint] - polyfit uses numpy linalg XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_all[pint] - xfail for pint: returns a bool XFAIL tests/test_computation.py::test_cross[a5-b5-ae5-be5-cartesian--1-True] XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_any[pint] - xfail for pint: returns a bool XFAIL tests/test_computation.py::test_cross[a6-b6-ae6-be6-cartesian--1-True] XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argmax[True-pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argmax[False-pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argmin[True-pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argmin[False-pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_idxmax[True-pint] - xfail for pint: returns the coordinate XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_idxmax[False-pint] - xfail for pint: returns the coordinate XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_idxmin[True-pint] - xfail for pint: returns the coordinate XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_idxmin[False-pint] - xfail for pint: returns the coordinate XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argsort[dask.array] - xfail for dask.array: no argsort XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_argsort[pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_conjugate[dask.array] - xfail for dask.array: conj but no conjugate XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_searchsorted[dask.array] - xfail for dask.array: dask.array.searchsorted but no Array.searchsorted XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_searchsorted[pint] - xfail for pint: returns an int XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rank[dask.array] - rank uses bottleneck XFAIL tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_rank[pint] - rank uses bottleneck XFAIL tests/test_interp.py::test_datetime[2000-01-01T12:00-0.5] XFAIL tests/test_missing.py::test_interpolate_na_2d[None] XFAIL tests/test_namedarray.py::TestNamedArray::test_init[expected1] - NamedArray only supports array-like objects XFAIL tests/test_duck_array_wrapping.py::TestTopLevelMethods::test_full_like[pint] - xfail for pint: should work, see: https://github.com/hgrecco/pint/pull/1669 XFAIL tests/test_duck_array_wrapping.py::TestTopLevelMethods::test_dot[pint] - xfail for pint: no tensordot XFAIL tests/test_plot.py::TestSurface::test_dates_are_concise - Failing inside matplotlib. Should probably be fixed upstream because other plot functions can handle it. Remove this test when it works, already in Common2dMixin XFAIL tests/test_ufuncs.py::TestXarrayUfuncs::test_ufunc_duck_dask_no_array_ufunc - dask ufuncs currently dispatch to numpy XPASS tests/test_backends.py::test_use_cftime_false_standard_calendar_in_range[gregorian] - https://github.com/pandas-dev/pandas/issues/56996 XPASS tests/test_backends.py::test_use_cftime_false_standard_calendar_in_range[proleptic_gregorian] - https://github.com/pandas-dev/pandas/issues/56996 XPASS tests/test_backends.py::test_use_cftime_false_standard_calendar_in_range[standard] - https://github.com/pandas-dev/pandas/issues/56996 XPASS tests/test_backends_datatree.py::TestZarrDatatreeIO::test_to_zarr_zip_store[zarr_format=2] - upstream zarr read-only changes have broken this test XPASS tests/test_dataset.py::TestDataset::test_copy_coords[True-expected_orig0] XPASS tests/test_dataarray.py::TestDataArray::test_copy_coords[True-expected_orig0] XPASS tests/test_backends.py::TestGenericNetCDFData::test_roundtrip_via_file_object - scipy.io.netcdf_file closes files upon garbage collection XPASS tests/test_dask.py::TestToDaskDataFrame::test_to_dask_dataframe - https://github.com/dask/dask/issues/11584 XPASS tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_interp[dask.array] - interp uses numpy and scipy XPASS tests/test_duck_array_wrapping.py::TestDataArrayMethods::test_polyfit[dask.array] - polyfit uses numpy linalg XPASS tests/test_computation.py::test_cross[a5-b5-ae5-be5-cartesian--1-False] XPASS tests/test_computation.py::test_cross[a6-b6-ae6-be6-cartesian--1-False] XPASS tests/test_plot.py::TestImshow::test_dates_are_concise - Failing inside matplotlib. Should probably be fixed upstream because other plot functions can handle it. Remove this test when it works, already in Common2dMixin ERROR tests/test_units.py - _pytest.nodes.Collector.CollectError: ImportError... ERROR tests/test_units.py - _pytest.nodes.Collector.CollectError: ImportError... ERROR tests/test_units.py - _pytest.nodes.Collector.CollectError: ImportError... ERROR tests/test_units.py - _pytest.nodes.Collector.CollectError: ImportError... ERROR tests/test_variable.py - _pytest.nodes.Collector.CollectError: ImportEr... ERROR tests/test_variable.py - _pytest.nodes.Collector.CollectError: ImportEr... ERROR tests/test_variable.py - _pytest.nodes.Collector.CollectError: ImportEr... ERROR tests/test_variable.py - _pytest.nodes.Collector.CollectError: ImportEr... FAILED tests/test_coding_times.py::test_cf_timedelta[1D-days-numbers0] - Asse... FAILED tests/test_coding_times.py::test_cf_timedelta[timedeltas1-days-numbers1] FAILED tests/test_coding_times.py::test_cf_timedelta[1h-hours-numbers2] - Ass... FAILED tests/test_coding_times.py::test_cf_timedelta[1ms-milliseconds-numbers3] FAILED tests/test_coding_times.py::test_cf_timedelta[1us-microseconds-numbers4] FAILED tests/test_coding_times.py::test_cf_timedelta[timedeltas7-hours-numbers7] FAILED tests/test_coding_times.py::test_cf_timedelta[timedeltas9-days-numbers9] FAILED tests/test_coding_times.py::test_cf_timedelta_2d - AssertionError: ass... FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[365_day] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[360_day] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[julian] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[all_leap] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[366_day] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[gregorian] FAILED tests/test_cftimeindex.py::test_distant_cftime_datetime_sub_cftimeindex[proleptic_gregorian] FAILED tests/test_dataarray.py::TestDataArray::test_curvefit_helpers - Failed... FAILED tests/test_interp.py::test_datetime[x_new2-expected2] - AssertionError... FAILED tests/test_interp.py::test_datetime[x_new3-expected3] - AssertionError... FAILED tests/test_interp.py::test_datetime[x_new4-0.5] - AssertionError: Left... FAILED tests/test_groupby.py::test_groupby_bins_datetime_mean - AssertionErro... FAILED tests/test_groupby.py::test_groupby_bins_mean_time_series - AssertionE... FAILED tests/test_interp.py::test_datetime_single_string - AssertionError: Le... FAILED tests/test_plot.py::TestDatasetScatterPlots::test_datetime_hue - TypeE... = 23 failed, 17731 passed, 1254 skipped, 97 xfailed, 13 xpassed, 294 warnings, 8 errors in 199.51s (0:03:19) = error: Bad exit status from /var/tmp/rpm-tmp.GyIMb4 (%check) Bad exit status from /var/tmp/rpm-tmp.GyIMb4 (%check) RPM build errors: Finish: rpmbuild python-xarray-2025.12.0-2.fc44.src.rpm Finish: build phase for python-xarray-2025.12.0-2.fc44.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1770295020.048645/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-xarray-2025.12.0-2.fc44.src.rpm) Config(fedora-rawhide-x86_64) 3 minutes 47 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 6f77529245fc4978b36ee3e29afd0e1a -D /var/lib/mock/fedora-rawhide-x86_64-1770295020.048645/root -a -u mockbuild --capability=cap_ipc_lock --capability=cap_ipc_lock --bind=/tmp/mock-resolv.at23ms0g:/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 /builddir/build/originals/python-xarray.spec' Copr build error: Build failed