Warning: Permanently added '2620:52:3:1:dead:beef:cafe:c1d2' (ED25519) to the list of known hosts. INFO: Downloading chameleon-4.5.4.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -o chameleon-4.5.4.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/@python/python3.14/python-chameleon/chameleon-4.5.4.tar.gz/md5/2861abcd16866050ab7a44e70bda6ad1/chameleon-4.5.4.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 139k 100 139k 0 0 654k 0 --:--:-- --:--:-- --:--:-- 655k INFO: Reading stdout from command: md5sum chameleon-4.5.4.tar.gz Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-k783689g/python-chameleon/python-chameleon.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-k783689g/python-chameleon --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1734695013.358900 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 5.9 starting (python version = 3.13.0, NVR = mock-5.9-1.fc41), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-k783689g/python-chameleon/python-chameleon.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-k783689g/python-chameleon --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1734695013.358900 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-k783689g/python-chameleon/python-chameleon.spec) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Mock Version: 5.9 INFO: Mock Version: 5.9 Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1734695013.358900/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (fallback) INFO: Buildroot is handled by package management from host and used with --installroot: rpm-4.20.0-1.fc41.x86_64 rpm-sequoia-1.7.0-2.fc41.x86_64 python3-dnf-4.22.0-1.fc41.noarch python3-dnf-plugins-core-4.10.0-1.fc41.noarch dnf5-5.2.8.1-2.fc41.x86_64 dnf5-plugins-5.2.8.1-2.fc41.x86_64 Start: installing minimal buildroot with dnf5 Updating and loading repositories: fedora 100% | 877.0 KiB/s | 28.1 KiB | 00m00s Copr repository 100% | 46.6 KiB/s | 1.5 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 73.6 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 41.1 MiB/s | 7.6 MiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash x86_64 5.2.37-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.2 MiB bzip2 x86_64 1.0.8-19.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 95.7 KiB coreutils x86_64 9.5-11.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 5.4 MiB cpio x86_64 2.15-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 MiB diffutils x86_64 3.10-8.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB fedora-release-common noarch 42-0.11 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 19.8 KiB findutils x86_64 1:4.10.0-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 MiB gawk x86_64 5.3.0-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB glibc-minimal-langpack x86_64 2.40.9000-24.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B grep x86_64 3.11-9.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB gzip x86_64 1.13-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 389.0 KiB info x86_64 7.1.1-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 361.8 KiB patch x86_64 2.7.6-25.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 266.7 KiB redhat-rpm-config noarch 296-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 186.6 KiB rpm-build x86_64 4.20.0-3.fc42 copr_base 185.8 KiB sed x86_64 4.9-3.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 861.5 KiB shadow-utils x86_64 2:4.17.0~rc1-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.1 MiB tar x86_64 2:1.35-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.9 MiB unzip x86_64 6.0-65.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 398.2 KiB util-linux x86_64 2.40.2-8.fc42 copr_base 3.5 MiB which x86_64 2.21-42.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 80.2 KiB xz x86_64 1:5.6.3-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.2 MiB Installing dependencies: add-determinism x86_64 0.4.3-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.4 MiB alternatives x86_64 1.31-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 64.8 KiB ansible-srpm-macros noarch 1-16.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 35.7 KiB audit-libs x86_64 4.0.2-1.fc42 copr_base 327.3 KiB authselect x86_64 1.5.0-8.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 157.5 KiB authselect-libs x86_64 1.5.0-8.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 822.2 KiB basesystem noarch 11-21.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B binutils x86_64 2.43.50-9.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 25.8 MiB build-reproducibility-srpm-macros noarch 0.4.3-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 735.0 B bzip2-libs x86_64 1.0.8-19.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 80.7 KiB ca-certificates noarch 2024.2.69_v8.0.401-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.6 MiB coreutils-common x86_64 9.5-11.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 11.2 MiB cracklib x86_64 2.9.11-6.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 238.9 KiB crypto-policies noarch 20241128-1.gitbb7b0b0.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 137.3 KiB curl x86_64 8.11.1-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 452.0 KiB cyrus-sasl-lib x86_64 2.1.28-27.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB debugedit x86_64 5.1-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 200.3 KiB dwz x86_64 0.15-8.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 299.2 KiB ed x86_64 1.20.2-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 146.9 KiB efi-srpm-macros noarch 5-13.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 40.2 KiB elfutils x86_64 0.192-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.6 MiB elfutils-debuginfod-client x86_64 0.192-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 81.4 KiB elfutils-default-yama-scope noarch 0.192-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 KiB elfutils-libelf x86_64 0.192-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.2 MiB elfutils-libs x86_64 0.192-7.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 662.9 KiB fedora-gpg-keys noarch 42-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 126.4 KiB fedora-release noarch 42-0.11 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B fedora-release-identity-basic noarch 42-0.11 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 719.0 B fedora-repos noarch 42-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.9 KiB fedora-repos-rawhide noarch 42-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 KiB file x86_64 5.45-8.fc42 copr_base 102.2 KiB file-libs x86_64 5.45-8.fc42 copr_base 9.9 MiB filesystem x86_64 3.18-29.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 106.0 B fonts-srpm-macros noarch 1:2.0.5-17.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 55.8 KiB forge-srpm-macros noarch 0.4.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.9 KiB fpc-srpm-macros noarch 1.3-13.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 144.0 B gdb-minimal x86_64 15.2-6.fc42 copr_base 12.7 MiB gdbm x86_64 1:1.23-7.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 460.9 KiB gdbm-libs x86_64 1:1.23-7.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 121.9 KiB ghc-srpm-macros noarch 1.9.2-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 779.0 B glibc x86_64 2.40.9000-24.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 6.7 MiB glibc-common x86_64 2.40.9000-24.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB glibc-gconv-extra x86_64 2.40.9000-24.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.0 MiB gmp x86_64 1:6.3.0-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 811.4 KiB gnat-srpm-macros noarch 6-6.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 KiB go-srpm-macros noarch 3.6.0-5.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 60.8 KiB jansson x86_64 2.14-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 93.1 KiB json-c x86_64 0.18-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.3 KiB kernel-srpm-macros noarch 1.0-24.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB keyutils-libs x86_64 1.6.3-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 54.4 KiB krb5-libs x86_64 1.21.3-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB libacl x86_64 2.3.2-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 40.0 KiB libarchive x86_64 3.7.7-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 932.3 KiB libattr x86_64 2.5.2-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 28.5 KiB libblkid x86_64 2.40.2-8.fc42 copr_base 257.2 KiB libbrotli x86_64 1.1.0-5.fc42 copr_base 836.4 KiB libcap x86_64 2.71-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 210.8 KiB libcap-ng x86_64 0.8.5-3.fc42 copr_base 70.8 KiB libcom_err x86_64 1.47.1-6.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 67.2 KiB libcurl x86_64 8.11.1-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 817.3 KiB libeconf x86_64 0.7.5-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 66.7 KiB libevent x86_64 2.1.12-14.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 895.7 KiB libfdisk x86_64 2.40.2-8.fc42 copr_base 368.4 KiB libffi x86_64 3.4.6-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 86.4 KiB libgcc x86_64 14.2.1-6.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 270.6 KiB libgomp x86_64 14.2.1-6.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 519.8 KiB libidn2 x86_64 2.3.7-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 329.1 KiB libmount x86_64 2.40.2-8.fc42 copr_base 352.8 KiB libnghttp2 x86_64 1.64.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 174.5 KiB libnsl2 x86_64 2.0.1-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 57.9 KiB libpkgconf x86_64 2.3.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 78.2 KiB libpsl x86_64 0.21.5-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 80.5 KiB libpwquality x86_64 1.4.5-11.fc42 copr_base 417.0 KiB libselinux x86_64 3.8-0.rc3.1.fc42 copr_base 191.6 KiB libsemanage x86_64 3.8-0.rc3.1.fc42 copr_base 305.3 KiB libsepol x86_64 3.8-0.rc3.1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 812.3 KiB libsmartcols x86_64 2.40.2-8.fc42 copr_base 176.2 KiB libssh x86_64 0.11.1-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 569.6 KiB libssh-config noarch 0.11.1-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 277.0 B libstdc++ x86_64 14.2.1-6.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.8 MiB libtasn1 x86_64 4.19.0-9.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 175.7 KiB libtirpc x86_64 1.3.6-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 205.5 KiB libtool-ltdl x86_64 2.5.4-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 68.1 KiB libunistring x86_64 1.1-8.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB libuuid x86_64 2.40.2-8.fc42 copr_base 39.9 KiB libverto x86_64 0.3.2-9.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 29.5 KiB libxcrypt x86_64 4.4.36-11.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 271.4 KiB libxml2 x86_64 2.12.8-2.fc42 copr_base 1.7 MiB libzstd x86_64 1.5.6-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 795.9 KiB lua-libs x86_64 5.4.7-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 285.0 KiB lua-srpm-macros noarch 1-14.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 KiB lz4-libs x86_64 1.10.0-1.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 145.5 KiB mpfr x86_64 4.2.1-5.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 832.1 KiB ncurses-base noarch 6.5-2.20240629.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 326.3 KiB ncurses-libs x86_64 6.5-2.20240629.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 975.2 KiB ocaml-srpm-macros noarch 10-3.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB openblas-srpm-macros noarch 2-18.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 112.0 B openldap x86_64 2.6.8-6.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 647.4 KiB openssl-libs x86_64 1:3.2.2-8.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 7.8 MiB p11-kit x86_64 0.25.5-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB p11-kit-trust x86_64 0.25.5-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 403.8 KiB package-notes-srpm-macros noarch 0.5-12.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 KiB pam x86_64 1.7.0-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 MiB pam-libs x86_64 1.7.0-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 139.4 KiB pcre2 x86_64 10.44-1.fc41.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 653.5 KiB pcre2-syntax noarch 10.44-1.fc41.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 251.6 KiB perl-srpm-macros noarch 1-56.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 861.0 B pkgconf x86_64 2.3.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 88.6 KiB pkgconf-m4 noarch 2.3.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 14.4 KiB pkgconf-pkg-config x86_64 2.3.0-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 989.0 B popt x86_64 1.19-7.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 136.9 KiB publicsuffix-list-dafsa noarch 20240107-4.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 67.5 KiB pyproject-srpm-macros noarch 1.16.3-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB python-srpm-macros noarch 3.14-3.fc42 copr_base 51.0 KiB qt5-srpm-macros noarch 5.15.15-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 500.0 B qt6-srpm-macros noarch 6.8.1-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 456.0 B readline x86_64 8.2-11.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 493.1 KiB rpm x86_64 4.20.0-3.fc42 copr_base 3.1 MiB rpm-build-libs x86_64 4.20.0-3.fc42 copr_base 204.1 KiB rpm-libs x86_64 4.20.0-3.fc42 copr_base 710.4 KiB rpm-sequoia x86_64 1.7.0-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB rust-srpm-macros noarch 26.3-3.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.8 KiB setup noarch 2.15.0-5.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 720.7 KiB sqlite-libs x86_64 3.47.2-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.4 MiB systemd-libs x86_64 257-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB util-linux-core x86_64 2.40.2-8.fc42 copr_base 1.5 MiB xxhash-libs x86_64 0.8.2-4.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 88.4 KiB xz-libs x86_64 1:5.6.3-2.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 218.4 KiB zig-srpm-macros noarch 1-3.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 KiB zip x86_64 3.0-42.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 695.9 KiB zlib-ng-compat x86_64 2.2.2-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 134.0 KiB zstd x86_64 1.5.6-2.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB Installing groups: Buildsystem building group Transaction Summary: Installing: 154 packages Total size of inbound packages is 51 MiB. Need to download 0 B. After this operation, 178 MiB extra will be used (install 178 MiB, remove 0 B). [1/1] tar-2:1.35-4.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [1/1] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/2] bzip2-0:1.0.8-19.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [2/2] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/3] redhat-rpm-config-0:296-1.fc42.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [3/3] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/4] rpm-build-0:4.20.0-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [4/4] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/5] unzip-0:6.0-65.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [5/5] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/6] cpio-0:2.15-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [6/6] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/7] which-0:2.21-42.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [7/7] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/8] bash-0:5.2.37-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [8/8] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/9] coreutils-0:9.5-11.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [9/9] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/10] grep-0:3.11-9.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [10/10] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/11] patch-0:2.7.6-25.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [11/11] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/12] sed-0:4.9-3.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [12/12] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/13] shadow-utils-2:4.17.0~rc1-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [13/13] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/14] util-linux-0:2.40.2-8.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [14/14] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/15] diffutils-0:3.10-8.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [15/15] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/16] fedora-release-common-0:42-0.11 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [16/16] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/17] findutils-1:4.10.0-4.fc41.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [17/17] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/18] gawk-0:5.3.0-4.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [18/18] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/19] glibc-minimal-langpack-0:2.40.9 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [19/19] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/20] gzip-0:1.13-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [20/20] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/21] info-0:7.1.1-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [21/21] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/22] xz-1:5.6.3-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [22/22] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/23] rpm-0:4.20.0-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [23/23] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/24] rpm-libs-0:4.20.0-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [24/24] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/25] rpm-build-libs-0:4.20.0-3.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [25/25] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/26] audit-libs-0:4.0.2-1.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [26/26] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/27] authselect-libs-0:1.5.0-8.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [27/27] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/28] glibc-0:2.40.9000-24.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [28/28] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/29] libblkid-0:2.40.2-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [29/29] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/30] libcap-ng-0:0.8.5-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [30/30] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/31] libfdisk-0:2.40.2-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [31/31] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/32] libmount-0:2.40.2-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [32/32] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/33] libselinux-0:3.8-0.rc3.1.fc42.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [33/33] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/34] libsmartcols-0:2.40.2-8.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [34/34] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/35] libuuid-0:2.40.2-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [35/35] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/36] ncurses-libs-0:6.5-2.20240629.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [36/36] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/37] pam-0:1.7.0-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [37/37] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/38] pam-libs-0:1.7.0-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [38/38] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/39] readline-0:8.2-11.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [39/39] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/40] systemd-libs-0:257-1.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [40/40] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/41] util-linux-core-0:2.40.2-8.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [41/41] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/42] zlib-ng-compat-0:2.2.2-1.fc42.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [42/42] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/43] bzip2-libs-0:1.0.8-19.fc41.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [43/43] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/44] libacl-0:2.3.2-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [44/44] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/45] libcap-0:2.71-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [45/45] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/46] libzstd-0:1.5.6-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [46/46] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/47] lua-libs-0:5.4.7-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [47/47] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/48] popt-0:1.19-7.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [48/48] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/49] rpm-sequoia-0:1.7.0-3.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [49/49] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/50] sqlite-libs-0:3.47.2-1.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [50/50] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/51] xz-libs-1:5.6.3-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [51/51] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/52] elfutils-libelf-0:0.192-7.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [52/52] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/53] elfutils-libs-0:0.192-7.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [53/53] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/54] file-libs-0:5.45-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [54/54] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/55] libgcc-0:14.2.1-6.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [55/55] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/56] libgomp-0:14.2.1-6.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [56/56] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/57] binutils-0:2.43.50-9.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [57/57] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/58] debugedit-0:5.1-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [58/58] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/59] elfutils-0:0.192-7.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [59/59] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/60] file-0:5.45-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [60/60] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/61] libarchive-0:3.7.7-1.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [61/61] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/62] pkgconf-pkg-config-0:2.3.0-1.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [62/62] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/63] zstd-0:1.5.6-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [63/63] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/64] curl-0:8.11.1-2.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [64/64] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/65] libsepol-0:3.8-0.rc3.1.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [65/65] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/66] pcre2-0:10.44-1.fc41.1.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [66/66] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/67] libstdc++-0:14.2.1-6.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [67/67] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/68] lz4-libs-0:1.10.0-1.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [68/68] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/69] libattr-0:2.5.2-4.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [69/69] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/70] libeconf-0:0.7.5-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [70/70] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/71] libsemanage-0:3.8-0.rc3.1.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [71/71] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/72] libxcrypt-0:4.4.36-11.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [72/72] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/73] setup-0:2.15.0-5.fc41.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [73/73] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/74] openssl-libs-1:3.2.2-8.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [74/74] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/75] glibc-gconv-extra-0:2.40.9000-2 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [75/75] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/76] ansible-srpm-macros-0:1-16.fc41 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [76/76] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/77] build-reproducibility-srpm-macr 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [77/77] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/78] dwz-0:0.15-8.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [78/78] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/79] efi-srpm-macros-0:5-13.fc42.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [79/79] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/80] fonts-srpm-macros-1:2.0.5-17.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [80/80] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/81] forge-srpm-macros-0:0.4.0-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [81/81] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/82] fpc-srpm-macros-0:1.3-13.fc41.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [82/82] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/83] ghc-srpm-macros-0:1.9.2-1.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [83/83] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/84] gnat-srpm-macros-0:6-6.fc41.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [84/84] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/85] go-srpm-macros-0:3.6.0-5.fc42.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [85/85] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/86] kernel-srpm-macros-0:1.0-24.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [86/86] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/87] lua-srpm-macros-0:1-14.fc41.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [87/87] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/88] ocaml-srpm-macros-0:10-3.fc41.n 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [88/88] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/89] openblas-srpm-macros-0:2-18.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [89/89] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/90] package-notes-srpm-macros-0:0.5 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [90/90] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/91] perl-srpm-macros-0:1-56.fc41.no 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [91/91] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/92] pyproject-srpm-macros-0:1.16.3- 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [92/92] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/93] python-srpm-macros-0:3.14-3.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [93/93] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/94] qt5-srpm-macros-0:5.15.15-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [94/94] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/95] qt6-srpm-macros-0:6.8.1-4.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [95/95] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/96] rust-srpm-macros-0:26.3-3.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [96/96] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/97] zig-srpm-macros-0:1-3.fc41.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [97/97] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/98] zip-0:3.0-42.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [98/98] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/99] pkgconf-0:2.3.0-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [99/99] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/100] pkgconf-m4-0:2.3.0-1.fc42.noa 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [100/100] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/101] libpkgconf-0:2.3.0-1.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [101/101] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/102] pcre2-syntax-0:10.44-1.fc41.1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [102/102] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/103] ed-0:1.20.2-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [103/103] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/104] authselect-0:1.5.0-8.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [104/104] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/105] gdbm-1:1.23-7.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [105/105] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/106] gdbm-libs-1:1.23-7.fc41.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [106/106] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/107] libnsl2-0:2.0.1-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [107/107] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/108] libpwquality-0:1.4.5-11.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [108/108] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/109] libtirpc-0:1.3.6-1.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [109/109] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/110] ca-certificates-0:2024.2.69_v 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [110/110] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/111] crypto-policies-0:20241128-1. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [111/111] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/112] ncurses-base-0:6.5-2.20240629 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [112/112] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/113] krb5-libs-0:1.21.3-3.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [113/113] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/114] libcom_err-0:1.47.1-6.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [114/114] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/115] libxml2-0:2.12.8-2.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [115/115] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/116] keyutils-libs-0:1.6.3-4.fc41. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [116/116] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/117] libverto-0:0.3.2-9.fc41.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [117/117] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/118] glibc-common-0:2.40.9000-24.f 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [118/118] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/119] basesystem-0:11-21.fc41.noarc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [119/119] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/120] filesystem-0:3.18-29.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [120/120] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/121] gmp-1:6.3.0-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [121/121] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/122] mpfr-0:4.2.1-5.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [122/122] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/123] fedora-repos-0:42-0.3.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [123/123] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/124] elfutils-default-yama-scope-0 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [124/124] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/125] elfutils-debuginfod-client-0: 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [125/125] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/126] coreutils-common-0:9.5-11.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [126/126] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/127] libffi-0:3.4.6-3.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [127/127] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/128] p11-kit-0:0.25.5-4.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [128/128] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/129] p11-kit-trust-0:0.25.5-4.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [129/129] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/130] add-determinism-0:0.4.3-1.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [130/130] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/131] alternatives-0:1.31-1.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [131/131] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/132] jansson-0:2.14-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [132/132] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/133] cracklib-0:2.9.11-6.fc41.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [133/133] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/134] libtasn1-0:4.19.0-9.fc41.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [134/134] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/135] fedora-gpg-keys-0:42-0.3.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [135/135] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/136] fedora-repos-rawhide-0:42-0.3 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [136/136] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/137] json-c-0:0.18-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [137/137] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/138] gdb-minimal-0:15.2-6.fc42.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [138/138] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/139] xxhash-libs-0:0.8.2-4.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [139/139] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/140] fedora-release-0:42-0.11.noar 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [140/140] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/141] fedora-release-identity-basic 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [141/141] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/142] libcurl-0:8.11.1-2.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [142/142] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/143] libbrotli-0:1.1.0-5.fc42.x86_ 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [143/143] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/144] libidn2-0:2.3.7-2.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [144/144] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/145] libnghttp2-0:1.64.0-1.fc42.x8 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [145/145] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/146] libpsl-0:0.21.5-4.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [146/146] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/147] libssh-0:0.11.1-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [147/147] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/148] openldap-0:2.6.8-6.fc42.x86_6 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [148/148] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/149] cyrus-sasl-lib-0:2.1.28-27.fc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [149/149] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/150] libevent-0:2.1.12-14.fc41.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [150/150] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/151] libtool-ltdl-0:2.5.4-1.fc42.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [151/151] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/152] libssh-config-0:0.11.1-1.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [152/152] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/153] libunistring-0:1.1-8.fc41.x86 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [153/153] Total 100% | 0.0 B/s | 0.0 B | 00m00s [ 1/154] publicsuffix-list-dafsa-0:202 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [154/154] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [ 1/156] Verify package files 100% | 770.0 B/s | 154.0 B | 00m00s >>> Running pre-transaction scriptlet: filesystem-0:3.18-29.fc42.x86_64 >>> Finished pre-transaction scriptlet: filesystem-0:3.18-29.fc42.x86_64 >>> [RPM] /var/lib/mock/fedora-rawhide-x86_64-1734695013.358900/root/var/cache/d [ 2/156] Prepare transaction 100% | 1.8 KiB/s | 154.0 B | 00m00s [ 3/156] Installing libgcc-0:14.2.1-6. 100% | 132.9 MiB/s | 272.3 KiB | 00m00s [ 4/156] Installing publicsuffix-list- 100% | 66.7 MiB/s | 68.3 KiB | 00m00s [ 5/156] Installing libssh-config-0:0. 100% | 0.0 B/s | 816.0 B | 00m00s [ 6/156] Installing fedora-release-ide 100% | 0.0 B/s | 976.0 B | 00m00s [ 7/156] Installing fedora-gpg-keys-0: 100% | 18.7 MiB/s | 172.2 KiB | 00m00s [ 8/156] Installing fedora-repos-rawhi 100% | 0.0 B/s | 2.4 KiB | 00m00s [ 9/156] Installing fedora-repos-0:42- 100% | 0.0 B/s | 5.7 KiB | 00m00s [ 10/156] Installing fedora-release-com 100% | 11.8 MiB/s | 24.1 KiB | 00m00s [ 11/156] Installing fedora-release-0:4 100% | 0.0 B/s | 124.0 B | 00m00s [ 12/156] Installing setup-0:2.15.0-5.f 100% | 50.6 MiB/s | 726.1 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 13/156] Installing filesystem-0:3.18- 100% | 1.6 MiB/s | 212.6 KiB | 00m00s [ 14/156] Installing basesystem-0:11-21 100% | 0.0 B/s | 124.0 B | 00m00s [ 15/156] Installing coreutils-common-0 100% | 228.4 MiB/s | 11.2 MiB | 00m00s [ 16/156] Installing ncurses-base-0:6.5 100% | 34.3 MiB/s | 351.7 KiB | 00m00s [ 17/156] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 18/156] Installing ncurses-libs-0:6.5 100% | 137.0 MiB/s | 981.8 KiB | 00m00s [ 19/156] Installing glibc-0:2.40.9000- 100% | 222.4 MiB/s | 6.7 MiB | 00m00s [ 20/156] Installing bash-0:5.2.37-1.fc 100% | 247.6 MiB/s | 8.2 MiB | 00m00s [ 21/156] Installing glibc-common-0:2.4 100% | 115.7 MiB/s | 1.0 MiB | 00m00s [ 22/156] Installing glibc-gconv-extra- 100% | 149.6 MiB/s | 8.1 MiB | 00m00s [ 23/156] Installing zlib-ng-compat-0:2 100% | 131.7 MiB/s | 134.9 KiB | 00m00s [ 24/156] Installing bzip2-libs-0:1.0.8 100% | 79.9 MiB/s | 81.8 KiB | 00m00s [ 25/156] Installing xz-libs-1:5.6.3-2. 100% | 214.3 MiB/s | 219.5 KiB | 00m00s [ 26/156] Installing libuuid-0:2.40.2-8 100% | 39.9 MiB/s | 40.9 KiB | 00m00s [ 27/156] Installing readline-0:8.2-11. 100% | 241.8 MiB/s | 495.3 KiB | 00m00s [ 28/156] Installing popt-0:1.19-7.fc41 100% | 28.0 MiB/s | 143.5 KiB | 00m00s [ 29/156] Installing libblkid-0:2.40.2- 100% | 252.1 MiB/s | 258.2 KiB | 00m00s [ 30/156] Installing libzstd-0:1.5.6-2. 100% | 259.5 MiB/s | 797.2 KiB | 00m00s [ 31/156] Installing elfutils-libelf-0: 100% | 291.7 MiB/s | 1.2 MiB | 00m00s [ 32/156] Installing libstdc++-0:14.2.1 100% | 276.0 MiB/s | 2.8 MiB | 00m00s [ 33/156] Installing libattr-0:2.5.2-4. 100% | 28.8 MiB/s | 29.5 KiB | 00m00s [ 34/156] Installing libacl-0:2.3.2-2.f 100% | 39.8 MiB/s | 40.7 KiB | 00m00s [ 35/156] Installing libxcrypt-0:4.4.36 100% | 133.8 MiB/s | 274.1 KiB | 00m00s [ 36/156] Installing gmp-1:6.3.0-2.fc41 100% | 264.9 MiB/s | 813.7 KiB | 00m00s [ 37/156] Installing libeconf-0:0.7.5-1 100% | 66.8 MiB/s | 68.4 KiB | 00m00s [ 38/156] Installing gdbm-libs-1:1.23-7 100% | 120.7 MiB/s | 123.6 KiB | 00m00s [ 39/156] Installing mpfr-0:4.2.1-5.fc4 100% | 203.5 MiB/s | 833.7 KiB | 00m00s [ 40/156] Installing gawk-0:5.3.0-4.fc4 100% | 173.2 MiB/s | 1.7 MiB | 00m00s [ 41/156] Installing dwz-0:0.15-8.fc42. 100% | 146.8 MiB/s | 300.6 KiB | 00m00s [ 42/156] Installing unzip-0:6.0-65.fc4 100% | 130.8 MiB/s | 401.7 KiB | 00m00s [ 43/156] Installing file-libs-0:5.45-8 100% | 496.8 MiB/s | 9.9 MiB | 00m00s [ 44/156] Installing file-0:5.45-8.fc42 100% | 6.0 MiB/s | 103.7 KiB | 00m00s [ 45/156] Installing crypto-policies-0: 100% | 14.5 MiB/s | 163.7 KiB | 00m00s [ 46/156] Installing libcap-ng-0:0.8.5- 100% | 71.0 MiB/s | 72.7 KiB | 00m00s [ 47/156] Installing audit-libs-0:4.0.2 100% | 160.9 MiB/s | 329.4 KiB | 00m00s [ 48/156] Installing pam-libs-0:1.7.0-3 100% | 69.2 MiB/s | 141.8 KiB | 00m00s [ 49/156] Installing libcap-0:2.71-1.fc 100% | 52.7 MiB/s | 215.8 KiB | 00m00s [ 50/156] Installing systemd-libs-0:257 100% | 201.9 MiB/s | 2.2 MiB | 00m00s [ 51/156] Installing libsmartcols-0:2.4 100% | 173.2 MiB/s | 177.4 KiB | 00m00s [ 52/156] Installing lua-libs-0:5.4.7-1 100% | 139.7 MiB/s | 286.2 KiB | 00m00s [ 53/156] Installing libsepol-0:3.8-0.r 100% | 264.7 MiB/s | 813.3 KiB | 00m00s [ 54/156] Installing lz4-libs-0:1.10.0- 100% | 143.1 MiB/s | 146.6 KiB | 00m00s [ 55/156] Installing libcom_err-0:1.47. 100% | 66.7 MiB/s | 68.3 KiB | 00m00s [ 56/156] Installing libffi-0:3.4.6-3.f 100% | 85.7 MiB/s | 87.8 KiB | 00m00s [ 57/156] Installing alternatives-0:1.3 100% | 64.8 MiB/s | 66.4 KiB | 00m00s [ 58/156] Installing libtasn1-0:4.19.0- 100% | 86.7 MiB/s | 177.5 KiB | 00m00s [ 59/156] Installing p11-kit-0:0.25.5-4 100% | 147.7 MiB/s | 2.2 MiB | 00m00s [ 60/156] Installing libunistring-0:1.1 100% | 288.5 MiB/s | 1.7 MiB | 00m00s [ 61/156] Installing libidn2-0:2.3.7-2. 100% | 65.4 MiB/s | 335.1 KiB | 00m00s [ 62/156] Installing libpsl-0:0.21.5-4. 100% | 79.7 MiB/s | 81.7 KiB | 00m00s [ 63/156] Installing p11-kit-trust-0:0. 100% | 18.0 MiB/s | 405.5 KiB | 00m00s [ 64/156] Installing zstd-0:1.5.6-2.fc4 100% | 241.6 MiB/s | 1.7 MiB | 00m00s [ 65/156] Installing zip-0:3.0-42.fc42. 100% | 170.9 MiB/s | 699.8 KiB | 00m00s [ 66/156] Installing gdbm-1:1.23-7.fc41 100% | 113.7 MiB/s | 465.8 KiB | 00m00s [ 67/156] Installing cyrus-sasl-lib-0:2 100% | 230.6 MiB/s | 2.3 MiB | 00m00s [ 68/156] Installing libfdisk-0:2.40.2- 100% | 180.4 MiB/s | 369.5 KiB | 00m00s [ 69/156] Installing libxml2-0:2.12.8-2 100% | 210.7 MiB/s | 1.7 MiB | 00m00s [ 70/156] Installing bzip2-0:1.0.8-19.f 100% | 48.9 MiB/s | 100.2 KiB | 00m00s [ 71/156] Installing sqlite-libs-0:3.47 100% | 239.0 MiB/s | 1.4 MiB | 00m00s [ 72/156] Installing add-determinism-0: 100% | 303.9 MiB/s | 2.4 MiB | 00m00s [ 73/156] Installing build-reproducibil 100% | 0.0 B/s | 1.0 KiB | 00m00s [ 74/156] Installing ed-0:1.20.2-2.fc41 100% | 72.8 MiB/s | 149.2 KiB | 00m00s [ 75/156] Installing elfutils-default-y 100% | 157.2 KiB/s | 2.0 KiB | 00m00s [ 76/156] Installing elfutils-libs-0:0. 100% | 162.3 MiB/s | 664.7 KiB | 00m00s [ 77/156] Installing cpio-0:2.15-2.fc41 100% | 137.5 MiB/s | 1.1 MiB | 00m00s [ 78/156] Installing diffutils-0:3.10-8 100% | 159.0 MiB/s | 1.6 MiB | 00m00s [ 79/156] Installing libgomp-0:14.2.1-6 100% | 254.5 MiB/s | 521.2 KiB | 00m00s [ 80/156] Installing libpkgconf-0:2.3.0 100% | 77.5 MiB/s | 79.3 KiB | 00m00s [ 81/156] Installing pkgconf-0:2.3.0-1. 100% | 89.0 MiB/s | 91.1 KiB | 00m00s [ 82/156] Installing keyutils-libs-0:1. 100% | 54.5 MiB/s | 55.8 KiB | 00m00s [ 83/156] Installing libverto-0:0.3.2-9 100% | 30.5 MiB/s | 31.3 KiB | 00m00s [ 84/156] Installing jansson-0:2.14-1.f 100% | 92.3 MiB/s | 94.5 KiB | 00m00s [ 85/156] Installing json-c-0:0.18-1.fc 100% | 82.6 MiB/s | 84.6 KiB | 00m00s [ 86/156] Installing xxhash-libs-0:0.8. 100% | 87.7 MiB/s | 89.8 KiB | 00m00s [ 87/156] Installing libbrotli-0:1.1.0- 100% | 204.8 MiB/s | 838.7 KiB | 00m00s [ 88/156] Installing libnghttp2-0:1.64. 100% | 171.5 MiB/s | 175.6 KiB | 00m00s [ 89/156] Installing libtool-ltdl-0:2.5 100% | 67.6 MiB/s | 69.2 KiB | 00m00s [ 90/156] Installing pcre2-syntax-0:10. 100% | 124.1 MiB/s | 254.1 KiB | 00m00s [ 91/156] Installing pcre2-0:10.44-1.fc 100% | 213.2 MiB/s | 654.9 KiB | 00m00s [ 92/156] Installing libselinux-0:3.8-0 100% | 188.4 MiB/s | 192.9 KiB | 00m00s [ 93/156] Installing sed-0:4.9-3.fc41.x 100% | 106.2 MiB/s | 869.7 KiB | 00m00s [ 94/156] Installing grep-0:3.11-9.fc41 100% | 100.3 MiB/s | 1.0 MiB | 00m00s [ 95/156] Installing findutils-1:4.10.0 100% | 168.9 MiB/s | 1.9 MiB | 00m00s [ 96/156] Installing xz-1:5.6.3-2.fc42. 100% | 123.7 MiB/s | 1.2 MiB | 00m00s [ 97/156] Installing libmount-0:2.40.2- 100% | 172.8 MiB/s | 354.0 KiB | 00m00s [ 98/156] Installing util-linux-core-0: 100% | 123.6 MiB/s | 1.5 MiB | 00m00s [ 99/156] Installing openssl-libs-1:3.2 100% | 289.9 MiB/s | 7.8 MiB | 00m00s [100/156] Installing coreutils-0:9.5-11 100% | 135.0 MiB/s | 5.4 MiB | 00m00s [101/156] Installing ca-certificates-0: 100% | 1.2 MiB/s | 2.4 MiB | 00m02s [102/156] Installing krb5-libs-0:1.21.3 100% | 128.0 MiB/s | 2.3 MiB | 00m00s [103/156] Installing libarchive-0:3.7.7 100% | 130.3 MiB/s | 934.2 KiB | 00m00s [104/156] Installing libtirpc-0:1.3.6-1 100% | 67.5 MiB/s | 207.3 KiB | 00m00s [105/156] Installing gzip-0:1.13-2.fc41 100% | 96.3 MiB/s | 394.6 KiB | 00m00s [106/156] Installing authselect-libs-0: 100% | 81.8 MiB/s | 837.2 KiB | 00m00s [107/156] Installing cracklib-0:2.9.11- 100% | 30.6 MiB/s | 250.3 KiB | 00m00s [108/156] Installing libpwquality-0:1.4 100% | 46.6 MiB/s | 429.3 KiB | 00m00s [109/156] Installing libnsl2-0:2.0.1-2. 100% | 57.7 MiB/s | 59.1 KiB | 00m00s [110/156] Installing pam-0:1.7.0-3.fc42 100% | 72.8 MiB/s | 1.9 MiB | 00m00s [111/156] Installing libssh-0:0.11.1-1. 100% | 139.6 MiB/s | 571.7 KiB | 00m00s [112/156] Installing rpm-sequoia-0:1.7. 100% | 232.4 MiB/s | 2.3 MiB | 00m00s [113/156] Installing rpm-libs-0:4.20.0- 100% | 173.8 MiB/s | 711.9 KiB | 00m00s [114/156] Installing rpm-build-libs-0:4 100% | 100.0 MiB/s | 204.9 KiB | 00m00s [115/156] Installing libevent-0:2.1.12- 100% | 175.7 MiB/s | 899.5 KiB | 00m00s [116/156] Installing tar-2:1.35-4.fc41. 100% | 211.3 MiB/s | 3.0 MiB | 00m00s [117/156] Installing patch-0:2.7.6-25.f 100% | 87.3 MiB/s | 268.2 KiB | 00m00s [118/156] Installing libsemanage-0:3.8- 100% | 100.0 MiB/s | 307.1 KiB | 00m00s [119/156] Installing shadow-utils-2:4.1 100% | 114.5 MiB/s | 4.1 MiB | 00m00s [120/156] Installing openldap-0:2.6.8-6 100% | 127.2 MiB/s | 651.2 KiB | 00m00s [121/156] Installing libcurl-0:8.11.1-2 100% | 199.8 MiB/s | 818.4 KiB | 00m00s [122/156] Installing elfutils-debuginfo 100% | 40.9 MiB/s | 83.8 KiB | 00m00s [123/156] Installing binutils-0:2.43.50 100% | 258.0 MiB/s | 25.8 MiB | 00m00s [124/156] Installing elfutils-0:0.192-7 100% | 203.4 MiB/s | 2.6 MiB | 00m00s [125/156] Installing gdb-minimal-0:15.2 100% | 303.0 MiB/s | 12.7 MiB | 00m00s [126/156] Installing debugedit-0:5.1-2. 100% | 39.7 MiB/s | 203.0 KiB | 00m00s [127/156] Installing curl-0:8.11.1-2.fc 100% | 15.9 MiB/s | 454.5 KiB | 00m00s [128/156] Installing rpm-0:4.20.0-3.fc4 100% | 86.2 MiB/s | 2.5 MiB | 00m00s [129/156] Installing efi-srpm-macros-0: 100% | 40.2 MiB/s | 41.2 KiB | 00m00s [130/156] Installing lua-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [131/156] Installing zig-srpm-macros-0: 100% | 0.0 B/s | 1.7 KiB | 00m00s [132/156] Installing pkgconf-m4-0:2.3.0 100% | 0.0 B/s | 14.8 KiB | 00m00s [133/156] Installing pkgconf-pkg-config 100% | 1.7 MiB/s | 1.8 KiB | 00m00s [134/156] Installing rust-srpm-macros-0 100% | 5.4 MiB/s | 5.6 KiB | 00m00s [135/156] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 732.0 B | 00m00s [136/156] Installing qt5-srpm-macros-0: 100% | 0.0 B/s | 776.0 B | 00m00s [137/156] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [138/156] Installing package-notes-srpm 100% | 0.0 B/s | 2.0 KiB | 00m00s [139/156] Installing openblas-srpm-macr 100% | 0.0 B/s | 392.0 B | 00m00s [140/156] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.2 KiB | 00m00s [141/156] Installing kernel-srpm-macros 100% | 0.0 B/s | 2.3 KiB | 00m00s [142/156] Installing gnat-srpm-macros-0 100% | 0.0 B/s | 1.3 KiB | 00m00s [143/156] Installing ghc-srpm-macros-0: 100% | 0.0 B/s | 1.0 KiB | 00m00s [144/156] Installing fpc-srpm-macros-0: 100% | 0.0 B/s | 420.0 B | 00m00s [145/156] Installing ansible-srpm-macro 100% | 0.0 B/s | 36.2 KiB | 00m00s [146/156] Installing fonts-srpm-macros- 100% | 55.7 MiB/s | 57.0 KiB | 00m00s [147/156] Installing forge-srpm-macros- 100% | 39.3 MiB/s | 40.3 KiB | 00m00s [148/156] Installing go-srpm-macros-0:3 100% | 60.5 MiB/s | 62.0 KiB | 00m00s [149/156] Installing python-srpm-macros 100% | 50.9 MiB/s | 52.2 KiB | 00m00s [150/156] Installing redhat-rpm-config- 100% | 47.2 MiB/s | 193.2 KiB | 00m00s [151/156] Installing rpm-build-0:4.20.0 100% | 47.5 MiB/s | 194.5 KiB | 00m00s [152/156] Installing pyproject-srpm-mac 100% | 1.2 MiB/s | 2.5 KiB | 00m00s [153/156] Installing util-linux-0:2.40. 100% | 73.4 MiB/s | 3.6 MiB | 00m00s [154/156] Installing authselect-0:1.5.0 100% | 31.6 MiB/s | 161.9 KiB | 00m00s [155/156] Installing which-0:2.21-42.fc 100% | 80.5 MiB/s | 82.4 KiB | 00m00s [156/156] Installing info-0:7.1.1-2.fc4 100% | 123.8 KiB/s | 362.2 KiB | 00m03s Warning: skipped OpenPGP checks for 154 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: add-determinism-0.4.3-1.fc42.x86_64 alternatives-1.31-1.fc42.x86_64 ansible-srpm-macros-1-16.fc41.noarch audit-libs-4.0.2-1.fc42.x86_64 authselect-1.5.0-8.fc42.x86_64 authselect-libs-1.5.0-8.fc42.x86_64 basesystem-11-21.fc41.noarch bash-5.2.37-1.fc42.x86_64 binutils-2.43.50-9.fc42.x86_64 build-reproducibility-srpm-macros-0.4.3-1.fc42.noarch bzip2-1.0.8-19.fc41.x86_64 bzip2-libs-1.0.8-19.fc41.x86_64 ca-certificates-2024.2.69_v8.0.401-3.fc42.noarch coreutils-9.5-11.fc42.x86_64 coreutils-common-9.5-11.fc42.x86_64 cpio-2.15-2.fc41.x86_64 cracklib-2.9.11-6.fc41.x86_64 crypto-policies-20241128-1.gitbb7b0b0.fc42.noarch curl-8.11.1-2.fc42.x86_64 cyrus-sasl-lib-2.1.28-27.fc41.x86_64 debugedit-5.1-2.fc42.x86_64 diffutils-3.10-8.fc41.x86_64 dwz-0.15-8.fc42.x86_64 ed-1.20.2-2.fc41.x86_64 efi-srpm-macros-5-13.fc42.noarch elfutils-0.192-7.fc42.x86_64 elfutils-debuginfod-client-0.192-7.fc42.x86_64 elfutils-default-yama-scope-0.192-7.fc42.noarch elfutils-libelf-0.192-7.fc42.x86_64 elfutils-libs-0.192-7.fc42.x86_64 fedora-gpg-keys-42-0.3.noarch fedora-release-42-0.11.noarch fedora-release-common-42-0.11.noarch fedora-release-identity-basic-42-0.11.noarch fedora-repos-42-0.3.noarch fedora-repos-rawhide-42-0.3.noarch file-5.45-8.fc42.x86_64 file-libs-5.45-8.fc42.x86_64 filesystem-3.18-29.fc42.x86_64 findutils-4.10.0-4.fc41.x86_64 fonts-srpm-macros-2.0.5-17.fc41.noarch forge-srpm-macros-0.4.0-1.fc42.noarch fpc-srpm-macros-1.3-13.fc41.noarch gawk-5.3.0-4.fc41.x86_64 gdb-minimal-15.2-6.fc42.x86_64 gdbm-1.23-7.fc41.x86_64 gdbm-libs-1.23-7.fc41.x86_64 ghc-srpm-macros-1.9.2-1.fc42.noarch glibc-2.40.9000-24.fc42.x86_64 glibc-common-2.40.9000-24.fc42.x86_64 glibc-gconv-extra-2.40.9000-24.fc42.x86_64 glibc-minimal-langpack-2.40.9000-24.fc42.x86_64 gmp-6.3.0-2.fc41.x86_64 gnat-srpm-macros-6-6.fc41.noarch go-srpm-macros-3.6.0-5.fc42.noarch grep-3.11-9.fc41.x86_64 gzip-1.13-2.fc41.x86_64 info-7.1.1-2.fc42.x86_64 jansson-2.14-1.fc42.x86_64 json-c-0.18-1.fc42.x86_64 kernel-srpm-macros-1.0-24.fc41.noarch keyutils-libs-1.6.3-4.fc41.x86_64 krb5-libs-1.21.3-3.fc42.x86_64 libacl-2.3.2-2.fc41.x86_64 libarchive-3.7.7-1.fc42.x86_64 libattr-2.5.2-4.fc41.x86_64 libblkid-2.40.2-8.fc42.x86_64 libbrotli-1.1.0-5.fc42.x86_64 libcap-2.71-1.fc42.x86_64 libcap-ng-0.8.5-3.fc42.x86_64 libcom_err-1.47.1-6.fc42.x86_64 libcurl-8.11.1-2.fc42.x86_64 libeconf-0.7.5-1.fc42.x86_64 libevent-2.1.12-14.fc41.x86_64 libfdisk-2.40.2-8.fc42.x86_64 libffi-3.4.6-3.fc42.x86_64 libgcc-14.2.1-6.fc42.x86_64 libgomp-14.2.1-6.fc42.x86_64 libidn2-2.3.7-2.fc41.x86_64 libmount-2.40.2-8.fc42.x86_64 libnghttp2-1.64.0-1.fc42.x86_64 libnsl2-2.0.1-2.fc41.x86_64 libpkgconf-2.3.0-1.fc42.x86_64 libpsl-0.21.5-4.fc41.x86_64 libpwquality-1.4.5-11.fc42.x86_64 libselinux-3.8-0.rc3.1.fc42.x86_64 libsemanage-3.8-0.rc3.1.fc42.x86_64 libsepol-3.8-0.rc3.1.fc42.x86_64 libsmartcols-2.40.2-8.fc42.x86_64 libssh-0.11.1-1.fc42.x86_64 libssh-config-0.11.1-1.fc42.noarch libstdc++-14.2.1-6.fc42.x86_64 libtasn1-4.19.0-9.fc41.x86_64 libtirpc-1.3.6-1.fc42.x86_64 libtool-ltdl-2.5.4-1.fc42.x86_64 libunistring-1.1-8.fc41.x86_64 libuuid-2.40.2-8.fc42.x86_64 libverto-0.3.2-9.fc41.x86_64 libxcrypt-4.4.36-11.fc42.x86_64 libxml2-2.12.8-2.fc42.x86_64 libzstd-1.5.6-2.fc41.x86_64 lua-libs-5.4.7-1.fc42.x86_64 lua-srpm-macros-1-14.fc41.noarch lz4-libs-1.10.0-1.fc41.x86_64 mpfr-4.2.1-5.fc41.x86_64 ncurses-base-6.5-2.20240629.fc41.noarch ncurses-libs-6.5-2.20240629.fc41.x86_64 ocaml-srpm-macros-10-3.fc41.noarch openblas-srpm-macros-2-18.fc41.noarch openldap-2.6.8-6.fc42.x86_64 openssl-libs-3.2.2-8.fc42.x86_64 p11-kit-0.25.5-4.fc42.x86_64 p11-kit-trust-0.25.5-4.fc42.x86_64 package-notes-srpm-macros-0.5-12.fc41.noarch pam-1.7.0-3.fc42.x86_64 pam-libs-1.7.0-3.fc42.x86_64 patch-2.7.6-25.fc41.x86_64 pcre2-10.44-1.fc41.1.x86_64 pcre2-syntax-10.44-1.fc41.1.noarch perl-srpm-macros-1-56.fc41.noarch pkgconf-2.3.0-1.fc42.x86_64 pkgconf-m4-2.3.0-1.fc42.noarch pkgconf-pkg-config-2.3.0-1.fc42.x86_64 popt-1.19-7.fc41.x86_64 publicsuffix-list-dafsa-20240107-4.fc41.noarch pyproject-srpm-macros-1.16.3-1.fc42.noarch python-srpm-macros-3.14-3.fc42.noarch qt5-srpm-macros-5.15.15-1.fc42.noarch qt6-srpm-macros-6.8.1-4.fc42.noarch readline-8.2-11.fc42.x86_64 redhat-rpm-config-296-1.fc42.noarch rpm-4.20.0-3.fc42.x86_64 rpm-build-4.20.0-3.fc42.x86_64 rpm-build-libs-4.20.0-3.fc42.x86_64 rpm-libs-4.20.0-3.fc42.x86_64 rpm-sequoia-1.7.0-3.fc42.x86_64 rust-srpm-macros-26.3-3.fc42.noarch sed-4.9-3.fc41.x86_64 setup-2.15.0-5.fc41.noarch shadow-utils-4.17.0~rc1-1.fc42.x86_64 sqlite-libs-3.47.2-1.fc42.x86_64 systemd-libs-257-1.fc42.x86_64 tar-1.35-4.fc41.x86_64 unzip-6.0-65.fc42.x86_64 util-linux-2.40.2-8.fc42.x86_64 util-linux-core-2.40.2-8.fc42.x86_64 which-2.21-42.fc41.x86_64 xxhash-libs-0.8.2-4.fc42.x86_64 xz-5.6.3-2.fc42.x86_64 xz-libs-5.6.3-2.fc42.x86_64 zig-srpm-macros-1-3.fc41.noarch zip-3.0-42.fc42.x86_64 zlib-ng-compat-2.2.2-1.fc42.x86_64 zstd-1.5.6-2.fc41.x86_64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.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-1734695013.358900/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-k783689g/python-chameleon/python-chameleon.spec) Config(child) 0 minutes 13 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-chameleon-4.5.4-5.fc42.src.rpm) Config(fedora-rawhide-x86_64) Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1734695013.358900/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management from host and used with --installroot: rpm-4.20.0-1.fc41.x86_64 rpm-sequoia-1.7.0-2.fc41.x86_64 python3-dnf-4.22.0-1.fc41.noarch python3-dnf-plugins-core-4.10.0-1.fc41.noarch dnf5-5.2.8.1-2.fc41.x86_64 dnf5-plugins-5.2.8.1-2.fc41.x86_64 Finish: chroot init Start: build phase for python-chameleon-4.5.4-5.fc42.src.rpm Start: build setup for python-chameleon-4.5.4-5.fc42.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.src.rpm Updating and loading repositories: fedora 100% | 1.1 MiB/s | 28.1 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 75.1 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 53.0 KiB/s | 1.5 KiB | 00m00s Copr repository 100% | 41.7 MiB/s | 7.6 MiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: python3-devel x86_64 3.14.0~a3-1.fc42 copr_base 1.9 MiB python3-lxml x86_64 5.3.0-2.fc42 copr_base 5.0 MiB python3-setuptools noarch 74.1.3-5.fc42 copr_base 8.6 MiB Installing dependencies: expat x86_64 2.6.4-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 285.5 KiB libxslt x86_64 1.1.42-3.fc42 copr_base 478.4 KiB mpdecimal x86_64 2.5.1-16.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 204.9 KiB pyproject-rpm-macros noarch 1.16.3-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 113.7 KiB python-pip-wheel noarch 24.3.1-2.fc42 copr_base 1.2 MiB python-rpm-macros noarch 3.14-3.fc42 copr_base 22.1 KiB python3 x86_64 3.14.0~a3-1.fc42 copr_base 30.7 KiB python3-libs x86_64 3.14.0~a3-1.fc42 copr_base 40.6 MiB python3-packaging noarch 24.2-2.fc42 copr_base 593.2 KiB python3-rpm-generators noarch 14-11.fc41 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 81.7 KiB python3-rpm-macros noarch 3.14-3.fc42 copr_base 6.4 KiB tzdata noarch 2024b-1.fc42 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB Transaction Summary: Installing: 15 packages Total size of inbound packages is 15 MiB. Need to download 2 MiB. After this operation, 61 MiB extra will be used (install 61 MiB, remove 0 B). [1/1] python3-devel-0:3.14.0~a3-1.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [1/1] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/3] python3-setuptools-0:74.1.3-5.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [2/4] python3-0:3.14.0~a3-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [3/5] python3-libs-0:3.14.0~a3-1.fc42.x 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [4/7] expat-0:2.6.4-1.fc42.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [5/8] mpdecimal-0:2.5.1-16.fc41.x86_64 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [6/9] python-pip-wheel-0:24.3.1-2.fc42. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 7/10] tzdata-0:2024b-1.fc42.noarch 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 8/11] python-rpm-macros-0:3.14-3.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [ 9/12] python3-rpm-macros-0:3.14-3.fc4 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [10/13] pyproject-rpm-macros-0:1.16.3-1 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [11/14] python3-rpm-generators-0:14-11. 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [12/15] python3-packaging-0:24.2-2.fc42 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded [13/15] libxslt-0:1.1.42-3.fc42.x86_64 100% | 3.3 MiB/s | 181.9 KiB | 00m00s [14/15] python3-lxml-0:5.3.0-2.fc42.x86 100% | 18.6 MiB/s | 1.4 MiB | 00m00s -------------------------------------------------------------------------------- [15/15] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [ 1/17] Verify package files 100% | 241.0 B/s | 15.0 B | 00m00s [ 2/17] Prepare transaction 100% | 319.0 B/s | 15.0 B | 00m00s [ 3/17] Installing python-rpm-macros-0: 100% | 22.3 MiB/s | 22.8 KiB | 00m00s [ 4/17] Installing python3-rpm-macros-0 100% | 0.0 B/s | 6.7 KiB | 00m00s [ 5/17] Installing pyproject-rpm-macros 100% | 37.7 MiB/s | 115.7 KiB | 00m00s [ 6/17] Installing tzdata-0:2024b-1.fc4 100% | 25.5 MiB/s | 1.9 MiB | 00m00s [ 7/17] Installing python-pip-wheel-0:2 100% | 414.7 MiB/s | 1.2 MiB | 00m00s [ 8/17] Installing mpdecimal-0:2.5.1-16 100% | 100.6 MiB/s | 206.0 KiB | 00m00s [ 9/17] Installing expat-0:2.6.4-1.fc42 100% | 46.8 MiB/s | 287.6 KiB | 00m00s [10/17] Installing python3-libs-0:3.14. 100% | 201.6 MiB/s | 40.9 MiB | 00m00s [11/17] Installing python3-0:3.14.0~a3- 100% | 31.7 MiB/s | 32.5 KiB | 00m00s [12/17] Installing python3-packaging-0: 100% | 98.6 MiB/s | 605.5 KiB | 00m00s [13/17] Installing python3-rpm-generato 100% | 81.0 MiB/s | 82.9 KiB | 00m00s [14/17] Installing libxslt-0:1.1.42-3.f 100% | 117.6 MiB/s | 481.5 KiB | 00m00s [15/17] Installing python3-lxml-0:5.3.0 100% | 208.4 MiB/s | 5.0 MiB | 00m00s [16/17] Installing python3-devel-0:3.14 100% | 101.7 MiB/s | 1.9 MiB | 00m00s [17/17] Installing python3-setuptools-0 100% | 80.1 MiB/s | 8.8 MiB | 00m00s Warning: skipped OpenPGP checks for 15 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Finish: build setup for python-chameleon-4.5.4-5.fc42.src.rpm Start: rpmbuild python-chameleon-4.5.4-5.fc42.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.R6N5L9 + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + test -d /builddir/build/BUILD/python-chameleon-4.5.4-build + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /builddir/build/BUILD/python-chameleon-4.5.4-build + /usr/bin/rm -rf /builddir/build/BUILD/python-chameleon-4.5.4-build + /usr/bin/mkdir -p /builddir/build/BUILD/python-chameleon-4.5.4-build + /usr/bin/mkdir -p /builddir/build/BUILD/python-chameleon-4.5.4-build/SPECPARTS + RPM_EC=0 ++ jobs -p + exit 0 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.vCOR58 + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + rm -rf chameleon-4.5.4 + /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/chameleon-4.5.4.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd chameleon-4.5.4 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.GC3Vmj + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd chameleon-4.5.4 + 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-chameleon-4.5.4-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-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir + RPM_TOXENV=py314 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-chameleon-4.5.4-build/pyproject-wheeldir --output /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires -t Handling setuptools>=42 from build-system.requires Requirement satisfied: setuptools>=42 (installed: setuptools 74.1.3) Handling wheel from build-system.requires Requirement not satisfied: wheel Exiting dependency generation pass: build backend + cat /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 877.0 KiB/s | 28.1 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 73.6 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 42.7 KiB/s | 1.5 KiB | 00m00s Copr repository 100% | 43.9 MiB/s | 7.6 MiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.16.3-1.fc42.noarch" is already installed. Package "python3-devel-3.14.0~a3-1.fc42.x86_64" is already installed. Package "python3-lxml-5.3.0-2.fc42.x86_64" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-packaging-24.2-2.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package Arch Version Repository Size Installing: python3-pip noarch 24.3.1-2.fc42 copr_base 12.0 MiB python3-wheel noarch 1:0.45.1-2.fc42 copr_base 583.5 KiB Transaction Summary: Installing: 2 packages Total size of inbound packages is 3 MiB. Need to download 165 KiB. After this operation, 13 MiB extra will be used (install 13 MiB, remove 0 B). [1/1] python3-pip-0:24.3.1-2.fc42.noarc 100% | 0.0 B/s | 0.0 B | 00m00s >>> Already downloaded -------------------------------------------------------------------------------- [1/1] Total 100% | 0.0 B/s | 0.0 B | 00m00s [1/2] python3-wheel-1:0.45.1-2.fc42.noa 100% | 3.6 MiB/s | 165.4 KiB | 00m00s -------------------------------------------------------------------------------- [2/2] Total 100% | 0.0 B/s | 0.0 B | 00m00s Running transaction [1/4] Verify package files 100% | 166.0 B/s | 2.0 B | 00m00s [2/4] Prepare transaction 100% | 90.0 B/s | 2.0 B | 00m00s [3/4] Installing python3-wheel-1:0.45.1 100% | 58.9 MiB/s | 603.6 KiB | 00m00s [4/4] Installing python3-pip-0:24.3.1-2 100% | 99.3 MiB/s | 12.2 MiB | 00m00s Warning: skipped OpenPGP checks for 2 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.QJkzpQ + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd chameleon-4.5.4 + 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-chameleon-4.5.4-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-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir + RPM_TOXENV=py314 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-chameleon-4.5.4-build/pyproject-wheeldir --output /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires -t Handling setuptools>=42 from build-system.requires Requirement satisfied: setuptools>=42 (installed: setuptools 74.1.3) Handling wheel from build-system.requires Requirement satisfied: wheel (installed: wheel 0.45.1) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running egg_info creating src/Chameleon.egg-info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' Handling tox-current-env >= 0.0.6 from tox itself Requirement not satisfied: tox-current-env >= 0.0.6 Exiting dependency generation pass: tox itself + cat /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 58.0 KiB/s | 3.8 KiB | 00m00s fedora 100% | 779.6 KiB/s | 28.1 KiB | 00m00s Copr repository 100% | 46.6 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.16.3-1.fc42.noarch" is already installed. Package "python3-devel-3.14.0~a3-1.fc42.x86_64" is already installed. Package "python3-lxml-5.3.0-2.fc42.x86_64" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-packaging-24.2-2.fc42.noarch" is already installed. Package "python3-pip-24.3.1-2.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-wheel-1:0.45.1-2.fc42.noarch" is already installed. Package Arch Version Repository Size Installing: python3-tox-current-env noarch 0.0.14-1.fc42 copr_base 75.9 KiB Installing dependencies: python-setuptools-wheel noarch 74.1.3-5.fc42 copr_base 1.2 MiB python-wheel-wheel noarch 1:0.45.1-2.fc42 copr_base 71.6 KiB python3-cachetools noarch 5.4.0-6.fc42 copr_base 135.0 KiB python3-chardet noarch 5.2.0-15.fc42 copr_base 2.1 MiB python3-colorama noarch 0.4.6-9.fc42 copr_base 189.0 KiB python3-distlib noarch 0.3.9-1.fc42 copr_base 1.2 MiB python3-filelock noarch 3.15.4-5.fc42 copr_base 96.0 KiB python3-platformdirs noarch 4.2.2-3.fc42 copr_base 176.6 KiB python3-pluggy noarch 1.5.0-1.fc42 copr_base 209.8 KiB python3-pyproject-api noarch 1.8.0-1.fc42 copr_base 83.6 KiB python3-virtualenv noarch 20.26.6-1.fc42 copr_base 659.3 KiB tox noarch 4.23.2-2.fc42 copr_base 1.3 MiB Transaction Summary: Installing: 13 packages Total size of inbound packages is 3 MiB. Need to download 3 MiB. After this operation, 7 MiB extra will be used (install 7 MiB, remove 0 B). [ 1/13] python3-tox-current-env-0:0.0.1 100% | 734.6 KiB/s | 31.6 KiB | 00m00s [ 2/13] python3-cachetools-0:5.4.0-6.fc 100% | 878.6 KiB/s | 38.7 KiB | 00m00s [ 3/13] tox-0:4.23.2-2.fc42.noarch 100% | 6.8 MiB/s | 389.0 KiB | 00m00s [ 4/13] python3-chardet-0:5.2.0-15.fc42 100% | 9.5 MiB/s | 271.7 KiB | 00m00s [ 5/13] python3-colorama-0:0.4.6-9.fc42 100% | 2.1 MiB/s | 64.1 KiB | 00m00s [ 6/13] python3-platformdirs-0:4.2.2-3. 100% | 2.4 MiB/s | 43.7 KiB | 00m00s [ 7/13] python3-pyproject-api-0:1.8.0-1 100% | 4.2 MiB/s | 38.7 KiB | 00m00s [ 8/13] python3-virtualenv-0:20.26.6-1. 100% | 20.0 MiB/s | 246.2 KiB | 00m00s [ 9/13] python3-distlib-0:0.3.9-1.fc42. 100% | 15.9 MiB/s | 259.9 KiB | 00m00s [10/13] python3-filelock-0:3.15.4-5.fc4 100% | 3.0 MiB/s | 39.3 KiB | 00m00s [11/13] python-wheel-wheel-1:0.45.1-2.f 100% | 5.4 MiB/s | 77.6 KiB | 00m00s [12/13] python-setuptools-wheel-0:74.1. 100% | 49.3 MiB/s | 1.1 MiB | 00m00s [13/13] python3-pluggy-0:1.5.0-1.fc42.n 100% | 3.9 MiB/s | 55.7 KiB | 00m00s -------------------------------------------------------------------------------- [13/13] Total 100% | 23.3 MiB/s | 2.6 MiB | 00m00s Running transaction [ 1/15] Verify package files 100% | 1.0 KiB/s | 13.0 B | 00m00s [ 2/15] Prepare transaction 100% | 722.0 B/s | 13.0 B | 00m00s [ 3/15] Installing python3-filelock-0:3 100% | 33.5 MiB/s | 102.8 KiB | 00m00s [ 4/15] Installing python3-platformdirs 100% | 59.6 MiB/s | 183.0 KiB | 00m00s [ 5/15] Installing python3-pluggy-0:1.5 100% | 70.3 MiB/s | 216.1 KiB | 00m00s [ 6/15] Installing python-wheel-wheel-1 100% | 70.7 MiB/s | 72.4 KiB | 00m00s [ 7/15] Installing python-setuptools-wh 100% | 384.3 MiB/s | 1.2 MiB | 00m00s [ 8/15] Installing python3-distlib-0:0. 100% | 196.2 MiB/s | 1.2 MiB | 00m00s [ 9/15] Installing python3-virtualenv-0 100% | 30.9 MiB/s | 728.0 KiB | 00m00s [10/15] Installing python3-pyproject-ap 100% | 29.2 MiB/s | 89.7 KiB | 00m00s [11/15] Installing python3-colorama-0:0 100% | 48.5 MiB/s | 198.8 KiB | 00m00s [12/15] Installing python3-chardet-0:5. 100% | 151.9 MiB/s | 2.1 MiB | 00m00s [13/15] Installing python3-cachetools-0 100% | 45.1 MiB/s | 138.6 KiB | 00m00s [14/15] Installing tox-0:4.23.2-2.fc42. 100% | 61.0 MiB/s | 1.4 MiB | 00m00s [15/15] Installing python3-tox-current- 100% | 2.7 MiB/s | 80.2 KiB | 00m00s Warning: skipped OpenPGP checks for 13 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.IxoegB + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd chameleon-4.5.4 + 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-chameleon-4.5.4-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-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir + RPM_TOXENV=py314 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-chameleon-4.5.4-build/pyproject-wheeldir --output /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires -t Handling setuptools>=42 from build-system.requires Requirement satisfied: setuptools>=42 (installed: setuptools 74.1.3) Handling wheel from build-system.requires Requirement satisfied: wheel (installed: wheel 0.45.1) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running egg_info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' Handling tox-current-env >= 0.0.6 from tox itself Requirement satisfied: tox-current-env >= 0.0.6 (installed: tox-current-env 0.0.14) py314: OK (0.00 seconds) congratulations :) (0.07 seconds) Handling tox>=3.18 from tox --print-deps-only: py314 Requirement satisfied: tox>=3.18 (installed: tox 4.23.2) Handling build from tox --print-deps-only: py314 Requirement not satisfied: build Handling wheel from tox --print-deps-only: py314 Requirement satisfied: wheel (installed: wheel 0.45.1) Handling pytest from tox --print-deps-only: py314 Requirement not satisfied: pytest Handling setuptools from tox --print-deps-only: py314 Requirement satisfied: setuptools (installed: setuptools 74.1.3) py314: OK (0.00 seconds) congratulations :) (0.07 seconds) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running dist_info creating Chameleon.egg-info writing Chameleon.egg-info/PKG-INFO writing dependency_links to Chameleon.egg-info/dependency_links.txt writing requirements to Chameleon.egg-info/requires.txt writing top-level names to Chameleon.egg-info/top_level.txt writing manifest file 'Chameleon.egg-info/SOURCES.txt' reading manifest file 'Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'Chameleon.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/Chameleon-4.5.4.dist-info' Handling importlib-metadata; python_version < "3.10" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: importlib-metadata; python_version < "3.10" Handling Sphinx; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: Sphinx; extra == "docs" Handling sphinx-rtd-theme; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: sphinx-rtd-theme; extra == "docs" + cat /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires + rm -rfv Chameleon-4.5.4.dist-info/ removed 'Chameleon-4.5.4.dist-info/top_level.txt' removed 'Chameleon-4.5.4.dist-info/METADATA' removed 'Chameleon-4.5.4.dist-info/LICENSE.txt' removed directory 'Chameleon-4.5.4.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 779.6 KiB/s | 28.1 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 70.9 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 49.6 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.16.3-1.fc42.noarch" is already installed. Package "python3-devel-3.14.0~a3-1.fc42.x86_64" is already installed. Package "python3-lxml-5.3.0-2.fc42.x86_64" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-packaging-24.2-2.fc42.noarch" is already installed. Package "python3-pip-24.3.1-2.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "tox-4.23.2-2.fc42.noarch" is already installed. Package "python3-tox-current-env-0.0.14-1.fc42.noarch" is already installed. Package "python3-wheel-1:0.45.1-2.fc42.noarch" is already installed. Package Arch Version Repository Size Installing: python3-build noarch 1.2.2-1.fc42 copr_base 142.6 KiB python3-pytest noarch 8.3.4-2.fc42 copr_base 4.0 MiB Installing dependencies: python3-iniconfig noarch 1.1.1-24.fc42 copr_base 20.7 KiB python3-pyproject-hooks noarch 1.2.0-1.fc42 copr_base 68.6 KiB Transaction Summary: Installing: 4 packages Total size of inbound packages is 878 KiB. Need to download 878 KiB. After this operation, 4 MiB extra will be used (install 4 MiB, remove 0 B). [1/4] python3-pyproject-hooks-0:1.2.0-1 100% | 588.2 KiB/s | 31.8 KiB | 00m00s [2/4] python3-build-0:1.2.2-1.fc42.noar 100% | 826.2 KiB/s | 61.1 KiB | 00m00s [3/4] python3-iniconfig-0:1.1.1-24.fc42 100% | 533.3 KiB/s | 18.7 KiB | 00m00s [4/4] python3-pytest-0:8.3.4-2.fc42.noa 100% | 6.7 MiB/s | 766.8 KiB | 00m00s -------------------------------------------------------------------------------- [4/4] Total 100% | 7.6 MiB/s | 878.3 KiB | 00m00s Running transaction [1/6] Verify package files 100% | 800.0 B/s | 4.0 B | 00m00s [2/6] Prepare transaction 100% | 333.0 B/s | 4.0 B | 00m00s [3/6] Installing python3-iniconfig-0:1. 100% | 11.5 MiB/s | 23.7 KiB | 00m00s [4/6] Installing python3-pyproject-hook 100% | 35.9 MiB/s | 73.4 KiB | 00m00s [5/6] Installing python3-build-0:1.2.2- 100% | 37.2 MiB/s | 152.3 KiB | 00m00s [6/6] Installing python3-pytest-0:8.3.4 100% | 81.6 MiB/s | 4.1 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=1725408000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.eLXGVi + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd chameleon-4.5.4 + 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-chameleon-4.5.4-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-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir + RPM_TOXENV=py314 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-chameleon-4.5.4-build/pyproject-wheeldir --output /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires -t Handling setuptools>=42 from build-system.requires Requirement satisfied: setuptools>=42 (installed: setuptools 74.1.3) Handling wheel from build-system.requires Requirement satisfied: wheel (installed: wheel 0.45.1) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running egg_info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' Handling tox-current-env >= 0.0.6 from tox itself Requirement satisfied: tox-current-env >= 0.0.6 (installed: tox-current-env 0.0.14) py314: OK (0.00 seconds) congratulations :) (0.08 seconds) Handling tox>=3.18 from tox --print-deps-only: py314 Requirement satisfied: tox>=3.18 (installed: tox 4.23.2) Handling build from tox --print-deps-only: py314 Requirement satisfied: build (installed: build 1.2.2) Handling wheel from tox --print-deps-only: py314 Requirement satisfied: wheel (installed: wheel 0.45.1) Handling pytest from tox --print-deps-only: py314 Requirement satisfied: pytest (installed: pytest 8.3.4) Handling setuptools from tox --print-deps-only: py314 Requirement satisfied: setuptools (installed: setuptools 74.1.3) py314: OK (0.00 seconds) congratulations :) (0.07 seconds) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running dist_info writing Chameleon.egg-info/PKG-INFO writing dependency_links to Chameleon.egg-info/dependency_links.txt writing requirements to Chameleon.egg-info/requires.txt writing top-level names to Chameleon.egg-info/top_level.txt reading manifest file 'Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'Chameleon.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/Chameleon-4.5.4.dist-info' Handling importlib-metadata; python_version < "3.10" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: importlib-metadata; python_version < "3.10" Handling Sphinx; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: Sphinx; extra == "docs" Handling sphinx-rtd-theme; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: sphinx-rtd-theme; extra == "docs" + cat /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires + rm -rfv Chameleon-4.5.4.dist-info/ removed 'Chameleon-4.5.4.dist-info/top_level.txt' removed 'Chameleon-4.5.4.dist-info/METADATA' removed 'Chameleon-4.5.4.dist-info/LICENSE.txt' removed directory 'Chameleon-4.5.4.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-chameleon-4.5.4-5.fc42.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 1.1 MiB/s | 28.1 KiB | 00m00s Additional repo http_kojipkgs_fedorapr 100% | 73.6 KiB/s | 3.8 KiB | 00m00s Copr repository 100% | 40.5 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.16.3-1.fc42.noarch" is already installed. Package "python3-devel-3.14.0~a3-1.fc42.x86_64" is already installed. Nothing to do. Package "python3-lxml-5.3.0-2.fc42.x86_64" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-build-1.2.2-1.fc42.noarch" is already installed. Package "python3-packaging-24.2-2.fc42.noarch" is already installed. Package "python3-pip-24.3.1-2.fc42.noarch" is already installed. Package "python3-pytest-8.3.4-2.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "python3-setuptools-74.1.3-5.fc42.noarch" is already installed. Package "tox-4.23.2-2.fc42.noarch" is already installed. Package "python3-tox-current-env-0.0.14-1.fc42.noarch" is already installed. Package "python3-wheel-1:0.45.1-2.fc42.noarch" is already installed. Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1725408000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.cNljwX + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + cd chameleon-4.5.4 + 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-chameleon-4.5.4-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-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir + RPM_TOXENV=py314 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-chameleon-4.5.4-build/pyproject-wheeldir --output /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires -t Handling setuptools>=42 from build-system.requires Requirement satisfied: setuptools>=42 (installed: setuptools 74.1.3) Handling wheel from build-system.requires Requirement satisfied: wheel (installed: wheel 0.45.1) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running egg_info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' Handling tox-current-env >= 0.0.6 from tox itself Requirement satisfied: tox-current-env >= 0.0.6 (installed: tox-current-env 0.0.14) py314: OK (0.00 seconds) congratulations :) (0.07 seconds) Handling tox>=3.18 from tox --print-deps-only: py314 Requirement satisfied: tox>=3.18 (installed: tox 4.23.2) Handling build from tox --print-deps-only: py314 Requirement satisfied: build (installed: build 1.2.2) Handling wheel from tox --print-deps-only: py314 Requirement satisfied: wheel (installed: wheel 0.45.1) Handling pytest from tox --print-deps-only: py314 Requirement satisfied: pytest (installed: pytest 8.3.4) Handling setuptools from tox --print-deps-only: py314 Requirement satisfied: setuptools (installed: setuptools 74.1.3) py314: OK (0.00 seconds) congratulations :) (0.07 seconds) :7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! running dist_info writing Chameleon.egg-info/PKG-INFO writing dependency_links to Chameleon.egg-info/dependency_links.txt writing requirements to Chameleon.egg-info/requires.txt writing top-level names to Chameleon.egg-info/top_level.txt reading manifest file 'Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'Chameleon.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/Chameleon-4.5.4.dist-info' Handling importlib-metadata; python_version < "3.10" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: importlib-metadata; python_version < "3.10" Handling sphinx-rtd-theme; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: sphinx-rtd-theme; extra == "docs" Handling Sphinx; extra == "docs" from hook generated metadata: Requires-Dist (Chameleon) Ignoring alien requirement: Sphinx; extra == "docs" + cat /builddir/build/BUILD/python-chameleon-4.5.4-build/python-chameleon-4.5.4-5.fc42.x86_64-pyproject-buildrequires + rm -rfv Chameleon-4.5.4.dist-info/ removed 'Chameleon-4.5.4.dist-info/top_level.txt' removed 'Chameleon-4.5.4.dist-info/METADATA' removed 'Chameleon-4.5.4.dist-info/LICENSE.txt' removed directory 'Chameleon-4.5.4.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.6Eqvd1 + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-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-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 chameleon-4.5.4 + 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-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + /usr/bin/python3 setup.py build '--executable=/usr/bin/python3 -sP' /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/setup.py:7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! from setuptools.command.test import test running build running build_py creating build creating build/lib creating build/lib/chameleon copying src/chameleon/__init__.py -> build/lib/chameleon copying src/chameleon/astutil.py -> build/lib/chameleon copying src/chameleon/benchmark.py -> build/lib/chameleon copying src/chameleon/codegen.py -> build/lib/chameleon copying src/chameleon/compiler.py -> build/lib/chameleon copying src/chameleon/config.py -> build/lib/chameleon copying src/chameleon/exc.py -> build/lib/chameleon copying src/chameleon/i18n.py -> build/lib/chameleon copying src/chameleon/loader.py -> build/lib/chameleon copying src/chameleon/metal.py -> build/lib/chameleon copying src/chameleon/namespaces.py -> build/lib/chameleon copying src/chameleon/nodes.py -> build/lib/chameleon copying src/chameleon/parser.py -> build/lib/chameleon copying src/chameleon/program.py -> build/lib/chameleon copying src/chameleon/tal.py -> build/lib/chameleon copying src/chameleon/tales.py -> build/lib/chameleon copying src/chameleon/template.py -> build/lib/chameleon copying src/chameleon/tokenize.py -> build/lib/chameleon copying src/chameleon/types.py -> build/lib/chameleon copying src/chameleon/utils.py -> build/lib/chameleon creating build/lib/chameleon/tests copying src/chameleon/tests/__init__.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_bools_plus_sniffing.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_exc.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_imports.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_loader.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_parser.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_sniffing.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_templates.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_tokenizer.py -> build/lib/chameleon/tests copying src/chameleon/tests/test_utils.py -> build/lib/chameleon/tests creating build/lib/chameleon/zpt copying src/chameleon/zpt/__init__.py -> build/lib/chameleon/zpt copying src/chameleon/zpt/loader.py -> build/lib/chameleon/zpt copying src/chameleon/zpt/program.py -> build/lib/chameleon/zpt copying src/chameleon/zpt/template.py -> build/lib/chameleon/zpt running egg_info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' /usr/lib/python3.14/site-packages/setuptools/command/build_py.py:218: _Warning: Package 'chameleon.tests.inputs' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'chameleon.tests.inputs' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'chameleon.tests.inputs' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'chameleon.tests.inputs' to be distributed and are already explicitly excluding 'chameleon.tests.inputs' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! check.warn(importable) /usr/lib/python3.14/site-packages/setuptools/command/build_py.py:218: _Warning: Package 'chameleon.tests.outputs' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'chameleon.tests.outputs' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'chameleon.tests.outputs' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'chameleon.tests.outputs' to be distributed and are already explicitly excluding 'chameleon.tests.outputs' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! check.warn(importable) copying src/chameleon/py.typed -> build/lib/chameleon creating build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/001-interpolation.txt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/001-variable-scope.html -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/001-variable-scope.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/001.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/002-repeat-scope.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/002.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/003-content.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/003.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/004-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/004.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/005-default.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/005.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/006-attribute-interpolation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/006.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/007-content-interpolation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/007.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/008-builtins.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/008.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/009-literals.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/009.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/010-structure.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/010.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/011-messages.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/011.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/012-translation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/012.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/013-repeat-nested.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/013.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/014-repeat-nested-similar.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/014.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/015-translation-nested.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/015.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/016-explicit-translation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/016.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/017-omit-tag.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/017.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/018-translation-nested-dynamic.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/018.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/019-replace.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/019.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/020-on-error.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/020.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/021-translation-domain.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/021.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/022-switch.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/022.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/023-condition.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/023.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/024-namespace-elements.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/024.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/025-repeat-whitespace.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/025.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/026-repeat-variable.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/026.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/027-attribute-replacement.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/027.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/028-attribute-toggle.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/028.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/029-attribute-ordering.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/029.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/030-repeat-tuples.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/030.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/031-namespace-with-tal.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/031.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/032-master-template.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/032.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/033-use-macro-trivial.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/033.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/034-use-template-as-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/034.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/035-use-macro-with-fill-slot.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/035.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/036-use-macro-inherits-dynamic-scope.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/036.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/037-use-macro-local-variable-scope.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/037.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/038-use-macro-globals.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/038.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/039-globals.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/039.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/040-macro-using-template-symbol.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/040.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/041-translate-nested-names.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/041.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/042-use-macro-fill-footer.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/042.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/043-macro-nested-dynamic-vars.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/043.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/044-tuple-define.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/044.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/045-namespaces.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/045.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/046-extend-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/046.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/047-use-extended-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/047.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/048-use-extended-macro-fill-original.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/048.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/049-entities-in-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/049.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/050-define-macro-and-use-not-extend.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/050.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/051-use-non-extended-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/051.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/052-i18n-domain-inside-filled-slot.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/052.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/053-special-characters-in-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/053.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/054-import-expression.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/054.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/055-attribute-fallback-to-dict-lookup.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/055.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/056-comment-attribute.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/056.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/057-order.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/057.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/058-script.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/058.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/059-embedded-javascript.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/059.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/060-macro-with-multiple-same-slots.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/060.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/061-fill-one-slot-but-two-defined.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/061.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/062-comments-and-expressions.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/062.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/063-continuation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/063.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/064-tags-and-special-characters.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/064.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/065-use-macro-in-fill.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/065.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/066-load-expression.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/066.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/067-attribute-decode.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/067.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/068-less-than-greater-than-in-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/068.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/069-translation-domain-and-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/069.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/070-translation-domain-and-use-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/070.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/071-html-attribute-defaults.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/071.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/072-repeat-interpolation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/072.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/073-utf8-encoded.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/073.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/074-encoded-template.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/074.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/075-nested-macros.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/075.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/076-nested-macro-override.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/076.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/077-i18n-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/077.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/078-tags-and-newlines.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/078.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/079-implicit-i18n.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/079.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/080-xmlns-namespace-on-tal.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/080.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/081-load-spec.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/081.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/082-load-spec-computed.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/082.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/083-template-dict-to-macro.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/083.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/084-interpolation-in-cdata.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/084.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/085-nested-translation.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/085.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/086-self-closing.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/086.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/087-code-blocks.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/087.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/088-python-newlines.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/088.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/089-load-fallback.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/089.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/090-tuple-expression.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/090.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/091-repeat-none.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/091.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/092.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/093.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/094.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/095.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/096.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/097.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/098.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/099.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/100.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/101-unclosed-tags.html -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/101.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/102-unquoted-attributes.html -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/102.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/103-simple-attribute.html -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/103.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/104.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/105.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/106.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/107.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/108.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/109.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/110.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/111.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/112.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/113.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/114.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/115.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/116.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/117.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/118.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/119.xml -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/120-translation-context.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/121-translation-comment.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/122-translation-ignore.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/123-html5-data-attributes.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/124-translation-target.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/125-macro-translation-ordering.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/126-define-escaping.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/127-tags-and-attributes-special-chars.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/128-translation-macro-name.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/237-double-define.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/238-macroname.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/greeting.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/hello_world.pt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/hello_world.txt -> build/lib/chameleon/tests/inputs copying src/chameleon/tests/inputs/multinode-implicit-i18n.pt -> build/lib/chameleon/tests/inputs creating build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/001.html -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/001.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/001.txt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/002.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/003.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/004.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/005.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/006.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/007.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/008.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/009.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/010.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/011-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/011.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/012-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/012.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/013.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/014.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/015-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/015.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/016-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/016.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/017.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/018-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/018.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/019.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/020.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/021-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/021.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/022.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/023.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/024.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/025.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/026.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/027.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/028.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/029.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/030.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/031.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/032.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/033.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/034.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/035.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/036.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/037.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/038.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/039.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/040.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/041.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/042.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/043.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/044.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/045.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/046.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/047.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/048.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/049.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/050.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/051.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/052.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/053.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/054.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/055.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/056.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/057.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/058.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/059.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/060.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/061.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/062.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/063.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/064.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/065.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/066.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/067.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/068.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/069-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/069.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/070-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/070.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/071.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/072.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/073.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/074.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/075.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/076.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/077-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/077.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/078.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/079-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/079.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/080.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/081.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/082.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/083.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/084.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/085-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/085.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/086.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/087.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/088.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/089.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/090.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/091.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/101.html -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/102.html -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/103.html -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/120-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/120.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/121.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/122.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/123.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/124-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/124.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/125.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/126.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/127.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/128-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/128.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/237.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/238.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/greeting.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/hello_world.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/hello_world.txt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/multinode-en.pt -> build/lib/chameleon/tests/outputs copying src/chameleon/tests/outputs/multinode.pt -> build/lib/chameleon/tests/outputs + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.3Xjljm + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-build + '[' /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT ++ dirname /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT + mkdir -p /builddir/build/BUILD/python-chameleon-4.5.4-build + mkdir /builddir/build/BUILD/python-chameleon-4.5.4-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-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 chameleon-4.5.4 + 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-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + /usr/bin/python3 setup.py install -O1 --skip-build --root /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT --prefix /usr /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/setup.py:7: SetuptoolsDeprecationWarning: The test command is disabled and references to it are deprecated. !! ******************************************************************************** Please remove any references to `setuptools.command.test` in all supported versions of the affected package. This deprecation is overdue, please update your project and remove deprecated calls to avoid build errors in the future. ******************************************************************************** !! from setuptools.command.test import test running install /usr/lib/python3.14/site-packages/setuptools/_distutils/cmd.py:66: SetuptoolsDeprecationWarning: setup.py install is deprecated. !! ******************************************************************************** Please avoid running ``setup.py`` directly. Instead, use pypa/build, pypa/installer or other standards-based tools. Follow the current Python packaging guidelines when building Python RPM packages. See https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/ for details. ******************************************************************************** !! self.initialize_options() running install_lib creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14 creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/__init__.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/astutil.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/benchmark.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/codegen.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/compiler.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/config.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/exc.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/i18n.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/loader.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/metal.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/namespaces.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/nodes.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/parser.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/program.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/tal.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/tales.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/template.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/tokenize.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/types.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon copying build/lib/chameleon/utils.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/__init__.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_bools_plus_sniffing.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_exc.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_imports.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_loader.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_parser.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_sniffing.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_templates.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_tokenizer.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests copying build/lib/chameleon/tests/test_utils.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/001-interpolation.txt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/001-variable-scope.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/001-variable-scope.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/001.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/002-repeat-scope.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/002.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/003-content.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/003.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/004-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/004.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/005-default.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/005.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/006-attribute-interpolation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/006.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/007-content-interpolation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/007.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/008-builtins.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/008.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/009-literals.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/009.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/010-structure.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/010.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/011-messages.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/011.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/012-translation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/012.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/013-repeat-nested.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/013.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/014-repeat-nested-similar.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/014.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/015-translation-nested.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/015.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/016-explicit-translation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/016.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/017-omit-tag.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/017.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/018-translation-nested-dynamic.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/018.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/019-replace.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/019.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/020-on-error.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/020.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/021-translation-domain.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/021.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/022-switch.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/022.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/023-condition.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/023.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/024-namespace-elements.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/024.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/025-repeat-whitespace.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/025.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/026-repeat-variable.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/026.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/027-attribute-replacement.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/027.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/028-attribute-toggle.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/028.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/029-attribute-ordering.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/029.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/030-repeat-tuples.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/030.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/031-namespace-with-tal.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/031.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/032-master-template.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/032.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/033-use-macro-trivial.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/033.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/034-use-template-as-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/034.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/035-use-macro-with-fill-slot.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/035.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/036-use-macro-inherits-dynamic-scope.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/036.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/037-use-macro-local-variable-scope.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/037.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/038-use-macro-globals.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/038.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/039-globals.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/039.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/040-macro-using-template-symbol.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/040.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/041-translate-nested-names.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/041.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/042-use-macro-fill-footer.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/042.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/043-macro-nested-dynamic-vars.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/043.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/044-tuple-define.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/044.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/045-namespaces.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/045.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/046-extend-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/046.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/047-use-extended-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/047.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/048-use-extended-macro-fill-original.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/048.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/049-entities-in-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/049.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/050-define-macro-and-use-not-extend.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/050.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/051-use-non-extended-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/051.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/052-i18n-domain-inside-filled-slot.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/052.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/053-special-characters-in-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/053.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/054-import-expression.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/054.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/055-attribute-fallback-to-dict-lookup.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/055.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/056-comment-attribute.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/056.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/057-order.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/057.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/058-script.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/058.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/059-embedded-javascript.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/059.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/060-macro-with-multiple-same-slots.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/060.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/061-fill-one-slot-but-two-defined.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/061.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/062-comments-and-expressions.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/062.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/063-continuation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/063.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/064-tags-and-special-characters.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/064.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/065-use-macro-in-fill.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/065.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/066-load-expression.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/066.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/067-attribute-decode.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/067.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/068-less-than-greater-than-in-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/068.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/069-translation-domain-and-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/069.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/070-translation-domain-and-use-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/070.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/071-html-attribute-defaults.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/071.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/072-repeat-interpolation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/072.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/073-utf8-encoded.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/073.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/074-encoded-template.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/074.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/075-nested-macros.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/075.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/076-nested-macro-override.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/076.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/077-i18n-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/077.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/078-tags-and-newlines.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/078.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/079-implicit-i18n.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/079.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/080-xmlns-namespace-on-tal.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/080.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/081-load-spec.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/081.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/082-load-spec-computed.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/082.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/083-template-dict-to-macro.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/083.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/084-interpolation-in-cdata.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/084.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/085-nested-translation.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/085.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/086-self-closing.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/086.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/087-code-blocks.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/087.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/088-python-newlines.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/088.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/089-load-fallback.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/089.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/090-tuple-expression.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/090.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/091-repeat-none.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/091.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/092.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/093.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/094.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/095.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/096.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/097.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/098.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/099.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/100.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/101-unclosed-tags.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/101.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/102-unquoted-attributes.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/102.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/103-simple-attribute.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/103.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/104.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/105.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/106.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/107.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/108.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/109.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/110.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/111.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/112.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/113.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/114.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/115.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/116.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/117.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/118.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/119.xml -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/120-translation-context.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/121-translation-comment.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/122-translation-ignore.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/123-html5-data-attributes.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/124-translation-target.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/125-macro-translation-ordering.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/126-define-escaping.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/127-tags-and-attributes-special-chars.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/128-translation-macro-name.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/237-double-define.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/238-macroname.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/greeting.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/hello_world.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/hello_world.txt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs copying build/lib/chameleon/tests/inputs/multinode-implicit-i18n.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/inputs creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/001.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/001.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/001.txt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/002.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/003.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/004.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/005.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/006.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/007.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/008.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/009.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/010.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/011-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/011.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/012-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/012.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/013.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/014.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/015-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/015.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/016-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/016.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/017.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/018-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/018.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/019.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/020.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/021-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/021.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/022.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/023.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/024.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/025.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/026.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/027.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/028.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/029.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/030.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/031.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/032.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/033.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/034.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/035.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/036.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/037.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/038.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/039.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/040.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/041.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/042.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/043.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/044.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/045.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/046.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/047.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/048.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/049.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/050.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/051.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/052.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/053.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/054.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/055.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/056.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/057.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/058.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/059.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/060.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/061.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/062.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/063.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/064.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/065.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/066.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/067.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/068.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/069-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/069.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/070-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/070.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/071.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/072.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/073.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/074.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/075.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/076.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/077-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/077.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/078.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/079-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/079.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/080.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/081.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/082.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/083.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/084.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/085-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/085.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/086.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/087.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/088.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/089.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/090.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/091.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/101.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/102.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/103.html -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/120-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/120.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/121.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/122.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/123.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/124-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/124.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/125.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/126.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/127.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/128-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/128.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/237.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/238.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/greeting.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/hello_world.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/hello_world.txt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/multinode-en.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs copying build/lib/chameleon/tests/outputs/multinode.pt -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/outputs creating /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt copying build/lib/chameleon/zpt/__init__.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt copying build/lib/chameleon/zpt/loader.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt copying build/lib/chameleon/zpt/program.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt copying build/lib/chameleon/zpt/template.py -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt copying build/lib/chameleon/py.typed -> /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__init__.py to __init__.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/astutil.py to astutil.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/benchmark.py to benchmark.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/codegen.py to codegen.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/compiler.py to compiler.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/config.py to config.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/exc.py to exc.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/i18n.py to i18n.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/loader.py to loader.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/metal.py to metal.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/namespaces.py to namespaces.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/nodes.py to nodes.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/parser.py to parser.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/program.py to program.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tal.py to tal.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tales.py to tales.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/template.py to template.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tokenize.py to tokenize.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/types.py to types.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/utils.py to utils.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/__init__.py to __init__.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_bools_plus_sniffing.py to test_bools_plus_sniffing.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_exc.py to test_exc.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_imports.py to test_imports.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_loader.py to test_loader.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_parser.py to test_parser.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_sniffing.py to test_sniffing.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_templates.py to test_templates.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_tokenizer.py to test_tokenizer.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests/test_utils.py to test_utils.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__init__.py to __init__.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/loader.py to loader.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/program.py to program.cpython-314.pyc byte-compiling /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/template.py to template.cpython-314.pyc writing byte-compilation script '/tmp/tmph34ovmib.py' /usr/bin/python3 /tmp/tmph34ovmib.py removing /tmp/tmph34ovmib.py running install_egg_info running egg_info writing src/Chameleon.egg-info/PKG-INFO writing dependency_links to src/Chameleon.egg-info/dependency_links.txt writing requirements to src/Chameleon.egg-info/requires.txt writing top-level names to src/Chameleon.egg-info/top_level.txt reading manifest file 'src/Chameleon.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.md' warning: no files found matching 'buildout.cfg' warning: no files found matching 'Makefile' under directory 'docs' adding license file 'LICENSE.txt' writing manifest file 'src/Chameleon.egg-info/SOURCES.txt' Copying src/Chameleon.egg-info to /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/Chameleon-4.5.4-py3.14.egg-info running install_scripts + rm -rfv /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/bin/__pycache__ + rm -rf /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/tests + find /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon -name '*.txt' -exec rm '{}' ';' + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j2 Bytecompiling .py files below /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14 using python3.14 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-determinism --brp -j2 /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__pycache__/loader.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__pycache__/program.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__pycache__/template.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/__init__.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/astutil.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/zpt/__pycache__/program.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/codegen.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/benchmark.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/config.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/exc.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/i18n.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/loader.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/metal.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/namespaces.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/nodes.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/parser.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/program.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/tal.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/tales.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/compiler.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/template.cpython-314.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/types.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/tokenize.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/astutil.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/utils.cpython-314.pyc: rewriting with normalized contents /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/codegen.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/template.cpython-314.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages/chameleon/__pycache__/compiler.cpython-314.opt-1.pyc: replacing with normalized version Scanned 10 directories and 79 files, processed 29 inodes, 29 modified (10 replaced + 19 rewritten), 0 unsupported format, 0 errors Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.xDmted + umask 022 + cd /builddir/build/BUILD/python-chameleon-4.5.4-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-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 chameleon-4.5.4 + TOX_TESTENV_PASSENV='*' + 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-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + PATH=/builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin + PYTHONPATH=/builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-chameleon-4.5.4-build/BUILDROOT/usr/lib/python3.14/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_ADDOPTS=' --ignore=/builddir/build/BUILD/python-chameleon-4.5.4-build/.pyproject-builddir' + PYTEST_XDIST_AUTO_NUM_WORKERS=2 + HOSTNAME=rpmbuild + /usr/bin/python3 -m tox --current-env -q --recreate -e py314 ============================= test session starts ============================== platform linux -- Python 3.14.0a3, pytest-8.3.4, pluggy-1.5.0 cachedir: .tox/py314/.pytest_cache rootdir: /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4 configfile: setup.cfg testpaths: src/chameleon collected 252 items src/chameleon/compiler.py .FF [ 1%] src/chameleon/exc.py .. [ 1%] src/chameleon/tal.py ... [ 3%] src/chameleon/tales.py ....F.. [ 5%] src/chameleon/tests/test_bools_plus_sniffing.py FFFFFFFFFFFFFFFFFFFFFFFF [ 15%] FFFFFF [ 17%] src/chameleon/tests/test_exc.py .. [ 18%] src/chameleon/tests/test_imports.py .... [ 20%] src/chameleon/tests/test_loader.py ..F...F..F...F.... [ 27%] src/chameleon/tests/test_parser.py .. [ 28%] src/chameleon/tests/test_sniffing.py .... [ 29%] src/chameleon/tests/test_templates.py ...FFFFFF...FFFFFFFFFFFF.FFF..FFFF [ 43%] FFFF.F..FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 71%] FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 96%] src/chameleon/tests/test_tokenizer.py .. [ 96%] src/chameleon/tests/test_utils.py ... [ 98%] src/chameleon/utils.py ..... [100%] =================================== FAILURES =================================== _______________ [doctest] chameleon.compiler.ExpressionEvaluator _______________ 647 We'll use the following convenience function to test the expression 648 evaluator. 649 >>> from chameleon.utils import Scope 650 >>> def evaluate(d, *args): 651 ... return evaluator(Scope(d), *args) 652 653 The evaluation function is passed the local and remote context, 654 the expression type and finally the expression. 655 656 >>> evaluate({'boo': 'baz'}, {}, 'python', 'foo + boo') UNEXPECTED EXCEPTION: AttributeError("module 'ast' has no attribute 'Str'") Traceback (most recent call last): File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 689, in __call__ evaluate = self._cache[expression] ~~~~~~~~~~~^^^^^^^^^^^^ KeyError: 'python:foo + boo' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib64/python3.14/doctest.py", line 1395, in __run exec(compile(example.source, filename, "single", ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ compileflags, True), test.globs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1, in File "", line 2, in evaluate File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 694, in __call__ compiler = Compiler( self._engine, module, "", string, ('econtext', 'rcontext') + self._names ) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1019, in __init__ module.body += self.visit(node) ~~~~~~~~~~^^^^^^ File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1082, in visit iterator = visitor(node) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1127, in visit_Module program = self.visit(node.program) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1082, in visit iterator = visitor(node) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1167, in visit_Context self.visit(node.node) ~~~~~~~~~~^^^^^^^^^^^ File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1082, in visit iterator = visitor(node) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 1352, in visit_Assignment assignment = self._engine(node.expression, store("__value")) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 829, in __call__ stmts = [self.visitor(stmt) for stmt in stmts] ~~~~~~~~~~~~^^^^^^ File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/astutil.py", line 143, in __call__ return self.visit(clone) # type: ignore[no-any-return] ~~~~~~~~~~^^^^^^^ File "/usr/lib64/python3.14/ast.py", line 515, in visit return visitor(node) File "/usr/lib64/python3.14/ast.py", line 579, in generic_visit new_node = self.visit(old_value) File "/usr/lib64/python3.14/ast.py", line 515, in visit return visitor(node) File "/usr/lib64/python3.14/ast.py", line 579, in generic_visit new_node = self.visit(old_value) File "/usr/lib64/python3.14/ast.py", line 515, in visit return visitor(node) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/astutil.py", line 156, in visit_Name return self.apply_transform(node) ~~~~~~~~~~~~~~~~~~~~^^^^^^ File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/astutil.py", line 130, in apply_transform result = self.transform(node) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 778, in __call__ key=ast.Str(s=name), ^^^^^^^ AttributeError: module 'ast' has no attribute 'Str' /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py:656: UnexpectedException __________________ [doctest] chameleon.compiler.NameTransform __________________ 713 714 >>> def test(name): 715 ... rewritten = nt(load(name)) 716 ... module = ast.Module([ast.fix_missing_locations(rewritten)], []) 717 ... codegen = TemplateCodeGenerator(module) 718 ... return codegen.code 719 720 Any odd name: 721 722 >>> test('frobnitz') UNEXPECTED EXCEPTION: AttributeError("module 'ast' has no attribute 'Str'") Traceback (most recent call last): File "/usr/lib64/python3.14/doctest.py", line 1395, in __run exec(compile(example.source, filename, "single", ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ compileflags, True), test.globs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1, in File "", line 2, in test File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 783, in __call__ return load_econtext(name) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 74, in load_econtext return template("getname(KEY)", KEY=ast.Str(s=name), mode="eval") ^^^^^^^ AttributeError: module 'ast' has no attribute 'Str' /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py:722: UnexpectedException _____________________ [doctest] chameleon.tales.StringExpr _____________________ 343 344 string := (text | substitution) (string)? 345 substitution := ('$' variable | '${' expression '}') 346 text := .* 347 348 In other words, an expression string can contain multiple 349 substitutions. The text- and substitution parts will be 350 concatenated back into a string. 351 352 >>> test(StringExpr('Hello ${name}!'), name='world') UNEXPECTED EXCEPTION: AttributeError("module 'ast' has no attribute 'Str'") Traceback (most recent call last): File "/usr/lib64/python3.14/doctest.py", line 1395, in __run exec(compile(example.source, filename, "single", ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ compileflags, True), test.globs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1, in File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/tales.py", line 44, in test body = expression(store("result"), engine) File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/tales.py", line 456, in __call__ return self.translator(name, engine) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ File "/builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/compiler.py", line 355, in __call__ node = ast.Str(s=part) ^^^^^^^ AttributeError: module 'ast' has no attribute 'Str' /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4/src/chameleon/tales.py:352: UnexpectedException _____________________ XMLTestCase.test_bytes_checked_None ______________________ self = def test_bytes_checked_None(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ XMLTestCase.test_bytes_checked_default ____________________ self = def test_bytes_checked_default(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:125: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ XMLTestCase.test_bytes_checked_false _____________________ self = def test_bytes_checked_false(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:105: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ XMLTestCase.test_bytes_checked_true ______________________ self = def test_bytes_checked_true(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:95: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ XMLTestCase.test_bytes_content_type ______________________ self = def test_bytes_content_type(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _______________________ XMLTestCase.test_bytes_encoding ________________________ self = def test_bytes_encoding(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ XMLTestCase.test_str_checked_None _______________________ self = def test_str_checked_None(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:155: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ XMLTestCase.test_str_checked_default _____________________ self = def test_str_checked_default(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:165: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ XMLTestCase.test_str_checked_false ______________________ self = def test_str_checked_false(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:145: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ XMLTestCase.test_str_checked_true _______________________ self = def test_str_checked_true(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:135: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ XMLTestCase.test_str_content_type _______________________ self = def test_str_content_type(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:87: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ________________________ XMLTestCase.test_str_encoding _________________________ self = def test_str_encoding(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:91: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _________________ XMLWithEncodingTestCase.test_bytes_encoding __________________ self = def test_bytes_encoding(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:181: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'ascii', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError __________________ XMLWithEncodingTestCase.test_str_encoding ___________________ self = def test_str_encoding(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:185: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'ascii', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ HTML5TestCase.test_bytes_checked_None _____________________ self = def test_bytes_checked_None(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:248: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ___________________ HTML5TestCase.test_bytes_checked_default ___________________ self = def test_bytes_checked_default(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:267: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ HTML5TestCase.test_bytes_checked_false ____________________ self = def test_bytes_checked_false(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:229: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ HTML5TestCase.test_bytes_checked_true _____________________ self = def test_bytes_checked_true(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:210: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ HTML5TestCase.test_bytes_content_type _____________________ self = def test_bytes_content_type(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:194: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ HTML5TestCase.test_bytes_encoding _______________________ self = def test_bytes_encoding(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:198: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ HTML5TestCase.test_str_checked_None ______________________ self = def test_str_checked_None(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:324: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ____________________ HTML5TestCase.test_str_checked_default ____________________ self = def test_str_checked_default(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:343: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ HTML5TestCase.test_str_checked_false _____________________ self = def test_str_checked_false(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:305: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ HTML5TestCase.test_str_checked_true ______________________ self = def test_str_checked_true(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:286: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ HTML5TestCase.test_str_content_type ______________________ self = def test_str_content_type(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:202: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _______________________ HTML5TestCase.test_str_encoding ________________________ self = def test_str_encoding(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:206: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'checkbox', '"', ' ', '=', None), ('checked', 'nope', '"', ' ', '=', 'checked')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _______ HTML5WithContentTypeAndEncodingTestCase.test_bytes_content_type ________ self = def test_bytes_content_type(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:367: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('http-equiv', 'Content-Type', '"', ' ', '=', None), ('content', 'foo/bar; charset=utf-8', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _________ HTML5WithContentTypeAndEncodingTestCase.test_bytes_encoding __________ self = def test_bytes_encoding(self): > template = self.get_template_bytes() src/chameleon/tests/test_bools_plus_sniffing.py:371: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:59: in get_template_bytes return self.get_template(self.input_bytes) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('http-equiv', 'Content-Type', '"', ' ', '=', None), ('content', 'foo/bar; charset=utf-8', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ________ HTML5WithContentTypeAndEncodingTestCase.test_str_content_type _________ self = def test_str_content_type(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:375: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('http-equiv', 'Content-Type', '"', ' ', '=', None), ('content', 'foo/bar; charset=utf-8', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError __________ HTML5WithContentTypeAndEncodingTestCase.test_str_encoding ___________ self = def test_str_encoding(self): > template = self.get_template_str() src/chameleon/tests/test_bools_plus_sniffing.py:379: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_bools_plus_sniffing.py:62: in get_template_str return self.get_template(self.input_bytes.decode('utf-8')) src/chameleon/tests/test_bools_plus_sniffing.py:55: in get_template template = PageTemplate(text) src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('http-equiv', 'Content-Type', '"', ' ', '=', None), ('content', 'foo/bar; charset=utf-8', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _________________________ LoadPageTests.test_load_egg __________________________ self = def test_load_egg(self): > self._test_load_package("bdist_egg", ".egg") src/chameleon/tests/test_loader.py:63: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_loader.py:116: in _test_load_package self._test_pkg(pkg_name) src/chameleon/tests/test_loader.py:131: in _test_pkg output = result(content='foo') src/chameleon/template.py:176: in __call__ return self.render(**kwargs) src/chameleon/zpt/template.py:359: in render return super().render(**_kw) src/chameleon/template.py:227: in render self.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3fd05610> at 7f8d40202c50> at 7f8d40032710>] at 7f8d3fd22c90> at 7f8d3fb3d610>] at 7f8d40e95590> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ------------------------------ Captured log call ------------------------------- INFO root:dist.py:970 running bdist_egg INFO root:dist.py:970 running egg_info INFO root:dir_util.py:70 creating src/chameleon_test_pkg.egg-info INFO root:egg_info.py:648 writing src/chameleon_test_pkg.egg-info/PKG-INFO INFO root:egg_info.py:282 writing dependency_links to src/chameleon_test_pkg.egg-info/dependency_links.txt INFO root:egg_info.py:282 writing top-level names to src/chameleon_test_pkg.egg-info/top_level.txt INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:202 reading manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:353 reading manifest template 'MANIFEST.in' INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:bdist_egg.py:162 installing library code to build/bdist.linux-x86_64/egg INFO root:dist.py:970 running install_lib INFO root:dist.py:970 running build_py INFO root:dir_util.py:70 creating build INFO root:dir_util.py:70 creating build/lib INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg INFO root:file_util.py:130 copying src/chameleon_test_pkg/__init__.py -> build/lib/chameleon_test_pkg INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro1.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro2.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/test.pt -> build/lib/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: build_py: byte-compiling is disabled, skipping. INFO root:dir_util.py:70 creating build/bdist.linux-x86_64 INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/chameleon_test_pkg INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/__init__.py -> build/bdist.linux-x86_64/egg/chameleon_test_pkg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro1.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro2.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/test.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: install_lib: byte-compiling is disabled, skipping. INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO WARNING root:bdist_egg.py:268 zip_safe flag not set; analyzing archive contents... INFO root:dir_util.py:70 creating dist INFO root:bdist_egg.py:445 creating 'dist/chameleon_test_pkg-1.0-py3.14.egg' and adding 'build/bdist.linux-x86_64/egg' to it INFO root:dir_util.py:214 removing 'build/bdist.linux-x86_64/egg' (and everything under it) ________________________ LoadPageTests.test_load_wheel _________________________ self = def test_load_wheel(self): > self._test_load_package("bdist_wheel", ".whl") src/chameleon/tests/test_loader.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_loader.py:116: in _test_load_package self._test_pkg(pkg_name) src/chameleon/tests/test_loader.py:131: in _test_pkg output = result(content='foo') src/chameleon/template.py:176: in __call__ return self.render(**kwargs) src/chameleon/zpt/template.py:359: in render return super().render(**_kw) src/chameleon/template.py:227: in render self.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3fa67090> at 7f8d3fa4c2d0> at 7f8d3fa4c250>] at 7f8d3fa91950> at 7f8d3fa905d0>] at 7f8d3fa4f990> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ------------------------------ Captured log call ------------------------------- INFO root:dist.py:970 running bdist_wheel INFO root:dist.py:970 running build INFO root:dist.py:970 running build_py INFO root:dir_util.py:70 creating build INFO root:dir_util.py:70 creating build/lib INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg INFO root:file_util.py:130 copying src/chameleon_test_pkg/__init__.py -> build/lib/chameleon_test_pkg INFO root:dist.py:970 running egg_info INFO root:dir_util.py:70 creating src/chameleon_test_pkg.egg-info INFO root:egg_info.py:648 writing src/chameleon_test_pkg.egg-info/PKG-INFO INFO root:egg_info.py:282 writing dependency_links to src/chameleon_test_pkg.egg-info/dependency_links.txt INFO root:egg_info.py:282 writing top-level names to src/chameleon_test_pkg.egg-info/top_level.txt INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:202 reading manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:353 reading manifest template 'MANIFEST.in' INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro1.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro2.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/test.pt -> build/lib/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: build_py: byte-compiling is disabled, skipping. INFO root:bdist_wheel.py:417 installing to build/bdist.linux-x86_64/wheel INFO root:dist.py:970 running install INFO root:dist.py:970 running install_lib INFO root:dir_util.py:70 creating build/bdist.linux-x86_64 INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/__init__.py -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro1.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro2.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/test.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: install_lib: byte-compiling is disabled, skipping. INFO root:dist.py:970 running install_egg_info INFO root:util.py:323 Copying src/chameleon_test_pkg.egg-info to build/bdist.linux-x86_64/wheel/./chameleon_test_pkg-1.0-py3.14.egg-info INFO root:dist.py:970 running install_scripts INFO root:bdist_wheel.py:483 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg-1.0.dist-info/WHEEL INFO wheel:wheelfile.py:144 creating 'dist/chameleon_test_pkg-1.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/__init__.py' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/macro1.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/macro2.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/test.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/METADATA' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/WHEEL' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/top_level.txt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/RECORD' INFO root:bdist_wheel.py:456 removing build/bdist.linux-x86_64/wheel ________________________ ZPTLoadPageTests.test_load_egg ________________________ self = def test_load_egg(self): > self._test_load_package("bdist_egg", ".egg") src/chameleon/tests/test_loader.py:63: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_loader.py:116: in _test_load_package self._test_pkg(pkg_name) src/chameleon/tests/test_loader.py:131: in _test_pkg output = result(content='foo') src/chameleon/template.py:176: in __call__ return self.render(**kwargs) src/chameleon/zpt/template.py:359: in render return super().render(**_kw) src/chameleon/template.py:227: in render self.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3fa7f090> at 7f8d3f862690> at 7f8d3fa7ccd0>] at 7f8d3faee810> at 7f8d3faeded0>] at 7f8d3faeec90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ------------------------------ Captured log call ------------------------------- INFO root:dist.py:970 running bdist_egg INFO root:dist.py:970 running egg_info INFO root:dir_util.py:70 creating src/chameleon_test_pkg.egg-info INFO root:egg_info.py:648 writing src/chameleon_test_pkg.egg-info/PKG-INFO INFO root:egg_info.py:282 writing dependency_links to src/chameleon_test_pkg.egg-info/dependency_links.txt INFO root:egg_info.py:282 writing top-level names to src/chameleon_test_pkg.egg-info/top_level.txt INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:202 reading manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:353 reading manifest template 'MANIFEST.in' INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:bdist_egg.py:162 installing library code to build/bdist.linux-x86_64/egg INFO root:dist.py:970 running install_lib INFO root:dist.py:970 running build_py INFO root:dir_util.py:70 creating build INFO root:dir_util.py:70 creating build/lib INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg INFO root:file_util.py:130 copying src/chameleon_test_pkg/__init__.py -> build/lib/chameleon_test_pkg INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro1.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro2.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/test.pt -> build/lib/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: build_py: byte-compiling is disabled, skipping. INFO root:dir_util.py:70 creating build/bdist.linux-x86_64 INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/chameleon_test_pkg INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/__init__.py -> build/bdist.linux-x86_64/egg/chameleon_test_pkg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro1.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro2.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/test.pt -> build/bdist.linux-x86_64/egg/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: install_lib: byte-compiling is disabled, skipping. INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO INFO root:file_util.py:130 copying src/chameleon_test_pkg.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO WARNING root:bdist_egg.py:268 zip_safe flag not set; analyzing archive contents... INFO root:dir_util.py:70 creating dist INFO root:bdist_egg.py:445 creating 'dist/chameleon_test_pkg-1.0-py3.14.egg' and adding 'build/bdist.linux-x86_64/egg' to it INFO root:dir_util.py:214 removing 'build/bdist.linux-x86_64/egg' (and everything under it) _______________________ ZPTLoadPageTests.test_load_wheel _______________________ self = def test_load_wheel(self): > self._test_load_package("bdist_wheel", ".whl") src/chameleon/tests/test_loader.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_loader.py:116: in _test_load_package self._test_pkg(pkg_name) src/chameleon/tests/test_loader.py:131: in _test_pkg output = result(content='foo') src/chameleon/template.py:176: in __call__ return self.render(**kwargs) src/chameleon/zpt/template.py:359: in render return super().render(**_kw) src/chameleon/template.py:227: in render self.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f8af050> at 7f8d3f8ad950> at 7f8d3f8ade50>] at 7f8d3f86fed0> at 7f8d3f86ff50>] at 7f8d3f86f790> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ------------------------------ Captured log call ------------------------------- INFO root:dist.py:970 running bdist_wheel INFO root:dist.py:970 running build INFO root:dist.py:970 running build_py INFO root:dir_util.py:70 creating build INFO root:dir_util.py:70 creating build/lib INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg INFO root:file_util.py:130 copying src/chameleon_test_pkg/__init__.py -> build/lib/chameleon_test_pkg INFO root:dist.py:970 running egg_info INFO root:dir_util.py:70 creating src/chameleon_test_pkg.egg-info INFO root:egg_info.py:648 writing src/chameleon_test_pkg.egg-info/PKG-INFO INFO root:egg_info.py:282 writing dependency_links to src/chameleon_test_pkg.egg-info/dependency_links.txt INFO root:egg_info.py:282 writing top-level names to src/chameleon_test_pkg.egg-info/top_level.txt INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:202 reading manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:sdist.py:353 reading manifest template 'MANIFEST.in' INFO root:util.py:323 writing manifest file 'src/chameleon_test_pkg.egg-info/SOURCES.txt' INFO root:dir_util.py:70 creating build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro1.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/macro2.pt -> build/lib/chameleon_test_pkg/templates INFO root:file_util.py:130 copying src/chameleon_test_pkg/templates/test.pt -> build/lib/chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: build_py: byte-compiling is disabled, skipping. INFO root:bdist_wheel.py:417 installing to build/bdist.linux-x86_64/wheel INFO root:dist.py:970 running install INFO root:dist.py:970 running install_lib INFO root:dir_util.py:70 creating build/bdist.linux-x86_64 INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/__init__.py -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg INFO root:dir_util.py:70 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro1.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/macro2.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates INFO root:file_util.py:130 copying build/lib/chameleon_test_pkg/templates/test.pt -> build/bdist.linux-x86_64/wheel/./chameleon_test_pkg/templates WARNING root:cmd.py:334 warning: install_lib: byte-compiling is disabled, skipping. INFO root:dist.py:970 running install_egg_info INFO root:util.py:323 Copying src/chameleon_test_pkg.egg-info to build/bdist.linux-x86_64/wheel/./chameleon_test_pkg-1.0-py3.14.egg-info INFO root:dist.py:970 running install_scripts INFO root:bdist_wheel.py:483 creating build/bdist.linux-x86_64/wheel/chameleon_test_pkg-1.0.dist-info/WHEEL INFO wheel:wheelfile.py:144 creating 'dist/chameleon_test_pkg-1.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/__init__.py' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/macro1.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/macro2.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg/templates/test.pt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/METADATA' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/WHEEL' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/top_level.txt' INFO wheel:wheelfile.py:204 adding 'chameleon_test_pkg-1.0.dist-info/RECORD' INFO root:bdist_wheel.py:456 removing build/bdist.linux-x86_64/wheel ____________ TestZopePageTemplates.test_syntax_error_in_strict_mode ____________ self = def test_syntax_error_in_strict_mode(self): from chameleon.exc import ExpressionError with pytest.raises(ExpressionError): > self.from_string( """""", strict=True ) src/chameleon/tests/test_templates.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d400f8f10> at 7f8d400f8090> at 7f8d400f9e90>] at 7f8d40035390> at 7f8d40036b90>] at 7f8d40035810> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError __________ TestZopePageTemplates.test_syntax_error_in_non_strict_mode __________ self = def test_syntax_error_in_non_strict_mode(self): from chameleon.exc import ExpressionError body = """""" > template = self.from_string(body, strict=False) src/chameleon/tests/test_templates.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f837a10> at 7f8d3f837e50> at 7f8d3f837b50>] at 7f8d3f8360d0> at 7f8d3f836d50>] at 7f8d3f835b10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _________________ TestZopePageTemplates.test_exists_error_leak _________________ self = def test_exists_error_leak(self): body = '''\ ''' > template = self.from_string(body, strict=False) src/chameleon/tests/test_templates.py:163: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _________ TestZopePageTemplates.test_sys_exc_info_is_clear_after_pipe __________ self = def test_sys_exc_info_is_clear_after_pipe(self): body = ( '
' ) > template = self.from_string(body, strict=False) src/chameleon/tests/test_templates.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f93f250> at 7f8d3f93f450> at 7f8d3f93f410>] at 7f8d3f93e750> at 7f8d3f93e510>] at 7f8d3f93ce90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_render_macro_include_subtemplate_containing_error _ self = def test_render_macro_include_subtemplate_containing_error(self): > macro_inner = self.from_string( '''''' ) src/chameleon/tests/test_templates.py:181: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('my_attr', None, '"', ' ', '=', "dict()['key-does-not-exist']")] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError ____________ TestZopePageTemplates.test_render_error_macro_include _____________ self = def test_render_error_macro_include(self): body = """""" > template = self.from_string(body, strict=False) src/chameleon/tests/test_templates.py:214: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'use-macro', 'quote': "'", 'space': ' ', ...}], 'name': 'metal:block', 'namespace': 'ht....org/namespaces/metal', 'ns_attrs': OrderedDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): '"bad"'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_errors[

\n \n

-repeat] _ self = body = '

\n \n

' s = 'repeat' @pytest.mark.parametrize( "body,s", [ ("", 'dummy'), ("", 'foo'), ("", 'key,value'), ('''

''', 'repeat'), (''' ''', 'not_in_translation') ] ) def test_errors(self, body, s): try: > self.from_string(body) src/chameleon/tests/test_templates.py:239: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f8a7110>] at 7f8d3f8a7750> at 7f8d3f863ed0>] at 7f8d3f8a4b50> at 7f8d3f8a4cd0>] at 7f8d3f8a4b10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_errors[\n \n -not_in_translation] _ self = body = '\n \n ' s = 'not_in_translation' @pytest.mark.parametrize( "body,s", [ ("", 'dummy'), ("", 'foo'), ("", 'key,value'), ('''

''', 'repeat'), (''' ''', 'not_in_translation') ] ) def test_errors(self, body, s): try: > self.from_string(body) src/chameleon/tests/test_templates.py:239: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3ff55610> at 7f8d3faee1d0>] at 7f8d3fa74110> at 7f8d3fa74f50>] at 7f8d3fa74ed0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ______________________ TestZopePageTemplates.test_encoded ______________________ self = def test_encoded(self): filename = '074-encoded-template.pt' with open(os.path.join(ROOT, 'inputs', filename), 'rb') as f: body = f.read() > self.from_string(body) src/chameleon/tests/test_templates.py:250: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'windows-1251', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ___________________ TestZopePageTemplates.test_utf8_encoded ____________________ self = def test_utf8_encoded(self): filename = '073-utf8-encoded.pt' with open(os.path.join(ROOT, 'inputs', filename), 'rb') as f: body = f.read() > self.from_string(body) src/chameleon/tests/test_templates.py:257: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError __________________ TestZopePageTemplates.test_recursion_error __________________ self = def test_recursion_error(self): > template = self.from_string( '
' ) src/chameleon/tests/test_templates.py:260: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:define-macro', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-.../metal', 'define-macro'): 'main', ('http://xml.zope.org/namespaces/metal', 'use-macro'): 'template.macros.main'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _______________ TestZopePageTemplates.test_unicode_decode_error ________________ self = def test_unicode_decode_error(self): template = self.from_file( os.path.join(ROOT, 'inputs', 'greeting.pt') ) string = native = "the artist formerly known as ƤŗíƞĆě" try: string = string.decode('utf-8') except AttributeError: pass class name: @staticmethod def __html__(): # This raises a decoding exception string.encode('utf-8').decode('ascii') pytest.fail("Expected exception raised.") try: > template(name=name) src/chameleon/tests/test_templates.py:291: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/template.py:176: in __call__ return self.render(**kwargs) src/chameleon/zpt/template.py:359: in render return super().render(**_kw) src/chameleon/template.py:227: in render self.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f988250>, ] at 7f8d3f98b790> at 7f8d3f989590>] at 7f8d3f850090> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ______________ TestZopePageTemplates.test_package_name_cook_check ______________ self = def test_package_name_cook_check(self): template = self.from_file( "__init__.py", package_name="setuptools", auto_reload=True ) > assert template.cook_check() src/chameleon/tests/test_templates.py:308: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d4036d550> at 7f8d3f9b1210>] at 7f8d3f9b3690> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ____ TestZopePageTemplates.test_custom_encoding_for_str_or_bytes_in_content ____ self = def test_custom_encoding_for_str_or_bytes_in_content(self): string = '
Тест${text}
' try: string = string.decode('utf-8') except AttributeError: pass > template = self.from_string(string, encoding="windows-1251") src/chameleon/tests/test_templates.py:318: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f988090> at 7f8d3f988950> at 7f8d3f988190>] at 7f8d40037890> at 7f8d3f8ff990>] at 7f8d3f8c09d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError __ TestZopePageTemplates.test_custom_encoding_for_str_or_bytes_in_attributes ___ self = def test_custom_encoding_for_str_or_bytes_in_attributes(self): string = '' try: string = string.decode('utf-8') except AttributeError: pass > template = self.from_string(string, encoding="windows-1251") src/chameleon/tests/test_templates.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('tal', 'Тест${text}', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError ______________ TestZopePageTemplates.test_null_translate_function ______________ self = def test_null_translate_function(self): > template = self.from_string('${test}', translate=None) src/chameleon/tests/test_templates.py:352: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = braces_requi...nslation=False default='"?"' default_marker='"?"' at 7f8d3fb3f650>] at 7f8d3fb3ce10> at 7f8d3fb3e6d0>] at 7f8d3fb3ce90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _________________ TestZopePageTemplates.test_on_error_handler __________________ self = def test_on_error_handler(self): exc = [] handler = exc.append > template = self.from_string( '${test}', on_error_handler=handler ) src/chameleon/tests/test_templates.py:359: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3fac97d0> at 7f8d3fac82d0> at 7f8d3fac9b50>] at 7f8d3facafd0> at 7f8d3facb010>] at 7f8d3fac9f50> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _________ TestZopePageTemplates.test_object_substitution_coerce_to_str _________ self = def test_object_substitution_coerce_to_str(self): > template = self.from_string('${test}', translate=None) src/chameleon/tests/test_templates.py:368: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = braces_requi...nslation=False default='"?"' default_marker='"?"' at 7f8d3fa7ca90>] at 7f8d3fae0690> at 7f8d3fae2fd0>] at 7f8d3fae0890> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ________________ TestZopePageTemplates.test_underscore_variable ________________ self = def test_underscore_variable(self): > template = self.from_string( "
${_dummy}
" ) src/chameleon/tests/test_templates.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d40465e90> at 7f8d40467fd0> at 7f8d3f9b0c10>] at 7f8d3f9daa10> at 7f8d3f9dbbd0>] at 7f8d3f9da090> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _______________ TestZopePageTemplates.test_trim_attribute_space ________________ self = def test_trim_attribute_space(self): document = '''
''' > result1 = self.from_string( document)() src/chameleon/tests/test_templates.py:399: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'document', '"', '\n ', '=', 'string:${default} test'), ('id', 'test', '"', '\n ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _____________________ TestZopePageTemplates.test_exception _____________________ self = def test_exception(self): from traceback import format_exception_only > template = self.from_string( "
${dummy}
" ) src/chameleon/tests/test_templates.py:413: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d4021dd90> at 7f8d4021f210> at 7f8d4021cd90>] at 7f8d3f85b1d0> at 7f8d3f85b250>] at 7f8d3f85be90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ___________ TestZopePageTemplates.test_error_handler_makes_safe_copy ___________ self = def test_error_handler_makes_safe_copy(self): calls = [] class TestException(Exception): def __init__(self, *args, **kwargs): calls.append((args, kwargs)) def _render(stream, econtext, rcontext, **kw): exc = TestException('foo', bar='baz') rcontext['__error__'] = ('expression', 1, 42, 'test.pt', exc), raise exc > template = self.from_string("") src/chameleon/tests/test_templates.py:471: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f7cb210>] at 7f8d3f7c83d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ____________ TestZopePageTemplates.test_double_underscore_variable _____________ self = def test_double_underscore_variable(self): from chameleon.exc import TranslationError with pytest.raises(TranslationError): > self.from_string( "
${__dummy}
" ) src/chameleon/tests/test_templates.py:487: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d40480fd0> at 7f8d3f85bed0> at 7f8d3f85a210>] at 7f8d3f96c6d0> at 7f8d3f96d9d0>] at 7f8d3f96ce90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ___________ TestZopePageTemplates.test_disable_comment_interpolation ___________ self = def test_disable_comment_interpolation(self): > template = self.from_string( '', enable_comment_interpolation=False ) src/chameleon/tests/test_templates.py:492: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f815210> at 7f8d3f8154d0>] at 7f8d3f816c10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _________ TestZopePageTemplates.test_compiler_internals_are_disallowed _________ self = def test_compiler_internals_are_disallowed(self): from chameleon.compiler import COMPILER_INTERNALS_OR_DISALLOWED from chameleon.exc import TranslationError for name in COMPILER_INTERNALS_OR_DISALLOWED: body = "${{{}}}".format(name, name) with pytest.raises(TranslationError): > self.from_string(body) src/chameleon/tests/test_templates.py:505: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f88bd90> at 7f8d3f88b4d0> at 7f8d3f8ac110>] at 7f8d3f8af390> at 7f8d3f8af9d0>] at 7f8d3fae2f50> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _____________ TestZopePageTemplates.test_simple_translate_mapping ______________ self = def test_simple_translate_mapping(self): > template = self.from_string( '
' 'foo' '
') src/chameleon/tests/test_templates.py:508: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f7da7d0> at 7f8d3f7dbdd0> at 7f8d3f7da310>] at 7f8d3f75e890> at 7f8d3f75e710>] at 7f8d3f75f690> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ___________ TestZopePageTemplates.test_translate_is_not_an_internal ____________ self = def test_translate_is_not_an_internal(self): > macro = self.from_string('bar') src/chameleon/tests/test_templates.py:516: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f8ae590> at 7f8d3f8ae9d0> at 7f8d3f8ac8d0>] at 7f8d3f92a950> at 7f8d3f92aad0>] at 7f8d3f928a90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError __________________ TestZopePageTemplates.test_default_marker ___________________ self = def test_default_marker(self): > template = self.from_string('') src/chameleon/tests/test_templates.py:530: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f888dd0> at 7f8d3f8ff150> at 7f8d3fa76550>] at 7f8d3f743550> at 7f8d3f743950>] at 7f8d3f743910> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError ________________ TestZopePageTemplates.test_boolean_attributes _________________ self = def test_boolean_attributes(self): > template = self.from_string( "\n".join(( '', '', '', '', '', '', '', '', # noqa: E501 line too long '', '', '', '', '', # noqa: E501 line too long )) ) src/chameleon/tests/test_templates.py:534: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'input', '"', ' ', '=', None), ('checked', None, '"', ' ', '=', 'False')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _______________ TestZopePageTemplates.test_debug_flag_on_string ________________ self = def test_debug_flag_on_string(self): from chameleon.loader import ModuleLoader with open(os.path.join(ROOT, 'inputs', 'hello_world.pt')) as f: source = f.read() > template = self.from_string(source, debug=True) src/chameleon/tests/test_templates.py:589: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f948790> at 7f8d41490d10> at 7f8d403d5690>] at 7f8d400f51d0> at 7f8d400f5590>] at 7f8d400f4d50> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _____________________ TestZopePageTemplates.test_f_strings _____________________ self = def test_f_strings(self): from math import pi from math import sin > template = self.from_string('${f"sin({a}) is {sin(a):.3}"}') src/chameleon/tests/test_templates.py:620: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f8341d0> at 7f8d3f8349d0>] at 7f8d3f836750> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _______________ TestZopePageTemplates.test_windows_line_endings ________________ self = def test_windows_line_endings(self): > template = self.from_string('') src/chameleon/tests/test_templates.py:625: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('id', 'span_id', '"', ' ', '=', None), ('class', 'foo', '"', '\n ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError ______________________ TestZopePageTemplates.test_digest _______________________ self = def test_digest(self): # Make sure ``digest`` doesn't error out when ``filename`` is something # other than a simple string data = '' > template = self.from_string(data) src/chameleon/tests/test_templates.py:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/zpt/template.py:249: in __init__ super().__init__(body, **config) src/chameleon/template.py:168: in __init__ self.write(body) src/chameleon/template.py:286: in write self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f789490> at 7f8d3f788c10>] at 7f8d3f788ad0> at 7f8d3f788390>] at 7f8d3f789110> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/001-variable-scope.pt-outputs/001.pt-None] _ self = input_path = 'inputs/001-variable-scope.pt', output_path = 'outputs/001.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f93ec90>, ] at 7f8d3fa3c850> at 7f8d3fa3d310>] at 7f8d3fa3f490> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/002-repeat-scope.pt-outputs/002.pt-None] _ self = input_path = 'inputs/002-repeat-scope.pt', output_path = 'outputs/002.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f734290>, ] at 7f8d3f9ac390> at 7f8d3f9ac310>] at 7f8d3f9ada10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/003-content.pt-outputs/003.pt-None] _ self = input_path = 'inputs/003-content.pt', output_path = 'outputs/003.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f77ac90>, ] at 7f8d3f983490> at 7f8d3f982fd0>] at 7f8d3f609610> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/004-attributes.pt-outputs/004.pt-None] _ self = input_path = 'inputs/004-attributes.pt', output_path = 'outputs/004.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', None, '"', ' ', '=', "'hello'")], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/005-default.pt-outputs/005.pt-None] _ self = input_path = 'inputs/005-default.pt', output_path = 'outputs/005.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'default', '"', ' ', '=', 'default')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/006-attribute-interpolation.pt-outputs/006.pt-None] _ self = input_path = 'inputs/006-attribute-interpolation.pt' output_path = 'outputs/006.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'ltr', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/007-content-interpolation.pt-outputs/007.pt-None] _ self = input_path = 'inputs/007-content-interpolation.pt' output_path = 'outputs/007.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f75a850>, ] at 7f8d3f75b990> at 7f8d3fd22e10>] at 7f8d3fd236d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/008-builtins.pt-outputs/008.pt-None] _ self = input_path = 'inputs/008-builtins.pt', output_path = 'outputs/008.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'static', '"', ' ', '=', 'string:dynamic')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/009-literals.pt-outputs/009.pt-None] _ self = input_path = 'inputs/009-literals.pt', output_path = 'outputs/009.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f613d10>, ] at 7f8d3f611690> at 7f8d3f611910>] at 7f8d3f611890> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/010-structure.pt-outputs/010.pt-None] _ self = input_path = 'inputs/010-structure.pt', output_path = 'outputs/010.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d40383f50>, ] at 7f8d3f8c5ad0> at 7f8d3f8c7a50>] at 7f8d3f8c4650> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/011-messages.pt-outputs/011-en.pt-en] _ self = input_path = 'inputs/011-messages.pt', output_path = 'outputs/011-en.pt' language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f82a990>, ] at 7f8d3f5c39d0> at 7f8d3f5c1ad0>] at 7f8d3f5c0050> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/011-messages.pt-outputs/011.pt-None] _ self = input_path = 'inputs/011-messages.pt', output_path = 'outputs/011.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f5f2a10>, ] at 7f8d3f882f90> at 7f8d3f882b90>] at 7f8d3f5f1610> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/012-translation.pt-outputs/012-en.pt-en] _ self = input_path = 'inputs/012-translation.pt', output_path = 'outputs/012-en.pt' language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f829e90>, ] at 7f8d3fb06e90> at 7f8d3fb06910>] at 7f8d3fb06dd0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/012-translation.pt-outputs/012.pt-None] _ self = input_path = 'inputs/012-translation.pt', output_path = 'outputs/012.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f934f10>, ] at 7f8d3f864a50> at 7f8d3f866bd0>] at 7f8d3f8647d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/013-repeat-nested.pt-outputs/013.pt-None] _ self = input_path = 'inputs/013-repeat-nested.pt', output_path = 'outputs/013.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f8c2c50>, ] at 7f8d3f96ee10> at 7f8d3f96dad0>] at 7f8d3f96fcd0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/014-repeat-nested-similar.pt-outputs/014.pt-None] _ self = input_path = 'inputs/014-repeat-nested-similar.pt' output_path = 'outputs/014.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f6fd5d0>, ] at 7f8d4021c310> at 7f8d4021f8d0>] at 7f8d4021f7d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/015-translation-nested.pt-outputs/015-en.pt-en] _ self = input_path = 'inputs/015-translation-nested.pt' output_path = 'outputs/015-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fb53150>, ] at 7f8d3fb3f790> at 7f8d3fb3f510>] at 7f8d3fb3de10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/015-translation-nested.pt-outputs/015.pt-None] _ self = input_path = 'inputs/015-translation-nested.pt', output_path = 'outputs/015.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f966090>, ] at 7f8d3f991750> at 7f8d3f992850>] at 7f8d3f993490> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/016-explicit-translation.pt-outputs/016-en.pt-en] _ self = input_path = 'inputs/016-explicit-translation.pt' output_path = 'outputs/016-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('alt', "${'Hello world!'}", '"', ' ', '=', None)] I18N_ATTRIBUTES = {'alt': None} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/016-explicit-translation.pt-outputs/016.pt-None] _ self = input_path = 'inputs/016-explicit-translation.pt' output_path = 'outputs/016.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('alt', "${'Hello world!'}", '"', ' ', '=', None)] I18N_ATTRIBUTES = {'alt': None} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/017-omit-tag.pt-outputs/017.pt-None] _ self = input_path = 'inputs/017-omit-tag.pt', output_path = 'outputs/017.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'omitted', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/018-translation-nested-dynamic.pt-outputs/018-en.pt-en] _ self = input_path = 'inputs/018-translation-nested-dynamic.pt' output_path = 'outputs/018-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/018-translation-nested-dynamic.pt-outputs/018.pt-None] _ self = input_path = 'inputs/018-translation-nested-dynamic.pt' output_path = 'outputs/018.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/019-replace.pt-outputs/019.pt-None] _ self = input_path = 'inputs/019-replace.pt', output_path = 'outputs/019.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f6209d0>, ] at 7f8d3f7f9110> at 7f8d3f7fbe10>] at 7f8d3f7f9c90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/020-on-error.pt-outputs/020.pt-None] _ self = input_path = 'inputs/020-on-error.pt', output_path = 'outputs/020.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('id', 'test', '"', ' ', '=', None), ('class', None, '"', ' ', '=', "python: 'abc' + 2")] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/021-translation-domain.pt-outputs/021-en.pt-en] _ self = input_path = 'inputs/021-translation-domain.pt' output_path = 'outputs/021-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'test', '"', ' ', '=', None)] I18N_ATTRIBUTES = {'class': None} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/021-translation-domain.pt-outputs/021.pt-None] _ self = input_path = 'inputs/021-translation-domain.pt', output_path = 'outputs/021.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', 'test', '"', ' ', '=', None)] I18N_ATTRIBUTES = {'class': None} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/022-switch.pt-outputs/022.pt-None] _ self = input_path = 'inputs/022-switch.pt', output_path = 'outputs/022.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fb52310>, ] at 7f8d3f760110> at 7f8d3f762990>] at 7f8d3f760d90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/023-condition.pt-outputs/023.pt-None] _ self = input_path = 'inputs/023-condition.pt', output_path = 'outputs/023.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f470750>, ] at 7f8d40623c50> at 7f8d406225d0>] at 7f8d406214d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/024-namespace-elements.pt-outputs/024.pt-None] _ self = input_path = 'inputs/024-namespace-elements.pt', output_path = 'outputs/024.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f510b50>, ] at 7f8d3f437050> at 7f8d3f435a10>] at 7f8d3f436c50> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/025-repeat-whitespace.pt-outputs/025.pt-None] _ self = input_path = 'inputs/025-repeat-whitespace.pt', output_path = 'outputs/025.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f78be10>, ] at 7f8d40123e10> at 7f8d40120990>] at 7f8d40121250> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/026-repeat-variable.pt-outputs/026.pt-None] _ self = input_path = 'inputs/026-repeat-variable.pt', output_path = 'outputs/026.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/027-attribute-replacement.pt-outputs/027.pt-None] _ self = input_path = 'inputs/027-attribute-replacement.pt' output_path = 'outputs/027.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/028-attribute-toggle.pt-outputs/028.pt-None] _ self = input_path = 'inputs/028-attribute-toggle.pt', output_path = 'outputs/028.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/029-attribute-ordering.pt-outputs/029.pt-None] _ self = input_path = 'inputs/029-attribute-ordering.pt', output_path = 'outputs/029.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/030-repeat-tuples.pt-outputs/030.pt-None] _ self = input_path = 'inputs/030-repeat-tuples.pt', output_path = 'outputs/030.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f8c4b10>, ] at 7f8d3f8c5ad0> at 7f8d3f8c7590>] at 7f8d3f8c6490> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/031-namespace-with-tal.pt-outputs/031.pt-None] _ self = input_path = 'inputs/031-namespace-with-tal.pt', output_path = 'outputs/031.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fa38c50>, ] at 7f8d3f9cba10> at 7f8d3f9c93d0>] at 7f8d3f9c8190> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/032-master-template.pt-outputs/032.pt-None] _ self = input_path = 'inputs/032-master-template.pt', output_path = 'outputs/032.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('id', 'content', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/033-use-macro-trivial.pt-outputs/033.pt-None] _ self = input_path = 'inputs/033-use-macro-trivial.pt', output_path = 'outputs/033.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/034-use-template-as-macro.pt-outputs/034.pt-None] _ self = input_path = 'inputs/034-use-template-as-macro.pt' output_path = 'outputs/034.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...ns_attrs': OrderedDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt')"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/035-use-macro-with-fill-slot.pt-outputs/035.pt-None] _ self = input_path = 'inputs/035-use-macro-with-fill-slot.pt' output_path = 'outputs/035.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...rg/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('\n ${kind} title\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/036-use-macro-inherits-dynamic-scope.pt-outputs/036.pt-None] _ self = input_path = 'inputs/036-use-macro-inherits-dynamic-scope.pt' output_path = 'outputs/036.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'tal:define', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro', ... title', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/037-use-macro-local-variable-scope.pt-outputs/037.pt-None] _ self = input_path = 'inputs/037-use-macro-local-variable-scope.pt' output_path = 'outputs/037.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...}]...redDict(), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', ('\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/038-use-macro-globals.pt-outputs/038.pt-None] _ self = input_path = 'inputs/038-use-macro-globals.pt', output_path = 'outputs/038.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'metal:globals', 'namespace': '...etal', 'ns_attrs': OrderedDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('039-globals.pt')"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/039-globals.pt-outputs/039.pt-None] _ self = input_path = 'inputs/039-globals.pt', output_path = 'outputs/039.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] node= at 7f8d40185dd0>] at 7f8d3ff88750> at 7f8d3ff88150>] at 7f8d402b9cd0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/040-macro-using-template-symbol.pt-outputs/040.pt-None] _ self = input_path = 'inputs/040-macro-using-template-symbol.pt' output_path = 'outputs/040.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'UTF-8', '"', ' ', '=', None), ('standalone', 'no', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/041-translate-nested-names.pt-outputs/041.pt-None] _ self = input_path = 'inputs/041-translate-nested-names.pt' output_path = 'outputs/041.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f45dc10>, ] at 7f8d3f851310> at 7f8d3f8504d0>] at 7f8d3f45e850> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/042-use-macro-fill-footer.pt-outputs/042.pt-None] _ self = input_path = 'inputs/042-use-macro-fill-footer.pt' output_path = 'outputs/042.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...tp://xml.zope.org/namespaces/metal', 'ns_attrs': OrderedDict(), ...}, [('text', ('New footer',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/043-macro-nested-dynamic-vars.pt-outputs/043.pt-None] _ self = input_path = 'inputs/043-macro-nested-dynamic-vars.pt' output_path = 'outputs/043.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'metal:inner', 'namespace': 'ht...al', 'ns_attrs': OrderedDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "template.macros['inner']"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/044-tuple-define.pt-outputs/044.pt-None] _ self = input_path = 'inputs/044-tuple-define.pt', output_path = 'outputs/044.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fad9750>, ] at 7f8d3f48d490> at 7f8d3f48edd0>] at 7f8d3f48e110> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/045-namespaces.pt-outputs/045.pt-None] _ self = input_path = 'inputs/045-namespaces.pt', output_path = 'outputs/045.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'UTF-8', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/046-extend-macro.pt-outputs/046.pt-None] _ self = input_path = 'inputs/046-extend-macro.pt', output_path = 'outputs/046.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:define-macro', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:exte...ded', ('http://xml.zope.org/namespaces/metal', 'extend-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...(), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', (' footer\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/047-use-extended-macro.pt-outputs/047.pt-None] _ self = input_path = 'inputs/047-use-extended-macro.pt', output_path = 'outputs/047.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...edDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('046-extend-macro.pt').macros['extended']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...}]...http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Extended',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/048-use-extended-macro-fill-original.pt-outputs/048.pt-None] _ self = input_path = 'inputs/048-use-extended-macro-fill-original.pt' output_path = 'outputs/048.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...edDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('046-extend-macro.pt').macros['extended']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...rg/namespaces/metal', 'ns_attrs': OrderedDict(), ...}, [('text', ('\n Extended footer\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/049-entities-in-attributes.pt-outputs/049.pt-None] _ self = input_path = 'inputs/049-entities-in-attributes.pt' output_path = 'outputs/049.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('alt', '1 < 2: ${1 < 2}', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/050-define-macro-and-use-not-extend.pt-outputs/050.pt-None] _ self = input_path = 'inputs/050-define-macro-and-use-not-extend.pt' output_path = 'outputs/050.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:define-macro', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-... 'main', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...g/namespaces/metal', 'ns_attrs': OrderedDict(), ...}, [('text', ('\n Default content\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/051-use-non-extended-macro.pt-outputs/051.pt-None] _ self = input_path = 'inputs/051-use-non-extended-macro.pt' output_path = 'outputs/051.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...//xml.zope.org/namespaces/metal', 'use-macro'): "load('050-define-macro-and-use-not-extend.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...redDict(), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', ('\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/052-i18n-domain-inside-filled-slot.pt-outputs/052.pt-None] _ self = input_path = 'inputs/052-i18n-domain-inside-filled-slot.pt' output_path = 'outputs/052.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:define-macro', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-... 'main', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...redDict(), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', ('\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/053-special-characters-in-attributes.pt-outputs/053.pt-None] _ self = input_path = 'inputs/053-special-characters-in-attributes.pt' output_path = 'outputs/053.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', None, '"', ' ', '=', 'string:@@view')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/054-import-expression.pt-outputs/054.pt-None] _ self = input_path = 'inputs/054-import-expression.pt', output_path = 'outputs/054.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f860f90> at 7f8d3f8624d0> at 7f8d3f862910>] at 7f8d3fb06a10> at 7f8d3fb04c90>] at 7f8d3fb07190> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/055-attribute-fallback-to-dict-lookup.pt-outputs/055.pt-None] _ self = input_path = 'inputs/055-attribute-fallback-to-dict-lookup.pt' output_path = 'outputs/055.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fa93390>, ] at 7f8d3f613610> at 7f8d3f613a10>] at 7f8d3fa91e50> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/056-comment-attribute.pt-outputs/056.pt-None] _ self = input_path = 'inputs/056-comment-attribute.pt', output_path = 'outputs/056.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f4b78d0> at 7f8d3f4b5b10> at 7f8d3f4b7a90>] at 7f8d3f560a50> at 7f8d3f561510>] at 7f8d3f561290> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/057-order.pt-outputs/057.pt-None] _ self = input_path = 'inputs/057-order.pt', output_path = 'outputs/057.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f9c9f50>, ] at 7f8d3fae0dd0> at 7f8d3fae2a50>] at 7f8d3fae0290> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/058-script.pt-outputs/058.pt-None] _ self = input_path = 'inputs/058-script.pt', output_path = 'outputs/058.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f665a50> at 7f8d3f667910> at 7f8d3f667450>] at 7f8d3f44ea50> at 7f8d3f44dc50>] at 7f8d3f666850> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/059-embedded-javascript.pt-outputs/059.pt-None] _ self = input_path = 'inputs/059-embedded-javascript.pt', output_path = 'outputs/059.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('onclick', 'alert(true && false);', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/060-macro-with-multiple-same-slots.pt-outputs/060.pt-None] _ self = input_path = 'inputs/060-macro-with-multiple-same-slots.pt' output_path = 'outputs/060.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d404d5850> at 7f8d404d6950> at 7f8d404d4710> at 7f8d3fb66d50>] at 7f8d3fb65bd0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/061-fill-one-slot-but-two-defined.pt-outputs/061.pt-None] _ self = input_path = 'inputs/061-fill-one-slot-but-two-defined.pt' output_path = 'outputs/061.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...://xml.zope.org/namespaces/metal', 'use-macro'): "load('060-macro-with-multiple-same-slots.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...p://xml.zope.org/namespaces/metal', 'ns_attrs': OrderedDict(), ...}, [('text', ('My document',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/062-comments-and-expressions.pt-outputs/062.pt-None] _ self = input_path = 'inputs/062-comments-and-expressions.pt' output_path = 'outputs/062.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f98b650> at 7f8d3f98b450>] at 7f8d3f98a1d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/063-continuation.pt-outputs/063.pt-None] _ self = input_path = 'inputs/063-continuation.pt', output_path = 'outputs/063.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3fd23d50> at 7f8d3fd237d0> at 7f8d3fd23990>] at 7f8d3f955b90> at 7f8d3f956950>] at 7f8d3f956090> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/064-tags-and-special-characters.pt-outputs/064.pt-None] _ self = input_path = 'inputs/064-tags-and-special-characters.pt' output_path = 'outputs/064.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('id', 'test', '"', '\t', '=', None), ('class', "${'test'}", '"', '\t', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/065-use-macro-in-fill.pt-outputs/065.pt-None] _ self = input_path = 'inputs/065-use-macro-in-fill.pt', output_path = 'outputs/065.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'tal:define', 'quote': '"', 'space': ' ', ...}, {'eq...'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Content',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/066-load-expression.pt-outputs/066.pt-None] _ self = input_path = 'inputs/066-load-expression.pt', output_path = 'outputs/066.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'tal:define', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro', ...ine'): 'hello_world load: hello_world.pt', ('http://xml.zope.org/namespaces/metal', 'use-macro'): 'hello_world'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/067-attribute-decode.pt-outputs/067.pt-None] _ self = input_path = 'inputs/067-attribute-decode.pt', output_path = 'outputs/067.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('src', '#', '"', ' ', '=', None), ('class', None, '"', ' ', '=', "1 > 0 and 'up' or 0 < 1 and 'down'")] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/068-less-than-greater-than-in-attributes.pt-outputs/068.pt-None] _ self = input_path = 'inputs/068-less-than-greater-than-in-attributes.pt' output_path = 'outputs/068.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', '0 < 1 or 0 > 1', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/069-translation-domain-and-macro.pt-outputs/069-en.pt-en] _ self = input_path = 'inputs/069-translation-domain-and-macro.pt' output_path = 'outputs/069-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...: 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Title',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/069-translation-domain-and-macro.pt-outputs/069.pt-None] _ self = input_path = 'inputs/069-translation-domain-and-macro.pt' output_path = 'outputs/069.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...: 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Title',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/070-translation-domain-and-use-macro.pt-outputs/070-en.pt-en] _ self = input_path = 'inputs/070-translation-domain-and-use-macro.pt' output_path = 'outputs/070-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'i18n:domain', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro',... 'test', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...: 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Title',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/070-translation-domain-and-use-macro.pt-outputs/070.pt-None] _ self = input_path = 'inputs/070-translation-domain-and-use-macro.pt' output_path = 'outputs/070.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'i18n:domain', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro',... 'test', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...: 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('Title',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/071-html-attribute-defaults.pt-outputs/071.pt-None] _ self = input_path = 'inputs/071-html-attribute-defaults.pt' output_path = 'outputs/071.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'input', '"', ' ', '=', None), ('checked', None, '"', ' ', '=', 'True')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/072-repeat-interpolation.pt-outputs/072.pt-None] _ self = input_path = 'inputs/072-repeat-interpolation.pt' output_path = 'outputs/072.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('class', "${'odd' if i % 2 != 0 else default}", '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/073-utf8-encoded.pt-outputs/073.pt-None] _ self = input_path = 'inputs/073-utf8-encoded.pt', output_path = 'outputs/073.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/074-encoded-template.pt-outputs/074.pt-None] _ self = input_path = 'inputs/074-encoded-template.pt', output_path = 'outputs/074.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('version', '1.0', '"', ' ', '=', None), ('encoding', 'windows-1251', '"', ' ', '=', None), ('?', '', '', ' ', '', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/075-nested-macros.pt-outputs/075.pt-None] _ self = input_path = 'inputs/075-nested-macros.pt', output_path = 'outputs/075.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'tal:block', 'namespace':...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'tal:block', 'namespace': 'http://xml.zope.org/namespaces/tal', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], ...), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', ('\n ',))])), ('text', ('\n\n ',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/076-nested-macro-override.pt-outputs/076.pt-None] _ self = input_path = 'inputs/076-nested-macro-override.pt' output_path = 'outputs/076.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'metal:page', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('075-nested-macros.pt').macros['master']"}), ...} end = {'attrs': [], 'name': 'metal:page', 'namespace': 'http://xml.zope.org/namespaces/metal', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'fill-slot', 'quote': '"', 'space': ' ', ...}], 'nam...e': 'http://xml.zope.org/namespaces/metal', 'ns_attrs': OrderedDict(), ...}, [('text', ('bar',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/077-i18n-attributes.pt-outputs/077-en.pt-en] _ self = input_path = 'inputs/077-i18n-attributes.pt', output_path = 'outputs/077-en.pt' language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'hidden', '"', ' ', '=', None), ('id', 'uploadify_label_file_title', '"', ' ', '=', None), ('value', 'value', '"', ' ', '=', None)] I18N_ATTRIBUTES = {'value': 'Title'} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/077-i18n-attributes.pt-outputs/077.pt-None] _ self = input_path = 'inputs/077-i18n-attributes.pt', output_path = 'outputs/077.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('type', 'hidden', '"', ' ', '=', None), ('id', 'uploadify_label_file_title', '"', ' ', '=', None), ('value', 'value', '"', ' ', '=', None)] I18N_ATTRIBUTES = {'value': 'Title'} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/078-tags-and-newlines.pt-outputs/078.pt-None] _ self = input_path = 'inputs/078-tags-and-newlines.pt', output_path = 'outputs/078.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/079-implicit-i18n.pt-outputs/079-en.pt-en] _ self = input_path = 'inputs/079-implicit-i18n.pt', output_path = 'outputs/079-en.pt' language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('alt', 'Site logo', '"', ' ', '=', None), ('href', '${site_url}/logo.png', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/079-implicit-i18n.pt-outputs/079.pt-None] _ self = input_path = 'inputs/079-implicit-i18n.pt', output_path = 'outputs/079.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('alt', 'Site logo', '"', ' ', '=', None), ('href', '${site_url}/logo.png', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/080-xmlns-namespace-on-tal.pt-outputs/080.pt-None] _ self = input_path = 'inputs/080-xmlns-namespace-on-tal.pt' output_path = 'outputs/080.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f809350>, ] at 7f8d3f80a8d0> at 7f8d3f4717d0>] at 7f8d3f472290> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/081-load-spec.pt-outputs/081.pt-None] _ self = input_path = 'inputs/081-load-spec.pt', output_path = 'outputs/081.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...deredDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): 'load: chameleon:tests/inputs/hello_world.pt'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/082-load-spec-computed.pt-outputs/082.pt-None] _ self = input_path = 'inputs/082-load-spec-computed.pt', output_path = 'outputs/082.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'tal:define', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro', ...hello_world'", ('http://xml.zope.org/namespaces/metal', 'use-macro'): 'load: chameleon:tests/inputs/${name}.pt'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/083-template-dict-to-macro.pt-outputs/083.pt-None] _ self = input_path = 'inputs/083-template-dict-to-macro.pt' output_path = 'outputs/083.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'tal:define', 'quote': '"', 'space': ' ', ...}, {'eq': '=', 'name': 'metal:use-macro', ...mplate load: 032-master-template.pt', ('http://xml.zope.org/namespaces/metal', 'use-macro'): "template['main']"}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/084-interpolation-in-cdata.pt-outputs/084.pt-None] _ self = input_path = 'inputs/084-interpolation-in-cdata.pt' output_path = 'outputs/084.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f89c210>, ] at 7f8d3f89eb50> at 7f8d3f89d3d0>] at 7f8d3f89f3d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/085-nested-translation.pt-outputs/085-en.pt-en] _ self = input_path = 'inputs/085-nested-translation.pt' output_path = 'outputs/085-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', '${request.site_url}', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/085-nested-translation.pt-outputs/085.pt-None] _ self = input_path = 'inputs/085-nested-translation.pt', output_path = 'outputs/085.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', '${request.site_url}', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/086-self-closing.pt-outputs/086.pt-None] _ self = input_path = 'inputs/086-self-closing.pt', output_path = 'outputs/086.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...redDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "load('032-master-template.pt').macros['main']"}), ...} end = {'attrs': [], 'name': 'html', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [], 'name': 'body', 'namespace': 'http://www.w3.org/XML/1998/namespace', ...redDict(), ...}, [('text', ('\n ',)), ('element', ({...}, {...}, [...])), ('text', ('\n ',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/087-code-blocks.pt-outputs/087.pt-None] _ self = input_path = 'inputs/087-code-blocks.pt', output_path = 'outputs/087.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = , ] at 7f8d3f621690> at 7f8d3f623d50> at 7f8d3f622bd0>] at 7f8d3faa56d0> at 7f8d3faa7290>] at 7f8d3faa5090> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/088-python-newlines.pt-outputs/088.pt-None] _ self = input_path = 'inputs/088-python-newlines.pt', output_path = 'outputs/088.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f8518d0>, ] at 7f8d3f850590> at 7f8d3f852510>] at 7f8d3f8521d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/089-load-fallback.pt-outputs/089.pt-None] _ self = input_path = 'inputs/089-load-fallback.pt', output_path = 'outputs/089.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'html', 'namespace': 'htt...', 'use-macro'): 'load: tests/missing.pt |\n chameleon:tests/inputs/hello_world.pt'}), ...} end = None, children = [] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/090-tuple-expression.pt-outputs/090.pt-None] _ self = input_path = 'inputs/090-tuple-expression.pt', output_path = 'outputs/090.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', '#${route}', '"', ' ', '=', None), ('id', '${route}nav', '"', ' ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/091-repeat-none.pt-outputs/091.pt-None] _ self = input_path = 'inputs/091-repeat-none.pt', output_path = 'outputs/091.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3ff2df10>, ] at 7f8d3f71d810> at 7f8d3f71e750>] at 7f8d3f71d710> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/120-translation-context.pt-outputs/120-en.pt-en] _ self = input_path = 'inputs/120-translation-context.pt' output_path = 'outputs/120-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f7bf0d0>, ] at 7f8d3f46b750> at 7f8d403a3910>] at 7f8d3f46ad10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/120-translation-context.pt-outputs/120.pt-None] _ self = input_path = 'inputs/120-translation-context.pt', output_path = 'outputs/120.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f452990>, ] at 7f8d3f9dea10> at 7f8d3f9de010>] at 7f8d404eefd0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/121-translation-comment.pt-outputs/121.pt-None] _ self = input_path = 'inputs/121-translation-comment.pt', output_path = 'outputs/121.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f576450>, ] at 7f8d40035c10> at 7f8d40035990>] at 7f8d40036d90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/122-translation-ignore.pt-outputs/122.pt-None] _ self = input_path = 'inputs/122-translation-ignore.pt', output_path = 'outputs/122.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', 'http://www.python.org', '"', ' ', '=', None), ('title', 'Python', '"', '\n ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/123-html5-data-attributes.pt-outputs/123.pt-None] _ self = input_path = 'inputs/123-html5-data-attributes.pt' output_path = 'outputs/123.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('foo', 'bar', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/124-translation-target.pt-outputs/124-en.pt-en] _ self = input_path = 'inputs/124-translation-target.pt' output_path = 'outputs/124-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f94d2d0>, ] at 7f8d3f4b48d0> at 7f8d3f4b5a90>] at 7f8d3f4b6150> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/124-translation-target.pt-outputs/124.pt-None] _ self = input_path = 'inputs/124-translation-target.pt', output_path = 'outputs/124.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f492910>, ] at 7f8d3f98b190> at 7f8d3f98ba90>] at 7f8d3f9881d0> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/125-macro-translation-ordering.pt-outputs/125.pt-None] _ self = input_path = 'inputs/125-macro-translation-ordering.pt' output_path = 'outputs/125.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('xmlns', 'http://www.w3.org/1999/xhtml', '"', ' ', '=', None), ('xml:lang', 'en', '"', ' ', '=', None), ('lang', 'en', '"', '\n ', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/126-define-escaping.pt-outputs/126.pt-None] _ self = input_path = 'inputs/126-define-escaping.pt', output_path = 'outputs/126.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', None, '"', ' ', '=', 'string:localhost?a=1b${s1}2')] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: default = ast.Str(s=text) if text is not None else None # If the expression is non-trivial, the attribute is # dynamic (computed). if expr is not None: if name is None: expression = nodes.Value( decode_htmlentities(expr), default, self.default_marker ) value = nodes.DictAttributes( expression, ('&', '<', '>', '"'), '"', set(filter(None, names[i:])), self.boolean_attributes ) for fs in filtering: fs.append(expression) filtering.append([]) elif name in self.boolean_attributes: value = nodes.Boolean( expr, name, default, self.default_marker) else: value = nodes.Substitution( decode_htmlentities(expr), char_escape, default, self.default_marker, literal_false=not boolean ) # Otherwise, it's a static attribute. We don't include it # here if there's one or more "computed" attributes # (dynamic, from one or more dict values). else: value = ast.Str(s=text) if msgid is missing and implicit_i18n: msgid = text if name is not None: # If translation is required, wrap in a translation # clause if msgid is not missing: value = nodes.Translate(msgid, value) space = self._maybe_trim(space) attribute = nodes.Attribute( name, value, quote, eq, space, default, filtering[-1], ) > if not isinstance(value, ast.Str): E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:858: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/127-tags-and-attributes-special-chars.pt-outputs/127.pt-None] _ self = input_path = 'inputs/127-tags-and-attributes-special-chars.pt' output_path = 'outputs/127.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:628: in visit_element body.append(self.visit(*child)) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('style', 'height:97px', '"', '\t', '=', None), ('class', "${'test'}", '"', '\t', '=', None)] I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/128-translation-macro-name.pt-outputs/128-en.pt-en] _ self = input_path = 'inputs/128-translation-macro-name.pt' output_path = 'outputs/128-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', '#', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/128-translation-macro-name.pt-outputs/128.pt-None] _ self = input_path = 'inputs/128-translation-macro-name.pt' output_path = 'outputs/128.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) src/chameleon/zpt/program.py:304: in visit_element attributes, filtering = self._create_attributes_nodes( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = prepared = [('href', '#', '"', ' ', '=', None)], I18N_ATTRIBUTES = {} def _create_attributes_nodes(self, prepared, I18N_ATTRIBUTES): attributes = [] names = [attr[0] for attr in prepared] filtering = [[]] for i, (name, text, quote, space, eq, expr) in enumerate(prepared): implicit_i18n = ( name is not None and name.lower() in self.implicit_i18n_attributes ) char_escape = ('&', '<', '>', quote) msgid = I18N_ATTRIBUTES.get(name, missing) # If (by heuristic) ``text`` contains one or more # interpolation expressions, apply interpolation # substitution to the text. boolean = name in self.boolean_attributes if expr is None and text is not None and '${' in text: default = None expr = nodes.Substitution( text, char_escape, default, self.default_marker, literal_false=not boolean ) translation = ( implicit_i18n and msgid is missing and not boolean ) value = nodes.Interpolation(expr, True, translation) if boolean: value = nodes.Replace(value, name) else: > default = ast.Str(s=text) if text is not None else None E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:799: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/237-double-define.pt-outputs/237.pt-None] _ self = input_path = 'inputs/237-double-define.pt', output_path = 'outputs/237.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3f6e96d0>, ] at 7f8d3f6ebb50> at 7f8d3f6e8e90>] at 7f8d3f6e9e90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/238-macroname.pt-outputs/238.pt-None] _ self = input_path = 'inputs/238-macroname.pt', output_path = 'outputs/238.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:335: in _compile program = self.parse(body) src/chameleon/zpt/template.py:282: in parse return MacroProgram( # type: ignore[no-untyped-call] src/chameleon/zpt/program.py:157: in __init__ super().__init__(*args, **kwargs) src/chameleon/program.py:36: in __init__ node = self.visit(kind, args) src/chameleon/program.py:42: in visit return visitor(*args) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = start = {'attrs': [{'eq': '=', 'name': 'metal:use-macro', 'quote': '"', 'space': ' ', ...}], 'name': 'span', 'namespace': 'htt...98/namespace', 'ns_attrs': OrderedDict({('http://xml.zope.org/namespaces/metal', 'use-macro'): "macros['page']"}), ...} end = {'attrs': [], 'name': 'span', 'namespace': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...} children = [('text', ('\n ',)), ('element', ({'attrs': [{'eq': '=', 'name': 'metal:fill-slot', 'quote': '"', 'space': ' ', ...},...': 'http://www.w3.org/XML/1998/namespace', 'ns_attrs': OrderedDict(), ...}, [('text', ('name',))])), ('text', ('\n',))] def visit_element(self, start, end, children): ns = start['ns_attrs'] attrs = start['attrs'] if self.enable_data_attributes: attrs = list(attrs) convert_data_attributes(ns, attrs, start['ns_map']) for (prefix, attr), encoded in tuple(ns.items()): if prefix == TAL or prefix == METAL: ns[prefix, attr] = decode_htmlentities(encoded) # Validate namespace attributes validate_attributes(ns, TAL, tal.WHITELIST) validate_attributes(ns, METAL, metal.WHITELIST) validate_attributes(ns, I18N, i18n.WHITELIST) # Check attributes for language errors self._check_attributes(start['namespace'], ns) # Remember whitespace for item repetition if self._last is not None: self._whitespace = "\n" + " " * len(self._last.rsplit('\n', 1)[-1]) # Set element-local whitespace whitespace = self._whitespace # Set up switch try: clause = ns[TAL, 'switch'] except KeyError: switch = None else: value = nodes.Value(clause) switch = value self._switches.append(switch) body = [] # Include macro use_macro = ns.get((METAL, 'use-macro')) extend_macro = ns.get((METAL, 'extend-macro')) if use_macro or extend_macro: omit = True slots = [] self._use_macro.append(slots) if use_macro: inner = nodes.UseExternalMacro( nodes.Value(use_macro), slots, False ) macro_name = use_macro else: inner = nodes.UseExternalMacro( nodes.Value(extend_macro), slots, True ) macro_name = extend_macro # While the macro executes, it should have access to the name it # was called with as 'macroname'. Splitting on / mirrors zope.tal # and is a concession to the path expression syntax. macro_name = macro_name.rsplit('/', 1)[-1] inner = nodes.Define( [nodes.Assignment( > ["macroname"], Static(ast.Str(macro_name)), True)], inner, ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/zpt/program.py:237: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/greeting.pt-outputs/greeting.pt-None] _ self = input_path = 'inputs/greeting.pt', output_path = 'outputs/greeting.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fa4d250>, ] at 7f8d3f63dc10> at 7f8d3f63e890>] at 7f8d3f63de10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/hello_world.pt-outputs/hello_world.pt-None] _ self = input_path = 'inputs/hello_world.pt', output_path = 'outputs/hello_world.pt' language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ] at 7f8d3f786090> at 7f8d3f785b50> at 7f8d3f786f90>] at 7f8d3f785550> at 7f8d3f785090>] at 7f8d3f5a2a10> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/multinode-implicit-i18n.pt-outputs/multinode-en.pt-en] _ self = input_path = 'inputs/multinode-implicit-i18n.pt' output_path = 'outputs/multinode-en.pt', language = 'en' @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fad9a90>, ] at 7f8d3f6f9e50> at 7f8d3f6fa1d0>] at 7f8d3f6f8e90> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_pt_files[inputs/multinode-implicit-i18n.pt-outputs/multinode.pt-None] _ self = input_path = 'inputs/multinode-implicit-i18n.pt' output_path = 'outputs/multinode.pt', language = None @find_files(".pt") def test_pt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTemplateFile class Literal: def __init__(self, s): self.s = s def __html__(self): return self.s def __str__(self): raise RuntimeError( "%r is a literal." % self.s) from chameleon.loader import TemplateLoader # TODO: Should take the path from the input path? loader = TemplateLoader(os.path.join(ROOT, "inputs")) > self.execute( input_path, output_path, language, PageTemplateFile, literal=Literal("
Hello world!
"), content="
Hello world!
", message=Message(), load=loader.bind(PageTemplateFile), ) src/chameleon/tests/test_templates.py:661: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = at 7f8d3fa7d050>, ] at 7f8d3fa7fc10> at 7f8d3fa7c110>] at 7f8d3fa7e610> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_txt_files[inputs/001-interpolation.txt-outputs/001.txt-None] _ self = input_path = 'inputs/001-interpolation.txt', output_path = 'outputs/001.txt' language = None @find_files(".txt") def test_txt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTextTemplateFile > self.execute(input_path, output_path, language, PageTextTemplateFile) src/chameleon/tests/test_templates.py:675: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = '}<&>\n" (1:...nslation=False default='"?"' default_marker='"?"' at 7f8d3f41b010>] at 7f8d3f419210> at 7f8d3f41b690>] at 7f8d3f41b810> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError _ TestZopePageTemplates.test_txt_files[inputs/hello_world.txt-outputs/hello_world.txt-None] _ self = input_path = 'inputs/hello_world.txt', output_path = 'outputs/hello_world.txt' language = None @find_files(".txt") def test_txt_files(self, input_path, output_path, language): from chameleon.zpt.template import PageTextTemplateFile > self.execute(input_path, output_path, language, PageTextTemplateFile) src/chameleon/tests/test_templates.py:675: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/chameleon/tests/test_templates.py:704: in execute template.cook_check() src/chameleon/template.py:401: in cook_check self.cook(body) src/chameleon/template.py:204: in cook program = self._cook(body, digest, names) src/chameleon/template.py:301: in _cook source = self._compile(body, builtins) src/chameleon/template.py:337: in _compile compiler = Compiler( src/chameleon/compiler.py:1019: in __init__ module.body += self.visit(node) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1127: in visit_Module program = self.visit(node.program) src/chameleon/compiler.py:1082: in visit iterator = visitor(node) src/chameleon/compiler.py:1151: in visit_MacroProgram stmts = self.visit(macro) src/chameleon/compiler.py:1084: in visit for key, group in itertools.groupby( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = node = ...nslation=False default='"?"' default_marker='"?"' at 7f8d3f5c06d0>] at 7f8d3fa92510> at 7f8d3fa90dd0>] at 7f8d3f6c1890> def visit_Macro(self, node): body = [] # Initialization body += template("__append = __stream.append") body += template("__re_amp = g_re_amp") body += template("__token = None") body += template("__re_needs_escape = g_re_needs_escape") body += emit_func_convert("__convert") body += emit_func_convert_and_escape("__quote") # Resolve defaults for name in self.defaults: body += template( "NAME = econtext[KEY]", > NAME=name, KEY=ast.Str(s="__" + name) ) E AttributeError: module 'ast' has no attribute 'Str' src/chameleon/compiler.py:1185: AttributeError =============================== warnings summary =============================== src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg /usr/lib/python3.14/site-packages/setuptools/command/bdist_egg.py:104: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html from pkg_resources import get_build_platform src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_wheel /usr/lib/python3.14/site-packages/setuptools/_distutils/cmd.py:66: SetuptoolsDeprecationWarning: setup.py install is deprecated. !! ******************************************************************************** Please avoid running ``setup.py`` directly. Instead, use pypa/build, pypa/installer or other standards-based tools. Follow the current Python packaging guidelines when building Python RPM packages. See https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/ for details. ******************************************************************************** !! self.initialize_options() src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_wheel /usr/lib/python3.14/site-packages/setuptools/command/build_py.py:218: _Warning: Package 'chameleon_test_pkg.templates' is absent from the `packages` configuration. !! ******************************************************************************** ############################ # Package would be ignored # ############################ Python recognizes 'chameleon_test_pkg.templates' as an importable package[^1], but it is absent from setuptools' `packages` configuration. This leads to an ambiguous overall configuration. If you want to distribute this package, please make sure that 'chameleon_test_pkg.templates' is explicitly added to the `packages` configuration field. Alternatively, you can also rely on setuptools' discovery methods (for example by using `find_namespace_packages(...)`/`find_namespace:` instead of `find_packages(...)`/`find:`). You can read more about "package discovery" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html If you don't want 'chameleon_test_pkg.templates' to be distributed and are already explicitly excluding 'chameleon_test_pkg.templates' via `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`, you can try to use `exclude_package_data`, or `include-package-data=False` in combination with a more fine grained `package-data` configuration. You can read more about "package data files" on setuptools documentation page: - https://setuptools.pypa.io/en/latest/userguide/datafiles.html [^1]: For Python, any directory (with suitable naming) can be imported, even if it does not contain any `.py` files. On the other hand, currently there is no concept of package data directory, all directories are treated like packages. ******************************************************************************** !! check.warn(importable) src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_egg src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_wheel :226: DeprecationWarning: zipimport.zipimporter.load_module() is deprecated and slated for removal in Python 3.12; use exec_module() instead src/chameleon/tests/test_loader.py::ModuleLoadTests::test_build :530: DeprecationWarning: the load_module() method is deprecated and slated for removal in Python 3.12; use exec_module() instead -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED src/chameleon/compiler.py::chameleon.compiler.ExpressionEvaluator FAILED src/chameleon/compiler.py::chameleon.compiler.NameTransform FAILED src/chameleon/tales.py::chameleon.tales.StringExpr FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_checked_None FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_checked_default FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_checked_false FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_checked_true FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_bytes_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_checked_None FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_checked_default FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_checked_false FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_checked_true FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLTestCase::test_str_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLWithEncodingTestCase::test_bytes_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::XMLWithEncodingTestCase::test_str_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_checked_None FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_checked_default FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_checked_false FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_checked_true FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_bytes_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_checked_None FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_checked_default FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_checked_false FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_checked_true FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5TestCase::test_str_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5WithContentTypeAndEncodingTestCase::test_bytes_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5WithContentTypeAndEncodingTestCase::test_bytes_encoding FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5WithContentTypeAndEncodingTestCase::test_str_content_type FAILED src/chameleon/tests/test_bools_plus_sniffing.py::HTML5WithContentTypeAndEncodingTestCase::test_str_encoding FAILED src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg - Att... FAILED src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel - A... FAILED src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_egg - ... FAILED src/chameleon/tests/test_loader.py::ZPTLoadPageTests::test_load_wheel FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_syntax_error_in_strict_mode FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_syntax_error_in_non_strict_mode FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_exists_error_leak FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_sys_exc_info_is_clear_after_pipe FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_render_macro_include_subtemplate_containing_error FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_render_error_macro_include FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_errors[

\n \n

-repeat] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_errors[\n \n -not_in_translation] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_encoded FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_utf8_encoded FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_recursion_error FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_unicode_decode_error FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_package_name_cook_check FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_custom_encoding_for_str_or_bytes_in_content FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_custom_encoding_for_str_or_bytes_in_attributes FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_null_translate_function FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_on_error_handler FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_object_substitution_coerce_to_str FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_underscore_variable FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_trim_attribute_space FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_exception FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_error_handler_makes_safe_copy FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_double_underscore_variable FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_disable_comment_interpolation FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_compiler_internals_are_disallowed FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_simple_translate_mapping FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_translate_is_not_an_internal FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_default_marker FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_boolean_attributes FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_debug_flag_on_string FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_f_strings FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_windows_line_endings FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_digest FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/001-variable-scope.pt-outputs/001.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/002-repeat-scope.pt-outputs/002.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/003-content.pt-outputs/003.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/004-attributes.pt-outputs/004.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/005-default.pt-outputs/005.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/006-attribute-interpolation.pt-outputs/006.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/007-content-interpolation.pt-outputs/007.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/008-builtins.pt-outputs/008.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/009-literals.pt-outputs/009.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/010-structure.pt-outputs/010.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/011-messages.pt-outputs/011-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/011-messages.pt-outputs/011.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/012-translation.pt-outputs/012-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/012-translation.pt-outputs/012.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/013-repeat-nested.pt-outputs/013.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/014-repeat-nested-similar.pt-outputs/014.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/015-translation-nested.pt-outputs/015-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/015-translation-nested.pt-outputs/015.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/016-explicit-translation.pt-outputs/016-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/016-explicit-translation.pt-outputs/016.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/017-omit-tag.pt-outputs/017.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/018-translation-nested-dynamic.pt-outputs/018-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/018-translation-nested-dynamic.pt-outputs/018.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/019-replace.pt-outputs/019.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/020-on-error.pt-outputs/020.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/021-translation-domain.pt-outputs/021-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/021-translation-domain.pt-outputs/021.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/022-switch.pt-outputs/022.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/023-condition.pt-outputs/023.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/024-namespace-elements.pt-outputs/024.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/025-repeat-whitespace.pt-outputs/025.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/026-repeat-variable.pt-outputs/026.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/027-attribute-replacement.pt-outputs/027.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/028-attribute-toggle.pt-outputs/028.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/029-attribute-ordering.pt-outputs/029.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/030-repeat-tuples.pt-outputs/030.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/031-namespace-with-tal.pt-outputs/031.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/032-master-template.pt-outputs/032.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/033-use-macro-trivial.pt-outputs/033.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/034-use-template-as-macro.pt-outputs/034.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/035-use-macro-with-fill-slot.pt-outputs/035.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/036-use-macro-inherits-dynamic-scope.pt-outputs/036.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/037-use-macro-local-variable-scope.pt-outputs/037.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/038-use-macro-globals.pt-outputs/038.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/039-globals.pt-outputs/039.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/040-macro-using-template-symbol.pt-outputs/040.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/041-translate-nested-names.pt-outputs/041.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/042-use-macro-fill-footer.pt-outputs/042.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/043-macro-nested-dynamic-vars.pt-outputs/043.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/044-tuple-define.pt-outputs/044.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/045-namespaces.pt-outputs/045.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/046-extend-macro.pt-outputs/046.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/047-use-extended-macro.pt-outputs/047.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/048-use-extended-macro-fill-original.pt-outputs/048.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/049-entities-in-attributes.pt-outputs/049.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/050-define-macro-and-use-not-extend.pt-outputs/050.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/051-use-non-extended-macro.pt-outputs/051.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/052-i18n-domain-inside-filled-slot.pt-outputs/052.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/053-special-characters-in-attributes.pt-outputs/053.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/054-import-expression.pt-outputs/054.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/055-attribute-fallback-to-dict-lookup.pt-outputs/055.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/056-comment-attribute.pt-outputs/056.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/057-order.pt-outputs/057.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/058-script.pt-outputs/058.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/059-embedded-javascript.pt-outputs/059.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/060-macro-with-multiple-same-slots.pt-outputs/060.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/061-fill-one-slot-but-two-defined.pt-outputs/061.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/062-comments-and-expressions.pt-outputs/062.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/063-continuation.pt-outputs/063.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/064-tags-and-special-characters.pt-outputs/064.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/065-use-macro-in-fill.pt-outputs/065.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/066-load-expression.pt-outputs/066.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/067-attribute-decode.pt-outputs/067.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/068-less-than-greater-than-in-attributes.pt-outputs/068.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/069-translation-domain-and-macro.pt-outputs/069-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/069-translation-domain-and-macro.pt-outputs/069.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/070-translation-domain-and-use-macro.pt-outputs/070-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/070-translation-domain-and-use-macro.pt-outputs/070.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/071-html-attribute-defaults.pt-outputs/071.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/072-repeat-interpolation.pt-outputs/072.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/073-utf8-encoded.pt-outputs/073.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/074-encoded-template.pt-outputs/074.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/075-nested-macros.pt-outputs/075.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/076-nested-macro-override.pt-outputs/076.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/077-i18n-attributes.pt-outputs/077-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/077-i18n-attributes.pt-outputs/077.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/078-tags-and-newlines.pt-outputs/078.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/079-implicit-i18n.pt-outputs/079-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/079-implicit-i18n.pt-outputs/079.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/080-xmlns-namespace-on-tal.pt-outputs/080.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/081-load-spec.pt-outputs/081.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/082-load-spec-computed.pt-outputs/082.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/083-template-dict-to-macro.pt-outputs/083.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/084-interpolation-in-cdata.pt-outputs/084.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/085-nested-translation.pt-outputs/085-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/085-nested-translation.pt-outputs/085.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/086-self-closing.pt-outputs/086.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/087-code-blocks.pt-outputs/087.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/088-python-newlines.pt-outputs/088.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/089-load-fallback.pt-outputs/089.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/090-tuple-expression.pt-outputs/090.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/091-repeat-none.pt-outputs/091.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/120-translation-context.pt-outputs/120-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/120-translation-context.pt-outputs/120.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/121-translation-comment.pt-outputs/121.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/122-translation-ignore.pt-outputs/122.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/123-html5-data-attributes.pt-outputs/123.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/124-translation-target.pt-outputs/124-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/124-translation-target.pt-outputs/124.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/125-macro-translation-ordering.pt-outputs/125.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/126-define-escaping.pt-outputs/126.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/127-tags-and-attributes-special-chars.pt-outputs/127.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/128-translation-macro-name.pt-outputs/128-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/128-translation-macro-name.pt-outputs/128.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/237-double-define.pt-outputs/237.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/238-macroname.pt-outputs/238.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/greeting.pt-outputs/greeting.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/hello_world.pt-outputs/hello_world.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/multinode-implicit-i18n.pt-outputs/multinode-en.pt-en] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_pt_files[inputs/multinode-implicit-i18n.pt-outputs/multinode.pt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_txt_files[inputs/001-interpolation.txt-outputs/001.txt-None] FAILED src/chameleon/tests/test_templates.py::TestZopePageTemplates::test_txt_files[inputs/hello_world.txt-outputs/hello_world.txt-None] ================= 192 failed, 60 passed, 14 warnings in 13.84s ================= py314: exit 1 (14.19 seconds) /builddir/build/BUILD/python-chameleon-4.5.4-build/chameleon-4.5.4> pytest --doctest-modules pid=535 py314: FAIL code 1 (14.20 seconds) evaluation failed :( (14.27 seconds) error: Bad exit status from /var/tmp/rpm-tmp.xDmted (%check) RPM build errors: Bad exit status from /var/tmp/rpm-tmp.xDmted (%check) Finish: rpmbuild python-chameleon-4.5.4-5.fc42.src.rpm Finish: build phase for python-chameleon-4.5.4-5.fc42.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1734695013.358900/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-chameleon-4.5.4-5.fc42.src.rpm) Config(fedora-rawhide-x86_64) 0 minutes 34 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 d94310c890b141c8aa50c67ef4237030 -D /var/lib/mock/fedora-rawhide-x86_64-1734695013.358900/root -a -u mockbuild --capability=cap_ipc_lock --rlimit=RLIMIT_NOFILE=10240 --capability=cap_ipc_lock --bind=/tmp/mock-resolv.fczvczaf:/etc/resolv.conf --bind=/dev/btrfs-control --bind=/dev/mapper/control --bind=/dev/fuse --bind=/dev/loop-control --bind=/dev/loop0 --bind=/dev/loop1 --bind=/dev/loop2 --bind=/dev/loop3 --bind=/dev/loop4 --bind=/dev/loop5 --bind=/dev/loop6 --bind=/dev/loop7 --bind=/dev/loop8 --bind=/dev/loop9 --bind=/dev/loop10 --bind=/dev/loop11 --console=pipe --setenv=TERM=vt100 --setenv=SHELL=/bin/bash --setenv=HOME=/builddir --setenv=HOSTNAME=mock --setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin '--setenv=PROMPT_COMMAND=printf "\033]0;\007"' '--setenv=PS1= \s-\v\$ ' --setenv=LANG=C.UTF-8 --resolv-conf=off bash --login -c '/usr/bin/rpmbuild -ba --noprep --target x86_64 --nodeps /builddir/build/originals/python-chameleon.spec' Copr build error: Build failed